Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] checkasm/h264: test weight and biweight
@ 2024-07-13 18:03 Rémi Denis-Courmont
  0 siblings, 0 replies; only message in thread
From: Rémi Denis-Courmont @ 2024-07-13 18:03 UTC (permalink / raw)
  To: ffmpeg-devel

---
 tests/checkasm/h264dsp.c | 79 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 78 insertions(+), 1 deletion(-)

diff --git a/tests/checkasm/h264dsp.c b/tests/checkasm/h264dsp.c
index d1228ed985..39397f77e1 100644
--- a/tests/checkasm/h264dsp.c
+++ b/tests/checkasm/h264dsp.c
@@ -29,6 +29,81 @@
 
 static const uint32_t pixel_mask[5] = { 0xffffffff, 0x01ff01ff, 0x03ff03ff, 0x0fff0fff, 0x3fff3fff };
 static const uint32_t pixel_mask_lf[3] = { 0xff0fff0f, 0x01ff000f, 0x03ff000f };
+static const int depths[5] = { 8, 9, 10, 12, 14 };
+
+static void check_weight(void)
+{
+#define HEIGHT 128
+    for (int d = 0; d < FF_ARRAY_ELEMS(depths); d++) {
+        const int bit_depth = depths[d];
+        const int offset = rnd() & 0;
+        const int log_denom = rnd() & 7;
+        const int wa = rnd() & ((1 << log_denom) - 1);
+        const int wb = rnd() & ((1 << log_denom) - 1);
+        uint16_t ref[HEIGHT * 128 * 2], src[HEIGHT * 128 * 2];
+        uint16_t out0[HEIGHT * 128 * 2], out1[HEIGHT * 128 * 2];
+        uint8_t *const pref = (void *)ref;
+        uint8_t *const psrc = (void *)src;
+        uint8_t *const pout0 = (void *)out0;
+        uint8_t *const pout1 = (void *)out1;
+        H264DSPContext h;
+
+        ff_h264dsp_init(&h, bit_depth, 1);
+
+        for (size_t i = 0; i < FF_ARRAY_ELEMS(ref); i++)
+            if (bit_depth == 8) {
+                pref[i] = rnd();
+                psrc[i] = rnd();
+            } else {
+                ref[i] = rnd() & (0xffff >> (16 - d));
+                src[i] = rnd() & (0xffff >> (16 - d));
+            }
+
+        for (int w = 0; w < 4; w++) {
+            declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *block,
+                              ptrdiff_t stride, int height, int log2_denom,
+                              int weight, int offset);
+
+            if (check_func(h.weight_h264_pixels_tab[w], "h264_weight%d_%d",
+                           16 >> w, bit_depth)) {
+                memcpy(out0, ref, sizeof (out0));
+                memcpy(out1, ref, sizeof (out1));
+
+                call_ref(pout0, 32 >> w, HEIGHT, log_denom, wa, offset);
+                call_new(pout1, 32 >> w, HEIGHT, log_denom, wa, offset);
+
+                if (memcmp(out0, out1, sizeof (ref)))
+                    fail();
+
+                bench_new(pout1, 32 >> w, HEIGHT, log_denom, wa, offset);
+            }
+        }
+
+        for (int w = 0; w < 4; w++) {
+            declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst,
+                              const uint8_t *src, ptrdiff_t stride, int height,
+                              int log2_denom, int wd, int ws, int offset);
+
+            if (check_func(h.biweight_h264_pixels_tab[w], "h264_biweight%d_%d",
+                           16 >> w, bit_depth)) {
+                memcpy(out0, ref, sizeof (out0));
+                memcpy(out1, ref, sizeof (out1));
+
+                call_ref(pout0, psrc, 32 >> w, HEIGHT, log_denom, wa, wb,
+                         offset);
+                call_new(pout1, psrc, 32 >> w, HEIGHT, log_denom, wa, wb,
+                         offset);
+
+                if (memcmp(out0, out1, sizeof (ref)))
+                    fail();
+
+                bench_new(pout1, psrc, 32 >> w, HEIGHT, log_denom, wa, wb,
+                          offset);
+            }
+        }
+    }
+#undef HEIGHT
+}
 
 #define SIZEOF_PIXEL ((bit_depth + 7) / 8)
 #define SIZEOF_COEF  (2 * ((bit_depth + 7) / 8))
@@ -173,7 +248,6 @@ static void dct8x8(int16_t *coef, int bit_depth)
 
 static void check_idct(void)
 {
-    static const int depths[5] = { 8, 9, 10, 12, 14 };
     LOCAL_ALIGNED_16(uint8_t, src,  [8 * 8 * 2]);
     LOCAL_ALIGNED_16(uint8_t, dst,  [8 * 8 * 2]);
     LOCAL_ALIGNED_16(uint8_t, dst0, [8 * 8 * 2]);
@@ -451,6 +525,9 @@ static void check_loop_filter_intra(void)
 
 void checkasm_check_h264dsp(void)
 {
+    check_weight();
+    report("weight");
+
     check_idct();
     check_idct_multiple();
     report("idct");
-- 
2.45.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-07-13 18:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-07-13 18:03 [FFmpeg-devel] [PATCH] checkasm/h264: test weight and biweight Rémi Denis-Courmont

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git