Commit 9d106b2bb5 for ffmpeg
commit 9d106b2bb59f395abf277bf24a345f02aab00286
Author: Michael Niedermayer <michael@niedermayer.cc>
Date: Sat Oct 3 23:19:20 2026 +0200
avutil/tests/hwcontext_cuda: test transfers of bottom-up frames
Upload from and download into frames with negative linesizes, in
every combination with top-down ones.
Assisted-by: Claude
diff --git a/libavutil/tests/hwcontext_cuda.c b/libavutil/tests/hwcontext_cuda.c
index 05d11ca8c7..4a179b6ecd 100644
--- a/libavutil/tests/hwcontext_cuda.c
+++ b/libavutil/tests/hwcontext_cuda.c
@@ -31,7 +31,18 @@
#include "libavutil/pixfmt.h"
#include "libavutil/time.h"
-static int test_format(AVBufferRef *device_ref, enum AVPixelFormat fmt)
+static void vflip(AVFrame *frame, const AVPixFmtDescriptor *desc)
+{
+ for (int i = 0; i < FF_ARRAY_ELEMS(frame->data) && frame->data[i]; i++) {
+ int shift = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
+
+ frame->data[i] += (AV_CEIL_RSHIFT(frame->height, shift) - 1) * frame->linesize[i];
+ frame->linesize[i] = -frame->linesize[i];
+ }
+}
+
+static int test_format(AVBufferRef *device_ref, enum AVPixelFormat fmt,
+ int flip_upload, int flip_download)
{
AVBufferRef *frames_ref = NULL;
AVHWFramesContext *hwfc;
@@ -69,6 +80,8 @@ static int test_format(AVBufferRef *device_ref, enum AVPixelFormat fmt)
ret = av_frame_get_buffer(sw_frame, 0);
if (ret < 0)
goto fail;
+ if (flip_upload)
+ vflip(sw_frame, desc);
{
int linesizes[4];
@@ -99,6 +112,8 @@ static int test_format(AVBufferRef *device_ref, enum AVPixelFormat fmt)
ret = av_frame_get_buffer(download, 0);
if (ret < 0)
goto fail;
+ if (flip_download)
+ vflip(download, desc);
ret = av_hwframe_transfer_data(download, hw_frame, 0);
if (ret < 0)
@@ -113,9 +128,8 @@ static int test_format(AVBufferRef *device_ref, enum AVPixelFormat fmt)
int h = AV_CEIL_RSHIFT(64, shift);
for (int y = 0; y < h; y++) {
- int off = y * FFMIN(sw_frame->linesize[i], download->linesize[i]);
- if (memcmp(sw_frame->data[i] + off,
- download->data[i] + off,
+ if (memcmp(sw_frame->data[i] + y * sw_frame->linesize[i],
+ download->data[i] + y * download->linesize[i],
linesizes[i])) {
printf("fail: %-16s plane %d row %d mismatch\n",
av_get_pix_fmt_name(fmt), i, y);
@@ -270,7 +284,9 @@ int main(void)
failures++;
}
} else {
- ret = test_format(device_ref, fmt);
+ ret = 0;
+ for (int flip = 0; flip < 4 && ret >= 0; flip++)
+ ret = test_format(device_ref, fmt, flip & 1, flip & 2);
if (ret < 0) {
printf("fail: %-16s %s\n",
av_get_pix_fmt_name(fmt),