vlc | branch: master | Thomas Guillem <[email protected]> | Wed Aug 26 17:20:34 2015 +0200| [14cdda3373e5fe3bbde760779b827e0a57135339] | committer: Thomas Guillem
mediacodec: add pf_on_flush for Video/Audio > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=14cdda3373e5fe3bbde760779b827e0a57135339 --- modules/codec/omxil/mediacodec.c | 42 ++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c index 2437a0f..9a68752 100644 --- a/modules/codec/omxil/mediacodec.c +++ b/modules/codec/omxil/mediacodec.c @@ -68,6 +68,11 @@ struct csd typedef int (*dec_on_new_block_cb)(decoder_t *, block_t *); /** + * Callback called when decoder is flushing. + */ +typedef void (*dec_on_flush_cb)(decoder_t *); + +/** * Callback called when DecodeCommon try to get an output buffer (pic or block). * It returns -1 in case of error, or the number of output buffer returned. */ @@ -97,6 +102,7 @@ struct decoder_sys_t /* Specific Audio/Video callbacks */ dec_on_new_block_cb pf_on_new_block; dec_get_output_cb pf_get_output; + dec_on_flush_cb pf_on_flush; union { @@ -132,10 +138,12 @@ static void CloseDecoder(vlc_object_t *); static int Video_OnNewBlock(decoder_t *, block_t *); static int Video_GetOutput(decoder_t *, picture_t **, block_t **, bool *, mtime_t); +static void Video_OnFlush(decoder_t *); static picture_t *DecodeVideo(decoder_t *, block_t **); static int Audio_OnNewBlock(decoder_t *, block_t *); static int Audio_GetOutput(decoder_t *, picture_t **, block_t **, bool *, mtime_t); +static void Audio_OnFlush(decoder_t *); static block_t *DecodeAudio(decoder_t *, block_t **); static void InvalidateAllPictures(decoder_t *); @@ -557,6 +565,7 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init) if (p_dec->fmt_in.i_cat == VIDEO_ES) { p_sys->pf_on_new_block = Video_OnNewBlock; + p_sys->pf_on_flush = Video_OnFlush; p_sys->pf_get_output = Video_GetOutput; p_sys->u.video.i_width = p_dec->fmt_in.video.i_width; p_sys->u.video.i_height = p_dec->fmt_in.video.i_height; @@ -598,6 +607,7 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init) { p_sys->pf_on_new_block = Audio_OnNewBlock; p_sys->pf_get_output = Audio_GetOutput; + p_sys->pf_on_flush = Audio_OnFlush; p_sys->u.audio.i_channels = p_dec->fmt_in.audio.i_channels; p_sys->psz_name = MediaCodec_GetName(VLC_OBJECT(p_dec), p_sys->mime, 0); @@ -1078,6 +1088,8 @@ static int DecodeFlush(decoder_t *p_dec) if (p_sys->decoded || p_sys->i_csd_send > 0) { + p_sys->pf_on_flush(p_dec); + p_sys->i_preroll_end = 0; if (p_sys->api->flush(p_sys->api) != VLC_SUCCESS) return VLC_EGENERIC; @@ -1242,16 +1254,6 @@ static int Video_OnNewBlock(decoder_t *p_dec, block_t *p_block) if (p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) { - if (p_sys->decoded) - { - timestamp_FifoEmpty(p_sys->u.video.timestamp_fifo); - /* Invalidate all pictures that are currently in flight - * since flushing make all previous indices returned by - * MediaCodec invalid. */ - if (p_sys->api->b_direct_rendering) - InvalidateAllPictures(p_dec); - } - if (DecodeFlush(p_dec) != VLC_SUCCESS) return -1; return 0; @@ -1302,6 +1304,18 @@ static int Video_OnNewBlock(decoder_t *p_dec, block_t *p_block) return 1; } +static void Video_OnFlush(decoder_t *p_dec) +{ + decoder_sys_t *p_sys = p_dec->p_sys; + + timestamp_FifoEmpty(p_sys->u.video.timestamp_fifo); + /* Invalidate all pictures that are currently in flight + * since flushing make all previous indices returned by + * MediaCodec invalid. */ + if (p_sys->api->b_direct_rendering) + InvalidateAllPictures(p_dec); +} + static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block) { decoder_sys_t *p_sys = p_dec->p_sys; @@ -1332,7 +1346,6 @@ static int Audio_OnNewBlock(decoder_t *p_dec, block_t *p_block) { if (DecodeFlush(p_dec) != VLC_SUCCESS) return -1; - date_Set(&p_sys->u.audio.i_end_date, VLC_TS_INVALID); return 0; } @@ -1376,6 +1389,13 @@ static int Audio_OnNewBlock(decoder_t *p_dec, block_t *p_block) return 1; } +static void Audio_OnFlush(decoder_t *p_dec) +{ + decoder_sys_t *p_sys = p_dec->p_sys; + + date_Set(&p_sys->u.audio.i_end_date, VLC_TS_INVALID); +} + static block_t *DecodeAudio(decoder_t *p_dec, block_t **pp_block) { block_t *p_out = NULL; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
