| /* |
| * Copyright (c) 2022 Samsung Electronics Co., Ltd. |
| * All Rights Reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * - Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * - Neither the name of the copyright owner, nor the names of its contributors |
| * may be used to endorse or promote products derived from this software |
| * without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifndef _OAPV_DEF_H_4738294732894739280473892473829_ |
| #define _OAPV_DEF_H_4738294732894739280473892473829_ |
| |
| #ifndef ENABLE_ENCODER |
| #define ENABLE_ENCODER 1 // for enabling encoder functionality |
| #endif |
| |
| #ifndef ENABLE_DECODER |
| #define ENABLE_DECODER 1 // for enabling decoder functionality |
| #endif |
| |
| #include "oapv.h" |
| #include "oapv_port.h" |
| #include "oapv_tpool.h" |
| |
| /* oapv encoder magic code */ |
| #define OAPVE_MAGIC_CODE 0x41503145 /* AP1E */ |
| |
| /* oapv decoder magic code */ |
| #define OAPVD_MAGIC_CODE 0x41503144 /* AP1D */ |
| |
| /* Max. and min. Quantization parameter */ |
| #define MAX_QUANT(BD) (63 + ((BD-10)*6)) |
| #define MIN_QUANT 0 |
| |
| #define MAX_COST (1.7e+308) /* maximum cost value */ |
| |
| #define Y_C 0 /* Y luma */ |
| #define U_C 1 /* Cb Chroma */ |
| #define V_C 2 /* Cr Chroma */ |
| #define X_C 3 /* X channel */ |
| #define N_C 4 /* maximum number of color component */ |
| |
| #define OAPV_VLC_TREE_LEVEL 2 |
| #define OAPV_MIN_DC_LEVEL_CTX 0 |
| #define OAPV_MAX_DC_LEVEL_CTX 5 |
| #define OAPV_MIN_AC_LEVEL_CTX 0 |
| #define OAPV_MAX_AC_LEVEL_CTX 4 |
| |
| /* Maximum transform dynamic range (excluding sign bit) */ |
| #define MAX_TX_DYNAMIC_RANGE 15 |
| #define MAX_TX_VAL ((1 << MAX_TX_DYNAMIC_RANGE) - 1) |
| #define MIN_TX_VAL (-(1 << MAX_TX_DYNAMIC_RANGE)) |
| |
| #define QUANT_SHIFT 14 |
| #define QUANT_DQUANT_SHIFT 20 |
| |
| /* encoder status */ |
| #define ENC_TILE_STAT_NOT_ENCODED 0 |
| #define ENC_TILE_STAT_ON_ENCODING 1 |
| #define ENC_TILE_STAT_ENCODED 2 |
| |
| /***************************************************************************** |
| * PBU data structure |
| *****************************************************************************/ |
| typedef struct oapv_pbuh oapv_pbuh_t; |
| struct oapv_pbuh { // 4-byte |
| int pbu_type; /* u( 8) */ |
| int group_id; /* u(16) */ |
| // int reserved_zero_8bits /* u( 8) */ |
| }; |
| |
| /***************************************************************************** |
| * Frame info |
| *****************************************************************************/ |
| typedef struct oapv_fi oapv_fi_t; |
| struct oapv_fi { // 112byte |
| int profile_idc; /* u( 8) */ |
| int level_idc; /* u( 8) */ |
| int band_idc; /* u( 3) */ |
| // int reserved_zero_5bits; /* u( 5) */ |
| u32 frame_width; /* u(24) */ |
| u32 frame_height; /* u(24) */ |
| int chroma_format_idc; /* u( 4) */ |
| int bit_depth; /* u( 4) */ |
| int capture_time_distance; /* u( 8) */ |
| // int reserved_zero_8bits; /* u( 8) */ |
| }; |
| |
| /***************************************************************************** |
| * Frame header |
| *****************************************************************************/ |
| typedef struct oapv_fh oapv_fh_t; |
| struct oapv_fh { |
| oapv_fi_t fi; |
| // int reserved_zero_8bits_3; /* u( 8) */ |
| int color_description_present_flag; /* u( 1) */ |
| int color_primaries; /* u( 8) */ |
| int transfer_characteristics; /* u( 8) */ |
| int matrix_coefficients; /* u( 8) */ |
| int full_range_flag; /* u( 1) */ |
| int use_q_matrix; /* u( 1) */ |
| /* (start) quantization_matix */ |
| int q_matrix[N_C][OAPV_BLK_H][OAPV_BLK_W]; /* u( 8) */ |
| /* ( end ) quantization_matix */ |
| /* (start) tile_info */ |
| int tile_width_in_mbs; /* u(20) */ |
| int tile_height_in_mbs; /* u(20) */ |
| int tile_size_present_in_fh_flag; /* u( 1) */ |
| u32 tile_size[OAPV_MAX_TILES]; /* u(32) */ |
| /* ( end ) tile_info */ |
| // int reserved_zero_8bits_4; /* u( 8) */ |
| }; |
| |
| /***************************************************************************** |
| * Tile header |
| *****************************************************************************/ |
| #define OAPV_TILE_SIZE_LEN 4 /* u(32), 4byte */ |
| typedef struct oapv_th oapv_th_t; |
| struct oapv_th { |
| int tile_header_size; /* u(16) */ |
| int tile_index; /* u(16) */ |
| u32 tile_data_size[N_C]; /* u(32) */ |
| int tile_qp[N_C]; /* u( 8) */ |
| int reserved_zero_8bits; /* u( 8) */ |
| }; |
| |
| /***************************************************************************** |
| * Access unit info |
| *****************************************************************************/ |
| typedef struct oapv_aui oapv_aui_t; |
| struct oapv_aui { |
| int num_frames; // u(16) |
| int pbu_type[OAPV_MAX_NUM_FRAMES]; // u(8) |
| int group_id[OAPV_MAX_NUM_FRAMES]; // u(16) |
| // int reserved_zero_8bits[OAPV_MAX_NUM_FRAMES]; // u(8) |
| oapv_fi_t frame_info[OAPV_MAX_NUM_FRAMES]; |
| // int reserved_zero_8bits // u(8) |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // start of encoder code |
| #if ENABLE_ENCODER |
| /////////////////////////////////////////////////////////////////////////////// |
| /***************************************************************************** |
| * pre-declaration |
| *****************************************************************************/ |
| typedef struct oapve_ctx oapve_ctx_t; |
| typedef struct oapve_core oapve_core_t; |
| |
| /***************************************************************************** |
| * pre-defined function structure |
| *****************************************************************************/ |
| typedef void (*oapv_fn_itx_part_t)(s16 *coef, s16 *t, int shift, int line); |
| typedef void (*oapv_fn_itx_t)(s16 *coef, int shift1, int shift2, int line); |
| typedef void (*oapv_fn_tx_t)(s16 *coef, s16 *t, int shift, int line); |
| typedef void (*oapv_fn_itx_adj_t)(int *src, int *dst, int itrans_diff_idx, int diff_step, int shift); |
| 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); |
| typedef void (*oapv_fn_dquant_t)(s16 *coef, s16 q_matrix[OAPV_BLK_D], int log2_w, int log2_h, s8 shift); |
| typedef int (*oapv_fn_sad_t)(int w, int h, void *src1, void *src2, int s_src1, int s_src2); |
| typedef s64 (*oapv_fn_ssd_t)(int w, int h, void *src1, void *src2, int s_src1, int s_src2); |
| 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); |
| |
| typedef double (*oapv_fn_enc_blk_cost_t)(oapve_ctx_t *ctx, oapve_core_t *core, int log2_w, int log2_h, int c); |
| typedef void (*oapv_fn_imgb_to_blk_rc_t)(oapv_imgb_t *imgb, int c, int x_l, int y_l, int w_l, int h_l, s16 *block); |
| typedef void (*oapv_fn_imgb_to_blk_t)(void *src, int blk_w, int blk_h, int s_src, int offset_src, int s_dst, void *dst); |
| typedef void (*oapv_fn_blk_to_imgb_t)(void *src, int blk_w, int blk_h, int s_src, int offset_dst, int s_dst, void *dst); |
| typedef void (*oapv_fn_img_pad_t)(oapve_ctx_t *ctx, oapv_imgb_t *imgb); |
| typedef int (*oapv_fn_had8x8_t)(pel *org, int s_org); |
| |
| /***************************************************************************** |
| * rate-control related |
| *****************************************************************************/ |
| typedef struct oapve_rc_param { |
| double alpha; |
| double beta; |
| |
| int qp; |
| double lambda; |
| double cost; |
| } oapve_rc_param_t; |
| |
| typedef struct oapve_rc_tile { |
| int qp; |
| int target_bits; |
| double lambda; |
| int number_pixel; |
| double cost; |
| int target_bits_left; |
| |
| u64 total_dist; |
| oapve_rc_param_t rc_param; |
| } oapve_rc_tile_t; |
| |
| /***************************************************************************** |
| * CORE information used for encoding process. |
| * |
| * The variables in this structure are very often used in encoding process. |
| *****************************************************************************/ |
| struct oapve_core { |
| ALIGNED_16(s16 coef[OAPV_BLK_D]); |
| ALIGNED_16(s16 coef_rec[OAPV_BLK_D]); |
| oapve_ctx_t *ctx; |
| int prev_dc_ctx[N_C]; |
| int prev_1st_ac_ctx[N_C]; |
| int tile_idx; |
| int prev_dc[N_C]; |
| int dc_diff; /* DC difference, which is represented in 17 bits */ |
| /* and coded as abs_dc_coeff_diff and sign_dc_coeff_diff */ |
| int qp[N_C]; // QPs for Y, Cb(U), Cr(V) |
| int dq_shift[N_C]; |
| |
| int q_mat_enc[N_C][OAPV_BLK_D]; |
| s16 q_mat_dec[N_C][OAPV_BLK_D]; |
| int thread_idx; |
| /* platform specific data, if needed */ |
| void *pf; |
| }; |
| |
| #include "oapv_bs.h" |
| |
| typedef struct oapve_tile oapve_tile_t; |
| struct oapve_tile { |
| oapv_th_t th; |
| |
| int x; /* x (column) position in a frame in unit of pixel */ |
| int y; /* y (row) position in a frame in unit of pixel */ |
| int w; /* tile width in unit of pixel */ |
| int h; /* tile height in unit of pixel */ |
| u32 tile_size; |
| oapve_rc_tile_t rc; |
| u8 *bs_buf; |
| s32 bs_size; |
| u32 bs_buf_max; |
| volatile s32 stat; |
| }; |
| |
| /****************************************************************************** |
| * CONTEXT used for encoding process. |
| * |
| * All have to be stored are in this structure. |
| *****************************************************************************/ |
| struct oapve_ctx { |
| u32 magic; // magic code |
| oapve_t id; // identifier |
| oapve_cdesc_t cdesc; |
| oapv_imgb_t *imgb; |
| oapv_imgb_t *rec; |
| |
| oapve_param_t *param; |
| oapv_fh_t fh; |
| oapve_tile_t tile[OAPV_MAX_TILES]; |
| int num_tiles; |
| int num_tile_cols; |
| int num_tile_rows; |
| int qp[N_C]; |
| s8 qp_offset[N_C]; |
| int w; |
| int h; |
| int cfi; |
| int num_comp; |
| int bit_depth; |
| int comp_sft[N_C][2]; |
| int log2_block; |
| oapv_tpool_t *tpool; |
| oapv_thread_t thread_id[OAPV_MAX_THREADS]; |
| oapv_sync_obj_t sync_obj; |
| oapve_core_t *core[OAPV_MAX_THREADS]; |
| |
| oapv_bs_t bs; |
| const oapv_fn_itx_part_t *fn_itx_part; |
| const oapv_fn_itx_t *fn_itx; |
| const oapv_fn_itx_adj_t *fn_itx_adj; |
| const oapv_fn_tx_t *fn_txb; |
| const oapv_fn_quant_t *fn_quant; |
| const oapv_fn_dquant_t *fn_dquant; |
| const oapv_fn_sad_t *fn_sad; |
| const oapv_fn_ssd_t *fn_ssd; |
| const oapv_fn_diff_t *fn_diff; |
| oapv_fn_imgb_to_blk_rc_t fn_imgb_to_blk_rc; |
| oapv_fn_imgb_to_blk_t fn_imgb_to_blk[N_C]; |
| oapv_fn_blk_to_imgb_t fn_blk_to_imgb[N_C]; |
| oapv_fn_img_pad_t fn_img_pad; |
| oapv_fn_enc_blk_cost_t fn_enc_blk; |
| oapv_fn_had8x8_t fn_had8x8; |
| |
| int use_frm_hash; |
| oapve_rc_param_t rc_param; |
| |
| /* platform specific data, if needed */ |
| void *pf; |
| }; |
| /////////////////////////////////////////////////////////////////////////////// |
| // end of encoder code |
| #endif // ENABLE_ENCODER |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // start of decoder code |
| #if ENABLE_DECODER |
| /////////////////////////////////////////////////////////////////////////////// |
| #define DEC_TILE_STAT_NOT_DECODED 0 |
| #define DEC_TILE_STAT_ON_DECODING 1 |
| #define DEC_TILE_STAT_DECODED 2 |
| #define DEC_TILE_STAT_SIZE_ERROR -1 |
| |
| typedef struct oapvd_tile oapvd_tile_t; |
| struct oapvd_tile { |
| oapv_th_t th; |
| |
| int x; /* x (column) position in a frame in unit of pixel */ |
| int y; /* y (row) position in a frame in unit of pixel */ |
| int w; /* tile width in unit of pixel */ |
| int h; /* tile height in unit of pixel */ |
| u32 data_size; /* tile size including tile_size syntax */ |
| |
| u8 *bs_beg; /* start position of tile in input bistream */ |
| u8 *bs_end; /* end position of tile() in input bistream */ |
| volatile s32 stat; // decoding status |
| }; |
| |
| typedef struct oapvd_core oapvd_core_t; |
| typedef struct oapvd_ctx oapvd_ctx_t; |
| |
| struct oapvd_core { |
| ALIGNED_16(s16 coef[OAPV_MB_D]); |
| oapvd_ctx_t *ctx; |
| |
| int prev_dc_ctx[N_C]; |
| int prev_1st_ac_ctx[N_C]; |
| int prev_dc[N_C]; |
| int dc_diff; /* DC difference, which is represented in 17 bits */ |
| /* and coded as abs_dc_coeff_diff and sign_dc_coeff_diff */ |
| int qp[N_C]; |
| int dq_shift[N_C]; |
| s16 q_mat[N_C][OAPV_BLK_D]; |
| |
| int tile_idx; |
| |
| /* platform specific data, if needed */ |
| void *pf; |
| }; |
| |
| struct oapvd_ctx { |
| u32 magic; // magic code |
| oapvd_t id; // identifier |
| |
| oapvd_cdesc_t cdesc; |
| oapvd_core_t *core[OAPV_MAX_THREADS]; |
| oapv_imgb_t *imgb; |
| const oapv_fn_itx_t *fn_itx; |
| const oapv_fn_dquant_t *fn_dquant; |
| oapv_fn_blk_to_imgb_t fn_block_to_imgb[N_C]; |
| oapv_bs_t bs; |
| |
| oapv_fh_t fh; |
| oapvd_tile_t tile[OAPV_MAX_TILES]; |
| |
| u8 *tile_end; |
| int num_tiles; |
| int num_tile_cols; |
| int num_tile_rows; |
| int w; |
| int h; |
| oapv_tpool_t *tpool; |
| oapv_thread_t thread_id[OAPV_MAX_THREADS]; |
| oapv_sync_obj_t sync_obj; |
| int cfi; // chroma format indicator |
| int bit_depth; // bit depth of decoding picture |
| int num_comp; // number of components |
| int comp_sft[N_C][2]; // width or height shift value of each compoents, 0: width, 1: height |
| int use_frm_hash; |
| |
| /* platform specific data, if needed */ |
| void *pf; |
| }; |
| /////////////////////////////////////////////////////////////////////////////// |
| // end of decoder code |
| #endif // ENABLE_DECODER |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #define OAPV_FRAME_INFO_BYTE (112) |
| #define OAPV_PBU_HEADER_BYTE (32) |
| |
| #include "oapv_metadata.h" |
| #include "oapv_vlc.h" |
| #include "oapv_tq.h" |
| #include "oapv_util.h" |
| #include "oapv_tbl.h" |
| #include "oapv_rc.h" |
| #include "oapv_sad.h" |
| |
| #if X86_SSE |
| #include "sse/oapv_sad_sse.h" |
| #include "sse/oapv_tq_sse.h" |
| #include "avx/oapv_sad_avx.h" |
| #include "avx/oapv_tq_avx.h" |
| #elif ARM_NEON |
| #include "neon/oapv_sad_neon.h" |
| #include "neon/oapv_tq_neon.h" |
| #endif |
| |
| #endif /* _OAPV_DEF_H_4738294732894739280473892473829_ */ |