From patchwork Sat Feb 4 20:26:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takayuki 'January June' Suwa X-Patchwork-Id: 2427 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp1487005vsb; Sun, 5 Feb 2017 10:37:23 -0800 (PST) X-Received: by 10.28.181.145 with SMTP id e139mr5425674wmf.103.1486319843242; Sun, 05 Feb 2017 10:37:23 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a19si39110712wra.291.2017.02.05.10.37.22; Sun, 05 Feb 2017 10:37:23 -0800 (PST) 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=@yahoo.co.jp; 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 CD515689A3E; Sun, 5 Feb 2017 20:37:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from nh601-vm13.bullet.mail.ssk.yahoo.co.jp (nh601-vm13.bullet.mail.ssk.yahoo.co.jp [182.22.90.22]) by ffbox0-bg.mplayerhq.hu (Postfix) with SMTP id 8DA07680790 for ; Sat, 4 Feb 2017 22:28:11 +0200 (EET) Received: from [182.22.66.104] by nh601.bullet.mail.ssk.yahoo.co.jp with NNFMP; 04 Feb 2017 20:26:12 -0000 Received: from [182.22.91.131] by t602.bullet.mail.ssk.yahoo.co.jp with NNFMP; 04 Feb 2017 20:26:12 -0000 Received: from [127.0.0.1] by omp604.mail.ssk.yahoo.co.jp with NNFMP; 04 Feb 2017 20:26:12 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 747971.81672.bm@omp604.mail.ssk.yahoo.co.jp Received: (qmail 96497 invoked by alias); 4 Feb 2017 20:26:12 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.jp; s=yj20110701; t=1486239972; bh=kK9Qg9v9IzzvESJ87RCotzFHoFaCJJTMA5hooebzh7g=; h=Received:X-YMail-JAS:X-Apparently-From:X-YMail-OSG:Reply-To:To:Cc:From:Subject:Message-ID:Date:User-Agent:MIME-Version:Content-Type:Content-Transfer-Encoding; b=QoaEY/jfQlasQ7z5fdrazU+0t0vrEG1e1TYJUMLJp/gN2KOvU6aGs9x3TOdvp4RBg4FXQ2VAVLV4A3KEBj+517iXamsT4WjRrBfzXUBNPJCCSb22rj7YKQfxiUpquj/pjznlOSWPlIvZprsn39CDd2Mz0p2/ja6YgR98KhKs9SY= DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20110701; d=yahoo.co.jp; h=Received:X-YMail-JAS:X-Apparently-From:X-YMail-OSG:Reply-To:To:Cc:From:Subject:Message-ID:Date:User-Agent:MIME-Version:Content-Type:Content-Transfer-Encoding; b=B0isr9G++82vBwZSBIYI1TKZm3aI2SprLRrGUbv3Pyj7+GwJ4Hs9eKXct+dn1CPR5bh07eSVrdbopXxeGDcd2d+V4R0FrlyY+cLxpvrcuSVlUOALYG8aNMeUSUMmfFEgLokkDWlXMZS41jGr/gzL3mLn0n0YDXCHDKnt1/NUjhg= ; Received: from unknown (HELO ?192.168.2.3?) (175.177.5.147 with plain) by smtp605.mail.ssk.yahoo.co.jp with SMTP; 4 Feb 2017 20:26:12 -0000 X-YMail-JAS: lEnyiXoVM1kBz2b8h1p_OfHreU8Dfi.qF0JMx9WjppLU95g8Tvk.jb5XcWjE6irgtbv0MG4BoKhyiJDYLcwR3oCZ8IoP6s6UCphV.E_YbwItyXvJAXn4xWPZI9gceSDqtQ-- X-Apparently-From: X-YMail-OSG: OERPtSQVM1lYVL9sv6TYH7YgISM.nheGRTS7FrDGH.f2yxg qTiMphR1wCd4saud0oKtBmuka.R4evAPp9o_jkSyLaH2boB4rl2.SOqu0wM6 5UQF2kgO1BGN2iZVx17ENoRzzjMzKw7FN8hDOLJNELlvbNOxnaYynBPl8YN8 hRL45RG81mGrfGSuJtatXR_fk8.zpIchzouyHP1CZn8OCGu6mnYBjv6MCfr0 .S2dZveV2Db_aVrGe9OLJ6v2o5MBNDVtN4yp9UwUmoxQdvbAV78kqXvFSJBV H9GkgioEuK8sS9LSgcAc8B9.5xnb8f2YFEC7RMcxbAV.tdqYKSiGcFMwohWS 0L5DKgcc6bwlSfkSQ.VcDLbL.l6Cyxl7Lcrq7ExanlrTHp0lJ7rwEc2L5hCr svVeAXF.J4awcJIXlW4xhK01IfQusg5Dpo5wD6O7w2S24cPc9FVvT457j2hx Or26T4N25uiAvDf7ugo9cWzvtp3dFWSrGparGz8ZhJAvqcOWExOwNcEXByFa dPpxxwXD0s89ZGb4uStQUwDTGsIUENL40b7NiF_3sRdOJkjdy To: ffmpeg-devel@ffmpeg.org From: Takayuki 'January June' Suwa Message-ID: Date: Sun, 5 Feb 2017 05:26:11 +0900 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0 SeaMonkey/2.46 MIME-Version: 1.0 X-Mailman-Approved-At: Sun, 05 Feb 2017 20:37:16 +0200 Subject: [FFmpeg-devel] [PATCH] omx: Add support for specifying H.264 profile 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: Takayuki 'January June' Suwa Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This adds "-profile[:v] profile_name"-style option IOW. "constrained," "baseline," "main" and "high" will work well on Raspbian Jessie / RasPi3B. The others aren't checked due to unsupported. --- libavcodec/omx.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) CHECK(err); } @@ -884,6 +963,18 @@ static const AVOption options[] = { { "omx_libname", "OpenMAX library name", OFFSET(libname), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE }, { "omx_libprefix", "OpenMAX library prefix", OFFSET(libprefix), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE }, { "zerocopy", "Try to avoid copying input frames if possible", OFFSET(input_zerocopy), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + { "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = H264_OMX_PROFILE_HIGH }, H264_OMX_PROFILE_CONSTRAINED, H264_OMX_PROFILE_HIGH444INTRA, VE, "profile" }, + { "constrained", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_CONSTRAINED }, 0, 0, VE, "profile" }, + { "baseline", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_BASELINE }, 0, 0, VE, "profile" }, + { "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_MAIN }, 0, 0, VE, "profile" }, + { "extended", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_EXTENDED }, 0, 0, VE, "profile" }, + { "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_HIGH }, 0, 0, VE, "profile" }, + { "high10", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_HIGH10 }, 0, 0, VE, "profile" }, + { "high10intra", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_HIGH10INTRA }, 0, 0, VE, "profile" }, + { "high422", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_HIGH422 }, 0, 0, VE, "profile" }, + { "high422intra", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_HIGH422INTRA }, 0, 0, VE, "profile" }, + { "high444", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_HIGH444 }, 0, 0, VE, "profile" }, + { "high444intra", "", 0, AV_OPT_TYPE_CONST, { .i64 = H264_OMX_PROFILE_HIGH444INTRA }, 0, 0, VE, "profile" }, { NULL } }; diff --git a/libavcodec/omx.c b/libavcodec/omx.c index 16df50e..31a6627 100644 --- a/libavcodec/omx.c +++ b/libavcodec/omx.c @@ -44,6 +44,20 @@ #include "h264.h" #include "internal.h" +enum { + H264_OMX_PROFILE_CONSTRAINED = 0, + H264_OMX_PROFILE_BASELINE, + H264_OMX_PROFILE_MAIN, + H264_OMX_PROFILE_EXTENDED, + H264_OMX_PROFILE_HIGH, + H264_OMX_PROFILE_HIGH10, + H264_OMX_PROFILE_HIGH10INTRA, + H264_OMX_PROFILE_HIGH422, + H264_OMX_PROFILE_HIGH422INTRA, + H264_OMX_PROFILE_HIGH444, + H264_OMX_PROFILE_HIGH444INTRA, +}; + #ifdef OMX_SKIP64BIT static OMX_TICKS to_omx_ticks(int64_t value) { @@ -226,6 +240,7 @@ typedef struct OMXCodecContext { int output_buf_size; int input_zerocopy; + int profile; } OMXCodecContext; static void append_buffer(pthread_mutex_t *mutex, pthread_cond_t *cond, @@ -523,7 +538,71 @@ static av_cold int omx_component_init(AVCodecContext *avctx, const char *role) CHECK(err); avc.nBFrames = 0; avc.nPFrames = avctx->gop_size - 1; + switch (s->profile) { + case H264_OMX_PROFILE_CONSTRAINED: + avctx->profile = FF_PROFILE_H264_CONSTRAINED_BASELINE; + avc.eProfile = OMX_VIDEO_AVCProfileBaseline; + break; + case H264_OMX_PROFILE_BASELINE: + avctx->profile = FF_PROFILE_H264_BASELINE; + avc.eProfile = OMX_VIDEO_AVCProfileBaseline; + avc.bEnableFMO = 1; + avc.bEnableASO = 1; + avc.bEnableRS = 1; + break; + case H264_OMX_PROFILE_MAIN: + avctx->profile = FF_PROFILE_H264_MAIN; + avc.eProfile = OMX_VIDEO_AVCProfileMain; + break; + case H264_OMX_PROFILE_EXTENDED: + avctx->profile = FF_PROFILE_H264_EXTENDED; + avc.eProfile = OMX_VIDEO_AVCProfileExtended; + avc.bEnableFMO = 1; + avc.bEnableASO = 1; + avc.bEnableRS = 1; + break; + case H264_OMX_PROFILE_HIGH: + avctx->profile = FF_PROFILE_H264_HIGH; + avc.eProfile = OMX_VIDEO_AVCProfileHigh; + break; + case H264_OMX_PROFILE_HIGH10: + avctx->profile = FF_PROFILE_H264_HIGH_10; + avc.eProfile = OMX_VIDEO_AVCProfileHigh10; + break; + case H264_OMX_PROFILE_HIGH10INTRA: + avctx->profile = FF_PROFILE_H264_HIGH_10_INTRA; + avc.eProfile = OMX_VIDEO_AVCProfileHigh10; + avc.bconstIpred = 1; + break; + case H264_OMX_PROFILE_HIGH422: + avctx->profile = FF_PROFILE_H264_HIGH_422; + avc.eProfile = OMX_VIDEO_AVCProfileHigh422; + break; + case H264_OMX_PROFILE_HIGH422INTRA: + avctx->profile = FF_PROFILE_H264_HIGH_422_INTRA; + avc.eProfile = OMX_VIDEO_AVCProfileHigh422; + avc.bconstIpred = 1; + break; + case H264_OMX_PROFILE_HIGH444: + avctx->profile = FF_PROFILE_H264_HIGH_444; + avc.eProfile = OMX_VIDEO_AVCProfileHigh444; + break; + case H264_OMX_PROFILE_HIGH444INTRA: + avctx->profile = FF_PROFILE_H264_HIGH_444_INTRA; + avc.eProfile = OMX_VIDEO_AVCProfileHigh444; + avc.bconstIpred = 1; + break; + default: + av_log(avctx, AV_LOG_ERROR, "Unknown profile %d\n", s->profile); + return AVERROR_UNKNOWN; + } err = OMX_SetParameter(s->handle, OMX_IndexParamVideoAvc, &avc); + switch (err) { + case OMX_ErrorUnsupportedSetting: + case OMX_ErrorUnsupportedIndex: + av_log(avctx, AV_LOG_ERROR, "Unsupported profile %d\n", s->profile); + return AVERROR_UNKNOWN; + }