Subject | Hash | Author | Date (UTC) |
---|---|---|---|
npv: my iap hls peering with twitch.tv is accute trash | 4ab8caadb41ac42482f8c7a43725054067674fe3 | Sylvain BERTRAND | 2022-08-30 17:17:21 |
npv: alsa, POLLERR is XRUN | 73c89d6529123fca081c4f55d1a57eab4ede7b90 | Sylvain BERTRAND | 2022-06-30 15:43:27 |
npv: may help IAPs with bad peerings | 7ec70f67d779a478f065f0e92259e52f8315d113 | Sylvain BERTRAND | 2022-06-30 15:42:47 |
move to new ffmpeg channel layout handling | 938790d0c657278f405c4f57987d2274c5ada9b7 | Sylvain BERTRAND | 2022-03-20 22:18:01 |
npa: fine grained volume control | 89279ea0c7dcaf7a718c9a57ecb6b08a0ccfbcb9 | Sylvain BERTRAND | 2022-02-15 23:24:36 |
npv: add fine grained volume control | 06bc3b77b065f35f294659db520f66e7e8094c8c | Sylvain BERTRAND | 2022-02-15 18:47:34 |
npv: move to freetype SDF rendering | 972a3027fec3b69a1e10405cc0da35b5194b6f46 | Sylvain BERTRAND | 2021-12-27 20:54:53 |
npv:osd:ascii only mode for the timer | 3de3158fc3300f8a9c6f75fcca76b512331b8c2f | Sylvain BERTRAND | 2021-10-30 19:18:38 |
npv: default to dejavu instead of noto | 708f3166a09fd7ba815ec47907cabfb1af4d26c5 | Sylvain BERTRAND | 2021-10-10 17:05:17 |
npv: live mode and ready the code for indicators.. if ever... | 2d6ddb83edd6f08e99fbe01dc60a354b5e5a2afe | Sylvain BERTRAND | 2021-07-23 13:17:47 |
npv: don't block the muted state | 0c29e9329ec5db6bed191b2b4caffff8166bd11f | Sylvain BERTRAND | 2021-07-21 21:34:37 |
npv: now we have enough perspective, make states internal | 62f6b1bf62fc083762f036ddde1f29dd23baf814 | Sylvain BERTRAND | 2021-07-21 20:12:36 |
npv/npa: add gcc4 atomic support | d9676b20984dcbfd8df4afbf85178c8ff4295e4f | Sylvain BERTRAND | 2021-06-18 15:04:01 |
npv: better reuse of ffmpeg references, stats | 4bb1b9ab45609f8e5113cc7613ebc1d09499561b | Sylvain BERTRAND | 2021-05-20 18:24:32 |
npv: avoid stale frames | fb20683b7cb91622b639b05e8b324d13edc72522 | Sylvain BERTRAND | 2021-05-16 20:51:34 |
npv: inverted resync logic and rate limiter | 9e772be0d5e19dc4dcef05ee2b4ce47c42788f8e | Sylvain BERTRAND | 2021-05-16 18:06:23 |
npv:trying to work around nasty live streams | 544ddd3381ad56363bb275ae59419e97e8c86895 | Sylvain BERTRAND | 2021-05-14 15:45:19 |
npv:spurious braces | e8678920198c6795420c54a839b92e5d301b4183 | Sylvain BERTRAND | 2021-05-06 20:55:38 |
npv:pts debug tracing, ffmpeg dev tantrum | 8c3bf9cf42fc3419b64c232f905c5c580d6a1942 | Sylvain BERTRAND | 2021-05-06 18:37:35 |
npa: forgot zero-ing before cmp | ceff7a70798b604bdb876a92ba0c446e3ede8a5b | Sylvain BERTRAND | 2021-04-15 20:15:07 |
File | Lines added | Lines deleted |
---|---|---|
npv/TODO | 1 | 0 |
npv/config.h | 6 | 0 |
npv/fmt/local/code.frag.c | 12 | 0 |
npv/fmt/namespace/main.c | 2 | 0 |
npv/fmt/public/code.frag.c | 21 | 10 |
npv/pipeline/public/code.frag.c | 3 | 2 |
File npv/TODO changed (mode: 100644) (index 90608f3..0158304) | |||
1 | 1 | not ordered: | not ordered: |
2 | - move to a shared audio/video prefill | ||
2 | 3 | - try to workaround as much as possible the nasty live streams out there. | - try to workaround as much as possible the nasty live streams out there. |
3 | 4 | - "buffering" indicator (no)? subtitles (mmmmh...)? | - "buffering" indicator (no)? subtitles (mmmmh...)? |
4 | 5 | - use vulkan shaders (no glsl or hlsl), compute or not, in order to perform | - use vulkan shaders (no glsl or hlsl), compute or not, in order to perform |
File npv/config.h changed (mode: 100644) (index 1fe6dee..706648e) | |||
... | ... | struct npv_x11_bind_t npv_x11_binds[] = { | |
95 | 95 | * or 60 fps | * or 60 fps |
96 | 96 | */ | */ |
97 | 97 | #define RESYNC_RATE_LIMITER_MS 16 | #define RESYNC_RATE_LIMITER_MS 16 |
98 | /* | ||
99 | * our iap hls peering with twitch.tv is accute trash, ffmpeg allows us to | ||
100 | * flush and retry. Let's do that in the pipeline read thread, may need a timer | ||
101 | * to avoid hammering the peering links though. | ||
102 | */ | ||
103 | #define FMT_RETRIES_N 100 | ||
98 | 104 | #endif | #endif |
File npv/fmt/local/code.frag.c changed (mode: 100644) (index 477055e..27a391b) | |||
... | ... | STATIC void fatal(u8 *fmt, ...) | |
7 | 7 | npv_vfatal(fmt, ap); | npv_vfatal(fmt, ap); |
8 | 8 | va_end(ap); /* unreachable */ | va_end(ap); /* unreachable */ |
9 | 9 | } | } |
10 | STATIC void warning(u8 *fmt, ...) | ||
11 | { | ||
12 | va_list ap; | ||
13 | |||
14 | npv_perr("format:WARNING:"); | ||
15 | va_start(ap, fmt); | ||
16 | npv_vperr(fmt, ap); | ||
17 | va_end(ap); | ||
18 | } | ||
10 | 19 | STATIC void pout(u8 *fmt, ...) | STATIC void pout(u8 *fmt, ...) |
11 | 20 | { | { |
12 | 21 | va_list ap; | va_list ap; |
... | ... | STATIC void init_once_public(u8 *url) | |
36 | 45 | int r; | int r; |
37 | 46 | AVDictionary *options = 0; | AVDictionary *options = 0; |
38 | 47 | ||
48 | av_dict_set(&options, "reconnect", "1", 0); | ||
49 | /* av_dict_set(&options, "reconnect_at_eof", "1", 0); breaks youtube live */ | ||
39 | 50 | av_dict_set(&options, "reconnect_on_network_error", "1", 0); | av_dict_set(&options, "reconnect_on_network_error", "1", 0); |
51 | av_dict_set(&options, "reconnect_streamed", "1", 0); | ||
40 | 52 | ||
41 | 53 | ctx_p = 0; | ctx_p = 0; |
42 | 54 | r = avformat_open_input(&ctx_p, url, NULL, &options); | r = avformat_open_input(&ctx_p, url, NULL, &options); |
File npv/fmt/namespace/main.c changed (mode: 100644) (index d245a54..05a993a) | |||
15 | 15 | #define pkt_l npv_fmt_pkt_l | #define pkt_l npv_fmt_pkt_l |
16 | 16 | #define pout npv_fmt_pout | #define pout npv_fmt_pout |
17 | 17 | #define video npv_fmt_break_on_video | #define video npv_fmt_break_on_video |
18 | #define warning npv_fmt_warning | ||
18 | 19 | /*============================================================================*/ | /*============================================================================*/ |
19 | 20 | #else | #else |
20 | 21 | /*----------------------------------------------------------------------------*/ | /*----------------------------------------------------------------------------*/ |
32 | 33 | #undef pout | #undef pout |
33 | 34 | #undef pkt_l | #undef pkt_l |
34 | 35 | #undef video | #undef video |
36 | #undef warning | ||
35 | 37 | #endif | #endif |
File npv/fmt/public/code.frag.c changed (mode: 100644) (index f5c1a38..874b4e9) | |||
... | ... | STATIC u8 *duration_estimate_to_str(enum avformat_duration_estimation_method_t | |
38 | 38 | STATIC u8 pkts_read_and_q(void) { loop | STATIC u8 pkts_read_and_q(void) { loop |
39 | 39 | { | { |
40 | 40 | int r; | int r; |
41 | u8 retries_n; | ||
41 | 42 | ||
42 | 43 | if (did_reached_limits()) | if (did_reached_limits()) |
43 | 44 | return LIMITS_REACHED; | return LIMITS_REACHED; |
44 | /* XXX: there, new streams can appear (could some disappear?) */ | ||
45 | ctx_lock(); | ||
46 | r = avformat_read_pkt(ctx_p, pkt_l); | ||
47 | ctx_unlock(); | ||
48 | if (r == AVERROR(EAGAIN)) | ||
49 | return AGAIN; | ||
50 | else if (r == AVERROR_EOF) | ||
51 | return EOF_FMT; | ||
52 | else if (r != 0) | ||
53 | fatal("ffmpeg:error while reading coded/compressed data into packets\n"); | ||
45 | retries_n = 0; | ||
46 | loop { | ||
47 | /* XXX: there, new streams can appear (could some disappear?) */ | ||
48 | ctx_lock(); | ||
49 | r = avformat_read_pkt(ctx_p, pkt_l); | ||
50 | ctx_unlock(); | ||
51 | if (r == AVERROR(EAGAIN)) | ||
52 | return AGAIN; | ||
53 | else if (r == AVERROR_EOF) | ||
54 | return EOF_FMT; | ||
55 | else if (r != 0) { | ||
56 | if (retries_n == FMT_RETRIES_N) | ||
57 | fatal("ffmpeg:error while reading coded/compressed data into packets\n"); | ||
58 | warning("ffmpeg:error while reading coded/compressed data into packets, flushing, retries = %u(%u)\n", retries_n, FMT_RETRIES_N); | ||
59 | flush(); | ||
60 | ++retries_n; | ||
61 | continue; | ||
62 | } | ||
63 | break; | ||
64 | } | ||
54 | 65 | /* r == 0 */ | /* r == 0 */ |
55 | 66 | if (pkt_l->st_idx == npv_audio_st_p.idx) { | if (pkt_l->st_idx == npv_audio_st_p.idx) { |
56 | 67 | npv_pipeline_limits_lock(); | npv_pipeline_limits_lock(); |
File npv/pipeline/public/code.frag.c changed (mode: 100644) (index bc341e7..e922715) | |||
... | ... | STATIC void limits_reset(void) | |
2 | 2 | { | { |
3 | 3 | limits_p.pkts.audio_bytes_n = 0; | limits_p.pkts.audio_bytes_n = 0; |
4 | 4 | limits_p.pkts.video_bytes_n = 0; | limits_p.pkts.video_bytes_n = 0; |
5 | /* TODO: nah, move to a shared audio/video quantities */ | ||
5 | 6 | /* hardcoded for now: arbitrary rough estimates */ | /* hardcoded for now: arbitrary rough estimates */ |
6 | /* ~8s of 400kb audio */ | ||
7 | limits_p.pkts.limit.audio_bytes_n = 400000 / 8 * 8; | ||
7 | /* ~8s of 200kb audio */ | ||
8 | limits_p.pkts.limit.audio_bytes_n = 200000 / 8 * 8; | ||
8 | 9 | /* ~8s of 10Mb video */ | /* ~8s of 10Mb video */ |
9 | 10 | limits_p.pkts.limit.video_bytes_n = 10000000 / 8 * 8; | limits_p.pkts.limit.video_bytes_n = 10000000 / 8 * 8; |
10 | 11 | } | } |