From e80f2977c9d5e8680b3569e9dfa57c520748999b Mon Sep 17 00:00:00 2001 From: James Almer Date: Tue, 24 Feb 2026 10:17:12 -0300 Subject: [PATCH 1/3] Fix reading rbsp_trailing_bits() Section 7.3.2.8 from ISO/IEC 23094-1:2020 states a rbsp_stop_one_bit must be present before the zeroes that align to the next byte boundary. Signed-off-by: James Almer --- src_base/xevd_eco.c | 10 ++++++++++ src_main/xevdm_eco.c | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src_base/xevd_eco.c b/src_base/xevd_eco.c index 9d4f2e1..0fe9152 100644 --- a/src_base/xevd_eco.c +++ b/src_base/xevd_eco.c @@ -1382,6 +1382,7 @@ int xevd_eco_sps(XEVD_BSR * bs, XEVD_SPS * sps) } u32 t0; + xevd_bsr_read1(bs, &t0); while (!XEVD_BSR_IS_BYTE_ALIGN(bs)) { xevd_bsr_read1(bs, &t0); @@ -1420,6 +1421,7 @@ int xevd_eco_pps(XEVD_BSR * bs, XEVD_SPS * sps, XEVD_PPS * pps) } u32 t0; + xevd_bsr_read1(bs, &t0); while(!XEVD_BSR_IS_BYTE_ALIGN(bs)) { xevd_bsr_read1(bs, &t0); @@ -1643,6 +1645,14 @@ int xevd_eco_sei(XEVD_CTX * ctx, XEVD_BSR * bs) default: xevd_assert_rv(0, XEVD_ERR_UNEXPECTED); } + + u32 t0; + xevd_bsr_read1(bs, &t0); + while (!XEVD_BSR_IS_BYTE_ALIGN(bs)) + { + xevd_bsr_read1(bs, &t0); + } + #if TRACE_HLS XEVD_TRACE_STR("************ SEI End ************\n"); XEVD_TRACE_STR("***********************************\n"); diff --git a/src_main/xevdm_eco.c b/src_main/xevdm_eco.c index 501b431..46b7bc3 100644 --- a/src_main/xevdm_eco.c +++ b/src_main/xevdm_eco.c @@ -1992,6 +1992,7 @@ int xevdm_eco_sps(XEVD_BSR * bs, XEVD_SPS * sps) if (sps->vui_parameters_present_flag) xevd_eco_vui(bs, &(sps->vui_parameters)); u32 t0; + xevd_bsr_read1(bs, &t0); while (!XEVD_BSR_IS_BYTE_ALIGN(bs)) { xevd_bsr_read1(bs, &t0); @@ -2069,6 +2070,7 @@ int xevdm_eco_pps(XEVD_BSR * bs, XEVD_SPS * sps, XEVD_PPS * pps) pps->cu_qp_delta_area += 6; } u32 t0; + xevd_bsr_read1(bs, &t0); while(!XEVD_BSR_IS_BYTE_ALIGN(bs)) { xevd_bsr_read1(bs, &t0); @@ -2126,6 +2128,7 @@ int xevdm_eco_aps_gen(XEVD_BSR * bs, XEVD_APS_GEN * aps, int bit_depth) } } + xevd_bsr_read1(bs, &t0); while (!XEVD_BSR_IS_BYTE_ALIGN(bs)) { xevd_bsr_read1(bs, &t0); From ae3ac8640546edf5c315376e1676c6261f707895 Mon Sep 17 00:00:00 2001 From: James Almer Date: Tue, 24 Feb 2026 14:30:21 -0300 Subject: [PATCH 2/3] Fix reading byte_alignment() in slice_header Section 7.3.2.9 from ISO/IEC 23094-1:2020 states an alignment_bit_equal_to_one must be present before the zeroes that align to the next byte boundary. Signed-off-by: James Almer --- src_base/xevd_eco.c | 2 ++ src_main/xevdm_eco.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src_base/xevd_eco.c b/src_base/xevd_eco.c index 0fe9152..3c0c8ad 100644 --- a/src_base/xevd_eco.c +++ b/src_base/xevd_eco.c @@ -1569,6 +1569,8 @@ int xevd_eco_sh(XEVD_BSR * bs, XEVD_SPS * sps, XEVD_PPS * pps, XEVD_SH * sh, int /* byte align */ u32 t0; + xevd_bsr_read1(bs, &t0); + xevd_assert_rv(1 == t0, XEVD_ERR_MALFORMED_BITSTREAM); while(!XEVD_BSR_IS_BYTE_ALIGN(bs)) { xevd_bsr_read1(bs, &t0); diff --git a/src_main/xevdm_eco.c b/src_main/xevdm_eco.c index 46b7bc3..a505ade 100644 --- a/src_main/xevdm_eco.c +++ b/src_main/xevdm_eco.c @@ -2799,6 +2799,8 @@ int xevdm_eco_sh(XEVD_BSR * bs, XEVD_SPS * sps, XEVD_PPS * pps, XEVD_SH * sh, XE /* byte align */ u32 t0; + xevd_bsr_read1(bs, &t0); + xevd_assert_rv(1 == t0, XEVD_ERR_MALFORMED_BITSTREAM); while(!XEVD_BSR_IS_BYTE_ALIGN(bs)) { xevd_bsr_read1(bs, &t0); From 1f7a2e79544ecdc71bbb51e938f392e5d00aa5b7 Mon Sep 17 00:00:00 2001 From: James Almer Date: Tue, 24 Feb 2026 16:04:59 -0300 Subject: [PATCH 3/3] Fix reading rbsp_slice_trailing_bits() in slice_layer_rbsp() Section 7.3.2.7 from ISO/IEC 23094-1:2020 states rbsp_trailing_bits() shall be present before any potential cabac_zero_word. Signed-off-by: James Almer --- src_base/xevd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src_base/xevd.c b/src_base/xevd.c index 034aed4..96c1d98 100644 --- a/src_base/xevd.c +++ b/src_base/xevd.c @@ -1446,6 +1446,14 @@ int xevd_tile_eco(void * arg) { xevd_threadsafe_assign(&ctx->sync_row[core->y_lcu], THREAD_TERMINATED); xevd_assert_gv(xevd_eco_tile_end_flag(bs, sbac) == 1, ret, XEVD_ERR, ERR); + u32 t0; + xevd_bsr_read1(bs, &t0); + xevd_assert_gv(1 == t0, ret, XEVD_ERR_MALFORMED_BITSTREAM, ERR); + while (!XEVD_BSR_IS_BYTE_ALIGN(bs)) + { + xevd_bsr_read1(bs, &t0); + xevd_assert_gv(0 == t0, ret, XEVD_ERR_MALFORMED_BITSTREAM, ERR); + } ret = xevd_eco_cabac_zero_word(bs); xevd_assert_g(XEVD_SUCCEEDED(ret), ERR); break;