diff options
author | Rick Kern <kernrj@gmail.com> | 2016-04-27 10:53:05 -0400 |
---|---|---|
committer | wm4 <nfxjfg@googlemail.com> | 2016-05-04 18:40:40 +0200 |
commit | 0d4bf3074d33f74ad81eed6d12db960e1cf649ab (patch) | |
tree | 8f8a612373d21f41601e3e1a1c445f55d0f9625e | |
parent | d7cf3610c2fb938783817addadc5a65529759e01 (diff) | |
download | ffmpeg-0d4bf3074d33f74ad81eed6d12db960e1cf649ab.tar.gz |
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 <kernrj@gmail.com>
-rw-r--r-- | libavcodec/videotoolboxenc.c | 26 |
1 files 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 |