[vlc-commits] mediacodec: add pf_on_flush for Video/Audio
Thomas Guillem
git at videolan.org
Thu Sep 3 14:30:24 CEST 2015
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | 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;
More information about the vlc-commits
mailing list