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]
