[FFmpeg-devel] [PATCH v3 02/12] lavc/videotoolboxenc: Handle hwaccel format as input

Rick Kern kernrj at gmail.com
Wed Apr 27 16:53:05 CEST 2016


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 at gmail.com>
---
 libavcodec/videotoolboxenc.c | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
index ea8ff70..381bc12 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.7.4



More information about the ffmpeg-devel mailing list