@ -1262,19 +1262,16 @@ static int vtenc_create_encoder(AVCodecContext *avctx,
return 0 ;
}
static av_cold int vtenc_init ( AVCodecContext * avctx )
static int vtenc_configure_encoder ( AVCodecContext * avctx )
{
CFMutableDictionaryRef enc_info ;
CFMutableDictionaryRef pixel_buffer_info ;
CMVideoCodecType codec_type ;
VTEncContext * vtctx = avctx - > priv_data ;
CFStringRef profile_level ;
CFBooleanRef has_b_frames_cfbool ;
CFNumberRef gamma_level = NULL ;
int status ;
pthread_once ( & once_ctrl , loadVTEncSymbols ) ;
codec_type = get_cm_codec_type ( avctx - > codec_id ) ;
if ( ! codec_type ) {
av_log ( avctx , AV_LOG_ERROR , " Error: no mapping for AVCodecID %d \n " , avctx - > codec_id ) ;
@ -1304,8 +1301,6 @@ static av_cold int vtenc_init(AVCodecContext *avctx)
if ( ! get_vt_hevc_profile_level ( avctx , & profile_level ) ) return AVERROR ( EINVAL ) ;
}
vtctx - > session = NULL ;
enc_info = CFDictionaryCreateMutable (
kCFAllocatorDefault ,
20 ,
@ -1335,8 +1330,6 @@ static av_cold int vtenc_init(AVCodecContext *avctx)
pixel_buffer_info = NULL ;
}
pthread_mutex_init ( & vtctx - > lock , NULL ) ;
pthread_cond_init ( & vtctx - > cv_sample_sent , NULL ) ;
vtctx - > dts_delta = vtctx - > has_b_frames ? - 1 : 0 ;
get_cv_transfer_function ( avctx , & vtctx - > transfer_function , & gamma_level ) ;
@ -1363,8 +1356,32 @@ static av_cold int vtenc_init(AVCodecContext *avctx)
pixel_buffer_info ,
& vtctx - > session ) ;
if ( status < 0 )
goto init_cleanup ;
init_cleanup :
if ( gamma_level )
CFRelease ( gamma_level ) ;
if ( pixel_buffer_info )
CFRelease ( pixel_buffer_info ) ;
CFRelease ( enc_info ) ;
return status ;
}
static av_cold int vtenc_init ( AVCodecContext * avctx )
{
VTEncContext * vtctx = avctx - > priv_data ;
CFBooleanRef has_b_frames_cfbool ;
int status ;
pthread_once ( & once_ctrl , loadVTEncSymbols ) ;
pthread_mutex_init ( & vtctx - > lock , NULL ) ;
pthread_cond_init ( & vtctx - > cv_sample_sent , NULL ) ;
vtctx - > session = NULL ;
status = vtenc_configure_encoder ( avctx ) ;
if ( status ) return status ;
status = VTSessionCopyProperty ( vtctx - > session ,
kVTCompressionPropertyKey_AllowFrameReordering ,
@ -1378,16 +1395,7 @@ static av_cold int vtenc_init(AVCodecContext *avctx)
}
avctx - > has_b_frames = vtctx - > has_b_frames ;
init_cleanup :
if ( gamma_level )
CFRelease ( gamma_level ) ;
if ( pixel_buffer_info )
CFRelease ( pixel_buffer_info ) ;
CFRelease ( enc_info ) ;
return status ;
return 0 ;
}
static void vtenc_get_frame_info ( CMSampleBufferRef buffer , bool * is_key_frame )