Skip to content

Commit

Permalink
lavc/videotoolboxenc: Handle hwaccel format as input
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
kernrj authored and wm4 committed May 4, 2016
1 parent d7cf361 commit 0d4bf30
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions libavcodec/videotoolboxenc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 0d4bf30

Please sign in to comment.