[vlc-commits] mediacodec: remove late opening
Thomas Guillem
git at videolan.org
Thu Apr 20 15:10:17 CEST 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Apr 20 11:07:37 2017 +0200| [11b80a543d7aae3e24e76e980481000ab199f5af] | committer: Thomas Guillem
mediacodec: remove late opening
Since packetizers will trigger a decoder reload when the size is finally valid.
We can open MediaCodec without having any CSDs since we can send them later
with the queueInput() method.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=11b80a543d7aae3e24e76e980481000ab199f5af
---
modules/codec/omxil/mediacodec.c | 51 +++++++++++++++-------------------------
1 file changed, 19 insertions(+), 32 deletions(-)
diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c
index 9a557b6aa6..574382b2e0 100644
--- a/modules/codec/omxil/mediacodec.c
+++ b/modules/codec/omxil/mediacodec.c
@@ -428,23 +428,9 @@ static int UpdateVout(decoder_t *p_dec)
&p_dec->fmt_out.video);
}
- bool b_invalid_size = !p_dec->fmt_out.video.i_width
- && !p_dec->fmt_out.video.i_height;
- if (b_invalid_size)
- {
- if (p_dec->fmt_out.i_codec != VLC_CODEC_ANDROID_OPAQUE)
- return VLC_EGENERIC;
- /* The correct video size will come from MediaCodec, setup a dummy
- * one in order to get the surface */
- p_dec->fmt_out.video.i_width = p_dec->fmt_out.video.i_height = 1;
- }
-
if (decoder_UpdateVideoFormat(p_dec) != 0)
return VLC_EGENERIC;
- if (b_invalid_size)
- p_dec->fmt_out.video.i_width = p_dec->fmt_out.video.i_height = 0;
-
if (p_dec->fmt_out.i_codec != VLC_CODEC_ANDROID_OPAQUE)
return VLC_SUCCESS;
@@ -471,15 +457,8 @@ static int StartMediaCodec(decoder_t *p_dec)
decoder_sys_t *p_sys = p_dec->p_sys;
union mc_api_args args;
- if ((p_sys->api.i_quirks & MC_API_QUIRKS_NEED_CSD) && !p_sys->i_csd_count
- && !p_sys->b_adaptive)
- return VLC_ENOOBJ;
-
if (p_dec->fmt_in.i_cat == VIDEO_ES)
{
- if (!p_sys->b_adaptive
- && (!p_dec->fmt_out.video.i_width || !p_dec->fmt_out.video.i_height))
- return VLC_ENOOBJ;
args.video.i_width = p_dec->fmt_out.video.i_width;
args.video.i_height = p_dec->fmt_out.video.i_height;
args.video.i_angle = p_sys->video.i_angle;
@@ -540,6 +519,12 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init)
if (p_dec->fmt_in.i_cat == VIDEO_ES)
{
+ /* Not all mediacodec versions can handle a size of 0. Hopefully, the
+ * packetizer will trigger a decoder restart when a new video size is
+ * found. */
+ if (!p_dec->fmt_in.video.i_width || !p_dec->fmt_in.video.i_height)
+ return VLC_EGENERIC;
+
switch (p_dec->fmt_in.i_codec) {
case VLC_CODEC_HEVC: mime = "video/hevc"; break;
case VLC_CODEC_H264: mime = "video/avc"; break;
@@ -717,26 +702,24 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init)
if (ParseExtra(p_dec) != VLC_SUCCESS)
goto bailout;
- i_ret = StartMediaCodec(p_dec);
- switch (i_ret)
+ if ((p_sys->api.i_quirks & MC_API_QUIRKS_NEED_CSD) && !p_sys->i_csd_count
+ && !p_sys->b_adaptive)
{
- case VLC_SUCCESS:
- break;
- case VLC_ENOOBJ:
switch (p_dec->fmt_in.i_codec)
{
case VLC_CODEC_H264:
case VLC_CODEC_HEVC:
- msg_Warn(p_dec, "late opening for codec %4.4s",
- (const char *)&p_dec->fmt_in.i_codec);
- break;
+ break; /* CSDs will come from hxxx_helper */
default:
- msg_Warn(p_dec, "late opening with %4.4s not handled",
+ msg_Warn(p_dec, "Not CSD found for %4.4s",
(const char *) &p_dec->fmt_in.i_codec);
goto bailout;
}
- break;
- default:
+ }
+
+ i_ret = StartMediaCodec(p_dec);
+ if (i_ret != VLC_SUCCESS)
+ {
msg_Err(p_dec, "StartMediaCodec failed");
goto bailout;
}
@@ -1269,6 +1252,10 @@ static int QueueBlockLocked(decoder_t *p_dec, block_t *p_in_block,
assert(p_sys->api.b_started);
+ if ((p_sys->api.i_quirks & MC_API_QUIRKS_NEED_CSD) && !p_sys->i_csd_count
+ && !p_sys->b_adaptive)
+ return VLC_EGENERIC; /* Wait for CSDs */
+
/* Queue CSD blocks and input blocks */
while (b_drain || (p_block = GetNextBlock(p_sys, p_in_block)))
{
More information about the vlc-commits
mailing list