| /****************************************************************************** |
| * |
| * Copyright (C) 2015 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 |
| */ |
| #include <stdio.h> |
| #include "iv_datatypedef.h" |
| #include "iv.h" |
| #include "impeg2_buf_mgr.h" |
| #include "impeg2_disp_mgr.h" |
| #include "impeg2_defs.h" |
| #include "impeg2_platform_macros.h" |
| #include "impeg2_globals.h" |
| |
| /* Table for converting the quantizer_scale_code to quantizer_scale */ |
| const UWORD8 gau1_impeg2_non_linear_quant_scale[] = |
| { |
| 0, 1, 2, 3, 4, 5, 6, 7, |
| 8,10,12,14,16,18,20,22, |
| 24,28,32,36,40,44,48,52, |
| 56,64,72,80,88,96,104,112 |
| }; |
| |
| |
| /* Default quantizer matrix to be used for intra blocks */ |
| const UWORD8 gau1_impeg2_intra_quant_matrix_default[] = |
| { |
| 8, 16, 19, 22, 26, 27, 29, 34, |
| 16, 16, 22, 24, 27, 29, 34, 37, |
| 19, 22, 26, 27, 29, 34, 34, 38, |
| 22, 22, 26, 27, 29, 34, 37, 40, |
| 22, 26, 27, 29, 32, 35, 40, 48, |
| 26, 27, 29, 32, 35, 40, 48, 58, |
| 26, 27, 29, 34, 38, 46, 56, 69, |
| 27, 29, 35, 38, 46, 56, 69, 83 |
| }; |
| |
| /* Default quantizer matrix to be used for inter blocks */ |
| const UWORD8 gau1_impeg2_inter_quant_matrix_default[] = |
| { |
| 16,16,16,16,16,16,16,16, |
| 16,16,16,16,16,16,16,16, |
| 16,16,16,16,16,16,16,16, |
| 16,16,16,16,16,16,16,16, |
| 16,16,16,16,16,16,16,16, |
| 16,16,16,16,16,16,16,16, |
| 16,16,16,16,16,16,16,16, |
| 16,16,16,16,16,16,16,16 |
| }; |
| |
| /* Table to perform inverse scan when the scan direction is zigzag */ |
| const UWORD8 gau1_impeg2_inv_scan_zig_zag[] = |
| { |
| 0, 1, 8, 16, 9, 2, 3, 10, |
| 17, 24, 32, 25, 18, 11, 4, 5, |
| 12, 19, 26, 33, 40, 48, 41, 34, |
| 27, 20, 13, 6, 7, 14, 21, 28, |
| 35, 42, 49, 56, 57, 50, 43, 36, |
| 29, 22, 15, 23, 30, 37, 44, 51, |
| 58, 59, 52, 45, 38, 31, 39, 46, |
| 53, 60, 61, 54, 47, 55, 62, 63 |
| }; |
| |
| /* Table to perform inverse scan when the direction of scanning is vertical */ |
| const UWORD8 gau1_impeg2_inv_scan_vertical[] = |
| { |
| 0, 8, 16, 24, 1, 9, 2, 10, |
| 17, 25, 32, 40, 48, 56, 57, 49, |
| 41, 33, 26, 18, 3, 11, 4, 12, |
| 19, 27, 34, 42, 50, 58, 35, 43, |
| 51, 59, 20, 28, 5, 13, 6, 14, |
| 21, 29, 36, 44, 52, 60, 37, 45, |
| 53, 61, 22, 30, 7, 15, 23, 31, |
| 38, 46, 54, 62, 39, 47, 55, 63 |
| }; |
| |
| /*****************************************************************************/ |
| /* Table that indicate which interpolation type is to used */ |
| /*****************************************************************************/ |
| /* Chroma when motion vector is positive */ |
| const UWORD16 gau2_impeg2_chroma_interp_mv[][16] = |
| { |
| /* Pos X Pos Y */ |
| { |
| 0, 0, 1, 1, |
| 0, 0, 1, 1, |
| 2, 2, 3, 3, |
| 2, 2, 3, 3 |
| }, |
| /* Neg X Pos Y */ |
| { |
| 0, 1, 1, 0, |
| 0, 1, 1, 0, |
| 2, 3, 3, 2, |
| 2, 3, 3, 2 |
| }, |
| /* Pos X Neg Y */ |
| { |
| 0, 0, 1, 1, |
| 2, 2, 3, 3, |
| 2, 2, 3, 3, |
| 0, 0, 1, 1 |
| }, |
| /* Neg X Neg Y */ |
| { |
| 0, 1, 1, 0, |
| 2, 3, 3, 2, |
| 2, 3, 3, 2, |
| 0, 1, 1, 0 |
| } |
| }; |
| /*****************************************************************************/ |
| /* Input #1 Offset in bytes */ |
| /*****************************************************************************/ |
| /* Chroma */ |
| const UWORD16 gau2_impeg2_chroma_interp_inp1[][16] = |
| { |
| /* Pos X Pos Y */ |
| { |
| 0, 0, 0, 0, |
| 0, 0, 0, 0, |
| 0, 0, 0, 0, |
| 0, 0, 0, 0 |
| }, |
| /* Neg X Pos Y */ |
| { |
| 0, 0, 0, 4, |
| 0, 0, 0, 4, |
| 0, 0, 0, 4, |
| 0, 0, 0, 4 |
| }, |
| /* Pos X Neg Y */ |
| { |
| 0, 0, 0, 0, |
| 0, 0, 0, 0, |
| 0, 0, 0, 0, |
| 72, 72, 72, 72 |
| }, |
| /* Neg X Neg Y */ |
| { |
| 0, 0, 0, 4, |
| 0, 0, 0, 4, |
| 0, 0, 0, 4, |
| 72, 72, 72, 76 |
| } |
| }; |
| /* Luma */ |
| const UWORD16 gau2_impeg2_luma_interp_inp1[] = |
| { |
| 1, 1, 3, 3, |
| 1, 1, 3, 3, |
| 37, 37, 39, 39, |
| 37, 37, 39, 39 |
| }; |
| /*****************************************************************************/ |
| /* Input #2 Offset from Input #1 in bytes */ |
| /*****************************************************************************/ |
| /* |
| FXFY 0, |
| HXFY 2, |
| FXHY 36, |
| HXHY 36 |
| */ |
| const UWORD16 gau2_impeg2_luma_interp_inp2[] = |
| { |
| 0, 2, 0, 2, |
| 36, 36, 36, 36, |
| 0, 2, 0, 2, |
| 36, 36, 36, 36 |
| }; |
| const UWORD16 gau2_impeg2_chroma_interp_inp2[] = |
| { |
| /* FXFY */ |
| 0, |
| /* HXFY */ |
| 4, |
| /* FXHY */ |
| 72, |
| /* HXHY */ |
| 72 |
| }; |
| |
| /*****************************************************************************/ |
| /* Corresponds to Table 6-4 frame_rate_value of the standard */ |
| /*****************************************************************************/ |
| /* |
| frame_rate_code frame_rate_value |
| |
| 0000 Forbidden |
| 0001 24 000 ÷ 1001 |
| 0010 24 |
| 0011 25 |
| 0100 30 000 ÷ 1001 |
| 0101 30 |
| 0110 50 |
| 0111 60 000 ÷ 1001 |
| 1000 60 |
| 1001 Reserved |
| .... |
| 1111 Reserved |
| */ |
| const UWORD16 gau2_impeg2_frm_rate_code[][2] = |
| { |
| {1 , 1}, /* Forbidden */ |
| {24000, 1001}, |
| {24000, 1000}, |
| {25000, 1000}, |
| {30000, 1001}, |
| {30000, 1000}, |
| {50000, 1000}, |
| {60000, 1001}, |
| {60000, 1000} |
| /* Rest reserved */ |
| }; |
| |
| const WORD16 gai2_impeg2_idct_q15[] = |
| { |
| 23170, 23170, 23170, 23170, 23170, 23170, 23170, 23170, |
| 32138, 27246, 18205, 6393, -6393, -18205, -27246, -32138, |
| 30274, 12540, -12540, -30274, -30274, -12540, 12540, 30274, |
| 27246, -6393, -32138, -18205, 18205, 32138, 6393, -27246, |
| 23170, -23170, -23170, 23170, 23170, -23170, -23170, 23170, |
| 18205, -32138, 6393, 27246, -27246, -6393, 32138, -18205, |
| 12540, -30274, 30274, -12540, -12540, 30274, -30274, 12540, |
| 6393, -18205, 27246, -32138, 32138, -27246, 18205, -6393, |
| }; |
| |
| const WORD16 gai2_impeg2_idct_q11[] = |
| { |
| 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, |
| 2009, 1703, 1138, 400, -400, -1138, -1703, -2009, |
| 1892, 784, -784, -1892, -1892, -784, 784, 1892, |
| 1703, -400, -2009, -1138, 1138, 2009, 400, -1703, |
| 1448, -1448, -1448, 1448, 1448, -1448, -1448, 1448, |
| 1138, -2009, 400, 1703, -1703, -400, 2009, -1138, |
| 784, -1892, 1892, -784, -784, 1892, -1892, 784, |
| 400, -1138, 1703, -2009, 2009, -1703, 1138, -400, |
| }; |
| |
| const WORD16 gai2_impeg2_idct_even_8_q15[][8] = |
| { |
| { 23170, 23170, 23170, 23170, 23170, 23170, 23170, 23170 }, |
| { 12540, -30274, 12540, -30274, 12540, -30274, 12540, -30274 }, |
| { 30274, 12540, 30274, 12540, 30274, 12540, 30274, 12540 }, |
| { 23170, -23170, 23170, -23170, 23170, -23170, 23170, -23170 } |
| }; |
| const WORD16 gai2_impeg2_idct_odd_8_q15[][8] = |
| { |
| { 32138, 27246, 32138, 27246, 32138, 27246, 32138, 27246 }, |
| { 18205, 6393, 18205, 6393, 18205, 6393, 18205, 6393 }, |
| { 27246, -6393, 27246, -6393, 27246, -6393, 27246, -6393 }, |
| { 32138, 18205, 32138, 18205, 32138, 18205, 32138, 18205 }, |
| { 18205, -32138, 18205, -32138, 18205, -32138, 18205, -32138 }, |
| { 6393, 27246, 6393, 27246, 6393, 27246, 6393, 27246 }, |
| { 6393, -18205, 6393, -18205, 6393, -18205, 6393, -18205 }, |
| { 27246, -32138, 27246, -32138, 27246, -32138, 27246, -32138 }, |
| }; |
| |
| const WORD16 gai2_impeg2_idct_even_8_q11[][8] = |
| { |
| { 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448 }, |
| { 784, -1892, 784, -1892, 784, -1892, 784, -1892 }, |
| { 1892, 784, 1892, 784, 1892, 784, 1892, 784 }, |
| { 1448, -1448, 1448, -1448, 1448, -1448, 1448, -1448 } |
| }; |
| const WORD16 gai2_impeg2_idct_odd_8_q11[][8] = |
| { |
| { 2009, 1703, 2009, 1703, 2009, 1703, 2009, 1703 }, |
| { 1138, 400, 1138, 400, 1138, 400, 1138, 400 }, |
| { 1703, -400, 1703, -400, 1703, -400, 1703, -400 }, |
| { 2009, 1138, 2009, 1138, 2009, 1138, 2009, 1138 }, |
| { 1138, -2009, 1138, -2009, 1138, -2009, 1138, -2009 }, |
| { 400, 1703, 400, 1703, 400, 1703, 400, 1703 }, |
| { 400, -1138, 400, -1138, 400, -1138, 400, -1138 }, |
| { 1703, -2009, 1703, -2009, 1703, -2009, 1703, -2009 }, |
| }; |
| |
| |
| |
| /*****************************************************************************/ |
| /* Last row IDCT Coefficients in Q11 format */ |
| /*****************************************************************************/ |
| const WORD16 gai2_impeg2_idct_last_row_q11[] = |
| { |
| 400, -1138, 1703, -2009, 2009, -1703, 1138, -400, |
| }; |
| |
| const WORD16 gai2_impeg2_idct_first_col_q15[] = |
| { |
| 23170, 32138, 30274, 27246, 23170, 18205, 12540, 6393, |
| }; |
| |
| const WORD16 gai2_impeg2_idct_first_col_q11[] = |
| { |
| 1448, 2009, 1892, 1703, 1448, 1138, 784, 400, |
| }; |
| |
| /*****************************************************************************/ |
| /* Output of first stage dct (using gai2_impeg2_idct_q15 as coeffs) */ |
| /* for a 1D data (0, 0, 0, 0, 0, 0, 0, 1) */ |
| /*****************************************************************************/ |
| |
| const WORD16 gai2_impeg2_mismatch_stg1_outp[] = |
| { |
| 2, -4, 7, -8, 8, -7, 4, -2 |
| }; |
| |
| const WORD16 gai2_impeg2_mismatch_stg2_additive[] = |
| { |
| 800, -2276, 3406, -4018, 4018, -3406, 2276, -800, |
| -1600, 4552, -6812, 8036, -8036, 6812, -4552, 1600, |
| 2800, -7966, 11921, -14063, 14063, -11921, 7966, -2800, |
| -3200, 9104, -13624, 16072, -16072, 13624, -9104, 3200, |
| 3200, -9104, 13624, -16072, 16072, -13624, 9104, -3200, |
| -2800, 7966, -11921, 14063, -14063, 11921, -7966, 2800, |
| 1600, -4552, 6812, -8036, 8036, -6812, 4552, -1600, |
| -800, 2276, -3406, 4018, -4018, 3406, -2276, 800, |
| }; |
| |
| |
| const UWORD8 gau1_impeg2_zerobuf[] = |
| { |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, |
| }; |
| /*****************************************************************************/ |
| /* Tables of offset needed to address block in an MB */ |
| /*****************************************************************************/ |
| const WORD16 gai2_impeg2_blk_y_off_fld[] = {0,0,1,1}; |
| const WORD16 gai2_impeg2_blk_y_off_frm[] = {0,0,8,8}; |
| const WORD16 gai2_impeg2_blk_x_off[] = {0,8,0,8}; |