@ -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 ,