mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
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>
This commit is contained in:
parent
a283665693
commit
0052f3f527
@ -898,7 +898,14 @@ static int vtenc_create_encoder(AVCodecContext *avctx,
|
|||||||
{
|
{
|
||||||
VTEncContext *vtctx = avctx->priv_data;
|
VTEncContext *vtctx = avctx->priv_data;
|
||||||
SInt32 bit_rate = avctx->bit_rate;
|
SInt32 bit_rate = avctx->bit_rate;
|
||||||
|
SInt32 max_rate = avctx->rc_max_rate;
|
||||||
CFNumberRef bit_rate_num;
|
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,
|
int status = VTCompressionSessionCreate(kCFAllocatorDefault,
|
||||||
avctx->width,
|
avctx->width,
|
||||||
@ -938,6 +945,46 @@ static int vtenc_create_encoder(AVCodecContext *avctx,
|
|||||||
return AVERROR_EXTERNAL;
|
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) {
|
if (profile_level) {
|
||||||
status = VTSessionSetProperty(vtctx->session,
|
status = VTSessionSetProperty(vtctx->session,
|
||||||
kVTCompressionPropertyKey_ProfileLevel,
|
kVTCompressionPropertyKey_ProfileLevel,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user