1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Functions common to fixed/float MPEG-4 Parametric Stereo decoding 3cabdff1aSopenharmony_ci * Copyright (c) 2010 Alex Converse <alex.converse@gmail.com> 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#include <stdint.h> 23cabdff1aSopenharmony_ci#include "libavutil/common.h" 24cabdff1aSopenharmony_ci#include "libavutil/thread.h" 25cabdff1aSopenharmony_ci#include "aacps.h" 26cabdff1aSopenharmony_ci#include "get_bits.h" 27cabdff1aSopenharmony_ci#include "aacpsdata.c" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_cistatic const int8_t num_env_tab[2][4] = { 30cabdff1aSopenharmony_ci { 0, 1, 2, 4, }, 31cabdff1aSopenharmony_ci { 1, 2, 3, 4, }, 32cabdff1aSopenharmony_ci}; 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_cistatic const int8_t nr_iidicc_par_tab[] = { 35cabdff1aSopenharmony_ci 10, 20, 34, 10, 20, 34, 36cabdff1aSopenharmony_ci}; 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_cistatic const int8_t nr_iidopd_par_tab[] = { 39cabdff1aSopenharmony_ci 5, 11, 17, 5, 11, 17, 40cabdff1aSopenharmony_ci}; 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_cienum { 43cabdff1aSopenharmony_ci huff_iid_df1, 44cabdff1aSopenharmony_ci huff_iid_dt1, 45cabdff1aSopenharmony_ci huff_iid_df0, 46cabdff1aSopenharmony_ci huff_iid_dt0, 47cabdff1aSopenharmony_ci huff_icc_df, 48cabdff1aSopenharmony_ci huff_icc_dt, 49cabdff1aSopenharmony_ci huff_ipd_df, 50cabdff1aSopenharmony_ci huff_ipd_dt, 51cabdff1aSopenharmony_ci huff_opd_df, 52cabdff1aSopenharmony_ci huff_opd_dt, 53cabdff1aSopenharmony_ci}; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_cistatic const int huff_iid[] = { 56cabdff1aSopenharmony_ci huff_iid_df0, 57cabdff1aSopenharmony_ci huff_iid_df1, 58cabdff1aSopenharmony_ci huff_iid_dt0, 59cabdff1aSopenharmony_ci huff_iid_dt1, 60cabdff1aSopenharmony_ci}; 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_cistatic VLC vlc_ps[10]; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci#define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION, NB_BITS, MAX_DEPTH) \ 65cabdff1aSopenharmony_ci/** \ 66cabdff1aSopenharmony_ci * Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \ 67cabdff1aSopenharmony_ci * Inter-channel Phase Difference/Overall Phase Difference parameters from the \ 68cabdff1aSopenharmony_ci * bitstream. \ 69cabdff1aSopenharmony_ci * \ 70cabdff1aSopenharmony_ci * @param avctx contains the current codec context \ 71cabdff1aSopenharmony_ci * @param gb pointer to the input bitstream \ 72cabdff1aSopenharmony_ci * @param ps pointer to the Parametric Stereo context \ 73cabdff1aSopenharmony_ci * @param PAR pointer to the parameter to be read \ 74cabdff1aSopenharmony_ci * @param e envelope to decode \ 75cabdff1aSopenharmony_ci * @param dt 1: time delta-coded, 0: frequency delta-coded \ 76cabdff1aSopenharmony_ci */ \ 77cabdff1aSopenharmony_cistatic int read_ ## PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, PSCommonContext *ps, \ 78cabdff1aSopenharmony_ci int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, int dt) \ 79cabdff1aSopenharmony_ci{ \ 80cabdff1aSopenharmony_ci int b, num = ps->nr_ ## PAR ## _par; \ 81cabdff1aSopenharmony_ci const VLCElem *vlc_table = vlc_ps[table_idx].table; \ 82cabdff1aSopenharmony_ci if (dt) { \ 83cabdff1aSopenharmony_ci int e_prev = e ? e - 1 : ps->num_env_old - 1; \ 84cabdff1aSopenharmony_ci e_prev = FFMAX(e_prev, 0); \ 85cabdff1aSopenharmony_ci for (b = 0; b < num; b++) { \ 86cabdff1aSopenharmony_ci int val = PAR[e_prev][b] + get_vlc2(gb, vlc_table, NB_BITS, MAX_DEPTH) - OFFSET; \ 87cabdff1aSopenharmony_ci if (MASK) val &= MASK; \ 88cabdff1aSopenharmony_ci PAR[e][b] = val; \ 89cabdff1aSopenharmony_ci if (ERR_CONDITION) \ 90cabdff1aSopenharmony_ci goto err; \ 91cabdff1aSopenharmony_ci } \ 92cabdff1aSopenharmony_ci } else { \ 93cabdff1aSopenharmony_ci int val = 0; \ 94cabdff1aSopenharmony_ci for (b = 0; b < num; b++) { \ 95cabdff1aSopenharmony_ci val += get_vlc2(gb, vlc_table, NB_BITS, MAX_DEPTH) - OFFSET; \ 96cabdff1aSopenharmony_ci if (MASK) val &= MASK; \ 97cabdff1aSopenharmony_ci PAR[e][b] = val; \ 98cabdff1aSopenharmony_ci if (ERR_CONDITION) \ 99cabdff1aSopenharmony_ci goto err; \ 100cabdff1aSopenharmony_ci } \ 101cabdff1aSopenharmony_ci } \ 102cabdff1aSopenharmony_ci return 0; \ 103cabdff1aSopenharmony_cierr: \ 104cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \ 105cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; \ 106cabdff1aSopenharmony_ci} 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ciREAD_PAR_DATA(iid, huff_offset[table_idx], 0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant, 9, 3) 109cabdff1aSopenharmony_ciREAD_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U, 9, 2) 110cabdff1aSopenharmony_ciREAD_PAR_DATA(ipdopd, 0, 0x07, 0, 5, 1) 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_cistatic int ps_read_extension_data(GetBitContext *gb, PSCommonContext *ps, 113cabdff1aSopenharmony_ci int ps_extension_id) 114cabdff1aSopenharmony_ci{ 115cabdff1aSopenharmony_ci int e; 116cabdff1aSopenharmony_ci int count = get_bits_count(gb); 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ci if (ps_extension_id) 119cabdff1aSopenharmony_ci return 0; 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci ps->enable_ipdopd = get_bits1(gb); 122cabdff1aSopenharmony_ci if (ps->enable_ipdopd) { 123cabdff1aSopenharmony_ci for (e = 0; e < ps->num_env; e++) { 124cabdff1aSopenharmony_ci int dt = get_bits1(gb); 125cabdff1aSopenharmony_ci read_ipdopd_data(NULL, gb, ps, ps->ipd_par, dt ? huff_ipd_dt : huff_ipd_df, e, dt); 126cabdff1aSopenharmony_ci dt = get_bits1(gb); 127cabdff1aSopenharmony_ci read_ipdopd_data(NULL, gb, ps, ps->opd_par, dt ? huff_opd_dt : huff_opd_df, e, dt); 128cabdff1aSopenharmony_ci } 129cabdff1aSopenharmony_ci } 130cabdff1aSopenharmony_ci skip_bits1(gb); //reserved_ps 131cabdff1aSopenharmony_ci return get_bits_count(gb) - count; 132cabdff1aSopenharmony_ci} 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ciint ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb_host, 135cabdff1aSopenharmony_ci PSCommonContext *ps, int bits_left) 136cabdff1aSopenharmony_ci{ 137cabdff1aSopenharmony_ci int e; 138cabdff1aSopenharmony_ci int bit_count_start = get_bits_count(gb_host); 139cabdff1aSopenharmony_ci int header; 140cabdff1aSopenharmony_ci int bits_consumed; 141cabdff1aSopenharmony_ci GetBitContext gbc = *gb_host, *gb = &gbc; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci header = get_bits1(gb); 144cabdff1aSopenharmony_ci if (header) { //enable_ps_header 145cabdff1aSopenharmony_ci ps->enable_iid = get_bits1(gb); 146cabdff1aSopenharmony_ci if (ps->enable_iid) { 147cabdff1aSopenharmony_ci int iid_mode = get_bits(gb, 3); 148cabdff1aSopenharmony_ci if (iid_mode > 5) { 149cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "iid_mode %d is reserved.\n", 150cabdff1aSopenharmony_ci iid_mode); 151cabdff1aSopenharmony_ci goto err; 152cabdff1aSopenharmony_ci } 153cabdff1aSopenharmony_ci ps->nr_iid_par = nr_iidicc_par_tab[iid_mode]; 154cabdff1aSopenharmony_ci ps->iid_quant = iid_mode > 2; 155cabdff1aSopenharmony_ci ps->nr_ipdopd_par = nr_iidopd_par_tab[iid_mode]; 156cabdff1aSopenharmony_ci } 157cabdff1aSopenharmony_ci ps->enable_icc = get_bits1(gb); 158cabdff1aSopenharmony_ci if (ps->enable_icc) { 159cabdff1aSopenharmony_ci ps->icc_mode = get_bits(gb, 3); 160cabdff1aSopenharmony_ci if (ps->icc_mode > 5) { 161cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "icc_mode %d is reserved.\n", 162cabdff1aSopenharmony_ci ps->icc_mode); 163cabdff1aSopenharmony_ci goto err; 164cabdff1aSopenharmony_ci } 165cabdff1aSopenharmony_ci ps->nr_icc_par = nr_iidicc_par_tab[ps->icc_mode]; 166cabdff1aSopenharmony_ci } 167cabdff1aSopenharmony_ci ps->enable_ext = get_bits1(gb); 168cabdff1aSopenharmony_ci } 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci ps->frame_class = get_bits1(gb); 171cabdff1aSopenharmony_ci ps->num_env_old = ps->num_env; 172cabdff1aSopenharmony_ci ps->num_env = num_env_tab[ps->frame_class][get_bits(gb, 2)]; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci ps->border_position[0] = -1; 175cabdff1aSopenharmony_ci if (ps->frame_class) { 176cabdff1aSopenharmony_ci for (e = 1; e <= ps->num_env; e++) { 177cabdff1aSopenharmony_ci ps->border_position[e] = get_bits(gb, 5); 178cabdff1aSopenharmony_ci if (ps->border_position[e] < ps->border_position[e-1]) { 179cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "border_position non monotone.\n"); 180cabdff1aSopenharmony_ci goto err; 181cabdff1aSopenharmony_ci } 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci } else 184cabdff1aSopenharmony_ci for (e = 1; e <= ps->num_env; e++) 185cabdff1aSopenharmony_ci ps->border_position[e] = (e * numQMFSlots >> ff_log2_tab[ps->num_env]) - 1; 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci if (ps->enable_iid) { 188cabdff1aSopenharmony_ci for (e = 0; e < ps->num_env; e++) { 189cabdff1aSopenharmony_ci int dt = get_bits1(gb); 190cabdff1aSopenharmony_ci if (read_iid_data(avctx, gb, ps, ps->iid_par, huff_iid[2*dt+ps->iid_quant], e, dt)) 191cabdff1aSopenharmony_ci goto err; 192cabdff1aSopenharmony_ci } 193cabdff1aSopenharmony_ci } else 194cabdff1aSopenharmony_ci memset(ps->iid_par, 0, sizeof(ps->iid_par)); 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_ci if (ps->enable_icc) 197cabdff1aSopenharmony_ci for (e = 0; e < ps->num_env; e++) { 198cabdff1aSopenharmony_ci int dt = get_bits1(gb); 199cabdff1aSopenharmony_ci if (read_icc_data(avctx, gb, ps, ps->icc_par, dt ? huff_icc_dt : huff_icc_df, e, dt)) 200cabdff1aSopenharmony_ci goto err; 201cabdff1aSopenharmony_ci } 202cabdff1aSopenharmony_ci else 203cabdff1aSopenharmony_ci memset(ps->icc_par, 0, sizeof(ps->icc_par)); 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci if (ps->enable_ext) { 206cabdff1aSopenharmony_ci int cnt = get_bits(gb, 4); 207cabdff1aSopenharmony_ci if (cnt == 15) { 208cabdff1aSopenharmony_ci cnt += get_bits(gb, 8); 209cabdff1aSopenharmony_ci } 210cabdff1aSopenharmony_ci cnt *= 8; 211cabdff1aSopenharmony_ci while (cnt > 7) { 212cabdff1aSopenharmony_ci int ps_extension_id = get_bits(gb, 2); 213cabdff1aSopenharmony_ci cnt -= 2 + ps_read_extension_data(gb, ps, ps_extension_id); 214cabdff1aSopenharmony_ci } 215cabdff1aSopenharmony_ci if (cnt < 0) { 216cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "ps extension overflow %d\n", cnt); 217cabdff1aSopenharmony_ci goto err; 218cabdff1aSopenharmony_ci } 219cabdff1aSopenharmony_ci skip_bits(gb, cnt); 220cabdff1aSopenharmony_ci } 221cabdff1aSopenharmony_ci 222cabdff1aSopenharmony_ci ps->enable_ipdopd &= !PS_BASELINE; 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci //Fix up envelopes 225cabdff1aSopenharmony_ci if (!ps->num_env || ps->border_position[ps->num_env] < numQMFSlots - 1) { 226cabdff1aSopenharmony_ci //Create a fake envelope 227cabdff1aSopenharmony_ci int source = ps->num_env ? ps->num_env - 1 : ps->num_env_old - 1; 228cabdff1aSopenharmony_ci int b; 229cabdff1aSopenharmony_ci if (source >= 0 && source != ps->num_env) { 230cabdff1aSopenharmony_ci if (ps->enable_iid) { 231cabdff1aSopenharmony_ci memcpy(ps->iid_par+ps->num_env, ps->iid_par+source, sizeof(ps->iid_par[0])); 232cabdff1aSopenharmony_ci } 233cabdff1aSopenharmony_ci if (ps->enable_icc) { 234cabdff1aSopenharmony_ci memcpy(ps->icc_par+ps->num_env, ps->icc_par+source, sizeof(ps->icc_par[0])); 235cabdff1aSopenharmony_ci } 236cabdff1aSopenharmony_ci if (ps->enable_ipdopd) { 237cabdff1aSopenharmony_ci memcpy(ps->ipd_par+ps->num_env, ps->ipd_par+source, sizeof(ps->ipd_par[0])); 238cabdff1aSopenharmony_ci memcpy(ps->opd_par+ps->num_env, ps->opd_par+source, sizeof(ps->opd_par[0])); 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci } 241cabdff1aSopenharmony_ci if (ps->enable_iid){ 242cabdff1aSopenharmony_ci for (b = 0; b < ps->nr_iid_par; b++) { 243cabdff1aSopenharmony_ci if (FFABS(ps->iid_par[ps->num_env][b]) > 7 + 8 * ps->iid_quant) { 244cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "iid_par invalid\n"); 245cabdff1aSopenharmony_ci goto err; 246cabdff1aSopenharmony_ci } 247cabdff1aSopenharmony_ci } 248cabdff1aSopenharmony_ci } 249cabdff1aSopenharmony_ci if (ps->enable_icc){ 250cabdff1aSopenharmony_ci for (b = 0; b < ps->nr_iid_par; b++) { 251cabdff1aSopenharmony_ci if (ps->icc_par[ps->num_env][b] > 7U) { 252cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "icc_par invalid\n"); 253cabdff1aSopenharmony_ci goto err; 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci } 256cabdff1aSopenharmony_ci } 257cabdff1aSopenharmony_ci ps->num_env++; 258cabdff1aSopenharmony_ci ps->border_position[ps->num_env] = numQMFSlots - 1; 259cabdff1aSopenharmony_ci } 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci ps->is34bands_old = ps->is34bands; 263cabdff1aSopenharmony_ci if (!PS_BASELINE && (ps->enable_iid || ps->enable_icc)) 264cabdff1aSopenharmony_ci ps->is34bands = (ps->enable_iid && ps->nr_iid_par == 34) || 265cabdff1aSopenharmony_ci (ps->enable_icc && ps->nr_icc_par == 34); 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci //Baseline 268cabdff1aSopenharmony_ci if (!ps->enable_ipdopd) { 269cabdff1aSopenharmony_ci memset(ps->ipd_par, 0, sizeof(ps->ipd_par)); 270cabdff1aSopenharmony_ci memset(ps->opd_par, 0, sizeof(ps->opd_par)); 271cabdff1aSopenharmony_ci } 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci if (header) 274cabdff1aSopenharmony_ci ps->start = 1; 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci bits_consumed = get_bits_count(gb) - bit_count_start; 277cabdff1aSopenharmony_ci if (bits_consumed <= bits_left) { 278cabdff1aSopenharmony_ci skip_bits_long(gb_host, bits_consumed); 279cabdff1aSopenharmony_ci return bits_consumed; 280cabdff1aSopenharmony_ci } 281cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Expected to read %d PS bits actually read %d.\n", bits_left, bits_consumed); 282cabdff1aSopenharmony_cierr: 283cabdff1aSopenharmony_ci ps->start = 0; 284cabdff1aSopenharmony_ci skip_bits_long(gb_host, bits_left); 285cabdff1aSopenharmony_ci memset(ps->iid_par, 0, sizeof(ps->iid_par)); 286cabdff1aSopenharmony_ci memset(ps->icc_par, 0, sizeof(ps->icc_par)); 287cabdff1aSopenharmony_ci memset(ps->ipd_par, 0, sizeof(ps->ipd_par)); 288cabdff1aSopenharmony_ci memset(ps->opd_par, 0, sizeof(ps->opd_par)); 289cabdff1aSopenharmony_ci return bits_left; 290cabdff1aSopenharmony_ci} 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci#define PS_INIT_VLC_STATIC(num, nb_bits, size) \ 293cabdff1aSopenharmony_ci INIT_VLC_STATIC(&vlc_ps[num], nb_bits, ps_tmp[num].table_size / ps_tmp[num].elem_size, \ 294cabdff1aSopenharmony_ci ps_tmp[num].ps_bits, 1, 1, \ 295cabdff1aSopenharmony_ci ps_tmp[num].ps_codes, ps_tmp[num].elem_size, ps_tmp[num].elem_size, \ 296cabdff1aSopenharmony_ci size); 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci#define PS_VLC_ROW(name) \ 299cabdff1aSopenharmony_ci { name ## _codes, name ## _bits, sizeof(name ## _codes), sizeof(name ## _codes[0]) } 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_cistatic av_cold void ps_init_common(void) 302cabdff1aSopenharmony_ci{ 303cabdff1aSopenharmony_ci // Syntax initialization 304cabdff1aSopenharmony_ci static const struct { 305cabdff1aSopenharmony_ci const void *ps_codes, *ps_bits; 306cabdff1aSopenharmony_ci const unsigned int table_size, elem_size; 307cabdff1aSopenharmony_ci } ps_tmp[] = { 308cabdff1aSopenharmony_ci PS_VLC_ROW(huff_iid_df1), 309cabdff1aSopenharmony_ci PS_VLC_ROW(huff_iid_dt1), 310cabdff1aSopenharmony_ci PS_VLC_ROW(huff_iid_df0), 311cabdff1aSopenharmony_ci PS_VLC_ROW(huff_iid_dt0), 312cabdff1aSopenharmony_ci PS_VLC_ROW(huff_icc_df), 313cabdff1aSopenharmony_ci PS_VLC_ROW(huff_icc_dt), 314cabdff1aSopenharmony_ci PS_VLC_ROW(huff_ipd_df), 315cabdff1aSopenharmony_ci PS_VLC_ROW(huff_ipd_dt), 316cabdff1aSopenharmony_ci PS_VLC_ROW(huff_opd_df), 317cabdff1aSopenharmony_ci PS_VLC_ROW(huff_opd_dt), 318cabdff1aSopenharmony_ci }; 319cabdff1aSopenharmony_ci 320cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(0, 9, 1544); 321cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(1, 9, 832); 322cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(2, 9, 1024); 323cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(3, 9, 1036); 324cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(4, 9, 544); 325cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(5, 9, 544); 326cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(6, 5, 32); 327cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(7, 5, 32); 328cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(8, 5, 32); 329cabdff1aSopenharmony_ci PS_INIT_VLC_STATIC(9, 5, 32); 330cabdff1aSopenharmony_ci} 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ciav_cold void ff_ps_init_common(void) 333cabdff1aSopenharmony_ci{ 334cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; 335cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, ps_init_common); 336cabdff1aSopenharmony_ci} 337