From patchwork Mon Mar 13 03:55:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 2913 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.50.79 with SMTP id y76csp1006140vsy; Sun, 12 Mar 2017 20:55:57 -0700 (PDT) X-Received: by 10.223.130.101 with SMTP id 92mr26734632wrb.192.1489377356994; Sun, 12 Mar 2017 20:55:56 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u10si9213814wma.76.2017.03.12.20.55.56; Sun, 12 Mar 2017 20:55:56 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 790B9689D68; Mon, 13 Mar 2017 05:55:38 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpbg352.qq.com (SMTPBG352.QQ.COM [183.57.50.167]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A2DF689D40 for ; Mon, 13 Mar 2017 05:55:30 +0200 (EET) X-QQ-mid: bizesmtp14t1489377305tvy1ki1w Received: from localhost (unknown [47.90.47.25]) by esmtp4.qq.com (ESMTP) with id ; Mon, 13 Mar 2017 11:55:05 +0800 (CST) X-QQ-SSF: 01100000000000F0F930 X-QQ-FEAT: 9NFkmNiL4hfj9oMiZJH070sBMb+gEkYU5mWiPoLMMAvgO0HEJKVLA19eKH/XB ZHGP8fhf4oQR2P2PPedrU5uCpC9Xfj43KnixROYA9TxRo07/ohK4DyfTtaFh19qXvNG6JeH 9i2c9G2IQ1YfuQip+kF3t+gh1hJn+HEQFNjBs6VpDmovVl3Tr9H9MWTk708Q5xDqhEmpCvu bqST2O6SC234wLJN9q64PSDujMG5EdwnNwKEXS1droC/OB1pD4UTsUD2+wNtxbvFJtNxgMM y6HA== X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Mar 2017 11:55:04 +0800 Message-Id: <20170313035504.15060-1-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.10.1.382.ga23ca1b.dirty X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [PATCH] avcodec/videotoolbox: add rc_max_bitrate control into videotoolbox 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: Steven Liu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" add kVTCompressionPropertyKey_DataRateLimits support by rc_max_bitrate Signed-off-by: Steven Liu --- libavcodec/videotoolboxenc.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index 005f5d6..9738152 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -898,6 +898,7 @@ static int vtenc_create_encoder(AVCodecContext *avctx, { VTEncContext *vtctx = avctx->priv_data; SInt32 bit_rate = avctx->bit_rate; + SInt32 max_rate = avctx->rc_max_rate; CFNumberRef bit_rate_num; int status = VTCompressionSessionCreate(kCFAllocatorDefault, @@ -938,6 +939,32 @@ static int vtenc_create_encoder(AVCodecContext *avctx, return AVERROR_EXTERNAL; } + int64_t bytes_per_second_value = max_rate >> 3; + CFNumberRef bytes_per_second = CFNumberCreate(kCFAllocatorDefault, + kCFNumberSInt64Type, + &bytes_per_second_value); + int64_t two_second_value = 2; + CFNumberRef two_second = CFNumberCreate(kCFAllocatorDefault, + kCFNumberSInt64Type, + &two_second_value); + const void* nums[2] = { bytes_per_second, two_second }; + CFArrayRef data_rate_limits = CFArrayCreate(kCFAllocatorDefault, + nums, + 2, + &kCFTypeArrayCallBacks); + + status = VTSessionSetProperty((VTCompressionSessionRef)(vtctx->session), + kVTCompressionPropertyKey_DataRateLimits, + data_rate_limits); + CFRelease(bytes_per_second); + CFRelease(two_second); + CFRelease(data_rate_limits); + + if (status) { + av_log(avctx, AV_LOG_ERROR, "Error setting max bitrate property: %d\n", status); + return AVERROR_EXTERNAL; + } + if (profile_level) { status = VTSessionSetProperty(vtctx->session, kVTCompressionPropertyKey_ProfileLevel,