File npv/config.h changed (mode: 100644) (index 2628bde..1830bf5) |
... |
... |
struct npv_x11_bind_t npv_x11_binds[] = { |
61 |
61 |
#define VOL_DELTA 0.1 /* from 0.0 to 1.0 */ |
#define VOL_DELTA 0.1 /* from 0.0 to 1.0 */ |
62 |
62 |
#define SEEK_DELTA INT64_C(10) /* 10 seconds */ |
#define SEEK_DELTA INT64_C(10) /* 10 seconds */ |
63 |
63 |
#define SEEK_DELTA_BIG (INT64_C(4) * INT64_C(60)) /* 4 minutes */ |
#define SEEK_DELTA_BIG (INT64_C(4) * INT64_C(60)) /* 4 minutes */ |
64 |
|
/*----------------------------------------------------------------------------*/ |
|
|
64 |
|
/*============================================================================*/ |
65 |
65 |
/* kinky internal settings, modify with care */ |
/* kinky internal settings, modify with care */ |
66 |
66 |
/* the count of decoded video frames in the array, it is "expensive" */ |
/* the count of decoded video frames in the array, it is "expensive" */ |
67 |
67 |
#define DEC_FRS_ARRAY_N_MAX 4 |
#define DEC_FRS_ARRAY_N_MAX 4 |
|
68 |
|
/* |
|
69 |
|
* video frames are presumed arriving inorder, but once a backward |
|
70 |
|
* discontinuity is detected, in order to avoid a full and dead locked array of |
|
71 |
|
* predecoded video frames, we must drop frames until we resynchronize. To |
|
72 |
|
* decide if we found a resynchronzining frame, we define a time window based |
|
73 |
|
* on the following value |
|
74 |
|
*/ |
|
75 |
|
#define DISCONT_BACKWARD_RESYNC_MS 500 |
68 |
76 |
#endif |
#endif |
File npv/video/local/code.frag.c changed (mode: 100644) (index 758aaf2..44017cd) |
... |
... |
STATIC void init_once_local(void) |
76 |
76 |
} |
} |
77 |
77 |
receive_fr_l = avutil_video_fr_ref_alloc(); |
receive_fr_l = avutil_video_fr_ref_alloc(); |
78 |
78 |
is_swpchn_sem_fence_submitted_l = false; |
is_swpchn_sem_fence_submitted_l = false; |
|
79 |
|
drop_l.prev_now = AV_NOPTS_VALUE; |
|
80 |
|
drop_l.until_resync = false; |
79 |
81 |
} |
} |
80 |
82 |
#undef NONE |
#undef NONE |
81 |
83 |
STATIC void scaler_img_create(avutil_video_fr_ref_t *fr) |
STATIC void scaler_img_create(avutil_video_fr_ref_t *fr) |
|
... |
... |
STATIC void fr_drop(u16 fr) |
332 |
334 |
} |
} |
333 |
335 |
#undef NO_FR |
#undef NO_FR |
334 |
336 |
#define NO_FR 0 |
#define NO_FR 0 |
335 |
|
STATIC void frs_drop(avutil_video_fr_ref_t *selected_fr) |
|
|
337 |
|
STATIC void frs_drop(s64 now, avutil_video_fr_ref_t *selected_fr) |
336 |
338 |
{ |
{ |
337 |
339 |
u16 fr; |
u16 fr; |
|
340 |
|
s64 lo; |
|
341 |
|
s64 hi; |
|
342 |
|
s64 resync; |
338 |
343 |
|
|
339 |
344 |
if (selected_fr == NO_FR) |
if (selected_fr == NO_FR) |
340 |
|
return; |
|
341 |
|
/* drop as many of as possible frames received before the selected one */ |
|
|
345 |
|
goto exit; |
|
346 |
|
/* backward discont detected */ |
|
347 |
|
if (drop_l.prev_now != AV_NOPTS_VALUE && now < drop_l.prev_now) |
|
348 |
|
drop_l.until_resync = true; |
|
349 |
|
/*====================================================================*/ |
|
350 |
|
/* |
|
351 |
|
* since the frs are supposed inorder, first drop as many of as possible |
|
352 |
|
* frs received before the selected one |
|
353 |
|
*/ |
342 |
354 |
fr = 0; |
fr = 0; |
343 |
355 |
loop { |
loop { |
344 |
356 |
if (dec_frs_p.a[fr] == selected_fr) |
if (dec_frs_p.a[fr] == selected_fr) |
345 |
357 |
break; |
break; |
346 |
|
/* keep the fr the scaler is related to */ |
|
|
358 |
|
/* don't touch the scaler fr */ |
347 |
359 |
if (dec_frs_p.a[fr] != scaler_p.img.fr) { |
if (dec_frs_p.a[fr] != scaler_p.img.fr) { |
348 |
360 |
if (dec_frs_p.a[fr] == last_fr_sent_to_pe_l) |
if (dec_frs_p.a[fr] == last_fr_sent_to_pe_l) |
349 |
361 |
last_fr_sent_to_pe_l = NO_FR; |
last_fr_sent_to_pe_l = NO_FR; |
|
... |
... |
STATIC void frs_drop(avutil_video_fr_ref_t *selected_fr) |
351 |
363 |
} else |
} else |
352 |
364 |
++fr; |
++fr; |
353 |
365 |
} |
} |
|
366 |
|
/*====================================================================*/ |
|
367 |
|
/* |
|
368 |
|
* here, we detected a backward discont, we are looking for a |
|
369 |
|
* resynchronizing fr based on a time win. we must drop, inorder, |
|
370 |
|
* frs which are out of the time win in order to avoid the dec frs a |
|
371 |
|
* being full and locked |
|
372 |
|
*/ |
|
373 |
|
if (!drop_l.until_resync) |
|
374 |
|
goto exit; |
|
375 |
|
resync = (DISCONT_BACKWARD_RESYNC_MS * st_p.tb.den) / (st_p.tb.num |
|
376 |
|
* 1000); |
|
377 |
|
lo = now - resync; |
|
378 |
|
hi = now + resync; |
|
379 |
|
fr = 0; |
|
380 |
|
loop { |
|
381 |
|
if (fr == dec_frs_p.n) |
|
382 |
|
break; |
|
383 |
|
/* don't touch the scaler fr or selected fr */ |
|
384 |
|
if (dec_frs_p.a[fr] != scaler_p.img.fr |
|
385 |
|
&& dec_frs_p.a[fr] != selected_fr) { |
|
386 |
|
if (dec_frs_p.a[fr]->pts < lo |
|
387 |
|
|| hi < dec_frs_p.a[fr]->pts) { |
|
388 |
|
if (dec_frs_p.a[fr] == last_fr_sent_to_pe_l) |
|
389 |
|
last_fr_sent_to_pe_l = NO_FR; |
|
390 |
|
fr_drop(fr); /* do not advance */ |
|
391 |
|
} else { /* found a resynchronizing fr */ |
|
392 |
|
drop_l.until_resync = false; |
|
393 |
|
break; |
|
394 |
|
} |
|
395 |
|
} else |
|
396 |
|
++fr; |
|
397 |
|
} |
|
398 |
|
exit: |
|
399 |
|
drop_l.prev_now = now; |
354 |
400 |
} |
} |
|
401 |
|
|
355 |
402 |
#undef NO_FR |
#undef NO_FR |
356 |
403 |
#define NO_FR 0 |
#define NO_FR 0 |
357 |
404 |
STATIC void select_fr(s64 now, avutil_video_fr_ref_t **selected_fr, |
STATIC void select_fr(s64 now, avutil_video_fr_ref_t **selected_fr, |
File npv/video/namespace/main.c changed (mode: 100644) (index bf28b16..8f23c73) |
13 |
13 |
#define dec_a_grow npv_video_dec_a_grow |
#define dec_a_grow npv_video_dec_a_grow |
14 |
14 |
#define dec_ctx_mutex_l npv_video_dec_ctx_mutex_l |
#define dec_ctx_mutex_l npv_video_dec_ctx_mutex_l |
15 |
15 |
#define dec_l npv_video_dec_l |
#define dec_l npv_video_dec_l |
|
16 |
|
#define drop_l npv_video_drop_l |
16 |
17 |
#define fatal npv_video_fatal |
#define fatal npv_video_fatal |
17 |
18 |
#define fatalff npv_video_fatalff |
#define fatalff npv_video_fatalff |
18 |
19 |
#define fatalvk npv_video_fatalvk |
#define fatalvk npv_video_fatalvk |
|
62 |
63 |
#undef dec_a_grow |
#undef dec_a_grow |
63 |
64 |
#undef dec_ctx_mutex_l |
#undef dec_ctx_mutex_l |
64 |
65 |
#undef dec_l |
#undef dec_l |
|
66 |
|
#undef drop_l |
65 |
67 |
#undef fatal |
#undef fatal |
66 |
68 |
#undef fatalff |
#undef fatalff |
67 |
69 |
#undef fatalvk |
#undef fatalvk |