summaryrefslogtreecommitdiff
path: root/src/liana/vcr.h
blob: 1ab58dad0cf17400ff3154023c6192b4c4fafc7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#pragma once

#include <al/atomic.h>
#include <nnwt/packet_cache.h>
#include <nnwt/packet_stream.h>
#include <nnwt/signal.h>

#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;
    atomic(s32) state;
    atomic(bool) buffered;
    bool running;
    struct nn_cond cond;
    struct nn_mutex mutex;
    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);