Browse Source

video_output: implement dedup picture 1/2

Alexandre Janniaux 5 years ago
parent
commit
46f75acf93
  1. 44
      src/video_output/video_output.c

44
src/video_output/video_output.c

@ -107,7 +107,12 @@ typedef struct vout_thread_sys_t
bool is_interlaced;
picture_t *decoded; // decoded picture before passed through chain_static
picture_t *current;
picture_t *last_caption_reference;
picture_t *caption_reference;
picture_captions_t captions;
#ifdef DEBUG_CAPTION
FILE *caption_file;
#endif
} displayed;
struct {
@ -1087,6 +1092,7 @@ static picture_t *ThreadDisplayPreparePicture(vout_thread_sys_t *vout, bool reus
sys->displayed.timestamp = decoded->date;
sys->displayed.captions = decoded->captions;
sys->displayed.is_interlaced = !decoded->b_progressive;
sys->displayed.caption_reference = decoded;
vout_chrono_Start(&sys->static_filter);
picture = filter_chain_VideoFilter(sys->filter.chain_static, sys->displayed.decoded);
@ -1559,10 +1565,30 @@ static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
int ret = ThreadDisplayRenderPicture(vout, render_now);
if(sys->displayed.captions.size)
if(sys->displayed.caption_reference &&
sys->displayed.caption_reference != sys->displayed.last_caption_reference &&
sys->displayed.caption_reference->captions.size > 0)
{
#ifdef DEBUG_CAPTION
msg_Warn(&vout->obj, " - new caption, size: %zu, %s", sys->displayed.caption_reference->captions.size,
sys->displayed.caption_reference->b_top_field_first ? "TOP":"BOTTOM");
#endif
vout_CaptionsToDisplay(&vout->obj,
sys->displayed.captions.bytes,
sys->displayed.captions.size);
sys->displayed.caption_reference->captions.bytes,
sys->displayed.caption_reference->captions.size);
#ifdef DEBUG_CAPTION
fwrite(sys->displayed.caption_reference->captions.bytes, sizeof(char), sys->displayed.caption_reference->captions.size, sys->displayed.caption_file);
#endif
sys->displayed.last_caption_reference = sys->displayed.caption_reference;
}
#ifdef DEBUG_CAPTION
else
if(sys->displayed.caption_reference &&
sys->displayed.caption_reference == sys->displayed.last_caption_reference)
{
msg_Err(&vout->obj, " - -- drop duplicate");
}
#endif
if (first && ret == VLC_SUCCESS)
{
@ -1817,11 +1843,19 @@ static int vout_Start(vout_thread_sys_t *vout, vlc_video_context *vctx, const vo
sys->displayed.current = NULL;
sys->displayed.decoded = NULL;
sys->displayed.caption_reference = NULL;
sys->displayed.last_caption_reference = NULL;
sys->displayed.date = VLC_TICK_INVALID;
sys->displayed.timestamp = VLC_TICK_INVALID;
sys->displayed.captions.size = 0;
sys->displayed.is_interlaced = false;
#ifdef DEBUG_CAPTION
sys->displayed.caption_file = fopen("/tmp/caption_dump.hex", "wb");
assert(sys->displayed.caption_file);
#endif
sys->step.last = VLC_TICK_INVALID;
sys->step.timestamp = VLC_TICK_INVALID;
@ -1948,6 +1982,10 @@ static void vout_ReleaseDisplay(vout_thread_sys_t *vout)
spu_Detach(sys->spu);
sys->clock = NULL;
video_format_Clean(&sys->original);
#ifdef DEBUG_CAPTION
msg_Info(vout, " -- fclose /tmp/caption_dump --");
fclose(sys->displayed.caption_file);
#endif
}
void vout_StopDisplay(vout_thread_t *vout)

Loading…
Cancel
Save