From 0d4bf3074d33f74ad81eed6d12db960e1cf649ab Mon Sep 17 00:00:00 2001 From: Rick Kern Date: Wed, 27 Apr 2016 10:53:05 -0400 Subject: [PATCH] lavc/videotoolboxenc: Handle hwaccel format as input Handle AV_PIX_FMT_VIDEOTOOLBOX. This results in better energy usage and faster encoding, especially on iOS. When the buffer comes from the media server, no memcpy's are needed. Signed-off-by: Rick Kern --- libavcodec/videotoolboxenc.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index ea8ff7027e..381bc1201b 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -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 -- 2.11.0