From: Timo Rothenpieler Date: Wed, 7 Sep 2016 13:49:28 +0000 (+0200) Subject: avcodec/nvenc: use av_image_copy for copying frame data X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=96cba1c5524eb0cc1395aa7586e4c3b25092a7ec;p=ffmpeg avcodec/nvenc: use av_image_copy for copying frame data --- diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 283f29ff598..c53341dae40 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -1276,84 +1276,32 @@ static NvencSurface *get_free_frame(NvencContext *ctx) return NULL; } -static int nvenc_copy_frame(AVCodecContext *avctx, NvencSurface *inSurf, - NV_ENC_LOCK_INPUT_BUFFER *lockBufferParams, const AVFrame *frame) +static int nvenc_copy_frame(AVCodecContext *avctx, NvencSurface *nv_surface, + NV_ENC_LOCK_INPUT_BUFFER *lock_buffer_params, const AVFrame *frame) { - uint8_t *buf = lockBufferParams->bufferDataPtr; - int off = inSurf->height * lockBufferParams->pitch; - - if (frame->format == AV_PIX_FMT_YUV420P) { - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[0], frame->linesize[0], - avctx->width, avctx->height); - - buf += off; - - av_image_copy_plane(buf, lockBufferParams->pitch >> 1, - frame->data[2], frame->linesize[2], - avctx->width >> 1, avctx->height >> 1); - - buf += off >> 2; - - av_image_copy_plane(buf, lockBufferParams->pitch >> 1, - frame->data[1], frame->linesize[1], - avctx->width >> 1, avctx->height >> 1); - } else if (frame->format == AV_PIX_FMT_NV12) { - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[0], frame->linesize[0], - avctx->width, avctx->height); - - buf += off; - - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[1], frame->linesize[1], - avctx->width, avctx->height >> 1); - } else if (frame->format == AV_PIX_FMT_P010) { - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[0], frame->linesize[0], - avctx->width << 1, avctx->height); - - buf += off; - - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[1], frame->linesize[1], - avctx->width << 1, avctx->height >> 1); - } else if (frame->format == AV_PIX_FMT_YUV444P) { - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[0], frame->linesize[0], - avctx->width, avctx->height); - - buf += off; - - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[1], frame->linesize[1], - avctx->width, avctx->height); - - buf += off; - - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[2], frame->linesize[2], - avctx->width, avctx->height); - } else if (frame->format == AV_PIX_FMT_YUV444P16) { - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[0], frame->linesize[0], - avctx->width << 1, avctx->height); + int dst_linesize[4] = { + lock_buffer_params->pitch, + lock_buffer_params->pitch, + lock_buffer_params->pitch, + lock_buffer_params->pitch + }; + uint8_t *dst_data[4]; + int ret; - buf += off; + if (frame->format == AV_PIX_FMT_YUV420P) + dst_linesize[1] = dst_linesize[2] >>= 1; - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[1], frame->linesize[1], - avctx->width << 1, avctx->height); + ret = av_image_fill_pointers(dst_data, frame->format, nv_surface->height, + lock_buffer_params->bufferDataPtr, dst_linesize); + if (ret < 0) + return ret; - buf += off; + if (frame->format == AV_PIX_FMT_YUV420P) + FFSWAP(uint8_t*, dst_data[1], dst_data[2]); - av_image_copy_plane(buf, lockBufferParams->pitch, - frame->data[2], frame->linesize[2], - avctx->width << 1, avctx->height); - } else { - av_log(avctx, AV_LOG_FATAL, "Invalid pixel format!\n"); - return AVERROR(EINVAL); - } + av_image_copy(dst_data, dst_linesize, + (const uint8_t**)frame->data, frame->linesize, frame->format, + nv_surface->width, nv_surface->height); return 0; }