From c359d00d131770502deaf1c198211edcf43fa013 Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Wed, 27 Dec 2023 22:54:43 +0800 Subject: [PATCH] HACK: lavu: allow image copy for NV15 and NV20 Signed-off-by: nyanmisaka --- libavutil/imgutils.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/libavutil/imgutils.c b/libavutil/imgutils.c index da3812698e..c703425a06 100644 --- a/libavutil/imgutils.c +++ b/libavutil/imgutils.c @@ -341,6 +341,19 @@ int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar) return AVERROR(EINVAL); } +static void image_copy_plane2(uint8_t *dst, ptrdiff_t dst_linesize, + const uint8_t *src, ptrdiff_t src_linesize, + ptrdiff_t bytewidth, int height) +{ + if (!dst || !src) + return; + for (;height > 0; height--) { + memcpy(dst, src, bytewidth); + dst += dst_linesize; + src += src_linesize; + } +} + static void image_copy_plane(uint8_t *dst, ptrdiff_t dst_linesize, const uint8_t *src, ptrdiff_t src_linesize, ptrdiff_t bytewidth, int height) @@ -349,11 +362,9 @@ static void image_copy_plane(uint8_t *dst, ptrdiff_t dst_linesize, return; av_assert0(FFABS(src_linesize) >= bytewidth); av_assert0(FFABS(dst_linesize) >= bytewidth); - for (;height > 0; height--) { - memcpy(dst, src, bytewidth); - dst += dst_linesize; - src += src_linesize; - } + image_copy_plane2(dst, dst_linesize, + src, src_linesize, + bytewidth, height); } void av_image_copy_plane_uc_from(uint8_t *dst, ptrdiff_t dst_linesize, @@ -424,7 +435,8 @@ void av_image_copy(uint8_t *const dst_data[4], const int dst_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height) { ptrdiff_t dst_linesizes1[4], src_linesizes1[4]; - int i; + int i, is_nv15_20 = pix_fmt == AV_PIX_FMT_NV15 || + pix_fmt == AV_PIX_FMT_NV20; for (i = 0; i < 4; i++) { dst_linesizes1[i] = dst_linesizes[i]; @@ -432,7 +444,7 @@ void av_image_copy(uint8_t *const dst_data[4], const int dst_linesizes[4], } image_copy(dst_data, dst_linesizes1, src_data, src_linesizes1, pix_fmt, - width, height, image_copy_plane); + width, height, is_nv15_20 ? image_copy_plane2 : image_copy_plane); } void av_image_copy_uc_from(uint8_t * const dst_data[4], const ptrdiff_t dst_linesizes[4],