summaryrefslogtreecommitdiffstats
path: root/common/ihevc_common_tables.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/ihevc_common_tables.c')
-rw-r--r--common/ihevc_common_tables.c549
1 files changed, 549 insertions, 0 deletions
diff --git a/common/ihevc_common_tables.c b/common/ihevc_common_tables.c
new file mode 100644
index 0000000..7927497
--- /dev/null
+++ b/common/ihevc_common_tables.c
@@ -0,0 +1,549 @@
+/******************************************************************************
+*
+* 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_common_tables.c
+*
+* @brief
+* Contains common global tables
+*
+* @author
+* Harish M
+*
+* @par List of Tables:
+* gai4_ihevc_max_luma_pic_size
+* gai4_ihevc_max_wd_ht
+* gai4_ihevc_min_wd_ht
+* gai4_ihevc_ang_table
+* col_for_intra_luma
+* col_for_intra_chroma
+* idx_neg_vals_3_9
+* idx_neg_idx_3_9
+* idx_neg_idx_chroma_3_9
+* idx_neg_idx_11_17
+* idx_neg_idx_chroma_11_17
+* gai4_ihevc_inv_ang_table
+* gau1_ihevc_invscan8x8
+* gau1_ihevc_invscan4x4
+* gau1_ihevc_invscan2x2
+* gau1_ihevc_scan8x8
+* gau1_ihevc_scan4x4
+* gau1_ihevc_scan2x2
+* *gapv_ihevc_scan
+* *gapv_ihevc_invscan
+* gau1_ihevc_chroma_qp_scale
+* gai1_ihevc_chroma_qp_scale
+* gau1_ihevc_planar_factor
+* gau1_ihevc_planar_factor_1
+* gai4_ihevc_ang_table_chroma
+* gai4_ihevc_inv_ang_table_chroma
+* gau1_ihevc_planar_factor_chroma
+* gau1_intra_pred_ref_filter
+* gi1_table_edge_idx
+* gu1_table_band_idx
+* gu2_table_band_idx
+*
+* @remarks
+* None
+*
+*******************************************************************************
+*/
+
+#include "ihevc_typedefs.h"
+#include "ihevc_platform_macros.h"
+#include "ihevc_common_tables.h"
+
+/*****************************************************************************/
+/* Level specific tables */
+/*****************************************************************************/
+
+/**
+ * Array giving size of max luma samples in a picture for a given level
+ */
+const WORD32 gai4_ihevc_max_luma_pic_size[] =
+{
+ /* Level 1 */
+ 36864,
+ /* Level 2 */
+ 122880,
+ /* Level 2.1 */
+ 245760,
+ /* Level 3 */
+ 552960,
+ /* Level 3.1 */
+ 983040,
+ /* Level 4 */
+ 2228224,
+ /* Level 4.1 */
+ 2228224,
+ /* Level 5 */
+ 8912896,
+ /* Level 5.1 */
+ 8912896,
+ /* Level 5.2 */
+ 8912896,
+ /* Level 6 */
+ 33423360,
+ /* Level 6.1 */
+ 33423360,
+ /* Level 6.2 */
+ 33423360
+};
+/** Max width and height allowed for a given level */
+/** This is derived as SQRT(8 * gai4_ihevc_max_luma_pic_size[]) */
+const WORD32 gai4_ihevc_max_wd_ht[] =
+{
+ /* Level 1 */
+ 543,
+ /* Level 2 */
+ 991,
+ /* Level 2.1 */
+ 1402,
+ /* Level 3 */
+ 2103,
+ /* Level 3.1 */
+ 2804,
+ /* Level 4 */
+ 4222,
+ /* Level 4.1 */
+ 4222,
+ /* Level 5 */
+ 8444,
+ /* Level 5.1 */
+ 8444,
+ /* Level 5.2 */
+ 8444,
+ /* Level 6 */
+ 16888,
+ /* Level 6.1 */
+ 16888,
+ /* Level 6.2 */
+ 16888
+};
+
+/** Min width and height allowed for a given level */
+/** This is derived as gai4_ihevc_max_luma_pic_size[]/gai4_ihevc_max_wd_ht[] */
+const WORD32 gai4_ihevc_min_wd_ht[] =
+{
+ /* Level 1 */
+ 67,
+ /* Level 2 */
+ 123,
+ /* Level 2.1 */
+ 175,
+ /* Level 3 */
+ 262,
+ /* Level 3.1 */
+ 350,
+ /* Level 4 */
+ 527,
+ /* Level 4.1 */
+ 527,
+ /* Level 5 */
+ 1055,
+ /* Level 5.1 */
+ 1055,
+ /* Level 5.2 */
+ 1055,
+ /* Level 6 */
+ 2111,
+ /* Level 6.1 */
+ 2111,
+ /* Level 6.2 */
+ 2111
+};
+/*****************************************************************************/
+/* Intra prediction tables */
+/*****************************************************************************/
+/**
+ * Intra pred angles
+ */
+/* g_ang_table = tan(actual angle) in Q5 format for all 33 modes */
+const WORD32 gai4_ihevc_ang_table[35] =
+ { 0, 0, 32, 26, 21, 17, 13, 9, 5, 2, 0, -2, -5, -9, -13, -17, -21, -26, -32,
+ -26, -21, -17, -13, -9, -5, -2, 0, 2, 5, 9, 13, 17, 21, 26, 32 };
+
+const WORD8 col_for_intra_luma[32] =
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32 };
+
+const WORD8 col_for_intra_chroma[32] =
+ { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16 };
+
+const WORD8 idx_neg_vals_3_9[7] =
+ { 26, 21, 17, 13, 9, 5, 2 };
+
+const WORD32 idx_neg_idx_3_9[28] =
+ { 6, 13, 19, 26, 5, 10, 15, 21, 4, 8, 12, 17, 3, 6, 9, 13, 2, 4, 6, 9,
+ 1, 2, 3, 5, 0, 0, 1, 2 };
+
+
+const WORD32 idx_neg_idx_chroma_3_9[28] =
+ { 3, 6, 9, 13,
+ 2, 5, 7, 10,
+ 2, 4, 6, 8,
+ 1, 3, 4, 6,
+ 1, 2, 3, 4,
+ 0, 1, 1, 2,
+ 0, 0, 0, 1 };
+const WORD32 idx_neg_idx_11_17[28] =
+ { -1, -1, -2, -2, -2, -3, -4, -5, -3, -5, -7, -9, -4, -7, -10, -13, -5, -9, -13, -17, -6, -11,
+ -16, -21, -7, -13, -20, -26 };
+
+const WORD32 idx_neg_idx_chroma_11_17[28] =
+ { -1, -1, -1, -1,
+ -1, -2, -2, -3,
+ -2, -3, -4, -5,
+ -2, -4, -5, -7,
+ -3, -5, -7, -9,
+ -3, -6, -8, -11,
+ -4, -7, -10, -13 };
+
+/**
+ * Intra pred inverse angles
+ */
+/* g_invAngTable = Inverse angle in Q5 format, required for negative angles */
+const WORD32 gai4_ihevc_inv_ang_table[14] =
+ { 4096, 1638, 910, 630, 482, 390, 315, 315, 390, 482, 630, 910, 1638, 4096 };
+
+/*****************************************************************************/
+/* Scan matrices */
+/*****************************************************************************/
+/**
+ * Inverse Scan matrix for 8x8 Section 6.5.3
+ */
+const UWORD8 gau1_ihevc_invscan8x8[][64] =
+{
+ /* Upright diagonal */
+ {
+ 0, 8, 1, 16, 9, 2, 24, 17,
+ 10, 3, 32, 25, 18, 11, 4, 40,
+ 33, 26, 19, 12, 5, 48, 41, 34,
+ 27, 20, 13, 6, 56, 49, 42, 35,
+ 28, 21, 14, 7, 57, 50, 43, 36,
+ 29, 22, 15, 58, 51, 44, 37, 30,
+ 23, 59, 52, 45, 38, 31, 60, 53,
+ 46, 39, 61, 54, 47, 62, 55, 63
+ },
+ /* Horizontal */
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63
+ },
+ /* Vertical */
+ {
+ 0, 8, 16, 24, 32, 40, 48, 56,
+ 1, 9, 17, 25, 33, 41, 49, 57,
+ 2, 10, 18, 26, 34, 42, 50, 58,
+ 3, 11, 19, 27, 35, 43, 51, 59,
+ 4, 12, 20, 28, 36, 44, 52, 60,
+ 5, 13, 21, 29, 37, 45, 53, 61,
+ 6, 14, 22, 30, 38, 46, 54, 62,
+ 7, 15, 23, 31, 39, 47, 55, 63
+ }
+};
+
+/**
+ * Inverse Scan matrix for 4x4 Section 6.5.3
+ */
+const UWORD8 gau1_ihevc_invscan4x4[][16] =
+{
+ /* Upright diagonal */
+ {
+ 0, 4, 1, 8,
+ 5, 2, 12, 9,
+ 6, 3, 13, 10,
+ 7, 14, 11, 15
+ },
+ /* Horizontal */
+ {
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 12, 13, 14, 15
+ },
+ /* Vertical */
+ {
+ 0, 4, 8, 12,
+ 1, 5, 9, 13,
+ 2, 6, 10, 14,
+ 3, 7, 11, 15
+ }
+};
+
+/**
+ * Inverse Scan matrix for 4x4 Section 6.5.3
+ */
+const UWORD8 gau1_ihevc_invscan2x2[][4] =
+{
+ /* Upright diagonal */
+ {
+ 0, 2,
+ 1, 3
+ },
+ /* Horizontal */
+ {
+ 0, 1,
+ 2, 3
+ },
+ /* Vertical */
+ {
+ 0, 2,
+ 1, 3,
+ }
+};
+
+/**
+ * Scan matrix for 8x8 Section 6.5.3
+ */
+
+const UWORD8 gau1_ihevc_scan8x8[][64] =
+{
+ /* Upright diagonal */
+ {
+ 0, 2, 5, 9, 14, 20, 27, 35,
+ 1, 4, 8, 13, 19, 26, 34, 42,
+ 3, 7, 12, 18, 25, 33, 41, 48,
+ 6, 11, 17, 24, 32, 40, 47, 53,
+ 10, 16, 23, 31, 39, 46, 52, 57,
+ 15, 22, 30, 38, 45, 51, 56, 60,
+ 21, 29, 37, 44, 50, 55, 59, 62,
+ 28, 36, 43, 49, 54, 58, 61, 63
+ },
+ /* Horizontal */
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63
+ },
+ /* Vertical */
+ {
+ 0, 8, 16, 24, 32, 40, 48, 56,
+ 1, 9, 17, 25, 33, 41, 49, 57,
+ 2, 10, 18, 26, 34, 42, 50, 58,
+ 3, 11, 19, 27, 35, 43, 51, 59,
+ 4, 12, 20, 28, 36, 44, 52, 60,
+ 5, 13, 21, 29, 37, 45, 53, 61,
+ 6, 14, 22, 30, 38, 46, 54, 62,
+ 7, 15, 23, 31, 39, 47, 55, 63
+ }
+};
+
+/**
+ * Scan matrix for 4x4 Section 6.5.3
+ */
+const UWORD8 gau1_ihevc_scan4x4[][16] =
+{
+ /* Upright diagonal */
+ {
+ 0, 2, 5, 9,
+ 1, 4, 8, 12,
+ 3, 7, 11, 14,
+ 6, 10, 13, 15
+ },
+ /* Horizontal */
+ {
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 12, 13, 14, 15
+ },
+ /* Vertical */
+ {
+ 0, 4, 8, 12,
+ 1, 5, 9, 13,
+ 2, 6, 10, 14,
+ 3, 7, 11, 15
+ }
+};
+
+/**
+ * Scan matrix for 4x4 Section 6.5.3
+ */
+const UWORD8 gau1_ihevc_scan2x2[][4] =
+{
+ /* Upright diagonal */
+ {
+ 0, 2,
+ 1, 3
+ },
+ /* Horizontal */
+ {
+ 0, 1,
+ 2, 3
+ },
+ /* Vertical */
+ {
+ 0, 2,
+ 1, 3,
+ }
+};
+
+/**
+ * Table containing all the scan matrices
+ */
+const void *gapv_ihevc_scan[] =
+{
+ gau1_ihevc_scan2x2[0],
+ gau1_ihevc_scan4x4[0],
+ gau1_ihevc_scan8x8[0],
+
+ gau1_ihevc_scan2x2[1],
+ gau1_ihevc_scan4x4[1],
+ gau1_ihevc_scan8x8[1],
+
+ gau1_ihevc_scan2x2[2],
+ gau1_ihevc_scan4x4[2],
+ gau1_ihevc_scan8x8[2],
+
+};
+
+const void *gapv_ihevc_invscan[] =
+{
+ gau1_ihevc_invscan2x2[0],
+ gau1_ihevc_invscan4x4[0],
+ gau1_ihevc_invscan8x8[0],
+
+ gau1_ihevc_invscan2x2[1],
+ gau1_ihevc_invscan4x4[1],
+ gau1_ihevc_invscan8x8[1],
+
+ gau1_ihevc_invscan2x2[2],
+ gau1_ihevc_invscan4x4[2],
+ gau1_ihevc_invscan8x8[2],
+};
+/**
+ * Table for luma to chroma qp conversion
+ */
+
+// FOR MAIN branch encoder ( 8 bit)
+const UWORD8 gau1_ihevc_chroma_qp_scale[58] =
+{
+
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32,
+ 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51
+};
+
+// FOR HBD branch encoder ( 8 and 10 bit)
+const WORD8 gai1_ihevc_chroma_qp_scale[70] = //EXTENDED for 10 bit
+{
+
+ -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32,
+ 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51
+};
+
+
+/** constant planar factor values table */
+const UWORD8 gau1_ihevc_planar_factor[65] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64 };
+//AX CHANGES
+const UWORD8 gau1_ihevc_planar_factor_1[32] = { 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9,
+ 17, 17, 17, 17, 17, 17, 17, 17, 25, 25, 25, 25, 25, 25,
+ 25, 25 };
+//AX CHANGES
+
+/** g_ang_table = tan(actual angle) in Q5 format for all 33 modes */
+const WORD32 gai4_ihevc_ang_table_chroma[35] = { 0, 0, 32, 26, 21, 17, 13, 9, 5, 2, 0, -2, -5, -9,
+ -13, -17, -21, -26, -32, -26, -21, -17, -13, -9, -5,
+ -2, 0, 2, 5, 9, 13, 17, 21, 26, 32 };
+/** g_invAngTable = Inverse angle in Q5 format, required for negative angles */
+const WORD32 gai4_ihevc_inv_ang_table_chroma[14] = { 4096, 1638, 910, 630, 482, 390, 315,
+ 315, 390, 482, 630, 910, 1638, 4096 };
+
+
+/** constant planar factor values table */
+const UWORD8 gau1_ihevc_planar_factor_chroma[33] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 32 };
+
+
+
+/** Filter flag values for intra pred referenece filtering - intra pred mode is the index
+* flag for nt = 4 is the Bit 0, nt = 8 is Bit 1, nt = 16 is Bit 2, nt = 32 is Bit 3
+*/
+const UWORD8 gau1_intra_pred_ref_filter[] =
+{
+ 14, 0, 14, 12, 12, 12, 12,
+ 12, 12, 8, 0, 8, 12, 12,
+ 12, 12, 12, 12, 14, 12, 12,
+ 12, 12, 12, 12, 8, 0, 8,
+ 12, 12, 12, 12, 12, 12, 14
+};
+
+
+const WORD8 gi1_table_edge_idx[8] = { 1, 2, 0, 3, 4, 0, 0, 0 }; /* First 5 values are valid. Last 3 dummy values are added to help SIMD load*/
+
+const UWORD8 gu1_table_band_idx[32] = { 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31
+};
+
+const UWORD16 gu2_table_band_idx[32] = { 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31
+};
+
+#ifdef ENABLE_SSE4_1_INTR
+/*Used as a lookup table to have popcnt instruction working for SSE4.1 platform.
+Each unit indicates number of 1s the index at which it is persent
+*/
+const WORD8 gi1_popcnt_byte_table[] =
+{
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
+#endif