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