1*abb65b4bSAndroid Build Coastguard Worker /* 2*abb65b4bSAndroid Build Coastguard Worker * Copyright (c) 2022 Samsung Electronics Co., Ltd. 3*abb65b4bSAndroid Build Coastguard Worker * All Rights Reserved. 4*abb65b4bSAndroid Build Coastguard Worker * 5*abb65b4bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*abb65b4bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 7*abb65b4bSAndroid Build Coastguard Worker * 8*abb65b4bSAndroid Build Coastguard Worker * - Redistributions of source code must retain the above copyright notice, 9*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer. 10*abb65b4bSAndroid Build Coastguard Worker * 11*abb65b4bSAndroid Build Coastguard Worker * - Redistributions in binary form must reproduce the above copyright notice, 12*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 13*abb65b4bSAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 14*abb65b4bSAndroid Build Coastguard Worker * 15*abb65b4bSAndroid Build Coastguard Worker * - Neither the name of the copyright owner, nor the names of its contributors 16*abb65b4bSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software 17*abb65b4bSAndroid Build Coastguard Worker * without specific prior written permission. 18*abb65b4bSAndroid Build Coastguard Worker * 19*abb65b4bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20*abb65b4bSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*abb65b4bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*abb65b4bSAndroid Build Coastguard Worker * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23*abb65b4bSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*abb65b4bSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*abb65b4bSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*abb65b4bSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*abb65b4bSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*abb65b4bSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*abb65b4bSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 30*abb65b4bSAndroid Build Coastguard Worker */ 31*abb65b4bSAndroid Build Coastguard Worker 32*abb65b4bSAndroid Build Coastguard Worker #ifndef _OAPV_DEF_H_4738294732894739280473892473829_ 33*abb65b4bSAndroid Build Coastguard Worker #define _OAPV_DEF_H_4738294732894739280473892473829_ 34*abb65b4bSAndroid Build Coastguard Worker 35*abb65b4bSAndroid Build Coastguard Worker #ifndef ENABLE_ENCODER 36*abb65b4bSAndroid Build Coastguard Worker #define ENABLE_ENCODER 1 // for enabling encoder functionality 37*abb65b4bSAndroid Build Coastguard Worker #endif 38*abb65b4bSAndroid Build Coastguard Worker 39*abb65b4bSAndroid Build Coastguard Worker #ifndef ENABLE_DECODER 40*abb65b4bSAndroid Build Coastguard Worker #define ENABLE_DECODER 1 // for enabling decoder functionality 41*abb65b4bSAndroid Build Coastguard Worker #endif 42*abb65b4bSAndroid Build Coastguard Worker 43*abb65b4bSAndroid Build Coastguard Worker #include "oapv.h" 44*abb65b4bSAndroid Build Coastguard Worker #include "oapv_port.h" 45*abb65b4bSAndroid Build Coastguard Worker #include "oapv_tpool.h" 46*abb65b4bSAndroid Build Coastguard Worker 47*abb65b4bSAndroid Build Coastguard Worker /* oapv encoder magic code */ 48*abb65b4bSAndroid Build Coastguard Worker #define OAPVE_MAGIC_CODE 0x41503145 /* AP1E */ 49*abb65b4bSAndroid Build Coastguard Worker 50*abb65b4bSAndroid Build Coastguard Worker /* oapv decoder magic code */ 51*abb65b4bSAndroid Build Coastguard Worker #define OAPVD_MAGIC_CODE 0x41503144 /* AP1D */ 52*abb65b4bSAndroid Build Coastguard Worker 53*abb65b4bSAndroid Build Coastguard Worker /* Max. and min. Quantization parameter */ 54*abb65b4bSAndroid Build Coastguard Worker #define MAX_QUANT 63 55*abb65b4bSAndroid Build Coastguard Worker #define MIN_QUANT 0 56*abb65b4bSAndroid Build Coastguard Worker 57*abb65b4bSAndroid Build Coastguard Worker #define MAX_COST (1.7e+308) /* maximum cost value */ 58*abb65b4bSAndroid Build Coastguard Worker 59*abb65b4bSAndroid Build Coastguard Worker #define Y_C 0 /* Y luma */ 60*abb65b4bSAndroid Build Coastguard Worker #define U_C 1 /* Cb Chroma */ 61*abb65b4bSAndroid Build Coastguard Worker #define V_C 2 /* Cr Chroma */ 62*abb65b4bSAndroid Build Coastguard Worker #define X_C 3 /* X channel */ 63*abb65b4bSAndroid Build Coastguard Worker #define N_C 4 /* maximum number of color component */ 64*abb65b4bSAndroid Build Coastguard Worker 65*abb65b4bSAndroid Build Coastguard Worker #define OAPV_VLC_TREE_LEVEL 2 66*abb65b4bSAndroid Build Coastguard Worker #define OAPV_MIN_DC_LEVEL_CTX 0 67*abb65b4bSAndroid Build Coastguard Worker #define OAPV_MAX_DC_LEVEL_CTX 5 68*abb65b4bSAndroid Build Coastguard Worker #define OAPV_MIN_AC_LEVEL_CTX 0 69*abb65b4bSAndroid Build Coastguard Worker #define OAPV_MAX_AC_LEVEL_CTX 4 70*abb65b4bSAndroid Build Coastguard Worker 71*abb65b4bSAndroid Build Coastguard Worker /* need to check */ 72*abb65b4bSAndroid Build Coastguard Worker #define OAPV_MAX_TILE_ROWS 20 73*abb65b4bSAndroid Build Coastguard Worker #define OAPV_MAX_TILE_COLS 20 74*abb65b4bSAndroid Build Coastguard Worker #define OAPV_MAX_TILES (OAPV_MAX_TILE_ROWS * OAPV_MAX_TILE_COLS) 75*abb65b4bSAndroid Build Coastguard Worker 76*abb65b4bSAndroid Build Coastguard Worker /* Maximum transform dynamic range (excluding sign bit) */ 77*abb65b4bSAndroid Build Coastguard Worker #define MAX_TX_DYNAMIC_RANGE 15 78*abb65b4bSAndroid Build Coastguard Worker #define MAX_TX_VAL ((1 << MAX_TX_DYNAMIC_RANGE) - 1) 79*abb65b4bSAndroid Build Coastguard Worker #define MIN_TX_VAL (-(1 << MAX_TX_DYNAMIC_RANGE)) 80*abb65b4bSAndroid Build Coastguard Worker 81*abb65b4bSAndroid Build Coastguard Worker #define QUANT_SHIFT 14 82*abb65b4bSAndroid Build Coastguard Worker #define QUANT_DQUANT_SHIFT 20 83*abb65b4bSAndroid Build Coastguard Worker 84*abb65b4bSAndroid Build Coastguard Worker /* encoder status */ 85*abb65b4bSAndroid Build Coastguard Worker #define ENC_TILE_STAT_NOT_ENCODED 0 86*abb65b4bSAndroid Build Coastguard Worker #define ENC_TILE_STAT_ON_ENCODING 1 87*abb65b4bSAndroid Build Coastguard Worker #define ENC_TILE_STAT_ENCODED 2 88*abb65b4bSAndroid Build Coastguard Worker 89*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 90*abb65b4bSAndroid Build Coastguard Worker * PBU data structure 91*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 92*abb65b4bSAndroid Build Coastguard Worker typedef struct oapv_pbuh oapv_pbuh_t; 93*abb65b4bSAndroid Build Coastguard Worker struct oapv_pbuh { // 4-byte 94*abb65b4bSAndroid Build Coastguard Worker int pbu_type; /* u( 8) */ 95*abb65b4bSAndroid Build Coastguard Worker int group_id; /* u(16) */ 96*abb65b4bSAndroid Build Coastguard Worker // int reserved_zero_8bits /* u( 8) */ 97*abb65b4bSAndroid Build Coastguard Worker }; 98*abb65b4bSAndroid Build Coastguard Worker 99*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 100*abb65b4bSAndroid Build Coastguard Worker * Frame info 101*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 102*abb65b4bSAndroid Build Coastguard Worker typedef struct oapv_fi oapv_fi_t; 103*abb65b4bSAndroid Build Coastguard Worker struct oapv_fi { // 112byte 104*abb65b4bSAndroid Build Coastguard Worker int profile_idc; /* u( 8) */ 105*abb65b4bSAndroid Build Coastguard Worker int level_idc; /* u( 8) */ 106*abb65b4bSAndroid Build Coastguard Worker int band_idc; /* u( 3) */ 107*abb65b4bSAndroid Build Coastguard Worker // int reserved_zero_5bits; /* u( 5) */ 108*abb65b4bSAndroid Build Coastguard Worker u32 frame_width; /* u(32) */ 109*abb65b4bSAndroid Build Coastguard Worker u32 frame_height; /* u(32) */ 110*abb65b4bSAndroid Build Coastguard Worker int chroma_format_idc; /* u( 4) */ 111*abb65b4bSAndroid Build Coastguard Worker int bit_depth; /* u( 4) */ 112*abb65b4bSAndroid Build Coastguard Worker int capture_time_distance; /* u( 8) */ 113*abb65b4bSAndroid Build Coastguard Worker // int reserved_zero_8bits; /* u( 8) */ 114*abb65b4bSAndroid Build Coastguard Worker }; 115*abb65b4bSAndroid Build Coastguard Worker 116*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 117*abb65b4bSAndroid Build Coastguard Worker * Frame header 118*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 119*abb65b4bSAndroid Build Coastguard Worker typedef struct oapv_fh oapv_fh_t; 120*abb65b4bSAndroid Build Coastguard Worker struct oapv_fh { 121*abb65b4bSAndroid Build Coastguard Worker oapv_fi_t fi; 122*abb65b4bSAndroid Build Coastguard Worker // int reserved_zero_8bits_3; /* u( 8) */ 123*abb65b4bSAndroid Build Coastguard Worker int color_description_present_flag; /* u( 1) */ 124*abb65b4bSAndroid Build Coastguard Worker int color_primaries; /* u( 8) */ 125*abb65b4bSAndroid Build Coastguard Worker int transfer_characteristics; /* u( 8) */ 126*abb65b4bSAndroid Build Coastguard Worker int matrix_coefficients; /* u( 8) */ 127*abb65b4bSAndroid Build Coastguard Worker int use_q_matrix; /* u( 1) */ 128*abb65b4bSAndroid Build Coastguard Worker /* (start) quantization_matix */ 129*abb65b4bSAndroid Build Coastguard Worker int q_matrix[N_C][OAPV_BLK_H][OAPV_BLK_W]; /* u( 8) minus 1*/ 130*abb65b4bSAndroid Build Coastguard Worker /* ( end ) quantization_matix */ 131*abb65b4bSAndroid Build Coastguard Worker /* (start) tile_info */ 132*abb65b4bSAndroid Build Coastguard Worker int tile_width_in_mbs; /* u(28) minus 1*/ 133*abb65b4bSAndroid Build Coastguard Worker int tile_height_in_mbs; /* u(28) minus 1*/ 134*abb65b4bSAndroid Build Coastguard Worker int tile_size_present_in_fh_flag; /* u( 1) */ 135*abb65b4bSAndroid Build Coastguard Worker u32 tile_size[OAPV_MAX_TILES]; /* u(32) */ 136*abb65b4bSAndroid Build Coastguard Worker /* ( end ) tile_info */ 137*abb65b4bSAndroid Build Coastguard Worker // int reserved_zero_8bits_4; /* u( 8) */ 138*abb65b4bSAndroid Build Coastguard Worker }; 139*abb65b4bSAndroid Build Coastguard Worker 140*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 141*abb65b4bSAndroid Build Coastguard Worker * Tile header 142*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 143*abb65b4bSAndroid Build Coastguard Worker #define OAPV_TILE_SIZE_LEN 4 /* u(32), 4byte */ 144*abb65b4bSAndroid Build Coastguard Worker typedef struct oapv_th oapv_th_t; 145*abb65b4bSAndroid Build Coastguard Worker struct oapv_th { 146*abb65b4bSAndroid Build Coastguard Worker int tile_header_size; /* u(16) */ 147*abb65b4bSAndroid Build Coastguard Worker int tile_index; /* u(16) */ 148*abb65b4bSAndroid Build Coastguard Worker u32 tile_data_size[N_C]; /* u(32) */ 149*abb65b4bSAndroid Build Coastguard Worker int tile_qp[N_C]; /* u( 8) */ 150*abb65b4bSAndroid Build Coastguard Worker int reserved_zero_8bits; /* u( 8) */ 151*abb65b4bSAndroid Build Coastguard Worker }; 152*abb65b4bSAndroid Build Coastguard Worker 153*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 154*abb65b4bSAndroid Build Coastguard Worker * Access unit info 155*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 156*abb65b4bSAndroid Build Coastguard Worker typedef struct oapv_aui oapv_aui_t; 157*abb65b4bSAndroid Build Coastguard Worker struct oapv_aui { 158*abb65b4bSAndroid Build Coastguard Worker int num_frames; // u(16) 159*abb65b4bSAndroid Build Coastguard Worker int pbu_type[OAPV_MAX_NUM_FRAMES]; // u(8) 160*abb65b4bSAndroid Build Coastguard Worker int group_id[OAPV_MAX_NUM_FRAMES]; // u(16) 161*abb65b4bSAndroid Build Coastguard Worker // int reserved_zero_8bits[OAPV_MAX_NUM_FRAMES]; // u(8) 162*abb65b4bSAndroid Build Coastguard Worker oapv_fi_t frame_info[OAPV_MAX_NUM_FRAMES]; 163*abb65b4bSAndroid Build Coastguard Worker // int reserved_zero_8bits // u(8) 164*abb65b4bSAndroid Build Coastguard Worker }; 165*abb65b4bSAndroid Build Coastguard Worker 166*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 167*abb65b4bSAndroid Build Coastguard Worker // start of encoder code 168*abb65b4bSAndroid Build Coastguard Worker #if ENABLE_ENCODER 169*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 170*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 171*abb65b4bSAndroid Build Coastguard Worker * pre-declaration 172*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 173*abb65b4bSAndroid Build Coastguard Worker typedef struct oapve_ctx oapve_ctx_t; 174*abb65b4bSAndroid Build Coastguard Worker typedef struct oapve_core oapve_core_t; 175*abb65b4bSAndroid Build Coastguard Worker 176*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 177*abb65b4bSAndroid Build Coastguard Worker * pre-defined function structure 178*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 179*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_itx_part_t)(s16 *coef, s16 *t, int shift, int line); 180*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_itx_t)(s16 *coef, int shift1, int shift2, int line); 181*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_tx_t)(s16 *coef, s16 *t, int shift, int line); 182*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_itx_adj_t)(int *src, int *dst, int itrans_diff_idx, int diff_step, int shift); 183*abb65b4bSAndroid Build Coastguard Worker typedef int (*oapv_fn_quant_t)(s16 *coef, u8 qp, int q_matrix[OAPV_BLK_D], int log2_w, int log2_h, int bit_depth, int deadzone_offset); 184*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_dquant_t)(s16 *coef, s16 q_matrix[OAPV_BLK_D], int log2_w, int log2_h, s8 shift); 185*abb65b4bSAndroid Build Coastguard Worker typedef int (*oapv_fn_sad_t)(int w, int h, void *src1, void *src2, int s_src1, int s_src2, int bit_depth); 186*abb65b4bSAndroid Build Coastguard Worker typedef s64 (*oapv_fn_ssd_t)(int w, int h, void *src1, void *src2, int s_src1, int s_src2, int bit_depth); 187*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_diff_t)(int w, int h, void *src1, void *src2, int s_src1, int s_src2, int s_diff, s16 *diff, int bit_depth); 188*abb65b4bSAndroid Build Coastguard Worker 189*abb65b4bSAndroid Build Coastguard Worker typedef double (*oapv_fn_block_cost_t)(oapve_ctx_t *ctx, oapve_core_t *core, int log2_w, int log2_h, int c); 190*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_imgb_to_block_rc)(oapv_imgb_t *imgb, int c, int x_l, int y_l, int w_l, int h_l, s16 *block); 191*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_imgb_to_block)(void *src, int blk_w, int blk_h, int s_src, int offset_src, int s_dst, void *dst); 192*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_block_to_imgb)(void *src, int blk_w, int blk_h, int s_src, int offset_dst, int s_dst, void *dst); 193*abb65b4bSAndroid Build Coastguard Worker typedef void (*oapv_fn_img_pad)(oapve_ctx_t *ctx, oapv_imgb_t *imgb); 194*abb65b4bSAndroid Build Coastguard Worker typedef int (*oapv_fn_had8x8)(pel *org, int s_org); 195*abb65b4bSAndroid Build Coastguard Worker 196*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 197*abb65b4bSAndroid Build Coastguard Worker * rate-control related 198*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 199*abb65b4bSAndroid Build Coastguard Worker typedef struct oapve_rc_param { 200*abb65b4bSAndroid Build Coastguard Worker double alpha; 201*abb65b4bSAndroid Build Coastguard Worker double beta; 202*abb65b4bSAndroid Build Coastguard Worker 203*abb65b4bSAndroid Build Coastguard Worker int qp; 204*abb65b4bSAndroid Build Coastguard Worker double lambda; 205*abb65b4bSAndroid Build Coastguard Worker double cost; 206*abb65b4bSAndroid Build Coastguard Worker } oapve_rc_param_t; 207*abb65b4bSAndroid Build Coastguard Worker 208*abb65b4bSAndroid Build Coastguard Worker typedef struct oapve_rc_tile { 209*abb65b4bSAndroid Build Coastguard Worker int qp; 210*abb65b4bSAndroid Build Coastguard Worker int target_bits; 211*abb65b4bSAndroid Build Coastguard Worker double lambda; 212*abb65b4bSAndroid Build Coastguard Worker int number_pixel; 213*abb65b4bSAndroid Build Coastguard Worker double cost; 214*abb65b4bSAndroid Build Coastguard Worker int target_bits_left; 215*abb65b4bSAndroid Build Coastguard Worker 216*abb65b4bSAndroid Build Coastguard Worker u64 total_dist; 217*abb65b4bSAndroid Build Coastguard Worker oapve_rc_param_t rc_param; 218*abb65b4bSAndroid Build Coastguard Worker } oapve_rc_tile_t; 219*abb65b4bSAndroid Build Coastguard Worker 220*abb65b4bSAndroid Build Coastguard Worker /***************************************************************************** 221*abb65b4bSAndroid Build Coastguard Worker * CORE information used for encoding process. 222*abb65b4bSAndroid Build Coastguard Worker * 223*abb65b4bSAndroid Build Coastguard Worker * The variables in this structure are very often used in encoding process. 224*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 225*abb65b4bSAndroid Build Coastguard Worker struct oapve_core { 226*abb65b4bSAndroid Build Coastguard Worker ALIGNED_16(s16 coef[OAPV_BLK_D]); 227*abb65b4bSAndroid Build Coastguard Worker ALIGNED_16(s16 coef_rec[OAPV_BLK_D]); 228*abb65b4bSAndroid Build Coastguard Worker oapve_ctx_t *ctx; 229*abb65b4bSAndroid Build Coastguard Worker int prev_dc_ctx[N_C]; 230*abb65b4bSAndroid Build Coastguard Worker int prev_1st_ac_ctx[N_C]; 231*abb65b4bSAndroid Build Coastguard Worker int tile_idx; 232*abb65b4bSAndroid Build Coastguard Worker int prev_dc[N_C]; 233*abb65b4bSAndroid Build Coastguard Worker 234*abb65b4bSAndroid Build Coastguard Worker int qp[N_C]; // QPs for Y, Cb(U), Cr(V) 235*abb65b4bSAndroid Build Coastguard Worker int dq_shift[N_C]; 236*abb65b4bSAndroid Build Coastguard Worker 237*abb65b4bSAndroid Build Coastguard Worker int q_mat_enc[N_C][OAPV_BLK_D]; 238*abb65b4bSAndroid Build Coastguard Worker s16 q_mat_dec[N_C][OAPV_BLK_D]; 239*abb65b4bSAndroid Build Coastguard Worker int thread_idx; 240*abb65b4bSAndroid Build Coastguard Worker /* platform specific data, if needed */ 241*abb65b4bSAndroid Build Coastguard Worker void *pf; 242*abb65b4bSAndroid Build Coastguard Worker }; 243*abb65b4bSAndroid Build Coastguard Worker 244*abb65b4bSAndroid Build Coastguard Worker #include "oapv_bs.h" 245*abb65b4bSAndroid Build Coastguard Worker 246*abb65b4bSAndroid Build Coastguard Worker typedef struct oapve_tile oapve_tile_t; 247*abb65b4bSAndroid Build Coastguard Worker struct oapve_tile { 248*abb65b4bSAndroid Build Coastguard Worker oapv_th_t th; 249*abb65b4bSAndroid Build Coastguard Worker 250*abb65b4bSAndroid Build Coastguard Worker int x; /* x (column) position in a frame in unit of pixel */ 251*abb65b4bSAndroid Build Coastguard Worker int y; /* y (row) position in a frame in unit of pixel */ 252*abb65b4bSAndroid Build Coastguard Worker int w; /* tile width in unit of pixel */ 253*abb65b4bSAndroid Build Coastguard Worker int h; /* tile height in unit of pixel */ 254*abb65b4bSAndroid Build Coastguard Worker u32 tile_size; 255*abb65b4bSAndroid Build Coastguard Worker oapve_rc_tile_t rc; 256*abb65b4bSAndroid Build Coastguard Worker u8 *bs_buf; 257*abb65b4bSAndroid Build Coastguard Worker s32 bs_size; 258*abb65b4bSAndroid Build Coastguard Worker u32 bs_buf_max; 259*abb65b4bSAndroid Build Coastguard Worker volatile s32 stat; 260*abb65b4bSAndroid Build Coastguard Worker }; 261*abb65b4bSAndroid Build Coastguard Worker 262*abb65b4bSAndroid Build Coastguard Worker /****************************************************************************** 263*abb65b4bSAndroid Build Coastguard Worker * CONTEXT used for encoding process. 264*abb65b4bSAndroid Build Coastguard Worker * 265*abb65b4bSAndroid Build Coastguard Worker * All have to be stored are in this structure. 266*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/ 267*abb65b4bSAndroid Build Coastguard Worker struct oapve_ctx { 268*abb65b4bSAndroid Build Coastguard Worker u32 magic; // magic code 269*abb65b4bSAndroid Build Coastguard Worker oapve_t id; // identifier 270*abb65b4bSAndroid Build Coastguard Worker oapve_cdesc_t cdesc; 271*abb65b4bSAndroid Build Coastguard Worker oapv_imgb_t *imgb; 272*abb65b4bSAndroid Build Coastguard Worker oapv_imgb_t *rec; 273*abb65b4bSAndroid Build Coastguard Worker 274*abb65b4bSAndroid Build Coastguard Worker oapve_param_t *param; 275*abb65b4bSAndroid Build Coastguard Worker oapv_fh_t fh; 276*abb65b4bSAndroid Build Coastguard Worker oapve_tile_t tile[OAPV_MAX_TILES]; 277*abb65b4bSAndroid Build Coastguard Worker int num_tiles; 278*abb65b4bSAndroid Build Coastguard Worker int num_tile_cols; 279*abb65b4bSAndroid Build Coastguard Worker int num_tile_rows; 280*abb65b4bSAndroid Build Coastguard Worker int qp[N_C]; 281*abb65b4bSAndroid Build Coastguard Worker int w; 282*abb65b4bSAndroid Build Coastguard Worker int h; 283*abb65b4bSAndroid Build Coastguard Worker int cfi; 284*abb65b4bSAndroid Build Coastguard Worker int num_comp; 285*abb65b4bSAndroid Build Coastguard Worker int bit_depth; 286*abb65b4bSAndroid Build Coastguard Worker int comp_sft[N_C][2]; 287*abb65b4bSAndroid Build Coastguard Worker int log2_block; 288*abb65b4bSAndroid Build Coastguard Worker oapv_tpool_t *tpool; 289*abb65b4bSAndroid Build Coastguard Worker oapv_thread_t thread_id[OAPV_MAX_THREADS]; 290*abb65b4bSAndroid Build Coastguard Worker oapv_sync_obj_t sync_obj; 291*abb65b4bSAndroid Build Coastguard Worker oapve_core_t *core[OAPV_MAX_THREADS]; 292*abb65b4bSAndroid Build Coastguard Worker 293*abb65b4bSAndroid Build Coastguard Worker oapv_bs_t bs; 294*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_itx_part_t *fn_itx_part; 295*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_itx_t *fn_itx; 296*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_itx_adj_t *fn_itx_adj; 297*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_tx_t *fn_txb; 298*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_quant_t *fn_quant; 299*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_dquant_t *fn_dquant; 300*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_sad_t *fn_sad; 301*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_ssd_t *fn_ssd; 302*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_diff_t *fn_diff; 303*abb65b4bSAndroid Build Coastguard Worker oapv_fn_imgb_to_block_rc fn_imgb_to_block_rc; 304*abb65b4bSAndroid Build Coastguard Worker oapv_fn_imgb_to_block fn_imgb_to_block[N_C]; 305*abb65b4bSAndroid Build Coastguard Worker oapv_fn_block_to_imgb fn_block_to_imgb[N_C]; 306*abb65b4bSAndroid Build Coastguard Worker oapv_fn_img_pad fn_img_pad; 307*abb65b4bSAndroid Build Coastguard Worker oapv_fn_block_cost_t fn_block; 308*abb65b4bSAndroid Build Coastguard Worker oapv_fn_had8x8 fn_had8x8; 309*abb65b4bSAndroid Build Coastguard Worker int use_frm_hash; 310*abb65b4bSAndroid Build Coastguard Worker void *tx_tbl; 311*abb65b4bSAndroid Build Coastguard Worker 312*abb65b4bSAndroid Build Coastguard Worker oapve_rc_param_t rc_param; 313*abb65b4bSAndroid Build Coastguard Worker 314*abb65b4bSAndroid Build Coastguard Worker /* platform specific data, if needed */ 315*abb65b4bSAndroid Build Coastguard Worker void *pf; 316*abb65b4bSAndroid Build Coastguard Worker }; 317*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 318*abb65b4bSAndroid Build Coastguard Worker // end of encoder code 319*abb65b4bSAndroid Build Coastguard Worker #endif // ENABLE_ENCODER 320*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 321*abb65b4bSAndroid Build Coastguard Worker 322*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 323*abb65b4bSAndroid Build Coastguard Worker // start of decoder code 324*abb65b4bSAndroid Build Coastguard Worker #if ENABLE_DECODER 325*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 326*abb65b4bSAndroid Build Coastguard Worker #define DEC_TILE_STAT_NOT_DECODED 0 327*abb65b4bSAndroid Build Coastguard Worker #define DEC_TILE_STAT_ON_DECODING 1 328*abb65b4bSAndroid Build Coastguard Worker #define DEC_TILE_STAT_DECODED 2 329*abb65b4bSAndroid Build Coastguard Worker #define DEC_TILE_STAT_SIZE_ERROR -1 330*abb65b4bSAndroid Build Coastguard Worker 331*abb65b4bSAndroid Build Coastguard Worker typedef struct oapvd_tile oapvd_tile_t; 332*abb65b4bSAndroid Build Coastguard Worker struct oapvd_tile { 333*abb65b4bSAndroid Build Coastguard Worker oapv_th_t th; 334*abb65b4bSAndroid Build Coastguard Worker 335*abb65b4bSAndroid Build Coastguard Worker int x; /* x (column) position in a frame in unit of pixel */ 336*abb65b4bSAndroid Build Coastguard Worker int y; /* y (row) position in a frame in unit of pixel */ 337*abb65b4bSAndroid Build Coastguard Worker int w; /* tile width in unit of pixel */ 338*abb65b4bSAndroid Build Coastguard Worker int h; /* tile height in unit of pixel */ 339*abb65b4bSAndroid Build Coastguard Worker u32 data_size; /* tile size including tile_size_minus1 syntax */ 340*abb65b4bSAndroid Build Coastguard Worker 341*abb65b4bSAndroid Build Coastguard Worker u8 *bs_beg; /* start position of tile in input bistream */ 342*abb65b4bSAndroid Build Coastguard Worker u8 *bs_end; /* end position of tile() in input bistream */ 343*abb65b4bSAndroid Build Coastguard Worker volatile s32 stat; // decoding status 344*abb65b4bSAndroid Build Coastguard Worker }; 345*abb65b4bSAndroid Build Coastguard Worker 346*abb65b4bSAndroid Build Coastguard Worker typedef struct oapvd_core oapvd_core_t; 347*abb65b4bSAndroid Build Coastguard Worker typedef struct oapvd_ctx oapvd_ctx_t; 348*abb65b4bSAndroid Build Coastguard Worker 349*abb65b4bSAndroid Build Coastguard Worker struct oapvd_core { 350*abb65b4bSAndroid Build Coastguard Worker ALIGNED_16(s16 coef[OAPV_MB_D]); 351*abb65b4bSAndroid Build Coastguard Worker oapvd_ctx_t *ctx; 352*abb65b4bSAndroid Build Coastguard Worker 353*abb65b4bSAndroid Build Coastguard Worker int prev_dc_ctx[N_C]; 354*abb65b4bSAndroid Build Coastguard Worker int prev_1st_ac_ctx[N_C]; 355*abb65b4bSAndroid Build Coastguard Worker int prev_dc[N_C]; 356*abb65b4bSAndroid Build Coastguard Worker int qp[N_C]; 357*abb65b4bSAndroid Build Coastguard Worker int dq_shift[N_C]; 358*abb65b4bSAndroid Build Coastguard Worker s16 q_mat[N_C][OAPV_BLK_D]; 359*abb65b4bSAndroid Build Coastguard Worker 360*abb65b4bSAndroid Build Coastguard Worker int tile_idx; 361*abb65b4bSAndroid Build Coastguard Worker 362*abb65b4bSAndroid Build Coastguard Worker /* platform specific data, if needed */ 363*abb65b4bSAndroid Build Coastguard Worker void *pf; 364*abb65b4bSAndroid Build Coastguard Worker }; 365*abb65b4bSAndroid Build Coastguard Worker 366*abb65b4bSAndroid Build Coastguard Worker struct oapvd_ctx { 367*abb65b4bSAndroid Build Coastguard Worker u32 magic; // magic code 368*abb65b4bSAndroid Build Coastguard Worker oapvd_t id; // identifier 369*abb65b4bSAndroid Build Coastguard Worker 370*abb65b4bSAndroid Build Coastguard Worker oapvd_cdesc_t cdesc; 371*abb65b4bSAndroid Build Coastguard Worker oapvd_core_t *core[OAPV_MAX_THREADS]; 372*abb65b4bSAndroid Build Coastguard Worker oapv_imgb_t *imgb; 373*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_itx_t *fn_itx; 374*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_dquant_t *fn_dquant; 375*abb65b4bSAndroid Build Coastguard Worker oapv_fn_block_to_imgb fn_block_to_imgb[N_C]; 376*abb65b4bSAndroid Build Coastguard Worker oapv_bs_t bs; 377*abb65b4bSAndroid Build Coastguard Worker 378*abb65b4bSAndroid Build Coastguard Worker oapv_fh_t fh; 379*abb65b4bSAndroid Build Coastguard Worker oapvd_tile_t tile[OAPV_MAX_TILES]; 380*abb65b4bSAndroid Build Coastguard Worker 381*abb65b4bSAndroid Build Coastguard Worker u8 *tile_end; 382*abb65b4bSAndroid Build Coastguard Worker int num_tiles; 383*abb65b4bSAndroid Build Coastguard Worker int num_tile_cols; 384*abb65b4bSAndroid Build Coastguard Worker int num_tile_rows; 385*abb65b4bSAndroid Build Coastguard Worker int w; 386*abb65b4bSAndroid Build Coastguard Worker int h; 387*abb65b4bSAndroid Build Coastguard Worker oapv_tpool_t *tpool; 388*abb65b4bSAndroid Build Coastguard Worker oapv_thread_t thread_id[OAPV_MAX_THREADS]; 389*abb65b4bSAndroid Build Coastguard Worker oapv_sync_obj_t sync_obj; 390*abb65b4bSAndroid Build Coastguard Worker int cfi; // chroma format indicator 391*abb65b4bSAndroid Build Coastguard Worker int bit_depth; // bit depth of decoding picture 392*abb65b4bSAndroid Build Coastguard Worker int num_comp; // number of components 393*abb65b4bSAndroid Build Coastguard Worker int comp_sft[N_C][2]; // width or height shift value of each compoents, 0: width, 1: height 394*abb65b4bSAndroid Build Coastguard Worker int use_frm_hash; 395*abb65b4bSAndroid Build Coastguard Worker 396*abb65b4bSAndroid Build Coastguard Worker /* platform specific data, if needed */ 397*abb65b4bSAndroid Build Coastguard Worker void *pf; 398*abb65b4bSAndroid Build Coastguard Worker }; 399*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 400*abb65b4bSAndroid Build Coastguard Worker // end of decoder code 401*abb65b4bSAndroid Build Coastguard Worker #endif // ENABLE_DECODER 402*abb65b4bSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 403*abb65b4bSAndroid Build Coastguard Worker 404*abb65b4bSAndroid Build Coastguard Worker #define OAPV_FRAME_INFO_BYTE (112) 405*abb65b4bSAndroid Build Coastguard Worker #define OAPV_PBU_HEADER_BYTE (32) 406*abb65b4bSAndroid Build Coastguard Worker 407*abb65b4bSAndroid Build Coastguard Worker #include "oapv_metadata.h" 408*abb65b4bSAndroid Build Coastguard Worker #include "oapv_vlc.h" 409*abb65b4bSAndroid Build Coastguard Worker #include "oapv_tq.h" 410*abb65b4bSAndroid Build Coastguard Worker #include "oapv_util.h" 411*abb65b4bSAndroid Build Coastguard Worker #include "oapv_tbl.h" 412*abb65b4bSAndroid Build Coastguard Worker #include "oapv_rc.h" 413*abb65b4bSAndroid Build Coastguard Worker #include "oapv_sad.h" 414*abb65b4bSAndroid Build Coastguard Worker 415*abb65b4bSAndroid Build Coastguard Worker #if X86_SSE 416*abb65b4bSAndroid Build Coastguard Worker #include "sse/oapv_sad_sse.h" 417*abb65b4bSAndroid Build Coastguard Worker #include "sse/oapv_tq_sse.h" 418*abb65b4bSAndroid Build Coastguard Worker #include "avx/oapv_sad_avx.h" 419*abb65b4bSAndroid Build Coastguard Worker #include "avx/oapv_tq_avx.h" 420*abb65b4bSAndroid Build Coastguard Worker #elif ARM_NEON 421*abb65b4bSAndroid Build Coastguard Worker #include "neon/oapv_sad_neon.h" 422*abb65b4bSAndroid Build Coastguard Worker #include "neon/oapv_tq_neon.h" 423*abb65b4bSAndroid Build Coastguard Worker #endif 424*abb65b4bSAndroid Build Coastguard Worker 425*abb65b4bSAndroid Build Coastguard Worker #endif /* _OAPV_DEF_H_4738294732894739280473892473829_ */ 426