| /****************************************************************************** |
| * |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| /** |
| ******************************************************************************* |
| * @file |
| * isvcd_residual_resamp.c |
| * |
| * @brief |
| * Contains routines that resample for SVC resampling |
| * |
| * @author |
| * Kishore |
| * |
| * @par List of Functions: |
| * - isvcd_residual_chroma_dyadic_alt() |
| * - isvcd_residual_chroma_dyadic() |
| * - isvcd_residual_luma_dyadic() |
| * - isvcd_ref_layer_ptr_incr() |
| * - isvcd_residual_reflayer_const_non_boundary_mb() |
| * - isvcd_residual_reflayer_const_boundary_mb() |
| * - isvcd_residual_reflayer_const() |
| * - isvcd_interpolate_residual() |
| * - isvcd_residual_samp_mb() |
| * - isvcd_residual_samp_mb_dyadic() |
| * - isvcd_residual_samp_populate_list() |
| * - isvcd_residual_samp_res_init() |
| * |
| * @remarks |
| * None |
| * |
| ******************************************************************************* |
| */ |
| |
| #include <assert.h> |
| #include <string.h> |
| #include "ih264_typedefs.h" |
| #include "ih264_macros.h" |
| #include "ih264_platform_macros.h" |
| #include "ih264d_bitstrm.h" |
| #include "ih264d_defs.h" |
| #include "ih264d_debug.h" |
| #include "isvcd_structs.h" |
| #include "ih264d_defs.h" |
| #include "ih264d_parse_cavlc.h" |
| #include "ih264d_mb_utils.h" |
| #include "ih264d_deblocking.h" |
| #include "ih264d_dpb_manager.h" |
| #include "ih264d_mvpred.h" |
| #include "ih264d_inter_pred.h" |
| #include "ih264d_process_pslice.h" |
| #include "ih264d_error_handler.h" |
| #include "ih264d_cabac.h" |
| #include "ih264d_debug.h" |
| #include "ih264d_tables.h" |
| #include "ih264d_parse_slice.h" |
| #include "ih264d_utils.h" |
| #include "ih264d_parse_islice.h" |
| #include "ih264d_process_bslice.h" |
| #include "ih264d_process_intra_mb.h" |
| #include "ih264_debug.h" |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_chroma_dyadic_alt */ |
| /* */ |
| /* Description : this fucntion does the upsampling of chroma residuals for*/ |
| /* Dyadic cases and specific chroma phase cases */ |
| /* */ |
| /* Inputs : pv_residual_samp_ctxt : Residual upsampling context */ |
| /* pu1_inp_data : input 8 bit data pointer */ |
| /* i4_inp_data_stride : input buffer stride */ |
| /* pi2_out_res : output 16 bit buffer pointer */ |
| /* i4_out_res_stride : Output buffer stride */ |
| /* pu1_inp_bitmap : input packed sign bit data pointer */ |
| /* i4_inp_bitmap_stride : sign bit buffer stride */ |
| /* i4_start_bit_pos : bit position in the byte of packed */ |
| /* sign values */ |
| /* Globals : none */ |
| /* Processing : it does the upsampling with intial phase values */ |
| /* */ |
| /* Outputs : Upsampled residuals for chroma */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 25 09 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| void isvcd_residual_chroma_dyadic_alt(void *pv_residual_samp_ctxt, UWORD16 u2_mb_x, UWORD16 u2_mb_y, |
| mem_element_t *ps_ref_mb_mode, WORD16 *pi2_inp_data, |
| WORD32 i4_inp_data_stride, WORD16 *pi2_out_res, |
| WORD32 i4_out_res_stride, WORD32 i4_cr_flag) |
| { |
| residual_sampling_ctxt_t *ps_ctxt; |
| res_lyr_ctxt *ps_lyr_ctxt; |
| ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id]; |
| /* ----------------- Processing ------------------------------- */ |
| { |
| ref_pixel_map_t *ps_pos_phase; |
| residual_samp_map_ctxt_t *ps_chroma_map; |
| ref_mb_map_t *ps_x_off_len_chroma; |
| ref_mb_map_t *ps_y_off_len_chroma; |
| WORD32 i4_i; |
| WORD16 *pi2_ref_data_byte; |
| WORD32 *pi4_ref_array; |
| WORD32 i4_phase1, i4_phase2; |
| WORD32 i4_offset_x, i4_offset_y; |
| WORD32 i4_chrm_horz_int_mode, i4_chrm_vert_int_mode; |
| WORD32 i4_horz_intp_ctr = SUB_BLOCK_HEIGHT; |
| |
| ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt; |
| ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length; |
| ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length; |
| |
| /* get the actual offset for the buffers */ |
| i4_offset_x = ps_x_off_len_chroma[u2_mb_x].i2_offset; |
| i4_offset_y = ps_y_off_len_chroma[u2_mb_y].i2_offset; |
| |
| { |
| UWORD8 u1_mask; |
| WORD32 i4_mb_x, i4_mb_y; |
| WORD32 i4_chrm_nnz; |
| WORD32 i4_num_element_stride; |
| inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms, *ps_inter_lyr_mb_prms_curr; |
| |
| u1_mask = (SVCD_TRUE == i4_cr_flag) ? 0xF0 : 0x0F; |
| |
| /* Top Left */ |
| i4_mb_x = i4_offset_x >> 3; |
| i4_mb_y = i4_offset_y >> 3; |
| |
| /* get the location of the byte which has the current mb mode */ |
| ps_inter_lyr_mb_prms = ps_ref_mb_mode->pv_buffer; |
| i4_num_element_stride = ps_ref_mb_mode->i4_num_element_stride; |
| |
| ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x; |
| ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride; |
| i4_chrm_nnz = ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask; |
| |
| /* Top Right */ |
| i4_mb_x = (i4_offset_x + 4) >> 3; |
| ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x; |
| ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride; |
| i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask; |
| |
| /* Bottom Left */ |
| i4_mb_x = i4_offset_x >> 3; |
| i4_mb_y = (i4_offset_y + 4) >> 3; |
| ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x; |
| ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride; |
| i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask; |
| |
| /* Bottom Right */ |
| i4_mb_x = (i4_offset_x + 4) >> 3; |
| ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x; |
| ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride; |
| |
| i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask; |
| if(0 == i4_chrm_nnz) |
| { |
| return; |
| } |
| } |
| |
| i4_chrm_horz_int_mode = ps_lyr_ctxt->i4_chrm_horz_int_mode; |
| i4_chrm_vert_int_mode = ps_lyr_ctxt->i4_chrm_vert_int_mode; |
| |
| if(0 == i4_chrm_horz_int_mode) |
| { |
| if(i4_offset_x >= 0) |
| { |
| pi2_inp_data++; |
| } |
| } |
| |
| if(0 == i4_chrm_vert_int_mode) |
| { |
| if(i4_offset_y >= 0) |
| { |
| pi2_inp_data += i4_inp_data_stride; |
| } |
| } |
| else |
| { |
| /* extra additional row of interpolation required for this case */ |
| i4_horz_intp_ctr++; |
| } |
| |
| /* ----------- Horizontal Interpolation ---------------- */ |
| pi2_ref_data_byte = pi2_inp_data; |
| ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_pos_phase; |
| |
| pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer; |
| i4_phase1 = ps_pos_phase[0].i2_phase; |
| i4_phase2 = (i4_phase1 + 8) & 0x0F; |
| |
| /* interchange the phase values for corner case */ |
| if(1 == i4_chrm_horz_int_mode) |
| { |
| WORD32 i4_temp; |
| i4_temp = i4_phase1; |
| i4_phase1 = i4_phase2; |
| i4_phase2 = i4_temp; |
| } |
| |
| for(i4_i = 0; i4_i < i4_horz_intp_ctr; i4_i++) |
| { |
| WORD16 i2_coeff1, i2_coeff2; |
| |
| i2_coeff1 = (WORD16) (pi2_ref_data_byte[0]); |
| |
| if(0 == i4_chrm_horz_int_mode) |
| { |
| /* populate the first inter sample */ |
| *pi4_ref_array++ = i2_coeff1 << 4; |
| } |
| |
| /* unroll count 1 */ |
| i2_coeff2 = (WORD16) (pi2_ref_data_byte[2]); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2); |
| *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2); |
| |
| /* unroll count 2 */ |
| i2_coeff1 = (WORD16) (pi2_ref_data_byte[4]); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff2 + i4_phase2 * i2_coeff1); |
| *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff2 + i4_phase1 * i2_coeff1); |
| |
| /* unroll count 3 */ |
| i2_coeff2 = (WORD16) (pi2_ref_data_byte[6]); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2); |
| *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2); |
| |
| /* populate the last inter sample */ |
| *pi4_ref_array++ = i2_coeff2 << 4; |
| |
| if(1 == i4_chrm_horz_int_mode) |
| { |
| i2_coeff1 = (WORD16) (pi2_ref_data_byte[4]); |
| |
| /* populate the last inter sample */ |
| *pi4_ref_array++ = i2_coeff1 << 4; |
| } |
| |
| /* vertical loop updates */ |
| pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride); |
| } |
| |
| /* ----------- Vertical Interpolation ---------------- */ |
| pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer; |
| ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_pos_phase; |
| i4_phase1 = ps_pos_phase[0].i2_phase; |
| i4_phase2 = (i4_phase1 + 8) & 0x0F; |
| |
| /* interchange the phase values for corner case */ |
| if(0 != i4_chrm_vert_int_mode) |
| { |
| WORD32 i4_temp; |
| i4_temp = i4_phase1; |
| i4_phase1 = i4_phase2; |
| i4_phase2 = i4_temp; |
| } |
| |
| for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++) |
| { |
| WORD16 *pi2_out; |
| WORD32 *pi4_ref_array_temp; |
| WORD32 i4_horz_samp_1, i4_horz_samp_2; |
| pi2_out = pi2_out_res; |
| pi4_ref_array_temp = pi4_ref_array; |
| |
| /* populate the first inter sample */ |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| |
| if(1 != i4_chrm_vert_int_mode) |
| { |
| *pi2_out = (i4_horz_samp_1 + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| } |
| |
| if(2 == i4_chrm_vert_int_mode) |
| { |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| *pi2_out = (i4_horz_samp_1 + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| } |
| |
| /* unroll count 1 */ |
| i4_horz_samp_2 = *pi4_ref_array_temp; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 2 */ |
| *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 3 */ |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = ((16 - i4_phase2) * i4_horz_samp_2 + i4_phase2 * i4_horz_samp_1 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 4 */ |
| *pi2_out = ((16 - i4_phase1) * i4_horz_samp_2 + i4_phase1 * i4_horz_samp_1 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 5 */ |
| i4_horz_samp_2 = *pi4_ref_array_temp; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 6 */ |
| *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| if(2 != i4_chrm_vert_int_mode) |
| { |
| /* populate the last inter sample */ |
| *pi2_out = (i4_horz_samp_2 + 8) >> 4; |
| |
| if(1 == i4_chrm_vert_int_mode) |
| { |
| pi2_out += i4_out_res_stride; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| |
| /* populate the last inter sample */ |
| *pi2_out = (i4_horz_samp_1 + 8) >> 4; |
| } |
| } |
| /* horizontal loop updates */ |
| pi4_ref_array++; |
| pi2_out_res += 2; |
| } |
| } |
| return; |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_chroma_dyadic */ |
| /* */ |
| /* Description : this fucntion does the upsampling of chroma residuals for*/ |
| /* Dyadic cases */ |
| /* */ |
| /* Inputs : pv_residual_samp_ctxt : Residual upsampling context */ |
| /* pu1_inp_data : input 8 bit data pointer */ |
| /* i4_inp_data_stride : input buffer stride */ |
| /* pi2_out_res : output 16 bit buffer pointer */ |
| /* i4_out_res_stride : Output buffer stride */ |
| /* pu1_inp_bitmap : input packed sign bit data pointer */ |
| /* i4_inp_bitmap_stride : sign bit buffer stride */ |
| /* i4_start_bit_pos : bit position in the byte of packed */ |
| /* sign values */ |
| /* Globals : none */ |
| /* Processing : it does the upsampling with intial phase values */ |
| /* */ |
| /* Outputs : Upsampled residuals for chroma */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 25 09 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| void isvcd_residual_chroma_dyadic(void *pv_residual_samp_ctxt, WORD16 *pi2_inp_data, |
| WORD32 i4_inp_data_stride, WORD16 *pi2_out_res, |
| WORD32 i4_out_res_stride) |
| { |
| residual_sampling_ctxt_t *ps_ctxt; |
| res_lyr_ctxt *ps_lyr_ctxt; |
| ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id]; |
| /* ----------------- Processing ------------------------------- */ |
| { |
| WORD32 i4_i; |
| WORD16 *pi2_ref_data_byte; |
| WORD32 *pi4_ref_array; |
| ref_pixel_map_t *ps_pos_phase; |
| WORD32 i4_phase1, i4_phase2; |
| |
| pi2_ref_data_byte = pi2_inp_data; |
| ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_pos_phase; |
| |
| /* ----------- Horizontal Interpolation ---------------- */ |
| pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer; |
| i4_phase1 = ps_pos_phase[0].i2_phase; |
| i4_phase2 = (i4_phase1 + 8) & 0x0F; |
| |
| for(i4_i = 0; i4_i < SUB_BLOCK_HEIGHT; i4_i++) |
| { |
| WORD16 i2_coeff1, i2_coeff2; |
| i2_coeff1 = (WORD16) (pi2_ref_data_byte[0]); |
| |
| /* populate the first inter sample */ |
| *pi4_ref_array++ = i2_coeff1 << 4; |
| |
| /* unroll count 1 */ |
| i2_coeff2 = (WORD16) (pi2_ref_data_byte[2]); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2); |
| |
| /* unroll count 2 */ |
| *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2); |
| |
| /* unroll count 3 */ |
| i2_coeff1 = (WORD16) (pi2_ref_data_byte[4]); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff2 + i4_phase2 * i2_coeff1); |
| |
| /* unroll count 4 */ |
| *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff2 + i4_phase1 * i2_coeff1); |
| |
| /* unroll count 5 */ |
| i2_coeff2 = (WORD16) (pi2_ref_data_byte[6]); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2); |
| |
| /* unroll count 6 */ |
| *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2); |
| |
| /* populate the last inter sample */ |
| *pi4_ref_array++ = i2_coeff2 << 4; |
| |
| /* vertical loop uopdates */ |
| pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride); |
| } |
| |
| /* ----------- Vertical Interpolation ---------------- */ |
| pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer; |
| ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_pos_phase; |
| i4_phase1 = ps_pos_phase[0].i2_phase; |
| i4_phase2 = (i4_phase1 + 8) & 0x0F; |
| |
| for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++) |
| { |
| WORD16 *pi2_out; |
| WORD32 *pi4_ref_array_temp; |
| WORD32 i4_horz_samp_1, i4_horz_samp_2; |
| pi2_out = pi2_out_res; |
| pi4_ref_array_temp = pi4_ref_array; |
| |
| /* populate the first inter sample */ |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| *pi2_out = (i4_horz_samp_1 + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 1 */ |
| i4_horz_samp_2 = *pi4_ref_array_temp; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 2 */ |
| *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 3 */ |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = ((16 - i4_phase2) * i4_horz_samp_2 + i4_phase2 * i4_horz_samp_1 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 4 */ |
| *pi2_out = ((16 - i4_phase1) * i4_horz_samp_2 + i4_phase1 * i4_horz_samp_1 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 5 */ |
| i4_horz_samp_2 = *pi4_ref_array_temp; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll count 6 */ |
| *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8; |
| pi2_out += i4_out_res_stride; |
| |
| /* populate the last inter sample */ |
| *pi2_out = (i4_horz_samp_2 + 8) >> 4; |
| |
| /* horizontal loop updates */ |
| pi4_ref_array++; |
| pi2_out_res += 2; |
| } |
| } |
| return; |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_luma_dyadic */ |
| /* */ |
| /* Description : this fucntion does the upsampling of luma residuals for */ |
| /* Dyadic cases */ |
| /* */ |
| /* Inputs : pv_residual_samp_ctxt : Residual upsampling context */ |
| /* pu1_inp_data : input 8 bit data pointer */ |
| /* i4_inp_data_stride : input buffer stride */ |
| /* pi2_out_res : output 16 bit buffer pointer */ |
| /* i4_out_res_stride : Output buffer stride */ |
| /* pu1_inp_bitmap : input packed sign bit data pointer */ |
| /* i4_inp_bitmap_stride : sign bit buffer stride */ |
| /* ps_ref_mb_mode : reference mb mode pointer of base layer */ |
| /* ps_coord : mb co-ordinate pointer */ |
| /* Globals : none */ |
| /* Processing : it does the upsampling with fixed phase values and */ |
| /* reference layer transform size */ |
| /* Outputs : Upsampled residuals for luma */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 25 09 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| void isvcd_residual_luma_dyadic(void *pv_residual_samp_ctxt, WORD16 *pi2_inp_data, |
| WORD32 i4_inp_data_stride, WORD16 *pi2_out_res, |
| WORD32 i4_out_res_stride, mem_element_t *ps_ref_mb_mode, |
| UWORD16 u2_mb_x, UWORD16 u2_mb_y, WORD32 i4_ref_nnz, |
| WORD32 i4_ref_tx_size) |
| |
| { |
| WORD16 *pi2_refarray_buffer; |
| WORD32 i4_blk_ctr; |
| residual_sampling_ctxt_t *ps_ctxt; |
| |
| UNUSED(ps_ref_mb_mode); |
| UNUSED(u2_mb_x); |
| UNUSED(u2_mb_y); |
| |
| ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| pi2_refarray_buffer = ps_ctxt->pi2_refarray_buffer; |
| |
| /* based on transform size the counter and interpolation width and */ |
| /* height are intialised as follows */ |
| if((i4_ref_tx_size) && (0 != i4_ref_nnz)) |
| { |
| WORD16 *pi2_ref_data_byte; |
| WORD32 *pi4_ref_array; |
| WORD32 i4_i, i4_j; |
| |
| pi2_ref_data_byte = pi2_inp_data; |
| |
| /* ----------- Horizontal Interpolation ---------------- */ |
| pi4_ref_array = (WORD32 *) pi2_refarray_buffer; |
| for(i4_i = 0; i4_i < BLOCK_HEIGHT; i4_i++) |
| { |
| WORD16 i2_coeff1, i2_coeff2; |
| i2_coeff1 = (WORD16) (*pi2_ref_data_byte++); |
| |
| /* populate the first inter sample */ |
| *pi4_ref_array++ = i2_coeff1 << 2; |
| |
| for(i4_j = 0; i4_j < 14; i4_j += 2) |
| { |
| i2_coeff2 = (WORD16) (*pi2_ref_data_byte++); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2)); |
| *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1)); |
| |
| /* store the coeff 2 to coeff 1 */ |
| /* (used in next iteration) */ |
| i2_coeff1 = i2_coeff2; |
| } |
| |
| /* populate the last inter sample */ |
| *pi4_ref_array++ = i2_coeff1 << 2; |
| |
| /* vertical loop uopdates */ |
| pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride); |
| } |
| |
| /* ----------- Vertical Interpolation ---------------- */ |
| pi4_ref_array = (WORD32 *) pi2_refarray_buffer; |
| |
| for(i4_i = 0; i4_i < MB_WIDTH; i4_i++) |
| { |
| WORD32 *pi4_ref_array_temp; |
| WORD16 *pi2_out; |
| WORD32 i4_horz_samp_1, i4_horz_samp_2; |
| |
| pi4_ref_array_temp = pi4_ref_array; |
| pi2_out = pi2_out_res; |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| |
| /* populate the first inter sample */ |
| *pi2_out = (i4_horz_samp_1 + 2) >> 2; |
| pi2_out += i4_out_res_stride; |
| |
| for(i4_j = 0; i4_j < 14; i4_j += 2) |
| { |
| pi4_ref_array_temp += MB_WIDTH; |
| i4_horz_samp_2 = *pi4_ref_array_temp; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| *pi2_out = ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| |
| /* store the coeff 2 to coeff 1 */ |
| /* (used in next iteration) */ |
| i4_horz_samp_1 = i4_horz_samp_2; |
| } |
| |
| /* populate the first inter sample */ |
| *pi2_out = (i4_horz_samp_1 + 2) >> 2; |
| |
| /* horizontal loop updates */ |
| pi4_ref_array++; |
| pi2_out_res++; |
| } |
| } |
| else |
| { |
| /* ----------------------------------------------------------------- */ |
| /* LOOP over number of blocks */ |
| /* ----------------------------------------------------------------- */ |
| for(i4_blk_ctr = 0; i4_blk_ctr < 4; i4_blk_ctr++) |
| { |
| WORD16 *pi2_ref_data_byte; |
| WORD32 *pi4_ref_array; |
| WORD32 i4_i; |
| |
| /* if reference layer is not coded then no processing */ |
| if(0 != (i4_ref_nnz & 0x1)) |
| { |
| pi2_ref_data_byte = pi2_inp_data; |
| |
| /* ----------- Horizontal Interpolation ---------------- */ |
| pi4_ref_array = (WORD32 *) pi2_refarray_buffer; |
| |
| for(i4_i = 0; i4_i < SUB_BLOCK_HEIGHT; i4_i++) |
| { |
| WORD16 i2_coeff1, i2_coeff2; |
| i2_coeff1 = (WORD16) (*pi2_ref_data_byte++); |
| |
| /* populate the first inter sample */ |
| *pi4_ref_array++ = i2_coeff1 << 2; |
| |
| i2_coeff2 = (WORD16) (*pi2_ref_data_byte++); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2)); |
| *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1)); |
| |
| i2_coeff1 = (WORD16) (*pi2_ref_data_byte++); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1)); |
| *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2)); |
| |
| i2_coeff2 = (WORD16) (*pi2_ref_data_byte++); |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2)); |
| *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1)); |
| |
| /* populate the last inter sample */ |
| *pi4_ref_array++ = i2_coeff2 << 2; |
| |
| /* vertical loop uopdates */ |
| pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride); |
| } |
| |
| /* ----------- Vertical Interpolation ---------------- */ |
| pi4_ref_array = (WORD32 *) pi2_refarray_buffer; |
| |
| for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++) |
| { |
| WORD32 *pi4_ref_array_temp; |
| WORD16 *pi2_out; |
| WORD32 i4_horz_samp_1, i4_horz_samp_2; |
| |
| pi4_ref_array_temp = pi4_ref_array; |
| pi2_out = pi2_out_res; |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| |
| /* populate the first inter sample */ |
| *pi2_out = (i4_horz_samp_1 + 2) >> 2; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll loop count 1 */ |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| i4_horz_samp_2 = *pi4_ref_array_temp; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = |
| ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| *pi2_out = |
| ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll loop count 2 */ |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| i4_horz_samp_1 = *pi4_ref_array_temp; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = |
| ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| *pi2_out = |
| ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| |
| /* unroll loop count 3 */ |
| pi4_ref_array_temp += BLOCK_WIDTH; |
| i4_horz_samp_2 = *pi4_ref_array_temp; |
| |
| /* populate 2 samples based on current coeffs */ |
| *pi2_out = |
| ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| *pi2_out = |
| ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4; |
| pi2_out += i4_out_res_stride; |
| |
| /* populate the last inter sample */ |
| *pi2_out = (i4_horz_samp_2 + 2) >> 2; |
| |
| /* horizontal loop updates */ |
| pi4_ref_array++; |
| pi2_out_res++; |
| } |
| } |
| else |
| { |
| pi2_out_res += BLOCK_WIDTH; |
| } |
| |
| /* Block level loop updates */ |
| if(1 == i4_blk_ctr) |
| { |
| pi2_inp_data -= SUB_BLOCK_WIDTH; |
| pi2_inp_data += (i4_inp_data_stride * SUB_BLOCK_HEIGHT); |
| pi2_out_res -= MB_WIDTH; |
| pi2_out_res += (i4_out_res_stride * BLOCK_HEIGHT); |
| i4_ref_nnz >>= 2; |
| } |
| else |
| { |
| pi2_inp_data += SUB_BLOCK_WIDTH; |
| } |
| |
| i4_ref_nnz >>= 1; |
| |
| } /* end of loop over all the blocks */ |
| } |
| return; |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_ref_layer_ptr_incr */ |
| /* */ |
| /* Description : this function returns the pointer increments for */ |
| /* the operand2 of the bilinear interpolation */ |
| /* Inputs : pi1_ref_mb_modes : reference mb modes */ |
| /* i4_ref_mode_stride : mb mode buffer stride */ |
| /* i4_element_size : size of reference mb mode */ |
| /* i4_x_offset : ref offset x */ |
| /* i4_y_offset : ref offset y */ |
| /* i4_refary_wd : reference array width */ |
| /* i4_refary_ht : reference array height */ |
| /* pu1_ref_x_ptr_incr : ptr increment buffer for x */ |
| /* pu1_ref_y_ptr_incr : ptr increment buffer for y */ |
| /* i4_chroma_flag : chroma processing flag */ |
| /* Globals : none */ |
| /* Processing : it calculates the increment as per the transform size */ |
| /* */ |
| /* Outputs : none */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 18 08 2021 Kishore creation */ |
| /* */ |
| /*****************************************************************************/ |
| WORD32 isvcd_ref_layer_ptr_incr(WORD8 *pi1_ref_mb_modes, WORD32 i4_ref_mode_stride, |
| WORD32 i4_element_size, WORD32 i4_x_offset, WORD32 i4_y_offset, |
| WORD32 i4_refary_wd, WORD32 i4_refary_ht, |
| UWORD8 *pu1_ref_x_ptr_incr, UWORD8 *pu1_ref_y_ptr_incr, |
| WORD32 i4_chroma_flag) |
| { |
| WORD32 i4_x, i4_y; |
| WORD32 i4_x_idx, i4_y_idx; |
| WORD32 i4_prev_x, i4_prev_y; |
| WORD32 i4_const_val; |
| WORD32 i4_pos_x, i4_pos_y; |
| WORD32 i4_trans_size; |
| WORD32 i4_act_ary_wd, i4_act_ary_ht; |
| WORD32 i4_and_const; |
| UWORD8 *pu1_incr_x, *pu1_incr_y; |
| WORD32 i4_mb_sft; |
| WORD32 i4_mb_x, i4_mb_y; |
| WORD8 *pi1_ref_mb_modes_incr; |
| WORD8 *pi1_ref_mb_modes_incr_temp; |
| inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms; |
| WORD32 i4_mb_x_strt, i4_mb_y_strt; |
| WORD32 i4_mb_quard1_part_x, i4_mb_quard1_part_y; |
| WORD32 i4_x_ref, i4_y_ref; |
| WORD32 i4_tx_size, i4_tx_size_q0, i4_tx_size_q1, i4_tx_size_q2, i4_tx_size_q3; |
| WORD8 i1_mb_mode_q0, i1_mb_mode_q1, i1_mb_mode_q2, i1_mb_mode_q3; |
| WORD32 i4_mb_wd; |
| WORD32 i4_mb_ht; |
| |
| i4_mb_wd = MB_WIDTH >> i4_chroma_flag; |
| i4_mb_ht = MB_HEIGHT >> i4_chroma_flag; |
| |
| /* Memset to 1 the increment buffers */ |
| memset(pu1_ref_x_ptr_incr, 1, (i4_refary_wd * i4_refary_ht)); |
| memset(pu1_ref_y_ptr_incr, 1, (i4_refary_wd * i4_refary_ht)); |
| |
| /* Initialise actual width and height */ |
| i4_act_ary_wd = i4_refary_wd; |
| i4_act_ary_ht = i4_refary_ht; |
| |
| /* Initialize x and y */ |
| i4_x = 0; |
| i4_y = 0; |
| i4_prev_y = 0; |
| i4_mb_sft = (MB_WIDTH_SHIFT - i4_chroma_flag); |
| |
| /* Loop over all MBs in the reference array */ |
| if(0 == i4_chroma_flag) |
| { |
| i4_x_ref = i4_x_offset + 0; |
| i4_y_ref = i4_y_offset + 0; |
| i4_mb_x_strt = i4_x_ref % i4_mb_wd; |
| i4_mb_y_strt = i4_y_ref % i4_mb_ht; |
| i4_mb_quard1_part_x = i4_mb_wd - i4_mb_x_strt; |
| i4_mb_quard1_part_y = i4_mb_ht - i4_mb_y_strt; |
| |
| if(!(i4_mb_quard1_part_x >= 0)) |
| { |
| return NOT_OK; |
| } |
| if(!(i4_mb_quard1_part_y >= 0)) |
| { |
| return NOT_OK; |
| } |
| |
| /* Take care of negative offsets */ |
| if(i4_x_ref > 0) |
| { |
| i4_mb_x = (i4_x_ref >> i4_mb_sft); |
| } |
| else |
| { |
| i4_mb_x = 0; |
| } |
| if(i4_y_ref > 0) |
| { |
| i4_mb_y = (i4_y_ref >> i4_mb_sft); |
| } |
| else |
| { |
| i4_mb_y = 0; |
| } |
| |
| /* get the location of the byte which has the current mb mode */ |
| pi1_ref_mb_modes_incr = pi1_ref_mb_modes + (i4_mb_y * i4_ref_mode_stride * i4_element_size); |
| pi1_ref_mb_modes_incr += (i4_mb_x * i4_element_size); |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr; |
| i1_mb_mode_q0 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| i4_tx_size_q0 = |
| (i1_mb_mode_q0 <= SVC_INTER_MB) |
| ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1 : ps_inter_lyr_mb_prms->i1_tx_size) |
| : 1; |
| |
| pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr; |
| if(i4_mb_quard1_part_x > 0) |
| { |
| pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr + i4_element_size; |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp; |
| i1_mb_mode_q1 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| i4_tx_size_q1 = |
| (i1_mb_mode_q1 <= SVC_INTER_MB) |
| ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1 |
| : ps_inter_lyr_mb_prms->i1_tx_size) |
| : 1; |
| } |
| |
| if(i4_mb_quard1_part_y > 0) |
| { |
| pi1_ref_mb_modes_incr_temp = |
| pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size); |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp; |
| i1_mb_mode_q2 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| i4_tx_size_q2 = |
| (i1_mb_mode_q2 <= SVC_INTER_MB) |
| ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1 |
| : ps_inter_lyr_mb_prms->i1_tx_size) |
| : 1; |
| } |
| |
| if((i4_mb_quard1_part_x > 0) && (i4_mb_quard1_part_y > 0)) |
| { |
| pi1_ref_mb_modes_incr_temp = |
| pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size) + i4_element_size; |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp; |
| i1_mb_mode_q3 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| i4_tx_size_q3 = |
| (i1_mb_mode_q3 <= SVC_INTER_MB) |
| ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1 |
| : ps_inter_lyr_mb_prms->i1_tx_size) |
| : 1; |
| } |
| |
| do |
| { |
| WORD32 i4_idx; |
| WORD32 i4_wd, i4_ht; |
| WORD32 i4_max_pos_x, i4_max_pos_y; |
| |
| i4_prev_x = i4_x; |
| i4_x_ref = i4_x_offset + i4_x; |
| i4_y_ref = i4_y_offset + i4_y; |
| i4_tx_size = i4_tx_size_q0; |
| if(i4_x >= i4_mb_quard1_part_x) |
| { |
| if(i4_y < i4_mb_quard1_part_y) |
| { |
| i4_tx_size = i4_tx_size_q1; |
| } |
| else if(i4_y >= i4_mb_quard1_part_y) |
| { |
| i4_tx_size = i4_tx_size_q3; |
| } |
| } |
| else if(i4_x < i4_mb_quard1_part_x) |
| { |
| if(i4_y >= i4_mb_quard1_part_y) |
| { |
| i4_tx_size = i4_tx_size_q2; |
| } |
| } |
| |
| /* Get the transform size as 4 or 8 */ |
| i4_trans_size = ((i4_tx_size + 1) << 2); |
| i4_const_val = i4_trans_size - 1; |
| i4_and_const = i4_const_val; |
| |
| /* Fill horizontal tx block edges of current reference mb with 0 */ |
| pu1_incr_x = pu1_ref_x_ptr_incr + i4_x; |
| pu1_incr_x += (i4_y * i4_refary_wd); |
| i4_ht = (16 - (i4_y_ref & 0xF)); |
| i4_ht = MIN((i4_act_ary_ht - i4_y), i4_ht); |
| |
| i4_x_idx = i4_x; |
| i4_pos_x = i4_x_ref & 0xF; |
| i4_max_pos_x = 16; |
| i4_x += (16 - i4_pos_x); |
| |
| /* Get the transform block edge pos */ |
| i4_idx = (i4_const_val - (i4_pos_x & i4_and_const)); |
| i4_x_idx += i4_idx; |
| |
| while((i4_pos_x < i4_max_pos_x) && (i4_x_idx < i4_act_ary_wd)) |
| { |
| WORD32 i4_i; |
| UWORD8 *pu1_incr; |
| |
| pu1_incr = pu1_incr_x + i4_idx; |
| for(i4_i = 0; i4_i < i4_ht; i4_i++) |
| { |
| /* Fill the block edge with 0s */ |
| *pu1_incr = 0; |
| pu1_incr += i4_refary_wd; |
| } |
| |
| /* Updates */ |
| i4_pos_x += i4_trans_size; |
| pu1_incr_x += i4_trans_size; |
| i4_x_idx += MIN(i4_trans_size, (i4_act_ary_wd - i4_x_idx)); |
| } |
| |
| /* Fill vertical tx block edges of current reference mb with 0 */ |
| pu1_incr_y = pu1_ref_y_ptr_incr + i4_prev_x; |
| pu1_incr_y += (i4_y * i4_refary_wd); |
| i4_wd = (16 - (i4_x_ref & 0xF)); |
| i4_wd = MIN((i4_act_ary_wd - i4_prev_x), i4_wd); |
| i4_y_idx = i4_y; |
| i4_pos_y = i4_y_ref & 0xF; |
| i4_max_pos_y = 16; |
| i4_y += (16 - i4_pos_y); |
| |
| /* Get the transform block edge pos */ |
| i4_idx = (i4_const_val - (i4_pos_y & i4_and_const)); |
| i4_y_idx += i4_idx; |
| |
| while((i4_pos_y < i4_max_pos_y) && (i4_y_idx < i4_act_ary_ht)) |
| { |
| WORD32 i4_i; |
| UWORD8 *pu1_incr; |
| |
| pu1_incr = pu1_incr_y + i4_idx * i4_refary_wd; |
| for(i4_i = 0; i4_i < i4_wd; i4_i++) |
| { |
| /* Fill the block edge with 0s */ |
| *pu1_incr = 0; |
| pu1_incr++; |
| } |
| |
| /* Updates */ |
| i4_pos_y += i4_trans_size; |
| pu1_incr_y += i4_trans_size * i4_refary_wd; |
| i4_y_idx += MIN(i4_trans_size, (i4_act_ary_ht - i4_y_idx)); |
| } |
| |
| /* Loop updates */ |
| if(i4_x < i4_act_ary_wd) |
| { |
| i4_y = i4_prev_y; |
| } |
| else if(i4_y < i4_act_ary_ht) |
| { |
| i4_prev_y = i4_y; |
| i4_x = 0; |
| } |
| |
| } while((i4_y < i4_act_ary_ht) || (i4_x < i4_act_ary_wd)); |
| |
| } /* End of if 0 == i4_chroma_flag */ |
| else |
| { |
| /* Set the transform size as 4 */ |
| i4_trans_size = 4; |
| i4_const_val = 3; |
| |
| do |
| { |
| WORD32 i4_x_ref, i4_y_ref; |
| WORD32 i4_idx; |
| WORD32 i4_wd, i4_ht; |
| WORD32 i4_max_pos_x, i4_max_pos_y; |
| |
| i4_prev_x = i4_x; |
| i4_x_ref = i4_x_offset + i4_x; |
| i4_y_ref = i4_y_offset + i4_y; |
| |
| /* Fill horizontal tx block edges of current reference mb with 0 */ |
| pu1_incr_x = pu1_ref_x_ptr_incr + i4_x; |
| pu1_incr_x += (i4_y * i4_refary_wd); |
| i4_ht = (8 - (i4_y_ref & 0x7)); |
| i4_ht = MIN((i4_act_ary_ht - i4_y), i4_ht); |
| i4_x_idx = i4_x; |
| i4_pos_x = i4_x_ref & 0x7; |
| i4_max_pos_x = 8; |
| i4_x += (8 - i4_pos_x); |
| |
| /* Get the transform block edge pos */ |
| i4_idx = (i4_const_val - (i4_pos_x & 0x3)); |
| i4_x_idx += i4_idx; |
| |
| while((i4_pos_x < i4_max_pos_x) && (i4_x_idx < i4_act_ary_wd)) |
| { |
| WORD32 i4_i; |
| UWORD8 *pu1_incr; |
| |
| pu1_incr = pu1_incr_x + i4_idx; |
| for(i4_i = 0; i4_i < i4_ht; i4_i++) |
| { |
| /* Fill the block edge with 0s */ |
| *pu1_incr = 0; |
| pu1_incr += i4_refary_wd; |
| } |
| |
| /* Updates */ |
| i4_pos_x += i4_trans_size; |
| pu1_incr_x += i4_trans_size; |
| i4_x_idx += MIN(i4_trans_size, (i4_act_ary_wd - i4_x_idx)); |
| } |
| |
| /* Fill vertical tx block edges of current reference mb with 0 */ |
| pu1_incr_y = pu1_ref_y_ptr_incr + i4_prev_x; |
| pu1_incr_y += (i4_y * i4_refary_wd); |
| i4_wd = (8 - (i4_x_ref & 0x7)); |
| i4_wd = MIN((i4_act_ary_wd - i4_prev_x), i4_wd); |
| i4_y_idx = i4_y; |
| i4_pos_y = i4_y_ref & 0x7; |
| i4_max_pos_y = 8; |
| i4_y += (8 - i4_pos_y); |
| |
| /* Get the transform block edge pos */ |
| i4_idx = (i4_const_val - (i4_pos_y & 0x3)); |
| i4_y_idx += i4_idx; |
| |
| while((i4_pos_y < i4_max_pos_y) && (i4_y_idx < i4_act_ary_ht)) |
| { |
| WORD32 i4_i; |
| UWORD8 *pu1_incr; |
| |
| pu1_incr = pu1_incr_y + i4_idx * i4_refary_wd; |
| for(i4_i = 0; i4_i < i4_wd; i4_i++) |
| { |
| /* Fill the block edge with 0s */ |
| *pu1_incr = 0; |
| pu1_incr++; |
| } |
| |
| /* Updates */ |
| i4_pos_y += i4_trans_size; |
| pu1_incr_y += i4_trans_size * i4_refary_wd; |
| i4_y_idx += MIN(i4_trans_size, (i4_act_ary_ht - i4_y_idx)); |
| } |
| |
| /* Loop updates */ |
| if(i4_x < i4_act_ary_wd) |
| { |
| i4_y = i4_prev_y; |
| } |
| else if(i4_y < i4_act_ary_ht) |
| { |
| i4_prev_y = i4_y; |
| i4_x = 0; |
| } |
| |
| } while((i4_y < i4_act_ary_ht) || (i4_x < i4_act_ary_wd)); |
| |
| } /* End of chroma */ |
| return OK; |
| |
| } /* End of "isvcd_ref_layer_ptr_incr" */ |
| |
| void isvcd_residual_reflayer_const_non_boundary_mb( |
| WORD16 *pi2_inp_data, WORD32 i4_inp_data_stride, WORD16 *pi2_ref_array, WORD32 i4_refarray_wd, |
| WORD32 i4_refarray_ht, WORD32 i4_ref_mb_type_q0, WORD32 i4_ref_mb_type_q1, |
| WORD32 i4_ref_mb_type_q2, WORD32 i4_ref_mb_type_q3, WORD32 i4_mb_quard1_part_x, |
| WORD32 i4_mb_quard1_part_y, WORD32 i4_chroma_flag) |
| { |
| WORD32 i4_x_ref, i4_y_ref; |
| WORD32 i4_x, i4_y; |
| WORD32 i4_ref_mb_type; |
| WORD16 *pi2_ref_data_byte; |
| WORD16 *pi2_ref_array_temp; |
| |
| for(i4_y = 0; i4_y < i4_refarray_ht; i4_y++) |
| { |
| for(i4_x = 0; i4_x < i4_refarray_wd; i4_x++) |
| { |
| i4_y_ref = i4_y; |
| i4_x_ref = i4_x; |
| |
| i4_ref_mb_type = i4_ref_mb_type_q0; |
| if(i4_x >= i4_mb_quard1_part_x) |
| { |
| if(i4_y < i4_mb_quard1_part_y) |
| { |
| i4_ref_mb_type = i4_ref_mb_type_q1; |
| } |
| else if(i4_y >= i4_mb_quard1_part_y) |
| { |
| i4_ref_mb_type = i4_ref_mb_type_q3; |
| } |
| } |
| else if(i4_x < i4_mb_quard1_part_x) |
| { |
| if(i4_y >= i4_mb_quard1_part_y) |
| { |
| i4_ref_mb_type = i4_ref_mb_type_q2; |
| } |
| } |
| |
| /****************************************************************/ |
| /* Reference layer Residual Buffer is maintained as 8-bit data */ |
| /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read */ |
| /* and sign of the data sample is extracted depending upon bit */ |
| /* postition. */ |
| /****************************************************************/ |
| |
| /* update the buffer pointers to appropriate locations */ |
| pi2_ref_array_temp = pi2_ref_array + i4_x; |
| pi2_ref_array_temp += i4_y * i4_refarray_wd; |
| |
| /* extract the residual value and fill the buffer */ |
| if(SVC_INTER_MB == i4_ref_mb_type) |
| { |
| /* derive the reference data pointers */ |
| pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag); |
| pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride; |
| |
| /* store the residual value */ |
| *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte); |
| } |
| else |
| { |
| /* if non inter MB then store the 0 */ |
| *pi2_ref_array_temp = 0; |
| } |
| } |
| } |
| } |
| |
| void isvcd_residual_reflayer_const_boundary_mb(WORD16 *pi2_inp_data, WORD32 i4_inp_data_stride, |
| WORD16 *pi2_ref_array, WORD32 i4_refarray_wd, |
| WORD32 i4_refarray_ht, WORD32 i4_ref_wd, |
| WORD32 i4_ref_ht, WORD32 i4_x_offset, |
| WORD32 i4_y_offset, WORD32 i4_ref_mb_type_q0, |
| WORD32 i4_ref_mb_type_q1, WORD32 i4_ref_mb_type_q2, |
| WORD32 i4_ref_mb_type_q3, WORD32 i4_mb_quard1_part_x, |
| WORD32 i4_mb_quard1_part_y, WORD32 i4_chroma_flag) |
| { |
| WORD32 i4_x_ref, i4_y_ref; |
| WORD32 i4_x, i4_y; |
| WORD16 *pi2_ref_data_byte; |
| WORD16 *pi2_ref_array_temp; |
| |
| /*Quard 0*/ |
| for(i4_y = 0; i4_y < i4_mb_quard1_part_y; i4_y++) |
| { |
| for(i4_x = 0; i4_x < i4_mb_quard1_part_x; i4_x++) |
| { |
| i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset)); |
| i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset)); |
| |
| /****************************************************************/ |
| /* Reference layer Residual Buffer is maintained as 8-bit data */ |
| /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read */ |
| /* and sign of the data sample is extracted depending upon bit */ |
| /* postition. */ |
| /****************************************************************/ |
| |
| /* update the buffer pointers to appropriate locations */ |
| pi2_ref_array_temp = pi2_ref_array + i4_x; |
| pi2_ref_array_temp += i4_y * i4_refarray_wd; |
| |
| /* extract the residual value and fill the buffer */ |
| if(SVC_INTER_MB == i4_ref_mb_type_q0) |
| { |
| /* input pointer will be pointing to (xoffset,yoffset) */ |
| /* So subtract the correction to reference location */ |
| if(0 <= i4_x_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_x_ref = i4_x_ref - i4_x_offset; |
| } |
| |
| if(0 <= i4_y_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_y_ref = i4_y_ref - i4_y_offset; |
| } |
| /* derive the reference data pointers */ |
| |
| pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag); |
| pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride; |
| |
| /* store the residual value */ |
| *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte); |
| } |
| else |
| { |
| /* if non inter MB then store the 0 */ |
| *pi2_ref_array_temp = 0; |
| } |
| } |
| } |
| |
| /*Quard 1*/ |
| for(i4_y = 0; i4_y < i4_mb_quard1_part_y; i4_y++) |
| { |
| for(i4_x = i4_mb_quard1_part_x; i4_x < i4_refarray_wd; i4_x++) |
| { |
| i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset)); |
| i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset)); |
| |
| /****************************************************************/ |
| /* Reference layer Residual Buffer is maintained as 8-bit data */ |
| /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read */ |
| /* and sign of the data sample is extracted depending upon bit */ |
| /* postition. */ |
| /****************************************************************/ |
| |
| /* update the buffer pointers to appropriate locations */ |
| pi2_ref_array_temp = pi2_ref_array + i4_x; |
| pi2_ref_array_temp += i4_y * i4_refarray_wd; |
| |
| /* extract the residual value and fill the buffer */ |
| if(SVC_INTER_MB == i4_ref_mb_type_q1) |
| { |
| /* input pointer will be pointing to (xoffset,yoffset) */ |
| /* So subtract the correction to reference location */ |
| if(0 <= i4_x_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_x_ref = i4_x_ref - i4_x_offset; |
| } |
| if(0 <= i4_y_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_y_ref = i4_y_ref - i4_y_offset; |
| } |
| /* derive the reference data pointers */ |
| |
| pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag); |
| pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride; |
| |
| /* store the residual value */ |
| *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte); |
| } |
| else |
| { |
| /* if non inter MB then store the 0 */ |
| *pi2_ref_array_temp = 0; |
| } |
| } |
| } |
| |
| /*Quard 2*/ |
| for(i4_y = i4_mb_quard1_part_y; i4_y < i4_refarray_ht; i4_y++) |
| { |
| for(i4_x = 0; i4_x < i4_mb_quard1_part_x; i4_x++) |
| { |
| i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset)); |
| i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset)); |
| |
| /****************************************************************/ |
| /* Reference layer Residual Buffer is maintained as 8-bit data */ |
| /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read */ |
| /* and sign of the data sample is extracted depending upon bit */ |
| /* postition. */ |
| /****************************************************************/ |
| |
| /* update the buffer pointers to appropriate locations */ |
| pi2_ref_array_temp = pi2_ref_array + i4_x; |
| pi2_ref_array_temp += i4_y * i4_refarray_wd; |
| |
| /* extract the residual value and fill the buffer */ |
| if(SVC_INTER_MB == i4_ref_mb_type_q2) |
| { |
| /* input pointer will be pointing to (xoffset,yoffset) */ |
| /* So subtract the correction to reference location */ |
| if(0 <= i4_x_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_x_ref = i4_x_ref - i4_x_offset; |
| } |
| if(0 <= i4_y_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_y_ref = i4_y_ref - i4_y_offset; |
| } |
| /* derive the reference data pointers */ |
| pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag); |
| pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride; |
| |
| /* store the residual value */ |
| *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte); |
| } |
| else |
| { |
| /* if non inter MB then store the 0 */ |
| *pi2_ref_array_temp = 0; |
| } |
| } |
| } |
| |
| /*Quard 3*/ |
| for(i4_y = i4_mb_quard1_part_y; i4_y < i4_refarray_ht; i4_y++) |
| { |
| for(i4_x = i4_mb_quard1_part_x; i4_x < i4_refarray_wd; i4_x++) |
| { |
| i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset)); |
| i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset)); |
| |
| /****************************************************************/ |
| /* Reference layer Residual Buffer is maintained as 8-bit data */ |
| /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read */ |
| /* and sign of the data sample is extracted depending upon bit */ |
| /* postition. */ |
| /****************************************************************/ |
| |
| /* update the buffer pointers to appropriate locations */ |
| pi2_ref_array_temp = pi2_ref_array + i4_x; |
| pi2_ref_array_temp += i4_y * i4_refarray_wd; |
| |
| /* extract the residual value and fill the buffer */ |
| if(SVC_INTER_MB == i4_ref_mb_type_q3) |
| { |
| /* input pointer will be pointing to (xoffset,yoffset) */ |
| /* So subtract the correction to reference location */ |
| if(0 <= i4_x_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_x_ref = i4_x_ref - i4_x_offset; |
| } |
| if(0 <= i4_y_offset) |
| { |
| /* if only inside frame dimension */ |
| i4_y_ref = i4_y_ref - i4_y_offset; |
| } |
| /* derive the reference data pointers */ |
| pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag); |
| pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride; |
| |
| /* store the residual value */ |
| *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte); |
| } |
| else |
| { |
| /* if non inter MB then store the 0 */ |
| *pi2_ref_array_temp = 0; |
| } |
| } |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_reflayer_const */ |
| /* */ |
| /* Description : This function constructs the reference array buffer */ |
| /* used for residual resampling of a component in an MB */ |
| /* */ |
| /* Inputs : pv_residual_samp_ctxt: intra sampling context */ |
| /* pu1_inp : input (reference layer data) */ |
| /* i4_inp_stride : input buffer stride */ |
| /* pu1_inp_bitmap : input (reference layer sign bits) */ |
| /* i4_inp_stride : input buffer stride */ |
| /* ps_ref_mb_mode : ref layer mb mode buffer desc */ |
| /* pi4_refarr_wd : pointer to store the reference array WD */ |
| /* pi4_refarr_ht : pointer to store the reference array HT */ |
| /* pi4_x_offset : pointer to store the reference X offset */ |
| /* pi4_y_offset : pointer to store the reference Y offset */ |
| /* ps_coord : mb co-ordinate structure */ |
| /* i4_chroma_flag : chroma processing flag */ |
| /* Globals : none */ |
| /* Processing : it fills the reference layer data if they are falling in */ |
| /* INTRA MB region. If all the pixels are not filled it */ |
| /* calls the border extension algorithm to fill them */ |
| /* Outputs : none */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 06 07 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| WORD32 isvcd_residual_reflayer_const(void *pv_residual_samp_ctxt, WORD16 *pi2_inp_data, |
| WORD32 i4_inp_data_stride, mem_element_t *ps_ref_mb_mode, |
| WORD32 *pi4_refarr_wd, mb_coord_t *ps_coord, |
| WORD32 i4_chroma_flag) |
| { |
| residual_sampling_ctxt_t *ps_ctxt; |
| res_lyr_ctxt *ps_lyr_ctxt; |
| WORD8 *pi1_ref_mb_modes; |
| WORD32 i4_ref_mode_stride; |
| WORD32 i4_element_size; |
| WORD32 i4_ref_wd; |
| WORD32 i4_ref_ht; |
| WORD32 i4_x_offset; |
| WORD32 i4_y_offset; |
| WORD32 i4_refarray_wd; |
| WORD32 i4_refarray_ht; |
| WORD8 i1_edge_mb; |
| WORD16 *pi2_ref_array; |
| WORD32 i4_mb_sft; |
| WORD32 i4_mb_x, i4_mb_y; |
| WORD32 i4_mb_x_strt, i4_mb_y_strt; |
| WORD32 i4_mb_quard1_part_x, i4_mb_quard1_part_y; |
| WORD8 *pi1_ref_mb_modes_incr; |
| WORD8 *pi1_ref_mb_modes_incr_temp; |
| inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms; |
| |
| WORD32 i4_mb_wd; |
| WORD32 i4_mb_ht; |
| WORD32 i4_x_ref, i4_y_ref; |
| WORD32 i4_ref_mb_type_q0, i4_ref_mb_type_q1, i4_ref_mb_type_q2, i4_ref_mb_type_q3; |
| WORD8 i1_mb_mode_q0, i1_mb_mode_q1, i1_mb_mode_q2, i1_mb_mode_q3; |
| WORD32 ret; |
| |
| ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id]; |
| pi2_ref_array = ps_ctxt->pi2_refarray_buffer; |
| |
| pi1_ref_mb_modes = (WORD8 *) ps_ref_mb_mode->pv_buffer; |
| i4_ref_mode_stride = ps_ref_mb_mode->i4_num_element_stride; |
| i4_element_size = ps_ref_mb_mode->i4_element_size; |
| |
| if(NULL == pi1_ref_mb_modes) |
| { |
| return NOT_OK; |
| } |
| |
| i4_mb_wd = MB_WIDTH >> i4_chroma_flag; |
| i4_mb_ht = MB_HEIGHT >> i4_chroma_flag; |
| |
| /* ----------------------------------------------------------------- */ |
| /* Deriving the parameters required for further processing */ |
| /* ----------------------------------------------------------------- */ |
| { |
| ref_mb_map_t *ps_x_off_len; |
| ref_mb_map_t *ps_y_off_len; |
| WORD32 i4_mbaddr_x; |
| WORD32 i4_mbaddr_y; |
| WORD32 i4_base_width; |
| WORD32 i4_base_height; |
| residual_samp_map_ctxt_t *ps_map_ctxt; |
| |
| if(1 == i4_chroma_flag) |
| ps_map_ctxt = &ps_lyr_ctxt->s_chroma_map_ctxt; |
| else |
| ps_map_ctxt = &ps_lyr_ctxt->s_luma_map_ctxt; |
| |
| i4_mbaddr_y = ps_coord->u2_mb_y; |
| i4_mbaddr_x = ps_coord->u2_mb_x; |
| i4_base_width = ps_lyr_ctxt->i4_ref_width; |
| i4_base_height = ps_lyr_ctxt->i4_ref_height; |
| i4_ref_wd = i4_base_width >> i4_chroma_flag; |
| i4_ref_ht = i4_base_height >> i4_chroma_flag; |
| |
| /* --------------------------------------------------------------------- */ |
| /* Extracting information from the mapping context */ |
| /* --------------------------------------------------------------------- */ |
| ps_x_off_len = ps_map_ctxt->ps_x_offset_length; |
| ps_y_off_len = ps_map_ctxt->ps_y_offset_length; |
| i4_x_offset = ps_x_off_len[i4_mbaddr_x].i2_offset; |
| i4_y_offset = ps_y_off_len[i4_mbaddr_y].i2_offset; |
| i4_refarray_wd = ps_x_off_len[i4_mbaddr_x].i2_length; |
| i4_refarray_ht = ps_y_off_len[i4_mbaddr_y].i2_length; |
| } |
| |
| /* Call the module to fill the increments based on transform blocks */ |
| ret = isvcd_ref_layer_ptr_incr(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size, |
| i4_x_offset, i4_y_offset, i4_refarray_wd, i4_refarray_ht, |
| ps_ctxt->pu1_ref_x_ptr_incr, ps_ctxt->pu1_ref_y_ptr_incr, |
| i4_chroma_flag); |
| |
| if(ret != OK) |
| { |
| return ret; |
| } |
| i4_mb_sft = (MB_WIDTH_SHIFT - i4_chroma_flag); |
| |
| /* --------------------------------------------------------------------- */ |
| /* MB Level Resampling for the MB - Pointers sent for MB in both layers */ |
| /* This has been written according to the dyadic case */ |
| /* --------------------------------------------------------------------- */ |
| i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, 0 + i4_y_offset)); |
| i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, 0 + i4_x_offset)); |
| i4_mb_x_strt = i4_x_ref % i4_mb_wd; |
| i4_mb_y_strt = i4_y_ref % i4_mb_ht; |
| |
| i4_mb_quard1_part_x = i4_mb_wd - i4_mb_x_strt; |
| i4_mb_quard1_part_y = i4_mb_ht - i4_mb_y_strt; |
| if(!(i4_mb_quard1_part_x >= 0)) |
| { |
| return NOT_OK; |
| } |
| if(!(i4_mb_quard1_part_y >= 0)) |
| { |
| return NOT_OK; |
| } |
| |
| i4_mb_x = (i4_x_ref >> i4_mb_sft); |
| i4_mb_y = (i4_y_ref >> i4_mb_sft); |
| |
| /* get the location of the byte which has the current mb mode */ |
| pi1_ref_mb_modes_incr = pi1_ref_mb_modes + (i4_mb_y * i4_ref_mode_stride * i4_element_size); |
| pi1_ref_mb_modes_incr += (i4_mb_x * i4_element_size); |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr; |
| i1_mb_mode_q0 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| i1_mb_mode_q1 = i1_mb_mode_q0; |
| i1_mb_mode_q2 = i1_mb_mode_q0; |
| i1_mb_mode_q3 = i1_mb_mode_q0; |
| |
| pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr; |
| if(i4_mb_quard1_part_x > 0) |
| { |
| pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr + i4_element_size; |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp; |
| i1_mb_mode_q1 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| } |
| |
| if(i4_mb_quard1_part_y > 0) |
| { |
| pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size); |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp; |
| i1_mb_mode_q2 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| } |
| |
| if((i4_mb_quard1_part_x > 0) && (i4_mb_quard1_part_y > 0)) |
| { |
| pi1_ref_mb_modes_incr_temp = |
| pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size) + i4_element_size; |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp; |
| i1_mb_mode_q3 = ps_inter_lyr_mb_prms->i1_mb_mode; |
| } |
| |
| i4_ref_mb_type_q0 = (i1_mb_mode_q0 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB; |
| i4_ref_mb_type_q1 = (i1_mb_mode_q1 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB; |
| i4_ref_mb_type_q2 = (i1_mb_mode_q2 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB; |
| i4_ref_mb_type_q3 = (i1_mb_mode_q3 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB; |
| |
| i1_edge_mb = (ps_coord->u2_mb_x == 0 || ps_coord->u2_mb_y == 0 || |
| (ps_coord->u2_mb_x == ((ps_lyr_ctxt->i4_curr_width >> MB_WIDTH_SHIFT) - 1)) || |
| (ps_coord->u2_mb_y == ((ps_lyr_ctxt->i4_curr_height >> MB_HEIGHT_SHIFT) - 1))); |
| if(i1_edge_mb) |
| { |
| ps_ctxt->pf_residual_reflayer_const_boundary_mb( |
| pi2_inp_data, i4_inp_data_stride, pi2_ref_array, i4_refarray_wd, i4_refarray_ht, |
| i4_ref_wd, i4_ref_ht, i4_x_offset, i4_y_offset, i4_ref_mb_type_q0, i4_ref_mb_type_q1, |
| i4_ref_mb_type_q2, i4_ref_mb_type_q3, i4_mb_quard1_part_x, i4_mb_quard1_part_y, |
| i4_chroma_flag); |
| } |
| else |
| { |
| ps_ctxt->pf_residual_reflayer_const_non_boundary_mb( |
| pi2_inp_data, i4_inp_data_stride, pi2_ref_array, i4_refarray_wd, i4_refarray_ht, |
| i4_ref_mb_type_q0, i4_ref_mb_type_q1, i4_ref_mb_type_q2, i4_ref_mb_type_q3, |
| i4_mb_quard1_part_x, i4_mb_quard1_part_y, i4_chroma_flag); |
| } |
| /* store the values into the place holders */ |
| *pi4_refarr_wd = i4_refarray_wd; |
| |
| return OK; |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_interpolate_residual */ |
| /* */ |
| /* Description : This function takes the refernce array buffer and perform*/ |
| /* interpolation of a component to find the residual */ |
| /* resampled value */ |
| /* Inputs : pv_residual_samp_ctxt : residual sampling context */ |
| /* pi2_out : output buffer pointer */ |
| /* i4_out_stride : output buffer stride */ |
| /* i4_refarray_wd : reference array width */ |
| /* i4_x_offset : offset in reference layer in horz direction*/ |
| /* ps_coord : current mb co-ordinate */ |
| /* i4_chroma_flag : chroma processing flag */ |
| /* Globals : none */ |
| /* Processing : it does the interpolation in vertical direction followed */ |
| /* by horizontal direction */ |
| /* Outputs : resampled pixels */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 06 07 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| void isvcd_interpolate_residual(void *pv_residual_samp_ctxt, WORD16 *pi2_out, WORD32 i4_out_stride, |
| WORD32 i4_refarray_wd, UWORD16 u2_mb_x, UWORD16 u2_mb_y, |
| WORD32 i4_chroma_flag) |
| { |
| residual_sampling_ctxt_t *ps_ctxt; |
| residual_samp_map_ctxt_t *ps_map_ctxt; |
| res_lyr_ctxt *ps_lyr_ctxt; |
| ref_pixel_map_t *ps_x_pos_phase; |
| ref_pixel_map_t *ps_y_pos_phase; |
| |
| WORD32 i4_x, i4_y; |
| WORD32 i4_frm_mb_x, i4_frm_mb_y; |
| WORD32 i4_temp_array_ht; |
| WORD32 i4_mb_wd; |
| WORD32 i4_mb_ht; |
| WORD16 *pi2_ref_array; |
| UWORD8 *pu1_ref_x_ptr_incr, *pu1_ref_y_ptr_incr; |
| |
| ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id]; |
| pi2_ref_array = ps_ctxt->pi2_refarray_buffer; |
| pu1_ref_x_ptr_incr = ps_ctxt->pu1_ref_x_ptr_incr; |
| pu1_ref_y_ptr_incr = ps_ctxt->pu1_ref_y_ptr_incr; |
| |
| /* --------------------------------------------------------------------- */ |
| /* Extracting information from the mapping context */ |
| /* --------------------------------------------------------------------- */ |
| if(1 == i4_chroma_flag) |
| ps_map_ctxt = &ps_lyr_ctxt->s_chroma_map_ctxt; |
| else |
| ps_map_ctxt = &ps_lyr_ctxt->s_luma_map_ctxt; |
| |
| i4_mb_wd = MB_WIDTH >> i4_chroma_flag; |
| i4_mb_ht = MB_HEIGHT >> i4_chroma_flag; |
| |
| ps_x_pos_phase = ps_map_ctxt->ps_x_pos_phase; |
| ps_y_pos_phase = ps_map_ctxt->ps_y_pos_phase; |
| i4_temp_array_ht = i4_mb_ht; |
| i4_frm_mb_y = u2_mb_y * i4_mb_ht; |
| i4_frm_mb_x = u2_mb_x * i4_mb_wd; |
| |
| /* --------------------------------------------------------------------- */ |
| /* Loop for interpolation */ |
| /* --------------------------------------------------------------------- */ |
| for(i4_y = 0; i4_y < (i4_temp_array_ht); i4_y++) |
| { |
| for(i4_x = 0; i4_x < (i4_mb_wd); i4_x++) |
| { |
| WORD32 i4_i; |
| WORD32 i4_y_ref; |
| WORD32 i4_y_phase; |
| WORD32 i4_x_ref; |
| WORD32 i4_x_phase; |
| WORD32 i4_x_ref_round; |
| WORD16 *pi2_out_curr; |
| WORD32 ai4_temp_pred[2] = {0}; |
| UWORD8 *pu1_ref_y_ptr_incr_temp; |
| WORD32 *pi4_temp_pred; |
| UWORD8 u1_incr_y; |
| WORD16 i2_res; |
| |
| /* derive the current output pointer */ |
| pi2_out_curr = pi2_out + (i4_x << i4_chroma_flag) + (i4_y * i4_out_stride); |
| |
| /* -------------------------------------------------------------- */ |
| /* Finding the offset */ |
| /* -------------------------------------------------------------- */ |
| i4_y_ref = ps_y_pos_phase[i4_y + i4_frm_mb_y].i2_ref_pos; |
| i4_y_phase = ps_y_pos_phase[i4_y + i4_frm_mb_y].i2_phase; |
| i4_x_ref = ps_x_pos_phase[i4_x + i4_frm_mb_x].i2_ref_pos; |
| i4_x_phase = ps_x_pos_phase[i4_x + i4_frm_mb_x].i2_phase; |
| |
| /* horizontal processing*/ |
| for(i4_i = 0; i4_i < 2; i4_i++) |
| { |
| UWORD8 *pu1_ref_x_ptr_incr_temp; |
| UWORD8 u1_incr; |
| WORD16 *pi2_ref_array_1, *pi2_ref_array_2; |
| |
| /* derive appropriate pointers */ |
| pu1_ref_x_ptr_incr_temp = pu1_ref_x_ptr_incr + i4_x_ref; |
| pu1_ref_x_ptr_incr_temp += ((i4_y_ref + i4_i) * i4_refarray_wd); |
| u1_incr = *pu1_ref_x_ptr_incr_temp; |
| pi2_ref_array_1 = pi2_ref_array + i4_x_ref; |
| pi2_ref_array_1 += ((i4_y_ref + i4_i) * i4_refarray_wd); |
| |
| if(!u1_incr) |
| { |
| pi2_ref_array_1 += (i4_x_phase >> 3); |
| } |
| |
| pi2_ref_array_2 = pi2_ref_array_1 + u1_incr; |
| ai4_temp_pred[i4_i] = |
| (16 - i4_x_phase) * (*pi2_ref_array_1) + i4_x_phase * (*pi2_ref_array_2); |
| } |
| |
| /* vertical processing */ |
| i4_x_ref_round = (i4_x_ref + (i4_x_phase >> 3)); |
| pu1_ref_y_ptr_incr_temp = |
| pu1_ref_y_ptr_incr + i4_x_ref_round + (i4_y_ref * i4_refarray_wd); |
| u1_incr_y = *pu1_ref_y_ptr_incr_temp; |
| |
| pi4_temp_pred = &ai4_temp_pred[0]; |
| if(!u1_incr_y) |
| { |
| pi4_temp_pred += (i4_y_phase >> 3); |
| } |
| |
| i2_res = (((16 - i4_y_phase) * pi4_temp_pred[0] + |
| i4_y_phase * pi4_temp_pred[u1_incr_y] + 128) >> |
| 8); |
| |
| /* store back the final residual */ |
| *pi2_out_curr = i2_res; |
| } /* end of loop over width */ |
| } /* end of loop over height */ |
| |
| return; |
| } /* End of Interpolation Function */ |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_samp_mb */ |
| /* */ |
| /* Description : MB level function whcih perform the residual resampling */ |
| /* of data of an MB (luma and chroma insclusive) */ |
| /* */ |
| /* Inputs : pv_residual_samp_ctxt : residual sampling context */ |
| /* ps_ref_luma : reference layer luma data buffer desc */ |
| /* ps_ref_chroma : reference layer chroma data buffer desc */ |
| /* ps_ref_luma_bitmap : ref layer luma bit map buffer desc */ |
| /* ps_ref_chroma_bitmap : ref layer chroma bit map buff des */ |
| /* ps_ref_mb_mode : ref layer mb mode map buff desc */ |
| /* ps_out_luma : current layer out luma buffer desc */ |
| /* ps_out_chroma : current layer out chroma buffer desc */ |
| /* ps_mb_coord : current mb coorinate */ |
| /* Globals : none */ |
| /* Processing : it calls the reference layer construction followed by */ |
| /* interplaotion function for luma and cb and cr */ |
| /* Outputs : inter resampled data of current MB */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 26 06 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| WORD32 isvcd_residual_samp_mb(void *pv_residual_samp_ctxt, mem_element_t *ps_ref_luma, |
| mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_mb_mode, |
| mem_element_t *ps_out_luma, mem_element_t *ps_out_chroma, |
| UWORD16 u2_mb_x, UWORD16 u2_mb_y) |
| { |
| /* --------------------------------------------------------------------- */ |
| /* I/O buffer params */ |
| /* --------------------------------------------------------------------- */ |
| residual_sampling_ctxt_t *ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| WORD16 *pi2_inp; |
| WORD16 *pi2_out; |
| WORD32 i4_inp_stride; |
| WORD32 i4_out_stride; |
| WORD32 i4_refarray_wd; |
| mb_coord_t s_mb_coord = {0}; |
| WORD32 ret; |
| s_mb_coord.u2_mb_x = u2_mb_x; |
| s_mb_coord.u2_mb_y = u2_mb_y; |
| |
| /* --------------------------------------------------------------------- */ |
| /* LUMA PROCESSING */ |
| /* --------------------------------------------------------------------- */ |
| pi2_inp = (WORD16 *) ps_ref_luma->pv_buffer; |
| pi2_out = (WORD16 *) ps_out_luma->pv_buffer; |
| i4_inp_stride = ps_ref_luma->i4_num_element_stride; |
| i4_out_stride = ps_out_luma->i4_num_element_stride; |
| |
| /* ------- Constructing refSampleArray ----------------------- */ |
| ret = isvcd_residual_reflayer_const(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride, |
| ps_ref_mb_mode, &i4_refarray_wd, &s_mb_coord, 0); |
| |
| if(ret != OK) return ret; |
| /* ---- Interpolation process for Residual prediction ------ */ |
| ps_ctxt->pf_interpolate_residual(pv_residual_samp_ctxt, pi2_out, i4_out_stride, i4_refarray_wd, |
| s_mb_coord.u2_mb_x, s_mb_coord.u2_mb_y, 0); |
| |
| /* --------------------------------------------------------------------- */ |
| /* CHROMA PROCESSING */ |
| /* --------------------------------------------------------------------- */ |
| /* CB */ |
| pi2_inp = (WORD16 *) ps_ref_chroma->pv_buffer; |
| pi2_out = (WORD16 *) ps_out_chroma->pv_buffer; |
| i4_inp_stride = ps_ref_chroma->i4_num_element_stride; |
| i4_out_stride = ps_out_chroma->i4_num_element_stride; |
| |
| /* ------- Constructing refSampleArray ----------------------- */ |
| ret = isvcd_residual_reflayer_const(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride, |
| ps_ref_mb_mode, &i4_refarray_wd, &s_mb_coord, 1); |
| |
| if(ret != OK) return ret; |
| /* ---- Interpolation process for Residual prediction ------ */ |
| ps_ctxt->pf_interpolate_residual(pv_residual_samp_ctxt, pi2_out, i4_out_stride, i4_refarray_wd, |
| s_mb_coord.u2_mb_x, s_mb_coord.u2_mb_y, 1); |
| |
| /* CR */ |
| pi2_inp += 1; |
| pi2_out += 1; |
| |
| /* ------- Constructing refSampleArray ----------------------- */ |
| ret = isvcd_residual_reflayer_const(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride, |
| ps_ref_mb_mode, &i4_refarray_wd, &s_mb_coord, 1); |
| |
| if(ret != OK) return ret; |
| /* ---- Interpolation process for Residual prediction --------- */ |
| ps_ctxt->pf_interpolate_residual(pv_residual_samp_ctxt, pi2_out, i4_out_stride, i4_refarray_wd, |
| s_mb_coord.u2_mb_x, s_mb_coord.u2_mb_y, 1); |
| return OK; |
| } |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_samp_mb_dyadic */ |
| /* */ |
| /* Description : MB level function whcih perform the residual resampling */ |
| /* of data of an MB (luma and chroma insclusive) */ |
| /* for Dyadic cases */ |
| /* Inputs : pv_residual_samp_ctxt : residual sampling context */ |
| /* ps_ref_luma : reference layer luma data buffer desc */ |
| /* ps_ref_chroma : reference layer chroma data buffer desc */ |
| /* ps_ref_luma_bitmap : ref layer luma bit map buffer desc */ |
| /* ps_ref_chroma_bitmap : ref layer chroma bit map buff des */ |
| /* ps_ref_mb_mode : ref layer mb mode map buff desc */ |
| /* ps_out_luma : current layer out luma buffer desc */ |
| /* ps_out_chroma : current layer out chroma buffer desc */ |
| /* ps_mb_coord : current mb coorinate */ |
| /* Globals : none */ |
| /* Processing : it calls the reference layer construction followed by */ |
| /* interplaotion function for luma and cb and cr */ |
| /* Outputs : inter resampled data of current MB */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 26 06 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| WORD32 isvcd_residual_samp_mb_dyadic(void *pv_residual_samp_ctxt, mem_element_t *ps_ref_luma, |
| mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_mb_mode, |
| mem_element_t *ps_out_luma, mem_element_t *ps_out_chroma, |
| UWORD16 u2_mb_x, UWORD16 u2_mb_y) |
| { |
| residual_sampling_ctxt_t *ps_ctxt; |
| res_lyr_ctxt *ps_lyr_ctxt; |
| /* --------------------------------------------------------------------- */ |
| /* I/O buffer params */ |
| /* --------------------------------------------------------------------- */ |
| WORD16 *pi2_inp; |
| WORD16 *pi2_out; |
| WORD32 i4_inp_stride; |
| WORD32 i4_out_stride; |
| WORD32 i4_luma_nnz; |
| WORD32 i4_chroma_nnz; |
| WORD32 i4_tx_size; |
| |
| ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id]; |
| |
| /* --------------------------------------------------------------------- */ |
| /* LUMA PROCESSING */ |
| /* --------------------------------------------------------------------- */ |
| pi2_inp = (WORD16 *) ps_ref_luma->pv_buffer; |
| pi2_out = (WORD16 *) ps_out_luma->pv_buffer; |
| i4_inp_stride = ps_ref_luma->i4_num_element_stride; |
| i4_out_stride = ps_out_luma->i4_num_element_stride; |
| |
| { |
| WORD32 i4_offset_x, i4_offset_y; |
| residual_samp_map_ctxt_t *ps_luma_map; |
| ref_mb_map_t *ps_x_off_len_luma; |
| ref_mb_map_t *ps_y_off_len_luma; |
| |
| ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt; |
| ps_x_off_len_luma = ps_luma_map->ps_x_offset_length; |
| ps_y_off_len_luma = ps_luma_map->ps_y_offset_length; |
| |
| /* get the actual offset for the buffers */ |
| i4_offset_x = ps_x_off_len_luma[u2_mb_x].i2_offset; |
| i4_offset_y = ps_y_off_len_luma[u2_mb_y].i2_offset; |
| |
| { |
| inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms; |
| WORD32 i4_mb_x, i4_mb_y; |
| UWORD16 u2_luma_mask = 0x0033; |
| UWORD8 u1_chrm_mask = 0x11; |
| WORD32 i4_luma_rt_sft_amt = 0; |
| WORD32 i4_chrm_rt_sft_amt = 0; |
| |
| i4_mb_x = ((i4_offset_x + 1) >> MB_WIDTH_SHIFT); |
| i4_mb_y = ((i4_offset_y + 1) >> MB_HEIGHT_SHIFT); |
| |
| /* get the location of the byte which has the current mb mode */ |
| ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) ps_ref_mb_mode->pv_buffer; |
| ps_inter_lyr_mb_prms += i4_mb_x; |
| ps_inter_lyr_mb_prms += i4_mb_y * ps_ref_mb_mode->i4_num_element_stride; |
| |
| /* get the approp block in base layer in horz direction */ |
| if(0 != ((i4_offset_x + 1) & 15)) |
| { |
| u2_luma_mask <<= 2; |
| i4_luma_rt_sft_amt += 2; |
| u1_chrm_mask <<= 1; |
| i4_chrm_rt_sft_amt += 1; |
| } |
| /* get the approp block in base layer in vert direction */ |
| if(0 != ((i4_offset_y + 1) & 15)) |
| { |
| u2_luma_mask <<= 8; |
| i4_luma_rt_sft_amt += 8; |
| |
| u1_chrm_mask <<= 2; |
| i4_chrm_rt_sft_amt += 2; |
| } |
| |
| /* extract the nnz and store it */ |
| i4_luma_nnz = (ps_inter_lyr_mb_prms->u2_luma_nnz & u2_luma_mask) >> i4_luma_rt_sft_amt; |
| i4_chroma_nnz = |
| (ps_inter_lyr_mb_prms->u1_chroma_nnz & u1_chrm_mask) >> i4_chrm_rt_sft_amt; |
| i4_tx_size = |
| (ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1 : ps_inter_lyr_mb_prms->i1_tx_size; |
| } |
| |
| /* since in dyadic case the window width and height will be 10x10 */ |
| /* and the window start offsets will be always 1 column left and */ |
| /* 1 row above the block boundary. so the pointer and the required */ |
| /* positions are appropriately modified */ |
| if(i4_offset_x >= 0) |
| { |
| pi2_inp++; |
| } |
| |
| if(i4_offset_y >= 0) |
| { |
| pi2_inp += i4_inp_stride; |
| } |
| |
| ps_ctxt->pf_residual_luma_dyadic(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride, pi2_out, |
| i4_out_stride, ps_ref_mb_mode, u2_mb_x, u2_mb_y, |
| i4_luma_nnz, i4_tx_size); |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* CHROMA PROCESSING */ |
| /* --------------------------------------------------------------------- */ |
| /* CB */ |
| pi2_inp = (WORD16 *) ps_ref_chroma->pv_buffer; |
| pi2_out = (WORD16 *) ps_out_chroma->pv_buffer; |
| i4_inp_stride = ps_ref_chroma->i4_num_element_stride; |
| i4_out_stride = ps_out_chroma->i4_num_element_stride; |
| |
| /* choose the appropriate chroma processing routine */ |
| if(SVCD_FALSE == ps_lyr_ctxt->i4_chrm_alt_proc) |
| { |
| WORD32 i4_offset_x, i4_offset_y; |
| residual_samp_map_ctxt_t *ps_chroma_map; |
| ref_mb_map_t *ps_x_off_len_chroma; |
| ref_mb_map_t *ps_y_off_len_chroma; |
| |
| ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt; |
| ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length; |
| ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length; |
| |
| /* get the actual offset for the buffers */ |
| i4_offset_x = ps_x_off_len_chroma[u2_mb_x].i2_offset; |
| i4_offset_y = ps_y_off_len_chroma[u2_mb_y].i2_offset; |
| |
| /* since in dyadic case the window width and height will be 6x6 */ |
| /* and the window start offsets will be always 1 column left and */ |
| /* 1 row above the block boundary. so the pointer and the required */ |
| /* positions are appropriately modified */ |
| if(i4_offset_x >= 0) |
| { |
| pi2_inp += 2; |
| } |
| |
| if(i4_offset_y >= 0) |
| { |
| pi2_inp += i4_inp_stride; |
| } |
| |
| if(0 != (i4_chroma_nnz & 0x01)) |
| { |
| ps_ctxt->pf_residual_chroma_dyadic(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride, |
| pi2_out, i4_out_stride); |
| } |
| } |
| else |
| { |
| ps_ctxt->pf_residual_chroma_dyadic_alt(pv_residual_samp_ctxt, u2_mb_x, u2_mb_y, |
| ps_ref_mb_mode, pi2_inp, i4_inp_stride, pi2_out, |
| i4_out_stride, SVCD_FALSE); |
| } |
| |
| /* CR */ |
| pi2_inp += 1; |
| pi2_out += 1; |
| |
| if(SVCD_FALSE == ps_lyr_ctxt->i4_chrm_alt_proc) |
| { |
| if(0 != (i4_chroma_nnz & 0x10)) |
| { |
| ps_ctxt->pf_residual_chroma_dyadic(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride, |
| pi2_out, i4_out_stride); |
| } |
| } |
| else |
| { |
| ps_ctxt->pf_residual_chroma_dyadic_alt(pv_residual_samp_ctxt, u2_mb_x, u2_mb_y, |
| ps_ref_mb_mode, pi2_inp, i4_inp_stride, pi2_out, |
| i4_out_stride, SVCD_TRUE); |
| } |
| return OK; |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_samp_populate_list */ |
| /* */ |
| /* Description : This is a seq or frame level init function which fills */ |
| /* all offsets, projected locations arrays based on */ |
| /* the two resolutions and cropping parameters */ |
| /* Inputs : refer to doxygen comments below */ |
| /* Globals : none */ |
| /* Processing : it projects the locations and computes the values */ |
| /* */ |
| /* Outputs : none */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 06 07 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| void isvcd_residual_samp_populate_list(residual_samp_map_ctxt_t *ps_map_ctxt, |
| dec_seq_params_t *ps_sps, |
| dec_svc_seq_params_t *ps_subset_sps, |
| res_prms_t *ps_curr_res_prms, res_prms_t *ps_ref_res_prms, |
| WORD32 i4_chroma_flag) |
| { |
| /* --------------------------------------------------------------------- */ |
| /* Local variables required for finding the mapping between the layers */ |
| /* --------------------------------------------------------------------- */ |
| UWORD32 u4_shift_x; |
| UWORD32 u4_shift_y; |
| UWORD32 u4_scale_x; |
| UWORD32 u4_scale_y; |
| WORD32 i4_offset_x; |
| WORD32 i4_offset_y; |
| WORD32 i4_add_x; |
| WORD32 i4_add_y; |
| WORD32 i4_delta_x; |
| WORD32 i4_delta_y; |
| WORD32 i4_refphase_x; |
| WORD32 i4_refphase_y; |
| WORD32 i4_phase_x; |
| WORD32 i4_phase_y; |
| WORD32 i4_sub_wd; |
| WORD32 i4_sub_ht; |
| WORD32 i4_mb_wd; |
| WORD32 i4_mb_ht; |
| /* --------------------------------------------------------------------- */ |
| /* Local Pointer Declaration for arrays in Mapping context */ |
| /* --------------------------------------------------------------------- */ |
| ref_mb_map_t *ps_x_off_len; |
| ref_mb_map_t *ps_y_off_len; |
| UWORD32 i4_ref_wd; |
| UWORD32 i4_ref_ht; |
| UWORD32 i4_scaled_wd; |
| UWORD32 i4_scaled_ht; |
| WORD32 i4_curr_lyr_width; |
| WORD32 i4_curr_lyr_height; |
| |
| /* --------------------------------------------------------------------- */ |
| /* Local Flag Declaration */ |
| /* --------------------------------------------------------------------- */ |
| WORD32 i4_ref_layer_field_pic_flag; |
| WORD32 i4_field_pic_flag; |
| WORD32 i4_frame_mbs_only_flag; |
| WORD32 i4_ref_layer_frame_Mbs_only_flag; |
| WORD32 i4_field_Mb_flag; |
| WORD32 i4_bot_field_flag; |
| |
| /* --------------------------------------------------------------------- */ |
| /* Cropping Parameters Declaration */ |
| /* --------------------------------------------------------------------- */ |
| WORD32 i4_scaled_ref_layer_left_offset; |
| WORD32 i4_scaled_ref_layer_top_offset; |
| |
| /* --------------------------------------------------------------------- */ |
| /* Hardcoding flag information (assuming no field support) */ |
| /* --------------------------------------------------------------------- */ |
| i4_ref_layer_field_pic_flag = SVCD_FALSE; |
| i4_field_pic_flag = SVCD_FALSE; |
| i4_frame_mbs_only_flag = SVCD_TRUE; |
| i4_field_Mb_flag = SVCD_FALSE; |
| i4_bot_field_flag = SVCD_FALSE; |
| i4_ref_layer_frame_Mbs_only_flag = SVCD_TRUE; |
| |
| /* --------------------------------------------------------------------- */ |
| /* Pointer and Paramater are intialized - Chroma and Luma */ |
| /* --------------------------------------------------------------------- */ |
| { |
| WORD32 i4_base_width; |
| WORD32 i4_base_height; |
| WORD32 i4_ref_layer_chroma_phase_x_plus1_flag; |
| WORD32 i4_ref_layer_chroma_phase_y_plus1; |
| WORD32 i4_chroma_phase_x_plus1_flag; |
| WORD32 i4_chroma_phase_y_plus1; |
| |
| /* ------------------------------------------------------------- */ |
| /* HARD CODED FOR 420 */ |
| /* ------------------------------------------------------------- */ |
| WORD32 i4_sub_wd_chroma = 2; |
| WORD32 i4_sub_ht_chroma = 2; |
| |
| i4_base_width = ps_ref_res_prms->i4_res_width; |
| i4_base_height = ps_ref_res_prms->i4_res_height; |
| |
| i4_ref_layer_chroma_phase_x_plus1_flag = |
| ps_curr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag; |
| i4_ref_layer_chroma_phase_y_plus1 = ps_curr_res_prms->i1_ref_lyr_chroma_phase_y_plus1; |
| i4_chroma_phase_x_plus1_flag = |
| ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_x_plus1_flag; |
| i4_chroma_phase_y_plus1 = |
| ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_y_plus1; |
| i4_scaled_ref_layer_left_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_left; |
| i4_scaled_ref_layer_top_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_top; |
| |
| /* ----------------------------------------------------------------- */ |
| /* Computing Effective Frame Dimensions */ |
| /* ------------------------------------------------------------------*/ |
| i4_ref_wd = (i4_base_width >> i4_chroma_flag); |
| i4_ref_ht = (i4_base_height >> i4_chroma_flag) * (1 + i4_ref_layer_field_pic_flag); |
| i4_scaled_wd = ps_curr_res_prms->u2_scaled_ref_width; |
| i4_scaled_ht = ps_curr_res_prms->u2_scaled_ref_height; |
| i4_scaled_wd = (i4_scaled_wd >> i4_chroma_flag); |
| i4_scaled_ht = (i4_scaled_ht >> i4_chroma_flag) * (1 + i4_field_pic_flag); |
| |
| if(1 == i4_chroma_flag) |
| { |
| i4_refphase_x = i4_ref_layer_chroma_phase_x_plus1_flag - 1; |
| i4_refphase_y = i4_ref_layer_chroma_phase_y_plus1 - 1; |
| i4_phase_x = i4_chroma_phase_x_plus1_flag - 1; |
| i4_phase_y = i4_chroma_phase_y_plus1 - 1; |
| i4_sub_wd = i4_sub_wd_chroma; |
| i4_sub_ht = i4_sub_ht_chroma; |
| i4_mb_wd = MB_WIDTH >> 1; |
| i4_mb_ht = MB_HEIGHT >> 1; |
| } |
| else |
| { |
| i4_refphase_x = 0; |
| i4_refphase_y = 0; |
| i4_phase_x = 0; |
| i4_phase_y = 0; |
| i4_sub_wd = 1; |
| i4_sub_ht = 1; |
| i4_mb_wd = MB_WIDTH; |
| i4_mb_ht = MB_HEIGHT; |
| } |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* Derive shift x and y based on level idd */ |
| /* --------------------------------------------------------------------- */ |
| if(ps_sps->u1_level_idc <= 30) |
| { |
| u4_shift_x = 16; |
| u4_shift_y = 16; |
| } |
| else |
| { |
| u4_shift_x = 31 - isvcd_get_ceil_log2(i4_ref_wd); |
| u4_shift_y = 31 - isvcd_get_ceil_log2(i4_ref_ht); |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* The following condition is not true in our case for time being */ |
| /* --------------------------------------------------------------------- */ |
| if((SVCD_FALSE == i4_frame_mbs_only_flag) || (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag)) |
| { |
| i4_phase_y = i4_phase_y + 4 * i4_bot_field_flag; |
| |
| if(1 == i4_ref_layer_frame_Mbs_only_flag) |
| i4_refphase_y = (2 * i4_refphase_y) + 2; |
| else |
| i4_refphase_y = i4_refphase_y + (4 * i4_bot_field_flag); |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* Dx and Dy Computation - Ratio of the base and enhance layer width */ |
| /* --------------------------------------------------------------------- */ |
| u4_scale_x = ((i4_ref_wd << u4_shift_x) + (i4_scaled_wd >> 1)) / (i4_scaled_wd); |
| |
| u4_scale_y = ((i4_ref_ht << u4_shift_y) + (i4_scaled_ht >> 1)) / (i4_scaled_ht); |
| |
| i4_offset_x = i4_scaled_ref_layer_left_offset / i4_sub_wd; |
| i4_add_x = (((i4_ref_wd * (2 + i4_phase_x)) << (u4_shift_x - 2)) + (i4_scaled_wd >> 1)) / |
| i4_scaled_wd + |
| (1 << (u4_shift_x - 5)); |
| i4_delta_x = 4 * (2 + i4_refphase_x); |
| |
| if((SVCD_TRUE == i4_frame_mbs_only_flag) && (SVCD_TRUE == i4_ref_layer_frame_Mbs_only_flag)) |
| { |
| i4_offset_y = i4_scaled_ref_layer_top_offset / i4_sub_ht; |
| i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (u4_shift_y - 2)) + (i4_scaled_ht >> 1)) / |
| i4_scaled_ht + |
| (1 << (u4_shift_y - 5)); |
| i4_delta_y = 4 * (2 + i4_refphase_y); |
| } |
| else |
| { |
| i4_offset_y = i4_scaled_ref_layer_top_offset / (2 * i4_sub_ht); |
| i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (u4_shift_y - 3)) + (i4_scaled_ht >> 1)) / |
| i4_scaled_ht + |
| (1 << (u4_shift_y - 5)); |
| i4_delta_y = 2 * (2 + i4_refphase_y); |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* Intializing Local Pointers - Chroma and Luma */ |
| /* --------------------------------------------------------------------- */ |
| ps_x_off_len = ps_map_ctxt->ps_x_offset_length; |
| ps_y_off_len = ps_map_ctxt->ps_y_offset_length; |
| i4_curr_lyr_width = ps_curr_res_prms->i4_res_width >> i4_chroma_flag; |
| i4_curr_lyr_height = ps_curr_res_prms->i4_res_height >> i4_chroma_flag; |
| |
| { |
| WORD32 i4_i, i4_j; |
| |
| /* ----------------------------------------------------------------- */ |
| /* Computation of offsetX refArrayW Xmin and Xmax Lists */ |
| /* ----------------------------------------------------------------- */ |
| for(i4_i = 0; i4_i < i4_curr_lyr_width; i4_i = i4_i + i4_mb_wd) |
| { |
| WORD32 i4_x_refmin16; |
| WORD32 i4_x_refmax16; |
| WORD32 i4_x_offset; |
| |
| i4_x_refmin16 = (WORD64) (((WORD64) ((i4_i - i4_offset_x) * u4_scale_x) + i4_add_x) >> |
| ((WORD32) (u4_shift_x - 4))) - |
| i4_delta_x; |
| |
| i4_x_refmax16 = |
| (WORD64) (((WORD64) (i4_i + i4_mb_wd - 1 - i4_offset_x) * u4_scale_x + i4_add_x) >> |
| ((WORD32) (u4_shift_x - 4))) - |
| i4_delta_x; |
| |
| /* AC205 */ |
| i4_x_offset = i4_x_refmin16 >> 4; |
| ps_x_off_len->i2_offset = i4_x_offset; |
| ps_x_off_len->i2_length = (i4_x_refmax16 >> 4) - i4_x_offset + 2; |
| |
| /* increment the pointer */ |
| ps_x_off_len++; |
| |
| } /* end of loop over current layer width */ |
| |
| /* ----------------------------------------------------------------- */ |
| /* Computation of offsetY refArrayH Ymin and Ymax Lists */ |
| /* ----------------------------------------------------------------- */ |
| for(i4_j = 0; i4_j < i4_curr_lyr_height; i4_j = i4_j + i4_mb_ht) |
| { |
| WORD32 i4_y_refmin16; |
| WORD32 i4_y_refmax16; |
| WORD32 i4_y_offset; |
| |
| i4_y_refmin16 = (WORD64) (((WORD64) (i4_j - i4_offset_y) * u4_scale_y + i4_add_y) >> |
| ((WORD32) (u4_shift_y - 4))) - |
| i4_delta_y; |
| |
| i4_y_refmax16 = |
| (WORD64) (((WORD64) (i4_j + i4_mb_ht - 1 - i4_offset_y) * u4_scale_y + i4_add_y) >> |
| ((WORD32) (u4_shift_y - 4))) - |
| i4_delta_y; |
| |
| /* AC205 */ |
| i4_y_offset = i4_y_refmin16 >> 4; |
| ps_y_off_len->i2_offset = i4_y_offset; |
| ps_y_off_len->i2_length = (i4_y_refmax16 >> 4) - i4_y_offset + 2; |
| |
| /* increment the pointer */ |
| ps_y_off_len++; |
| |
| } /* end of loop over current layer height */ |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* Computation of Xref and Xphase List as per standard */ |
| /* --------------------------------------------------------------------- */ |
| ps_x_off_len = ps_map_ctxt->ps_x_offset_length; |
| ps_y_off_len = ps_map_ctxt->ps_y_offset_length; |
| |
| { |
| WORD32 i4_xc; |
| WORD32 i4_offset_x_index; |
| ref_pixel_map_t *ps_x_pos_phase; |
| |
| ps_x_pos_phase = ps_map_ctxt->ps_x_pos_phase; |
| |
| for(i4_xc = 0; i4_xc < i4_curr_lyr_width; i4_xc++) |
| { |
| WORD32 i4_x_offset; |
| WORD32 i4_x_ref16; |
| |
| i4_offset_x_index = i4_xc / i4_mb_wd; |
| i4_x_offset = ps_x_off_len[i4_offset_x_index].i2_offset; |
| i4_x_ref16 = (WORD64) (((WORD64) (i4_xc - i4_offset_x) * u4_scale_x + i4_add_x) >> |
| ((WORD32) (u4_shift_x - 4))) - |
| i4_delta_x; |
| |
| /* store the values */ |
| ps_x_pos_phase->i2_ref_pos = (i4_x_ref16 >> 4) - i4_x_offset; |
| ps_x_pos_phase->i2_phase = (i4_x_ref16 - (16 * i4_x_offset)) & 15; |
| |
| /* increment the pointer */ |
| ps_x_pos_phase++; |
| } /* end of loop over scaled width */ |
| } |
| |
| /* --------------------------------------------------------------------- */ |
| /* Computation of Yref and Yphase List as per standard */ |
| /* --------------------------------------------------------------------- */ |
| { |
| WORD32 i4_yc; |
| WORD32 i4_offset_y_index; |
| ref_pixel_map_t *ps_y_pos_phase; |
| |
| ps_y_pos_phase = ps_map_ctxt->ps_y_pos_phase; |
| |
| for(i4_yc = 0; i4_yc < i4_curr_lyr_height; i4_yc++) |
| { |
| WORD32 i4_y_offset; |
| WORD32 i4_y_ref16; |
| |
| i4_offset_y_index = i4_yc / i4_mb_ht; |
| i4_y_offset = ps_y_off_len[i4_offset_y_index].i2_offset; |
| |
| if((SVCD_FALSE == i4_frame_mbs_only_flag) || |
| (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag)) |
| { |
| i4_yc = i4_yc >> (1 - i4_field_Mb_flag); |
| } |
| |
| i4_y_ref16 = (WORD64) ((((WORD64) (i4_yc - i4_offset_y) * u4_scale_y + i4_add_y) >> |
| ((WORD32) (u4_shift_y - 4))) - |
| i4_delta_y); |
| ps_y_pos_phase->i2_ref_pos = (i4_y_ref16 >> 4) - i4_y_offset; |
| ps_y_pos_phase->i2_phase = (i4_y_ref16 - (16 * i4_y_offset)) & 15; |
| |
| /* increment the pointer */ |
| ps_y_pos_phase++; |
| } /* end of loop over scaled height */ |
| } |
| return; |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : isvcd_residual_samp_res_init */ |
| /* */ |
| /* Description : this function calculates the scale factors and initialise*/ |
| /* the context structure */ |
| /* */ |
| /* Inputs : pv_residual_samp_ctxt: handle to private structure */ |
| /* ps_curr_lyr_res_prms: pointer to current resolution */ |
| /* params */ |
| /* Globals : none */ |
| /* Processing : it stores the layer dimensions */ |
| /* */ |
| /* Outputs : none */ |
| /* Returns : none */ |
| /* */ |
| /* Issues : none */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 26 06 2021 vijayakumar creation */ |
| /* */ |
| /*****************************************************************************/ |
| WORD32 isvcd_residual_samp_res_init(void *pv_svc_dec) |
| { |
| residual_sampling_ctxt_t *ps_ctxt; |
| res_lyr_ctxt *ps_lyr_ctxt; |
| dec_seq_params_t *ps_sps; |
| dec_svc_seq_params_t *ps_subset_sps; |
| svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec; |
| dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
| |
| void *pv_residual_samp_ctxt = ps_svc_lyr_dec->pv_residual_sample_ctxt; |
| res_prms_t *ps_curr_lyr_res_prms = &ps_svc_lyr_dec->s_res_prms; |
| ref_mb_map_t **pps_luma_map_horz = &ps_svc_lyr_dec->ps_ressam_luma_map_horz; |
| ref_mb_map_t **pps_chroma_map_horz = &ps_svc_lyr_dec->ps_ressam_chroma_map_horz; |
| ref_mb_map_t **pps_luma_map_vert = &ps_svc_lyr_dec->ps_ressam_luma_map_vert; |
| ref_mb_map_t **pps_chroma_map_vert = &ps_svc_lyr_dec->ps_ressam_chroma_map_vert; |
| |
| if((NULL == pv_residual_samp_ctxt) || (NULL == ps_curr_lyr_res_prms) || |
| (NULL == pps_luma_map_horz) || (NULL == pps_chroma_map_horz) || |
| (NULL == pps_luma_map_vert) || (NULL == pps_chroma_map_vert)) |
| { |
| return NOT_OK; |
| } |
| |
| ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt; |
| |
| /* if called for base resolution store deafult values */ |
| if(SVCD_TRUE == ps_svc_lyr_dec->u1_base_res_flag) |
| { |
| *pps_luma_map_horz = NULL; |
| *pps_chroma_map_horz = NULL; |
| *pps_luma_map_vert = NULL; |
| *pps_chroma_map_vert = NULL; |
| ps_ctxt->i4_res_lyr_id = -1; |
| ps_ctxt->i4_ref_width = ps_curr_lyr_res_prms->i4_res_width; |
| ps_ctxt->i4_ref_height = ps_curr_lyr_res_prms->i4_res_height; |
| return OK; |
| } |
| |
| /* derive the current sps */ |
| ps_sps = ps_dec->ps_cur_sps; |
| ps_subset_sps = ps_svc_lyr_dec->ps_cur_subset_sps; |
| |
| /* store the res id appropriately */ |
| ps_ctxt->i4_res_lyr_id = ps_svc_lyr_dec->u1_layer_id - 1; |
| |
| /* get the current layer ctxt */ |
| ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_svc_lyr_dec->u1_layer_id - 1]; |
| |
| /* get the width and heights */ |
| ps_lyr_ctxt->i4_curr_width = ps_curr_lyr_res_prms->i4_res_width; |
| ps_lyr_ctxt->i4_curr_height = ps_curr_lyr_res_prms->i4_res_height; |
| ps_lyr_ctxt->i4_ref_width = ps_ctxt->i4_ref_width; |
| ps_lyr_ctxt->i4_ref_height = ps_ctxt->i4_ref_height; |
| |
| /* store the strcuture pointer containing projected locations */ |
| *pps_luma_map_horz = ps_lyr_ctxt->s_luma_map_ctxt.ps_x_offset_length; |
| *pps_chroma_map_horz = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_offset_length; |
| *pps_luma_map_vert = ps_lyr_ctxt->s_luma_map_ctxt.ps_y_offset_length; |
| *pps_chroma_map_vert = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_offset_length; |
| |
| /* check for recomputation of mapping required */ |
| if(SVCD_TRUE == ps_curr_lyr_res_prms->u1_remap_req_flag) |
| { |
| res_prms_t s_ref_res_prms = {0}; |
| |
| /* store the reference layer resolution width and height */ |
| s_ref_res_prms.i4_res_width = ps_ctxt->i4_ref_width; |
| s_ref_res_prms.i4_res_height = ps_ctxt->i4_ref_height; |
| |
| /* call the frame level projections calculation function */ |
| isvcd_residual_samp_populate_list(&ps_lyr_ctxt->s_luma_map_ctxt, ps_sps, ps_subset_sps, |
| ps_curr_lyr_res_prms, &s_ref_res_prms, 0); |
| isvcd_residual_samp_populate_list(&ps_lyr_ctxt->s_chroma_map_ctxt, ps_sps, ps_subset_sps, |
| ps_curr_lyr_res_prms, &s_ref_res_prms, 1); |
| |
| /* default values for flags */ |
| ps_lyr_ctxt->pf_residual_samp_mb = &isvcd_residual_samp_mb; |
| ps_lyr_ctxt->i4_chrm_horz_int_mode = 0; |
| ps_lyr_ctxt->i4_chrm_vert_int_mode = 0; |
| ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_FALSE; |
| |
| /* Store the Dyadic flag */ |
| ps_lyr_ctxt->i4_dyadic_flag = ps_curr_lyr_res_prms->u1_dyadic_flag; |
| |
| /* set the appropriate chroma processing routine based on */ |
| /* phase values */ |
| if(SVCD_TRUE == ps_curr_lyr_res_prms->u1_dyadic_flag) |
| { |
| WORD32 i4_ref_layer_chroma_phase_x_plus1_flag; |
| WORD32 i4_ref_layer_chroma_phase_y_plus1; |
| WORD32 i4_chroma_phase_x_plus1_flag; |
| WORD32 i4_chroma_phase_y_plus1; |
| |
| ps_lyr_ctxt->pf_residual_samp_mb = &isvcd_residual_samp_mb_dyadic; |
| i4_ref_layer_chroma_phase_x_plus1_flag = |
| ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag; |
| i4_ref_layer_chroma_phase_y_plus1 = |
| ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_y_plus1; |
| i4_chroma_phase_x_plus1_flag = |
| ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_x_plus1_flag; |
| i4_chroma_phase_y_plus1 = |
| ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_y_plus1; |
| if((0 == i4_ref_layer_chroma_phase_x_plus1_flag) && (1 == i4_chroma_phase_x_plus1_flag)) |
| { |
| ps_lyr_ctxt->i4_chrm_horz_int_mode = 1; |
| ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE; |
| } |
| |
| if((0 == i4_ref_layer_chroma_phase_y_plus1) && (1 == i4_chroma_phase_y_plus1)) |
| { |
| ps_lyr_ctxt->i4_chrm_vert_int_mode = 1; |
| ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE; |
| } |
| |
| if((0 == i4_ref_layer_chroma_phase_y_plus1) && (2 == i4_chroma_phase_y_plus1)) |
| { |
| ps_lyr_ctxt->i4_chrm_vert_int_mode = 1; |
| ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE; |
| } |
| |
| if((2 == i4_ref_layer_chroma_phase_y_plus1) && (0 == i4_chroma_phase_y_plus1)) |
| { |
| ps_lyr_ctxt->i4_chrm_vert_int_mode = 2; |
| ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE; |
| } |
| } |
| } |
| else |
| { |
| /* should take false value */ |
| if(SVCD_FALSE != ps_curr_lyr_res_prms->u1_remap_req_flag) |
| { |
| return NOT_OK; |
| } |
| } |
| |
| /* store the current layer width and height to context */ |
| ps_ctxt->i4_ref_width = ps_curr_lyr_res_prms->i4_res_width; |
| ps_ctxt->i4_ref_height = ps_curr_lyr_res_prms->i4_res_height; |
| |
| /* assert on max ranges of width and shift values */ |
| if((ps_lyr_ctxt->i4_curr_width > H264_MAX_FRAME_WIDTH) || |
| (ps_lyr_ctxt->i4_ref_width > H264_MAX_FRAME_WIDTH) || |
| (ps_lyr_ctxt->i4_curr_height > H264_MAX_FRAME_HEIGHT) || |
| (ps_lyr_ctxt->i4_ref_height > H264_MAX_FRAME_HEIGHT)) |
| { |
| return NOT_OK; |
| } |
| return OK; |
| } |