542 lines
24 KiB
C
542 lines
24 KiB
C
/******************************************************************************
|
|
*
|
|
* 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;
|
|
}
|