aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Kern <kernrj@gmail.com>2016-04-27 10:53:05 -0400
committerwm4 <nfxjfg@googlemail.com>2016-05-04 18:40:40 +0200
commit0d4bf3074d33f74ad81eed6d12db960e1cf649ab (patch)
tree8f8a612373d21f41601e3e1a1c445f55d0f9625e
parentd7cf3610c2fb938783817addadc5a65529759e01 (diff)
downloadffmpeg-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.c26
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