[FFmpeg-devel] [PATCH v2 4/4] avcodec/mediacodecdec: add workaround for buggy amlogic mpeg2 decoder
Aman Gupta
ffmpeg at tmm1.net
Thu May 3 20:27:20 EEST 2018
On Thu, May 3, 2018 at 12:37 AM, Matthieu Bouron <matthieu.bouron at gmail.com>
wrote:
> On Wed, May 02, 2018 at 07:25:00PM -0700, Aman Gupta wrote:
> > From: Aman Gupta <aman at tmm1.net>
> >
> > ---
> > libavcodec/mediacodecdec.c | 22 +++++++++++++++++++---
> > 1 file changed, 19 insertions(+), 3 deletions(-)
> >
> > diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
> > index 2ac22dd1f6..3a4240aa95 100644
> > --- a/libavcodec/mediacodecdec.c
> > +++ b/libavcodec/mediacodecdec.c
> > @@ -48,6 +48,7 @@ typedef struct MediaCodecH264DecContext {
> > AVPacket buffered_pkt;
> >
> > int delay_flush;
> > + int amlogic_mpeg2_api23_workaround;
> >
> > } MediaCodecH264DecContext;
> >
> > @@ -287,6 +288,7 @@ static int common_set_extradata(AVCodecContext
> *avctx, FFAMediaFormat *format)
> > static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
> > {
> > int ret;
> > + int sdk_int;
> >
> > const char *codec_mime = NULL;
> >
> > @@ -377,7 +379,17 @@ static av_cold int mediacodec_decode_init(AVCodecContext
> *avctx)
> > goto done;
> > }
> >
> > - av_log(avctx, AV_LOG_INFO, "MediaCodec started successfully, ret =
> %d\n", ret);
> > + av_log(avctx, AV_LOG_INFO,
> > + "MediaCodec started successfully: codec = %s, ret = %d\n",
> > + s->ctx->codec_name, ret);
> > +
> > + sdk_int = ff_Build_SDK_INT(avctx);
> > + if (sdk_int <= 23 &&
> > + strcmp(s->ctx->codec_name, "OMX.amlogic.mpeg2.decoder.awesome")
> == 0) {
> > + av_log(avctx, AV_LOG_INFO, "Enabling workaround for %s on
> API=%d\n",
> > + s->ctx->codec_name, sdk_int);
> > + s->amlogic_mpeg2_api23_workaround = 1;
> > + }
> >
> > done:
> > if (format) {
> > @@ -434,8 +446,12 @@ static int mediacodec_receive_frame(AVCodecContext
> *avctx, AVFrame *frame)
> > return ret;
> > }
> >
> > - /* poll for space again */
> > - continue;
> > + if (s->amlogic_mpeg2_api23_workaround &&
> s->buffered_pkt.size <= 0) {
> > + /* fallthrough to fetch next packet regardless of input
> buffer space */
> > + } else {
> > + /* poll for space again */
> > + continue;
> > + }
> > }
> >
> > /* fetch new packet or eof */
> > --
> > 2.14.2
> >
>
> Can you describe in the commit message what the issue is with this device
> ?
>
Sure I can try. TBH I don't fully understand. I tested 7 devices, and this
was the only one that had issues. Without this change,
the picture would stall repeatedly during playback. After this change it
worked fine, though I can't explain why.
What's even more interesting is that two of the other devices I tried have
the same amlogic decoder but are running a newer
android OS, and work just fine without any changes.
Aman
>
> Thanks,
>
> --
> Matthieu B.
>
More information about the ffmpeg-devel
mailing list