/****************************************************************************** * * 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_pred_residual_recon.c * * @brief * Contains definition of functions for svc inverse quantization inverse * transformation and resd comp * * @author * Kishore * * @par List of Functions: * - isvcd_pred_residual_recon_chroma_8x8() * - isvcd_residual_chroma_cb_cr_8x8() * - isvcd_pred_residual_recon_chroma_4x4() * - isvcd_pred_residual_recon_16x16() * - isvcd_pred_residual_recon_4x4() * - isvcd_pred_residual_recon_8x8() * - isvcd_residual_luma_4x4() * - isvcd_residual_luma_8x8() * - isvcd_residual_luma_16x16() * * @remarks * None * ******************************************************************************* */ /*****************************************************************************/ /* File Includes */ /*****************************************************************************/ /* User include files */ #include "ih264_typedefs.h" #include "ih264_defs.h" #include "ih264_trans_macros.h" #include "ih264_macros.h" #include "ih264_platform_macros.h" #include "ih264_trans_data.h" #include "ih264_size_defs.h" #include "ih264_structs.h" #include "isvcd_pred_residual_recon.h" /*****************************************************************************/ /* */ /* Function Name : isvcd_pred_residual_recon_chroma_8x8 */ /* */ /* Description : this function computes the recon from */ /* the residual and pred buffer */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ void isvcd_pred_residual_recon_chroma_8x8(UWORD8 *pu1_pred, WORD16 *pi2_rsd, UWORD8 *pu1_out, WORD32 pred_strd, WORD32 rsd_strd, WORD32 out_strd) { UWORD8 *pu1_pred_ptr = pu1_pred; WORD16 *pi2_rsd_ptr = pi2_rsd; UWORD8 *pu1_out_ptr = pu1_out; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 8; i++) { pu1_pred_ptr = pu1_pred; pi2_rsd_ptr = pi2_rsd; pu1_out = pu1_out_ptr; for(j = 0; j < 8; j++) { i_macro = *pu1_pred_ptr + *pi2_rsd_ptr; *pu1_out = CLIP_U8(i_macro); pu1_pred_ptr += pred_strd; pi2_rsd_ptr += rsd_strd; pu1_out += out_strd; } pu1_out_ptr += 2; // Interleaved store for output pu1_pred += 2; // Interleaved load for pred buffer pi2_rsd += 2; } } /*****************************************************************************/ /* */ /* Function Name : isvcd_residual_chroma_cb_cr_8x8 */ /* */ /* Description : this function computes the nnz from the resd */ /* */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ WORD32 isvcd_residual_chroma_cb_cr_8x8(WORD16 *pi2_rsd, WORD32 rsd_strd) { WORD16 *pi2_rsd_ptr_Cb = pi2_rsd; WORD16 *pi2_rsd_ptr_Cr = pi2_rsd + 1; WORD16 i, j; WORD32 i4_nnz = 0, ai4_nnz_Cb[2][2] = {0}, ai4_nnz_Cr[2][2] = {0}; for(i = 0; i < 8; i++) { pi2_rsd_ptr_Cb = pi2_rsd; pi2_rsd_ptr_Cr = pi2_rsd + 1; for(j = 0; j < 8; j++) { ai4_nnz_Cb[j >> 2][i >> 2] |= !!(*pi2_rsd_ptr_Cb); ai4_nnz_Cr[j >> 2][i >> 2] |= !!(*pi2_rsd_ptr_Cr); pi2_rsd_ptr_Cb += rsd_strd; pi2_rsd_ptr_Cr += rsd_strd; } pi2_rsd += 2; } i4_nnz = ai4_nnz_Cr[0][0] | (ai4_nnz_Cr[1][0] << 2); i4_nnz |= (ai4_nnz_Cr[0][1] << 1) | (ai4_nnz_Cr[1][1] << 3); i4_nnz <<= 4; i4_nnz |= ai4_nnz_Cb[0][0] | (ai4_nnz_Cb[1][0] << 2); i4_nnz |= (ai4_nnz_Cb[0][1] << 1) | (ai4_nnz_Cb[1][1] << 3); return i4_nnz; } /*****************************************************************************/ /* */ /* Function Name : isvcd_pred_residual_recon_chroma_4x4 */ /* */ /* Description : this function computes the recon from */ /* the residual and pred buffer */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : none */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ void isvcd_pred_residual_recon_chroma_4x4(UWORD8 *pu1_pred, WORD16 *pi2_rsd, UWORD8 *pu1_out, WORD32 pred_strd, WORD32 rsd_strd, WORD32 out_strd) { UWORD8 *pu1_pred_ptr = pu1_pred; WORD16 *pi2_rsd_ptr = pi2_rsd; UWORD8 *pu1_out_ptr = pu1_out; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 4; i++) { pu1_pred_ptr = pu1_pred; pi2_rsd_ptr = pi2_rsd; pu1_out = pu1_out_ptr; for(j = 0; j < 4; j++) { i_macro = *pu1_pred_ptr + *pi2_rsd_ptr; *pu1_out = CLIP_U8(i_macro); pu1_pred_ptr += pred_strd; pi2_rsd_ptr += rsd_strd; pu1_out += out_strd; } pu1_out_ptr += 2; // Interleaved store for output pu1_pred += 2; // Interleaved load for pred buffer pi2_rsd += 2; } } /*****************************************************************************/ /* */ /* Function Name : isvcd_pred_residual_recon_16x16 */ /* */ /* Description : this function computes the recon from */ /* the residual and pred buffer */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ WORD32 isvcd_pred_residual_recon_16x16(UWORD8 *pu1_pred, WORD16 *pi2_rsd, UWORD8 *pu1_out, WORD32 pred_strd, WORD32 rsd_strd, WORD32 out_strd) { WORD32 i4_nnz = 0, i4_nnz_blk[4][4] = {0}; UWORD8 *pu1_pred_ptr = pu1_pred; WORD16 *pi2_rsd_ptr = pi2_rsd; UWORD8 *pu1_out_ptr = pu1_out; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 16; i++) { pu1_pred_ptr = pu1_pred; pi2_rsd_ptr = pi2_rsd; pu1_out = pu1_out_ptr; for(j = 0; j < 16; j++) { i_macro = *pi2_rsd_ptr; i4_nnz_blk[j >> 2][i >> 2] |= !!i_macro; i_macro += *pu1_pred_ptr; *pu1_out = CLIP_U8(i_macro); pu1_pred_ptr += pred_strd; pi2_rsd_ptr += rsd_strd; pu1_out += out_strd; } pu1_out_ptr++; pi2_rsd++; pu1_pred++; } for(i = 0; i < 4; i++) { for(j = 0; j < 4; j++) { i4_nnz |= (i4_nnz_blk[j][i]) << (i + (j << 2)); } } return i4_nnz; } /*****************************************************************************/ /* */ /* Function Name : isvcd_pred_residual_recon_4x4 */ /* */ /* Description : this function computes the recon from */ /* the residual and pred buffer */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ WORD32 isvcd_pred_residual_recon_4x4(UWORD8 *pu1_pred, WORD16 *pi2_rsd, UWORD8 *pu1_out, WORD32 pred_strd, WORD32 rsd_strd, WORD32 out_strd) { WORD32 i4_nnz_blk[4][4] = {0}; UWORD8 *pu1_pred_ptr = pu1_pred; WORD16 *pi2_rsd_ptr = pi2_rsd; UWORD8 *pu1_out_ptr = pu1_out; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 4; i++) { pu1_pred_ptr = pu1_pred; pi2_rsd_ptr = pi2_rsd; pu1_out = pu1_out_ptr; for(j = 0; j < 4; j++) { i_macro = *pi2_rsd_ptr; i4_nnz_blk[j >> 2][i >> 2] |= !!i_macro; i_macro += *pu1_pred_ptr; *pu1_out = CLIP_U8(i_macro); pu1_pred_ptr += pred_strd; pi2_rsd_ptr += rsd_strd; pu1_out += out_strd; } pu1_out_ptr++; pi2_rsd++; pu1_pred++; } return i4_nnz_blk[0][0]; } /*****************************************************************************/ /* */ /* Function Name : isvcd_pred_residual_recon_8x8 */ /* */ /* Description : this function computes the recon from */ /* the residual and pred buffer */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ WORD32 isvcd_pred_residual_recon_8x8(UWORD8 *pu1_pred, WORD16 *pi2_rsd, UWORD8 *pu1_out, WORD32 pred_strd, WORD32 rsd_strd, WORD32 out_strd) { WORD32 i4_nnz = 0, i4_nnz_blk[4][4] = {0}; UWORD8 *pu1_pred_ptr = pu1_pred; WORD16 *pi2_rsd_ptr = pi2_rsd; UWORD8 *pu1_out_ptr = pu1_out; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 8; i++) { pu1_pred_ptr = pu1_pred; pi2_rsd_ptr = pi2_rsd; pu1_out = pu1_out_ptr; for(j = 0; j < 8; j++) { i_macro = *pi2_rsd_ptr; i4_nnz_blk[j >> 2][i >> 2] |= !!i_macro; i_macro += *pu1_pred_ptr; *pu1_out = CLIP_U8(i_macro); pu1_pred_ptr += pred_strd; pi2_rsd_ptr += rsd_strd; pu1_out += out_strd; } pu1_out_ptr++; pi2_rsd++; pu1_pred++; } i4_nnz = i4_nnz_blk[0][0] | (i4_nnz_blk[1][0] << 4); i4_nnz |= (i4_nnz_blk[0][1] << 1) | (i4_nnz_blk[1][1] << 5); return i4_nnz; } /*****************************************************************************/ /* */ /* Function Name : isvcd_residual_luma_4x4 */ /* */ /* Description : this function computes the nnz from resd */ /* */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ WORD32 isvcd_residual_luma_4x4(WORD16 *pi2_rsd, WORD32 rsd_strd) { WORD32 i4_nnz_blk[4][4] = {0}; WORD16 *pi2_rsd_ptr = pi2_rsd; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 4; i++) { pi2_rsd_ptr = pi2_rsd; for(j = 0; j < 4; j++) { i_macro = *pi2_rsd_ptr; i4_nnz_blk[j >> 2][i >> 2] |= !!i_macro; pi2_rsd_ptr += rsd_strd; } pi2_rsd++; } return i4_nnz_blk[0][0]; } /*****************************************************************************/ /* */ /* Function Name : isvcd_residual_luma_8x8 */ /* */ /* Description : this function computes the nnz from resd */ /* */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ WORD32 isvcd_residual_luma_8x8(WORD16 *pi2_rsd, WORD32 rsd_strd) { WORD32 i4_nnz = 0, i4_nnz_blk[4][4] = {0}; WORD16 *pi2_rsd_ptr = pi2_rsd; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 8; i++) { pi2_rsd_ptr = pi2_rsd; for(j = 0; j < 8; j++) { i_macro = *pi2_rsd_ptr; i4_nnz_blk[j >> 2][i >> 2] |= !!i_macro; pi2_rsd_ptr += rsd_strd; } pi2_rsd++; } i4_nnz = i4_nnz_blk[0][0] | (i4_nnz_blk[1][0] << 4); i4_nnz |= (i4_nnz_blk[0][1] << 1) | (i4_nnz_blk[1][1] << 5); return i4_nnz; } /*****************************************************************************/ /* */ /* Function Name : isvcd_residual_luma_16x16 */ /* */ /* Description : this function computes the nnz from resd */ /* */ /* Inputs : */ /* Globals : none */ /* Processing : */ /* */ /* Outputs : none */ /* Returns : nnz */ /* */ /* Issues : none */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 25 11 2021 Kishore creation */ /* */ /*****************************************************************************/ WORD32 isvcd_residual_luma_16x16(WORD16 *pi2_rsd, WORD32 rsd_strd) { WORD32 i4_nnz = 0, i4_nnz_blk[4][4] = {0}; WORD16 *pi2_rsd_ptr = pi2_rsd; WORD16 i, j; WORD16 i_macro; for(i = 0; i < 16; i++) { pi2_rsd_ptr = pi2_rsd; for(j = 0; j < 16; j++) { i_macro = *pi2_rsd_ptr; i4_nnz_blk[j >> 2][i >> 2] |= !!i_macro; pi2_rsd_ptr += rsd_strd; } pi2_rsd++; } for(i = 0; i < 4; i++) { for(j = 0; j < 4; j++) { i4_nnz |= (i4_nnz_blk[j][i]) << (i + (j << 2)); } } return i4_nnz; }