Browse Source

avcodec/videotoolboxenc: split initialization

Split vtenc_init() into vtenc_init() (VTEncContext initialization) and
vtenc_configure_encoder() (creates the vt session).

This commit will allow to restart the vt session while encoding.

Signed-off-by: Aman Gupta <aman@tmm1.net>
(cherry picked from commit 9e11d27c25)
tags/n4.0.2
Thomas Guillem Aman Gupta 7 years ago
parent
commit
a56eb4d56c
1 changed files with 28 additions and 20 deletions
  1. +28
    -20
      libavcodec/videotoolboxenc.c

+ 28
- 20
libavcodec/videotoolboxenc.c View File

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


Loading…
Cancel
Save