diff options
author | Steven Liu <lq@chinaffmpeg.org> | 2017-03-14 22:53:43 +0800 |
---|---|---|
committer | Rick Kern <kernrj@gmail.com> | 2017-03-15 09:37:25 -0400 |
commit | 0052f3f527c4558d32b4f710063acb096493d99c (patch) | |
tree | abf2bec7eed4edf561c9405957bfff1fde47f1f0 /libavcodec/videotoolboxenc.c | |
parent | a283665693e1c9804b2736545dba77d0ee342f9e (diff) | |
download | ffmpeg-streaming-0052f3f527c4558d32b4f710063acb096493d99c.zip ffmpeg-streaming-0052f3f527c4558d32b4f710063acb096493d99c.tar.gz |
avcodec/videotoolboxenc: add rc_max_bitrate control into videotoolbox
add kVTCompressionPropertyKey_DataRateLimits support by rc_max_bitrate
Reviewed-by: Rick Kern <kernrj@gmail.com>
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
Diffstat (limited to 'libavcodec/videotoolboxenc.c')
-rw-r--r-- | libavcodec/videotoolboxenc.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index 005f5d6..4b8718c 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, |