From f7423235884da7d8649b844e5c6a7dbe89be98bd Mon Sep 17 00:00:00 2001 From: lordnn Date: Sun, 19 Apr 2026 11:47:32 +0300 Subject: [PATCH 1/3] Optimisation, because `tidx` is a monotonic sequence. Signed-off-by: lordnn --- src/oapv.c | 11 ++++++----- src/oapv_rc.c | 5 +++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/oapv.c b/src/oapv.c index a407e3dd..dce88ab9 100644 --- a/src/oapv.c +++ b/src/oapv.c @@ -931,12 +931,12 @@ static int enc_thread_tile(void *arg) oapve_core_t *core = (oapve_core_t *)arg; oapve_ctx_t *ctx = core->ctx; oapve_tile_t *tile = ctx->tile; - int ret = OAPV_OK, i; + int ret = OAPV_OK, i = 0; while(1) { // find not encoded tile oapv_tpool_enter_cs(ctx->sync_obj); - for(i = 0; i < ctx->num_tiles; i++) { + for( ; i < ctx->num_tiles; ++i) { if(tile[i].stat == ENC_TILE_STAT_NOT_ENCODED) { tile[i].stat = ENC_TILE_STAT_ON_ENCODING; core->tile_idx = i; @@ -953,6 +953,7 @@ static int enc_thread_tile(void *arg) oapv_tpool_enter_cs(ctx->sync_obj); tile[core->tile_idx].stat = ENC_TILE_STAT_ENCODED; + ++i; oapv_tpool_leave_cs(ctx->sync_obj); } ERR: @@ -1718,7 +1719,7 @@ static int dec_tile(oapvd_core_t *core, oapvd_tile_t *tile) static int dec_thread_tile(void *arg) { oapv_bs_t bs; - int i, ret, run, tidx = 0, thread_ret = OAPV_OK; + int i = 0, ret, run, tidx = 0, thread_ret = OAPV_OK; oapvd_core_t *core = (oapvd_core_t *)arg; oapvd_ctx_t *ctx = core->ctx; @@ -1727,7 +1728,7 @@ static int dec_thread_tile(void *arg) while(1) { // find not decoded tile oapv_tpool_enter_cs(ctx->sync_obj); - for(i = 0; i < ctx->num_tiles; i++) { + for( ; i < ctx->num_tiles; ++i) { if(tile[i].stat == DEC_TILE_STAT_NOT_DECODED) { tile[i].stat = DEC_TILE_STAT_ON_DECODING; tidx = i; @@ -1775,7 +1776,7 @@ static int dec_thread_tile(void *arg) tile[tidx].stat = ret; thread_ret = ret; } - tile[tidx].stat = OAPV_SUCCEEDED(ret) ? DEC_TILE_STAT_DECODED : ret; + ++i; oapv_tpool_leave_cs(ctx->sync_obj); } return thread_ret; diff --git a/src/oapv_rc.c b/src/oapv_rc.c index 5f798dbd..849b0d98 100644 --- a/src/oapv_rc.c +++ b/src/oapv_rc.c @@ -60,12 +60,12 @@ int get_tile_cost_thread(void* arg) oapve_core_t* core = (oapve_core_t*)arg; oapve_ctx_t* ctx = core->ctx; oapve_tile_t* tile = ctx->tile; - int tidx = 0, ret = OAPV_OK, i; + int tidx = 0, ret = OAPV_OK, i = 0; while (1) { // find not processed tile oapv_tpool_enter_cs(ctx->sync_obj); - for (i = 0; i < ctx->num_tiles; i++) { + for ( ; i < ctx->num_tiles; ++i) { if (tile[i].stat == ENC_TILE_STAT_NOT_ENCODED) { tile[i].stat = ENC_TILE_STAT_ON_ENCODING; tidx = i; @@ -82,6 +82,7 @@ int get_tile_cost_thread(void* arg) oapv_tpool_enter_cs(ctx->sync_obj); tile[tidx].stat = ENC_TILE_STAT_ENCODED; + ++i; oapv_tpool_leave_cs(ctx->sync_obj); } ERR: From f5e84adfd0bb6a7e7f275f0084412671fa0eaecd Mon Sep 17 00:00:00 2001 From: lordnn Date: Wed, 27 May 2026 23:07:40 +0300 Subject: [PATCH 2/3] Restore processing status. Signed-off-by: lordnn --- src/oapv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/oapv.c b/src/oapv.c index dce88ab9..a1acd94e 100644 --- a/src/oapv.c +++ b/src/oapv.c @@ -1776,6 +1776,7 @@ static int dec_thread_tile(void *arg) tile[tidx].stat = ret; thread_ret = ret; } + tile[tidx].stat = OAPV_SUCCEEDED(ret) ? DEC_TILE_STAT_DECODED : ret; ++i; oapv_tpool_leave_cs(ctx->sync_obj); } From a8d4b56158800f96ac9d5d6df1a70bd6128366da Mon Sep 17 00:00:00 2001 From: lordnn Date: Mon, 29 Jun 2026 01:55:08 +0300 Subject: [PATCH 3/3] Removed search for next unproceeed tile cycle Signed-off-by: lordnn --- src/oapv.c | 32 ++++++++++++++------------------ src/oapv_def.h | 2 ++ src/oapv_rc.c | 16 +++++++--------- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/oapv.c b/src/oapv.c index b8378e3e..71473690 100644 --- a/src/oapv.c +++ b/src/oapv.c @@ -931,20 +931,18 @@ static int enc_thread_tile(void *arg) oapve_core_t *core = (oapve_core_t *)arg; oapve_ctx_t *ctx = core->ctx; oapve_tile_t *tile = ctx->tile; - int ret = OAPV_OK, i = 0; + int ret = OAPV_OK; while(1) { // find not encoded tile oapv_tpool_enter_cs(ctx->sync_obj); - for( ; i < ctx->num_tiles; ++i) { - if(tile[i].stat == ENC_TILE_STAT_NOT_ENCODED) { - tile[i].stat = ENC_TILE_STAT_ON_ENCODING; - core->tile_idx = i; - break; - } + core->tile_idx = ctx->tile_idx; + if (ctx->tile_idx < ctx->num_tiles) { + tile[core->tile_idx].stat = ENC_TILE_STAT_ON_ENCODING; + ++ctx->tile_idx; } oapv_tpool_leave_cs(ctx->sync_obj); - if(i == ctx->num_tiles) { + if(core->tile_idx == ctx->num_tiles) { break; } @@ -953,7 +951,6 @@ static int enc_thread_tile(void *arg) oapv_tpool_enter_cs(ctx->sync_obj); tile[core->tile_idx].stat = ENC_TILE_STAT_ENCODED; - ++i; oapv_tpool_leave_cs(ctx->sync_obj); } ERR: @@ -1157,6 +1154,7 @@ static int enc_frame(oapve_ctx_t *ctx, oapv_bs_t *bs) int parallel_task = (ctx->threads > ctx->num_tiles) ? ctx->num_tiles : ctx->threads; /* encode tiles ************************************/ + ctx->tile_idx = 0; for(tidx = 0; tidx < (parallel_task - 1); tidx++) { tpool->run(ctx->thread_id[tidx], enc_thread_tile, (void *)ctx->core[tidx]); @@ -1723,7 +1721,7 @@ static int dec_tile(oapvd_core_t *core, oapvd_tile_t *tile) static int dec_thread_tile(void *arg) { oapv_bs_t bs; - int i = 0, ret, run, tidx = 0, thread_ret = OAPV_OK; + int ret, run, tidx = 0, thread_ret = OAPV_OK; oapvd_core_t *core = (oapvd_core_t *)arg; oapvd_ctx_t *ctx = core->ctx; @@ -1732,15 +1730,13 @@ static int dec_thread_tile(void *arg) while(1) { // find not decoded tile oapv_tpool_enter_cs(ctx->sync_obj); - for( ; i < ctx->num_tiles; ++i) { - if(tile[i].stat == DEC_TILE_STAT_NOT_DECODED) { - tile[i].stat = DEC_TILE_STAT_ON_DECODING; - tidx = i; - break; - } + tidx = ctx->tile_idx; + if (ctx->tile_idx < ctx->num_tiles) { + tile[tidx].stat = DEC_TILE_STAT_ON_DECODING; + ++ctx->num_tiles; } oapv_tpool_leave_cs(ctx->sync_obj); - if(i == ctx->num_tiles) { + if(tidx == ctx->num_tiles) { break; } @@ -1781,7 +1777,6 @@ static int dec_thread_tile(void *arg) thread_ret = ret; } tile[tidx].stat = OAPV_SUCCEEDED(ret) ? DEC_TILE_STAT_DECODED : ret; - ++i; oapv_tpool_leave_cs(ctx->sync_obj); } return thread_ret; @@ -2008,6 +2003,7 @@ int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid parallel_task = (ctx->threads > ctx->num_tiles) ? ctx->num_tiles : ctx->threads; /* decode tiles ************************************/ + ctx->tile_idx = 0; for(tidx = 0; tidx < (parallel_task - 1); tidx++) { tpool->run(ctx->thread_id[tidx], dec_thread_tile, (void *)ctx->core[tidx]); diff --git a/src/oapv_def.h b/src/oapv_def.h index 3b42b852..c094fb6a 100644 --- a/src/oapv_def.h +++ b/src/oapv_def.h @@ -280,6 +280,7 @@ struct oapve_ctx { oapve_tile_t tile[OAPV_MAX_TILES]; int num_tiles_frms[OAPV_MAX_NUM_FRAMES]; int num_tiles; + int tile_idx; int num_tile_cols; int num_tile_rows; int qp[N_C]; @@ -386,6 +387,7 @@ struct oapvd_ctx { u8 *tile_end; int num_tiles; + int tile_idx; int num_tile_cols; int num_tile_rows; int w; diff --git a/src/oapv_rc.c b/src/oapv_rc.c index 849b0d98..818e5bf8 100644 --- a/src/oapv_rc.c +++ b/src/oapv_rc.c @@ -60,20 +60,18 @@ int get_tile_cost_thread(void* arg) oapve_core_t* core = (oapve_core_t*)arg; oapve_ctx_t* ctx = core->ctx; oapve_tile_t* tile = ctx->tile; - int tidx = 0, ret = OAPV_OK, i = 0; + int tidx = 0, ret = OAPV_OK; while (1) { // find not processed tile oapv_tpool_enter_cs(ctx->sync_obj); - for ( ; i < ctx->num_tiles; ++i) { - if (tile[i].stat == ENC_TILE_STAT_NOT_ENCODED) { - tile[i].stat = ENC_TILE_STAT_ON_ENCODING; - tidx = i; - break; - } + tidx = ctx->tile_idx; + if (ctx->tile_idx < ctx->num_tiles) { + tile[tidx].stat = ENC_TILE_STAT_ON_ENCODING; + ++ctx->tile_idx; } oapv_tpool_leave_cs(ctx->sync_obj); - if (i == ctx->num_tiles) { + if (tidx == ctx->num_tiles) { break; } @@ -82,7 +80,6 @@ int get_tile_cost_thread(void* arg) oapv_tpool_enter_cs(ctx->sync_obj); tile[tidx].stat = ENC_TILE_STAT_ENCODED; - ++i; oapv_tpool_leave_cs(ctx->sync_obj); } ERR: @@ -99,6 +96,7 @@ int oapve_rc_get_tile_cost_thread(oapve_ctx_t* ctx, u64* sum) int parallel_task = (ctx->threads > ctx->num_tiles) ? ctx->num_tiles : ctx->threads; // run new threads + ctx->tile_idx = 0; int tidx = 0; for (tidx = 0; tidx < (parallel_task - 1); tidx++) { tpool->run(ctx->thread_id[tidx], get_tile_cost_thread, (void*)ctx->core[tidx]);