vlc | branch: master | Thomas Guillem <[email protected]> | Thu May 26 10:55:47 2016 +0200| [1dc8c4389f35799a8400f166b05ca465a9e45415] | committer: Thomas Guillem
mediacodec: refactor StartMediaCodec CSD and video size checks are now done in StartMediaCodec. Call ParseVideoExtra from Open(). This was useless to call it from StartMediaCodec since p_dec.fmt_in.p_extra couldn't change during the lifetime of the module. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1dc8c4389f35799a8400f166b05ca465a9e45415 --- modules/codec/omxil/mediacodec.c | 104 +++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 58 deletions(-) diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c index 9c7f671..b548cea 100644 --- a/modules/codec/omxil/mediacodec.c +++ b/modules/codec/omxil/mediacodec.c @@ -396,9 +396,11 @@ static int ParseVideoExtraWmv3(decoder_t *p_dec, uint8_t *p_extra, int i_extra) return CSDDup(p_dec, &csd, 1); } -static int ParseVideoExtra(decoder_t *p_dec, uint8_t *p_extra, int i_extra) +static int ParseVideoExtra(decoder_t *p_dec) { decoder_sys_t *p_sys = p_dec->p_sys; + uint8_t *p_extra = p_dec->fmt_in.p_extra; + int i_extra = p_dec->fmt_in.i_extra; if (p_dec->fmt_in.i_codec == VLC_CODEC_H264 || p_dec->fmt_in.i_codec == VLC_CODEC_HEVC) @@ -437,11 +439,11 @@ static int ParseVideoExtra(decoder_t *p_dec, uint8_t *p_extra, int i_extra) } else if (p_dec->fmt_in.i_codec == VLC_CODEC_WMV3) { - return ParseVideoExtraWmv3(p_dec, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra); + return ParseVideoExtraWmv3(p_dec, p_extra, i_extra); } else if (p_dec->fmt_in.i_codec == VLC_CODEC_VC1) { - return ParseVideoExtraVc1(p_dec, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra); + return ParseVideoExtraVc1(p_dec, p_extra, i_extra); } return VLC_SUCCESS; } @@ -452,36 +454,22 @@ static int ParseVideoExtra(decoder_t *p_dec, uint8_t *p_extra, int i_extra) static int StartMediaCodec(decoder_t *p_dec) { decoder_sys_t *p_sys = p_dec->p_sys; - int i_ret = 0; union mc_api_args args; - if (p_dec->fmt_in.i_extra && !p_sys->pp_csd) + if (((p_sys->api->i_quirks & MC_API_QUIRKS_NEED_CSD) && !p_sys->pp_csd)) { - /* Try first to configure specific Video CSD */ - if (p_dec->fmt_in.i_cat == VIDEO_ES) - i_ret = ParseVideoExtra(p_dec, p_dec->fmt_in.p_extra, - p_dec->fmt_in.i_extra); - - if (i_ret != VLC_SUCCESS) - return i_ret; - - /* Set default CSD if ParseVideoExtra failed to configure one */ - if (!p_sys->pp_csd) - { - struct csd csd; - - csd.p_buf = p_dec->fmt_in.p_extra; - csd.i_size = p_dec->fmt_in.i_extra; - CSDDup(p_dec, &csd, 1); - } + msg_Warn(p_dec, "waiting for extra data for codec %4.4s", + (const char *)&p_dec->fmt_in.i_codec); + return VLC_ENOOBJ; } if (p_dec->fmt_in.i_cat == VIDEO_ES) { if (!p_sys->u.video.i_width || !p_sys->u.video.i_height) { - msg_Err(p_dec, "invalid size, abort MediaCodec"); - return VLC_EGENERIC; + msg_Warn(p_dec, "waiting for a valid video size for codec %4.4s", + (const char *)&p_dec->fmt_in.i_codec); + return VLC_ENOOBJ; } args.video.i_width = p_sys->u.video.i_width; args.video.i_height = p_sys->u.video.i_height; @@ -577,9 +565,9 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init) decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys; mc_api *api; + int i_ret; size_t i_h264_profile = 0; const char *mime = NULL; - bool b_late_opening = false; /* Video or Audio if "mediacodec-audio" bool is true */ if (p_dec->fmt_in.i_cat != VIDEO_ES && (p_dec->fmt_in.i_cat != AUDIO_ES @@ -712,14 +700,6 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init) TAB_INIT( p_sys->u.video.i_inflight_pictures, p_sys->u.video.pp_inflight_pictures ); - - if ((p_sys->api->i_quirks & MC_API_VIDEO_QUIRKS_NEED_SIZE) - && (!p_sys->u.video.i_width || !p_sys->u.video.i_height)) - { - msg_Warn(p_dec, "waiting for a valid video size for codec %4.4s", - (const char *)&p_dec->fmt_in.i_codec); - b_late_opening = true; - } } else { @@ -735,21 +715,36 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init) goto bailout; } } - if ((p_sys->api->i_quirks & MC_API_QUIRKS_NEED_CSD) - && !p_dec->fmt_in.i_extra) + + if (p_dec->fmt_in.i_extra) { - msg_Warn(p_dec, "waiting for extra data for codec %4.4s", - (const char *)&p_dec->fmt_in.i_codec); - if (p_dec->fmt_in.i_codec == VLC_CODEC_MP4V) + /* Try first to configure specific Video CSD */ + if (p_dec->fmt_in.i_cat == VIDEO_ES) + if (ParseVideoExtra(p_dec) != VLC_SUCCESS) + return VLC_EGENERIC; + + /* Set default CSD if ParseVideoExtra failed to configure one */ + if (!p_sys->pp_csd) { - msg_Warn(p_dec, "late opening with MPEG4 not handled"); /* TODO */ - goto bailout; + struct csd csd; + + csd.p_buf = p_dec->fmt_in.p_extra; + csd.i_size = p_dec->fmt_in.i_extra; + CSDDup(p_dec, &csd, 1); } - b_late_opening = true; } - if (!b_late_opening && StartMediaCodec(p_dec) != VLC_SUCCESS) + i_ret = StartMediaCodec(p_dec); + switch (i_ret) { + case VLC_SUCCESS: + break; + case VLC_ENOOBJ: + if (p_dec->fmt_in.i_codec == VLC_CODEC_MP4V) + msg_Warn(p_dec, "late opening with MPEG4 not handled"); /* TODO */ + else + break; + default: msg_Err(p_dec, "StartMediaCodec failed"); goto bailout; } @@ -1369,10 +1364,17 @@ static int DecodeCommon(decoder_t *p_dec, block_t **pp_block) if (i_flags & NEWBLOCK_FLAG_RESTART) { - msg_Warn(p_dec, "Restarting from DecodeCommon"); StopMediaCodec(p_dec); - if (StartMediaCodec(p_dec) != VLC_SUCCESS) + + int i_ret = StartMediaCodec(p_dec); + switch (i_ret) { + case VLC_SUCCESS: + msg_Warn(p_dec, "Restarted from DecodeCommon"); + break; + case VLC_ENOOBJ: + break; + default: msg_Err(p_dec, "StartMediaCodec failed"); AbortDecoderLocked(p_dec); goto end; @@ -1600,20 +1602,6 @@ static int Video_OnNewBlock(decoder_t *p_dec, block_t *p_block, int *p_flags) } } - if (!p_sys->api->b_started) - { - *p_flags |= NEWBLOCK_FLAG_RESTART; - - /* Don't start if we don't have any csd */ - if ((p_sys->api->i_quirks & MC_API_QUIRKS_NEED_CSD) && !p_sys->pp_csd) - *p_flags &= ~NEWBLOCK_FLAG_RESTART; - - /* Don't start if we don't have a valid video size */ - if ((p_sys->api->i_quirks & MC_API_VIDEO_QUIRKS_NEED_SIZE) - && (!p_sys->u.video.i_width || !p_sys->u.video.i_height)) - *p_flags &= ~NEWBLOCK_FLAG_RESTART; - } - timestamp_FifoPut(p_sys->u.video.timestamp_fifo, p_block->i_pts ? VLC_TS_INVALID : p_block->i_dts); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
