@@ -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-
210207static 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+
286406static 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 ;
0 commit comments