1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... cavlc bitstream decoding 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 * H.264 / AVC / MPEG-4 part10 cavlc bitstream decoding. 25cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at> 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#define CABAC(h) 0 29cabdff1aSopenharmony_ci#define UNCHECKED_BITSTREAM_READER 1 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "h264dec.h" 32cabdff1aSopenharmony_ci#include "h264_mvpred.h" 33cabdff1aSopenharmony_ci#include "h264data.h" 34cabdff1aSopenharmony_ci#include "golomb.h" 35cabdff1aSopenharmony_ci#include "mpegutils.h" 36cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_cistatic const uint8_t golomb_to_inter_cbp_gray[16]={ 40cabdff1aSopenharmony_ci 0, 1, 2, 4, 8, 3, 5,10,12,15, 7,11,13,14, 6, 9, 41cabdff1aSopenharmony_ci}; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_cistatic const uint8_t golomb_to_intra4x4_cbp_gray[16]={ 44cabdff1aSopenharmony_ci15, 0, 7,11,13,14, 3, 5,10,12, 1, 2, 4, 8, 6, 9, 45cabdff1aSopenharmony_ci}; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_coeff_token_len[4*5]={ 48cabdff1aSopenharmony_ci 2, 0, 0, 0, 49cabdff1aSopenharmony_ci 6, 1, 0, 0, 50cabdff1aSopenharmony_ci 6, 6, 3, 0, 51cabdff1aSopenharmony_ci 6, 7, 7, 6, 52cabdff1aSopenharmony_ci 6, 8, 8, 7, 53cabdff1aSopenharmony_ci}; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_coeff_token_bits[4*5]={ 56cabdff1aSopenharmony_ci 1, 0, 0, 0, 57cabdff1aSopenharmony_ci 7, 1, 0, 0, 58cabdff1aSopenharmony_ci 4, 6, 1, 0, 59cabdff1aSopenharmony_ci 3, 3, 2, 5, 60cabdff1aSopenharmony_ci 2, 3, 2, 0, 61cabdff1aSopenharmony_ci}; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_coeff_token_len[4*9]={ 64cabdff1aSopenharmony_ci 1, 0, 0, 0, 65cabdff1aSopenharmony_ci 7, 2, 0, 0, 66cabdff1aSopenharmony_ci 7, 7, 3, 0, 67cabdff1aSopenharmony_ci 9, 7, 7, 5, 68cabdff1aSopenharmony_ci 9, 9, 7, 6, 69cabdff1aSopenharmony_ci 10, 10, 9, 7, 70cabdff1aSopenharmony_ci 11, 11, 10, 7, 71cabdff1aSopenharmony_ci 12, 12, 11, 10, 72cabdff1aSopenharmony_ci 13, 12, 12, 11, 73cabdff1aSopenharmony_ci}; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_coeff_token_bits[4*9]={ 76cabdff1aSopenharmony_ci 1, 0, 0, 0, 77cabdff1aSopenharmony_ci 15, 1, 0, 0, 78cabdff1aSopenharmony_ci 14, 13, 1, 0, 79cabdff1aSopenharmony_ci 7, 12, 11, 1, 80cabdff1aSopenharmony_ci 6, 5, 10, 1, 81cabdff1aSopenharmony_ci 7, 6, 4, 9, 82cabdff1aSopenharmony_ci 7, 6, 5, 8, 83cabdff1aSopenharmony_ci 7, 6, 5, 4, 84cabdff1aSopenharmony_ci 7, 5, 4, 4, 85cabdff1aSopenharmony_ci}; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_cistatic const uint8_t coeff_token_len[4][4*17]={ 88cabdff1aSopenharmony_ci{ 89cabdff1aSopenharmony_ci 1, 0, 0, 0, 90cabdff1aSopenharmony_ci 6, 2, 0, 0, 8, 6, 3, 0, 9, 8, 7, 5, 10, 9, 8, 6, 91cabdff1aSopenharmony_ci 11,10, 9, 7, 13,11,10, 8, 13,13,11, 9, 13,13,13,10, 92cabdff1aSopenharmony_ci 14,14,13,11, 14,14,14,13, 15,15,14,14, 15,15,15,14, 93cabdff1aSopenharmony_ci 16,15,15,15, 16,16,16,15, 16,16,16,16, 16,16,16,16, 94cabdff1aSopenharmony_ci}, 95cabdff1aSopenharmony_ci{ 96cabdff1aSopenharmony_ci 2, 0, 0, 0, 97cabdff1aSopenharmony_ci 6, 2, 0, 0, 6, 5, 3, 0, 7, 6, 6, 4, 8, 6, 6, 4, 98cabdff1aSopenharmony_ci 8, 7, 7, 5, 9, 8, 8, 6, 11, 9, 9, 6, 11,11,11, 7, 99cabdff1aSopenharmony_ci 12,11,11, 9, 12,12,12,11, 12,12,12,11, 13,13,13,12, 100cabdff1aSopenharmony_ci 13,13,13,13, 13,14,13,13, 14,14,14,13, 14,14,14,14, 101cabdff1aSopenharmony_ci}, 102cabdff1aSopenharmony_ci{ 103cabdff1aSopenharmony_ci 4, 0, 0, 0, 104cabdff1aSopenharmony_ci 6, 4, 0, 0, 6, 5, 4, 0, 6, 5, 5, 4, 7, 5, 5, 4, 105cabdff1aSopenharmony_ci 7, 5, 5, 4, 7, 6, 6, 4, 7, 6, 6, 4, 8, 7, 7, 5, 106cabdff1aSopenharmony_ci 8, 8, 7, 6, 9, 8, 8, 7, 9, 9, 8, 8, 9, 9, 9, 8, 107cabdff1aSopenharmony_ci 10, 9, 9, 9, 10,10,10,10, 10,10,10,10, 10,10,10,10, 108cabdff1aSopenharmony_ci}, 109cabdff1aSopenharmony_ci{ 110cabdff1aSopenharmony_ci 6, 0, 0, 0, 111cabdff1aSopenharmony_ci 6, 6, 0, 0, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 6, 112cabdff1aSopenharmony_ci 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 113cabdff1aSopenharmony_ci 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 114cabdff1aSopenharmony_ci 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 115cabdff1aSopenharmony_ci} 116cabdff1aSopenharmony_ci}; 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_cistatic const uint8_t coeff_token_bits[4][4*17]={ 119cabdff1aSopenharmony_ci{ 120cabdff1aSopenharmony_ci 1, 0, 0, 0, 121cabdff1aSopenharmony_ci 5, 1, 0, 0, 7, 4, 1, 0, 7, 6, 5, 3, 7, 6, 5, 3, 122cabdff1aSopenharmony_ci 7, 6, 5, 4, 15, 6, 5, 4, 11,14, 5, 4, 8,10,13, 4, 123cabdff1aSopenharmony_ci 15,14, 9, 4, 11,10,13,12, 15,14, 9,12, 11,10,13, 8, 124cabdff1aSopenharmony_ci 15, 1, 9,12, 11,14,13, 8, 7,10, 9,12, 4, 6, 5, 8, 125cabdff1aSopenharmony_ci}, 126cabdff1aSopenharmony_ci{ 127cabdff1aSopenharmony_ci 3, 0, 0, 0, 128cabdff1aSopenharmony_ci 11, 2, 0, 0, 7, 7, 3, 0, 7,10, 9, 5, 7, 6, 5, 4, 129cabdff1aSopenharmony_ci 4, 6, 5, 6, 7, 6, 5, 8, 15, 6, 5, 4, 11,14,13, 4, 130cabdff1aSopenharmony_ci 15,10, 9, 4, 11,14,13,12, 8,10, 9, 8, 15,14,13,12, 131cabdff1aSopenharmony_ci 11,10, 9,12, 7,11, 6, 8, 9, 8,10, 1, 7, 6, 5, 4, 132cabdff1aSopenharmony_ci}, 133cabdff1aSopenharmony_ci{ 134cabdff1aSopenharmony_ci 15, 0, 0, 0, 135cabdff1aSopenharmony_ci 15,14, 0, 0, 11,15,13, 0, 8,12,14,12, 15,10,11,11, 136cabdff1aSopenharmony_ci 11, 8, 9,10, 9,14,13, 9, 8,10, 9, 8, 15,14,13,13, 137cabdff1aSopenharmony_ci 11,14,10,12, 15,10,13,12, 11,14, 9,12, 8,10,13, 8, 138cabdff1aSopenharmony_ci 13, 7, 9,12, 9,12,11,10, 5, 8, 7, 6, 1, 4, 3, 2, 139cabdff1aSopenharmony_ci}, 140cabdff1aSopenharmony_ci{ 141cabdff1aSopenharmony_ci 3, 0, 0, 0, 142cabdff1aSopenharmony_ci 0, 1, 0, 0, 4, 5, 6, 0, 8, 9,10,11, 12,13,14,15, 143cabdff1aSopenharmony_ci 16,17,18,19, 20,21,22,23, 24,25,26,27, 28,29,30,31, 144cabdff1aSopenharmony_ci 32,33,34,35, 36,37,38,39, 40,41,42,43, 44,45,46,47, 145cabdff1aSopenharmony_ci 48,49,50,51, 52,53,54,55, 56,57,58,59, 60,61,62,63, 146cabdff1aSopenharmony_ci} 147cabdff1aSopenharmony_ci}; 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_cistatic const uint8_t total_zeros_len[16][16]= { 150cabdff1aSopenharmony_ci {1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9}, 151cabdff1aSopenharmony_ci {3,3,3,3,3,4,4,4,4,5,5,6,6,6,6}, 152cabdff1aSopenharmony_ci {4,3,3,3,4,4,3,3,4,5,5,6,5,6}, 153cabdff1aSopenharmony_ci {5,3,4,4,3,3,3,4,3,4,5,5,5}, 154cabdff1aSopenharmony_ci {4,4,4,3,3,3,3,3,4,5,4,5}, 155cabdff1aSopenharmony_ci {6,5,3,3,3,3,3,3,4,3,6}, 156cabdff1aSopenharmony_ci {6,5,3,3,3,2,3,4,3,6}, 157cabdff1aSopenharmony_ci {6,4,5,3,2,2,3,3,6}, 158cabdff1aSopenharmony_ci {6,6,4,2,2,3,2,5}, 159cabdff1aSopenharmony_ci {5,5,3,2,2,2,4}, 160cabdff1aSopenharmony_ci {4,4,3,3,1,3}, 161cabdff1aSopenharmony_ci {4,4,2,1,3}, 162cabdff1aSopenharmony_ci {3,3,1,2}, 163cabdff1aSopenharmony_ci {2,2,1}, 164cabdff1aSopenharmony_ci {1,1}, 165cabdff1aSopenharmony_ci}; 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_cistatic const uint8_t total_zeros_bits[16][16]= { 168cabdff1aSopenharmony_ci {1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1}, 169cabdff1aSopenharmony_ci {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0}, 170cabdff1aSopenharmony_ci {5,7,6,5,4,3,4,3,2,3,2,1,1,0}, 171cabdff1aSopenharmony_ci {3,7,5,4,6,5,4,3,3,2,2,1,0}, 172cabdff1aSopenharmony_ci {5,4,3,7,6,5,4,3,2,1,1,0}, 173cabdff1aSopenharmony_ci {1,1,7,6,5,4,3,2,1,1,0}, 174cabdff1aSopenharmony_ci {1,1,5,4,3,3,2,1,1,0}, 175cabdff1aSopenharmony_ci {1,1,1,3,3,2,2,1,0}, 176cabdff1aSopenharmony_ci {1,0,1,3,2,1,1,1}, 177cabdff1aSopenharmony_ci {1,0,1,3,2,1,1}, 178cabdff1aSopenharmony_ci {0,1,1,2,1,3}, 179cabdff1aSopenharmony_ci {0,1,1,1,1}, 180cabdff1aSopenharmony_ci {0,1,1,1}, 181cabdff1aSopenharmony_ci {0,1,1}, 182cabdff1aSopenharmony_ci {0,1}, 183cabdff1aSopenharmony_ci}; 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_total_zeros_len[3][4]= { 186cabdff1aSopenharmony_ci { 1, 2, 3, 3,}, 187cabdff1aSopenharmony_ci { 1, 2, 2, 0,}, 188cabdff1aSopenharmony_ci { 1, 1, 0, 0,}, 189cabdff1aSopenharmony_ci}; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_total_zeros_bits[3][4]= { 192cabdff1aSopenharmony_ci { 1, 1, 1, 0,}, 193cabdff1aSopenharmony_ci { 1, 1, 0, 0,}, 194cabdff1aSopenharmony_ci { 1, 0, 0, 0,}, 195cabdff1aSopenharmony_ci}; 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_total_zeros_len[7][8]= { 198cabdff1aSopenharmony_ci { 1, 3, 3, 4, 4, 4, 5, 5 }, 199cabdff1aSopenharmony_ci { 3, 2, 3, 3, 3, 3, 3 }, 200cabdff1aSopenharmony_ci { 3, 3, 2, 2, 3, 3 }, 201cabdff1aSopenharmony_ci { 3, 2, 2, 2, 3 }, 202cabdff1aSopenharmony_ci { 2, 2, 2, 2 }, 203cabdff1aSopenharmony_ci { 2, 2, 1 }, 204cabdff1aSopenharmony_ci { 1, 1 }, 205cabdff1aSopenharmony_ci}; 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_total_zeros_bits[7][8]= { 208cabdff1aSopenharmony_ci { 1, 2, 3, 2, 3, 1, 1, 0 }, 209cabdff1aSopenharmony_ci { 0, 1, 1, 4, 5, 6, 7 }, 210cabdff1aSopenharmony_ci { 0, 1, 1, 2, 6, 7 }, 211cabdff1aSopenharmony_ci { 6, 0, 1, 2, 7 }, 212cabdff1aSopenharmony_ci { 0, 1, 2, 3 }, 213cabdff1aSopenharmony_ci { 0, 1, 1 }, 214cabdff1aSopenharmony_ci { 0, 1 }, 215cabdff1aSopenharmony_ci}; 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_cistatic const uint8_t run_len[7][16]={ 218cabdff1aSopenharmony_ci {1,1}, 219cabdff1aSopenharmony_ci {1,2,2}, 220cabdff1aSopenharmony_ci {2,2,2,2}, 221cabdff1aSopenharmony_ci {2,2,2,3,3}, 222cabdff1aSopenharmony_ci {2,2,3,3,3,3}, 223cabdff1aSopenharmony_ci {2,3,3,3,3,3,3}, 224cabdff1aSopenharmony_ci {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11}, 225cabdff1aSopenharmony_ci}; 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_cistatic const uint8_t run_bits[7][16]={ 228cabdff1aSopenharmony_ci {1,0}, 229cabdff1aSopenharmony_ci {1,1,0}, 230cabdff1aSopenharmony_ci {3,2,1,0}, 231cabdff1aSopenharmony_ci {3,2,1,1,0}, 232cabdff1aSopenharmony_ci {3,2,3,2,1,0}, 233cabdff1aSopenharmony_ci {3,0,1,3,2,5,4}, 234cabdff1aSopenharmony_ci {7,6,5,4,3,2,1,1,1,1,1,1,1,1,1}, 235cabdff1aSopenharmony_ci}; 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_cistatic VLC coeff_token_vlc[4]; 238cabdff1aSopenharmony_cistatic VLCElem coeff_token_vlc_tables[520+332+280+256]; 239cabdff1aSopenharmony_cistatic const int coeff_token_vlc_tables_size[4]={520,332,280,256}; 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_cistatic VLC chroma_dc_coeff_token_vlc; 242cabdff1aSopenharmony_cistatic VLCElem chroma_dc_coeff_token_vlc_table[256]; 243cabdff1aSopenharmony_cistatic const int chroma_dc_coeff_token_vlc_table_size = 256; 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_cistatic VLC chroma422_dc_coeff_token_vlc; 246cabdff1aSopenharmony_cistatic VLCElem chroma422_dc_coeff_token_vlc_table[8192]; 247cabdff1aSopenharmony_cistatic const int chroma422_dc_coeff_token_vlc_table_size = 8192; 248cabdff1aSopenharmony_ci 249cabdff1aSopenharmony_cistatic VLC total_zeros_vlc[15+1]; 250cabdff1aSopenharmony_cistatic VLCElem total_zeros_vlc_tables[15][512]; 251cabdff1aSopenharmony_cistatic const int total_zeros_vlc_tables_size = 512; 252cabdff1aSopenharmony_ci 253cabdff1aSopenharmony_cistatic VLC chroma_dc_total_zeros_vlc[3+1]; 254cabdff1aSopenharmony_cistatic VLCElem chroma_dc_total_zeros_vlc_tables[3][8]; 255cabdff1aSopenharmony_cistatic const int chroma_dc_total_zeros_vlc_tables_size = 8; 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_cistatic VLC chroma422_dc_total_zeros_vlc[7+1]; 258cabdff1aSopenharmony_cistatic VLCElem chroma422_dc_total_zeros_vlc_tables[7][32]; 259cabdff1aSopenharmony_cistatic const int chroma422_dc_total_zeros_vlc_tables_size = 32; 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_cistatic VLC run_vlc[6+1]; 262cabdff1aSopenharmony_cistatic VLCElem run_vlc_tables[6][8]; 263cabdff1aSopenharmony_cistatic const int run_vlc_tables_size = 8; 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_cistatic VLC run7_vlc; 266cabdff1aSopenharmony_cistatic VLCElem run7_vlc_table[96]; 267cabdff1aSopenharmony_cistatic const int run7_vlc_table_size = 96; 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci#define LEVEL_TAB_BITS 8 270cabdff1aSopenharmony_cistatic int8_t cavlc_level_tab[7][1<<LEVEL_TAB_BITS][2]; 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci#define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8 273cabdff1aSopenharmony_ci#define CHROMA422_DC_COEFF_TOKEN_VLC_BITS 13 274cabdff1aSopenharmony_ci#define COEFF_TOKEN_VLC_BITS 8 275cabdff1aSopenharmony_ci#define TOTAL_ZEROS_VLC_BITS 9 276cabdff1aSopenharmony_ci#define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3 277cabdff1aSopenharmony_ci#define CHROMA422_DC_TOTAL_ZEROS_VLC_BITS 5 278cabdff1aSopenharmony_ci#define RUN_VLC_BITS 3 279cabdff1aSopenharmony_ci#define RUN7_VLC_BITS 6 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci/** 282cabdff1aSopenharmony_ci * Get the predicted number of non-zero coefficients. 283cabdff1aSopenharmony_ci * @param n block index 284cabdff1aSopenharmony_ci */ 285cabdff1aSopenharmony_cistatic inline int pred_non_zero_count(const H264Context *h, H264SliceContext *sl, int n) 286cabdff1aSopenharmony_ci{ 287cabdff1aSopenharmony_ci const int index8= scan8[n]; 288cabdff1aSopenharmony_ci const int left = sl->non_zero_count_cache[index8 - 1]; 289cabdff1aSopenharmony_ci const int top = sl->non_zero_count_cache[index8 - 8]; 290cabdff1aSopenharmony_ci int i= left + top; 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci if(i<64) i= (i+1)>>1; 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci ff_tlog(h->avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31); 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_ci return i&31; 297cabdff1aSopenharmony_ci} 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_cistatic av_cold void init_cavlc_level_tab(void){ 300cabdff1aSopenharmony_ci int suffix_length; 301cabdff1aSopenharmony_ci unsigned int i; 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci for(suffix_length=0; suffix_length<7; suffix_length++){ 304cabdff1aSopenharmony_ci for(i=0; i<(1<<LEVEL_TAB_BITS); i++){ 305cabdff1aSopenharmony_ci int prefix= LEVEL_TAB_BITS - av_log2(2*i); 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){ 308cabdff1aSopenharmony_ci int level_code = (prefix << suffix_length) + 309cabdff1aSopenharmony_ci (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length); 310cabdff1aSopenharmony_ci int mask = -(level_code&1); 311cabdff1aSopenharmony_ci level_code = (((2 + level_code) >> 1) ^ mask) - mask; 312cabdff1aSopenharmony_ci cavlc_level_tab[suffix_length][i][0]= level_code; 313cabdff1aSopenharmony_ci cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length; 314cabdff1aSopenharmony_ci }else if(prefix + 1 <= LEVEL_TAB_BITS){ 315cabdff1aSopenharmony_ci cavlc_level_tab[suffix_length][i][0]= prefix+100; 316cabdff1aSopenharmony_ci cavlc_level_tab[suffix_length][i][1]= prefix + 1; 317cabdff1aSopenharmony_ci }else{ 318cabdff1aSopenharmony_ci cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100; 319cabdff1aSopenharmony_ci cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS; 320cabdff1aSopenharmony_ci } 321cabdff1aSopenharmony_ci } 322cabdff1aSopenharmony_ci } 323cabdff1aSopenharmony_ci} 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ciav_cold void ff_h264_decode_init_vlc(void) 326cabdff1aSopenharmony_ci{ 327cabdff1aSopenharmony_ci int offset; 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci chroma_dc_coeff_token_vlc.table = chroma_dc_coeff_token_vlc_table; 330cabdff1aSopenharmony_ci chroma_dc_coeff_token_vlc.table_allocated = chroma_dc_coeff_token_vlc_table_size; 331cabdff1aSopenharmony_ci init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5, 332cabdff1aSopenharmony_ci &chroma_dc_coeff_token_len [0], 1, 1, 333cabdff1aSopenharmony_ci &chroma_dc_coeff_token_bits[0], 1, 1, 334cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 335cabdff1aSopenharmony_ci 336cabdff1aSopenharmony_ci chroma422_dc_coeff_token_vlc.table = chroma422_dc_coeff_token_vlc_table; 337cabdff1aSopenharmony_ci chroma422_dc_coeff_token_vlc.table_allocated = chroma422_dc_coeff_token_vlc_table_size; 338cabdff1aSopenharmony_ci init_vlc(&chroma422_dc_coeff_token_vlc, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 4*9, 339cabdff1aSopenharmony_ci &chroma422_dc_coeff_token_len [0], 1, 1, 340cabdff1aSopenharmony_ci &chroma422_dc_coeff_token_bits[0], 1, 1, 341cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci offset = 0; 344cabdff1aSopenharmony_ci for (int i = 0; i < 4; i++) { 345cabdff1aSopenharmony_ci coeff_token_vlc[i].table = coeff_token_vlc_tables + offset; 346cabdff1aSopenharmony_ci coeff_token_vlc[i].table_allocated = coeff_token_vlc_tables_size[i]; 347cabdff1aSopenharmony_ci init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17, 348cabdff1aSopenharmony_ci &coeff_token_len [i][0], 1, 1, 349cabdff1aSopenharmony_ci &coeff_token_bits[i][0], 1, 1, 350cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 351cabdff1aSopenharmony_ci offset += coeff_token_vlc_tables_size[i]; 352cabdff1aSopenharmony_ci } 353cabdff1aSopenharmony_ci /* 354cabdff1aSopenharmony_ci * This is a one time safety check to make sure that 355cabdff1aSopenharmony_ci * the packed static coeff_token_vlc table sizes 356cabdff1aSopenharmony_ci * were initialized correctly. 357cabdff1aSopenharmony_ci */ 358cabdff1aSopenharmony_ci av_assert0(offset == FF_ARRAY_ELEMS(coeff_token_vlc_tables)); 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci for (int i = 0; i < 3; i++) { 361cabdff1aSopenharmony_ci chroma_dc_total_zeros_vlc[i + 1].table = chroma_dc_total_zeros_vlc_tables[i]; 362cabdff1aSopenharmony_ci chroma_dc_total_zeros_vlc[i + 1].table_allocated = chroma_dc_total_zeros_vlc_tables_size; 363cabdff1aSopenharmony_ci init_vlc(&chroma_dc_total_zeros_vlc[i + 1], 364cabdff1aSopenharmony_ci CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4, 365cabdff1aSopenharmony_ci &chroma_dc_total_zeros_len [i][0], 1, 1, 366cabdff1aSopenharmony_ci &chroma_dc_total_zeros_bits[i][0], 1, 1, 367cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 368cabdff1aSopenharmony_ci } 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_ci for (int i = 0; i < 7; i++) { 371cabdff1aSopenharmony_ci chroma422_dc_total_zeros_vlc[i + 1].table = chroma422_dc_total_zeros_vlc_tables[i]; 372cabdff1aSopenharmony_ci chroma422_dc_total_zeros_vlc[i + 1].table_allocated = chroma422_dc_total_zeros_vlc_tables_size; 373cabdff1aSopenharmony_ci init_vlc(&chroma422_dc_total_zeros_vlc[i + 1], 374cabdff1aSopenharmony_ci CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 8, 375cabdff1aSopenharmony_ci &chroma422_dc_total_zeros_len [i][0], 1, 1, 376cabdff1aSopenharmony_ci &chroma422_dc_total_zeros_bits[i][0], 1, 1, 377cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 378cabdff1aSopenharmony_ci } 379cabdff1aSopenharmony_ci 380cabdff1aSopenharmony_ci for (int i = 0; i < 15; i++) { 381cabdff1aSopenharmony_ci total_zeros_vlc[i + 1].table = total_zeros_vlc_tables[i]; 382cabdff1aSopenharmony_ci total_zeros_vlc[i + 1].table_allocated = total_zeros_vlc_tables_size; 383cabdff1aSopenharmony_ci init_vlc(&total_zeros_vlc[i + 1], 384cabdff1aSopenharmony_ci TOTAL_ZEROS_VLC_BITS, 16, 385cabdff1aSopenharmony_ci &total_zeros_len [i][0], 1, 1, 386cabdff1aSopenharmony_ci &total_zeros_bits[i][0], 1, 1, 387cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 388cabdff1aSopenharmony_ci } 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_ci for (int i = 0; i < 6; i++) { 391cabdff1aSopenharmony_ci run_vlc[i + 1].table = run_vlc_tables[i]; 392cabdff1aSopenharmony_ci run_vlc[i + 1].table_allocated = run_vlc_tables_size; 393cabdff1aSopenharmony_ci init_vlc(&run_vlc[i + 1], 394cabdff1aSopenharmony_ci RUN_VLC_BITS, 7, 395cabdff1aSopenharmony_ci &run_len [i][0], 1, 1, 396cabdff1aSopenharmony_ci &run_bits[i][0], 1, 1, 397cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 398cabdff1aSopenharmony_ci } 399cabdff1aSopenharmony_ci run7_vlc.table = run7_vlc_table; 400cabdff1aSopenharmony_ci run7_vlc.table_allocated = run7_vlc_table_size; 401cabdff1aSopenharmony_ci init_vlc(&run7_vlc, RUN7_VLC_BITS, 16, 402cabdff1aSopenharmony_ci &run_len [6][0], 1, 1, 403cabdff1aSopenharmony_ci &run_bits[6][0], 1, 1, 404cabdff1aSopenharmony_ci INIT_VLC_USE_NEW_STATIC); 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_ci init_cavlc_level_tab(); 407cabdff1aSopenharmony_ci} 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_cistatic inline int get_level_prefix(GetBitContext *gb){ 410cabdff1aSopenharmony_ci unsigned int buf; 411cabdff1aSopenharmony_ci int log; 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_ci OPEN_READER(re, gb); 414cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 415cabdff1aSopenharmony_ci buf=GET_CACHE(re, gb); 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci log= 32 - av_log2(buf); 418cabdff1aSopenharmony_ci 419cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, log); 420cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci return log-1; 423cabdff1aSopenharmony_ci} 424cabdff1aSopenharmony_ci 425cabdff1aSopenharmony_ci/** 426cabdff1aSopenharmony_ci * Decode a residual block. 427cabdff1aSopenharmony_ci * @param n block index 428cabdff1aSopenharmony_ci * @param scantable scantable 429cabdff1aSopenharmony_ci * @param max_coeff number of coefficients in the block 430cabdff1aSopenharmony_ci * @return <0 if an error occurred 431cabdff1aSopenharmony_ci */ 432cabdff1aSopenharmony_cistatic int decode_residual(const H264Context *h, H264SliceContext *sl, 433cabdff1aSopenharmony_ci GetBitContext *gb, int16_t *block, int n, 434cabdff1aSopenharmony_ci const uint8_t *scantable, const uint32_t *qmul, 435cabdff1aSopenharmony_ci int max_coeff) 436cabdff1aSopenharmony_ci{ 437cabdff1aSopenharmony_ci static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}; 438cabdff1aSopenharmony_ci int level[16]; 439cabdff1aSopenharmony_ci int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before; 440cabdff1aSopenharmony_ci 441cabdff1aSopenharmony_ci //FIXME put trailing_onex into the context 442cabdff1aSopenharmony_ci 443cabdff1aSopenharmony_ci if(max_coeff <= 8){ 444cabdff1aSopenharmony_ci if (max_coeff == 4) 445cabdff1aSopenharmony_ci coeff_token = get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1); 446cabdff1aSopenharmony_ci else 447cabdff1aSopenharmony_ci coeff_token = get_vlc2(gb, chroma422_dc_coeff_token_vlc.table, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 1); 448cabdff1aSopenharmony_ci total_coeff= coeff_token>>2; 449cabdff1aSopenharmony_ci }else{ 450cabdff1aSopenharmony_ci if(n >= LUMA_DC_BLOCK_INDEX){ 451cabdff1aSopenharmony_ci total_coeff= pred_non_zero_count(h, sl, (n - LUMA_DC_BLOCK_INDEX)*16); 452cabdff1aSopenharmony_ci coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2); 453cabdff1aSopenharmony_ci total_coeff= coeff_token>>2; 454cabdff1aSopenharmony_ci }else{ 455cabdff1aSopenharmony_ci total_coeff= pred_non_zero_count(h, sl, n); 456cabdff1aSopenharmony_ci coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2); 457cabdff1aSopenharmony_ci total_coeff= coeff_token>>2; 458cabdff1aSopenharmony_ci } 459cabdff1aSopenharmony_ci } 460cabdff1aSopenharmony_ci sl->non_zero_count_cache[scan8[n]] = total_coeff; 461cabdff1aSopenharmony_ci 462cabdff1aSopenharmony_ci //FIXME set last_non_zero? 463cabdff1aSopenharmony_ci 464cabdff1aSopenharmony_ci if(total_coeff==0) 465cabdff1aSopenharmony_ci return 0; 466cabdff1aSopenharmony_ci if(total_coeff > (unsigned)max_coeff) { 467cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", sl->mb_x, sl->mb_y, total_coeff); 468cabdff1aSopenharmony_ci return -1; 469cabdff1aSopenharmony_ci } 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci trailing_ones= coeff_token&3; 472cabdff1aSopenharmony_ci ff_tlog(h->avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff); 473cabdff1aSopenharmony_ci av_assert2(total_coeff<=16); 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_ci i = show_bits(gb, 3); 476cabdff1aSopenharmony_ci skip_bits(gb, trailing_ones); 477cabdff1aSopenharmony_ci level[0] = 1-((i&4)>>1); 478cabdff1aSopenharmony_ci level[1] = 1-((i&2) ); 479cabdff1aSopenharmony_ci level[2] = 1-((i&1)<<1); 480cabdff1aSopenharmony_ci 481cabdff1aSopenharmony_ci if(trailing_ones<total_coeff) { 482cabdff1aSopenharmony_ci int mask, prefix; 483cabdff1aSopenharmony_ci int suffix_length = total_coeff > 10 & trailing_ones < 3; 484cabdff1aSopenharmony_ci int bitsi= show_bits(gb, LEVEL_TAB_BITS); 485cabdff1aSopenharmony_ci int level_code= cavlc_level_tab[suffix_length][bitsi][0]; 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_ci skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]); 488cabdff1aSopenharmony_ci if(level_code >= 100){ 489cabdff1aSopenharmony_ci prefix= level_code - 100; 490cabdff1aSopenharmony_ci if(prefix == LEVEL_TAB_BITS) 491cabdff1aSopenharmony_ci prefix += get_level_prefix(gb); 492cabdff1aSopenharmony_ci 493cabdff1aSopenharmony_ci //first coefficient has suffix_length equal to 0 or 1 494cabdff1aSopenharmony_ci if(prefix<14){ //FIXME try to build a large unified VLC table for all this 495cabdff1aSopenharmony_ci if(suffix_length) 496cabdff1aSopenharmony_ci level_code= (prefix<<1) + get_bits1(gb); //part 497cabdff1aSopenharmony_ci else 498cabdff1aSopenharmony_ci level_code= prefix; //part 499cabdff1aSopenharmony_ci }else if(prefix==14){ 500cabdff1aSopenharmony_ci if(suffix_length) 501cabdff1aSopenharmony_ci level_code= (prefix<<1) + get_bits1(gb); //part 502cabdff1aSopenharmony_ci else 503cabdff1aSopenharmony_ci level_code= prefix + get_bits(gb, 4); //part 504cabdff1aSopenharmony_ci }else{ 505cabdff1aSopenharmony_ci level_code= 30; 506cabdff1aSopenharmony_ci if(prefix>=16){ 507cabdff1aSopenharmony_ci if(prefix > 25+3){ 508cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n"); 509cabdff1aSopenharmony_ci return -1; 510cabdff1aSopenharmony_ci } 511cabdff1aSopenharmony_ci level_code += (1<<(prefix-3))-4096; 512cabdff1aSopenharmony_ci } 513cabdff1aSopenharmony_ci level_code += get_bits(gb, prefix-3); //part 514cabdff1aSopenharmony_ci } 515cabdff1aSopenharmony_ci 516cabdff1aSopenharmony_ci if(trailing_ones < 3) level_code += 2; 517cabdff1aSopenharmony_ci 518cabdff1aSopenharmony_ci suffix_length = 2; 519cabdff1aSopenharmony_ci mask= -(level_code&1); 520cabdff1aSopenharmony_ci level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask; 521cabdff1aSopenharmony_ci }else{ 522cabdff1aSopenharmony_ci level_code += ((level_code>>31)|1) & -(trailing_ones < 3); 523cabdff1aSopenharmony_ci 524cabdff1aSopenharmony_ci suffix_length = 1 + (level_code + 3U > 6U); 525cabdff1aSopenharmony_ci level[trailing_ones]= level_code; 526cabdff1aSopenharmony_ci } 527cabdff1aSopenharmony_ci 528cabdff1aSopenharmony_ci //remaining coefficients have suffix_length > 0 529cabdff1aSopenharmony_ci for(i=trailing_ones+1;i<total_coeff;i++) { 530cabdff1aSopenharmony_ci static const unsigned int suffix_limit[7] = {0,3,6,12,24,48,INT_MAX }; 531cabdff1aSopenharmony_ci int bitsi= show_bits(gb, LEVEL_TAB_BITS); 532cabdff1aSopenharmony_ci level_code= cavlc_level_tab[suffix_length][bitsi][0]; 533cabdff1aSopenharmony_ci 534cabdff1aSopenharmony_ci skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]); 535cabdff1aSopenharmony_ci if(level_code >= 100){ 536cabdff1aSopenharmony_ci prefix= level_code - 100; 537cabdff1aSopenharmony_ci if(prefix == LEVEL_TAB_BITS){ 538cabdff1aSopenharmony_ci prefix += get_level_prefix(gb); 539cabdff1aSopenharmony_ci } 540cabdff1aSopenharmony_ci if(prefix<15){ 541cabdff1aSopenharmony_ci level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length); 542cabdff1aSopenharmony_ci }else{ 543cabdff1aSopenharmony_ci level_code = 15<<suffix_length; 544cabdff1aSopenharmony_ci if (prefix>=16) { 545cabdff1aSopenharmony_ci if(prefix > 25+3){ 546cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n"); 547cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 548cabdff1aSopenharmony_ci } 549cabdff1aSopenharmony_ci level_code += (1<<(prefix-3))-4096; 550cabdff1aSopenharmony_ci } 551cabdff1aSopenharmony_ci level_code += get_bits(gb, prefix-3); 552cabdff1aSopenharmony_ci } 553cabdff1aSopenharmony_ci mask= -(level_code&1); 554cabdff1aSopenharmony_ci level_code= (((2+level_code)>>1) ^ mask) - mask; 555cabdff1aSopenharmony_ci } 556cabdff1aSopenharmony_ci level[i]= level_code; 557cabdff1aSopenharmony_ci suffix_length+= suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length]; 558cabdff1aSopenharmony_ci } 559cabdff1aSopenharmony_ci } 560cabdff1aSopenharmony_ci 561cabdff1aSopenharmony_ci if(total_coeff == max_coeff) 562cabdff1aSopenharmony_ci zeros_left=0; 563cabdff1aSopenharmony_ci else{ 564cabdff1aSopenharmony_ci if (max_coeff <= 8) { 565cabdff1aSopenharmony_ci if (max_coeff == 4) 566cabdff1aSopenharmony_ci zeros_left = get_vlc2(gb, chroma_dc_total_zeros_vlc[total_coeff].table, 567cabdff1aSopenharmony_ci CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1); 568cabdff1aSopenharmony_ci else 569cabdff1aSopenharmony_ci zeros_left = get_vlc2(gb, chroma422_dc_total_zeros_vlc[total_coeff].table, 570cabdff1aSopenharmony_ci CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 1); 571cabdff1aSopenharmony_ci } else { 572cabdff1aSopenharmony_ci zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff ].table, TOTAL_ZEROS_VLC_BITS, 1); 573cabdff1aSopenharmony_ci } 574cabdff1aSopenharmony_ci } 575cabdff1aSopenharmony_ci 576cabdff1aSopenharmony_ci#define STORE_BLOCK(type) \ 577cabdff1aSopenharmony_ci scantable += zeros_left + total_coeff - 1; \ 578cabdff1aSopenharmony_ci if(n >= LUMA_DC_BLOCK_INDEX){ \ 579cabdff1aSopenharmony_ci ((type*)block)[*scantable] = level[0]; \ 580cabdff1aSopenharmony_ci for(i=1;i<total_coeff && zeros_left > 0;i++) { \ 581cabdff1aSopenharmony_ci if(zeros_left < 7) \ 582cabdff1aSopenharmony_ci run_before= get_vlc2(gb, run_vlc[zeros_left].table, RUN_VLC_BITS, 1); \ 583cabdff1aSopenharmony_ci else \ 584cabdff1aSopenharmony_ci run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \ 585cabdff1aSopenharmony_ci zeros_left -= run_before; \ 586cabdff1aSopenharmony_ci scantable -= 1 + run_before; \ 587cabdff1aSopenharmony_ci ((type*)block)[*scantable]= level[i]; \ 588cabdff1aSopenharmony_ci } \ 589cabdff1aSopenharmony_ci for(;i<total_coeff;i++) { \ 590cabdff1aSopenharmony_ci scantable--; \ 591cabdff1aSopenharmony_ci ((type*)block)[*scantable]= level[i]; \ 592cabdff1aSopenharmony_ci } \ 593cabdff1aSopenharmony_ci }else{ \ 594cabdff1aSopenharmony_ci ((type*)block)[*scantable] = ((int)(level[0] * qmul[*scantable] + 32))>>6; \ 595cabdff1aSopenharmony_ci for(i=1;i<total_coeff && zeros_left > 0;i++) { \ 596cabdff1aSopenharmony_ci if(zeros_left < 7) \ 597cabdff1aSopenharmony_ci run_before= get_vlc2(gb, run_vlc[zeros_left].table, RUN_VLC_BITS, 1); \ 598cabdff1aSopenharmony_ci else \ 599cabdff1aSopenharmony_ci run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \ 600cabdff1aSopenharmony_ci zeros_left -= run_before; \ 601cabdff1aSopenharmony_ci scantable -= 1 + run_before; \ 602cabdff1aSopenharmony_ci ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \ 603cabdff1aSopenharmony_ci } \ 604cabdff1aSopenharmony_ci for(;i<total_coeff;i++) { \ 605cabdff1aSopenharmony_ci scantable--; \ 606cabdff1aSopenharmony_ci ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \ 607cabdff1aSopenharmony_ci } \ 608cabdff1aSopenharmony_ci } 609cabdff1aSopenharmony_ci 610cabdff1aSopenharmony_ci if (h->pixel_shift) { 611cabdff1aSopenharmony_ci STORE_BLOCK(int32_t) 612cabdff1aSopenharmony_ci } else { 613cabdff1aSopenharmony_ci STORE_BLOCK(int16_t) 614cabdff1aSopenharmony_ci } 615cabdff1aSopenharmony_ci 616cabdff1aSopenharmony_ci if(zeros_left<0){ 617cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", sl->mb_x, sl->mb_y); 618cabdff1aSopenharmony_ci return -1; 619cabdff1aSopenharmony_ci } 620cabdff1aSopenharmony_ci 621cabdff1aSopenharmony_ci return 0; 622cabdff1aSopenharmony_ci} 623cabdff1aSopenharmony_ci 624cabdff1aSopenharmony_cistatic av_always_inline 625cabdff1aSopenharmony_ciint decode_luma_residual(const H264Context *h, H264SliceContext *sl, 626cabdff1aSopenharmony_ci GetBitContext *gb, const uint8_t *scan, 627cabdff1aSopenharmony_ci const uint8_t *scan8x8, int pixel_shift, 628cabdff1aSopenharmony_ci int mb_type, int cbp, int p) 629cabdff1aSopenharmony_ci{ 630cabdff1aSopenharmony_ci int i4x4, i8x8; 631cabdff1aSopenharmony_ci int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1]; 632cabdff1aSopenharmony_ci if(IS_INTRA16x16(mb_type)){ 633cabdff1aSopenharmony_ci AV_ZERO128(sl->mb_luma_dc[p]+0); 634cabdff1aSopenharmony_ci AV_ZERO128(sl->mb_luma_dc[p]+8); 635cabdff1aSopenharmony_ci AV_ZERO128(sl->mb_luma_dc[p]+16); 636cabdff1aSopenharmony_ci AV_ZERO128(sl->mb_luma_dc[p]+24); 637cabdff1aSopenharmony_ci if (decode_residual(h, sl, gb, sl->mb_luma_dc[p], LUMA_DC_BLOCK_INDEX + p, scan, NULL, 16) < 0) { 638cabdff1aSopenharmony_ci return -1; //FIXME continue if partitioned and other return -1 too 639cabdff1aSopenharmony_ci } 640cabdff1aSopenharmony_ci 641cabdff1aSopenharmony_ci av_assert2((cbp&15) == 0 || (cbp&15) == 15); 642cabdff1aSopenharmony_ci 643cabdff1aSopenharmony_ci if(cbp&15){ 644cabdff1aSopenharmony_ci for(i8x8=0; i8x8<4; i8x8++){ 645cabdff1aSopenharmony_ci for(i4x4=0; i4x4<4; i4x4++){ 646cabdff1aSopenharmony_ci const int index= i4x4 + 4*i8x8 + p*16; 647cabdff1aSopenharmony_ci if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift), 648cabdff1aSopenharmony_ci index, scan + 1, h->ps.pps->dequant4_coeff[p][qscale], 15) < 0 ){ 649cabdff1aSopenharmony_ci return -1; 650cabdff1aSopenharmony_ci } 651cabdff1aSopenharmony_ci } 652cabdff1aSopenharmony_ci } 653cabdff1aSopenharmony_ci return 0xf; 654cabdff1aSopenharmony_ci }else{ 655cabdff1aSopenharmony_ci fill_rectangle(&sl->non_zero_count_cache[scan8[p*16]], 4, 4, 8, 0, 1); 656cabdff1aSopenharmony_ci return 0; 657cabdff1aSopenharmony_ci } 658cabdff1aSopenharmony_ci }else{ 659cabdff1aSopenharmony_ci int cqm = (IS_INTRA( mb_type ) ? 0:3)+p; 660cabdff1aSopenharmony_ci /* For CAVLC 4:4:4, we need to keep track of the luma 8x8 CBP for deblocking nnz purposes. */ 661cabdff1aSopenharmony_ci int new_cbp = 0; 662cabdff1aSopenharmony_ci for(i8x8=0; i8x8<4; i8x8++){ 663cabdff1aSopenharmony_ci if(cbp & (1<<i8x8)){ 664cabdff1aSopenharmony_ci if(IS_8x8DCT(mb_type)){ 665cabdff1aSopenharmony_ci int16_t *buf = &sl->mb[64*i8x8+256*p << pixel_shift]; 666cabdff1aSopenharmony_ci uint8_t *nnz; 667cabdff1aSopenharmony_ci for(i4x4=0; i4x4<4; i4x4++){ 668cabdff1aSopenharmony_ci const int index= i4x4 + 4*i8x8 + p*16; 669cabdff1aSopenharmony_ci if( decode_residual(h, sl, gb, buf, index, scan8x8+16*i4x4, 670cabdff1aSopenharmony_ci h->ps.pps->dequant8_coeff[cqm][qscale], 16) < 0 ) 671cabdff1aSopenharmony_ci return -1; 672cabdff1aSopenharmony_ci } 673cabdff1aSopenharmony_ci nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]]; 674cabdff1aSopenharmony_ci nnz[0] += nnz[1] + nnz[8] + nnz[9]; 675cabdff1aSopenharmony_ci new_cbp |= !!nnz[0] << i8x8; 676cabdff1aSopenharmony_ci }else{ 677cabdff1aSopenharmony_ci for(i4x4=0; i4x4<4; i4x4++){ 678cabdff1aSopenharmony_ci const int index= i4x4 + 4*i8x8 + p*16; 679cabdff1aSopenharmony_ci if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift), index, 680cabdff1aSopenharmony_ci scan, h->ps.pps->dequant4_coeff[cqm][qscale], 16) < 0 ){ 681cabdff1aSopenharmony_ci return -1; 682cabdff1aSopenharmony_ci } 683cabdff1aSopenharmony_ci new_cbp |= sl->non_zero_count_cache[scan8[index]] << i8x8; 684cabdff1aSopenharmony_ci } 685cabdff1aSopenharmony_ci } 686cabdff1aSopenharmony_ci }else{ 687cabdff1aSopenharmony_ci uint8_t * const nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]]; 688cabdff1aSopenharmony_ci nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0; 689cabdff1aSopenharmony_ci } 690cabdff1aSopenharmony_ci } 691cabdff1aSopenharmony_ci return new_cbp; 692cabdff1aSopenharmony_ci } 693cabdff1aSopenharmony_ci} 694cabdff1aSopenharmony_ci 695cabdff1aSopenharmony_ciint ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl) 696cabdff1aSopenharmony_ci{ 697cabdff1aSopenharmony_ci int mb_xy; 698cabdff1aSopenharmony_ci int partition_count; 699cabdff1aSopenharmony_ci unsigned int mb_type, cbp; 700cabdff1aSopenharmony_ci int dct8x8_allowed = h->ps.pps->transform_8x8_mode; 701cabdff1aSopenharmony_ci const int decode_chroma = h->ps.sps->chroma_format_idc == 1 || h->ps.sps->chroma_format_idc == 2; 702cabdff1aSopenharmony_ci const int pixel_shift = h->pixel_shift; 703cabdff1aSopenharmony_ci 704cabdff1aSopenharmony_ci mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride; 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y); 707cabdff1aSopenharmony_ci cbp = 0; /* avoid warning. FIXME: find a solution without slowing 708cabdff1aSopenharmony_ci down the code */ 709cabdff1aSopenharmony_ci if (sl->slice_type_nos != AV_PICTURE_TYPE_I) { 710cabdff1aSopenharmony_ci if (sl->mb_skip_run == -1) { 711cabdff1aSopenharmony_ci unsigned mb_skip_run = get_ue_golomb_long(&sl->gb); 712cabdff1aSopenharmony_ci if (mb_skip_run > h->mb_num) { 713cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "mb_skip_run %d is invalid\n", mb_skip_run); 714cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 715cabdff1aSopenharmony_ci } 716cabdff1aSopenharmony_ci sl->mb_skip_run = mb_skip_run; 717cabdff1aSopenharmony_ci } 718cabdff1aSopenharmony_ci 719cabdff1aSopenharmony_ci if (sl->mb_skip_run--) { 720cabdff1aSopenharmony_ci if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) { 721cabdff1aSopenharmony_ci if (sl->mb_skip_run == 0) 722cabdff1aSopenharmony_ci sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb); 723cabdff1aSopenharmony_ci } 724cabdff1aSopenharmony_ci decode_mb_skip(h, sl); 725cabdff1aSopenharmony_ci return 0; 726cabdff1aSopenharmony_ci } 727cabdff1aSopenharmony_ci } 728cabdff1aSopenharmony_ci if (FRAME_MBAFF(h)) { 729cabdff1aSopenharmony_ci if ((sl->mb_y & 1) == 0) 730cabdff1aSopenharmony_ci sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb); 731cabdff1aSopenharmony_ci } 732cabdff1aSopenharmony_ci 733cabdff1aSopenharmony_ci sl->prev_mb_skipped = 0; 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci mb_type= get_ue_golomb(&sl->gb); 736cabdff1aSopenharmony_ci if (sl->slice_type_nos == AV_PICTURE_TYPE_B) { 737cabdff1aSopenharmony_ci if(mb_type < 23){ 738cabdff1aSopenharmony_ci partition_count = ff_h264_b_mb_type_info[mb_type].partition_count; 739cabdff1aSopenharmony_ci mb_type = ff_h264_b_mb_type_info[mb_type].type; 740cabdff1aSopenharmony_ci }else{ 741cabdff1aSopenharmony_ci mb_type -= 23; 742cabdff1aSopenharmony_ci goto decode_intra_mb; 743cabdff1aSopenharmony_ci } 744cabdff1aSopenharmony_ci } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) { 745cabdff1aSopenharmony_ci if(mb_type < 5){ 746cabdff1aSopenharmony_ci partition_count = ff_h264_p_mb_type_info[mb_type].partition_count; 747cabdff1aSopenharmony_ci mb_type = ff_h264_p_mb_type_info[mb_type].type; 748cabdff1aSopenharmony_ci }else{ 749cabdff1aSopenharmony_ci mb_type -= 5; 750cabdff1aSopenharmony_ci goto decode_intra_mb; 751cabdff1aSopenharmony_ci } 752cabdff1aSopenharmony_ci }else{ 753cabdff1aSopenharmony_ci av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I); 754cabdff1aSopenharmony_ci if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type) 755cabdff1aSopenharmony_ci mb_type--; 756cabdff1aSopenharmony_cidecode_intra_mb: 757cabdff1aSopenharmony_ci if(mb_type > 25){ 758cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_picture_type_char(sl->slice_type), sl->mb_x, sl->mb_y); 759cabdff1aSopenharmony_ci return -1; 760cabdff1aSopenharmony_ci } 761cabdff1aSopenharmony_ci partition_count=0; 762cabdff1aSopenharmony_ci cbp = ff_h264_i_mb_type_info[mb_type].cbp; 763cabdff1aSopenharmony_ci sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode; 764cabdff1aSopenharmony_ci mb_type = ff_h264_i_mb_type_info[mb_type].type; 765cabdff1aSopenharmony_ci } 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_ci if (MB_FIELD(sl)) 768cabdff1aSopenharmony_ci mb_type |= MB_TYPE_INTERLACED; 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci h->slice_table[mb_xy] = sl->slice_num; 771cabdff1aSopenharmony_ci 772cabdff1aSopenharmony_ci if(IS_INTRA_PCM(mb_type)){ 773cabdff1aSopenharmony_ci const int mb_size = ff_h264_mb_sizes[h->ps.sps->chroma_format_idc] * 774cabdff1aSopenharmony_ci h->ps.sps->bit_depth_luma; 775cabdff1aSopenharmony_ci 776cabdff1aSopenharmony_ci // We assume these blocks are very rare so we do not optimize it. 777cabdff1aSopenharmony_ci sl->intra_pcm_ptr = align_get_bits(&sl->gb); 778cabdff1aSopenharmony_ci if (get_bits_left(&sl->gb) < mb_size) { 779cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "Not enough data for an intra PCM block.\n"); 780cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 781cabdff1aSopenharmony_ci } 782cabdff1aSopenharmony_ci skip_bits_long(&sl->gb, mb_size); 783cabdff1aSopenharmony_ci 784cabdff1aSopenharmony_ci // In deblocking, the quantizer is 0 785cabdff1aSopenharmony_ci h->cur_pic.qscale_table[mb_xy] = 0; 786cabdff1aSopenharmony_ci // All coeffs are present 787cabdff1aSopenharmony_ci memset(h->non_zero_count[mb_xy], 16, 48); 788cabdff1aSopenharmony_ci 789cabdff1aSopenharmony_ci h->cur_pic.mb_type[mb_xy] = mb_type; 790cabdff1aSopenharmony_ci return 0; 791cabdff1aSopenharmony_ci } 792cabdff1aSopenharmony_ci 793cabdff1aSopenharmony_ci fill_decode_neighbors(h, sl, mb_type); 794cabdff1aSopenharmony_ci fill_decode_caches(h, sl, mb_type); 795cabdff1aSopenharmony_ci 796cabdff1aSopenharmony_ci //mb_pred 797cabdff1aSopenharmony_ci if(IS_INTRA(mb_type)){ 798cabdff1aSopenharmony_ci int pred_mode; 799cabdff1aSopenharmony_ci// init_top_left_availability(h); 800cabdff1aSopenharmony_ci if(IS_INTRA4x4(mb_type)){ 801cabdff1aSopenharmony_ci int i; 802cabdff1aSopenharmony_ci int di = 1; 803cabdff1aSopenharmony_ci if(dct8x8_allowed && get_bits1(&sl->gb)){ 804cabdff1aSopenharmony_ci mb_type |= MB_TYPE_8x8DCT; 805cabdff1aSopenharmony_ci di = 4; 806cabdff1aSopenharmony_ci } 807cabdff1aSopenharmony_ci 808cabdff1aSopenharmony_ci// fill_intra4x4_pred_table(h); 809cabdff1aSopenharmony_ci for(i=0; i<16; i+=di){ 810cabdff1aSopenharmony_ci int mode = pred_intra_mode(h, sl, i); 811cabdff1aSopenharmony_ci 812cabdff1aSopenharmony_ci if(!get_bits1(&sl->gb)){ 813cabdff1aSopenharmony_ci const int rem_mode= get_bits(&sl->gb, 3); 814cabdff1aSopenharmony_ci mode = rem_mode + (rem_mode >= mode); 815cabdff1aSopenharmony_ci } 816cabdff1aSopenharmony_ci 817cabdff1aSopenharmony_ci if(di==4) 818cabdff1aSopenharmony_ci fill_rectangle(&sl->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1); 819cabdff1aSopenharmony_ci else 820cabdff1aSopenharmony_ci sl->intra4x4_pred_mode_cache[scan8[i]] = mode; 821cabdff1aSopenharmony_ci } 822cabdff1aSopenharmony_ci write_back_intra_pred_mode(h, sl); 823cabdff1aSopenharmony_ci if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx, 824cabdff1aSopenharmony_ci sl->top_samples_available, sl->left_samples_available) < 0) 825cabdff1aSopenharmony_ci return -1; 826cabdff1aSopenharmony_ci }else{ 827cabdff1aSopenharmony_ci sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available, 828cabdff1aSopenharmony_ci sl->left_samples_available, sl->intra16x16_pred_mode, 0); 829cabdff1aSopenharmony_ci if (sl->intra16x16_pred_mode < 0) 830cabdff1aSopenharmony_ci return -1; 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci if(decode_chroma){ 833cabdff1aSopenharmony_ci pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available, 834cabdff1aSopenharmony_ci sl->left_samples_available, get_ue_golomb_31(&sl->gb), 1); 835cabdff1aSopenharmony_ci if(pred_mode < 0) 836cabdff1aSopenharmony_ci return -1; 837cabdff1aSopenharmony_ci sl->chroma_pred_mode = pred_mode; 838cabdff1aSopenharmony_ci } else { 839cabdff1aSopenharmony_ci sl->chroma_pred_mode = DC_128_PRED8x8; 840cabdff1aSopenharmony_ci } 841cabdff1aSopenharmony_ci }else if(partition_count==4){ 842cabdff1aSopenharmony_ci int i, j, sub_partition_count[4], list, ref[2][4]; 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_ci if (sl->slice_type_nos == AV_PICTURE_TYPE_B) { 845cabdff1aSopenharmony_ci for(i=0; i<4; i++){ 846cabdff1aSopenharmony_ci sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb); 847cabdff1aSopenharmony_ci if(sl->sub_mb_type[i] >=13){ 848cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y); 849cabdff1aSopenharmony_ci return -1; 850cabdff1aSopenharmony_ci } 851cabdff1aSopenharmony_ci sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count; 852cabdff1aSopenharmony_ci sl->sub_mb_type[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type; 853cabdff1aSopenharmony_ci } 854cabdff1aSopenharmony_ci if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) { 855cabdff1aSopenharmony_ci ff_h264_pred_direct_motion(h, sl, &mb_type); 856cabdff1aSopenharmony_ci sl->ref_cache[0][scan8[4]] = 857cabdff1aSopenharmony_ci sl->ref_cache[1][scan8[4]] = 858cabdff1aSopenharmony_ci sl->ref_cache[0][scan8[12]] = 859cabdff1aSopenharmony_ci sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; 860cabdff1aSopenharmony_ci } 861cabdff1aSopenharmony_ci }else{ 862cabdff1aSopenharmony_ci av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ? 863cabdff1aSopenharmony_ci for(i=0; i<4; i++){ 864cabdff1aSopenharmony_ci sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb); 865cabdff1aSopenharmony_ci if(sl->sub_mb_type[i] >=4){ 866cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y); 867cabdff1aSopenharmony_ci return -1; 868cabdff1aSopenharmony_ci } 869cabdff1aSopenharmony_ci sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count; 870cabdff1aSopenharmony_ci sl->sub_mb_type[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type; 871cabdff1aSopenharmony_ci } 872cabdff1aSopenharmony_ci } 873cabdff1aSopenharmony_ci 874cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 875cabdff1aSopenharmony_ci int ref_count = IS_REF0(mb_type) ? 1 : sl->ref_count[list] << MB_MBAFF(sl); 876cabdff1aSopenharmony_ci for(i=0; i<4; i++){ 877cabdff1aSopenharmony_ci if(IS_DIRECT(sl->sub_mb_type[i])) continue; 878cabdff1aSopenharmony_ci if(IS_DIR(sl->sub_mb_type[i], 0, list)){ 879cabdff1aSopenharmony_ci unsigned int tmp; 880cabdff1aSopenharmony_ci if(ref_count == 1){ 881cabdff1aSopenharmony_ci tmp= 0; 882cabdff1aSopenharmony_ci }else if(ref_count == 2){ 883cabdff1aSopenharmony_ci tmp= get_bits1(&sl->gb)^1; 884cabdff1aSopenharmony_ci }else{ 885cabdff1aSopenharmony_ci tmp= get_ue_golomb_31(&sl->gb); 886cabdff1aSopenharmony_ci if(tmp>=ref_count){ 887cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp); 888cabdff1aSopenharmony_ci return -1; 889cabdff1aSopenharmony_ci } 890cabdff1aSopenharmony_ci } 891cabdff1aSopenharmony_ci ref[list][i]= tmp; 892cabdff1aSopenharmony_ci }else{ 893cabdff1aSopenharmony_ci //FIXME 894cabdff1aSopenharmony_ci ref[list][i] = -1; 895cabdff1aSopenharmony_ci } 896cabdff1aSopenharmony_ci } 897cabdff1aSopenharmony_ci } 898cabdff1aSopenharmony_ci 899cabdff1aSopenharmony_ci if(dct8x8_allowed) 900cabdff1aSopenharmony_ci dct8x8_allowed = get_dct8x8_allowed(h, sl); 901cabdff1aSopenharmony_ci 902cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 903cabdff1aSopenharmony_ci for(i=0; i<4; i++){ 904cabdff1aSopenharmony_ci if(IS_DIRECT(sl->sub_mb_type[i])) { 905cabdff1aSopenharmony_ci sl->ref_cache[list][ scan8[4*i] ] = sl->ref_cache[list][ scan8[4*i]+1 ]; 906cabdff1aSopenharmony_ci continue; 907cabdff1aSopenharmony_ci } 908cabdff1aSopenharmony_ci sl->ref_cache[list][ scan8[4*i] ]=sl->ref_cache[list][ scan8[4*i]+1 ]= 909cabdff1aSopenharmony_ci sl->ref_cache[list][ scan8[4*i]+8 ]=sl->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i]; 910cabdff1aSopenharmony_ci 911cabdff1aSopenharmony_ci if(IS_DIR(sl->sub_mb_type[i], 0, list)){ 912cabdff1aSopenharmony_ci const int sub_mb_type= sl->sub_mb_type[i]; 913cabdff1aSopenharmony_ci const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1; 914cabdff1aSopenharmony_ci for(j=0; j<sub_partition_count[i]; j++){ 915cabdff1aSopenharmony_ci int mx, my; 916cabdff1aSopenharmony_ci const int index= 4*i + block_width*j; 917cabdff1aSopenharmony_ci int16_t (* mv_cache)[2]= &sl->mv_cache[list][ scan8[index] ]; 918cabdff1aSopenharmony_ci pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my); 919cabdff1aSopenharmony_ci mx += (unsigned)get_se_golomb(&sl->gb); 920cabdff1aSopenharmony_ci my += (unsigned)get_se_golomb(&sl->gb); 921cabdff1aSopenharmony_ci ff_tlog(h->avctx, "final mv:%d %d\n", mx, my); 922cabdff1aSopenharmony_ci 923cabdff1aSopenharmony_ci if(IS_SUB_8X8(sub_mb_type)){ 924cabdff1aSopenharmony_ci mv_cache[ 1 ][0]= 925cabdff1aSopenharmony_ci mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx; 926cabdff1aSopenharmony_ci mv_cache[ 1 ][1]= 927cabdff1aSopenharmony_ci mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my; 928cabdff1aSopenharmony_ci }else if(IS_SUB_8X4(sub_mb_type)){ 929cabdff1aSopenharmony_ci mv_cache[ 1 ][0]= mx; 930cabdff1aSopenharmony_ci mv_cache[ 1 ][1]= my; 931cabdff1aSopenharmony_ci }else if(IS_SUB_4X8(sub_mb_type)){ 932cabdff1aSopenharmony_ci mv_cache[ 8 ][0]= mx; 933cabdff1aSopenharmony_ci mv_cache[ 8 ][1]= my; 934cabdff1aSopenharmony_ci } 935cabdff1aSopenharmony_ci mv_cache[ 0 ][0]= mx; 936cabdff1aSopenharmony_ci mv_cache[ 0 ][1]= my; 937cabdff1aSopenharmony_ci } 938cabdff1aSopenharmony_ci }else{ 939cabdff1aSopenharmony_ci uint32_t *p= (uint32_t *)&sl->mv_cache[list][ scan8[4*i] ][0]; 940cabdff1aSopenharmony_ci p[0] = p[1]= 941cabdff1aSopenharmony_ci p[8] = p[9]= 0; 942cabdff1aSopenharmony_ci } 943cabdff1aSopenharmony_ci } 944cabdff1aSopenharmony_ci } 945cabdff1aSopenharmony_ci }else if(IS_DIRECT(mb_type)){ 946cabdff1aSopenharmony_ci ff_h264_pred_direct_motion(h, sl, &mb_type); 947cabdff1aSopenharmony_ci dct8x8_allowed &= h->ps.sps->direct_8x8_inference_flag; 948cabdff1aSopenharmony_ci }else{ 949cabdff1aSopenharmony_ci int list, mx, my, i; 950cabdff1aSopenharmony_ci //FIXME we should set ref_idx_l? to 0 if we use that later ... 951cabdff1aSopenharmony_ci if(IS_16X16(mb_type)){ 952cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 953cabdff1aSopenharmony_ci unsigned int val; 954cabdff1aSopenharmony_ci if(IS_DIR(mb_type, 0, list)){ 955cabdff1aSopenharmony_ci unsigned rc = sl->ref_count[list] << MB_MBAFF(sl); 956cabdff1aSopenharmony_ci if (rc == 1) { 957cabdff1aSopenharmony_ci val= 0; 958cabdff1aSopenharmony_ci } else if (rc == 2) { 959cabdff1aSopenharmony_ci val= get_bits1(&sl->gb)^1; 960cabdff1aSopenharmony_ci }else{ 961cabdff1aSopenharmony_ci val= get_ue_golomb_31(&sl->gb); 962cabdff1aSopenharmony_ci if (val >= rc) { 963cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val); 964cabdff1aSopenharmony_ci return -1; 965cabdff1aSopenharmony_ci } 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1); 968cabdff1aSopenharmony_ci } 969cabdff1aSopenharmony_ci } 970cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 971cabdff1aSopenharmony_ci if(IS_DIR(mb_type, 0, list)){ 972cabdff1aSopenharmony_ci pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my); 973cabdff1aSopenharmony_ci mx += (unsigned)get_se_golomb(&sl->gb); 974cabdff1aSopenharmony_ci my += (unsigned)get_se_golomb(&sl->gb); 975cabdff1aSopenharmony_ci ff_tlog(h->avctx, "final mv:%d %d\n", mx, my); 976cabdff1aSopenharmony_ci 977cabdff1aSopenharmony_ci fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); 978cabdff1aSopenharmony_ci } 979cabdff1aSopenharmony_ci } 980cabdff1aSopenharmony_ci } 981cabdff1aSopenharmony_ci else if(IS_16X8(mb_type)){ 982cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 983cabdff1aSopenharmony_ci for(i=0; i<2; i++){ 984cabdff1aSopenharmony_ci unsigned int val; 985cabdff1aSopenharmony_ci if(IS_DIR(mb_type, i, list)){ 986cabdff1aSopenharmony_ci unsigned rc = sl->ref_count[list] << MB_MBAFF(sl); 987cabdff1aSopenharmony_ci if (rc == 1) { 988cabdff1aSopenharmony_ci val= 0; 989cabdff1aSopenharmony_ci } else if (rc == 2) { 990cabdff1aSopenharmony_ci val= get_bits1(&sl->gb)^1; 991cabdff1aSopenharmony_ci }else{ 992cabdff1aSopenharmony_ci val= get_ue_golomb_31(&sl->gb); 993cabdff1aSopenharmony_ci if (val >= rc) { 994cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val); 995cabdff1aSopenharmony_ci return -1; 996cabdff1aSopenharmony_ci } 997cabdff1aSopenharmony_ci } 998cabdff1aSopenharmony_ci }else 999cabdff1aSopenharmony_ci val= LIST_NOT_USED&0xFF; 1000cabdff1aSopenharmony_ci fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1); 1001cabdff1aSopenharmony_ci } 1002cabdff1aSopenharmony_ci } 1003cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 1004cabdff1aSopenharmony_ci for(i=0; i<2; i++){ 1005cabdff1aSopenharmony_ci unsigned int val; 1006cabdff1aSopenharmony_ci if(IS_DIR(mb_type, i, list)){ 1007cabdff1aSopenharmony_ci pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my); 1008cabdff1aSopenharmony_ci mx += (unsigned)get_se_golomb(&sl->gb); 1009cabdff1aSopenharmony_ci my += (unsigned)get_se_golomb(&sl->gb); 1010cabdff1aSopenharmony_ci ff_tlog(h->avctx, "final mv:%d %d\n", mx, my); 1011cabdff1aSopenharmony_ci 1012cabdff1aSopenharmony_ci val= pack16to32(mx,my); 1013cabdff1aSopenharmony_ci }else 1014cabdff1aSopenharmony_ci val=0; 1015cabdff1aSopenharmony_ci fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4); 1016cabdff1aSopenharmony_ci } 1017cabdff1aSopenharmony_ci } 1018cabdff1aSopenharmony_ci }else{ 1019cabdff1aSopenharmony_ci av_assert2(IS_8X16(mb_type)); 1020cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 1021cabdff1aSopenharmony_ci for(i=0; i<2; i++){ 1022cabdff1aSopenharmony_ci unsigned int val; 1023cabdff1aSopenharmony_ci if(IS_DIR(mb_type, i, list)){ //FIXME optimize 1024cabdff1aSopenharmony_ci unsigned rc = sl->ref_count[list] << MB_MBAFF(sl); 1025cabdff1aSopenharmony_ci if (rc == 1) { 1026cabdff1aSopenharmony_ci val= 0; 1027cabdff1aSopenharmony_ci } else if (rc == 2) { 1028cabdff1aSopenharmony_ci val= get_bits1(&sl->gb)^1; 1029cabdff1aSopenharmony_ci }else{ 1030cabdff1aSopenharmony_ci val= get_ue_golomb_31(&sl->gb); 1031cabdff1aSopenharmony_ci if (val >= rc) { 1032cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val); 1033cabdff1aSopenharmony_ci return -1; 1034cabdff1aSopenharmony_ci } 1035cabdff1aSopenharmony_ci } 1036cabdff1aSopenharmony_ci }else 1037cabdff1aSopenharmony_ci val= LIST_NOT_USED&0xFF; 1038cabdff1aSopenharmony_ci fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1); 1039cabdff1aSopenharmony_ci } 1040cabdff1aSopenharmony_ci } 1041cabdff1aSopenharmony_ci for (list = 0; list < sl->list_count; list++) { 1042cabdff1aSopenharmony_ci for(i=0; i<2; i++){ 1043cabdff1aSopenharmony_ci unsigned int val; 1044cabdff1aSopenharmony_ci if(IS_DIR(mb_type, i, list)){ 1045cabdff1aSopenharmony_ci pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my); 1046cabdff1aSopenharmony_ci mx += (unsigned)get_se_golomb(&sl->gb); 1047cabdff1aSopenharmony_ci my += (unsigned)get_se_golomb(&sl->gb); 1048cabdff1aSopenharmony_ci ff_tlog(h->avctx, "final mv:%d %d\n", mx, my); 1049cabdff1aSopenharmony_ci 1050cabdff1aSopenharmony_ci val= pack16to32(mx,my); 1051cabdff1aSopenharmony_ci }else 1052cabdff1aSopenharmony_ci val=0; 1053cabdff1aSopenharmony_ci fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4); 1054cabdff1aSopenharmony_ci } 1055cabdff1aSopenharmony_ci } 1056cabdff1aSopenharmony_ci } 1057cabdff1aSopenharmony_ci } 1058cabdff1aSopenharmony_ci 1059cabdff1aSopenharmony_ci if(IS_INTER(mb_type)) 1060cabdff1aSopenharmony_ci write_back_motion(h, sl, mb_type); 1061cabdff1aSopenharmony_ci 1062cabdff1aSopenharmony_ci if(!IS_INTRA16x16(mb_type)){ 1063cabdff1aSopenharmony_ci cbp= get_ue_golomb(&sl->gb); 1064cabdff1aSopenharmony_ci 1065cabdff1aSopenharmony_ci if(decode_chroma){ 1066cabdff1aSopenharmony_ci if(cbp > 47){ 1067cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y); 1068cabdff1aSopenharmony_ci return -1; 1069cabdff1aSopenharmony_ci } 1070cabdff1aSopenharmony_ci if (IS_INTRA4x4(mb_type)) 1071cabdff1aSopenharmony_ci cbp = ff_h264_golomb_to_intra4x4_cbp[cbp]; 1072cabdff1aSopenharmony_ci else 1073cabdff1aSopenharmony_ci cbp = ff_h264_golomb_to_inter_cbp[cbp]; 1074cabdff1aSopenharmony_ci }else{ 1075cabdff1aSopenharmony_ci if(cbp > 15){ 1076cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y); 1077cabdff1aSopenharmony_ci return -1; 1078cabdff1aSopenharmony_ci } 1079cabdff1aSopenharmony_ci if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp]; 1080cabdff1aSopenharmony_ci else cbp= golomb_to_inter_cbp_gray[cbp]; 1081cabdff1aSopenharmony_ci } 1082cabdff1aSopenharmony_ci } else { 1083cabdff1aSopenharmony_ci if (!decode_chroma && cbp>15) { 1084cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n"); 1085cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1086cabdff1aSopenharmony_ci } 1087cabdff1aSopenharmony_ci } 1088cabdff1aSopenharmony_ci 1089cabdff1aSopenharmony_ci if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){ 1090cabdff1aSopenharmony_ci mb_type |= MB_TYPE_8x8DCT*get_bits1(&sl->gb); 1091cabdff1aSopenharmony_ci } 1092cabdff1aSopenharmony_ci sl->cbp= 1093cabdff1aSopenharmony_ci h->cbp_table[mb_xy]= cbp; 1094cabdff1aSopenharmony_ci h->cur_pic.mb_type[mb_xy] = mb_type; 1095cabdff1aSopenharmony_ci 1096cabdff1aSopenharmony_ci if(cbp || IS_INTRA16x16(mb_type)){ 1097cabdff1aSopenharmony_ci int i4x4, i8x8, chroma_idx; 1098cabdff1aSopenharmony_ci int dquant; 1099cabdff1aSopenharmony_ci int ret; 1100cabdff1aSopenharmony_ci GetBitContext *gb = &sl->gb; 1101cabdff1aSopenharmony_ci const uint8_t *scan, *scan8x8; 1102cabdff1aSopenharmony_ci const int max_qp = 51 + 6 * (h->ps.sps->bit_depth_luma - 8); 1103cabdff1aSopenharmony_ci 1104cabdff1aSopenharmony_ci dquant= get_se_golomb(&sl->gb); 1105cabdff1aSopenharmony_ci 1106cabdff1aSopenharmony_ci sl->qscale += (unsigned)dquant; 1107cabdff1aSopenharmony_ci 1108cabdff1aSopenharmony_ci if (((unsigned)sl->qscale) > max_qp){ 1109cabdff1aSopenharmony_ci if (sl->qscale < 0) sl->qscale += max_qp + 1; 1110cabdff1aSopenharmony_ci else sl->qscale -= max_qp+1; 1111cabdff1aSopenharmony_ci if (((unsigned)sl->qscale) > max_qp){ 1112cabdff1aSopenharmony_ci av_log(h->avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, sl->mb_x, sl->mb_y); 1113cabdff1aSopenharmony_ci sl->qscale = max_qp; 1114cabdff1aSopenharmony_ci return -1; 1115cabdff1aSopenharmony_ci } 1116cabdff1aSopenharmony_ci } 1117cabdff1aSopenharmony_ci 1118cabdff1aSopenharmony_ci sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale); 1119cabdff1aSopenharmony_ci sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale); 1120cabdff1aSopenharmony_ci 1121cabdff1aSopenharmony_ci if(IS_INTERLACED(mb_type)){ 1122cabdff1aSopenharmony_ci scan8x8 = sl->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0; 1123cabdff1aSopenharmony_ci scan = sl->qscale ? h->field_scan : h->field_scan_q0; 1124cabdff1aSopenharmony_ci }else{ 1125cabdff1aSopenharmony_ci scan8x8 = sl->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0; 1126cabdff1aSopenharmony_ci scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0; 1127cabdff1aSopenharmony_ci } 1128cabdff1aSopenharmony_ci 1129cabdff1aSopenharmony_ci if ((ret = decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ) { 1130cabdff1aSopenharmony_ci return -1; 1131cabdff1aSopenharmony_ci } 1132cabdff1aSopenharmony_ci h->cbp_table[mb_xy] |= ret << 12; 1133cabdff1aSopenharmony_ci if (CHROMA444(h)) { 1134cabdff1aSopenharmony_ci if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 1) < 0 ) { 1135cabdff1aSopenharmony_ci return -1; 1136cabdff1aSopenharmony_ci } 1137cabdff1aSopenharmony_ci if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ) { 1138cabdff1aSopenharmony_ci return -1; 1139cabdff1aSopenharmony_ci } 1140cabdff1aSopenharmony_ci } else { 1141cabdff1aSopenharmony_ci const int num_c8x8 = h->ps.sps->chroma_format_idc; 1142cabdff1aSopenharmony_ci 1143cabdff1aSopenharmony_ci if(cbp&0x30){ 1144cabdff1aSopenharmony_ci for(chroma_idx=0; chroma_idx<2; chroma_idx++) 1145cabdff1aSopenharmony_ci if (decode_residual(h, sl, gb, sl->mb + ((256 + 16*16*chroma_idx) << pixel_shift), 1146cabdff1aSopenharmony_ci CHROMA_DC_BLOCK_INDEX + chroma_idx, 1147cabdff1aSopenharmony_ci CHROMA422(h) ? ff_h264_chroma422_dc_scan : ff_h264_chroma_dc_scan, 1148cabdff1aSopenharmony_ci NULL, 4 * num_c8x8) < 0) { 1149cabdff1aSopenharmony_ci return -1; 1150cabdff1aSopenharmony_ci } 1151cabdff1aSopenharmony_ci } 1152cabdff1aSopenharmony_ci 1153cabdff1aSopenharmony_ci if(cbp&0x20){ 1154cabdff1aSopenharmony_ci for(chroma_idx=0; chroma_idx<2; chroma_idx++){ 1155cabdff1aSopenharmony_ci const uint32_t *qmul = h->ps.pps->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[chroma_idx]]; 1156cabdff1aSopenharmony_ci int16_t *mb = sl->mb + (16*(16 + 16*chroma_idx) << pixel_shift); 1157cabdff1aSopenharmony_ci for (i8x8 = 0; i8x8<num_c8x8; i8x8++) { 1158cabdff1aSopenharmony_ci for (i4x4 = 0; i4x4 < 4; i4x4++) { 1159cabdff1aSopenharmony_ci const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4; 1160cabdff1aSopenharmony_ci if (decode_residual(h, sl, gb, mb, index, scan + 1, qmul, 15) < 0) 1161cabdff1aSopenharmony_ci return -1; 1162cabdff1aSopenharmony_ci mb += 16 << pixel_shift; 1163cabdff1aSopenharmony_ci } 1164cabdff1aSopenharmony_ci } 1165cabdff1aSopenharmony_ci } 1166cabdff1aSopenharmony_ci }else{ 1167cabdff1aSopenharmony_ci fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1); 1168cabdff1aSopenharmony_ci fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1); 1169cabdff1aSopenharmony_ci } 1170cabdff1aSopenharmony_ci } 1171cabdff1aSopenharmony_ci }else{ 1172cabdff1aSopenharmony_ci fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1); 1173cabdff1aSopenharmony_ci fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1); 1174cabdff1aSopenharmony_ci fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1); 1175cabdff1aSopenharmony_ci } 1176cabdff1aSopenharmony_ci h->cur_pic.qscale_table[mb_xy] = sl->qscale; 1177cabdff1aSopenharmony_ci write_back_non_zero_count(h, sl); 1178cabdff1aSopenharmony_ci 1179cabdff1aSopenharmony_ci return 0; 1180cabdff1aSopenharmony_ci} 1181