From patchwork Tue Mar 14 14:53:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 2924 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.50.79 with SMTP id y76csp1636434vsy; Tue, 14 Mar 2017 07:54:48 -0700 (PDT) X-Received: by 10.28.144.14 with SMTP id s14mr195386wmd.22.1489503288720; Tue, 14 Mar 2017 07:54:48 -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 m4si5377571wrm.249.2017.03.14.07.54.48; Tue, 14 Mar 2017 07:54:48 -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 0BB7068829C; Tue, 14 Mar 2017 16:54:28 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpbg179.qq.com (SMTPBG179.QQ.COM [119.147.194.222]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6746B680A0A for ; Tue, 14 Mar 2017 16:54:20 +0200 (EET) X-QQ-mid: bizesmtp15t1489503225tjfnobrr Received: from localhost (unknown [47.90.47.25]) by esmtp4.qq.com (ESMTP) with id ; Tue, 14 Mar 2017 22:53:45 +0800 (CST) X-QQ-SSF: 01100000002000F0F930B00A0000000 X-QQ-FEAT: oIoGrveFQB+CdqBocKOy8I6HB3E98REI8il02L5ft8bYH1IjFTy3H4JAI9WR/ eY0lZSPz4mK2gfVikZm94+WbpUSN76CXHDfrG4Hd89AyvzcjS1kinAY6+KuwiVDTEV1iFgx eAR/LKXG2zYZG5YJxJ0/xXKLCVVNt0tY49URtiGwvF4Uc5E20nOvCt1+Uf/H1Jn710tSY8t 8EdqaXxgsGniU/yOqfg9thXntAz+MudmTTwRcIdJkqOJ1CvFGCVV6LsGsGnYGeLD4zRgkGI JF1/T3+e7r8tPT X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Tue, 14 Mar 2017 22:53:43 +0800 Message-Id: <20170314145343.15362-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 v2] 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 Reviewed-by: Rick Kern Signed-off-by: Steven Liu --- libavcodec/videotoolboxenc.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index 005f5d6..0cba2c8 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -898,7 +898,14 @@ 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; + CFNumberRef bytes_per_second; + CFNumberRef one_second; + CFArrayRef data_rate_limits; + int64_t bytes_per_second_value = 0; + int64_t one_second_value = 0; + void *nums[2]; int status = VTCompressionSessionCreate(kCFAllocatorDefault, avctx->width, @@ -938,6 +945,46 @@ static int vtenc_create_encoder(AVCodecContext *avctx, return AVERROR_EXTERNAL; } + bytes_per_second_value = max_rate >> 3; + bytes_per_second = CFNumberCreate(kCFAllocatorDefault, + kCFNumberSInt64Type, + &bytes_per_second_value); + if (!bytes_per_second) { + return AVERROR(ENOMEM); + } + one_second_value = 1; + one_second = CFNumberCreate(kCFAllocatorDefault, + kCFNumberSInt64Type, + &one_second_value); + if (!one_second) { + CFRelease(bytes_per_second); + return AVERROR(ENOMEM); + } + nums[0] = bytes_per_second; + nums[1] = one_second; + data_rate_limits = CFArrayCreate(kCFAllocatorDefault, + nums, + 2, + &kCFTypeArrayCallBacks); + + if (!data_rate_limits) { + CFRelease(bytes_per_second); + CFRelease(one_second); + return AVERROR(ENOMEM); + } + status = VTSessionSetProperty(vtctx->session, + kVTCompressionPropertyKey_DataRateLimits, + data_rate_limits); + + CFRelease(bytes_per_second); + CFRelease(one_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,