Skip to content

Commit 28254c5

Browse files
author
openapv
authored
Merge pull request #6 from openapv/refactor_reducing_global_functions
reduced number of global functions and refactored metadata code
2 parents f49023e + 2562a32 commit 28254c5

File tree

8 files changed

+291
-470
lines changed

8 files changed

+291
-470
lines changed

src/oapv.c

Lines changed: 126 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,6 @@ static void copy_fi_to_finfo(oapv_fi_t* fi, int pbu_type, int group_id, oapv_frm
204204
#if ENABLE_ENCODER
205205
///////////////////////////////////////////////////////////////////////////////
206206

207-
double enc_block(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int log2_block,int c);
208-
double enc_block_rdo(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int log2_block, int c);
209-
210207
static oapve_ctx_t * enc_id_to_ctx(oapve_t id)
211208
{
212209
oapve_ctx_t *ctx;
@@ -283,6 +280,129 @@ static int set_tile_info(oapv_tile_info_t* ti, int pic_w, int pic_h, int tile_w,
283280
return 0;
284281
}
285282

283+
284+
static double enc_block(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int log2_block, int c)
285+
{
286+
int b_w = 1 << log2_block;
287+
int b_h = 1 << log2_block;
288+
int bit_depth = OAPV_CS_GET_BIT_DEPTH(ctx->imgb->cs);
289+
int nnz = 0;
290+
int qp = ctx->th[core->tile_idx].tile_qp[c];
291+
int qscale = oapv_quant_scale[qp % 6];
292+
293+
ctx->fn_imgb_to_block(ctx->imgb, c, x, y, b_w, b_h, core->coef);
294+
enc_minus_mid_val(core->coef, b_w, b_h, bit_depth);
295+
296+
oapv_trans(ctx, core->coef, log2_block, log2_block, bit_depth);
297+
(ctx->fn_quantb)[0](qp, core->q_matrix_enc[c], core->coef, log2_block, log2_block, qscale, c, bit_depth, c ? 128 : 212);
298+
299+
int tmp_dc = core->prev_dc[c];
300+
core->prev_dc[c] = core->coef[0];
301+
core->coef[0] = core->coef[0] - tmp_dc;
302+
303+
if (ctx->param->is_rec)
304+
{
305+
ALIGNED_16(s16 coef_temp[OAPV_BLOCK_D]);
306+
oapv_mcpy(coef_temp, core->coef, sizeof(s16) * OAPV_BLOCK_D);
307+
int dqscale = oapv_tbl_dq_scale[qp % 6];
308+
coef_temp[0] = coef_temp[0] + tmp_dc;
309+
oapv_itdq_block(ctx->fn_itx, ctx->fn_iquant, core->q_matrix_dec[c], coef_temp, log2_block, log2_block, dqscale, bit_depth, qp);
310+
311+
oapv_plus_mid_val(coef_temp, b_w, b_h, bit_depth);
312+
/*store recon*/
313+
ctx->fn_block_to_imgb(coef_temp, c, x, y, (b_w), (b_h), ctx->rec);
314+
}
315+
316+
return 0;
317+
}
318+
319+
static double enc_block_rdo(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int log2_block, int c)
320+
{
321+
oapv_bs_t* bs = &ctx->bs_thread[core->thread_idx];
322+
int b_w = 1 << log2_block;
323+
int b_h = 1 << log2_block;
324+
int bit_depth = OAPV_CS_GET_BIT_DEPTH(ctx->imgb->cs);
325+
int nnz;
326+
double cost;
327+
int qp = ctx->th[core->tile_idx].tile_qp[c];
328+
329+
s16 best_coeff[OAPV_BLOCK_D];
330+
s16 best_recon[OAPV_BLOCK_D];
331+
s16 recon[OAPV_BLOCK_D];
332+
s16 coeff[OAPV_BLOCK_D];
333+
double best_cost = MAX_COST;
334+
335+
double lambda = 0.57 * pow(2.0, ((double)(ctx->param->qp - 12)) / 3.0);
336+
lambda = c ? lambda / pow(2.0, (-2) / 2.0) : lambda;
337+
338+
ctx->fn_imgb_to_block(ctx->imgb, c, x, y, b_w, b_h, core->coef);
339+
enc_minus_mid_val(core->coef, b_w, b_h, bit_depth);
340+
oapv_trans(ctx, core->coef, log2_block, log2_block, bit_depth);
341+
342+
int qscale = oapv_quant_scale[qp % 6];
343+
344+
int prev_dc = core->prev_dc[c];
345+
int best_prev_dc = 0;
346+
347+
int stored_dc_ctx = core->prev_dc_ctx[c];
348+
int stored_1st_ac_ctx = core->prev_1st_ac_ctx[c];
349+
350+
int min_val = c ? 154 : 100;
351+
int max_val = c ? 154 : 220;
352+
int step = 15;
353+
354+
for (int dz = min_val; dz <= max_val; dz += step)
355+
{
356+
core->prev_dc_ctx[c] = stored_dc_ctx;
357+
core->prev_1st_ac_ctx[c] = stored_1st_ac_ctx;
358+
359+
oapv_mcpy(coeff, core->coef, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
360+
361+
nnz = (ctx->fn_quantb)[0](qp, core->q_matrix_enc[c], coeff, log2_block, log2_block, qscale, c, bit_depth, dz);
362+
363+
prev_dc = core->prev_dc[c];
364+
int tmp_dc = prev_dc;
365+
prev_dc = coeff[0];
366+
coeff[0] = coeff[0] - tmp_dc;
367+
368+
bs->is_bin_count = 1;
369+
bs->bin_count = 0;
370+
oapve_vlc_run_length_cc(ctx, core, bs, coeff, log2_block, log2_block, nnz, c);
371+
bs->is_bin_count = 0;
372+
373+
oapv_mcpy(recon, coeff, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
374+
375+
int dqscale = oapv_tbl_dq_scale[qp % 6];
376+
recon[0] = recon[0] + tmp_dc;
377+
378+
oapv_itdq_block(ctx->fn_itx, ctx->fn_iquant, core->q_matrix_dec[c], recon, log2_block, log2_block, dqscale, bit_depth, qp);
379+
380+
oapv_plus_mid_val(recon, b_w, b_h, bit_depth);
381+
s16* org = (s16*)((u8*)ctx->imgb->a[c] + ((y >> (c ? ctx->ch_sft_h : 0)) * ctx->imgb->s[c]) + ((x >> (c ? ctx->ch_sft_w : 0)) * 2));
382+
int dist = (int)oapv_ssd(log2_block, log2_block, org, recon, (ctx->imgb->s[c] >> 1), b_w, 10);
383+
cost = lambda * bs->bin_count + dist;
384+
385+
if (cost < best_cost)
386+
{
387+
best_cost = cost;
388+
oapv_mcpy(best_coeff, coeff, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
389+
oapv_mcpy(best_recon, recon, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
390+
best_prev_dc = prev_dc;
391+
}
392+
}
393+
core->prev_dc[c] = best_prev_dc;
394+
core->prev_dc_ctx[c] = stored_dc_ctx;
395+
core->prev_1st_ac_ctx[c] = stored_1st_ac_ctx;
396+
oapv_mcpy(core->coef, best_coeff, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
397+
398+
if (ctx->param->is_rec)
399+
{
400+
/*store recon*/
401+
ctx->fn_block_to_imgb(best_recon, c, x, y, (b_w), (b_h), ctx->rec);
402+
}
403+
return best_cost;
404+
}
405+
286406
static int enc_init_param(oapve_ctx_t *ctx, oapve_param_t *param)
287407
{
288408
/* check input parameters */
@@ -427,129 +547,7 @@ static int enc_ready(oapve_ctx_t *ctx)
427547
return ret;
428548
}
429549

430-
double enc_block(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int log2_block, int c)
431-
{
432-
int b_w = 1 << log2_block;
433-
int b_h = 1 << log2_block;
434-
int bit_depth = OAPV_CS_GET_BIT_DEPTH(ctx->imgb->cs);
435-
int nnz = 0;
436-
int qp = ctx->th[core->tile_idx].tile_qp[c];
437-
int qscale = oapv_quant_scale[qp % 6];
438-
439-
ctx->fn_imgb_to_block(ctx->imgb, c, x, y, b_w, b_h, core->coef);
440-
enc_minus_mid_val(core->coef, b_w, b_h, bit_depth);
441-
442-
oapv_trans(ctx, core->coef, log2_block, log2_block, bit_depth);
443-
(ctx->fn_quantb)[0](qp, core->q_matrix_enc[c], core->coef, log2_block, log2_block, qscale, c, bit_depth, c ? 128 : 212);
444-
445-
int tmp_dc = core->prev_dc[c];
446-
core->prev_dc[c] = core->coef[0];
447-
core->coef[0] = core->coef[0] - tmp_dc;
448-
449-
if (ctx->param->is_rec)
450-
{
451-
ALIGNED_16(s16 coef_temp[OAPV_BLOCK_D]);
452-
oapv_mcpy(coef_temp, core->coef, sizeof(s16) * OAPV_BLOCK_D);
453-
int dqscale = oapv_tbl_dq_scale[qp % 6];
454-
coef_temp[0] = coef_temp[0] + tmp_dc;
455-
oapv_itdq_block(ctx->fn_itx, ctx->fn_iquant, core->q_matrix_dec[c], coef_temp, log2_block, log2_block, dqscale, bit_depth, qp);
456-
457-
oapv_plus_mid_val(coef_temp, b_w, b_h, bit_depth);
458-
/*store recon*/
459-
ctx->fn_block_to_imgb(coef_temp, c, x, y, (b_w), (b_h), ctx->rec);
460-
}
461-
462-
return 0;
463-
}
464-
465-
double enc_block_rdo(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int log2_block, int c)
466-
{
467-
oapv_bs_t* bs = &ctx->bs_thread[core->thread_idx];
468-
int b_w = 1 << log2_block;
469-
int b_h = 1 << log2_block;
470-
int bit_depth = OAPV_CS_GET_BIT_DEPTH(ctx->imgb->cs);
471-
int nnz;
472-
double cost;
473-
int qp = ctx->th[core->tile_idx].tile_qp[c];
474-
475-
s16 best_coeff[OAPV_BLOCK_D];
476-
s16 best_recon[OAPV_BLOCK_D];
477-
s16 recon[OAPV_BLOCK_D];
478-
s16 coeff[OAPV_BLOCK_D];
479-
double best_cost = MAX_COST;
480-
481-
double lambda = 0.57 * pow(2.0, ((double)(ctx->param->qp - 12)) / 3.0);
482-
lambda = c ? lambda / pow(2.0, (-2) / 2.0) : lambda;
483-
484-
ctx->fn_imgb_to_block(ctx->imgb, c, x, y, b_w, b_h, core->coef);
485-
enc_minus_mid_val(core->coef, b_w, b_h, bit_depth);
486-
oapv_trans(ctx, core->coef, log2_block, log2_block, bit_depth);
487-
488-
int qscale = oapv_quant_scale[qp % 6];
489-
490-
int prev_dc = core->prev_dc[c];
491-
int best_prev_dc = 0;
492-
493-
int stored_dc_ctx = core->prev_dc_ctx[c];
494-
int stored_1st_ac_ctx = core->prev_1st_ac_ctx[c];
495-
496-
int min_val = c ? 154 : 100;
497-
int max_val = c ? 154 : 220;
498-
int step = 15;
499-
500-
for (int dz = min_val; dz <= max_val; dz += step)
501-
{
502-
core->prev_dc_ctx[c] = stored_dc_ctx;
503-
core->prev_1st_ac_ctx[c] = stored_1st_ac_ctx;
504-
505-
oapv_mcpy(coeff, core->coef, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
506-
507-
nnz = (ctx->fn_quantb)[0](qp, core->q_matrix_enc[c], coeff, log2_block, log2_block, qscale, c, bit_depth, dz);
508-
509-
prev_dc = core->prev_dc[c];
510-
int tmp_dc = prev_dc;
511-
prev_dc = coeff[0];
512-
coeff[0] = coeff[0] - tmp_dc;
513-
514-
bs->is_bin_count = 1;
515-
bs->bin_count = 0;
516-
oapve_vlc_run_length_cc(ctx, core, bs, coeff, log2_block, log2_block, nnz, c);
517-
bs->is_bin_count = 0;
518-
519-
oapv_mcpy(recon, coeff, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
520-
521-
int dqscale = oapv_tbl_dq_scale[qp % 6];
522-
recon[0] = recon[0] + tmp_dc;
523-
524-
oapv_itdq_block(ctx->fn_itx, ctx->fn_iquant, core->q_matrix_dec[c], recon, log2_block, log2_block, dqscale, bit_depth, qp);
525-
526-
oapv_plus_mid_val(recon, b_w, b_h, bit_depth);
527-
s16* org = (s16*)((u8*)ctx->imgb->a[c] + ((y >> (c ? ctx->ch_sft_h : 0)) * ctx->imgb->s[c]) + ((x >> (c ? ctx->ch_sft_w : 0)) * 2));
528-
int dist = (int)oapv_ssd(log2_block, log2_block, org, recon, (ctx->imgb->s[c] >> 1), b_w, 10);
529-
cost = lambda * bs->bin_count + dist;
530-
531-
if (cost < best_cost)
532-
{
533-
best_cost = cost;
534-
oapv_mcpy(best_coeff, coeff, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
535-
oapv_mcpy(best_recon, recon, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
536-
best_prev_dc = prev_dc;
537-
}
538-
}
539-
core->prev_dc[c] = best_prev_dc;
540-
core->prev_dc_ctx[c] = stored_dc_ctx;
541-
core->prev_1st_ac_ctx[c] = stored_1st_ac_ctx;
542-
oapv_mcpy(core->coef, best_coeff, sizeof(s16) * ((u64)1 << (log2_block + log2_block)));
543-
544-
if (ctx->param->is_rec)
545-
{
546-
/*store recon*/
547-
ctx->fn_block_to_imgb(best_recon, c, x, y, (b_w), (b_h), ctx->rec);
548-
}
549-
return best_cost;
550-
}
551-
552-
int enc_vlc_tile(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int tile_idx, int c)
550+
static int enc_vlc_tile(oapve_ctx_t* ctx, oapve_core_t* core, int x, int y, int tile_idx, int c)
553551
{
554552
oapv_bs_t* bs = &ctx->bs_thread[core->thread_idx];
555553
int mb_h, mb_w, b_h, b_w;
@@ -1151,7 +1149,7 @@ int oapve_encode(oapve_t eid, oapv_frms_t* ifrms, oapvm_t mid, oapv_bitb_t* bitb
11511149
}
11521150
}
11531151

1154-
oapv_md_info_list_t* md_list = mid;
1152+
oapvm_ctx_t* md_list = mid;
11551153
if (md_list!=NULL)
11561154
{
11571155
int num_md = md_list->num;
@@ -1361,7 +1359,7 @@ static int dec_finish(oapvd_ctx_t *ctx)
13611359
return OAPV_OK;
13621360
}
13631361

1364-
int dec_tile_comp(oapvd_ctx_t* ctx, oapvd_core_t* core, oapv_bs_t* bs, int x, int y, int tile_idx, int c)
1362+
static int dec_tile_comp(oapvd_ctx_t* ctx, oapvd_core_t* core, oapv_bs_t* bs, int x, int y, int tile_idx, int c)
13651363
{
13661364
int mb_h, mb_w, b_h, b_w;
13671365
int ret;

src/oapv_def.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@
4444
#include "oapv.h"
4545
#include "oapv_port.h"
4646
#include "oapv_tpool.h"
47-
#include <inttypes.h>
48-
#include <stdio.h>
4947

5048
#define OAPV_VLC_TREE_LEVEL 2
5149
#define OAPV_MIN_DC_LEVEL_CTX 0
@@ -246,9 +244,6 @@ struct oapv_aui
246244
*****************************************************************************/
247245
typedef struct oapve_ctx oapve_ctx_t;
248246
typedef struct oapve_core oapve_core_t;
249-
typedef struct oapv_md_info_list oapv_md_info_list_t;
250-
typedef struct oapv_md oapv_md_t;
251-
typedef struct oapv_mdp oapv_mdp_t;
252247

253248
/*****************************************************************************
254249
* pre-defined function structure

0 commit comments

Comments
 (0)