|
|
/******************************************************************************
|
|
|
*
|
|
|
* 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 <20> 1001
|
|
|
0010 24
|
|
|
0011 25
|
|
|
0100 30 000 <20> 1001
|
|
|
0101 30
|
|
|
0110 50
|
|
|
0111 60 000 <20> 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};
|