diff --git a/tests/Makefile b/tests/Makefile
index d3f11efaaabe3025b91001b2bb721f6ede8f5fb5..9fec13211f028f469e6d8391a0698eac5539924b 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -74,6 +74,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/cover-art.mak
diff --git a/tests/fate/cbs.mak b/tests/fate/cbs.mak
new file mode 100644
index 0000000000000000000000000000000000000000..afd5c5dd8fcc4aeb72df5dfb005796ac384fc14e
--- /dev/null
+++ b/tests/fate/cbs.mak
@@ -0,0 +1,74 @@
+# 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
+
+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_SAMPLES_AVCONV += $(FATE_CBS_h264)
+fate-cbs-h264: $(FATE_CBS_h264)
+
+# 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_SAMPLES_AVCONV += $(FATE_CBS_hevc)
+fate-cbs-hevc: $(FATE_CBS_hevc)
+
+# 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_SAMPLES_AVCONV += $(FATE_CBS_mpeg2)
+fate-cbs-mpeg2: $(FATE_CBS_mpeg2)
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..ce375b9080e60acd94991e17620c95508a40baef
--- /dev/null
+++ b/tests/ref/fate/cbs-h264-FM1_BT_B
@@ -0,0 +1 @@
+336a9b1373ee04af7b0b1de0da9a32f8
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..f706e2b1dc5b681ddbf958268c3416f236ca01f0
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-CAINIT_E_SHARP_3
@@ -0,0 +1 @@
+52fc63c7b3e30c0550f4b708477846a5
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..6bd454ef3b588834788d34521f1a720b591842aa
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-CAINIT_H_SHARP_3
@@ -0,0 +1 @@
+c951f0cd30502cf3cebc9d700d3ed67e
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..a30208dba49655488eaf4ac9b6c0d2f6f07ae00a
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-HRD_A_Fujitsu_2
@@ -0,0 +1 @@
+f150da624547ace5f7a983e714aa46be
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..6d4a7bf3d2076dfda55d3e54f4546649bcce8fa8
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-NUT_A_ericsson_5
@@ -0,0 +1 @@
+e089d60eb3a4e0393954fca75dc9b362
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..13dc111b0d8d8824ca263e8ee70172c81d466089
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-PICSIZE_A_Bossen_1
@@ -0,0 +1 @@
+df7bdc626044ff4a11644fd347219c0c
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..4422ea3d3cfb39330a6b6f368bb20e2ff7e5ab86
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-PICSIZE_B_Bossen_1
@@ -0,0 +1 @@
+b7895403cc9f873eba468b54735cc481
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..bd8275e4cde506a69e17fe1a4564ff6f1843b958
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-RPLM_A_qualcomm_4
@@ -0,0 +1 @@
+7a6ca92743ed41e36d422025f639b229
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..f02190aa2b03dc17f049cd145aaf529e93ec887c
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-RPS_E_qualcomm_5
@@ -0,0 +1 @@
+22199ff2b02e1cde89a2d8778a916c43
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..54ba416cb4a04b23ed95fa05d35a89090a35e419
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-SLIST_A_Sony_4
@@ -0,0 +1 @@
+c589578c4d19daf6f1d001a60e694fae
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..a29de5c8c93b7df5016d12bc18127f454f477841
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-SLIST_D_Sony_9
@@ -0,0 +1 @@
+49cd3af1ed065f2493e75986c81e48b6
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..aadb0fe5587b7ce12f0175d15a04c2e3e931eb3a
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-WPP_A_ericsson_MAIN_2
@@ -0,0 +1 @@
+904128c902b6feed228215446db940ac
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..024f132cbd1e3d44e72d130db8d5d82e8f543f94
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-WPP_F_ericsson_MAIN_2
@@ -0,0 +1 @@
+8fe3ada65124de5412886c892119c150
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..1507a2c446e9d41d2741077ed41e82da40e4a32e
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-WP_A_Toshiba_3
@@ -0,0 +1 @@
+6ea47b7a46cd254b3348a86033a9aa56
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