diff --git a/doc/APIchanges b/doc/APIchanges
index 565f7e091e..031e09aab2 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -14,6 +14,9 @@ libavutil:     2021-04-27
 
 API changes, most recent first:
 
+2021-11-xx - xxxxxxxxxx - lavfi 8.18.100 - avfilter.h
+  Add AVFILTER_FLAG_META.
+
 2021-11-17 - xxxxxxxxxx - lavf 57.9.100 - frame.h
   Add AV_FRAME_DATA_DOVI_RPU_BUFFER.
 
diff --git a/libavfilter/af_acopy.c b/libavfilter/af_acopy.c
index 32455d9186..751644ebc7 100644
--- a/libavfilter/af_acopy.c
+++ b/libavfilter/af_acopy.c
@@ -63,6 +63,7 @@ static const AVFilterPad acopy_outputs[] = {
 const AVFilter ff_af_acopy = {
     .name          = "acopy",
     .description   = NULL_IF_CONFIG_SMALL("Copy the input audio unchanged to the output."),
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(acopy_inputs),
     FILTER_OUTPUTS(acopy_outputs),
 };
diff --git a/libavfilter/af_aformat.c b/libavfilter/af_aformat.c
index 7e25c0c6a4..8fdb070b4e 100644
--- a/libavfilter/af_aformat.c
+++ b/libavfilter/af_aformat.c
@@ -162,6 +162,7 @@ const AVFilter ff_af_aformat = {
     .uninit        = uninit,
     .priv_size     = sizeof(AFormatContext),
     .priv_class    = &aformat_class,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_af_aformat_inputs),
     FILTER_OUTPUTS(avfilter_af_aformat_outputs),
     FILTER_QUERY_FUNC(query_formats),
diff --git a/libavfilter/af_anull.c b/libavfilter/af_anull.c
index 065d37e17e..2c52636250 100644
--- a/libavfilter/af_anull.c
+++ b/libavfilter/af_anull.c
@@ -44,6 +44,7 @@ static const AVFilterPad avfilter_af_anull_outputs[] = {
 const AVFilter ff_af_anull = {
     .name          = "anull",
     .description   = NULL_IF_CONFIG_SMALL("Pass the source unchanged to the output."),
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_af_anull_inputs),
     FILTER_OUTPUTS(avfilter_af_anull_outputs),
 };
diff --git a/libavfilter/af_asdr.c b/libavfilter/af_asdr.c
index 72b6dfa78b..2e9bbb4649 100644
--- a/libavfilter/af_asdr.c
+++ b/libavfilter/af_asdr.c
@@ -166,6 +166,7 @@ const AVFilter ff_af_asdr = {
     .priv_size      = sizeof(AudioSDRContext),
     .activate       = activate,
     .uninit         = uninit,
+    .flags          = AVFILTER_FLAG_META,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
     FILTER_SINGLE_SAMPLEFMT(AV_SAMPLE_FMT_DBLP),
diff --git a/libavfilter/af_asetrate.c b/libavfilter/af_asetrate.c
index 637fa4fbb8..1e65427eec 100644
--- a/libavfilter/af_asetrate.c
+++ b/libavfilter/af_asetrate.c
@@ -113,4 +113,5 @@ const AVFilter ff_af_asetrate = {
     FILTER_OUTPUTS(asetrate_outputs),
     FILTER_QUERY_FUNC(query_formats),
     .priv_class    = &asetrate_class,
+    .flags         = AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/af_ashowinfo.c b/libavfilter/af_ashowinfo.c
index b6623fa69d..b8cc424153 100644
--- a/libavfilter/af_ashowinfo.c
+++ b/libavfilter/af_ashowinfo.c
@@ -257,6 +257,7 @@ const AVFilter ff_af_ashowinfo = {
     .description = NULL_IF_CONFIG_SMALL("Show textual information for each audio frame."),
     .priv_size   = sizeof(AShowInfoContext),
     .uninit      = uninit,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
 };
diff --git a/libavfilter/af_asr.c b/libavfilter/af_asr.c
index b9c7068526..9b97efcde8 100644
--- a/libavfilter/af_asr.c
+++ b/libavfilter/af_asr.c
@@ -172,6 +172,7 @@ const AVFilter ff_af_asr = {
     .priv_class    = &asr_class,
     .init          = asr_init,
     .uninit        = asr_uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(asr_inputs),
     FILTER_OUTPUTS(asr_outputs),
     FILTER_QUERY_FUNC(query_formats),
diff --git a/libavfilter/af_astats.c b/libavfilter/af_astats.c
index 0621d18b35..04de842a1e 100644
--- a/libavfilter/af_astats.c
+++ b/libavfilter/af_astats.c
@@ -852,5 +852,5 @@ const AVFilter ff_af_astats = {
                       AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64P,
                       AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
                       AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBLP),
-    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS | AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/af_drmeter.c b/libavfilter/af_drmeter.c
index 6e0d80a3f1..1aa5332a28 100644
--- a/libavfilter/af_drmeter.c
+++ b/libavfilter/af_drmeter.c
@@ -202,6 +202,7 @@ const AVFilter ff_af_drmeter = {
     .priv_size     = sizeof(DRMeterContext),
     .priv_class    = &drmeter_class,
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(drmeter_inputs),
     FILTER_OUTPUTS(drmeter_outputs),
     FILTER_SAMPLEFMTS(AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT),
diff --git a/libavfilter/af_replaygain.c b/libavfilter/af_replaygain.c
index ee0312da82..e2acf38173 100644
--- a/libavfilter/af_replaygain.c
+++ b/libavfilter/af_replaygain.c
@@ -606,6 +606,7 @@ const AVFilter ff_af_replaygain = {
     .description   = NULL_IF_CONFIG_SMALL("ReplayGain scanner."),
     .uninit        = uninit,
     .priv_size     = sizeof(ReplayGainContext),
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(replaygain_inputs),
     FILTER_OUTPUTS(replaygain_outputs),
     FILTER_QUERY_FUNC(query_formats),
diff --git a/libavfilter/af_silencedetect.c b/libavfilter/af_silencedetect.c
index fa0884bee8..90bcd47b59 100644
--- a/libavfilter/af_silencedetect.c
+++ b/libavfilter/af_silencedetect.c
@@ -272,4 +272,5 @@ const AVFilter ff_af_silencedetect = {
                       AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32P,
                       AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P),
     .priv_class    = &silencedetect_class,
+    .flags         = AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/af_volumedetect.c b/libavfilter/af_volumedetect.c
index c137cc7e50..870aa448c1 100644
--- a/libavfilter/af_volumedetect.c
+++ b/libavfilter/af_volumedetect.c
@@ -134,6 +134,7 @@ const AVFilter ff_af_volumedetect = {
     .description   = NULL_IF_CONFIG_SMALL("Detect audio volume."),
     .priv_size     = sizeof(VolDetectContext),
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(volumedetect_inputs),
     FILTER_OUTPUTS(volumedetect_outputs),
     FILTER_SAMPLEFMTS(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P),
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index f7208754a7..a59922bb25 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -119,6 +119,22 @@ enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx);
  * and processing them concurrently.
  */
 #define AVFILTER_FLAG_SLICE_THREADS         (1 << 2)
+/**
+ * The filter is a "metadata" filter - it does not modify the frame data in any
+ * way. It may only affect the metadata (i.e. those fields copied by
+ * av_frame_copy_props()).
+ *
+ * More precisely, this means:
+ * - video: the data of any frame output by the filter must be exactly equal to
+ *   some frame that is received on one of its inputs. Furthermore, all frames
+ *   produced on a given output must correspond to frames received on the same
+ *   input and their order must be unchanged. Note that the filter may still
+ *   drop or duplicate the frames.
+ * - audio: the data produced by the filter on any of its outputs (viewed e.g.
+ *   as an array of interleaved samples) must be exactly equal to the data
+ *   received by the filter on one of its inputs.
+ */
+#define AVFILTER_FLAG_META                  (1 << 3)
 /**
  * Some filters support a generic "enable" expression option that can be used
  * to enable or disable a filter in the timeline. Filters supporting this
diff --git a/libavfilter/f_bench.c b/libavfilter/f_bench.c
index f7098adaf4..b0e97da2c0 100644
--- a/libavfilter/f_bench.c
+++ b/libavfilter/f_bench.c
@@ -113,6 +113,7 @@ const AVFilter ff_vf_bench = {
     FILTER_INPUTS(bench_inputs),
     FILTER_OUTPUTS(bench_outputs),
     .priv_class    = &bench_class,
+    .flags         = AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_BENCH_FILTER */
 
@@ -143,5 +144,6 @@ const AVFilter ff_af_abench = {
     FILTER_INPUTS(abench_inputs),
     FILTER_OUTPUTS(abench_outputs),
     .priv_class    = &abench_class,
+    .flags         = AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_ABENCH_FILTER */
diff --git a/libavfilter/f_cue.c b/libavfilter/f_cue.c
index fd55e4bf5f..db20bcebd5 100644
--- a/libavfilter/f_cue.c
+++ b/libavfilter/f_cue.c
@@ -142,6 +142,7 @@ const AVFilter ff_af_acue = {
     .description = NULL_IF_CONFIG_SMALL("Delay filtering to match a cue."),
     .priv_class  = &cue_acue_class,
     .priv_size   = sizeof(CueContext),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(acue_inputs),
     FILTER_OUTPUTS(acue_outputs),
     .activate    = activate,
diff --git a/libavfilter/f_latency.c b/libavfilter/f_latency.c
index de885ca026..8f770213a4 100644
--- a/libavfilter/f_latency.c
+++ b/libavfilter/f_latency.c
@@ -118,7 +118,8 @@ const AVFilter ff_vf_latency = {
     .init          = init,
     .uninit        = uninit,
     .activate      = activate,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_META,
     FILTER_INPUTS(latency_inputs),
     FILTER_OUTPUTS(latency_outputs),
 };
diff --git a/libavfilter/f_metadata.c b/libavfilter/f_metadata.c
index cecfe62a9c..57d8528ddc 100644
--- a/libavfilter/f_metadata.c
+++ b/libavfilter/f_metadata.c
@@ -391,7 +391,8 @@ const AVFilter ff_af_ametadata = {
     .uninit        = uninit,
     FILTER_INPUTS(ainputs),
     FILTER_OUTPUTS(aoutputs),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                     AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_AMETADATA_FILTER */
 
@@ -424,6 +425,7 @@ const AVFilter ff_vf_metadata = {
     .uninit      = uninit,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
-    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                   AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_METADATA_FILTER */
diff --git a/libavfilter/f_perms.c b/libavfilter/f_perms.c
index 470db45bee..ed5d55fd23 100644
--- a/libavfilter/f_perms.c
+++ b/libavfilter/f_perms.c
@@ -138,7 +138,8 @@ const AVFilter ff_af_aperms = {
     .priv_size   = sizeof(PermsContext),
     FILTER_INPUTS(aperms_inputs),
     FILTER_OUTPUTS(aperms_outputs),
-    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                   AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_APERMS_FILTER */
 
@@ -167,6 +168,7 @@ const AVFilter ff_vf_perms = {
     FILTER_INPUTS(perms_inputs),
     FILTER_OUTPUTS(perms_outputs),
     .priv_class  = &perms_class,
-    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                   AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_PERMS_FILTER */
diff --git a/libavfilter/f_realtime.c b/libavfilter/f_realtime.c
index 11bdb058ed..d7fc26d3c5 100644
--- a/libavfilter/f_realtime.c
+++ b/libavfilter/f_realtime.c
@@ -95,6 +95,7 @@ const AVFilter ff_vf_realtime = {
     .description = NULL_IF_CONFIG_SMALL("Slow down filtering to match realtime."),
     .priv_size   = sizeof(RealtimeContext),
     .priv_class  = &realtime_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_realtime_inputs),
     FILTER_OUTPUTS(avfilter_vf_realtime_outputs),
 };
@@ -122,6 +123,7 @@ const AVFilter ff_af_arealtime = {
     .description = NULL_IF_CONFIG_SMALL("Slow down filtering to match realtime."),
     .priv_class  = &realtime_class,
     .priv_size   = sizeof(RealtimeContext),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(arealtime_inputs),
     FILTER_OUTPUTS(arealtime_outputs),
 };
diff --git a/libavfilter/f_segment.c b/libavfilter/f_segment.c
index 70c8393972..33c19b5aa7 100644
--- a/libavfilter/f_segment.c
+++ b/libavfilter/f_segment.c
@@ -286,7 +286,7 @@ const AVFilter ff_vf_segment = {
     .activate    = activate,
     FILTER_INPUTS(segment_inputs),
     .outputs     = NULL,
-    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
+    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS | AVFILTER_FLAG_META,
 };
 #endif // CONFIG_SEGMENT_FILTER
 
@@ -325,6 +325,6 @@ const AVFilter ff_af_asegment = {
     .activate    = activate,
     FILTER_INPUTS(asegment_inputs),
     .outputs     = NULL,
-    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
+    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS | AVFILTER_FLAG_META,
 };
 #endif // CONFIG_ASEGMENT_FILTER
diff --git a/libavfilter/f_select.c b/libavfilter/f_select.c
index 47e7d1fef8..532547bcaf 100644
--- a/libavfilter/f_select.c
+++ b/libavfilter/f_select.c
@@ -533,6 +533,6 @@ const AVFilter ff_vf_select = {
     .priv_class    = &select_class,
     FILTER_INPUTS(avfilter_vf_select_inputs),
     FILTER_QUERY_FUNC(query_formats),
-    .flags         = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
+    .flags         = AVFILTER_FLAG_DYNAMIC_OUTPUTS | AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_SELECT_FILTER */
diff --git a/libavfilter/f_sendcmd.c b/libavfilter/f_sendcmd.c
index f71d211eb4..089cd56ce6 100644
--- a/libavfilter/f_sendcmd.c
+++ b/libavfilter/f_sendcmd.c
@@ -597,6 +597,7 @@ const AVFilter ff_vf_sendcmd = {
     .init        = init,
     .uninit      = uninit,
     .priv_size   = sizeof(SendCmdContext),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(sendcmd_inputs),
     FILTER_OUTPUTS(sendcmd_outputs),
     .priv_class  = &sendcmd_class,
@@ -628,6 +629,7 @@ const AVFilter ff_af_asendcmd = {
     .init        = init,
     .uninit      = uninit,
     .priv_size   = sizeof(SendCmdContext),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(asendcmd_inputs),
     FILTER_OUTPUTS(asendcmd_outputs),
 };
diff --git a/libavfilter/f_sidedata.c b/libavfilter/f_sidedata.c
index 5c9f905cc2..41238f7468 100644
--- a/libavfilter/f_sidedata.c
+++ b/libavfilter/f_sidedata.c
@@ -147,7 +147,8 @@ const AVFilter ff_af_asidedata = {
     .init          = init,
     FILTER_INPUTS(ainputs),
     FILTER_OUTPUTS(aoutputs),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                     AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_ASIDEDATA_FILTER */
 
@@ -179,6 +180,7 @@ const AVFilter ff_vf_sidedata = {
     .init        = init,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
-    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                   AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_SIDEDATA_FILTER */
diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c
index bb7d78f09c..36007cdc61 100644
--- a/libavfilter/fifo.c
+++ b/libavfilter/fifo.c
@@ -132,6 +132,7 @@ const AVFilter ff_vf_fifo = {
     .init        = init,
     .uninit      = uninit,
     .priv_size   = sizeof(FifoContext),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_fifo_inputs),
     FILTER_OUTPUTS(avfilter_vf_fifo_outputs),
 };
@@ -158,6 +159,7 @@ const AVFilter ff_af_afifo = {
     .init        = init,
     .uninit      = uninit,
     .priv_size   = sizeof(FifoContext),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_af_afifo_inputs),
     FILTER_OUTPUTS(avfilter_af_afifo_outputs),
 };
diff --git a/libavfilter/setpts.c b/libavfilter/setpts.c
index fad92033e4..0cf21203a4 100644
--- a/libavfilter/setpts.c
+++ b/libavfilter/setpts.c
@@ -294,6 +294,7 @@ const AVFilter ff_vf_setpts = {
     .init      = init,
     .activate  = activate,
     .uninit    = uninit,
+    .flags     = AVFILTER_FLAG_META,
 
     .priv_size = sizeof(SetPTSContext),
     .priv_class = &setpts_class,
@@ -334,6 +335,7 @@ const AVFilter ff_af_asetpts = {
     .uninit      = uninit,
     .priv_size   = sizeof(SetPTSContext),
     .priv_class  = &asetpts_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(asetpts_inputs),
     FILTER_OUTPUTS(asetpts_outputs),
 };
diff --git a/libavfilter/settb.c b/libavfilter/settb.c
index ae2cf9b888..1bdfe608d7 100644
--- a/libavfilter/settb.c
+++ b/libavfilter/settb.c
@@ -185,6 +185,7 @@ const AVFilter ff_vf_settb = {
     FILTER_INPUTS(avfilter_vf_settb_inputs),
     FILTER_OUTPUTS(avfilter_vf_settb_outputs),
     .activate    = activate,
+    .flags       = AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_SETTB_FILTER */
 
@@ -216,5 +217,6 @@ const AVFilter ff_af_asettb = {
     FILTER_OUTPUTS(avfilter_af_asettb_outputs),
     .priv_class  = &asettb_class,
     .activate    = activate,
+    .flags       = AVFILTER_FLAG_META,
 };
 #endif /* CONFIG_ASETTB_FILTER */
diff --git a/libavfilter/split.c b/libavfilter/split.c
index a08ddf72b1..e83c6c5240 100644
--- a/libavfilter/split.c
+++ b/libavfilter/split.c
@@ -112,7 +112,7 @@ const AVFilter ff_vf_split = {
     .init        = split_init,
     FILTER_INPUTS(avfilter_vf_split_inputs),
     .outputs     = NULL,
-    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
+    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS | AVFILTER_FLAG_META,
 };
 
 static const AVFilterPad avfilter_af_asplit_inputs[] = {
@@ -131,5 +131,5 @@ const AVFilter ff_af_asplit = {
     .init        = split_init,
     FILTER_INPUTS(avfilter_af_asplit_inputs),
     .outputs     = NULL,
-    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
+    .flags       = AVFILTER_FLAG_DYNAMIC_OUTPUTS | AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/trim.c b/libavfilter/trim.c
index c260da3a0b..a102d53741 100644
--- a/libavfilter/trim.c
+++ b/libavfilter/trim.c
@@ -363,6 +363,7 @@ const AVFilter ff_af_atrim = {
     .init        = init,
     .priv_size   = sizeof(TrimContext),
     .priv_class  = &atrim_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(atrim_inputs),
     FILTER_OUTPUTS(atrim_outputs),
 };
diff --git a/libavfilter/version.h b/libavfilter/version.h
index b9e610ea1f..e0bdcb836d 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -30,7 +30,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVFILTER_VERSION_MAJOR   8
-#define LIBAVFILTER_VERSION_MINOR  17
+#define LIBAVFILTER_VERSION_MINOR  18
 #define LIBAVFILTER_VERSION_MICRO 100
 
 
diff --git a/libavfilter/vf_addroi.c b/libavfilter/vf_addroi.c
index 5f9ec21754..a378d83495 100644
--- a/libavfilter/vf_addroi.c
+++ b/libavfilter/vf_addroi.c
@@ -262,6 +262,8 @@ const AVFilter ff_vf_addroi = {
     .priv_size   = sizeof(AddROIContext),
     .priv_class  = &addroi_class,
 
+    .flags       = AVFILTER_FLAG_META,
+
     FILTER_INPUTS(addroi_inputs),
     FILTER_OUTPUTS(addroi_outputs),
 };
diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c
index 995c7f4f14..889d96a97e 100644
--- a/libavfilter/vf_aspect.c
+++ b/libavfilter/vf_aspect.c
@@ -188,6 +188,7 @@ const AVFilter ff_vf_setdar = {
     .description = NULL_IF_CONFIG_SMALL("Set the frame display aspect ratio."),
     .priv_size   = sizeof(AspectContext),
     .priv_class  = &setdar_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_setdar_inputs),
     FILTER_OUTPUTS(avfilter_vf_setdar_outputs),
 };
@@ -250,6 +251,7 @@ const AVFilter ff_vf_setsar = {
     .description = NULL_IF_CONFIG_SMALL("Set the pixel sample aspect ratio."),
     .priv_size   = sizeof(AspectContext),
     .priv_class  = &setsar_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_setsar_inputs),
     FILTER_OUTPUTS(avfilter_vf_setsar_outputs),
 };
diff --git a/libavfilter/vf_bbox.c b/libavfilter/vf_bbox.c
index 559ca505bf..67a6d51dfb 100644
--- a/libavfilter/vf_bbox.c
+++ b/libavfilter/vf_bbox.c
@@ -151,6 +151,6 @@ const AVFilter ff_vf_bbox = {
     FILTER_INPUTS(bbox_inputs),
     FILTER_OUTPUTS(bbox_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_META,
     .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_blackdetect.c b/libavfilter/vf_blackdetect.c
index 93d5b077f1..ee14350d0f 100644
--- a/libavfilter/vf_blackdetect.c
+++ b/libavfilter/vf_blackdetect.c
@@ -257,5 +257,5 @@ const AVFilter ff_vf_blackdetect = {
     FILTER_PIXFMTS_ARRAY(pix_fmts),
     .uninit        = uninit,
     .priv_class    = &blackdetect_class,
-    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS | AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_blackframe.c b/libavfilter/vf_blackframe.c
index d37b3f3c13..1b1a0d2759 100644
--- a/libavfilter/vf_blackframe.c
+++ b/libavfilter/vf_blackframe.c
@@ -127,6 +127,7 @@ const AVFilter ff_vf_blackframe = {
     .description   = NULL_IF_CONFIG_SMALL("Detect frames that are (almost) black."),
     .priv_size     = sizeof(BlackFrameContext),
     .priv_class    = &blackframe_class,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_blackframe_inputs),
     FILTER_OUTPUTS(avfilter_vf_blackframe_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
diff --git a/libavfilter/vf_copy.c b/libavfilter/vf_copy.c
index 5554565bae..858fa551e2 100644
--- a/libavfilter/vf_copy.c
+++ b/libavfilter/vf_copy.c
@@ -75,6 +75,7 @@ static const AVFilterPad avfilter_vf_copy_outputs[] = {
 const AVFilter ff_vf_copy = {
     .name        = "copy",
     .description = NULL_IF_CONFIG_SMALL("Copy the input video unchanged to the output."),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_copy_inputs),
     FILTER_OUTPUTS(avfilter_vf_copy_outputs),
     FILTER_QUERY_FUNC(query_formats),
diff --git a/libavfilter/vf_cropdetect.c b/libavfilter/vf_cropdetect.c
index af3a8f333f..79b6b40a1e 100644
--- a/libavfilter/vf_cropdetect.c
+++ b/libavfilter/vf_cropdetect.c
@@ -273,5 +273,5 @@ const AVFilter ff_vf_cropdetect = {
     FILTER_INPUTS(avfilter_vf_cropdetect_inputs),
     FILTER_OUTPUTS(avfilter_vf_cropdetect_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_entropy.c b/libavfilter/vf_entropy.c
index 16569682a9..09cc678fc4 100644
--- a/libavfilter/vf_entropy.c
+++ b/libavfilter/vf_entropy.c
@@ -192,5 +192,5 @@ const AVFilter ff_vf_entropy = {
     FILTER_OUTPUTS(outputs),
     FILTER_PIXFMTS_ARRAY(pixfmts),
     .priv_class     = &entropy_class,
-    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
index 6ac714ce45..37636ec302 100644
--- a/libavfilter/vf_find_rect.c
+++ b/libavfilter/vf_find_rect.c
@@ -294,6 +294,7 @@ const AVFilter ff_vf_find_rect = {
     .priv_size       = sizeof(FOCContext),
     .init            = init,
     .uninit          = uninit,
+    .flags           = AVFILTER_FLAG_META,
     FILTER_INPUTS(foc_inputs),
     FILTER_OUTPUTS(foc_outputs),
     FILTER_PIXFMTS(AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P),
diff --git a/libavfilter/vf_format.c b/libavfilter/vf_format.c
index 7e15c43086..88b213a1f3 100644
--- a/libavfilter/vf_format.c
+++ b/libavfilter/vf_format.c
@@ -169,6 +169,8 @@ const AVFilter ff_vf_format = {
     .priv_size     = sizeof(FormatContext),
     .priv_class    = &format_class,
 
+    .flags         = AVFILTER_FLAG_META,
+
     FILTER_INPUTS(avfilter_vf_format_inputs),
     FILTER_OUTPUTS(avfilter_vf_format_outputs),
 
@@ -203,6 +205,8 @@ const AVFilter ff_vf_noformat = {
 
     .priv_size     = sizeof(FormatContext),
 
+    .flags         = AVFILTER_FLAG_META,
+
     FILTER_INPUTS(avfilter_vf_noformat_inputs),
     FILTER_OUTPUTS(avfilter_vf_noformat_outputs),
 
diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c
index b8714727fa..f922fced65 100644
--- a/libavfilter/vf_fps.c
+++ b/libavfilter/vf_fps.c
@@ -388,6 +388,7 @@ const AVFilter ff_vf_fps = {
     .priv_size   = sizeof(FPSContext),
     .priv_class  = &fps_class,
     .activate    = activate,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_fps_inputs),
     FILTER_OUTPUTS(avfilter_vf_fps_outputs),
 };
diff --git a/libavfilter/vf_framestep.c b/libavfilter/vf_framestep.c
index 5509df53e9..5c4d994bf5 100644
--- a/libavfilter/vf_framestep.c
+++ b/libavfilter/vf_framestep.c
@@ -94,5 +94,5 @@ const AVFilter ff_vf_framestep = {
     .priv_class  = &framestep_class,
     FILTER_INPUTS(framestep_inputs),
     FILTER_OUTPUTS(framestep_outputs),
-    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags       = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_freezedetect.c b/libavfilter/vf_freezedetect.c
index 99f0aae5a2..d936004e1f 100644
--- a/libavfilter/vf_freezedetect.c
+++ b/libavfilter/vf_freezedetect.c
@@ -217,6 +217,7 @@ const AVFilter ff_vf_freezedetect = {
     .priv_size     = sizeof(FreezeDetectContext),
     .priv_class    = &freezedetect_class,
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(freezedetect_inputs),
     FILTER_OUTPUTS(freezedetect_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
diff --git a/libavfilter/vf_identity.c b/libavfilter/vf_identity.c
index 5096bda382..9b11f966ba 100644
--- a/libavfilter/vf_identity.c
+++ b/libavfilter/vf_identity.c
@@ -412,7 +412,9 @@ const AVFilter ff_vf_identity = {
     FILTER_INPUTS(identity_inputs),
     FILTER_OUTPUTS(identity_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS             |
+                     AVFILTER_FLAG_META,
 };
 
 #endif /* CONFIG_IDENTITY_FILTER */
@@ -434,7 +436,9 @@ const AVFilter ff_vf_msad = {
     FILTER_INPUTS(identity_inputs),
     FILTER_OUTPUTS(identity_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS             |
+                     AVFILTER_FLAG_META,
 };
 
 #endif /* CONFIG_MSAD_FILTER */
diff --git a/libavfilter/vf_idet.c b/libavfilter/vf_idet.c
index 0f3e78c4ec..e568a7b219 100644
--- a/libavfilter/vf_idet.c
+++ b/libavfilter/vf_idet.c
@@ -436,6 +436,7 @@ const AVFilter ff_vf_idet = {
     .priv_size     = sizeof(IDETContext),
     .init          = init,
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(idet_inputs),
     FILTER_OUTPUTS(idet_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
diff --git a/libavfilter/vf_mestimate.c b/libavfilter/vf_mestimate.c
index d8bcfdde02..b7aa1d37a8 100644
--- a/libavfilter/vf_mestimate.c
+++ b/libavfilter/vf_mestimate.c
@@ -363,6 +363,7 @@ const AVFilter ff_vf_mestimate = {
     .priv_size     = sizeof(MEContext),
     .priv_class    = &mestimate_class,
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(mestimate_inputs),
     FILTER_OUTPUTS(mestimate_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
diff --git a/libavfilter/vf_null.c b/libavfilter/vf_null.c
index 33b1185ce0..7cfb8c1392 100644
--- a/libavfilter/vf_null.c
+++ b/libavfilter/vf_null.c
@@ -43,6 +43,7 @@ static const AVFilterPad avfilter_vf_null_outputs[] = {
 const AVFilter ff_vf_null = {
     .name        = "null",
     .description = NULL_IF_CONFIG_SMALL("Pass the source unchanged to the output."),
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_null_inputs),
     FILTER_OUTPUTS(avfilter_vf_null_outputs),
 };
diff --git a/libavfilter/vf_ocr.c b/libavfilter/vf_ocr.c
index f6249e61fc..57c3a2605f 100644
--- a/libavfilter/vf_ocr.c
+++ b/libavfilter/vf_ocr.c
@@ -143,6 +143,7 @@ const AVFilter ff_vf_ocr = {
     .priv_class    = &ocr_class,
     .init          = init,
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(ocr_inputs),
     FILTER_OUTPUTS(ocr_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
diff --git a/libavfilter/vf_psnr.c b/libavfilter/vf_psnr.c
index f96179db44..5e40d0bf1d 100644
--- a/libavfilter/vf_psnr.c
+++ b/libavfilter/vf_psnr.c
@@ -466,5 +466,7 @@ const AVFilter ff_vf_psnr = {
     FILTER_INPUTS(psnr_inputs),
     FILTER_OUTPUTS(psnr_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS             |
+                     AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_qp.c b/libavfilter/vf_qp.c
index d942ba1579..74f7341a4d 100644
--- a/libavfilter/vf_qp.c
+++ b/libavfilter/vf_qp.c
@@ -198,5 +198,6 @@ const AVFilter ff_vf_qp = {
     FILTER_INPUTS(qp_inputs),
     FILTER_OUTPUTS(qp_outputs),
     .priv_class    = &qp_class,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_readeia608.c b/libavfilter/vf_readeia608.c
index b9dc46e10e..86e5b72fd7 100644
--- a/libavfilter/vf_readeia608.c
+++ b/libavfilter/vf_readeia608.c
@@ -555,6 +555,8 @@ const AVFilter ff_vf_readeia608 = {
     FILTER_OUTPUTS(readeia608_outputs),
     FILTER_PIXFMTS_ARRAY(pixel_fmts),
     .uninit        = uninit,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                     AVFILTER_FLAG_SLICE_THREADS            |
+                     AVFILTER_FLAG_META,
     .process_command = process_command,
 };
diff --git a/libavfilter/vf_readvitc.c b/libavfilter/vf_readvitc.c
index 370cf5d15d..49222b9345 100644
--- a/libavfilter/vf_readvitc.c
+++ b/libavfilter/vf_readvitc.c
@@ -242,6 +242,7 @@ const AVFilter ff_vf_readvitc = {
     .description   = NULL_IF_CONFIG_SMALL("Read vertical interval timecode and write it to frame metadata."),
     .priv_size     = sizeof(ReadVitcContext),
     .priv_class    = &readvitc_class,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
     FILTER_PIXFMTS_ARRAY(pixel_fmts),
diff --git a/libavfilter/vf_scdet.c b/libavfilter/vf_scdet.c
index d11d2e2e2c..7401d411b3 100644
--- a/libavfilter/vf_scdet.c
+++ b/libavfilter/vf_scdet.c
@@ -206,6 +206,7 @@ const AVFilter ff_vf_scdet = {
     .priv_size     = sizeof(SCDetContext),
     .priv_class    = &scdet_class,
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(scdet_inputs),
     FILTER_OUTPUTS(scdet_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
diff --git a/libavfilter/vf_setparams.c b/libavfilter/vf_setparams.c
index 0a79599bab..94a464ac08 100644
--- a/libavfilter/vf_setparams.c
+++ b/libavfilter/vf_setparams.c
@@ -165,6 +165,7 @@ const AVFilter ff_vf_setparams = {
     .description = NULL_IF_CONFIG_SMALL("Force field, or color property for the output video frame."),
     .priv_size   = sizeof(SetParamsContext),
     .priv_class  = &setparams_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
 };
@@ -204,6 +205,7 @@ const AVFilter ff_vf_setrange = {
     .priv_size   = sizeof(SetParamsContext),
     .init        = init_setrange,
     .priv_class  = &setrange_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
 };
@@ -238,6 +240,7 @@ const AVFilter ff_vf_setfield = {
     .priv_size   = sizeof(SetParamsContext),
     .init        = init_setfield,
     .priv_class  = &setfield_class,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(inputs),
     FILTER_OUTPUTS(outputs),
 };
diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index ff438e70c6..1b5186b0db 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -678,4 +678,5 @@ const AVFilter ff_vf_showinfo = {
     FILTER_OUTPUTS(avfilter_vf_showinfo_outputs),
     .priv_size   = sizeof(ShowInfoContext),
     .priv_class  = &showinfo_class,
+    .flags       = AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_ssim.c b/libavfilter/vf_ssim.c
index c6989d618b..7de7eb304c 100644
--- a/libavfilter/vf_ssim.c
+++ b/libavfilter/vf_ssim.c
@@ -592,5 +592,7 @@ const AVFilter ff_vf_ssim = {
     FILTER_INPUTS(ssim_inputs),
     FILTER_OUTPUTS(ssim_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS             |
+                     AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_vfrdet.c b/libavfilter/vf_vfrdet.c
index fda8c2d485..b4c194c784 100644
--- a/libavfilter/vf_vfrdet.c
+++ b/libavfilter/vf_vfrdet.c
@@ -108,6 +108,7 @@ const AVFilter ff_vf_vfrdet = {
     .priv_size   = sizeof(VFRDETContext),
     .init        = init,
     .uninit      = uninit,
+    .flags       = AVFILTER_FLAG_META,
     FILTER_INPUTS(vfrdet_inputs),
     FILTER_OUTPUTS(vfrdet_outputs),
 };
diff --git a/libavfilter/vf_vidstabdetect.c b/libavfilter/vf_vidstabdetect.c
index 05c95d0eeb..009c333f9b 100644
--- a/libavfilter/vf_vidstabdetect.c
+++ b/libavfilter/vf_vidstabdetect.c
@@ -196,6 +196,7 @@ const AVFilter ff_vf_vidstabdetect = {
     .priv_size     = sizeof(StabData),
     .init          = init,
     .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(avfilter_vf_vidstabdetect_inputs),
     FILTER_OUTPUTS(avfilter_vf_vidstabdetect_outputs),
     FILTER_PIXFMTS_ARRAY(ff_vidstab_pix_fmts),
diff --git a/libavfilter/vf_vif.c b/libavfilter/vf_vif.c
index 09854641b1..dbf0c3e33c 100644
--- a/libavfilter/vf_vif.c
+++ b/libavfilter/vf_vif.c
@@ -638,5 +638,7 @@ const AVFilter ff_vf_vif = {
     FILTER_INPUTS(vif_inputs),
     FILTER_OUTPUTS(vif_outputs),
     FILTER_PIXFMTS_ARRAY(pix_fmts),
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS             |
+                     AVFILTER_FLAG_META,
 };
diff --git a/libavfilter/vf_vmafmotion.c b/libavfilter/vf_vmafmotion.c
index 362839735e..d1abca7c2f 100644
--- a/libavfilter/vf_vmafmotion.c
+++ b/libavfilter/vf_vmafmotion.c
@@ -363,6 +363,7 @@ const AVFilter ff_vf_vmafmotion = {
     .uninit        = uninit,
     .priv_size     = sizeof(VMAFMotionContext),
     .priv_class    = &vmafmotion_class,
+    .flags         = AVFILTER_FLAG_META,
     FILTER_INPUTS(vmafmotion_inputs),
     FILTER_OUTPUTS(vmafmotion_outputs),
     FILTER_QUERY_FUNC(query_formats),
