From 6efaff091f3cb555021bf8466ffc41aa164fd2c2 Mon Sep 17 00:00:00 2001 From: James Almer Date: Mon, 23 Feb 2026 22:28:42 -0300 Subject: [PATCH 1/2] Fix setting Unregistered User Data SEI payload_size The value was being unnecesarly converted to bits, resulting in broken SEI NALUs. Signed-off-by: James Almer --- src_base/xeve_eco.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_base/xeve_eco.c b/src_base/xeve_eco.c index 36b89fd..4267d90 100644 --- a/src_base/xeve_eco.c +++ b/src_base/xeve_eco.c @@ -331,7 +331,7 @@ static void write_sei_userdata_unregistered(XEVE_SEI_PAYLOAD *sei_userdata, XEVE xeve_bsw_write(bs, 0xff, 8); xeve_bsw_write(bs, payload_type, 8); - u32 payload_size = (ISO_IEC_11578_LEN + sei_userdata->payload_size) << 3; + u32 payload_size = ISO_IEC_11578_LEN + sei_userdata->payload_size; for(; payload_size >= 0xff; payload_size -= 0xff) xeve_bsw_write(bs, 0xff, 8); xeve_bsw_write(bs, payload_size, 8); From 6d52a2be0f58c0f2a3bd2ab0a90adb1054cfeedf Mon Sep 17 00:00:00 2001 From: James Almer Date: Mon, 23 Feb 2026 22:27:47 -0300 Subject: [PATCH 2/2] Fix writing rbsp_trailing_bits() Section 7.3.2.8 from ISO/IEC 23094-1:2020 states a rbsp_stop_one_bit must be written, before the zeroes that align to the next byte boundary. Signed-off-by: James Almer --- src_base/xeve_eco.c | 4 ++++ src_main/xevem_eco.c | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src_base/xeve_eco.c b/src_base/xeve_eco.c index 4267d90..fee3ef7 100644 --- a/src_base/xeve_eco.c +++ b/src_base/xeve_eco.c @@ -202,6 +202,7 @@ int xeve_eco_sps(XEVE_BSW *bs, XEVE_SPS *sps) } u32 t0 = 0; + xeve_bsw_write1(bs, 1); while(!XEVE_BSW_IS_BYTE_ALIGN(bs)) { xeve_bsw_write1(bs, t0); } @@ -235,6 +236,7 @@ int xeve_eco_pps(XEVE_BSW *bs, XEVE_SPS *sps, XEVE_PPS *pps) xeve_bsw_write_ue(bs, pps->cu_qp_delta_area - 6); } u32 t0 = 0; + xeve_bsw_write1(bs, 1); while(!XEVE_BSW_IS_BYTE_ALIGN(bs)) { xeve_bsw_write1(bs, t0); } @@ -368,6 +370,7 @@ int xeve_eco_emitsei(XEVE_CTX *ctx, XEVE_BSW *bs) write_sei_userdata_unregistered(&sei_userdata_unregistered, bs); } + xeve_bsw_write1(bs, 1); while(!XEVE_BSW_IS_BYTE_ALIGN(bs)) { xeve_bsw_write1(bs, 0); } @@ -382,6 +385,7 @@ int xeve_eco_sei(XEVE_CTX *ctx, XEVE_BSW *bs) xeve_eco_signature(ctx, bs); } + xeve_bsw_write1(bs, 1); while(!XEVE_BSW_IS_BYTE_ALIGN(bs)) { xeve_bsw_write1(bs, 0); } diff --git a/src_main/xevem_eco.c b/src_main/xevem_eco.c index 228c0de..eccf2c4 100644 --- a/src_main/xevem_eco.c +++ b/src_main/xevem_eco.c @@ -263,6 +263,7 @@ int xevem_eco_aps_gen(XEVE_BSW *bs, XEVE_APS_GEN *aps, int bit_depth) assert(aps_extension_flag == 0); u32 t0 = 0; + xeve_bsw_write1(bs, 1); while(!XEVE_BSW_IS_BYTE_ALIGN(bs)) { xeve_bsw_write1(bs, t0); } @@ -423,6 +424,7 @@ int xevem_eco_sps(XEVE_BSW *bs, XEVE_SPS *sps) } u32 t0 = 0; + xeve_bsw_write1(bs, 1); while(!XEVE_BSW_IS_BYTE_ALIGN(bs)) { xeve_bsw_write1(bs, t0); } @@ -486,6 +488,7 @@ int xevem_eco_pps(XEVE_BSW *bs, XEVE_SPS *sps, XEVE_PPS *pps) xeve_bsw_write_ue(bs, pps->cu_qp_delta_area - 6); } u32 t0 = 0; + xeve_bsw_write1(bs, 1); while(!XEVE_BSW_IS_BYTE_ALIGN(bs)) { xeve_bsw_write1(bs, t0); }