From patchwork Mon Jun 5 20:22:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 3853 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp1527160vsk; Mon, 5 Jun 2017 13:23:19 -0700 (PDT) X-Received: by 10.223.163.198 with SMTP id m6mr15261579wrb.58.1496694199356; Mon, 05 Jun 2017 13:23:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496694199; cv=none; d=google.com; s=arc-20160816; b=zToHViBQ1Zj1lqZmV5UxJdaRHRcb/C/QyptWR5No7DKOBv1eKDWPnM4Jlk/0uLDh46 5VranGigsL8NQ34ONXSJVwq/sE3mdRoUgpHuekBCcK0PluRXpEFscqIRcCCdhRrrLvPX HKAt2qjh9QVofblyBZgn+DuRerUqMKVV1OKUygMqkFmqj+KuKwPs8kiYIDaEAoKBgv9k 2dnXXEyEoMhnGZiYyrkEYBb0UlmsrOOmnq3ZrhRpUlTioqOzYnTZqnHSUjtFT0joXYhj i8cyDwcTQAk0XzsxNI+bR6dlMu1L8ydtwVFPKOwsPxl+16COmF8LcBPYPKzVosCRF0M4 VbZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=d7UTrn5/6rLQ9ozSu3qjxl0QRFzwfdBVEGpAjW1gTes=; b=nKO8ogJoqbePdk1/ijrHhtzwQ8wjZfaASrIXjfYEyfSRXPKtVYx02Gdgo71m1VOauQ cJEwRkZcVUi6fwiSwT5uiP306KrM+VLFIz2l6wbPVPfuLiUWh189jkhWfXb0lAZry9eR V+2EFG0drEW0yRC7o/ORZXaGnY/rftDBqE5ZEy6dzcC2m50higKGbBopQdg5U2z/HWUf 9bgFxQ5FHOf75ZuCn/uKd4aF5ctmDUhU+Azpgw3mdEBPU1iEtyoMsAbTj4B3kXMaBLm3 Kr20Yyp1zjc8KtuHuO3GmxjBufpUuCTtc6ZOjZv4bvaISI6xJiwmIG8sNSqoVIgCOKWC rGtw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@tmm1-net.20150623.gappssmtp.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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 3si13709808wro.336.2017.06.05.13.23.18; Mon, 05 Jun 2017 13:23:19 -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=@tmm1-net.20150623.gappssmtp.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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 90C3F689DE7; Mon, 5 Jun 2017 23:23:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f193.google.com (mail-qt0-f193.google.com [209.85.216.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D1A8D689DCB for ; Mon, 5 Jun 2017 23:23:02 +0300 (EEST) Received: by mail-qt0-f193.google.com with SMTP id w1so18713340qtg.0 for ; Mon, 05 Jun 2017 13:23:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tmm1-net.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id; bh=hsHF7Fx7ACH2YRXi46mCKV7S9Qq4DTaUFbLOJVeJMHc=; b=UMIa1UoMrUxCOxM1pC4gRsiO26CammQULvH1GKmEOVUlPZpS7ku95W9xHXgJkpYV7d GwldpivL0CC+mEDdEXkpHoy+vevBIJRlTWGuZJVEe8vlGZXGTazJhkyZjI2BirubXgRc jpu1t49SZkXGjKXe9s/49zs0mwG6G2Y5BoFJJvf/LlTUSmH/5rrcN3Mfdd+8Rs0Eqlg1 oXVPggijXX/EWajPHYE0fdaEmXJ/vqPS/7k2UcsrigPqLyOCPZ4hC+T5pXX/LGxSVtVZ JhdFHLZmjw5jcF+0OP6jvGaejjg26pjVKmc7H4bQ0riBlzaK1cMpTAKLnLI//JE7sHRC LtLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=hsHF7Fx7ACH2YRXi46mCKV7S9Qq4DTaUFbLOJVeJMHc=; b=AwpT/2joveqHpHmWIye072g9nlM0lCay7sVgZRLlx6JeXjhZn2758UvT9I6YxxF00K woOjAGdaKygdA6JjWAyboWPsMOvltNYrqJs8uTKA6jVoDlgs8HfauU4b/De1n3qkIBDN V7R+dzWCIpCEx3KRxeaanaeJnCkUYP1+WwZjHT7+ELMCVtepdntOy7O3ISZSkR25UZb1 POEw8SmYV1dyx6yMY2MsWE38lV1mEb5L3ulhboMYOUVArLGeywxloaeJ8/+FF1kLR+vc nPKIl2hjvVpq5+Z9nkdqGax+1Z7RfLh1NYJUyMWowXkWNMaUY38wYRr+miogYWiDPKUW luSg== X-Gm-Message-State: AKS2vOzcTNUf/DaxVsc7SXAKHQP7mt8GiR447Cfzi1uBp4Ey39MNUODP P4B/HWqzm+RK1fbudhLBZw== X-Received: by 10.55.94.4 with SMTP id s4mr13822011qkb.27.1496694187978; Mon, 05 Jun 2017 13:23:07 -0700 (PDT) Received: from localhost.localdomain ([104.129.194.79]) by smtp.gmail.com with ESMTPSA id 34sm3785122qtn.45.2017.06.05.13.23.06 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 05 Jun 2017 13:23:07 -0700 (PDT) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Mon, 5 Jun 2017 16:22:58 -0400 Message-Id: <20170605202258.95918-1-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.11.0 (Apple Git-81) Subject: [FFmpeg-devel] [PATCH v3] lavc: add mpeg2 decoder/hwaccel to mediacodec 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: Aman Gupta MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Aman Gupta Android TV and FireOS hardware supports mpeg2 hardware decoding via MediaCodec. --- configure | 2 ++ libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 2 ++ libavcodec/mediacodecdec.c | 40 ++++++++++++++++++++++++++++++++++++++- libavcodec/mediacodecdec_common.c | 7 +++++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 72060ef0e9..5816de2398 100755 --- a/configure +++ b/configure @@ -2656,6 +2656,7 @@ mpeg2_d3d11va_hwaccel_deps="d3d11va" mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder" mpeg2_dxva2_hwaccel_deps="dxva2" mpeg2_dxva2_hwaccel_select="mpeg2video_decoder" +mpeg2_mediacodec_hwaccel_deps="mediacodec" mpeg2_mmal_hwaccel_deps="mmal" mpeg2_qsv_hwaccel_deps="libmfx" mpeg2_qsv_hwaccel_select="qsvdec_mpeg2" @@ -2762,6 +2763,7 @@ mpeg1_vdpau_decoder_select="mpeg1video_decoder" mpeg2_crystalhd_decoder_select="crystalhd" mpeg2_cuvid_decoder_deps="cuda cuvid" mpeg2_mmal_decoder_deps="mmal" +mpeg2_mediacodec_decoder_deps="mediacodec" mpeg2_qsv_decoder_deps="libmfx" mpeg2_qsv_decoder_select="qsvdec mpeg2_qsv_hwaccel" mpeg2_qsv_encoder_deps="libmfx" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 0818950ad9..a752f87ef5 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -423,6 +423,7 @@ OBJS-$(CONFIG_MPEG2_QSV_DECODER) += qsvdec_other.o 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_MPEG2_MEDIACODEC_DECODER) += mediacodecdec.o OBJS-$(CONFIG_MPEG2_VAAPI_ENCODER) += vaapi_encode_mpeg2.o OBJS-$(CONFIG_MPEG4_DECODER) += xvididct.o OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 89fadcd2fa..4373ebd975 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -96,6 +96,7 @@ static void register_all(void) REGISTER_HWACCEL(MPEG2_VAAPI, mpeg2_vaapi); REGISTER_HWACCEL(MPEG2_VDPAU, mpeg2_vdpau); REGISTER_HWACCEL(MPEG2_VIDEOTOOLBOX, mpeg2_videotoolbox); + REGISTER_HWACCEL(MPEG2_MEDIACODEC, mpeg2_mediacodec); REGISTER_HWACCEL(MPEG4_CUVID, mpeg4_cuvid); REGISTER_HWACCEL(MPEG4_MEDIACODEC, mpeg4_mediacodec); REGISTER_HWACCEL(MPEG4_MMAL, mpeg4_mmal); @@ -257,6 +258,7 @@ static void register_all(void) REGISTER_DECODER(MPEG2_MMAL, mpeg2_mmal); REGISTER_DECODER(MPEG2_CRYSTALHD, mpeg2_crystalhd); REGISTER_DECODER(MPEG2_QSV, mpeg2_qsv); + REGISTER_DECODER(MPEG2_MEDIACODEC, mpeg2_mediacodec); REGISTER_DECODER(MSA1, msa1); REGISTER_DECODER(MSCC, mscc); REGISTER_DECODER(MSMPEG4V1, msmpeg4v1); diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index ccfcb4b9ce..5bdeb6c1d7 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -1,5 +1,5 @@ /* - * Android MediaCodec H.264 / H.265 / MPEG-4 / VP8 / VP9 decoders + * Android MediaCodec MPEG-2 / H.264 / H.265 / MPEG-4 / VP8 / VP9 decoders * * Copyright (c) 2015-2016 Matthieu Bouron * @@ -267,6 +267,19 @@ done: } #endif +#if CONFIG_MPEG2_MEDIACODEC_DECODER +static int mpeg2_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_MPEG4_MEDIACODEC_DECODER static int mpeg4_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) { @@ -333,6 +346,15 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) goto done; break; #endif +#if CONFIG_MPEG2_MEDIACODEC_DECODER + case AV_CODEC_ID_MPEG2VIDEO: + codec_mime = "video/mpeg2"; + + ret = mpeg2_set_extradata(avctx, format); + if (ret < 0) + goto done; + break; +#endif #if CONFIG_MPEG4_MEDIACODEC_DECODER case AV_CODEC_ID_MPEG4: codec_mime = "video/mp4v-es", @@ -575,6 +597,22 @@ AVCodec ff_hevc_mediacodec_decoder = { }; #endif +#if CONFIG_MPEG2_MEDIACODEC_DECODER +AVCodec ff_mpeg2_mediacodec_decoder = { + .name = "mpeg2_mediacodec", + .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 Android MediaCodec decoder"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_MPEG2VIDEO, + .priv_data_size = sizeof(MediaCodecH264DecContext), + .init = mediacodec_decode_init, + .decode = mediacodec_decode_frame, + .flush = mediacodec_decode_flush, + .close = mediacodec_decode_close, + .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, + .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, +}; +#endif + #if CONFIG_MPEG4_MEDIACODEC_DECODER AVCodec ff_mpeg4_mediacodec_decoder = { .name = "mpeg4_mediacodec", diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index 2ec25c581d..1263188d34 100644 --- a/libavcodec/mediacodecdec_common.c +++ b/libavcodec/mediacodecdec_common.c @@ -766,6 +766,13 @@ AVHWAccel ff_hevc_mediacodec_hwaccel = { .pix_fmt = AV_PIX_FMT_MEDIACODEC, }; +AVHWAccel ff_mpeg2_mediacodec_hwaccel = { + .name = "mediacodec", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_MPEG2VIDEO, + .pix_fmt = AV_PIX_FMT_MEDIACODEC, +}; + AVHWAccel ff_mpeg4_mediacodec_hwaccel = { .name = "mediacodec", .type = AVMEDIA_TYPE_VIDEO,