|
|
|
@@ -621,10 +621,14 @@ static av_cold int vtenc_init(AVCodecContext *avctx) |
|
|
|
CFDictionarySetValue(enc_info, kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, kCFBooleanTrue); |
|
|
|
#endif |
|
|
|
|
|
|
|
status = create_cv_pixel_buffer_info(avctx, &pixel_buffer_info); |
|
|
|
if (status) { |
|
|
|
CFRelease(enc_info); |
|
|
|
return status; |
|
|
|
if (avctx->pix_fmt != AV_PIX_FMT_VIDEOTOOLBOX) { |
|
|
|
status = create_cv_pixel_buffer_info(avctx, &pixel_buffer_info); |
|
|
|
if (status) { |
|
|
|
CFRelease(enc_info); |
|
|
|
return status; |
|
|
|
} |
|
|
|
} else { |
|
|
|
pixel_buffer_info = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
status = VTCompressionSessionCreate( |
|
|
|
@@ -659,7 +663,7 @@ static av_cold int vtenc_init(AVCodecContext *avctx) |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
CFRelease(pixel_buffer_info); |
|
|
|
if (pixel_buffer_info) CFRelease(pixel_buffer_info); |
|
|
|
CFRelease(enc_info); |
|
|
|
|
|
|
|
if (status || !vtctx->session) { |
|
|
|
@@ -1227,6 +1231,17 @@ static int create_cv_pixel_buffer(AVCodecContext *avctx, |
|
|
|
CVPixelBufferPoolRef pix_buf_pool; |
|
|
|
VTEncContext* vtctx = avctx->priv_data; |
|
|
|
|
|
|
|
|
|
|
|
if (avctx->pix_fmt == AV_PIX_FMT_VIDEOTOOLBOX) { |
|
|
|
av_assert0(frame->format == AV_PIX_FMT_VIDEOTOOLBOX); |
|
|
|
|
|
|
|
*cv_img = (CVPixelBufferRef)frame->data[3]; |
|
|
|
av_assert0(*cv_img); |
|
|
|
|
|
|
|
CFRetain(*cv_img); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
memset(widths, 0, sizeof(widths)); |
|
|
|
memset(heights, 0, sizeof(heights)); |
|
|
|
memset(strides, 0, sizeof(strides)); |
|
|
|
@@ -1423,6 +1438,7 @@ static av_cold int vtenc_close(AVCodecContext *avctx) |
|
|
|
} |
|
|
|
|
|
|
|
static const enum AVPixelFormat pix_fmts[] = { |
|
|
|
AV_PIX_FMT_VIDEOTOOLBOX, |
|
|
|
AV_PIX_FMT_NV12, |
|
|
|
AV_PIX_FMT_YUV420P, |
|
|
|
AV_PIX_FMT_NONE |
|
|
|
|