From patchwork Sat Apr 11 10:03:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18844 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id D2F4A4491E3 for ; Sat, 11 Apr 2020 13:11:25 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B857A68B52B; Sat, 11 Apr 2020 13:11:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A990F68B49A for ; Sat, 11 Apr 2020 13:11:19 +0300 (EEST) IronPort-SDR: hfb9yCEBLnvZbYElUT7NFFhhPEvZoLmJybv1z8eRHw4PG9ulpmvuj/W33Jj6kNQKWuNf+FsB6M rHv1AkGcMs6A== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:18 -0700 IronPort-SDR: WGI7ST9mH/W9u/nWhYYx78ZuiDUVABYS81Bzn74/8uiqzfTZ4pUV9LIetkrF0segfk3leAgU0M XeRJ3vKg96GQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397079" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:17 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:31 +0800 Message-Id: <1586599419-21122-2-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 1/9] lavc/libopenh264enc: Add default qmin/qmax support 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Set default QP range to (1, 51) instead of (2, 32). QP = 0 is not well supported currently in libopenh264. If iMaxQp/iMinQp equals 0, the QP range would be changed unexpectedly inside libopenh264 with a warning: Warning:Change QP Range from(0,51) to (12,42) [1] [2] Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index dd5d4ee..c7ae5b1 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -135,6 +135,9 @@ FF_ENABLE_DEPRECATION_WARNINGS param.iTargetBitrate = avctx->bit_rate; param.iMaxBitrate = FFMAX(avctx->rc_max_rate, avctx->bit_rate); param.iRCMode = RC_QUALITY_MODE; + // QP = 0 is not well supported, so default to (1, 51) + param.iMaxQp = avctx->qmax >= 0 ? av_clip(avctx->qmax, 1, 51) : 51; + param.iMinQp = avctx->qmin >= 0 ? av_clip(avctx->qmin, 1, param.iMaxQp) : 1; param.iTemporalLayerNum = 1; param.iSpatialLayerNum = 1; param.bEnableDenoise = 0; @@ -331,6 +334,12 @@ static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, return 0; } +static const AVCodecDefault svc_enc_defaults[] = { + { "qmin", "-1" }, + { "qmax", "-1" }, + { NULL }, +}; + AVCodec ff_libopenh264_encoder = { .name = "libopenh264", .long_name = NULL_IF_CONFIG_SMALL("OpenH264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), @@ -344,6 +353,7 @@ AVCodec ff_libopenh264_encoder = { .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, + .defaults = svc_enc_defaults, .priv_class = &class, .wrapper_name = "libopenh264", }; From patchwork Sat Apr 11 10:03:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18845 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 99D484491E3 for ; Sat, 11 Apr 2020 13:11:28 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 880FF68B599; Sat, 11 Apr 2020 13:11:28 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7A5E668B599 for ; Sat, 11 Apr 2020 13:11:21 +0300 (EEST) IronPort-SDR: JIF5BjLIid4bDO+akPeRI2zgGbtdXbMp6FYnO7Gzllgp90nk68mPoj17p0AVvS7suE772/gRTq SvsWByAtt6nQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:20 -0700 IronPort-SDR: 9+sCfRK25QyCtsf5R8sCHfL07nu4cUmP2RFrL2wOsO5BaTqTFq1dUKN2YAMyP9h4GveaBDvBpp TewKU21w0E+g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397083" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:19 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:32 +0800 Message-Id: <1586599419-21122-3-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 2/9] lavc/libopenh264enc: add default gop size and bit rate 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" It would be 200kbps bitrate with gop size = 12 by default which generated too many IDR frames in rather low bit rate. The quality would be poor. Set these default values according to vaapi encoder, and use 2Mbps bitrate if user doesn't set it explicitly as nvenc sugguested. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index c7ae5b1..57313b1 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -132,7 +132,7 @@ FF_ENABLE_DEPRECATION_WARNINGS param.fMaxFrameRate = 1/av_q2d(avctx->time_base); param.iPicWidth = avctx->width; param.iPicHeight = avctx->height; - param.iTargetBitrate = avctx->bit_rate; + param.iTargetBitrate = avctx->bit_rate > 0 ? avctx->bit_rate : 2*1000*1000; param.iMaxBitrate = FFMAX(avctx->rc_max_rate, avctx->bit_rate); param.iRCMode = RC_QUALITY_MODE; // QP = 0 is not well supported, so default to (1, 51) @@ -335,6 +335,8 @@ static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, } static const AVCodecDefault svc_enc_defaults[] = { + { "b", "0" }, + { "g", "120" }, { "qmin", "-1" }, { "qmax", "-1" }, { NULL }, From patchwork Sat Apr 11 10:03:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18846 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 692464491E3 for ; Sat, 11 Apr 2020 13:11:31 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5528B68B5BF; Sat, 11 Apr 2020 13:11:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A32F068B599 for ; Sat, 11 Apr 2020 13:11:22 +0300 (EEST) IronPort-SDR: Sb5OkvmL4YnBj8gCeG+piKIYt+5dFpnvbjEOzX+xBKNCWbuYs27de3xANclLXbqwIBbZaRKaYJ HtbdxKmZyuKQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:22 -0700 IronPort-SDR: 5fc6WOUb5oEnpIOlzXSBewZelV418QJwILg76+p9zC0NE+wndBX7nJqP3TNW4Lgx773rg/l75v x+QDcJWDgk/Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397086" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:20 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:33 +0800 Message-Id: <1586599419-21122-4-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 3/9] lavc/libopenh264enc: add bit rate control select support 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" RC_BITRATE_MODE: set BITS_EXCEEDED to iCurrentBitsLevel and allows QP adjust in RcCalculatePictureQp(). RC_BUFFERBASED_MODE: use buffer status to adjust the video quality. RC_TIMESTAMP_MODE: bit rate control based on timestamp. Default to use RC_QUALITY_MODE. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 57313b1..f994f95 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -47,6 +47,9 @@ typedef struct SVCContext { int skip_frames; int skipped; int cabac; + + // rate control mode + int rc_mode; } SVCContext; #define OFFSET(x) offsetof(SVCContext, x) @@ -71,6 +74,13 @@ static const AVOption options[] = { { "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, { "allow_skip_frames", "allow skipping frames to hit the target bitrate", OFFSET(skip_frames), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { "cabac", "Enable cabac", OFFSET(cabac), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + + { "rc_mode", "Select rate control mode", OFFSET(rc_mode), AV_OPT_TYPE_INT, { .i64 = RC_QUALITY_MODE }, RC_OFF_MODE, RC_TIMESTAMP_MODE, VE, "rc_mode" }, + { "off", "bit rate control off", 0, AV_OPT_TYPE_CONST, { .i64 = RC_OFF_MODE }, 0, 0, VE, "rc_mode" }, + { "quality", "quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = RC_QUALITY_MODE }, 0, 0, VE, "rc_mode" }, + { "bitrate", "bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = RC_BITRATE_MODE }, 0, 0, VE, "rc_mode" }, + { "buffer", "using buffer status to adjust the video quality (no bitrate control)", 0, AV_OPT_TYPE_CONST, { .i64 = RC_BUFFERBASED_MODE }, 0, 0, VE, "rc_mode" }, + { "timestamp", "bit rate control based on timestamp", 0, AV_OPT_TYPE_CONST, { .i64 = RC_TIMESTAMP_MODE }, 0, 0, VE, "rc_mode" }, { NULL } }; @@ -134,7 +144,7 @@ FF_ENABLE_DEPRECATION_WARNINGS param.iPicHeight = avctx->height; param.iTargetBitrate = avctx->bit_rate > 0 ? avctx->bit_rate : 2*1000*1000; param.iMaxBitrate = FFMAX(avctx->rc_max_rate, avctx->bit_rate); - param.iRCMode = RC_QUALITY_MODE; + param.iRCMode = s->rc_mode; // QP = 0 is not well supported, so default to (1, 51) param.iMaxQp = avctx->qmax >= 0 ? av_clip(avctx->qmax, 1, 51) : 51; param.iMinQp = avctx->qmin >= 0 ? av_clip(avctx->qmin, 1, param.iMaxQp) : 1; From patchwork Sat Apr 11 10:03:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18847 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 488A74491E3 for ; Sat, 11 Apr 2020 13:11:32 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 32C2168B5F8; Sat, 11 Apr 2020 13:11:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9322868B5BE for ; Sat, 11 Apr 2020 13:11:25 +0300 (EEST) IronPort-SDR: hZC00G9PhBuAoUipmtk+ED08RMeZLTLPeXW5K5GO8xS6ovMe9m/s9FrXIUkyynLDggi8b3sVov LJO5F4HqGW0g== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:23 -0700 IronPort-SDR: YgUoMTIU6ixb2qaM8CWjnkNNtMmPZ5dy1cnWlNkSniWGMtFWxgzj7Do9rNKbk0wvQwjUZOawYe S8Gv44Cfps5w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397090" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:22 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:34 +0800 Message-Id: <1586599419-21122-5-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 4/9] lavc/libopenh264enc: prompt slice number changing inside libopenh264 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Libopenh264enc would set the slice according to the number of cpu cores if uiSliceNum equals to 0 (auto) in SM_FIXEDSLCNUM_SLICE mode. Prompt a warning for user to catch this. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index f994f95..e556f03 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -237,6 +237,8 @@ FF_ENABLE_DEPRECATION_WARNINGS param.sSpatialLayers[0].sSliceCfg.uiSliceMode = s->slice_mode; param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = avctx->slices; #endif + if (avctx->slices == 0 && s->slice_mode == SM_FIXEDSLCNUM_SLICE) + av_log(avctx, AV_LOG_WARNING, "Slice count will be set automatically\n"); if (s->slice_mode == SM_SIZELIMITED_SLICE) { if (s->max_nal_size) { From patchwork Sat Apr 11 10:03:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18850 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 79C2D4491E3 for ; Sat, 11 Apr 2020 13:11:35 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 65E5768B6B2; Sat, 11 Apr 2020 13:11:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6809768B666 for ; Sat, 11 Apr 2020 13:11:27 +0300 (EEST) IronPort-SDR: gHHMkdhFRzqlpRqQ6WU1LOU8lxSwR7R065LpdetAHBZNm1IsE7FTY+Od5yGQ64+Mhj/1E8tv08 RFr24CYo+2rA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:26 -0700 IronPort-SDR: 53lNW4B7C5oxs6IS46LSd0KyQhaCbxv+1h1+tOIlx9tQZ80EypM0MWawghAtS8gjpZX4U0ar/f cHlxyL8DEL/A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397096" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:25 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:35 +0800 Message-Id: <1586599419-21122-6-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 5/9] lavc/libopenh264enc: set slice_mode option to deprecated 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" "slice mode" seems to be unnecessary since it could be determined by -slices/max_nal_size. default: SM_FIXEDSLCNUM_SLICE mode with cpu-number slices. -slices N: SM_FIXEDSLCNUM_SLICE mode with N slices. -max_nal_size: SM_SIZELIMITED_SLICE mode with limited size slices. Add OPENH264_API_SLICE_MODE to remove this option after LIBAVCODEC_VERSION_MAJOR = 59. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index e556f03..3a642f0 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -33,6 +33,10 @@ #include "internal.h" #include "libopenh264.h" +#ifndef OPENH264_API_SLICE_MODE +#define OPENH264_API_SLICE_MODE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif + #if !OPENH264_VER_AT_LEAST(1, 6) #define SM_SIZELIMITED_SLICE SM_DYN_SLICE #endif @@ -40,7 +44,9 @@ typedef struct SVCContext { const AVClass *av_class; ISVCEncoder *encoder; - int slice_mode; +#if OPENH264_API_SLICE_MODE + int slice_mode; // deprecated +#endif int loopfilter; char *profile; int max_nal_size; @@ -54,11 +60,13 @@ typedef struct SVCContext { #define OFFSET(x) offsetof(SVCContext, x) #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM +#define DEPRECATED AV_OPT_FLAG_DEPRECATED static const AVOption options[] = { +#if OPENH264_API_SLICE_MODE #if OPENH264_VER_AT_LEAST(1, 6) - { "slice_mode", "set slice mode", OFFSET(slice_mode), AV_OPT_TYPE_INT, { .i64 = SM_FIXEDSLCNUM_SLICE }, SM_SINGLE_SLICE, SM_RESERVED, VE, "slice_mode" }, + { "slice_mode", "set slice mode, use slices/max_nal_size", OFFSET(slice_mode), AV_OPT_TYPE_INT, { .i64 = SM_FIXEDSLCNUM_SLICE }, SM_SINGLE_SLICE, SM_RESERVED, VE|DEPRECATED, "slice_mode" }, #else - { "slice_mode", "set slice mode", OFFSET(slice_mode), AV_OPT_TYPE_INT, { .i64 = SM_AUTO_SLICE }, SM_SINGLE_SLICE, SM_RESERVED, VE, "slice_mode" }, + { "slice_mode", "set slice mode, use slices/max_nal_size", OFFSET(slice_mode), AV_OPT_TYPE_INT, { .i64 = SM_AUTO_SLICE }, SM_SINGLE_SLICE, SM_RESERVED, VE|DEPRECATED, "slice_mode" }, #endif { "fixed", "a fixed number of slices", 0, AV_OPT_TYPE_CONST, { .i64 = SM_FIXEDSLCNUM_SLICE }, 0, 0, VE, "slice_mode" }, #if OPENH264_VER_AT_LEAST(1, 6) @@ -69,6 +77,7 @@ static const AVOption options[] = { { "auto", "automatic number of slices according to number of threads", 0, AV_OPT_TYPE_CONST, { .i64 = SM_AUTO_SLICE }, 0, 0, VE, "slice_mode" }, { "dyn", "Dynamic slicing", 0, AV_OPT_TYPE_CONST, { .i64 = SM_DYN_SLICE }, 0, 0, VE, "slice_mode" }, #endif +#endif { "loopfilter", "enable loop filter", OFFSET(loopfilter), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE }, { "profile", "set profile restrictions", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VE }, { "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, From patchwork Sat Apr 11 10:03:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18851 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 2C34A4491E3 for ; Sat, 11 Apr 2020 13:11:38 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1672E68B603; Sat, 11 Apr 2020 13:11:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EC0DD68B663 for ; Sat, 11 Apr 2020 13:11:28 +0300 (EEST) IronPort-SDR: xuMsXebs9lO2sgSCCz7NGMlPFbDF9lZ18+ahWh4pnEqHwreaNICZStk71o9RIk5vC7/hiz//N6 B63rRXljZcSQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:28 -0700 IronPort-SDR: 1LvpUNnXGhGG4azKDI9LmflafOmckN1fEOEi+xwCx7VoDDhbOkzkoYqXT5HnvN9rtBs9BGDAoi b8iMPyP8Fl3w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397101" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:27 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:36 +0800 Message-Id: <1586599419-21122-7-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 6/9] lavc/libopenh264enc: separate svc_encode_init() into several functions 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Separate the initialization procedure into different functions. Make it more readable and easier to be extended. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 283 +++++++++++++++++++++++++++----------------- 1 file changed, 174 insertions(+), 109 deletions(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 3a642f0..c85ae0e 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -111,120 +111,51 @@ static av_cold int svc_encode_close(AVCodecContext *avctx) return 0; } -static av_cold int svc_encode_init(AVCodecContext *avctx) +static av_cold int svc_encode_init_profile(AVCodecContext *avctx, SEncParamExt *param) { SVCContext *s = avctx->priv_data; - SEncParamExt param = { 0 }; - int err; - int log_level; - WelsTraceCallback callback_function; - AVCPBProperties *props; - if ((err = ff_libopenh264_check_version(avctx)) < 0) - return err; + if (s->profile && !strcmp(s->profile, "main")) + param->iEntropyCodingModeFlag = 1; //< 0:CAVLC 1:CABAC + else if (!s->profile && s->cabac) + param->iEntropyCodingModeFlag = 1; + else + param->iEntropyCodingModeFlag = 0; - if (WelsCreateSVCEncoder(&s->encoder)) { - av_log(avctx, AV_LOG_ERROR, "Unable to create encoder\n"); - return AVERROR_UNKNOWN; - } + return 0; +} - // Pass all libopenh264 messages to our callback, to allow ourselves to filter them. - log_level = WELS_LOG_DETAIL; - (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_LEVEL, &log_level); +static av_cold int svc_encode_init_rate_control(AVCodecContext *avctx, SEncParamExt *param) +{ + SVCContext *s = avctx->priv_data; - // Set the logging callback function to one that uses av_log() (see implementation above). - callback_function = (WelsTraceCallback) ff_libopenh264_trace_callback; - (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_CALLBACK, &callback_function); + /* Rate Control */ + param->iRCMode = s->rc_mode; - // Set the AVCodecContext as the libopenh264 callback context so that it can be passed to av_log(). - (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_CALLBACK_CONTEXT, &avctx); + param->iTargetBitrate = avctx->bit_rate > 0 ? avctx->bit_rate : 2*1000*1000; + param->iMaxBitrate = FFMAX(avctx->rc_max_rate, avctx->bit_rate); + param->bEnableFrameSkip = s->skip_frames; - (*s->encoder)->GetDefaultParams(s->encoder, ¶m); + // QP = 0 is not well supported, so default to (1, 51) + param->iMaxQp = avctx->qmax >= 0 ? av_clip(avctx->qmax, 1, 51) : 51; + param->iMinQp = avctx->qmin >= 0 ? av_clip(avctx->qmin, 1, param->iMaxQp) : 1; + param->bEnableAdaptiveQuant = 1; -#if FF_API_CODER_TYPE -FF_DISABLE_DEPRECATION_WARNINGS - if (!s->cabac) - s->cabac = avctx->coder_type == FF_CODER_TYPE_AC; -FF_ENABLE_DEPRECATION_WARNINGS -#endif + param->iSpatialLayerNum = 1; // Number of dependency(Spatial/CGS) layers used to be encoded + param->iTemporalLayerNum = 1; // Number of temporal layer specified - param.fMaxFrameRate = 1/av_q2d(avctx->time_base); - param.iPicWidth = avctx->width; - param.iPicHeight = avctx->height; - param.iTargetBitrate = avctx->bit_rate > 0 ? avctx->bit_rate : 2*1000*1000; - param.iMaxBitrate = FFMAX(avctx->rc_max_rate, avctx->bit_rate); - param.iRCMode = s->rc_mode; - // QP = 0 is not well supported, so default to (1, 51) - param.iMaxQp = avctx->qmax >= 0 ? av_clip(avctx->qmax, 1, 51) : 51; - param.iMinQp = avctx->qmin >= 0 ? av_clip(avctx->qmin, 1, param.iMaxQp) : 1; - param.iTemporalLayerNum = 1; - param.iSpatialLayerNum = 1; - param.bEnableDenoise = 0; - param.bEnableBackgroundDetection = 1; - param.bEnableAdaptiveQuant = 1; - param.bEnableFrameSkip = s->skip_frames; - param.bEnableLongTermReference = 0; - param.iLtrMarkPeriod = 30; - param.uiIntraPeriod = avctx->gop_size; -#if OPENH264_VER_AT_LEAST(1, 4) - param.eSpsPpsIdStrategy = CONSTANT_ID; -#else - param.bEnableSpsPpsIdAddition = 0; -#endif - param.bPrefixNalAddingCtrl = 0; - param.iLoopFilterDisableIdc = !s->loopfilter; - param.iEntropyCodingModeFlag = 0; - param.iMultipleThreadIdc = avctx->thread_count; - if (s->profile && !strcmp(s->profile, "main")) - param.iEntropyCodingModeFlag = 1; - else if (!s->profile && s->cabac) - param.iEntropyCodingModeFlag = 1; + param->bEnableDenoise = 0; // Denoise control + param->bEnableBackgroundDetection = 1; // Background detection control - param.sSpatialLayers[0].iVideoWidth = param.iPicWidth; - param.sSpatialLayers[0].iVideoHeight = param.iPicHeight; - param.sSpatialLayers[0].fFrameRate = param.fMaxFrameRate; - param.sSpatialLayers[0].iSpatialBitrate = param.iTargetBitrate; - param.sSpatialLayers[0].iMaxSpatialBitrate = param.iMaxBitrate; + param->bEnableLongTermReference = 0; // Long term reference control + param->iLtrMarkPeriod = 30; // the min distance of two int32_t references -#if OPENH264_VER_AT_LEAST(1, 7) - if (avctx->sample_aspect_ratio.num && avctx->sample_aspect_ratio.den) { - // Table E-1. - static const AVRational sar_idc[] = { - { 0, 0 }, // Unspecified (never written here). - { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 }, - { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 }, - { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 }, - { 160, 99 }, // Last 3 are unknown to openh264: { 4, 3 }, { 3, 2 }, { 2, 1 }, - }; - static const ESampleAspectRatio asp_idc[] = { - ASP_UNSPECIFIED, - ASP_1x1, ASP_12x11, ASP_10x11, ASP_16x11, - ASP_40x33, ASP_24x11, ASP_20x11, ASP_32x11, - ASP_80x33, ASP_18x11, ASP_15x11, ASP_64x33, - ASP_160x99, - }; - int num, den, i; - - av_reduce(&num, &den, avctx->sample_aspect_ratio.num, - avctx->sample_aspect_ratio.den, 65535); - - for (i = 1; i < FF_ARRAY_ELEMS(sar_idc); i++) { - if (num == sar_idc[i].num && - den == sar_idc[i].den) - break; - } - if (i == FF_ARRAY_ELEMS(sar_idc)) { - param.sSpatialLayers[0].eAspectRatio = ASP_EXT_SAR; - param.sSpatialLayers[0].sAspectRatioExtWidth = num; - param.sSpatialLayers[0].sAspectRatioExtHeight = den; - } else { - param.sSpatialLayers[0].eAspectRatio = asp_idc[i]; - } - param.sSpatialLayers[0].bAspectRatioPresent = true; - } else { - param.sSpatialLayers[0].bAspectRatioPresent = false; - } -#endif + return 0; +} + +static av_cold int svc_encode_init_slice(AVCodecContext *avctx, SEncParamExt *param, int iLayer) +{ + SVCContext *s = avctx->priv_data; if ((avctx->slices > 1) && (s->max_nal_size)) { av_log(avctx, AV_LOG_ERROR, @@ -240,22 +171,22 @@ FF_ENABLE_DEPRECATION_WARNINGS s->slice_mode = SM_SIZELIMITED_SLICE; #if OPENH264_VER_AT_LEAST(1, 6) - param.sSpatialLayers[0].sSliceArgument.uiSliceMode = s->slice_mode; - param.sSpatialLayers[0].sSliceArgument.uiSliceNum = avctx->slices; + param->sSpatialLayers[iLayer].sSliceArgument.uiSliceMode = s->slice_mode; + param->sSpatialLayers[iLayer].sSliceArgument.uiSliceNum = avctx->slices; #else - param.sSpatialLayers[0].sSliceCfg.uiSliceMode = s->slice_mode; - param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = avctx->slices; + param->sSpatialLayers[iLayer].sSliceCfg.uiSliceMode = s->slice_mode; + param->sSpatialLayers[iLayer].sSliceCfg.sSliceArgument.uiSliceNum = avctx->slices; #endif if (avctx->slices == 0 && s->slice_mode == SM_FIXEDSLCNUM_SLICE) av_log(avctx, AV_LOG_WARNING, "Slice count will be set automatically\n"); if (s->slice_mode == SM_SIZELIMITED_SLICE) { if (s->max_nal_size) { - param.uiMaxNalSize = s->max_nal_size; + param->uiMaxNalSize = s->max_nal_size; #if OPENH264_VER_AT_LEAST(1, 6) - param.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint = s->max_nal_size; + param->sSpatialLayers[iLayer].sSliceArgument.uiSliceSizeConstraint = s->max_nal_size; #else - param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = s->max_nal_size; + param->sSpatialLayers[iLayer].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = s->max_nal_size; #endif } else { av_log(avctx, AV_LOG_ERROR, "Invalid -max_nal_size, " @@ -264,6 +195,140 @@ FF_ENABLE_DEPRECATION_WARNINGS } } + return 0; +} + +static av_cold int svc_encode_init_spatial_layer(AVCodecContext *avctx, SEncParamExt *param) +{ + int iLayer, err; + + // Default iSpatialLayerNum = 1, should be extended to support MAX_SPATIAL_LAYER_NUM = 4 + for (iLayer = 0; iLayer < param->iSpatialLayerNum; iLayer++) { + param->sSpatialLayers[iLayer].iVideoWidth = param->iPicWidth; + param->sSpatialLayers[iLayer].iVideoHeight = param->iPicHeight; + param->sSpatialLayers[iLayer].fFrameRate = param->fMaxFrameRate; + param->sSpatialLayers[iLayer].iSpatialBitrate = param->iTargetBitrate; + param->sSpatialLayers[iLayer].iMaxSpatialBitrate = param->iMaxBitrate; + + if (err = svc_encode_init_slice(avctx, param, iLayer) < 0) + return err; + +#if OPENH264_VER_AT_LEAST(1, 7) + if (avctx->sample_aspect_ratio.num && avctx->sample_aspect_ratio.den) { + // Table E-1. + static const AVRational sar_idc[] = { + { 0, 0 }, // Unspecified (never written here). + { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 }, + { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 }, + { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 }, + { 160, 99 }, // Last 3 are unknown to openh264: { 4, 3 }, { 3, 2 }, { 2, 1 }, + }; + static const ESampleAspectRatio asp_idc[] = { + ASP_UNSPECIFIED, + ASP_1x1, ASP_12x11, ASP_10x11, ASP_16x11, + ASP_40x33, ASP_24x11, ASP_20x11, ASP_32x11, + ASP_80x33, ASP_18x11, ASP_15x11, ASP_64x33, + ASP_160x99, + }; + int num, den, i; + + av_reduce(&num, &den, avctx->sample_aspect_ratio.num, + avctx->sample_aspect_ratio.den, 65535); + + for (i = 1; i < FF_ARRAY_ELEMS(sar_idc); i++) { + if (num == sar_idc[i].num && + den == sar_idc[i].den) + break; + } + if (i == FF_ARRAY_ELEMS(sar_idc)) { + param->sSpatialLayers[iLayer].eAspectRatio = ASP_EXT_SAR; + param->sSpatialLayers[iLayer].sAspectRatioExtWidth = num; + param->sSpatialLayers[iLayer].sAspectRatioExtHeight = den; + } else { + param->sSpatialLayers[iLayer].eAspectRatio = asp_idc[i]; + } + param->sSpatialLayers[iLayer].bAspectRatioPresent = true; + } else { + param->sSpatialLayers[iLayer].bAspectRatioPresent = false; + } +#endif + } + + return 0; +} + +static av_cold int svc_encode_init_params(AVCodecContext *avctx, SEncParamExt *param) +{ + SVCContext *s = avctx->priv_data; + int err; + + // The default parameters would be got by FillDefault() in codec/encoder/core/inc/param_svc.h + param->iPicWidth = avctx->width; + param->iPicHeight = avctx->height; + param->uiIntraPeriod = avctx->gop_size; + param->fMaxFrameRate = 1/av_q2d(avctx->time_base); + param->iMultipleThreadIdc = avctx->thread_count; + param->iLoopFilterDisableIdc = !s->loopfilter; + // Nal unit control +#if OPENH264_VER_AT_LEAST(1, 4) + param->eSpsPpsIdStrategy = CONSTANT_ID; +#else + param->bEnableSpsPpsIdAddition = 0; +#endif + param->bPrefixNalAddingCtrl = 0; + + if (err = svc_encode_init_profile(avctx, param) < 0) + return err; + + if (err = svc_encode_init_rate_control(avctx, param) < 0) + return err; + + if (err = svc_encode_init_spatial_layer(avctx, param) < 0) + return err; + + return 0; +} + +static av_cold int svc_encode_init(AVCodecContext *avctx) +{ + SVCContext *s = avctx->priv_data; + SEncParamExt param = { 0 }; + int err; + int log_level; + WelsTraceCallback callback_function; + AVCPBProperties *props; + + if ((err = ff_libopenh264_check_version(avctx)) < 0) + return err; + + if (WelsCreateSVCEncoder(&s->encoder)) { + av_log(avctx, AV_LOG_ERROR, "Unable to create encoder\n"); + return AVERROR_UNKNOWN; + } + + // Pass all libopenh264 messages to our callback, to allow ourselves to filter them. + log_level = WELS_LOG_DETAIL; + (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_LEVEL, &log_level); + + // Set the logging callback function to one that uses av_log() (see implementation above). + callback_function = (WelsTraceCallback) ff_libopenh264_trace_callback; + (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_CALLBACK, &callback_function); + + // Set the AVCodecContext as the libopenh264 callback context so that it can be passed to av_log(). + (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_CALLBACK_CONTEXT, &avctx); + + (*s->encoder)->GetDefaultParams(s->encoder, ¶m); + +#if FF_API_CODER_TYPE +FF_DISABLE_DEPRECATION_WARNINGS + if (!s->cabac) + s->cabac = avctx->coder_type == FF_CODER_TYPE_AC; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + + if (err = svc_encode_init_params(avctx, ¶m) < 0) + return err; + if ((*s->encoder)->InitializeExt(s->encoder, ¶m) != cmResultSuccess) { av_log(avctx, AV_LOG_ERROR, "Initialize failed\n"); return AVERROR_UNKNOWN; From patchwork Sat Apr 11 10:03:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18848 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3C37D4491E3 for ; Sat, 11 Apr 2020 13:11:34 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 271BB68B683; Sat, 11 Apr 2020 13:11:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 79F9D68B5AD for ; Sat, 11 Apr 2020 13:11:31 +0300 (EEST) IronPort-SDR: 8FU4Xu26fkTfokhGSF6gCKGQ96vbm8mPXDpNccvYLiy6iuiBd83uH+o3g2Y4njAC6fQ6CM6Dgn fLTVBHAm3xjw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:30 -0700 IronPort-SDR: pUFsGCIntWemCnRKwmdaTROzAak3Yd9rKt4OMh2kZ6lqlVfkCx9otXjZadwN9uBSXFc/aAxBJm vqhjtrlMg8XA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397104" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:29 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:37 +0800 Message-Id: <1586599419-21122-8-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 7/9] lavc/libopenh264enc: add profile high option support 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Add support for PRO_HIGH/PRO_BASELINE in SVC Encoding extention mode, which determined by iEntropyCodingModeFlag in ParamTranscode(). Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index c85ae0e..3a205b7 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -48,7 +48,7 @@ typedef struct SVCContext { int slice_mode; // deprecated #endif int loopfilter; - char *profile; + int profile; int max_nal_size; int skip_frames; int skipped; @@ -79,7 +79,11 @@ static const AVOption options[] = { #endif #endif { "loopfilter", "enable loop filter", OFFSET(loopfilter), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE }, - { "profile", "set profile restrictions", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VE }, + { "profile", "Set profile restrictions", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = FF_PROFILE_UNKNOWN }, FF_PROFILE_UNKNOWN, 0xffff, VE, "profile" }, +#define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, { .i64 = value }, 0, 0, VE, "profile" + { PROFILE("constrained_baseline", FF_PROFILE_H264_CONSTRAINED_BASELINE) }, + { PROFILE("high", FF_PROFILE_H264_HIGH) }, +#undef PROFILE { "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, { "allow_skip_frames", "allow skipping frames to hit the target bitrate", OFFSET(skip_frames), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { "cabac", "Enable cabac", OFFSET(cabac), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, @@ -115,12 +119,28 @@ static av_cold int svc_encode_init_profile(AVCodecContext *avctx, SEncParamExt * { SVCContext *s = avctx->priv_data; - if (s->profile && !strcmp(s->profile, "main")) - param->iEntropyCodingModeFlag = 1; //< 0:CAVLC 1:CABAC - else if (!s->profile && s->cabac) + if (s->profile == FF_PROFILE_UNKNOWN) + s->profile = s->cabac ? FF_PROFILE_H264_HIGH : + FF_PROFILE_H264_CONSTRAINED_BASELINE; + + switch (s->profile) { + case FF_PROFILE_H264_HIGH: param->iEntropyCodingModeFlag = 1; - else + av_log(avctx, AV_LOG_VERBOSE, "Using CABAC, " + "select EProfileIdc PRO_HIGH in libopenh264.\n"); + break; + case FF_PROFILE_H264_CONSTRAINED_BASELINE: + case FF_PROFILE_UNKNOWN: + param->iEntropyCodingModeFlag = 0; + av_log(avctx, AV_LOG_VERBOSE, "Using CAVLC, " + "select EProfileIdc PRO_BASELINE in libopenh264.\n"); + break; + default: param->iEntropyCodingModeFlag = 0; + av_log(avctx, AV_LOG_WARNING, "Unsupported profile, " + "select EProfileIdc PRO_BASELINE in libopenh264.\n"); + break; + } return 0; } From patchwork Sat Apr 11 10:03:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18849 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id D81544491E3 for ; Sat, 11 Apr 2020 13:11:34 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C766F68B666; Sat, 11 Apr 2020 13:11:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 62AA968B663 for ; Sat, 11 Apr 2020 13:11:32 +0300 (EEST) IronPort-SDR: Gipstozubk9VehZ0tNG7SEkcm/U6lUHSliKV0W6IG45hNJA0blRKuKepZK/Mw/kmS5AxDWCkXG N+l19hWoCBtw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:31 -0700 IronPort-SDR: WBd4QsIixzENQ6WTcqMBL+ofnjVW0x6Yu3O7krOfnNUyIP+wLRVr9N0AxveOQ+e/Gr4io15H1U cVl9OgyEizZA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397120" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:30 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:38 +0800 Message-Id: <1586599419-21122-9-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 8/9] lavc/libopenh264enc: allow specifying the profile through AVCodecContext 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 3a205b7..df2d6ee 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -119,6 +119,22 @@ static av_cold int svc_encode_init_profile(AVCodecContext *avctx, SEncParamExt * { SVCContext *s = avctx->priv_data; + /* Allow specifying the libopenh264 profile through AVCodecContext. */ + if (FF_PROFILE_UNKNOWN == s->profile && + FF_PROFILE_UNKNOWN != avctx->profile) + switch (avctx->profile) { + case FF_PROFILE_H264_CONSTRAINED_BASELINE: + s->profile = FF_PROFILE_H264_CONSTRAINED_BASELINE; + break; + case FF_PROFILE_H264_HIGH: + s->profile = FF_PROFILE_H264_HIGH; + break; + default: + av_log(avctx, AV_LOG_WARNING, + "Unsupported avctx->profile: %d.\n", avctx->profile); + break; + } + if (s->profile == FF_PROFILE_UNKNOWN) s->profile = s->cabac ? FF_PROFILE_H264_HIGH : FF_PROFILE_H264_CONSTRAINED_BASELINE; From patchwork Sat Apr 11 10:03:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18852 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 017594491E3 for ; Sat, 11 Apr 2020 13:11:39 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E279068B6BC; Sat, 11 Apr 2020 13:11:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1EE868B61A for ; Sat, 11 Apr 2020 13:11:34 +0300 (EEST) IronPort-SDR: IK4pZqR3LhGhedHGXU3H8mUNZWpsOjhl3Tj3gU1Gsgd5G3dm8tsHt+YCQLDx5VZuTqErRACN0x UrC7vzOmWIHw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2020 03:11:33 -0700 IronPort-SDR: Ky4lxN1RVs0SIm0wXT1h2VMDLRu1jl1b4eUtMrK+0gSCCSOPc0xxDcfwB2P/Nv1ZsU6oNx/twH igV6bK821dMQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,370,1580803200"; d="scan'208";a="331397126" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by orsmga001.jf.intel.com with ESMTP; 11 Apr 2020 03:11:32 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Apr 2020 18:03:39 +0800 Message-Id: <1586599419-21122-10-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> References: <1586599419-21122-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH v3 9/9] lavc/libopenh264enc: Add coder option to replace cabac 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: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Set DEPRECATED flag to option cabac, replace with coder. Change the default option to -1 and allow the default cabac to be determined by profile. Add OPENH264_API_CABAC macro for cabac to remove this option after LIBAVCODEC_VERSION_MAJOR = 59. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index df2d6ee..722d610 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -36,6 +36,9 @@ #ifndef OPENH264_API_SLICE_MODE #define OPENH264_API_SLICE_MODE (LIBAVCODEC_VERSION_MAJOR < 59) #endif +#ifndef OPENH264_API_CABAC +#define OPENH264_API_CABAC (LIBAVCODEC_VERSION_MAJOR < 59) +#endif #if !OPENH264_VER_AT_LEAST(1, 6) #define SM_SIZELIMITED_SLICE SM_DYN_SLICE @@ -52,7 +55,10 @@ typedef struct SVCContext { int max_nal_size; int skip_frames; int skipped; - int cabac; +#if OPENH264_API_CABAC + int cabac; // deprecated +#endif + int coder; // rate control mode int rc_mode; @@ -86,7 +92,15 @@ static const AVOption options[] = { #undef PROFILE { "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, { "allow_skip_frames", "allow skipping frames to hit the target bitrate", OFFSET(skip_frames), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, - { "cabac", "Enable cabac", OFFSET(cabac), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, +#if OPENH264_API_CABAC + { "cabac", "Enable cabac(deprecated, use coder)", OFFSET(cabac), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE|DEPRECATED }, +#endif + { "coder", "Coder type", OFFSET(coder), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE, "coder" }, + { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, INT_MIN, INT_MAX, VE, "coder" }, + { "cavlc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "coder" }, + { "cabac", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, VE, "coder" }, + { "vlc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "coder" }, + { "ac", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, VE, "coder" }, { "rc_mode", "Select rate control mode", OFFSET(rc_mode), AV_OPT_TYPE_INT, { .i64 = RC_QUALITY_MODE }, RC_OFF_MODE, RC_TIMESTAMP_MODE, VE, "rc_mode" }, { "off", "bit rate control off", 0, AV_OPT_TYPE_CONST, { .i64 = RC_OFF_MODE }, 0, 0, VE, "rc_mode" }, @@ -135,8 +149,17 @@ static av_cold int svc_encode_init_profile(AVCodecContext *avctx, SEncParamExt * break; } - if (s->profile == FF_PROFILE_UNKNOWN) - s->profile = s->cabac ? FF_PROFILE_H264_HIGH : +#if FF_API_CODER_TYPE && OPENH264_API_CABAC +FF_DISABLE_DEPRECATION_WARNINGS + if (s->coder < 0 && avctx->coder_type == FF_CODER_TYPE_AC) + s->coder = 1; + else + s->coder = s->cabac; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + + if (s->profile == FF_PROFILE_UNKNOWN && s->coder >= 0) + s->profile = s->coder ? FF_PROFILE_H264_HIGH : FF_PROFILE_H264_CONSTRAINED_BASELINE; switch (s->profile) { @@ -355,13 +378,6 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) (*s->encoder)->GetDefaultParams(s->encoder, ¶m); -#if FF_API_CODER_TYPE -FF_DISABLE_DEPRECATION_WARNINGS - if (!s->cabac) - s->cabac = avctx->coder_type == FF_CODER_TYPE_AC; -FF_ENABLE_DEPRECATION_WARNINGS -#endif - if (err = svc_encode_init_params(avctx, ¶m) < 0) return err;