diff --git a/tests/Makefile b/tests/Makefile
index 656c2c59c528d0591978749275aa709f45340cc1..fd3713fe81f5080c5be3ba5938455fdf1f2db60c 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -115,6 +115,7 @@ include $(SRC_PATH)/tests/fate/audio.mak
 include $(SRC_PATH)/tests/fate/bmp.mak
 include $(SRC_PATH)/tests/fate/build.mak
 include $(SRC_PATH)/tests/fate/canopus.mak
+include $(SRC_PATH)/tests/fate/cbs.mak
 include $(SRC_PATH)/tests/fate/cdxl.mak
 include $(SRC_PATH)/tests/fate/checkasm.mak
 include $(SRC_PATH)/tests/fate/concatdec.mak
diff --git a/tests/fate/cbs.mak b/tests/fate/cbs.mak
new file mode 100644
index 0000000000000000000000000000000000000000..fc5967e6f37df7d63ac2754e4e9cd183b6d5e430
--- /dev/null
+++ b/tests/fate/cbs.mak
@@ -0,0 +1,79 @@
+# Read/write tests: this uses the codec metadata filter - with no
+# arguments, it decomposes the stream fully and then recomposes it
+# without making any changes.
+
+fate-cbs: fate-cbs-h264 fate-cbs-hevc fate-cbs-mpeg2
+
+FATE_CBS_DEPS = $(call ALLYES, $(1)_DEMUXER $(1)_PARSER $(2)_METADATA_BSF $(3)_DECODER $(3)_MUXER)
+
+define FATE_CBS_TEST
+# (codec, test_name, sample_file, output_format)
+FATE_CBS_$(1) += fate-cbs-$(1)-$(2)
+fate-cbs-$(1)-$(2): CMD = md5 -i $(TARGET_SAMPLES)/$(3) -c:v copy -bsf:v $(1)_metadata -f $(4)
+endef
+
+# H.264 read/write
+
+FATE_CBS_H264_SAMPLES =   \
+    SVA_Base_B.264        \
+    BASQP1_Sony_C.jsv     \
+    FM1_BT_B.h264         \
+    CVFC1_Sony_C.jsv      \
+    AUD_MW_E.264          \
+    CVBS3_Sony_C.jsv      \
+    MR1_BT_A.h264         \
+    CVWP1_TOSHIBA_E.264   \
+    CVNLFI1_Sony_C.jsv    \
+    Sharp_MP_PAFF_1r2.jvt \
+    CVMANL1_TOSHIBA_B.264 \
+    sp1_bt_a.h264         \
+    CVSE2_Sony_B.jsv      \
+    CABACI3_Sony_B.jsv
+
+$(foreach N,$(FATE_CBS_H264_SAMPLES),$(eval $(call FATE_CBS_TEST,h264,$(basename $(N)),h264-conformance/$(N),h264)))
+
+FATE_CBS_H264-$(call FATE_CBS_DEPS, H264, H264, H264) = $(FATE_CBS_h264)
+FATE_SAMPLES_AVCONV += $(FATE_CBS_H264-yes)
+fate-cbs-h264: $(FATE_CBS_H264-yes)
+
+# H.265 read/write
+
+FATE_CBS_HEVC_SAMPLES =       \
+    STRUCT_A_Samsung_5.bit    \
+    WP_A_Toshiba_3.bit        \
+    SLIST_A_Sony_4.bit        \
+    SLIST_D_Sony_9.bit        \
+    CAINIT_E_SHARP_3.bit      \
+    CAINIT_H_SHARP_3.bit      \
+    TILES_B_Cisco_1.bit       \
+    WPP_A_ericsson_MAIN_2.bit \
+    WPP_F_ericsson_MAIN_2.bit \
+    ipcm_E_NEC_2.bit          \
+    NUT_A_ericsson_5.bit      \
+    PICSIZE_A_Bossen_1.bit    \
+    PICSIZE_B_Bossen_1.bit    \
+    RPS_A_docomo_4.bit        \
+    RPS_E_qualcomm_5.bit      \
+    LTRPSPS_A_Qualcomm_1.bit  \
+    RPLM_A_qualcomm_4.bit     \
+    CONFWIN_A_Sony_1.bit      \
+    HRD_A_Fujitsu_2.bit
+
+$(foreach N,$(FATE_CBS_HEVC_SAMPLES),$(eval $(call FATE_CBS_TEST,hevc,$(basename $(N)),hevc-conformance/$(N),hevc)))
+
+FATE_CBS_HEVC-$(call FATE_CBS_DEPS, HEVC, HEVC, HEVC) = $(FATE_CBS_hevc)
+FATE_SAMPLES_AVCONV += $(FATE_CBS_HEVC-yes)
+fate-cbs-hevc: $(FATE_CBS_HEVC-yes)
+
+# MPEG-2 read/write
+
+FATE_CBS_MPEG2_SAMPLES =     \
+    hhi_burst_422_short.bits \
+    sony-ct3.bs              \
+    tcela-6.bits
+
+$(foreach N,$(FATE_CBS_MPEG2_SAMPLES),$(eval $(call FATE_CBS_TEST,mpeg2,$(basename $(N)),mpeg2/$(N),mpeg2video)))
+
+FATE_CBS_MPEG2-$(call FATE_CBS_DEPS, MPEGVIDEO, MPEG2, MPEG2VIDEO) = $(FATE_CBS_mpeg2)
+FATE_SAMPLES_AVCONV += $(FATE_CBS_MPEG2-yes)
+fate-cbs-mpeg2: $(FATE_CBS_MPEG2-yes)
diff --git a/tests/ref/fate/cbs-h264-AUD_MW_E b/tests/ref/fate/cbs-h264-AUD_MW_E
new file mode 100644
index 0000000000000000000000000000000000000000..f2047924162602f32800138f24cc8b728690d020
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-AUD_MW_E
@@ -0,0 +1 @@
+9b8884667eda0b9853bec631458686ce
diff --git a/tests/ref/fate/cbs-h264-BASQP1_Sony_C b/tests/ref/fate/cbs-h264-BASQP1_Sony_C
new file mode 100644
index 0000000000000000000000000000000000000000..c2185c770b08a864a339fe6b63d3bf751fa60e4f
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-BASQP1_Sony_C
@@ -0,0 +1 @@
+00c52ae60bf9a41ae1145fbf5fea9838
diff --git a/tests/ref/fate/cbs-h264-CABACI3_Sony_B b/tests/ref/fate/cbs-h264-CABACI3_Sony_B
new file mode 100644
index 0000000000000000000000000000000000000000..59aeb721555ffef31dcba7791b33bbbda8d420a8
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-CABACI3_Sony_B
@@ -0,0 +1 @@
+2d94c80b858aec880530bad47afe3668
diff --git a/tests/ref/fate/cbs-h264-CVBS3_Sony_C b/tests/ref/fate/cbs-h264-CVBS3_Sony_C
new file mode 100644
index 0000000000000000000000000000000000000000..55f5e0b50e53a3be1c1591a9e927dcfcf3bdb3ca
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-CVBS3_Sony_C
@@ -0,0 +1 @@
+59ff1df9b25e80277cad4ad99e634df6
diff --git a/tests/ref/fate/cbs-h264-CVFC1_Sony_C b/tests/ref/fate/cbs-h264-CVFC1_Sony_C
new file mode 100644
index 0000000000000000000000000000000000000000..98004cf63c904f036cfb0f84f157410f2a81722c
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-CVFC1_Sony_C
@@ -0,0 +1 @@
+669f4f3d3ae35fa5a6f5c94e48776dcf
diff --git a/tests/ref/fate/cbs-h264-CVMANL1_TOSHIBA_B b/tests/ref/fate/cbs-h264-CVMANL1_TOSHIBA_B
new file mode 100644
index 0000000000000000000000000000000000000000..14aa45300d8390c417844b1f1a536a4b5e4abf2a
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-CVMANL1_TOSHIBA_B
@@ -0,0 +1 @@
+0c1d9694df747cc4697caf866bd3051a
diff --git a/tests/ref/fate/cbs-h264-CVNLFI1_Sony_C b/tests/ref/fate/cbs-h264-CVNLFI1_Sony_C
new file mode 100644
index 0000000000000000000000000000000000000000..d5f5ad1931a3b204a1c19403896105f8ec931c03
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-CVNLFI1_Sony_C
@@ -0,0 +1 @@
+7817d89bd749bc617a225978958a3af0
diff --git a/tests/ref/fate/cbs-h264-CVSE2_Sony_B b/tests/ref/fate/cbs-h264-CVSE2_Sony_B
new file mode 100644
index 0000000000000000000000000000000000000000..7845723edd80cf0b4f149bb44f3e754be7916749
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-CVSE2_Sony_B
@@ -0,0 +1 @@
+ca8bdba497bd2f3b97c50d59692eb537
diff --git a/tests/ref/fate/cbs-h264-CVWP1_TOSHIBA_E b/tests/ref/fate/cbs-h264-CVWP1_TOSHIBA_E
new file mode 100644
index 0000000000000000000000000000000000000000..4cb9c475fcfbbebfaa5418a7a4d72755d6a218bf
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-CVWP1_TOSHIBA_E
@@ -0,0 +1 @@
+01290611165b8d8ccba8468f3dae4c4d
diff --git a/tests/ref/fate/cbs-h264-FM1_BT_B b/tests/ref/fate/cbs-h264-FM1_BT_B
new file mode 100644
index 0000000000000000000000000000000000000000..862de950de28ecb0d891ec987dd4a7b2c4cd7484
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-FM1_BT_B
@@ -0,0 +1 @@
+f7d5474ec576eea3f70d83a26a641a60
diff --git a/tests/ref/fate/cbs-h264-MR1_BT_A b/tests/ref/fate/cbs-h264-MR1_BT_A
new file mode 100644
index 0000000000000000000000000000000000000000..0532652e6cfc83e56ceff0b810b63cf85240aaf7
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-MR1_BT_A
@@ -0,0 +1 @@
+699d37e66764ddb3b4265c299ca77dcd
diff --git a/tests/ref/fate/cbs-h264-SVA_Base_B b/tests/ref/fate/cbs-h264-SVA_Base_B
new file mode 100644
index 0000000000000000000000000000000000000000..a591b811b12f81399a75ef8594eb79c9eac3bbc9
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-SVA_Base_B
@@ -0,0 +1 @@
+443e55dd5f63dccf9a62acbb48451b08
diff --git a/tests/ref/fate/cbs-h264-Sharp_MP_PAFF_1r2 b/tests/ref/fate/cbs-h264-Sharp_MP_PAFF_1r2
new file mode 100644
index 0000000000000000000000000000000000000000..cc7d63931c79a7024091cefdf853737ee25117b7
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-Sharp_MP_PAFF_1r2
@@ -0,0 +1 @@
+fd01840ed6b086c3118b7c53c86d01f5
diff --git a/tests/ref/fate/cbs-h264-sp1_bt_a b/tests/ref/fate/cbs-h264-sp1_bt_a
new file mode 100644
index 0000000000000000000000000000000000000000..388c53aa5e7564de67e7435b67e411b8b1fa1664
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-sp1_bt_a
@@ -0,0 +1 @@
+8405c5583d31d7015ed401b34b4ec93c
diff --git a/tests/ref/fate/cbs-hevc-CAINIT_E_SHARP_3 b/tests/ref/fate/cbs-hevc-CAINIT_E_SHARP_3
new file mode 100644
index 0000000000000000000000000000000000000000..53af86aaa4684410f73df54d911b8de108d4ad97
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-CAINIT_E_SHARP_3
@@ -0,0 +1 @@
+44d1c0b80828af779d942cc20dde4ea4
diff --git a/tests/ref/fate/cbs-hevc-CAINIT_H_SHARP_3 b/tests/ref/fate/cbs-hevc-CAINIT_H_SHARP_3
new file mode 100644
index 0000000000000000000000000000000000000000..5e127d7894cecdedba6ad935b0b98859de003d18
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-CAINIT_H_SHARP_3
@@ -0,0 +1 @@
+ae9311dfcaf65bb8de9c4fcf23ce0871
diff --git a/tests/ref/fate/cbs-hevc-CONFWIN_A_Sony_1 b/tests/ref/fate/cbs-hevc-CONFWIN_A_Sony_1
new file mode 100644
index 0000000000000000000000000000000000000000..00445155d0a3315831246d4ec5be97f6ba785882
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-CONFWIN_A_Sony_1
@@ -0,0 +1 @@
+dce8104b2addbdd601eb280a88e18583
diff --git a/tests/ref/fate/cbs-hevc-HRD_A_Fujitsu_2 b/tests/ref/fate/cbs-hevc-HRD_A_Fujitsu_2
new file mode 100644
index 0000000000000000000000000000000000000000..b9c90ae3c372dc5726222b5121168437d230a5e6
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-HRD_A_Fujitsu_2
@@ -0,0 +1 @@
+716a90051f028c90daeb86b3825af36d
diff --git a/tests/ref/fate/cbs-hevc-LTRPSPS_A_Qualcomm_1 b/tests/ref/fate/cbs-hevc-LTRPSPS_A_Qualcomm_1
new file mode 100644
index 0000000000000000000000000000000000000000..21dfa5763a83cf6e8ebf4bd4e2f25d36f98ba493
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-LTRPSPS_A_Qualcomm_1
@@ -0,0 +1 @@
+11b599202a4d25693123bea8bb003e54
diff --git a/tests/ref/fate/cbs-hevc-NUT_A_ericsson_5 b/tests/ref/fate/cbs-hevc-NUT_A_ericsson_5
new file mode 100644
index 0000000000000000000000000000000000000000..32e58affe79e77d2cc156f2ceee13da16faa3fa4
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-NUT_A_ericsson_5
@@ -0,0 +1 @@
+25cf94dfa2e0334eeedbfa9a8ed1c4b2
diff --git a/tests/ref/fate/cbs-hevc-PICSIZE_A_Bossen_1 b/tests/ref/fate/cbs-hevc-PICSIZE_A_Bossen_1
new file mode 100644
index 0000000000000000000000000000000000000000..cc180049202cea4362fdb51ee8da658f76f0d902
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-PICSIZE_A_Bossen_1
@@ -0,0 +1 @@
+e87fbd90c297d401738db928e3e04dd4
diff --git a/tests/ref/fate/cbs-hevc-PICSIZE_B_Bossen_1 b/tests/ref/fate/cbs-hevc-PICSIZE_B_Bossen_1
new file mode 100644
index 0000000000000000000000000000000000000000..5495cec6c3e914d8752047f0e3d8ab0b615ff0a2
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-PICSIZE_B_Bossen_1
@@ -0,0 +1 @@
+4993d49d6f2f532dfc683a9d26c1e313
diff --git a/tests/ref/fate/cbs-hevc-RPLM_A_qualcomm_4 b/tests/ref/fate/cbs-hevc-RPLM_A_qualcomm_4
new file mode 100644
index 0000000000000000000000000000000000000000..c68d615cbff4d21d53bbd6d779ca6006dcb076f3
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-RPLM_A_qualcomm_4
@@ -0,0 +1 @@
+f5d2633eefcd95e189faf4302d270457
diff --git a/tests/ref/fate/cbs-hevc-RPS_A_docomo_4 b/tests/ref/fate/cbs-hevc-RPS_A_docomo_4
new file mode 100644
index 0000000000000000000000000000000000000000..772d16a192693192273e110564055e9fd53e7993
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-RPS_A_docomo_4
@@ -0,0 +1 @@
+97bd4fefd8cd95584f586027e244f283
diff --git a/tests/ref/fate/cbs-hevc-RPS_E_qualcomm_5 b/tests/ref/fate/cbs-hevc-RPS_E_qualcomm_5
new file mode 100644
index 0000000000000000000000000000000000000000..faef7da0d9232a9b7c6610e375319c2ca3332050
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-RPS_E_qualcomm_5
@@ -0,0 +1 @@
+b2528ef681729176ccb38a77be93a0de
diff --git a/tests/ref/fate/cbs-hevc-SLIST_A_Sony_4 b/tests/ref/fate/cbs-hevc-SLIST_A_Sony_4
new file mode 100644
index 0000000000000000000000000000000000000000..23b2e324d15e5a710fc9cde65dc1db7220e3d94d
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-SLIST_A_Sony_4
@@ -0,0 +1 @@
+72cf53bbc967c9679e21a6d3203edb07
diff --git a/tests/ref/fate/cbs-hevc-SLIST_D_Sony_9 b/tests/ref/fate/cbs-hevc-SLIST_D_Sony_9
new file mode 100644
index 0000000000000000000000000000000000000000..4cea86dba6c7bb93c3d588044387de11d79ebb63
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-SLIST_D_Sony_9
@@ -0,0 +1 @@
+59a22d715e30748492da5e0b9d421909
diff --git a/tests/ref/fate/cbs-hevc-STRUCT_A_Samsung_5 b/tests/ref/fate/cbs-hevc-STRUCT_A_Samsung_5
new file mode 100644
index 0000000000000000000000000000000000000000..6a4508b0c5c12d2b1134629a4a2bfa5df0a40bdf
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-STRUCT_A_Samsung_5
@@ -0,0 +1 @@
+647eb851b935fd3bc6a98ce5ce45dbc7
diff --git a/tests/ref/fate/cbs-hevc-TILES_B_Cisco_1 b/tests/ref/fate/cbs-hevc-TILES_B_Cisco_1
new file mode 100644
index 0000000000000000000000000000000000000000..d767e26d6839a122e0b1c735f8752717f77e7c96
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-TILES_B_Cisco_1
@@ -0,0 +1 @@
+85a114def19cefbd0fb0daf8370d711c
diff --git a/tests/ref/fate/cbs-hevc-WPP_A_ericsson_MAIN_2 b/tests/ref/fate/cbs-hevc-WPP_A_ericsson_MAIN_2
new file mode 100644
index 0000000000000000000000000000000000000000..fe6928fc8bc488dbe1d5b80c5a541406542d8ade
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-WPP_A_ericsson_MAIN_2
@@ -0,0 +1 @@
+de7d440b556eea827953e6d12aeb4023
diff --git a/tests/ref/fate/cbs-hevc-WPP_F_ericsson_MAIN_2 b/tests/ref/fate/cbs-hevc-WPP_F_ericsson_MAIN_2
new file mode 100644
index 0000000000000000000000000000000000000000..08aee566f1286d102667faf28091407e78c8deb9
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-WPP_F_ericsson_MAIN_2
@@ -0,0 +1 @@
+f197136f1fb3242c3422a48470dd7d35
diff --git a/tests/ref/fate/cbs-hevc-WP_A_Toshiba_3 b/tests/ref/fate/cbs-hevc-WP_A_Toshiba_3
new file mode 100644
index 0000000000000000000000000000000000000000..b868c438f8803b693dd2bf3660b57be8f52b6ec4
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-WP_A_Toshiba_3
@@ -0,0 +1 @@
+158312a1a35ef4b20cb4aeee48549c03
diff --git a/tests/ref/fate/cbs-hevc-ipcm_E_NEC_2 b/tests/ref/fate/cbs-hevc-ipcm_E_NEC_2
new file mode 100644
index 0000000000000000000000000000000000000000..cc68b6fb49deba4baf7afe0c02181ffc2ab0e243
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-ipcm_E_NEC_2
@@ -0,0 +1 @@
+2e1f9c95364cfac2aa6e6ee3a52c43c4
diff --git a/tests/ref/fate/cbs-mpeg2-hhi_burst_422_short b/tests/ref/fate/cbs-mpeg2-hhi_burst_422_short
new file mode 100644
index 0000000000000000000000000000000000000000..c319fba7b3b09fd3f90966054c26fc047121803c
--- /dev/null
+++ b/tests/ref/fate/cbs-mpeg2-hhi_burst_422_short
@@ -0,0 +1 @@
+e0c2fdd9baeba0c5ba5839a8cd7a72d3
diff --git a/tests/ref/fate/cbs-mpeg2-sony-ct3 b/tests/ref/fate/cbs-mpeg2-sony-ct3
new file mode 100644
index 0000000000000000000000000000000000000000..b5b4b12f0737be2e30add2d94c229175287ed2c9
--- /dev/null
+++ b/tests/ref/fate/cbs-mpeg2-sony-ct3
@@ -0,0 +1 @@
+b1e15a09cfffbad801810af0928736ab
diff --git a/tests/ref/fate/cbs-mpeg2-tcela-6 b/tests/ref/fate/cbs-mpeg2-tcela-6
new file mode 100644
index 0000000000000000000000000000000000000000..530369d6728aceea946289d42d4aabd46d9811f3
--- /dev/null
+++ b/tests/ref/fate/cbs-mpeg2-tcela-6
@@ -0,0 +1 @@
+771b6756a63793e05b74e645794908a2