From patchwork Mon Apr 6 11:14:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18699 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 BA4B3449D1E for ; Mon, 6 Apr 2020 14:22:11 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A405968B1E1; Mon, 6 Apr 2020 14:22:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3136468B21B for ; Mon, 6 Apr 2020 14:22:05 +0300 (EEST) IronPort-SDR: DFSgdbxsSh52NJ2GVjbO1cwwzSDQLFUDpvBBmmxIA5z14JOkeeey1Z2HenUfukTN7CzJBz4rMg Bqr9UEDNzqtA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:03 -0700 IronPort-SDR: 5zxNH8UQMSvKITLeP8jhUzlSinYVI0xIZ/OzjbW0s7SlOe7/2A+mXiXGCmPt+9XzoR+nNZAYcj SraiiDlD78jg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799835" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:02 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:44 +0800 Message-Id: <1586171693-7836-2-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 01/10] 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 ae6d17c..364926f 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; @@ -332,6 +335,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"), @@ -345,6 +354,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 Mon Apr 6 11:14:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18700 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 C40BA449D1E for ; Mon, 6 Apr 2020 14:22:13 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A65EB68B21B; Mon, 6 Apr 2020 14:22:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5687968AE58 for ; Mon, 6 Apr 2020 14:22:07 +0300 (EEST) IronPort-SDR: 8UByhwBXDnWgnUy9FxMYgehFh9XzdCJe78n9JjLk/atOb+KfIitnIvShafl+L4Ez1DZrfzMs0U wrM3QgBWqeHQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:05 -0700 IronPort-SDR: SJmP9b1AYnNdlJuhLBf88hcK7IYn/YR5L7xfy3JveGj1Ax4xuLLQiAhN1J0Ufl3zQ/zHBxJKNZ L8Rw7QDqBN2g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799844" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:04 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:45 +0800 Message-Id: <1586171693-7836-3-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 02/10] lavc/libopenh264enc: fix the if-else coding style 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 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 364926f..c7ae5b1 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -202,8 +202,7 @@ FF_ENABLE_DEPRECATION_WARNINGS param.sSpatialLayers[0].eAspectRatio = asp_idc[i]; } param.sSpatialLayers[0].bAspectRatioPresent = true; - } - else { + } else { param.sSpatialLayers[0].bAspectRatioPresent = false; } #endif @@ -230,7 +229,7 @@ FF_ENABLE_DEPRECATION_WARNINGS #endif if (s->slice_mode == SM_SIZELIMITED_SLICE) { - if (s->max_nal_size){ + if (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; From patchwork Mon Apr 6 11:14:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18701 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 C8B0C449D1E for ; Mon, 6 Apr 2020 14:22:15 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B21B468B2DB; Mon, 6 Apr 2020 14:22:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 68A1168B2FB for ; Mon, 6 Apr 2020 14:22:09 +0300 (EEST) IronPort-SDR: zakenL9jCAgg2dvdV7liH67OO4W0kMhWV02z+dJ6GquXhhAJy9WTCOCh0I4I0D+kopXC2yhO1Q B5Qw1JV8t5ZA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:07 -0700 IronPort-SDR: jx1IDy0m3y4QiTqpkKMrMEhv/Vwe7Gm+DYZZHU0m+i0YRoD7qxYEUKIO9G3A97h+VGSk0aslqu soSQ4zzigp3Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799855" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:07 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:46 +0800 Message-Id: <1586171693-7836-4-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 03/10] 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" 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 c7ae5b1..3ff5be7 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -335,6 +335,8 @@ static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, } static const AVCodecDefault svc_enc_defaults[] = { + { "b", "2M" }, + { "g", "120" }, { "qmin", "-1" }, { "qmax", "-1" }, { NULL }, From patchwork Mon Apr 6 11:14:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18702 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 DA1DB449D1E for ; Mon, 6 Apr 2020 14:22:17 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C51C768B303; Mon, 6 Apr 2020 14:22:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 360F068B30A for ; Mon, 6 Apr 2020 14:22:10 +0300 (EEST) IronPort-SDR: OmM46DdVFCHVFW5q0bbUzPw7krfMgzIFyOtws6qT4GXqXo6y7dXmTXZJO2/jazWmVIuetydAUs kJ7BxfOhRC5g== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:09 -0700 IronPort-SDR: R2lKT0zXkwZo4XEZgiRg0UM5GlfwvzXs3idhzQpwbjmgHfO3/ekM/OM09Hyp9o3TYY1yWTtAP+ uCL6t0KottyQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799862" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:08 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:47 +0800 Message-Id: <1586171693-7836-5-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 04/10] 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 3ff5be7..dab8244 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; 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 Mon Apr 6 11:14:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18703 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 B6E40449D1E for ; Mon, 6 Apr 2020 14:22:20 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A1BA768B31C; Mon, 6 Apr 2020 14:22:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3AC0568B31C for ; Mon, 6 Apr 2020 14:22:13 +0300 (EEST) IronPort-SDR: gRKSWvVrZTk4c90kshFx8jO5pKCNbiGg+mZDBLj1Jxea8vTdK5boM+BUS3tg35CFj/++otl0MB I+YXN+SMq4Tg== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:11 -0700 IronPort-SDR: i8TrP/LPbWbVYXMTdAnX7Lx4cE0BBZeWPxhyCHKZBjcRQhaZyJpTuKU8Be66fOCAn2XUqzhBhX QRLS5rPWE79g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799872" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:10 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:48 +0800 Message-Id: <1586171693-7836-6-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 05/10] lavc/libopenh264enc: prompt slice number changing according to cpus 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 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index dab8244..01a85fb 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -237,6 +237,9 @@ 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, "Auto slice number, " + "default to use the number of CPU cores: %d\n", av_cpu_count()); if (s->slice_mode == SM_SIZELIMITED_SLICE) { if (s->max_nal_size) { From patchwork Mon Apr 6 11:14:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18706 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 66D84449D1E for ; Mon, 6 Apr 2020 14:22:24 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 580CC68B3E7; Mon, 6 Apr 2020 14:22:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4F90C68B311 for ; Mon, 6 Apr 2020 14:22:15 +0300 (EEST) IronPort-SDR: xPeHADuMP4KopZLgYJ+YH3CKjnfV1g4Xr1FFKw0ER/U9URcFvBxRn1tSRss3L6RFTdQccLN90H 1X3vQC5ztbmQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:12 -0700 IronPort-SDR: Bq4MOWBf42UI8WL9M9qaawiFBqj042EDSX22RP7sMnXUCZieZc3gCSZxEcOfcz8ZdZUMQ9sqJB 6vQtgq6cbKbg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799891" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:12 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:49 +0800 Message-Id: <1586171693-7836-7-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 06/10] 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. This could be removed later. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 01a85fb..e89cedf 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -40,7 +40,7 @@ typedef struct SVCContext { const AVClass *av_class; ISVCEncoder *encoder; - int slice_mode; + int slice_mode; // deprecated int loopfilter; char *profile; int max_nal_size; @@ -54,11 +54,12 @@ 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_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) From patchwork Mon Apr 6 11:14:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18708 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 5A95A449D1E for ; Mon, 6 Apr 2020 14:22:27 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 40D6468B3F8; Mon, 6 Apr 2020 14:22:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2673768B2FB for ; Mon, 6 Apr 2020 14:22:16 +0300 (EEST) IronPort-SDR: IIKrllJvmrvXZoBgK1ecJczirDlS7A3soJzxk+xB2Wo29ZUG4RM6bP8zwMgNfu/uk20T5ISwhs 5HWcLHnSXRgg== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:14 -0700 IronPort-SDR: CsAd5qKb1czSrD63Nhh9K6kevQjyZKkcTnFiYbd6TfYn+q3e2pdo4AaK7qiVq0cmqAS6AjTRYN 5m6ppjavJKng== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799899" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:13 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:50 +0800 Message-Id: <1586171693-7836-8-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 07/10] 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 e89cedf..f02c5fd 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -103,120 +103,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; + 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; - 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, @@ -232,11 +163,11 @@ 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, "Auto slice number, " @@ -244,11 +175,11 @@ FF_ENABLE_DEPRECATION_WARNINGS 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, " @@ -257,6 +188,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 Mon Apr 6 11:14:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18704 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 80E21449D1E for ; Mon, 6 Apr 2020 14:22:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6CB9568B3A2; Mon, 6 Apr 2020 14:22:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 236A068B31C for ; Mon, 6 Apr 2020 14:22:18 +0300 (EEST) IronPort-SDR: zWbXT2smwY8WqX5VtQF2Z+wyz7m56rQkaX9LyYwP378MHzj1TBGZ37qggbCYk/JJRUUVq/yE67 PXByONxqmj1A== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:16 -0700 IronPort-SDR: 8kC8dQyO+yBMX83oKOdmwTxMAfyNKLmub4ZSH6oIpZmDlbGq2aDhAOgN8fHMTd9QoTOG8ypWaM abGqbG2hGaHA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799912" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:15 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:51 +0800 Message-Id: <1586171693-7836-9-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 08/10] 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 f02c5fd..d331cfd 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -42,7 +42,7 @@ typedef struct SVCContext { ISVCEncoder *encoder; int slice_mode; // deprecated int loopfilter; - char *profile; + int profile; int max_nal_size; int skip_frames; int skipped; @@ -71,7 +71,11 @@ static const AVOption options[] = { { "dyn", "Dynamic slicing", 0, AV_OPT_TYPE_CONST, { .i64 = SM_DYN_SLICE }, 0, 0, VE, "slice_mode" }, #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 }, @@ -107,12 +111,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 Mon Apr 6 11:14:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18705 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 A5478449D1E for ; Mon, 6 Apr 2020 14:22:23 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 901FA68B3D0; Mon, 6 Apr 2020 14:22:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0D2A468B2AB for ; Mon, 6 Apr 2020 14:22:19 +0300 (EEST) IronPort-SDR: llGABt/6seVousLMfRH4AFFL+izp/AgysyxDrjFG6m5BsihPvAg7ciAj8uxFTLUdCMRtvTwbv8 3RbkIOlSuwBQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:18 -0700 IronPort-SDR: +0mH17P4gBXL0OqHnI9gV8Aaph5ohVFmu+CHZUuwmS0zRkcRQsQYUlNCfS8mzZP9/DPyJTThlW 4FKqZl45BSVQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799917" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:17 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:52 +0800 Message-Id: <1586171693-7836-10-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 09/10] 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 d331cfd..70ded55 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -111,6 +111,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 Mon Apr 6 11:14:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 18707 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 40283449D1E for ; Mon, 6 Apr 2020 14:22:25 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 24A4B68B366; Mon, 6 Apr 2020 14:22:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E264068B38E for ; Mon, 6 Apr 2020 14:22:20 +0300 (EEST) IronPort-SDR: dXdbyWJKyYEKW+hoaHSPlUscuhIQjgGPQPrtY06Ya6s08zAVy/vMyKUIr9ZkDjPNHRVUfRxU7H oALysjH4845Q== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2020 04:22:20 -0700 IronPort-SDR: FWRaV4XfOSgc6ktU2/b99ZnFFzUbQktIy+707e3mnQbAok10E+U7zv9WerjRNZj72EiOu4xEBJ a4VMKbyuunEQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,350,1580803200"; d="scan'208";a="450799921" Received: from icl-dev.sh.intel.com ([10.239.158.73]) by fmsmga005.fm.intel.com with ESMTP; 06 Apr 2020 04:22:19 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 19:14:53 +0800 Message-Id: <1586171693-7836-11-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> References: <1586171693-7836-1-git-send-email-linjie.fu@intel.com> Subject: [FFmpeg-devel] [PATCH 10/10] lavc/libopenh264enc: replace cabac option with coder 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" Change the default option to -1 and allow the default cabac to be decided by profile. Signed-off-by: Linjie Fu --- libavcodec/libopenh264enc.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 70ded55..94faeef 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -46,7 +46,7 @@ typedef struct SVCContext { int max_nal_size; int skip_frames; int skipped; - int cabac; + int coder; // rate control mode int rc_mode; @@ -78,7 +78,12 @@ 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 }, + { "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" }, @@ -127,8 +132,15 @@ 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 +FF_DISABLE_DEPRECATION_WARNINGS + if (s->coder < 0 && avctx->coder_type == FF_CODER_TYPE_AC) + s->coder = 1; +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) { @@ -348,13 +360,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;