From patchwork Wed Oct 12 13:22:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthieu Bouron X-Patchwork-Id: 973 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.66 with SMTP id o63csp275029vsd; Wed, 12 Oct 2016 06:23:11 -0700 (PDT) X-Received: by 10.194.17.71 with SMTP id m7mr1489745wjd.179.1476278591793; Wed, 12 Oct 2016 06:23:11 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cg6si10311469wjc.181.2016.10.12.06.23.11; Wed, 12 Oct 2016 06:23:11 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C2BE3689B86; Wed, 12 Oct 2016 16:22:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f194.google.com (mail-qk0-f194.google.com [209.85.220.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 495AD689B68 for ; Wed, 12 Oct 2016 16:22:46 +0300 (EEST) Received: by mail-qk0-f194.google.com with SMTP id f128so2953421qkb.0 for ; Wed, 12 Oct 2016 06:22:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=o2cb1jk5dCzYY66/xzkym9XfgOBwhkWq5xVt3QlJymI=; b=bLkT5n/vKQszrp5CqSIfPYD19jh8kcWXCiWdkK0vzp8PFscGcBTL41LZg/6J2PsWcE pANZqvPDvLb9yPHPqHeu6Et/8svcm4he7rrkVmcuxfMNyj/RQnbcQkHNPrZsIdjkB7uV lI9/GecyZ7hmtPfi6KyE5rvsachpxBGJNIil4gqej8aSyS6ZeiwjMPAWzP3J8E3k0GMb HRVsfQK/EJW3/64wAUhbc+rXC6RTyUDhb5+ViazNOSij8JE01V07yxAqzzzPi418GcpR PRAClV2w7QZHRzR5agALrRoU6YOLoM/zpzbPVPBhbua0VUgK3uIO0dxZHN0MxLHHfcru X/+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=o2cb1jk5dCzYY66/xzkym9XfgOBwhkWq5xVt3QlJymI=; b=Gq6Ay6C8oN2iQlmd7jas2fu9N+YQ/hA9l4tHZxTmG0sjNGX5YlXHFPrR0nsULKocDR 6KDcGRzKx2cjs1s5FChH97rfCMBTKfl2IzbNThXEkxzVC31ek/8FYWOonZeI7Z7AGHoA ge/gmusqxlx2jzbKyIXKVpZs4tmo5IcgSvtwpudJTS+dGyTcTBXL6h3mNKHVA436ijrH jrjksOO1/J5b7aOVr4EQrpYZovSxvz/0tAetXWtHi19BTMPReaLgMbKCIkCV0nC3hTjU xM4ADNRAzbXHub7J0jrlKvYOD1Kk4X/NPWCQ1YLnnLzonCbkzKlvn3gxHymtQ4XZh8VQ IwMg== X-Gm-Message-State: AA6/9RmB+JotplFqUoBbO4y93s/OL0OewDtzO2QAcwrXo6/EG24miI07o3F6J+vuOi0LWw== X-Received: by 10.194.83.130 with SMTP id q2mr1470943wjy.133.1476278565041; Wed, 12 Oct 2016 06:22:45 -0700 (PDT) Received: from boken.gopro.lcl (LPuteaux-656-1-74-135.w80-12.abo.wanadoo.fr. [80.12.80.135]) by smtp.gmail.com with ESMTPSA id bl3sm12883726wjc.26.2016.10.12.06.22.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Oct 2016 06:22:44 -0700 (PDT) From: Matthieu Bouron To: ffmpeg-devel@ffmpeg.org Date: Wed, 12 Oct 2016 15:22:41 +0200 Message-Id: <20161012132242.4440-3-matthieu.bouron@gmail.com> X-Mailer: git-send-email 2.10.0 In-Reply-To: <20161012132242.4440-1-matthieu.bouron@gmail.com> References: <20161012132242.4440-1-matthieu.bouron@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/4] lavc: add mpeg4 mediacodec decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Matthieu Bouron MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Matthieu Bouron --- configure | 2 ++ libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 2 ++ libavcodec/mediacodecdec.c | 7 +++++++ libavcodec/mediacodecdec_h2645.c | 38 ++++++++++++++++++++++++++++++++++++++ libavcodec/version.h | 2 +- 6 files changed, 51 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 9587184..da4d4c4 100755 --- a/configure +++ b/configure @@ -2630,6 +2630,8 @@ mpeg2_xvmc_hwaccel_deps="xvmc" mpeg2_xvmc_hwaccel_select="mpeg2video_decoder" mpeg4_crystalhd_decoder_select="crystalhd" mpeg4_cuvid_hwaccel_deps="cuda cuvid" +mpeg4_mediacodec_decoder_deps="mediacodec" +mpeg4_mediacodec_hwaccel_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 734c79d..e8b1b00 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -413,6 +413,7 @@ OBJS-$(CONFIG_MPEG2_QSV_ENCODER) += qsvenc_mpeg2.o OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpeg12.o OBJS-$(CONFIG_MPEG4_DECODER) += xvididct.o +OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec_h2645.o OBJS-$(CONFIG_MPEG4_OMX_ENCODER) += omx.o OBJS-$(CONFIG_MPL2_DECODER) += mpl2dec.o ass.o OBJS-$(CONFIG_MSA1_DECODER) += mss3.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 44f7205..b592aa3 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -103,6 +103,7 @@ void avcodec_register_all(void) REGISTER_HWACCEL(MPEG2_VDPAU, mpeg2_vdpau); REGISTER_HWACCEL(MPEG2_VIDEOTOOLBOX, mpeg2_videotoolbox); REGISTER_HWACCEL(MPEG4_CUVID, mpeg4_cuvid); + REGISTER_HWACCEL(MPEG4_MEDIACODEC, mpeg4_mediacodec); REGISTER_HWACCEL(MPEG4_MMAL, mpeg4_mmal); REGISTER_HWACCEL(MPEG4_VAAPI, mpeg4_vaapi); REGISTER_HWACCEL(MPEG4_VDPAU, mpeg4_vdpau); @@ -657,6 +658,7 @@ void avcodec_register_all(void) REGISTER_DECODER(MPEG2_CUVID, mpeg2_cuvid); REGISTER_ENCODER(MPEG2_QSV, mpeg2_qsv); REGISTER_DECODER(MPEG4_CUVID, mpeg4_cuvid); + REGISTER_DECODER(MPEG4_MEDIACODEC, mpeg4_mediacodec); REGISTER_DECODER(VC1_CUVID, vc1_cuvid); REGISTER_DECODER(VP8_CUVID, vp8_cuvid); REGISTER_DECODER(VP8_MEDIACODEC, vp8_mediacodec); diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index e5a8dbc..c031de8 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -767,6 +767,13 @@ AVHWAccel ff_hevc_mediacodec_hwaccel = { .pix_fmt = AV_PIX_FMT_MEDIACODEC, }; +AVHWAccel ff_mpeg4_mediacodec_hwaccel = { + .name = "mediacodec", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_MPEG4, + .pix_fmt = AV_PIX_FMT_MEDIACODEC, +}; + AVHWAccel ff_vp8_mediacodec_hwaccel = { .name = "mediacodec", .type = AVMEDIA_TYPE_VIDEO, diff --git a/libavcodec/mediacodecdec_h2645.c b/libavcodec/mediacodecdec_h2645.c index c5f5af2..3cc2492 100644 --- a/libavcodec/mediacodecdec_h2645.c +++ b/libavcodec/mediacodecdec_h2645.c @@ -266,6 +266,19 @@ done: } #endif +#if CONFIG_MPEG4_MEDIACODEC_DECODER +static int mpeg4_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) +{ + int ret = 0; + + if (avctx->extradata) { + ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, avctx->extradata_size); + } + + return ret; +} +#endif + #if CONFIG_VP8_MEDIACODEC_DECODER || CONFIG_VP9_MEDIACODEC_DECODER static int vpx_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) { @@ -319,6 +332,15 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) goto done; break; #endif +#if CONFIG_MPEG4_MEDIACODEC_DECODER + case AV_CODEC_ID_MPEG4: + codec_mime = "video/mp4v-es", + + ret = mpeg4_set_extradata(avctx, format); + if (ret < 0) + goto done; + break; +#endif #if CONFIG_VP8_MEDIACODEC_DECODER case AV_CODEC_ID_VP8: codec_mime = "video/x-vnd.on2.vp8"; @@ -552,6 +574,22 @@ AVCodec ff_hevc_mediacodec_decoder = { }; #endif +#if CONFIG_MPEG4_MEDIACODEC_DECODER +AVCodec ff_mpeg4_mediacodec_decoder = { + .name = "mpeg4_mediacodec", + .long_name = NULL_IF_CONFIG_SMALL("MPEG4 Android MediaCodec decoder"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_MPEG4, + .priv_data_size = sizeof(MediaCodecH264DecContext), + .init = mediacodec_decode_init, + .decode = mediacodec_decode_frame, + .flush = mediacodec_decode_flush, + .close = mediacodec_decode_close, + .capabilities = CODEC_CAP_DELAY, + .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, +}; +#endif + #if CONFIG_VP8_MEDIACODEC_DECODER AVCodec ff_vp8_mediacodec_decoder = { .name = "vp8_mediacodec", diff --git a/libavcodec/version.h b/libavcodec/version.h index 00c3d58..1ffef59 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 57 -#define LIBAVCODEC_VERSION_MINOR 62 +#define LIBAVCODEC_VERSION_MINOR 63 #define LIBAVCODEC_VERSION_MICRO 102 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \