From 3f8b8e4a9793a1066f4d42b59effef9640f4e982 Mon Sep 17 00:00:00 2001 From: "kp5.choi@samsung.com" Date: Tue, 3 Mar 2026 13:33:34 +0900 Subject: [PATCH 1/6] removed unused functions in bsr Signed-off-by: kp5.choi@samsung.com --- app/oapv_app_enc.c | 2 +- src/oapv_bs.c | 76 +--------------------------------------------- src/oapv_bs.h | 3 -- 3 files changed, 2 insertions(+), 79 deletions(-) diff --git a/app/oapv_app_enc.c b/app/oapv_app_enc.c index 09b48c5..92bf71a 100644 --- a/app/oapv_app_enc.c +++ b/app/oapv_app_enc.c @@ -37,7 +37,7 @@ #define MAX_BS_BUF (128 * 1024 * 1024) #define MAX_NUM_FRMS (1) // supports only 1-frame in an access unit #define FRM_IDX (0) // supports only 1-frame in an access unit -#define MAX_NUM_CC (OAPV_MAX_CC) // Max number of color componets (upto 4:4:4:4) +#define MAX_NUM_CC (OAPV_MAX_CC) // Max number of color components (upto 4:4:4:4) typedef enum _STATES { STATE_ENCODING, diff --git a/src/oapv_bs.c b/src/oapv_bs.c index ee43f1b..5ac7a11 100644 --- a/src/oapv_bs.c +++ b/src/oapv_bs.c @@ -35,6 +35,7 @@ // start of encoder code #if ENABLE_ENCODER /////////////////////////////////////////////////////////////////////////////// + /* number of bytes to be sunk */ #define BSW_GET_SINK_BYTE(bs) ((64 - (bs)->leftbits + 7) >> 3) @@ -145,12 +146,6 @@ int oapv_bsw_write(oapv_bs_t *bs, u32 val, int len) #if ENABLE_DECODER /////////////////////////////////////////////////////////////////////////////// -/* Table of count of leading zero for 4 bit value */ -static const u8 tbl_zero_count4[16] = { - 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -// skip code if lefbits are larger than skip bit count; static void inline bsr_skip_code(oapv_bs_t *bs, int size) { oapv_assert(size <= 32); @@ -204,36 +199,6 @@ void oapv_bsr_init(oapv_bs_t *bs, u8 *buf, u32 size, oapv_bs_fn_flush_t fn_flush bs->fn_flush = (fn_flush == NULL) ? bsr_flush : fn_flush; } -int oapv_bsr_clz_in_code(u32 code) -{ - int clz, bits4, shift; - - if(code == 0) - return 64; /* to protect infinite loop */ - - bits4 = 0; - clz = 0; - shift = 56; - - while(bits4 == 0 && shift >= 0) { - bits4 = (code >> shift) & 0xf; - clz += tbl_zero_count4[bits4]; - shift -= 4; - } - return clz; -} - -int oapv_bsr_clz(oapv_bs_t *bs) -{ - int clz; - u32 code; - - code = oapv_bsr_peek(bs, 64); /* supports max 64bit codeword */ - oapv_assert(code != 0); - clz = oapv_bsr_clz_in_code(code); - return clz; -} - void oapv_bsr_align8(oapv_bs_t *bs) { /* @@ -263,45 +228,6 @@ void oapv_bsr_skip(oapv_bs_t *bs, int size) bsr_skip_code(bs, size); } -u32 oapv_bsr_peek(oapv_bs_t *bs, int size) -{ - int byte, leftbits; - u32 code = 0; - - if(bs->leftbits < size) { - byte = (64 - bs->leftbits) >> 3; - - /* We should not check the return value - because this function could be failed at the EOB. */ - if(byte) { - code = bs->code; - leftbits = bs->leftbits; - - bs->fn_flush(bs, byte); - - bs->code >>= leftbits; - bs->code |= code; - bs->leftbits += leftbits; - } - } - - oapv_assert(bs->leftbits <= 64); - - code = bs->code >> (64 - size); - size -= bs->leftbits; - - if(size > 0) { - /* even though we update several bytes, the requested size would be - larger than current bs->leftbits. - In this case, we should read one more byte, but we could not store - the read byte. */ - if(bs->cur < bs->end) { - code |= *(bs->cur) >> (8 - size); - } - } - return code; -} - void *oapv_bsr_sink(oapv_bs_t *bs) { oapv_assert_rv(bs->cur - BSW_GET_SINK_BYTE(bs) < bs->end, NULL); diff --git a/src/oapv_bs.h b/src/oapv_bs.h index c8f3a49..40f1a90 100644 --- a/src/oapv_bs.h +++ b/src/oapv_bs.h @@ -135,11 +135,8 @@ should set zero in that case. */ (bs)->leftbits = 0; void oapv_bsr_init(oapv_bs_t *bs, u8 *buf, u32 size, oapv_bs_fn_flush_t fn_flush); -int oapv_bsr_clz_in_code(u32 code); -int oapv_bsr_clz(oapv_bs_t *bs); void oapv_bsr_align8(oapv_bs_t *bs); void oapv_bsr_skip(oapv_bs_t *bs, int size); -u32 oapv_bsr_peek(oapv_bs_t *bs, int size); void *oapv_bsr_sink(oapv_bs_t *bs); void oapv_bsr_move(oapv_bs_t *bs, u8 *pos); u32 oapv_bsr_read(oapv_bs_t *bs, int size); From 6204e704ef504257baf4b16be45c98781265e807 Mon Sep 17 00:00:00 2001 From: "kp5.choi@samsung.com" Date: Tue, 3 Mar 2026 17:32:12 +0900 Subject: [PATCH 2/6] added protection code in case of large (impossible) k value Signed-off-by: kp5.choi@samsung.com --- src/oapv_vlc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/oapv_vlc.c b/src/oapv_vlc.c index d0ed8ae..d77df15 100644 --- a/src/oapv_vlc.c +++ b/src/oapv_vlc.c @@ -650,6 +650,8 @@ static int dec_vlc_read_kparam0(oapv_bs_t *bs) k++; } } + oapv_assert_rv(k < 32, -1); /* prevent too large (impossible) k value */ + if(k > 0) { symbol += ((u32)0xFFFFFFFF) >> (32 - k); @@ -736,6 +738,9 @@ static int dec_vlc_read(oapv_bs_t *bs, int k) } } } + + oapv_assert_rv(k < 32, -1); /* prevent too large (impossible) k value */ + if(k > 0) { while(bs->leftbits < k) { symbol += bs->code >> (64 - k); @@ -858,6 +863,8 @@ int oapvd_vlc_ac_coef(oapv_bs_t *bs, s16 *coef, int *kparam_ac) run = dec_vlc_read(bs, k_run); } + oapv_assert_rv(run >= 0, OAPV_ERR_MALFORMED_BITSTREAM); + // here, no need to set 'zero-run' in coef; it's already initialized to zero. scan_pos_offset += run; From e6ec3fde5ce5847409efe1abea121694da3567d7 Mon Sep 17 00:00:00 2001 From: "kp5.choi@samsung.com" Date: Tue, 3 Mar 2026 17:59:49 +0900 Subject: [PATCH 3/6] add thread return value Signed-off-by: kp5.choi@samsung.com --- src/oapv.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/oapv.c b/src/oapv.c index 6d29453..14c81ab 100644 --- a/src/oapv.c +++ b/src/oapv.c @@ -1995,7 +1995,7 @@ int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid ret = dec_frm_prepare(ctx, ofrms->frm[frame_cnt].imgb); oapv_assert_g(OAPV_SUCCEEDED(ret), ERR); - int res; + int res, ret_thread; oapv_tpool_t *tpool = ctx->tpool; int parallel_task = 1; int tidx = 0; @@ -2007,11 +2007,11 @@ int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid tpool->run(ctx->thread_id[tidx], dec_thread_tile, (void *)ctx->core[tidx]); } - ret = dec_thread_tile((void *)ctx->core[tidx]); + ret_thread = dec_thread_tile((void *)ctx->core[tidx]); for(tidx = 0; tidx < parallel_task - 1; tidx++) { tpool->join(ctx->thread_id[tidx], &res); if(OAPV_FAILED(res)) { - ret = res; + ret_thread = res; } } /****************************************************/ @@ -2032,6 +2032,8 @@ int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid ofrms->frm[frame_cnt].group_id = pbuh.group_id; stat->frm_size[frame_cnt] = pbu_size + 4 /* byte size of 'pbu_size' syntax */; frame_cnt++; + + oapv_assert_g(OAPV_SUCCEEDED(ret_thread), ERR); } else if(pbuh.pbu_type == OAPV_PBU_TYPE_METADATA) { ret = oapvd_vlc_metadata(bs, pbu_size, mid, pbuh.group_id); From 1489b7761cdbfe3d1a4b045993d780ba09470e5b Mon Sep 17 00:00:00 2001 From: "kp5.choi@samsung.com" Date: Tue, 3 Mar 2026 18:08:44 +0900 Subject: [PATCH 4/6] fixed thread error handling Signed-off-by: kp5.choi@samsung.com --- src/oapv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/oapv.c b/src/oapv.c index 14c81ab..f32b417 100644 --- a/src/oapv.c +++ b/src/oapv.c @@ -2033,7 +2033,7 @@ int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid stat->frm_size[frame_cnt] = pbu_size + 4 /* byte size of 'pbu_size' syntax */; frame_cnt++; - oapv_assert_g(OAPV_SUCCEEDED(ret_thread), ERR); + oapv_assert_gv(OAPV_SUCCEEDED(ret_thread), ret, ret_thread, ERR); } else if(pbuh.pbu_type == OAPV_PBU_TYPE_METADATA) { ret = oapvd_vlc_metadata(bs, pbu_size, mid, pbuh.group_id); From 9e7370c70f9b040e50934a81f3050eb124f18ffe Mon Sep 17 00:00:00 2001 From: "kp5.choi@samsung.com" Date: Wed, 4 Mar 2026 09:51:48 +0900 Subject: [PATCH 5/6] refactoring Signed-off-by: kp5.choi@samsung.com --- src/oapv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/oapv.c b/src/oapv.c index f32b417..78913b6 100644 --- a/src/oapv.c +++ b/src/oapv.c @@ -2025,7 +2025,7 @@ int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid if(ret == OAPV_OK && ctx->use_frm_hash) { oapv_imgb_set_md5(ctx->imgb); } - ret = dec_frm_finish(ctx); // FIX-ME + ret = dec_frm_finish(ctx); oapv_assert_g(OAPV_SUCCEEDED(ret), ERR); ofrms->frm[frame_cnt].pbu_type = pbuh.pbu_type; @@ -2033,6 +2033,7 @@ int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid stat->frm_size[frame_cnt] = pbu_size + 4 /* byte size of 'pbu_size' syntax */; frame_cnt++; + /* here, check return values of each thread */ oapv_assert_gv(OAPV_SUCCEEDED(ret_thread), ret, ret_thread, ERR); } else if(pbuh.pbu_type == OAPV_PBU_TYPE_METADATA) { From c7f217cad9249db422d1ca667f2ea37a6bde203f Mon Sep 17 00:00:00 2001 From: "kp5.choi@samsung.com" Date: Wed, 4 Mar 2026 09:57:30 +0900 Subject: [PATCH 6/6] refactoring Signed-off-by: kp5.choi@samsung.com --- src/oapv_bs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/oapv_bs.c b/src/oapv_bs.c index 5ac7a11..81e7db2 100644 --- a/src/oapv_bs.c +++ b/src/oapv_bs.c @@ -146,7 +146,7 @@ int oapv_bsw_write(oapv_bs_t *bs, u32 val, int len) #if ENABLE_DECODER /////////////////////////////////////////////////////////////////////////////// -static void inline bsr_skip_code(oapv_bs_t *bs, int size) +static inline void bsr_skip_code(oapv_bs_t *bs, int size) { oapv_assert(size <= 32); oapv_assert(bs->leftbits >= size);