#pragma once #include #include #include #include #include "../codec/codec.h" #include "../server/common.h" //#define VCR_BUFFER_WHOLE_FILE struct lia_vcr_track { struct camu_codec_stream *stream; struct lia_client_handler *client; struct nn_packet_cache cache; u32 state; atomic(bool) buffered; bool running; struct nn_cond cond; struct nn_mutex lock; struct nn_thread thread; struct lia_vcr *vcr; }; struct lia_vcr { struct nn_packet_stream *data; u16 node_id; array(struct lia_vcr_track *) tracks; atomic(u64) count; struct { u64 buffered; atomic(u64) low; } mark; u8 expand; bool started; #ifndef CAMU_DIRECT_MODE bool corked; struct nn_signal signal; #endif struct { u64 current_frame; u64 last_cork_ts; u64 last_report_ts; u64 last_report_mark; f32 average_kbps; } metrics; }; void lia_vcr_init(struct lia_vcr *vcr, struct nn_event_loop *loop, struct nn_packet_stream *data, u16 node_id); void lia_vcr_start(struct lia_vcr *vcr); void lia_vcr_add_track(struct lia_vcr *vcr, struct lia_vcr_track *track); bool lia_vcr_remove_track_by_stream(struct lia_vcr *vcr, struct camu_codec_stream *stream); bool lia_vcr_is_empty(struct lia_vcr *vcr); void lia_vcr_push_packet(struct lia_vcr *vcr, struct nn_packet *packet); void lia_vcr_set_buffered(struct lia_vcr_track *track); void lia_vcr_cork(struct lia_vcr_track *track); void lia_vcr_uncork(struct lia_vcr_track *track); void lia_vcr_flush(struct lia_vcr *vcr); void lia_vcr_close_all(struct lia_vcr *vcr); void lia_vcr_free(struct lia_vcr *vcr);