Initial Version of HEVC decoder
Compliant to reference software HM11.0 onwards
Bug: 14571712
Change-Id: I8af25c1221cc6ab70440141c4d9b48c1ac69696a
diff --git a/common/ihevc_chroma_iquant_recon.c b/common/ihevc_chroma_iquant_recon.c
new file mode 100644
index 0000000..cba9eb1
--- /dev/null
+++ b/common/ihevc_chroma_iquant_recon.c
@@ -0,0 +1,398 @@
+/******************************************************************************
+*
+* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
+*
+* 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.
+*
+******************************************************************************/
+/**
+ *******************************************************************************
+ * @file
+ * ihevc_chroma_iquant_recon.c
+ *
+ * @brief
+ * Contains function definitions for inverse quantization and
+ * reconstruction of chroma interleaved data.
+ *
+ * @author
+ * 100470
+ *
+ * @par List of Functions:
+ * - ihevc_chroma_iquant_recon_4x4()
+ * - ihevc_chroma_iquant_recon_8x8()
+ * - ihevc_chroma_iquant_recon_16x16()
+ *
+ * @remarks
+ * None
+ *
+ *******************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "ihevc_typedefs.h"
+#include "ihevc_macros.h"
+#include "ihevc_platform_macros.h"
+#include "ihevc_defs.h"
+#include "ihevc_trans_tables.h"
+#include "ihevc_chroma_iquant_recon.h"
+#include "ihevc_func_selector.h"
+#include "ihevc_trans_macros.h"
+
+/* All the functions work one component(U or V) of interleaved data depending upon pointers passed to it */
+/* Data visualization */
+/* U V U V U V U V */
+/* U V U V U V U V */
+/* U V U V U V U V */
+/* U V U V U V U V */
+/* If the pointer points to first byte of above stream (U) , functions will operate on U component */
+/* If the pointer points to second byte of above stream (V) , functions will operate on V component */
+
+/**
+ *******************************************************************************
+ *
+ * @brief
+ * This function performs inverse quantization and reconstruction for 4x4
+ * input block
+ *
+ * @par Description:
+ * This function performs inverse quantization and reconstruction for 4x4
+ * input block
+ *
+ * @param[in] pi2_src
+ * Input 4x4 coefficients
+ *
+ * @param[in] pu1_pred
+ * Prediction 4x4 block
+ *
+ * @param[in] pi2_dequant_coeff
+ * Dequant Coeffs
+ *
+ * @param[out] pu1_dst
+ * Output 4x4 block
+ *
+ * @param[in] qp_div
+ * Quantization parameter / 6
+ *
+ * @param[in] qp_rem
+ * Quantization parameter % 6
+ *
+ * @param[in] src_strd
+ * Input stride
+ *
+ * @param[in] pred_strd
+ * Prediction stride
+ *
+ * @param[in] dst_strd
+ * Output Stride
+ *
+ * @param[in] zero_cols
+ * Zero columns in pi2_src
+ *
+ * @returns Void
+ *
+ * @remarks
+ * None
+ *
+ *******************************************************************************
+ */
+
+
+void ihevc_chroma_iquant_recon_4x4(WORD16 *pi2_src,
+ UWORD8 *pu1_pred,
+ WORD16 *pi2_dequant_coeff,
+ UWORD8 *pu1_dst,
+ WORD32 qp_div, /* qpscaled / 6 */
+ WORD32 qp_rem, /* qpscaled % 6 */
+ WORD32 src_strd,
+ WORD32 pred_strd,
+ WORD32 dst_strd,
+ WORD32 zero_cols)
+{
+
+ {
+ /* Inverse Quant and recon */
+ {
+ WORD32 i, j;
+ WORD32 shift_iq;
+ WORD32 trans_size;
+ /* Inverse Quantization constants */
+ {
+ WORD32 log2_trans_size, bit_depth;
+
+ log2_trans_size = 2;
+ bit_depth = 8 + 0;
+ shift_iq = bit_depth + log2_trans_size - 5;
+ }
+
+ trans_size = TRANS_SIZE_4;
+
+ for(i = 0; i < trans_size; i++)
+ {
+ /* Checking for Zero Cols */
+ if((zero_cols & 1) == 1)
+ {
+ for(j = 0; j < trans_size; j++)
+ pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
+ }
+ else
+ {
+ for(j = 0; j < trans_size; j++)
+ {
+ WORD32 iquant_out;
+ IQUANT_4x4(iquant_out,
+ pi2_src[j * src_strd],
+ pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
+ shift_iq, qp_div);
+ iquant_out = (iquant_out + 16) >> 5;
+ pu1_dst[j * dst_strd] =
+ CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
+ }
+ }
+ pi2_src++;
+ pi2_dequant_coeff++;
+ pu1_pred += 2;
+ pu1_dst += 2;
+
+ zero_cols = zero_cols >> 1;
+ }
+ }
+ }
+}
+
+/**
+ *******************************************************************************
+ *
+ * @brief
+ * This function performs inverse quantization and reconstruction for 8x8
+ * input block
+ *
+ * @par Description:
+ * This function performs inverse quantization and reconstruction for 8x8
+ * input block
+ *
+ * @param[in] pi2_src
+ * Input 8x8 coefficients
+ *
+ * @param[in] pu1_pred
+ * Prediction 8x8 block
+ *
+ * @param[in] pi2_dequant_coeff
+ * Dequant Coeffs
+ *
+ * @param[out] pu1_dst
+ * Output 8x8 block
+ *
+ * @param[in] qp_div
+ * Quantization parameter / 6
+ *
+ * @param[in] qp_rem
+ * Quantization parameter % 6
+ *
+ * @param[in] src_strd
+ * Input stride
+ *
+ * @param[in] pred_strd
+ * Prediction stride
+ *
+ * @param[in] dst_strd
+ * Output Stride
+ *
+ * @param[in] zero_cols
+ * Zero columns in pi2_src
+ *
+ * @returns Void
+ *
+ * @remarks
+ * None
+ *
+ *******************************************************************************
+ */
+
+
+void ihevc_chroma_iquant_recon_8x8(WORD16 *pi2_src,
+ UWORD8 *pu1_pred,
+ WORD16 *pi2_dequant_coeff,
+ UWORD8 *pu1_dst,
+ WORD32 qp_div, /* qpscaled / 6 */
+ WORD32 qp_rem, /* qpscaled % 6 */
+ WORD32 src_strd,
+ WORD32 pred_strd,
+ WORD32 dst_strd,
+ WORD32 zero_cols)
+{
+
+ {
+ /* Inverse Quant and recon */
+ {
+ WORD32 i, j;
+ WORD32 shift_iq;
+ WORD32 trans_size;
+ /* Inverse Quantization constants */
+ {
+ WORD32 log2_trans_size, bit_depth;
+
+ log2_trans_size = 3;
+ bit_depth = 8 + 0;
+ shift_iq = bit_depth + log2_trans_size - 5;
+ }
+
+ trans_size = TRANS_SIZE_8;
+
+ for(i = 0; i < trans_size; i++)
+ {
+ /* Checking for Zero Cols */
+ if((zero_cols & 1) == 1)
+ {
+ for(j = 0; j < trans_size; j++)
+ pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
+ }
+ else
+ {
+ for(j = 0; j < trans_size; j++)
+ {
+ WORD32 iquant_out;
+ IQUANT(iquant_out,
+ pi2_src[j * src_strd],
+ pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
+ shift_iq, qp_div);
+ iquant_out = (iquant_out + 16) >> 5;
+ pu1_dst[j * dst_strd] =
+ CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
+ }
+ }
+ pi2_src++;
+ pi2_dequant_coeff++;
+ pu1_pred += 2;
+ pu1_dst += 2;
+
+ zero_cols = zero_cols >> 1;
+ }
+ }
+ }
+}
+
+/**
+ *******************************************************************************
+ *
+ * @brief
+ * This function performs inverse quantization and reconstruction for 16x16
+ * input block
+ *
+ * @par Description:
+ * This function performs inverse quantization and reconstruction for 16x16
+ * input block
+ *
+ * @param[in] pi2_src
+ * Input 16x16 coefficients
+ *
+ * @param[in] pu1_pred
+ * Prediction 16x16 block
+ *
+ * @param[in] pi2_dequant_coeff
+ * Dequant Coeffs
+ *
+ * @param[out] pu1_dst
+ * Output 16x16 block
+ *
+ * @param[in] qp_div
+ * Quantization parameter / 6
+ *
+ * @param[in] qp_rem
+ * Quantization parameter % 6
+ *
+ * @param[in] src_strd
+ * Input stride
+ *
+ * @param[in] pred_strd
+ * Prediction stride
+ *
+ * @param[in] dst_strd
+ * Output Stride
+ *
+ * @param[in] zero_cols
+ * Zero columns in pi2_src
+ *
+ * @returns Void
+ *
+ * @remarks
+ * None
+ *
+ *******************************************************************************
+ */
+
+
+void ihevc_chroma_iquant_recon_16x16(WORD16 *pi2_src,
+ UWORD8 *pu1_pred,
+ WORD16 *pi2_dequant_coeff,
+ UWORD8 *pu1_dst,
+ WORD32 qp_div, /* qpscaled / 6 */
+ WORD32 qp_rem, /* qpscaled % 6 */
+ WORD32 src_strd,
+ WORD32 pred_strd,
+ WORD32 dst_strd,
+ WORD32 zero_cols)
+
+{
+
+ {
+ /* Inverse Quant and recon */
+ {
+ WORD32 i, j;
+ WORD32 shift_iq;
+ WORD32 trans_size;
+ /* Inverse Quantization constants */
+ {
+ WORD32 log2_trans_size, bit_depth;
+
+ log2_trans_size = 4;
+ bit_depth = 8 + 0;
+ shift_iq = bit_depth + log2_trans_size - 5;
+ }
+
+ trans_size = TRANS_SIZE_16;
+
+ for(i = 0; i < trans_size; i++)
+ {
+ /* Checking for Zero Cols */
+ if((zero_cols & 1) == 1)
+ {
+ for(j = 0; j < trans_size; j++)
+ pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
+ }
+ else
+ {
+ for(j = 0; j < trans_size; j++)
+ {
+ WORD32 iquant_out;
+ IQUANT(iquant_out,
+ pi2_src[j * src_strd],
+ pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
+ shift_iq, qp_div);
+ iquant_out = (iquant_out + 16) >> 5;
+ pu1_dst[j * dst_strd] =
+ CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
+ }
+ }
+ pi2_src++;
+ pi2_dequant_coeff++;
+ pu1_pred += 2;
+ pu1_dst += 2;
+
+ zero_cols = zero_cols >> 1;
+ }
+ }
+ }
+}
+
+