PR #25008 opened by JeelGajera
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25008
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25008.patch

Adds 16 sample-free FATE tests for `metadata`/`ametadata`: every mode (select, 
add, modify, delete, print), every comparison function, print to stdout with 
and without `direct`, the four init errors, and `ametadata` with timeline 
`enable`.

Line coverage of `libavfilter/f_metadata.c` goes from 34.7% to 96% in a run 
without samples. The uncovered lines are the two `av_assert0` defaults, the 
named-URL branch and the `avio_open()` failure path.


>From ffc7cba4ebe39bffcfb76fc084e1c467f2831bc6 Mon Sep 17 00:00:00 2001
From: Jeel Gajera <[email protected]>
Date: Sun, 11 Oct 2026 12:54:11 +0530
Subject: [PATCH] tests/fate/filter-video: add tests for the metadata and
 ametadata filters

Only the print mode of the metadata filter was exercised by FATE, and
only through tests that need samples. Add sample-free tests built on a
four frame color source where frames carry a numeric key "k" (1, 10,
3.5, none) and a string key "s", so that every mode has frames that
match and frames that do not:

- select by key, and with the same_str, starts_with, ends_with, less,
  greater, equal and expr comparison functions
- add, modify, delete (by value, by key, all)
- print to stdout, all keys and a single key with direct=1
- the init errors for a missing key, value or expr and an invalid expr
- ametadata add and select with timeline enable

The less and greater cases avoid equal values on purpose; they currently
also match equal values, which does not follow the documentation.

Line coverage of libavfilter/f_metadata.c in a FATE run without samples
goes from 34.7% to 96%. The remaining lines are the two av_assert0
defaults, the named URL branch and the avio_open() failure path.

Signed-off-by: Jeel Gajera <[email protected]>
---
 tests/fate/filter-video.mak                 | 64 +++++++++++++++++++++
 tests/ref/fate/filter-ametadata             |  2 +
 tests/ref/fate/filter-metadata-add-modify   |  4 ++
 tests/ref/fate/filter-metadata-delete       |  4 ++
 tests/ref/fate/filter-metadata-delete-all   |  4 ++
 tests/ref/fate/filter-metadata-delete-key   |  4 ++
 tests/ref/fate/filter-metadata-print        | 11 ++++
 tests/ref/fate/filter-metadata-print-key    |  4 ++
 tests/ref/fate/filter-metadata-select-equal |  1 +
 tests/ref/fate/filter-metadata-select-expr  |  2 +
 tests/ref/fate/filter-metadata-select-key   |  3 +
 tests/ref/fate/filter-metadata-select-num   |  1 +
 tests/ref/fate/filter-metadata-select-str   |  1 +
 13 files changed, 105 insertions(+)
 create mode 100644 tests/ref/fate/filter-ametadata
 create mode 100644 tests/ref/fate/filter-metadata-add-modify
 create mode 100644 tests/ref/fate/filter-metadata-delete
 create mode 100644 tests/ref/fate/filter-metadata-delete-all
 create mode 100644 tests/ref/fate/filter-metadata-delete-key
 create mode 100644 tests/ref/fate/filter-metadata-print
 create mode 100644 tests/ref/fate/filter-metadata-print-key
 create mode 100644 tests/ref/fate/filter-metadata-select-equal
 create mode 100644 tests/ref/fate/filter-metadata-select-expr
 create mode 100644 tests/ref/fate/filter-metadata-select-key
 create mode 100644 tests/ref/fate/filter-metadata-select-num
 create mode 100644 tests/ref/fate/filter-metadata-select-str

diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
index ebbc0a7d1c..f910fe45f6 100644
--- a/tests/fate/filter-video.mak
+++ b/tests/fate/filter-video.mak
@@ -908,6 +908,70 @@ FREEZEDETECT_DEPS = LAVFI_INDEV MPTESTSRC_FILTER 
SCALE_FILTER FREEZEDETECT_FILTE
 FATE_METADATA_FILTER-$(call ALLYES, $(FREEZEDETECT_DEPS)) += 
fate-filter-metadata-freezedetect
 fate-filter-metadata-freezedetect: CMD = run $(FILTER_METADATA_COMMAND) 
"sws_flags=+accurate_rnd+bitexact;mptestsrc=r=25:d=10:m=51,freezedetect"
 
+# metadata filter: frames 0-2 carry a numeric key "k" (1, 10, 3.5) and
+# frames 0-3 a string key "s", so every mode and comparison function
+# has frames that match and frames that do not.
+METADATA_FILTER_SRC = 
color=c=black:s=16x16:r=1:d=4,metadata=add:key=k:value=1:enable=eq(n\,0),metadata=add:key=k:value=10:enable=eq(n\,1),metadata=add:key=k:value=3.5:enable=eq(n\,2),metadata=add:key=s:value=apple_pie:enable=eq(n\,0),metadata=add:key=s:value=banana_split:enable=eq(n\,1),metadata=add:key=s:value=apple_tart:enable=eq(n\,2),metadata=add:key=s:value=cherry_pie:enable=eq(n\,3)
+METADATA_FILTER_DEPS = FFPROBE LAVFI_INDEV COLOR_FILTER METADATA_FILTER
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-select-key
+fate-filter-metadata-select-key: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=print:key=k,metadata=select:key=k"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-select-str
+fate-filter-metadata-select-str: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=select:key=s:value=apple:function=starts_with,metadata=select:key=s:value=pie:function=ends_with"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-select-num
+fate-filter-metadata-select-num: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=select:key=k:value=5:function=less,metadata=select:key=k:value=2:function=greater"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-select-equal
+fate-filter-metadata-select-equal: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=select:key=k:value=10.0:function=equal"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-select-expr
+fate-filter-metadata-select-expr: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=select:key=k:value=0:function=expr:expr=between(VALUE1\,2\,20)"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-add-modify
+fate-filter-metadata-add-modify: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=modify:key=k:value=0,metadata=add:key=k:value=99,metadata=modify:key=missing:value=x"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-delete
+fate-filter-metadata-delete: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=delete:key=k:value=10,metadata=delete:key=s:value=apple:function=starts_with"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-delete-key
+fate-filter-metadata-delete-key: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=delete:key=s"
+
+FATE_FILTER_FFPROBE-$(call ALLYES, $(METADATA_FILTER_DEPS)) += 
fate-filter-metadata-delete-all
+fate-filter-metadata-delete-all: CMD = run $(FILTER_METADATA_COMMAND) 
"$(METADATA_FILTER_SRC),metadata=delete"
+
+METADATA_FILTER_PRINT_DEPS = LAVFI_INDEV COLOR_FILTER METADATA_FILTER 
WRAPPED_AVFRAME_ENCODER NULL_MUXER PIPE_PROTOCOL
+FATE_FILTER-$(call ALLYES, $(METADATA_FILTER_PRINT_DEPS)) += 
fate-filter-metadata-print
+fate-filter-metadata-print: CMD = ffmpeg -f lavfi -i 
"$(METADATA_FILTER_SRC),metadata=print:file=-" -f null -
+
+FATE_FILTER-$(call ALLYES, $(METADATA_FILTER_PRINT_DEPS)) += 
fate-filter-metadata-print-key
+fate-filter-metadata-print-key: CMD = ffmpeg -f lavfi -i 
"$(METADATA_FILTER_SRC),metadata=print:key=k:value=5:function=less:file=-:direct=1"
 -f null -
+
+METADATA_FILTER_ERROR_DEPS = LAVFI_INDEV COLOR_FILTER METADATA_FILTER 
NULL_MUXER
+FATE_FILTER-$(call ALLYES, $(METADATA_FILTER_ERROR_DEPS)) += 
fate-filter-metadata-no-key
+fate-filter-metadata-no-key: CMD = run $(FFMPEG) -nostdin -hide_banner -f 
lavfi -i "color=d=1,metadata=select" -f null - ; true
+fate-filter-metadata-no-key: CMP = grep
+fate-filter-metadata-no-key: REF = Metadata key must be set
+
+FATE_FILTER-$(call ALLYES, $(METADATA_FILTER_ERROR_DEPS)) += 
fate-filter-metadata-no-value
+fate-filter-metadata-no-value: CMD = run $(FFMPEG) -nostdin -hide_banner -f 
lavfi -i "color=d=1,metadata=add:key=k" -f null - ; true
+fate-filter-metadata-no-value: CMP = grep
+fate-filter-metadata-no-value: REF = Missing metadata value
+
+FATE_FILTER-$(call ALLYES, $(METADATA_FILTER_ERROR_DEPS)) += 
fate-filter-metadata-no-expr
+fate-filter-metadata-no-expr: CMD = run $(FFMPEG) -nostdin -hide_banner -f 
lavfi -i "color=d=1,metadata=select:key=k:function=expr" -f null - ; true
+fate-filter-metadata-no-expr: CMP = grep
+fate-filter-metadata-no-expr: REF = expr option not set
+
+FATE_FILTER-$(call ALLYES, $(METADATA_FILTER_ERROR_DEPS)) += 
fate-filter-metadata-bad-expr
+fate-filter-metadata-bad-expr: CMD = run $(FFMPEG) -nostdin -hide_banner -f 
lavfi -i "color=d=1,metadata=select:key=k:function=expr:expr=VALUE3" -f null - 
; true
+fate-filter-metadata-bad-expr: CMP = grep
+fate-filter-metadata-bad-expr: REF = Error while parsing expression
+
+FATE_FILTER_FFPROBE-$(call ALLYES, FFPROBE LAVFI_INDEV SINE_FILTER 
AMETADATA_FILTER) += fate-filter-ametadata
+fate-filter-ametadata: CMD = run $(FILTER_METADATA_COMMAND) 
"sine=sample_rate=8000:duration=0.5:samples_per_frame=1000,ametadata=add:key=k:value=1:enable=gte(n\,2),ametadata=select:key=k"
+
 SIGNALSTATS_DEPS = LAVFI_INDEV COLOR_FILTER SCALE_FILTER SIGNALSTATS_FILTER
 FATE_METADATA_FILTER-$(call ALLYES, $(SIGNALSTATS_DEPS)) += 
fate-filter-metadata-signalstats-yuv420p 
fate-filter-metadata-signalstats-yuv420p10
 fate-filter-metadata-signalstats-yuv420p: CMD = run $(FILTER_METADATA_COMMAND) 
"sws_flags=+accurate_rnd+bitexact;color=white:duration=1:r=1,signalstats"
diff --git a/tests/ref/fate/filter-ametadata b/tests/ref/fate/filter-ametadata
new file mode 100644
index 0000000000..4d71c6c6fe
--- /dev/null
+++ b/tests/ref/fate/filter-ametadata
@@ -0,0 +1,2 @@
+pts=2000|tag:k=1
+pts=3000|tag:k=1
diff --git a/tests/ref/fate/filter-metadata-add-modify 
b/tests/ref/fate/filter-metadata-add-modify
new file mode 100644
index 0000000000..5c8a34883d
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-add-modify
@@ -0,0 +1,4 @@
+pts=0|tag:s=apple_pie|tag:k=0
+pts=1|tag:s=banana_split|tag:k=0
+pts=2|tag:s=apple_tart|tag:k=0
+pts=3|tag:s=cherry_pie|tag:k=99
diff --git a/tests/ref/fate/filter-metadata-delete 
b/tests/ref/fate/filter-metadata-delete
new file mode 100644
index 0000000000..a2e3a4610c
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-delete
@@ -0,0 +1,4 @@
+pts=0|tag:k=1
+pts=1|tag:s=banana_split
+pts=2|tag:k=3.5
+pts=3|tag:s=cherry_pie
diff --git a/tests/ref/fate/filter-metadata-delete-all 
b/tests/ref/fate/filter-metadata-delete-all
new file mode 100644
index 0000000000..b4e5133074
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-delete-all
@@ -0,0 +1,4 @@
+pts=0
+pts=1
+pts=2
+pts=3
diff --git a/tests/ref/fate/filter-metadata-delete-key 
b/tests/ref/fate/filter-metadata-delete-key
new file mode 100644
index 0000000000..cdfe776b8a
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-delete-key
@@ -0,0 +1,4 @@
+pts=0|tag:k=1
+pts=1|tag:k=10
+pts=2|tag:k=3.5
+pts=3
diff --git a/tests/ref/fate/filter-metadata-print 
b/tests/ref/fate/filter-metadata-print
new file mode 100644
index 0000000000..7389d73204
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-print
@@ -0,0 +1,11 @@
+frame:0    pts:0       pts_time:0
+k=1
+s=apple_pie
+frame:1    pts:1       pts_time:1
+k=10
+s=banana_split
+frame:2    pts:2       pts_time:2
+k=3.5
+s=apple_tart
+frame:3    pts:3       pts_time:3
+s=cherry_pie
diff --git a/tests/ref/fate/filter-metadata-print-key 
b/tests/ref/fate/filter-metadata-print-key
new file mode 100644
index 0000000000..e89bf0ab9a
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-print-key
@@ -0,0 +1,4 @@
+frame:0    pts:0       pts_time:0
+k=1
+frame:2    pts:2       pts_time:2
+k=3.5
diff --git a/tests/ref/fate/filter-metadata-select-equal 
b/tests/ref/fate/filter-metadata-select-equal
new file mode 100644
index 0000000000..4439caa7f9
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-select-equal
@@ -0,0 +1 @@
+pts=1|tag:k=10|tag:s=banana_split
diff --git a/tests/ref/fate/filter-metadata-select-expr 
b/tests/ref/fate/filter-metadata-select-expr
new file mode 100644
index 0000000000..1856488fb5
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-select-expr
@@ -0,0 +1,2 @@
+pts=1|tag:k=10|tag:s=banana_split
+pts=2|tag:k=3.5|tag:s=apple_tart
diff --git a/tests/ref/fate/filter-metadata-select-key 
b/tests/ref/fate/filter-metadata-select-key
new file mode 100644
index 0000000000..15aebc899d
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-select-key
@@ -0,0 +1,3 @@
+pts=0|tag:k=1|tag:s=apple_pie
+pts=1|tag:k=10|tag:s=banana_split
+pts=2|tag:k=3.5|tag:s=apple_tart
diff --git a/tests/ref/fate/filter-metadata-select-num 
b/tests/ref/fate/filter-metadata-select-num
new file mode 100644
index 0000000000..600dfd1a80
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-select-num
@@ -0,0 +1 @@
+pts=2|tag:k=3.5|tag:s=apple_tart
diff --git a/tests/ref/fate/filter-metadata-select-str 
b/tests/ref/fate/filter-metadata-select-str
new file mode 100644
index 0000000000..4bb2fb2f8a
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-select-str
@@ -0,0 +1 @@
+pts=0|tag:k=1|tag:s=apple_pie
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to