1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * @brief 25cabdff1aSopenharmony_ci * H.264 / AVC / MPEG-4 part10 codec data table 26cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at> 27cabdff1aSopenharmony_ci */ 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include <stdint.h> 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "libavutil/avutil.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#include "h264_parse.h" 34cabdff1aSopenharmony_ci#include "h264data.h" 35cabdff1aSopenharmony_ci#include "mpegutils.h" 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ciconst uint8_t ff_h264_golomb_to_pict_type[5] = { 38cabdff1aSopenharmony_ci AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, AV_PICTURE_TYPE_I, 39cabdff1aSopenharmony_ci AV_PICTURE_TYPE_SP, AV_PICTURE_TYPE_SI 40cabdff1aSopenharmony_ci}; 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ciconst uint8_t ff_h264_golomb_to_intra4x4_cbp[48] = { 43cabdff1aSopenharmony_ci 47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45, 46, 44cabdff1aSopenharmony_ci 16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1, 2, 4, 45cabdff1aSopenharmony_ci 8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40, 38, 41 46cabdff1aSopenharmony_ci}; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ciconst uint8_t ff_h264_golomb_to_inter_cbp[48] = { 49cabdff1aSopenharmony_ci 0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13, 50cabdff1aSopenharmony_ci 14, 6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46, 51cabdff1aSopenharmony_ci 17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41 52cabdff1aSopenharmony_ci}; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ciconst uint8_t ff_h264_chroma_dc_scan[4] = { 55cabdff1aSopenharmony_ci (0 + 0 * 2) * 16, (1 + 0 * 2) * 16, 56cabdff1aSopenharmony_ci (0 + 1 * 2) * 16, (1 + 1 * 2) * 16, 57cabdff1aSopenharmony_ci}; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ciconst uint8_t ff_h264_chroma422_dc_scan[8] = { 60cabdff1aSopenharmony_ci (0 + 0 * 2) * 16, (0 + 1 * 2) * 16, 61cabdff1aSopenharmony_ci (1 + 0 * 2) * 16, (0 + 2 * 2) * 16, 62cabdff1aSopenharmony_ci (0 + 3 * 2) * 16, (1 + 1 * 2) * 16, 63cabdff1aSopenharmony_ci (1 + 2 * 2) * 16, (1 + 3 * 2) * 16, 64cabdff1aSopenharmony_ci}; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ciconst IMbInfo ff_h264_i_mb_type_info[26] = { 67cabdff1aSopenharmony_ci { MB_TYPE_INTRA4x4, -1, -1 }, 68cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 2, 0 }, 69cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 1, 0 }, 70cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 0, 0 }, 71cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 3, 0 }, 72cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 2, 16 }, 73cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 1, 16 }, 74cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 0, 16 }, 75cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 3, 16 }, 76cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 2, 32 }, 77cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 1, 32 }, 78cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 0, 32 }, 79cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 3, 32 }, 80cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 2, 15 + 0 }, 81cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 1, 15 + 0 }, 82cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 0, 15 + 0 }, 83cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 3, 15 + 0 }, 84cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 2, 15 + 16 }, 85cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 1, 15 + 16 }, 86cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 0, 15 + 16 }, 87cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 3, 15 + 16 }, 88cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 2, 15 + 32 }, 89cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 1, 15 + 32 }, 90cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 0, 15 + 32 }, 91cabdff1aSopenharmony_ci { MB_TYPE_INTRA16x16, 3, 15 + 32 }, 92cabdff1aSopenharmony_ci { MB_TYPE_INTRA_PCM, -1, -1 }, 93cabdff1aSopenharmony_ci}; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ciconst PMbInfo ff_h264_p_mb_type_info[5] = { 96cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L0, 1 }, 97cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 }, 98cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 }, 99cabdff1aSopenharmony_ci { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4 }, 100cabdff1aSopenharmony_ci { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_REF0, 4 }, 101cabdff1aSopenharmony_ci}; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ciconst PMbInfo ff_h264_p_sub_mb_type_info[4] = { 104cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L0, 1 }, 105cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0, 2 }, 106cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0, 2 }, 107cabdff1aSopenharmony_ci { MB_TYPE_8x8 | MB_TYPE_P0L0, 4 }, 108cabdff1aSopenharmony_ci}; 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_ciconst PMbInfo ff_h264_b_mb_type_info[23] = { 111cabdff1aSopenharmony_ci { MB_TYPE_DIRECT2 | MB_TYPE_L0L1, 1, }, 112cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L0, 1, }, 113cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L1, 1, }, 114cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, }, 115cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, 116cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, 117cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, 118cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, 119cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, }, 120cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, }, 121cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, 122cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, 123cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 124cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 125cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 126cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 127cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, 128cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, 129cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, 130cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, 131cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 132cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 133cabdff1aSopenharmony_ci { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, }, 134cabdff1aSopenharmony_ci}; 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ciconst PMbInfo ff_h264_b_sub_mb_type_info[13] = { 137cabdff1aSopenharmony_ci { MB_TYPE_DIRECT2, 1, }, 138cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L0, 1, }, 139cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L1, 1, }, 140cabdff1aSopenharmony_ci { MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, }, 141cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, 142cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, 143cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, 144cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, 145cabdff1aSopenharmony_ci { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 146cabdff1aSopenharmony_ci { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, 147cabdff1aSopenharmony_ci { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4, }, 148cabdff1aSopenharmony_ci { MB_TYPE_8x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 4, }, 149cabdff1aSopenharmony_ci { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, }, 150cabdff1aSopenharmony_ci}; 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ciconst uint8_t ff_h264_dequant4_coeff_init[6][3] = { 153cabdff1aSopenharmony_ci { 10, 13, 16 }, 154cabdff1aSopenharmony_ci { 11, 14, 18 }, 155cabdff1aSopenharmony_ci { 13, 16, 20 }, 156cabdff1aSopenharmony_ci { 14, 18, 23 }, 157cabdff1aSopenharmony_ci { 16, 20, 25 }, 158cabdff1aSopenharmony_ci { 18, 23, 29 }, 159cabdff1aSopenharmony_ci}; 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ciconst uint8_t ff_h264_dequant8_coeff_init_scan[16] = { 162cabdff1aSopenharmony_ci 0, 3, 4, 3, 3, 1, 5, 1, 4, 5, 2, 5, 3, 1, 5, 1 163cabdff1aSopenharmony_ci}; 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ciconst uint8_t ff_h264_dequant8_coeff_init[6][6] = { 166cabdff1aSopenharmony_ci { 20, 18, 32, 19, 25, 24 }, 167cabdff1aSopenharmony_ci { 22, 19, 35, 21, 28, 26 }, 168cabdff1aSopenharmony_ci { 26, 23, 42, 24, 33, 31 }, 169cabdff1aSopenharmony_ci { 28, 25, 45, 26, 35, 33 }, 170cabdff1aSopenharmony_ci { 32, 28, 51, 30, 40, 38 }, 171cabdff1aSopenharmony_ci { 36, 32, 58, 34, 46, 43 }, 172cabdff1aSopenharmony_ci}; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ciconst uint8_t ff_h264_quant_rem6[QP_MAX_NUM + 1] = { 175cabdff1aSopenharmony_ci 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 176cabdff1aSopenharmony_ci 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 177cabdff1aSopenharmony_ci 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 178cabdff1aSopenharmony_ci 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 179cabdff1aSopenharmony_ci 0, 1, 2, 3, 180cabdff1aSopenharmony_ci}; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ciconst uint8_t ff_h264_quant_div6[QP_MAX_NUM + 1] = { 183cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 184cabdff1aSopenharmony_ci 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 185cabdff1aSopenharmony_ci 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 186cabdff1aSopenharmony_ci 10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13, 13, 13, 13, 187cabdff1aSopenharmony_ci 14,14,14,14, 188cabdff1aSopenharmony_ci}; 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci#define QP(qP, depth) ((qP) + 6 * ((depth) - 8)) 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci#define CHROMA_QP_TABLE_END(d) \ 193cabdff1aSopenharmony_ci QP(0, d), QP(1, d), QP(2, d), QP(3, d), QP(4, d), QP(5, d), \ 194cabdff1aSopenharmony_ci QP(6, d), QP(7, d), QP(8, d), QP(9, d), QP(10, d), QP(11, d), \ 195cabdff1aSopenharmony_ci QP(12, d), QP(13, d), QP(14, d), QP(15, d), QP(16, d), QP(17, d), \ 196cabdff1aSopenharmony_ci QP(18, d), QP(19, d), QP(20, d), QP(21, d), QP(22, d), QP(23, d), \ 197cabdff1aSopenharmony_ci QP(24, d), QP(25, d), QP(26, d), QP(27, d), QP(28, d), QP(29, d), \ 198cabdff1aSopenharmony_ci QP(29, d), QP(30, d), QP(31, d), QP(32, d), QP(32, d), QP(33, d), \ 199cabdff1aSopenharmony_ci QP(34, d), QP(34, d), QP(35, d), QP(35, d), QP(36, d), QP(36, d), \ 200cabdff1aSopenharmony_ci QP(37, d), QP(37, d), QP(37, d), QP(38, d), QP(38, d), QP(38, d), \ 201cabdff1aSopenharmony_ci QP(39, d), QP(39, d), QP(39, d), QP(39, d) 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_ciconst uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1] = { 204cabdff1aSopenharmony_ci { CHROMA_QP_TABLE_END(8) }, 205cabdff1aSopenharmony_ci { 0, 1, 2, 3, 4, 5, 206cabdff1aSopenharmony_ci CHROMA_QP_TABLE_END(9) }, 207cabdff1aSopenharmony_ci { 0, 1, 2, 3, 4, 5, 208cabdff1aSopenharmony_ci 6, 7, 8, 9, 10, 11, 209cabdff1aSopenharmony_ci CHROMA_QP_TABLE_END(10) }, 210cabdff1aSopenharmony_ci { 0, 1, 2, 3, 4, 5, 211cabdff1aSopenharmony_ci 6, 7, 8, 9, 10, 11, 212cabdff1aSopenharmony_ci 12,13,14,15, 16, 17, 213cabdff1aSopenharmony_ci CHROMA_QP_TABLE_END(11) }, 214cabdff1aSopenharmony_ci { 0, 1, 2, 3, 4, 5, 215cabdff1aSopenharmony_ci 6, 7, 8, 9, 10, 11, 216cabdff1aSopenharmony_ci 12,13,14,15, 16, 17, 217cabdff1aSopenharmony_ci 18,19,20,21, 22, 23, 218cabdff1aSopenharmony_ci CHROMA_QP_TABLE_END(12) }, 219cabdff1aSopenharmony_ci { 0, 1, 2, 3, 4, 5, 220cabdff1aSopenharmony_ci 6, 7, 8, 9, 10, 11, 221cabdff1aSopenharmony_ci 12,13,14,15, 16, 17, 222cabdff1aSopenharmony_ci 18,19,20,21, 22, 23, 223cabdff1aSopenharmony_ci 24,25,26,27, 28, 29, 224cabdff1aSopenharmony_ci CHROMA_QP_TABLE_END(13) }, 225cabdff1aSopenharmony_ci { 0, 1, 2, 3, 4, 5, 226cabdff1aSopenharmony_ci 6, 7, 8, 9, 10, 11, 227cabdff1aSopenharmony_ci 12,13,14,15, 16, 17, 228cabdff1aSopenharmony_ci 18,19,20,21, 22, 23, 229cabdff1aSopenharmony_ci 24,25,26,27, 28, 29, 230cabdff1aSopenharmony_ci 30,31,32,33, 34, 35, 231cabdff1aSopenharmony_ci CHROMA_QP_TABLE_END(14) }, 232cabdff1aSopenharmony_ci}; 233