diff --git a/tests/Makefile b/tests/Makefile
index 278be24ccb..0cb9568617 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -114,6 +114,7 @@ include $(SRC_PATH)/tests/fate/atrac.mak
 include $(SRC_PATH)/tests/fate/audio.mak
 include $(SRC_PATH)/tests/fate/bmp.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 0000000000..afd5c5dd8f
--- /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 0000000000..f204792416
--- /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 0000000000..c2185c770b
--- /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 0000000000..59aeb72155
--- /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 0000000000..55f5e0b50e
--- /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 0000000000..98004cf63c
--- /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 0000000000..14aa45300d
--- /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 0000000000..d5f5ad1931
--- /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 0000000000..7845723edd
--- /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 0000000000..4cb9c475fc
--- /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 0000000000..862de950de
--- /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 0000000000..0532652e6c
--- /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 0000000000..a591b811b1
--- /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 0000000000..cc7d63931c
--- /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 0000000000..388c53aa5e
--- /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 0000000000..53af86aaa4
--- /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 0000000000..5e127d7894
--- /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 0000000000..00445155d0
--- /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 0000000000..b9c90ae3c3
--- /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 0000000000..21dfa5763a
--- /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 0000000000..32e58affe7
--- /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 0000000000..cc18004920
--- /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 0000000000..5495cec6c3
--- /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 0000000000..c68d615cbf
--- /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 0000000000..772d16a192
--- /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 0000000000..faef7da0d9
--- /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 0000000000..23b2e324d1
--- /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 0000000000..4cea86dba6
--- /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 0000000000..6a4508b0c5
--- /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 0000000000..d767e26d68
--- /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 0000000000..fe6928fc8b
--- /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 0000000000..08aee566f1
--- /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 0000000000..b868c438f8
--- /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 0000000000..cc68b6fb49
--- /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 0000000000..c319fba7b3
--- /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 0000000000..b5b4b12f07
--- /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 0000000000..530369d672
--- /dev/null
+++ b/tests/ref/fate/cbs-mpeg2-tcela-6
@@ -0,0 +1 @@
+771b6756a63793e05b74e645794908a2
