[FFmpeg-devel] [PATCH 1/4] lavc: add mpeg4 mediacodec decoder

Matthieu Bouron matthieu.bouron at gmail.com
Tue Jul 26 12:00:46 EEST 2016


On Sun, Jul 24, 2016 at 03:06:14PM +0200, Thomas Volkert wrote:
> From: Thomas Volkert <thomas at netzeal.de>
> 
> ---
>  Changelog                        |   1 +
>  configure                        |   1 +
>  libavcodec/Makefile              |   1 +
>  libavcodec/allcodecs.c           |   1 +
>  libavcodec/mediacodecdec_mpeg4.c | 239 +++++++++++++++++++++++++++++++++++++++
>  libavcodec/version.h             |   2 +-
>  6 files changed, 244 insertions(+), 1 deletion(-)
>  create mode 100644 libavcodec/mediacodecdec_mpeg4.c
> 
> diff --git a/Changelog b/Changelog
> index 2bd18ec..b8bbdb9 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -7,6 +7,7 @@ version <next>:
>  - Changed metadata print option to accept general urls
>  - Alias muxer for Ogg Video (.ogv)
>  - VP8 in Ogg muxing
> +- MediaCodec MPEG-4 decoding
>  
>  
>  version 3.1:
> diff --git a/configure b/configure
> index 1b41303..9004b06 100755
> --- a/configure
> +++ b/configure
> @@ -2621,6 +2621,7 @@ mpeg2_videotoolbox_hwaccel_select="mpeg2video_decoder"
>  mpeg2_xvmc_hwaccel_deps="xvmc"
>  mpeg2_xvmc_hwaccel_select="mpeg2video_decoder"
>  mpeg4_crystalhd_decoder_select="crystalhd"
> +mpeg4_mediacodec_decoder_deps="mediacodec"
>  mpeg4_mmal_decoder_deps="mmal"
>  mpeg4_mmal_decoder_select="mmal"
>  mpeg4_mmal_hwaccel_deps="mmal"
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index abef19e..642cf2a 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -317,6 +317,7 @@ OBJS-$(CONFIG_H264_DECODER)            += h264.o h264_cabac.o h264_cavlc.o \
>                                            h2645_parse.o
>  OBJS-$(CONFIG_H264_CUVID_DECODER)      += cuvid.o
>  OBJS-$(CONFIG_H264_MEDIACODEC_DECODER) += mediacodecdec_h264.o
> +OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec_mpeg4.o
>  OBJS-$(CONFIG_H264_MMAL_DECODER)       += mmaldec.o
>  OBJS-$(CONFIG_H264_NVENC_ENCODER)      += nvenc_h264.o
>  OBJS-$(CONFIG_NVENC_ENCODER)           += nvenc_h264.o
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index 951e199..2d98694 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -239,6 +239,7 @@ void avcodec_register_all(void)
>      REGISTER_ENCDEC (MPEG2VIDEO,        mpeg2video);
>      REGISTER_ENCDEC (MPEG4,             mpeg4);
>      REGISTER_DECODER(MPEG4_CRYSTALHD,   mpeg4_crystalhd);
> +    REGISTER_DECODER(MPEG4_MEDIACODEC,  mpeg4_mediacodec);
>      REGISTER_DECODER(MPEG4_MMAL,        mpeg4_mmal);

You should also add the relevant hwaccel entry in this file:

+    REGISTER_HWACCEL(MPEG4_MEDIACODEC,  mpeg4_mediacodec);

and declare the hwaccel at the bottom of libavcodec/mediacodecdec.c, like the h264 one.

>  #if FF_API_VDPAU
>      REGISTER_DECODER(MPEG4_VDPAU,       mpeg4_vdpau);
> diff --git a/libavcodec/mediacodecdec_mpeg4.c b/libavcodec/mediacodecdec_mpeg4.c
> new file mode 100644
> index 0000000..7c4559b
> --- /dev/null
> +++ b/libavcodec/mediacodecdec_mpeg4.c
> @@ -0,0 +1,239 @@
> +/*
> + * Android MediaCodec MPEG 4 decoder
> + *
> + * Copyright (c) 2016 Thomas Volkert <thomas at netzeal.de>
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include "libavutil/avassert.h"
> +#include "libavutil/common.h"
> +#include "libavutil/fifo.h"
> +
> +#include "avcodec.h"
> +#include "internal.h"
> +#include "mediacodecdec.h"
> +#include "mediacodec_wrapper.h"
> +
> +#define CODEC_MIME "video/mp4v-es"
> +
> +typedef struct MediaCodecMPEG4DecContext {
> +
> +    MediaCodecDecContext *ctx;
> +
> +    AVBSFContext *bsf;
> +
> +    AVFifoBuffer *fifo;
> +
> +    AVPacket filtered_pkt;
> +
> +} MediaCodecMPEG4DecContext;
> +
> +static av_cold int mediacodec_decode_close(AVCodecContext *avctx)
> +{
> +    MediaCodecMPEG4DecContext *s = avctx->priv_data;
> +
> +    ff_mediacodec_dec_close(avctx, s->ctx);
> +    s->ctx = NULL;
> +
> +    av_fifo_free(s->fifo);
> +
> +    av_bsf_free(&s->bsf);
> +    av_packet_unref(&s->filtered_pkt);
> +
> +    return 0;
> +}
> +
> +static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
> +{
> +    int ret;
> +
> +    FFAMediaFormat *format = NULL;
> +    MediaCodecMPEG4DecContext *s = avctx->priv_data;
> +
> +    format = ff_AMediaFormat_new();
> +    if (!format) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to create media format\n");
> +        ret = AVERROR_EXTERNAL;
> +        goto done;
> +    }
> +
> +    ff_AMediaFormat_setString(format, "mime", CODEC_MIME);
> +    ff_AMediaFormat_setInt32(format, "width", avctx->width);
> +    ff_AMediaFormat_setInt32(format, "height", avctx->height);

The relevant MPEG4 extradata (ESDS) in the csd-0 buffer are missing.

I've tested the decoder on a nexus 5 and one plus 3 either configured to
output to a surface or to output to cpu buffers and it does not work (I
guess it's because the codec extradata are missing).

The rest of the patch looks good to me though.

Matthieu
[...]


More information about the ffmpeg-devel mailing list