On Tue, Jul 26, 2016 at 11:00:46AM +0200, Matthieu Bouron wrote: > On Sun, Jul 24, 2016 at 03:06:14PM +0200, Thomas Volkert wrote: > > From: Thomas Volkert <tho...@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 <tho...@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).
Forgot to mention the files I've tested the decoder against: http://samples.0x5c.me/MPEG4/ > > The rest of the patch looks good to me though. > > Matthieu > [...] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel