Commit 96cba1c5 authored by Timo Rothenpieler's avatar Timo Rothenpieler

avcodec/nvenc: use av_image_copy for copying frame data

parent 30a09eae
...@@ -1276,84 +1276,32 @@ static NvencSurface *get_free_frame(NvencContext *ctx) ...@@ -1276,84 +1276,32 @@ static NvencSurface *get_free_frame(NvencContext *ctx)
return NULL; return NULL;
} }
static int nvenc_copy_frame(AVCodecContext *avctx, NvencSurface *inSurf, static int nvenc_copy_frame(AVCodecContext *avctx, NvencSurface *nv_surface,
NV_ENC_LOCK_INPUT_BUFFER *lockBufferParams, const AVFrame *frame) NV_ENC_LOCK_INPUT_BUFFER *lock_buffer_params, const AVFrame *frame)
{ {
uint8_t *buf = lockBufferParams->bufferDataPtr; int dst_linesize[4] = {
int off = inSurf->height * lockBufferParams->pitch; lock_buffer_params->pitch,
lock_buffer_params->pitch,
if (frame->format == AV_PIX_FMT_YUV420P) { lock_buffer_params->pitch,
av_image_copy_plane(buf, lockBufferParams->pitch, lock_buffer_params->pitch
frame->data[0], frame->linesize[0], };
avctx->width, avctx->height); uint8_t *dst_data[4];
int ret;
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);
buf += off; if (frame->format == AV_PIX_FMT_YUV420P)
dst_linesize[1] = dst_linesize[2] >>= 1;
av_image_copy_plane(buf, lockBufferParams->pitch, ret = av_image_fill_pointers(dst_data, frame->format, nv_surface->height,
frame->data[1], frame->linesize[1], lock_buffer_params->bufferDataPtr, dst_linesize);
avctx->width << 1, avctx->height); 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, av_image_copy(dst_data, dst_linesize,
frame->data[2], frame->linesize[2], (const uint8_t**)frame->data, frame->linesize, frame->format,
avctx->width << 1, avctx->height); nv_surface->width, nv_surface->height);
} else {
av_log(avctx, AV_LOG_FATAL, "Invalid pixel format!\n");
return AVERROR(EINVAL);
}
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment