1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Siren audio decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2012 Youness Alaoui <kakaroto@kakaroto.homelinux.net>
4cabdff1aSopenharmony_ci * Copyright (c) 2018 Paul B Mahol
5cabdff1aSopenharmony_ci * Copyright (c) 2019 Lynne <dev@lynne.ee>
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * This file is part of FFmpeg.
8cabdff1aSopenharmony_ci *
9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
13cabdff1aSopenharmony_ci *
14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17cabdff1aSopenharmony_ci * Lesser General Public License for more details.
18cabdff1aSopenharmony_ci *
19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22cabdff1aSopenharmony_ci */
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
25cabdff1aSopenharmony_ci#include "libavutil/tx.h"
26cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h"
27cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include "avcodec.h"
30cabdff1aSopenharmony_ci#include "codec_internal.h"
31cabdff1aSopenharmony_ci#include "get_bits.h"
32cabdff1aSopenharmony_ci#include "internal.h"
33cabdff1aSopenharmony_ci#include "mathops.h"
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_cistatic const uint8_t index_table[8] = {4, 4, 3, 3, 2, 2, 1, 0};
36cabdff1aSopenharmony_cistatic const uint8_t vector_dimension[8] = { 2, 2, 2, 4, 4, 5, 5, 1 };
37cabdff1aSopenharmony_cistatic const uint8_t number_of_vectors[8] = { 10, 10, 10, 5, 5, 4, 4, 20 };
38cabdff1aSopenharmony_cistatic const uint8_t expected_bits_table[8] = { 52, 47, 43, 37, 29, 22, 16, 0 };
39cabdff1aSopenharmony_cistatic const int8_t differential_decoder_tree[27][24][2] = {
40cabdff1aSopenharmony_ci    {
41cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, -12}, {-11, -10}, {-8, -9}, {-7, -6}, {-13, 12},
42cabdff1aSopenharmony_ci        {-5, -4}, {0, 13}, {-3, -14}, {-2, 14}, {-1, 15}, {-15, 16}, {-16, 17}, {-17, 18}, {19, 20},
43cabdff1aSopenharmony_ci        {21, 22}, {-18, -19}, {-20, -21}, {-22, -23}, {-32, -32}
44cabdff1aSopenharmony_ci    },
45cabdff1aSopenharmony_ci    {
46cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {7, 8}, {-10, -9}, {-8, -11}, {-7, -6}, {9, -5}, {10, -12}, {-4, 11},
47cabdff1aSopenharmony_ci        {-13, -3}, {12, -2}, {13, -14}, {-1, 14}, {15, -15}, {0, 16}, {-16, 17}, {-17, 18}, {-18, 19},
48cabdff1aSopenharmony_ci        {20, 21},{22, -19}, {-20, -21}, {-22, -23}, {-32, -32}
49cabdff1aSopenharmony_ci    },
50cabdff1aSopenharmony_ci    {
51cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {-12, 11}, {-11, -13}, {-10, -9}, {12, -14}, {-8, -7},
52cabdff1aSopenharmony_ci        {-15, -6}, {13, -5}, {-16, -4}, {14, -17}, {15, -3}, {16, -18}, {-2, 17}, {18, -19}, {-1, 19},
53cabdff1aSopenharmony_ci        {-20, 20}, {0, 21}, {22, -21}, {-22, -23}, {-32, -32}
54cabdff1aSopenharmony_ci    },
55cabdff1aSopenharmony_ci    {
56cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {-11, -10}, {7, -12}, {8, -9}, {9, -13}, {-14, 10}, {-8, -15}, {-16, 11},
57cabdff1aSopenharmony_ci        {-7, 12}, {-17, -6}, {13, 14}, {-18, 15}, {-5, -4}, {16, 17}, {-3, -2}, {-19, 18}, {-1, 19},
58cabdff1aSopenharmony_ci        {-20, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32}
59cabdff1aSopenharmony_ci    },
60cabdff1aSopenharmony_ci    {
61cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {-12, -11}, {-13, 7}, {8, -14}, {-10, 9}, {10, -15}, {-9, 11}, {-8, 12},
62cabdff1aSopenharmony_ci        {-16, 13}, {-7, -6}, {-17, 14}, {-5, -18}, {15, -4}, {16, -19}, {17, -3}, {-20, 18}, {-2, 19},
63cabdff1aSopenharmony_ci        {-21, 20}, {0, 21}, {22, -1}, {-22, -23}, {-32, -32}
64cabdff1aSopenharmony_ci    },
65cabdff1aSopenharmony_ci    {
66cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {-11, 7}, {-12, -10}, {-13, -9}, {8, 9}, {-14, -8}, {10, -15}, {-7, 11},
67cabdff1aSopenharmony_ci        {-16, 12}, {-6, -17}, {13, 14}, {-5, 15}, {-18, 16}, {-4, 17}, {-3, -19}, {18, -2}, {-20, 19},
68cabdff1aSopenharmony_ci        {-1, 20}, {0, 21}, {22, -21}, {-22, -23}, {-32, -32}
69cabdff1aSopenharmony_ci    },
70cabdff1aSopenharmony_ci    {
71cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, -12}, {6, -11}, {-10, -13}, {-9, 7}, {8, -14}, {9, -8}, {-15, 10}, {-7, -16},
72cabdff1aSopenharmony_ci        {11, -6}, {12, -17}, {13, -5}, {-18, 14}, {15, -4}, {-19, 16}, {17, -3}, {-20, 18}, {19, 20},
73cabdff1aSopenharmony_ci        {21, 22}, {0, -2}, {-1, -21}, {-22, -23}, {-32, -32}
74cabdff1aSopenharmony_ci    },
75cabdff1aSopenharmony_ci    {
76cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, -12}, {6, -13}, {-11, -10}, {7, -14}, {8, -9}, {9, -15}, {-8, 10}, {-7, -16},
77cabdff1aSopenharmony_ci        {11, 12}, {-6, -17}, {-5, 13}, {14, 15}, {-18, -4}, {-19, 16}, {-3, 17}, {18, -2}, {-20, 19},
78cabdff1aSopenharmony_ci        {20, 21}, {22, 0}, {-1, -21}, {-22, -23}, {-32, -32}
79cabdff1aSopenharmony_ci    },
80cabdff1aSopenharmony_ci    {
81cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {-11, -10}, {-12, -9}, {7, 8}, {-13, -8}, {9, -14}, {-7, 10}, {-6, -15},
82cabdff1aSopenharmony_ci        {11, 12}, {-5, -16}, {13, 14}, {-17, 15}, {-4, 16}, {17, -18}, {18, -3}, {-2, 19}, {-1, 0},
83cabdff1aSopenharmony_ci        {-19, 20}, {-20, 21}, {22, -21}, {-22, -23}, {-32, -32}
84cabdff1aSopenharmony_ci    },
85cabdff1aSopenharmony_ci    {
86cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, 6}, {-11, 7}, {-10, -12}, {-9, 8}, {-8, -13}, {9, -7}, {10, -14}, {-6, 11},
87cabdff1aSopenharmony_ci        {-15, 12}, {-5, 13}, {-16, -4}, {14, 15}, {-17, -3}, {-18, 16}, {17, -19}, {-2, 18}, {-20, 19},
88cabdff1aSopenharmony_ci        {-1, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32}
89cabdff1aSopenharmony_ci    },
90cabdff1aSopenharmony_ci    {
91cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, -12}, {6, -11}, {7, 8}, {-10, -13}, {-9, 9}, {-8, -14}, {10, -7}, {11, -15},
92cabdff1aSopenharmony_ci        {-6, 12}, {-5, 13}, {-4, -16}, {14, 15}, {-3, -17}, {16, 17}, {-18, -2}, {18, -19}, {-1, 19},
93cabdff1aSopenharmony_ci        {-20, 20}, {-21, 21}, {22, 0}, {-22, -23}, {-32, -32}
94cabdff1aSopenharmony_ci    },
95cabdff1aSopenharmony_ci    {
96cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {5, -12}, {-13, 6}, {-11, 7}, {-14, 8}, {-10, 9}, {-15, -9}, {-8, 10}, {-7, -16},
97cabdff1aSopenharmony_ci        {11, -6}, {12, -5}, {-17, 13}, {14, -18}, {15, -4}, {16, -19}, {17, -3}, {18, -2}, {19, -1},
98cabdff1aSopenharmony_ci        {-20, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32}
99cabdff1aSopenharmony_ci    },
100cabdff1aSopenharmony_ci    {
101cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
102cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
103cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
104cabdff1aSopenharmony_ci    },
105cabdff1aSopenharmony_ci    {
106cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
107cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
108cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
109cabdff1aSopenharmony_ci    },
110cabdff1aSopenharmony_ci    {
111cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
112cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
113cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
114cabdff1aSopenharmony_ci    },
115cabdff1aSopenharmony_ci    {
116cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
117cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
118cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
119cabdff1aSopenharmony_ci    },
120cabdff1aSopenharmony_ci    {
121cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
122cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
123cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
124cabdff1aSopenharmony_ci    },
125cabdff1aSopenharmony_ci    {
126cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
127cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
128cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
129cabdff1aSopenharmony_ci    },
130cabdff1aSopenharmony_ci    {
131cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
132cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
133cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
134cabdff1aSopenharmony_ci    },
135cabdff1aSopenharmony_ci    {
136cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
137cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
138cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
139cabdff1aSopenharmony_ci    },
140cabdff1aSopenharmony_ci    {
141cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
142cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
143cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
144cabdff1aSopenharmony_ci    },
145cabdff1aSopenharmony_ci    {
146cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
147cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
148cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
149cabdff1aSopenharmony_ci    },
150cabdff1aSopenharmony_ci    {
151cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
152cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
153cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
154cabdff1aSopenharmony_ci    },
155cabdff1aSopenharmony_ci    {
156cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
157cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
158cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
159cabdff1aSopenharmony_ci    },
160cabdff1aSopenharmony_ci    {
161cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
162cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
163cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
164cabdff1aSopenharmony_ci    },
165cabdff1aSopenharmony_ci    {
166cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
167cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
168cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
169cabdff1aSopenharmony_ci    },
170cabdff1aSopenharmony_ci    {
171cabdff1aSopenharmony_ci        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
172cabdff1aSopenharmony_ci        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
173cabdff1aSopenharmony_ci        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
174cabdff1aSopenharmony_ci    },
175cabdff1aSopenharmony_ci};
176cabdff1aSopenharmony_ci
177cabdff1aSopenharmony_cistatic const uint16_t decoder_tree0[360] = {
178cabdff1aSopenharmony_ci    2, 1, 4, 6, 8, 10, 12, 14, 16, 18, 33, 3, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 35, 40,
179cabdff1aSopenharmony_ci    42, 44, 46, 5, 48, 65, 50, 52, 54, 56, 58, 60, 62, 64, 37, 66, 67, 68, 97, 70, 72, 74, 7,
180cabdff1aSopenharmony_ci    76, 78, 80, 82, 84, 86, 88, 99, 90, 39, 92, 94, 96, 129, 98, 9, 100, 102, 104, 106, 108,
181cabdff1aSopenharmony_ci    110, 112, 41, 161, 69, 114, 116, 118, 131, 120, 122, 11, 124, 126, 128, 193, 130, 132, 71,
182cabdff1aSopenharmony_ci    134, 43, 136, 138, 140, 163, 101, 13, 142, 144, 146, 148, 150, 152, 154, 225, 156, 158, 195,
183cabdff1aSopenharmony_ci    160, 162, 45, 164, 15, 166, 73, 168, 170, 133, 47, 172, 257, 174, 176, 178, 75, 103, 180, 165,
184cabdff1aSopenharmony_ci    182, 17, 227, 184, 105, 49, 135, 186, 289, 188, 259, 190, 192, 194, 196, 198, 291, 77, 200,
185cabdff1aSopenharmony_ci    202, 197, 107, 204, 19, 51, 229, 206, 167, 208, 210, 212, 214, 21, 79, 81, 109, 216, 218, 220,
186cabdff1aSopenharmony_ci    222, 53, 137, 224, 199, 226, 323, 321, 169, 228, 111, 230, 232, 139, 261, 234, 83, 236, 201,
187cabdff1aSopenharmony_ci    238, 240, 293, 242, 353, 231, 141, 244, 246, 113, 23, 355, 85, 248, 55, 115, 250, 263, 252,
188cabdff1aSopenharmony_ci    254, 203, 171, 256, 258, 233, 235, 143, 357, 325, 260, 295, 262, 173, 145, 177, 87, 264, 327,
189cabdff1aSopenharmony_ci    267, 266, 268, 175, 270, 272, 117, 297, 274, 265, 147, 179, 205, 276, 207, 237, 269, 278, 57,
190cabdff1aSopenharmony_ci    59, 387, 209, 280, 282, 149, 329, 385, 284, 25, 286, 239, 119, 288, 27, 290, 292, 299, 294, 359,
191cabdff1aSopenharmony_ci    89, 296, 298, 419, 181, 300, 331, 271, 417, 211, 361, 151, 389, 241, 302, 304, 303, 306, 308,
192cabdff1aSopenharmony_ci    421, 91, 310, 312, 391, 314, 121, 316, 333, 318, 275, 213, 301, 243, 183, 335, 320, 363, 322,
193cabdff1aSopenharmony_ci    215, 324, 393, 273, 337, 153, 326, 423, 365, 328, 367, 247, 395, 185, 123, 330, 425, 245, 155,
194cabdff1aSopenharmony_ci    332, 334, 305, 397, 336, 277, 217, 338, 340, 339, 427, 342, 344, 346, 307, 399, 187, 348, 309,
195cabdff1aSopenharmony_ci    341, 350, 369, 279, 311, 429, 249, 219, 352, 354, 356, 358, 431, 373, 401, 371, 313, 281, 433,
196cabdff1aSopenharmony_ci    343, 403, 251, 283
197cabdff1aSopenharmony_ci};
198cabdff1aSopenharmony_ci
199cabdff1aSopenharmony_cistatic const uint16_t decoder_tree1[188] = {
200cabdff1aSopenharmony_ci    2, 1, 4, 6, 8, 10, 12, 14, 16, 3, 33, 18, 20, 22, 24, 26, 35, 28, 30, 32, 34, 36, 5, 65, 38, 40,
201cabdff1aSopenharmony_ci    37, 42, 44, 46, 67, 48, 50, 52, 54, 56, 58, 60, 7, 62, 39, 97, 64, 69, 66, 99, 68, 70, 72, 74, 76,
202cabdff1aSopenharmony_ci    78, 80, 129, 41, 131, 82, 9, 71, 84, 86, 101, 88, 90, 92, 94, 96, 161, 43, 11, 73, 98, 103, 100,
203cabdff1aSopenharmony_ci    163, 102, 104, 106, 108, 133, 110, 105, 112, 75, 114, 45, 13, 116, 165, 118, 195, 135, 193, 120, 77,
204cabdff1aSopenharmony_ci    122, 47, 124, 167, 225, 126, 79, 107, 227, 128, 137, 197, 15, 130, 169, 199, 132, 109, 134, 17, 139,
205cabdff1aSopenharmony_ci    49, 136, 229, 138, 140, 81, 259, 142, 144, 171, 146, 141, 148, 111, 150, 201, 231, 152, 51, 257, 289,
206cabdff1aSopenharmony_ci    154, 19, 113, 156, 261, 158, 203, 173, 263, 143, 160, 291, 235, 83, 162, 233, 265, 164, 205, 166, 293,
207cabdff1aSopenharmony_ci    145, 168, 175, 177, 237, 115, 295, 170, 207, 172, 267, 174, 176, 297, 147, 178, 180, 269, 182, 271,
208cabdff1aSopenharmony_ci    209, 299, 239, 179, 184, 301, 241, 211, 0, 0
209cabdff1aSopenharmony_ci};
210cabdff1aSopenharmony_ci
211cabdff1aSopenharmony_cistatic const uint16_t decoder_tree2[96] = {
212cabdff1aSopenharmony_ci    2, 1, 4, 6, 8, 10, 12, 3, 17, 14, 19, 16, 18, 20, 22, 24, 26, 5, 21, 35, 33, 28, 30, 32, 34, 36, 38, 37,
213cabdff1aSopenharmony_ci    40, 23, 51, 42, 7, 49, 44, 46, 48, 50, 39, 53, 52, 54, 56, 25, 67, 9, 58, 60, 65, 55, 41, 62, 64, 69, 66,
214cabdff1aSopenharmony_ci    11, 27, 68, 57, 83, 70, 71, 81, 43, 72, 74, 13, 76, 85, 29, 73, 78, 99, 59, 87, 101, 80, 97, 45, 82, 84,
215cabdff1aSopenharmony_ci    75, 89, 61, 86, 103, 88, 77, 90, 105, 91, 92, 107, 93, 0, 0
216cabdff1aSopenharmony_ci};
217cabdff1aSopenharmony_ci
218cabdff1aSopenharmony_cistatic const uint16_t decoder_tree3[1040] = {
219cabdff1aSopenharmony_ci    2, 4, 6, 8, 10, 1, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 3, 36, 1025, 38, 40, 42, 44, 46, 48, 50,
220cabdff1aSopenharmony_ci    129, 17, 52, 54, 1153, 19, 56, 58, 60, 62, 64, 66, 68, 145, 70, 72, 74, 76, 78, 1169, 1027, 147, 80, 82, 1171,
221cabdff1aSopenharmony_ci    84, 86, 131, 88, 1155, 1043, 1041, 90, 92, 5, 94, 96, 98, 100, 102, 104, 21, 106, 108, 2049, 2177, 110, 112, 114,
222cabdff1aSopenharmony_ci    116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 33, 144, 163, 146, 148, 150, 152, 154, 161,
223cabdff1aSopenharmony_ci    156, 35, 158, 1297, 160, 162, 273, 257, 164, 166, 149, 168, 1281, 170, 172, 2193, 174, 176, 178, 1299, 180, 1045,
224cabdff1aSopenharmony_ci    182, 184, 1173, 186, 3201, 188, 190, 192, 194, 2195, 1187, 23, 2179, 196, 7, 198, 275, 200, 2051, 202, 2065, 204,
225cabdff1aSopenharmony_ci    206, 1029, 1185, 208, 210, 1157, 37, 3073, 2067, 133, 212, 214, 2321, 216, 165, 218, 1059, 220, 1283, 222, 2305,
226cabdff1aSopenharmony_ci    224, 226, 228, 230, 259, 232, 234, 2323, 236, 1409, 1057, 1315, 238, 240, 242, 244, 246, 1425, 248, 1313, 250, 252,
227cabdff1aSopenharmony_ci    254, 256, 258, 260, 289, 262, 264, 1189, 266, 268, 179, 151, 270, 272, 274, 276, 278, 291, 280, 282, 9, 385, 284,
228cabdff1aSopenharmony_ci    286, 177, 49, 401, 1061, 288, 290, 292, 51, 294, 296, 298, 300, 302, 304, 25, 306, 2083, 39, 308, 310, 3329, 167,
229cabdff1aSopenharmony_ci    312, 314, 1175, 316, 318, 1203, 135, 320, 322, 324, 326, 328, 2211, 2307, 330, 1301, 332, 334, 1047, 336, 338, 2449,
230cabdff1aSopenharmony_ci    3217, 340, 1427, 2209, 53, 342, 2339, 3345, 344, 346, 348, 403, 181, 4097, 2197, 350, 2181, 1285, 1317, 1031, 352,
231cabdff1aSopenharmony_ci    354, 356, 3089, 358, 360, 4225, 277, 362, 364, 366, 368, 2069, 370, 3203, 293, 1201, 305, 372, 3219, 307, 2433, 374,
232cabdff1aSopenharmony_ci    376, 378, 380, 2081, 1411, 382, 384, 3075, 1443, 513, 386, 387, 388, 390, 1331, 261, 392, 394, 396, 398, 400, 1441,
233cabdff1aSopenharmony_ci    1075, 67, 1159, 402, 404, 406, 408, 410, 412, 414, 3347, 2325, 416, 65, 418, 420, 422, 424, 426, 2053, 193, 1073, 428,
234cabdff1aSopenharmony_ci    430, 432, 1537, 1329, 2337, 2213, 434, 417, 183, 41, 436, 438, 440, 442, 444, 446, 448, 450, 195, 2435, 452, 2085, 1063,
235cabdff1aSopenharmony_ci    1191, 454, 456, 458, 460, 419, 2071, 1553, 3091, 55, 137, 462, 464, 466, 468, 470, 472, 474, 476, 478, 2309, 4113, 480,
236cabdff1aSopenharmony_ci    482, 484, 486, 2451, 2465, 1205, 153, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 516, 518,
237cabdff1aSopenharmony_ci    520, 522, 524, 1333, 526, 1555, 2467, 2227, 3205, 3331, 528, 530, 532, 534, 536, 538, 540, 542, 544, 546, 548, 529, 309,
238cabdff1aSopenharmony_ci    1303, 3473, 3457, 389, 1569, 1445, 1077, 69, 2199, 1539, 4353, 550, 552, 554, 556, 558, 560, 562, 1459, 4241, 3221, 1429,
239cabdff1aSopenharmony_ci    2341, 279, 3475, 169, 564, 545, 3105, 323, 2353, 2097, 3235, 421, 2229, 3107, 3233, 566, 568, 570, 572, 574, 576, 578,
240cabdff1aSopenharmony_ci    580, 582, 584, 586, 588, 590, 592, 594, 596, 2099, 1091, 531, 2437, 4227, 405, 197, 263, 1287, 2577, 1049, 1571, 598, 600,
241cabdff1aSopenharmony_ci    602, 604, 606, 608, 610, 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, 650,
242cabdff1aSopenharmony_ci    1345, 1219, 3077, 1457, 2225, 2579, 515, 2561, 2469, 433, 1221, 2183, 4243, 652, 654, 656, 658, 660, 662, 664, 666, 668,
243cabdff1aSopenharmony_ci    670, 1217, 3333, 3093, 435, 321, 4369, 1089, 2055, 4099, 3361, 1319, 547, 1161, 1177, 672, 2355, 4115, 1413, 4257, 3349,
244cabdff1aSopenharmony_ci    2453, 3109, 2357, 2215, 3363, 1079, 1207, 311, 1033, 1347, 1065, 674, 676, 678, 680, 682, 684, 686, 688, 690, 692, 694, 696,
245cabdff1aSopenharmony_ci    698, 700, 702, 704, 706, 708, 710, 712, 714, 716, 718, 720, 722, 724, 726, 728, 730, 732, 734, 736, 738, 740, 742, 744, 746,
246cabdff1aSopenharmony_ci    748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 782, 784, 786, 788, 790, 792, 794, 796,
247cabdff1aSopenharmony_ci    798, 800, 802, 804, 806, 808, 810, 812, 814, 2593, 2565, 4261, 3253, 437, 325, 3489, 2311, 4259, 1431, 2087, 2563, 295, 2343,
248cabdff1aSopenharmony_ci    449, 199, 265, 2201, 4371, 1193, 816, 533, 1557, 2581, 2241, 3365, 3491, 3603, 549, 2101, 1461, 1093, 2117, 3459, 3079, 4481,
249cabdff1aSopenharmony_ci    3095, 2327, 3461, 4129, 3249, 1447, 2471, 2231, 71, 4497, 2609, 1289, 393, 3251, 2073, 3097, 2371, 1305, 2089, 818, 820, 822,
250cabdff1aSopenharmony_ci    824, 826, 828, 830, 832, 834, 836, 838, 840, 842, 844, 846, 848, 850, 852, 854, 856, 858, 860, 862, 864, 866, 868, 870, 872,
251cabdff1aSopenharmony_ci    874, 876, 878, 880, 882, 884, 886, 888, 890, 892, 894, 896, 898, 900, 902, 904, 906, 908, 910, 912, 914, 916, 918, 920, 922,
252cabdff1aSopenharmony_ci    924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 944, 946, 948, 950, 952, 954, 956, 958, 960, 962, 964, 966, 968, 970, 972,
253cabdff1aSopenharmony_ci    974, 976, 978, 980, 982, 984, 986, 988, 990, 992, 994, 996, 998, 1000, 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018,
254cabdff1aSopenharmony_ci    1020, 1022, 1024, 1026, 1028, 1030, 1032, 1034, 1036, 4161, 4273, 3507, 3493, 4517, 2497, 1573, 2597, 3621, 4531, 4627, 3523,
255cabdff1aSopenharmony_ci    3125, 4149, 4529, 3139, 4515, 451, 4277, 2113, 4163, 4499, 3381, 4405, 1473, 4373, 2485, 3509, 565, 1589, 2613, 3585, 3123,
256cabdff1aSopenharmony_ci    4403, 3141, 4147, 563, 2245, 3269, 4357, 1349, 2373, 3397, 453, 1477, 2501, 2481, 579, 1601, 3477, 4103, 3265, 2243, 1587,
257cabdff1aSopenharmony_ci    3207, 4231, 3267, 4501, 1475, 3335, 4359, 391, 1415, 2439, 3463, 4487, 519, 1543, 2567, 3591, 4609, 4289, 4611, 2499, 4119,
258cabdff1aSopenharmony_ci    4385, 4145, 4401, 3223, 4247, 3379, 577, 3393, 3351, 4375, 407, 1585, 2455, 3479, 4503, 535, 1559, 2583, 3607, 3605, 4513,
259cabdff1aSopenharmony_ci    4485, 3111, 4135, 3121, 517, 3377, 3239, 4263, 1541, 4291, 4229, 3367, 4391, 423, 2115, 4131, 3495, 551, 1575, 2599, 3635, 3395,
260cabdff1aSopenharmony_ci    2103, 3127, 4151, 3589, 4101, 1603, 3255, 4279, 3601, 1335, 2359, 3383, 439, 1463, 2487, 3511, 567, 1591, 4133, 1095, 2119, 3143,
261cabdff1aSopenharmony_ci    2369, 1223, 2247, 3271, 327, 1351, 2375, 455, 1479, 3137, 3521, 2057, 3081, 4105, 4387, 3505, 2185, 3209, 4233, 3587, 4355, 2313,
262cabdff1aSopenharmony_ci    3337, 3237, 1417, 2441, 3465, 521, 1545, 3617, 3633, 561, 4625, 4121, 2611, 2483, 2595, 3225, 4249, 281, 4245, 2329, 3353, 409,
263cabdff1aSopenharmony_ci    1433, 2457, 3481, 537, 1561, 4483, 3619, 4389, 3113, 4275, 4117, 2217, 3241, 297, 1321, 2345, 3369, 425, 1449, 2473, 57, 1081,
264cabdff1aSopenharmony_ci    2105, 3129, 185, 1209, 2233, 3257, 313, 1337, 2361, 441, 1465, 73, 1097, 201, 1225, 0, 0
265cabdff1aSopenharmony_ci};
266cabdff1aSopenharmony_ci
267cabdff1aSopenharmony_cistatic const uint16_t decoder_tree4[416] = {
268cabdff1aSopenharmony_ci    2, 4, 6, 1, 8, 10, 12, 14, 16, 18, 20, 22, 24, 3, 129, 26, 28, 9, 33, 30, 32,
269cabdff1aSopenharmony_ci    34, 36, 11, 161, 38, 40, 42, 41, 44, 46, 131, 43, 169, 35, 48, 137, 50, 52, 54, 56, 139,
270cabdff1aSopenharmony_ci    163, 171, 58, 60, 62, 64, 5, 66, 68, 70, 257, 72, 74, 76, 13, 78, 80, 289, 82, 84, 17,
271cabdff1aSopenharmony_ci    86, 88, 65, 90, 201, 19, 92, 94, 51, 193, 96, 98, 49, 100, 73, 102, 104, 106, 45, 108, 110,
272cabdff1aSopenharmony_ci    297, 112, 114, 116, 37, 203, 118, 120, 179, 122, 177, 124, 265, 126, 75, 133, 259, 291, 147, 128, 67,
273cabdff1aSopenharmony_ci    195, 130, 141, 173, 299, 132, 145, 134, 165, 136, 138, 140, 142, 7, 144, 146, 21, 267, 148, 53, 150,
274cabdff1aSopenharmony_ci    321, 152, 154, 15, 156, 81, 158, 160, 385, 162, 417, 164, 166, 168, 83, 170, 172, 329, 174, 211, 176,
275cabdff1aSopenharmony_ci    27, 178, 180, 182, 209, 184, 186, 188, 190, 25, 192, 331, 194, 196, 105, 57, 198, 97, 200, 202, 323,
276cabdff1aSopenharmony_ci    225, 59, 149, 204, 206, 233, 307, 208, 77, 181, 210, 212, 214, 216, 218, 220, 222, 47, 224, 226, 69,
277cabdff1aSopenharmony_ci    228, 230, 197, 232, 425, 393, 205, 275, 293, 39, 234, 236, 238, 305, 135, 155, 301, 143, 240, 242, 235,
278cabdff1aSopenharmony_ci    395, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 273, 269, 185, 264, 266, 268, 270, 272, 274, 276,
279cabdff1aSopenharmony_ci    261, 153, 278, 280, 282, 187, 337, 387, 107, 284, 427, 227, 167, 419, 286, 288, 290, 292, 294, 296, 298,
280cabdff1aSopenharmony_ci    300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 115,
281cabdff1aSopenharmony_ci    99, 85, 213, 29, 113, 23, 89, 241, 61, 449, 339, 175, 340, 342, 344, 346, 348, 350, 352, 354, 356,
282cabdff1aSopenharmony_ci    358, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398,
283cabdff1aSopenharmony_ci    400, 402, 404, 406, 408, 410, 412, 414, 389, 361, 457, 465, 429, 451, 333, 109, 277, 243, 263, 295, 199,
284cabdff1aSopenharmony_ci    283, 151, 55, 183, 229, 357, 363, 123, 491, 397, 411, 251, 313, 441, 467, 345, 433, 461, 219, 237, 365,
285cabdff1aSopenharmony_ci    435, 353, 347, 405, 409, 217, 309, 437, 369, 371, 341, 117, 245, 249, 157, 285, 403, 189, 317, 93, 221,
286cabdff1aSopenharmony_ci    315, 401, 481, 391, 489, 121, 421, 423, 71, 483, 327, 103, 231, 443, 459, 271, 399, 355, 91, 303, 431,
287cabdff1aSopenharmony_ci    79, 207, 335, 111, 239, 281, 325, 279, 453, 101, 311, 87, 215, 31, 159, 63, 191
288cabdff1aSopenharmony_ci};
289cabdff1aSopenharmony_ci
290cabdff1aSopenharmony_cistatic const uint16_t decoder_tree5[384] = {
291cabdff1aSopenharmony_ci    2, 4, 1, 6, 8, 10, 12, 14, 16, 18, 20, 22, 3, 513, 24, 26, 28, 9, 129, 33, 30, 32, 34, 36, 38, 40, 11, 42, 641, 44, 46, 41,
292cabdff1aSopenharmony_ci    161, 48, 515, 50, 52, 131, 54, 35, 545, 137, 56, 58, 60, 521, 62, 43, 673, 64, 169, 66, 68, 523, 70, 163, 643, 139, 553, 72, 649, 74, 547,
293cabdff1aSopenharmony_ci    76, 78, 80, 681, 171, 82, 84, 555, 86, 675, 88, 651, 5, 90, 92, 1025, 94, 96, 98, 683, 13,
294cabdff1aSopenharmony_ci    100, 17, 102, 104, 106, 65, 108, 110, 257, 112, 114, 1153, 19, 116, 118, 120, 122, 124, 49, 126, 128,
295cabdff1aSopenharmony_ci    769, 289, 130, 132, 134, 73, 136, 138, 140, 142, 193, 144, 146, 148, 150, 152, 154, 517, 156, 158, 37,
296cabdff1aSopenharmony_ci    51, 160, 201, 162, 145, 164, 166, 168, 133, 170, 801, 45, 172, 174, 1057, 176, 178, 67, 180, 1027, 577,
297cabdff1aSopenharmony_ci    182, 184, 186, 188, 190, 192, 194, 196, 198, 259, 200, 202, 204, 525, 177, 265, 141, 206, 208, 210, 212,
298cabdff1aSopenharmony_ci    195, 297, 214, 75, 216, 1033, 203, 585, 1155, 1185, 267, 1161, 549, 218, 220, 657, 777, 147, 222, 224, 226,
299cabdff1aSopenharmony_ci    228, 230, 232, 234, 236, 238, 240, 587, 645, 165, 242, 244, 246, 248, 250, 771, 291, 252, 579, 1065, 1035,
300cabdff1aSopenharmony_ci    705, 531, 529, 659, 173, 254, 561, 653, 256, 713, 677, 557, 258, 260, 262, 264, 266, 268, 270, 272, 274,
301cabdff1aSopenharmony_ci    276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 707, 1059, 809, 715, 563, 179, 691, 1193,
302cabdff1aSopenharmony_ci    21, 779, 1067, 299, 1187, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332,
303cabdff1aSopenharmony_ci    334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374,
304cabdff1aSopenharmony_ci    376, 378, 380, 83, 69, 1281, 803, 321, 1195, 1163, 811, 1323, 689, 1321, 1099, 305, 835, 1227, 331, 843, 785,
305cabdff1aSopenharmony_ci    593, 1043, 1291, 1283, 1171, 275, 787, 1217, 833, 1075, 1313, 1219, 1203, 307, 819, 841, 595, 211, 723, 721, 817,
306cabdff1aSopenharmony_ci    1029, 329, 81, 1157, 261, 773, 1097, 1089, 1061, 1169, 1091, 1189, 293, 805, 1201, 581, 197, 709, 1289, 273, 1037,
307cabdff1aSopenharmony_ci    1315, 1041, 1165, 269, 781, 209, 1073, 1069, 323, 685, 1197, 301, 813, 77, 589, 205, 717, 1225, 533, 149, 661,
308cabdff1aSopenharmony_ci    53, 565, 181, 693, 0, 0
309cabdff1aSopenharmony_ci};
310cabdff1aSopenharmony_ci
311cabdff1aSopenharmony_cistatic const uint16_t decoder_tree6[62] = {
312cabdff1aSopenharmony_ci    2, 1, 4, 6, 8, 10, 12, 14, 16, 3, 33, 5, 17, 9, 18, 20, 22, 24, 26, 28, 30, 32, 34, 7, 49, 13, 25, 36, 38, 11,
313cabdff1aSopenharmony_ci    21, 41, 35, 37, 19, 40, 42, 44, 46, 48, 50, 15, 52, 57, 29, 27, 23, 53, 54, 51, 39, 45, 43, 56, 58, 31, 55, 60,
314cabdff1aSopenharmony_ci    61, 47, 59, 63
315cabdff1aSopenharmony_ci};
316cabdff1aSopenharmony_ci
317cabdff1aSopenharmony_cistatic const uint16_t *const decoder_tables[7] = {
318cabdff1aSopenharmony_ci    decoder_tree0,
319cabdff1aSopenharmony_ci    decoder_tree1,
320cabdff1aSopenharmony_ci    decoder_tree2,
321cabdff1aSopenharmony_ci    decoder_tree3,
322cabdff1aSopenharmony_ci    decoder_tree4,
323cabdff1aSopenharmony_ci    decoder_tree5,
324cabdff1aSopenharmony_ci    decoder_tree6,
325cabdff1aSopenharmony_ci};
326cabdff1aSopenharmony_ci
327cabdff1aSopenharmony_cistatic const int decoder_tables_elements[7] = {
328cabdff1aSopenharmony_ci    FF_ARRAY_ELEMS(decoder_tree0),
329cabdff1aSopenharmony_ci    FF_ARRAY_ELEMS(decoder_tree1),
330cabdff1aSopenharmony_ci    FF_ARRAY_ELEMS(decoder_tree2),
331cabdff1aSopenharmony_ci    FF_ARRAY_ELEMS(decoder_tree3),
332cabdff1aSopenharmony_ci    FF_ARRAY_ELEMS(decoder_tree4),
333cabdff1aSopenharmony_ci    FF_ARRAY_ELEMS(decoder_tree5),
334cabdff1aSopenharmony_ci    FF_ARRAY_ELEMS(decoder_tree6),
335cabdff1aSopenharmony_ci};
336cabdff1aSopenharmony_ci
337cabdff1aSopenharmony_cistatic const float mlt_quant[7][14] = {
338cabdff1aSopenharmony_ci    { 0.0f, 0.392f, 0.761f, 1.120f, 1.477f, 1.832f, 2.183f, 2.541f, 2.893f, 3.245f, 3.598f, 3.942f, 4.288f, 4.724f },
339cabdff1aSopenharmony_ci    { 0.0f, 0.544f, 1.060f, 1.563f, 2.068f, 2.571f, 3.072f, 3.562f, 4.070f, 4.620f, 0.0f, 0.0f, 0.0f, 0.0f },
340cabdff1aSopenharmony_ci    { 0.0f, 0.746f, 1.464f, 2.180f, 2.882f, 3.584f, 4.316f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
341cabdff1aSopenharmony_ci    { 0.0f, 1.006f, 2.000f, 2.993f, 3.985f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
342cabdff1aSopenharmony_ci    { 0.0f, 1.321f, 2.703f, 3.983f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
343cabdff1aSopenharmony_ci    { 0.0f, 1.657f, 3.491f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
344cabdff1aSopenharmony_ci    { 0.0f, 1.964f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }
345cabdff1aSopenharmony_ci};
346cabdff1aSopenharmony_ci
347cabdff1aSopenharmony_cistatic const float noise_category5[21] = {
348cabdff1aSopenharmony_ci    0.70711f, 0.6179f, 0.5005f, 0.3220f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f,
349cabdff1aSopenharmony_ci    0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f
350cabdff1aSopenharmony_ci};
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_cistatic const float noise_category6[21] = {
353cabdff1aSopenharmony_ci    0.70711f, 0.5686f, 0.3563f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f,
354cabdff1aSopenharmony_ci    0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f
355cabdff1aSopenharmony_ci};
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci#define FRAME_SIZE 320
358cabdff1aSopenharmony_ci#define REGION_SIZE 20
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_citypedef struct SirenContext {
361cabdff1aSopenharmony_ci    GetBitContext gb;
362cabdff1aSopenharmony_ci
363cabdff1aSopenharmony_ci    int microsoft;
364cabdff1aSopenharmony_ci    int rate_control_possibilities;
365cabdff1aSopenharmony_ci    int esf_adjustment;
366cabdff1aSopenharmony_ci    int number_of_regions;
367cabdff1aSopenharmony_ci    int scale_factor;
368cabdff1aSopenharmony_ci    int sample_rate_bits;
369cabdff1aSopenharmony_ci    int checksum_bits;
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ci    unsigned dw1, dw2, dw3, dw4;
372cabdff1aSopenharmony_ci
373cabdff1aSopenharmony_ci    int absolute_region_power_index[32];
374cabdff1aSopenharmony_ci    float decoder_standard_deviation[32];
375cabdff1aSopenharmony_ci    int power_categories[32];
376cabdff1aSopenharmony_ci    int category_balance[32];
377cabdff1aSopenharmony_ci    float standard_deviation[64];
378cabdff1aSopenharmony_ci    float backup_frame[FRAME_SIZE];
379cabdff1aSopenharmony_ci
380cabdff1aSopenharmony_ci    AVFloatDSPContext *fdsp;
381cabdff1aSopenharmony_ci    av_tx_fn           tx_fn;
382cabdff1aSopenharmony_ci    AVTXContext       *tx_ctx;
383cabdff1aSopenharmony_ci
384cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, float, imdct_buf)[4][FRAME_SIZE];
385cabdff1aSopenharmony_ci    float          *window;
386cabdff1aSopenharmony_ci    float          *imdct_in;
387cabdff1aSopenharmony_ci    float          *imdct_out;
388cabdff1aSopenharmony_ci    float          *imdct_prev;
389cabdff1aSopenharmony_ci} SirenContext;
390cabdff1aSopenharmony_ci
391cabdff1aSopenharmony_cistatic av_cold int siren_init(AVCodecContext *avctx)
392cabdff1aSopenharmony_ci{
393cabdff1aSopenharmony_ci    const float scale = 1.0f / (22.f * 32768.f);
394cabdff1aSopenharmony_ci    SirenContext *s = avctx->priv_data;
395cabdff1aSopenharmony_ci    int i;
396cabdff1aSopenharmony_ci
397cabdff1aSopenharmony_ci    s->imdct_in   = s->imdct_buf[0];
398cabdff1aSopenharmony_ci    s->imdct_out  = s->imdct_buf[1];
399cabdff1aSopenharmony_ci    s->imdct_prev = s->imdct_buf[2];
400cabdff1aSopenharmony_ci    s->window     = s->imdct_buf[3];
401cabdff1aSopenharmony_ci
402cabdff1aSopenharmony_ci    av_channel_layout_uninit(&avctx->ch_layout);
403cabdff1aSopenharmony_ci    avctx->ch_layout      = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO;
404cabdff1aSopenharmony_ci    avctx->sample_fmt     = AV_SAMPLE_FMT_FLT;
405cabdff1aSopenharmony_ci
406cabdff1aSopenharmony_ci    s->rate_control_possibilities = 16;
407cabdff1aSopenharmony_ci    s->esf_adjustment = 7;
408cabdff1aSopenharmony_ci    s->number_of_regions = 14;
409cabdff1aSopenharmony_ci    s->scale_factor = 22;
410cabdff1aSopenharmony_ci    s->dw1 = s->dw2 = s->dw3 = s->dw4 = 1;
411cabdff1aSopenharmony_ci
412cabdff1aSopenharmony_ci    for (i = 0; i < 64; i++) {
413cabdff1aSopenharmony_ci        float region_power = powf(10, (i - 24) * 0.3010299957);
414cabdff1aSopenharmony_ci
415cabdff1aSopenharmony_ci        s->standard_deviation[i] = sqrtf(region_power);
416cabdff1aSopenharmony_ci    }
417cabdff1aSopenharmony_ci
418cabdff1aSopenharmony_ci    for (i = 0; i < FRAME_SIZE; i++) {
419cabdff1aSopenharmony_ci        float angle = ((i + 0.5f) * M_PI_2) / 320.f;
420cabdff1aSopenharmony_ci        s->window[i] = sinf(angle);
421cabdff1aSopenharmony_ci    }
422cabdff1aSopenharmony_ci
423cabdff1aSopenharmony_ci    s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
424cabdff1aSopenharmony_ci    if (!s->fdsp)
425cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
426cabdff1aSopenharmony_ci
427cabdff1aSopenharmony_ci    s->microsoft = avctx->codec->id == AV_CODEC_ID_MSNSIREN;
428cabdff1aSopenharmony_ci    if (s->microsoft) {
429cabdff1aSopenharmony_ci        s->esf_adjustment = -2;
430cabdff1aSopenharmony_ci        s->number_of_regions = 14;
431cabdff1aSopenharmony_ci        s->scale_factor = 1;
432cabdff1aSopenharmony_ci        s->sample_rate_bits = 2;
433cabdff1aSopenharmony_ci        s->checksum_bits = 4;
434cabdff1aSopenharmony_ci    }
435cabdff1aSopenharmony_ci
436cabdff1aSopenharmony_ci    return av_tx_init(&s->tx_ctx, &s->tx_fn, AV_TX_FLOAT_MDCT, 1, FRAME_SIZE, &scale, 0);
437cabdff1aSopenharmony_ci}
438cabdff1aSopenharmony_ci
439cabdff1aSopenharmony_cistatic int decode_envelope(SirenContext *s, GetBitContext *gb,
440cabdff1aSopenharmony_ci                           int number_of_regions, float *decoder_standard_deviation,
441cabdff1aSopenharmony_ci                           int *absolute_region_power_index, int esf_adjustment)
442cabdff1aSopenharmony_ci{
443cabdff1aSopenharmony_ci    absolute_region_power_index[0] = (int)get_bits(gb, 5) - esf_adjustment;
444cabdff1aSopenharmony_ci    absolute_region_power_index[0] = av_clip(absolute_region_power_index[0], -24, 39);
445cabdff1aSopenharmony_ci    decoder_standard_deviation[0] = s->standard_deviation[absolute_region_power_index[0] + 24];
446cabdff1aSopenharmony_ci
447cabdff1aSopenharmony_ci    for (int i = 1; i < number_of_regions; i++) {
448cabdff1aSopenharmony_ci        int index = 0;
449cabdff1aSopenharmony_ci
450cabdff1aSopenharmony_ci        do {
451cabdff1aSopenharmony_ci            if (get_bits_left(gb) < 4 + number_of_regions - i + s->checksum_bits)
452cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
453cabdff1aSopenharmony_ci            index = differential_decoder_tree[i - 1][index][get_bits1(gb)];
454cabdff1aSopenharmony_ci        } while (index > 0);
455cabdff1aSopenharmony_ci
456cabdff1aSopenharmony_ci        absolute_region_power_index[i] = av_clip(absolute_region_power_index[i - 1] - index - 12, -24, 39);
457cabdff1aSopenharmony_ci        decoder_standard_deviation[i] = s->standard_deviation[absolute_region_power_index[i] + 24];
458cabdff1aSopenharmony_ci    }
459cabdff1aSopenharmony_ci
460cabdff1aSopenharmony_ci    return get_bits_count(gb);
461cabdff1aSopenharmony_ci}
462cabdff1aSopenharmony_ci
463cabdff1aSopenharmony_cistatic int categorize_regions(int number_of_regions, int number_of_available_bits,
464cabdff1aSopenharmony_ci                              int *absolute_region_power_index, int *power_categories,
465cabdff1aSopenharmony_ci                              int *category_balance)
466cabdff1aSopenharmony_ci{
467cabdff1aSopenharmony_ci    int region, delta, i, temp;
468cabdff1aSopenharmony_ci    int expected_number_of_code_bits;
469cabdff1aSopenharmony_ci    int min, max;
470cabdff1aSopenharmony_ci    int offset, num_rate_control_possibilities = 16,
471cabdff1aSopenharmony_ci        raw_value, raw_max_idx = 0, raw_min_idx = 0;
472cabdff1aSopenharmony_ci    int max_rate_categories[28];
473cabdff1aSopenharmony_ci    int min_rate_categories[28];
474cabdff1aSopenharmony_ci    int temp_category_balances[64];
475cabdff1aSopenharmony_ci    int *min_rate_ptr = NULL;
476cabdff1aSopenharmony_ci    int *max_rate_ptr = NULL;
477cabdff1aSopenharmony_ci
478cabdff1aSopenharmony_ci    offset = -32;
479cabdff1aSopenharmony_ci    for (delta = 32; number_of_regions > 0 && delta > 0; delta /= 2) {
480cabdff1aSopenharmony_ci        expected_number_of_code_bits = 0;
481cabdff1aSopenharmony_ci        for (region = 0; region < number_of_regions; region++) {
482cabdff1aSopenharmony_ci            i = (delta + offset -
483cabdff1aSopenharmony_ci                 absolute_region_power_index[region]) >> 1;
484cabdff1aSopenharmony_ci            i = av_clip_uintp2(i, 3);
485cabdff1aSopenharmony_ci            power_categories[region] = i;
486cabdff1aSopenharmony_ci            expected_number_of_code_bits += expected_bits_table[i];
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci        }
489cabdff1aSopenharmony_ci        if (expected_number_of_code_bits >= number_of_available_bits - 32)
490cabdff1aSopenharmony_ci            offset += delta;
491cabdff1aSopenharmony_ci    }
492cabdff1aSopenharmony_ci
493cabdff1aSopenharmony_ci    expected_number_of_code_bits = 0;
494cabdff1aSopenharmony_ci    for (region = 0; region < number_of_regions; region++) {
495cabdff1aSopenharmony_ci        i = (offset - absolute_region_power_index[region]) >> 1;
496cabdff1aSopenharmony_ci        i = av_clip_uintp2(i, 3);
497cabdff1aSopenharmony_ci        max_rate_categories[region] = min_rate_categories[region] =
498cabdff1aSopenharmony_ci            power_categories[region] = i;
499cabdff1aSopenharmony_ci        expected_number_of_code_bits += expected_bits_table[i];
500cabdff1aSopenharmony_ci    }
501cabdff1aSopenharmony_ci
502cabdff1aSopenharmony_ci    min = max = expected_number_of_code_bits;
503cabdff1aSopenharmony_ci    min_rate_ptr = max_rate_ptr =
504cabdff1aSopenharmony_ci        temp_category_balances + num_rate_control_possibilities;
505cabdff1aSopenharmony_ci    for (i = 0; i < num_rate_control_possibilities - 1; i++) {
506cabdff1aSopenharmony_ci        if (min + max > number_of_available_bits * 2) {
507cabdff1aSopenharmony_ci            raw_value = -99;
508cabdff1aSopenharmony_ci            for (region = number_of_regions - 1; region >= 0; region--) {
509cabdff1aSopenharmony_ci                if (min_rate_categories[region] < 7) {
510cabdff1aSopenharmony_ci                    temp =
511cabdff1aSopenharmony_ci                        offset - absolute_region_power_index[region] -
512cabdff1aSopenharmony_ci                        2 * min_rate_categories[region];
513cabdff1aSopenharmony_ci                    if (temp > raw_value) {
514cabdff1aSopenharmony_ci                        raw_value = temp;
515cabdff1aSopenharmony_ci                        raw_min_idx = region;
516cabdff1aSopenharmony_ci                    }
517cabdff1aSopenharmony_ci                }
518cabdff1aSopenharmony_ci            }
519cabdff1aSopenharmony_ci            if (raw_value == -99)
520cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
521cabdff1aSopenharmony_ci            *min_rate_ptr++ = raw_min_idx;
522cabdff1aSopenharmony_ci            min +=
523cabdff1aSopenharmony_ci                expected_bits_table[min_rate_categories[raw_min_idx] + 1] -
524cabdff1aSopenharmony_ci                expected_bits_table[min_rate_categories[raw_min_idx]];
525cabdff1aSopenharmony_ci            min_rate_categories[raw_min_idx]++;
526cabdff1aSopenharmony_ci        } else {
527cabdff1aSopenharmony_ci            raw_value = 99;
528cabdff1aSopenharmony_ci            for (region = 0; region < number_of_regions; region++) {
529cabdff1aSopenharmony_ci                if (max_rate_categories[region] > 0) {
530cabdff1aSopenharmony_ci                    temp =
531cabdff1aSopenharmony_ci                        offset - absolute_region_power_index[region] -
532cabdff1aSopenharmony_ci                        2 * max_rate_categories[region];
533cabdff1aSopenharmony_ci                    if (temp < raw_value) {
534cabdff1aSopenharmony_ci                        raw_value = temp;
535cabdff1aSopenharmony_ci                        raw_max_idx = region;
536cabdff1aSopenharmony_ci                    }
537cabdff1aSopenharmony_ci                }
538cabdff1aSopenharmony_ci            }
539cabdff1aSopenharmony_ci            if (raw_value == 99)
540cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
541cabdff1aSopenharmony_ci
542cabdff1aSopenharmony_ci            *--max_rate_ptr = raw_max_idx;
543cabdff1aSopenharmony_ci            max += expected_bits_table[max_rate_categories[raw_max_idx] - 1] -
544cabdff1aSopenharmony_ci                   expected_bits_table[max_rate_categories[raw_max_idx]];
545cabdff1aSopenharmony_ci            max_rate_categories[raw_max_idx]--;
546cabdff1aSopenharmony_ci        }
547cabdff1aSopenharmony_ci    }
548cabdff1aSopenharmony_ci
549cabdff1aSopenharmony_ci    for (region = 0; region < number_of_regions; region++)
550cabdff1aSopenharmony_ci        power_categories[region] = max_rate_categories[region];
551cabdff1aSopenharmony_ci
552cabdff1aSopenharmony_ci    for (i = 0; i < num_rate_control_possibilities - 1; i++)
553cabdff1aSopenharmony_ci        category_balance[i] = *max_rate_ptr++;
554cabdff1aSopenharmony_ci
555cabdff1aSopenharmony_ci    return 0;
556cabdff1aSopenharmony_ci}
557cabdff1aSopenharmony_ci
558cabdff1aSopenharmony_cistatic int get_dw(SirenContext *s)
559cabdff1aSopenharmony_ci{
560cabdff1aSopenharmony_ci    int ret = s->dw1 + s->dw4;
561cabdff1aSopenharmony_ci
562cabdff1aSopenharmony_ci    if ((ret & 0x8000) != 0)
563cabdff1aSopenharmony_ci        ret++;
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_ci    s->dw1 = s->dw2;
566cabdff1aSopenharmony_ci    s->dw2 = s->dw3;
567cabdff1aSopenharmony_ci    s->dw3 = s->dw4;
568cabdff1aSopenharmony_ci    s->dw4 = ret;
569cabdff1aSopenharmony_ci
570cabdff1aSopenharmony_ci    return ret;
571cabdff1aSopenharmony_ci}
572cabdff1aSopenharmony_ci
573cabdff1aSopenharmony_cistatic int decode_vector(SirenContext *s, int number_of_regions,
574cabdff1aSopenharmony_ci                         float *decoder_standard_deviation,
575cabdff1aSopenharmony_ci                         int *power_categories, float *coefs, int scale_factor)
576cabdff1aSopenharmony_ci{
577cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
578cabdff1aSopenharmony_ci    float *coefs_ptr;
579cabdff1aSopenharmony_ci    float decoded_value;
580cabdff1aSopenharmony_ci    float noise;
581cabdff1aSopenharmony_ci    const uint16_t *decoder_tree;
582cabdff1aSopenharmony_ci    int region;
583cabdff1aSopenharmony_ci    int category;
584cabdff1aSopenharmony_ci    int i, j;
585cabdff1aSopenharmony_ci    int index;
586cabdff1aSopenharmony_ci    int error = 0;
587cabdff1aSopenharmony_ci    int dw1;
588cabdff1aSopenharmony_ci    int dw2;
589cabdff1aSopenharmony_ci
590cabdff1aSopenharmony_ci    for (region = 0; region < number_of_regions; region++) {
591cabdff1aSopenharmony_ci        category = power_categories[region];
592cabdff1aSopenharmony_ci        coefs_ptr = coefs + (region * REGION_SIZE);
593cabdff1aSopenharmony_ci
594cabdff1aSopenharmony_ci        if (category >= 0 && category < 7) {
595cabdff1aSopenharmony_ci            decoder_tree = decoder_tables[category];
596cabdff1aSopenharmony_ci
597cabdff1aSopenharmony_ci            for (i = 0; i < number_of_vectors[category]; i++) {
598cabdff1aSopenharmony_ci                index = 0;
599cabdff1aSopenharmony_ci                do {
600cabdff1aSopenharmony_ci                    if (get_bits_left(gb) - s->checksum_bits <= 0) {
601cabdff1aSopenharmony_ci                        error = 1;
602cabdff1aSopenharmony_ci                        break;
603cabdff1aSopenharmony_ci                    }
604cabdff1aSopenharmony_ci
605cabdff1aSopenharmony_ci                    if (index + show_bits1(gb) >= decoder_tables_elements[category]) {
606cabdff1aSopenharmony_ci                        error = 1;
607cabdff1aSopenharmony_ci                        break;
608cabdff1aSopenharmony_ci                    }
609cabdff1aSopenharmony_ci                    index = decoder_tree[index + get_bits1(gb)];
610cabdff1aSopenharmony_ci                } while ((index & 1) == 0);
611cabdff1aSopenharmony_ci
612cabdff1aSopenharmony_ci                index >>= 1;
613cabdff1aSopenharmony_ci
614cabdff1aSopenharmony_ci                if (error == 0) {
615cabdff1aSopenharmony_ci                    for (j = 0; j < vector_dimension[category]; j++) {
616cabdff1aSopenharmony_ci                        decoded_value = mlt_quant[category][index & ((1 << index_table[category]) - 1)];
617cabdff1aSopenharmony_ci                        index >>= index_table[category];
618cabdff1aSopenharmony_ci
619cabdff1aSopenharmony_ci                        if (decoded_value) {
620cabdff1aSopenharmony_ci                            if (get_bits_left(gb) - s->checksum_bits <= 0) {
621cabdff1aSopenharmony_ci                                error = 1;
622cabdff1aSopenharmony_ci                                break;
623cabdff1aSopenharmony_ci                            }
624cabdff1aSopenharmony_ci                            if (!get_bits1(gb))
625cabdff1aSopenharmony_ci                                decoded_value *= -decoder_standard_deviation[region];
626cabdff1aSopenharmony_ci                            else
627cabdff1aSopenharmony_ci                                decoded_value *= decoder_standard_deviation[region];
628cabdff1aSopenharmony_ci                        }
629cabdff1aSopenharmony_ci
630cabdff1aSopenharmony_ci                        *coefs_ptr++ = decoded_value * scale_factor;
631cabdff1aSopenharmony_ci                    }
632cabdff1aSopenharmony_ci                } else {
633cabdff1aSopenharmony_ci                    error = 1;
634cabdff1aSopenharmony_ci                    break;
635cabdff1aSopenharmony_ci                }
636cabdff1aSopenharmony_ci            }
637cabdff1aSopenharmony_ci
638cabdff1aSopenharmony_ci            if (error == 1) {
639cabdff1aSopenharmony_ci                for (j = region + 1; j < number_of_regions; j++)
640cabdff1aSopenharmony_ci                    power_categories[j] = 7;
641cabdff1aSopenharmony_ci                category = 7;
642cabdff1aSopenharmony_ci            }
643cabdff1aSopenharmony_ci        }
644cabdff1aSopenharmony_ci
645cabdff1aSopenharmony_ci        coefs_ptr = coefs + (region * REGION_SIZE);
646cabdff1aSopenharmony_ci
647cabdff1aSopenharmony_ci        if (category == 5 && s->microsoft) {
648cabdff1aSopenharmony_ci            i = 0;
649cabdff1aSopenharmony_ci            for (j = 0; j < REGION_SIZE; j++) {
650cabdff1aSopenharmony_ci                if (*coefs_ptr != 0) {
651cabdff1aSopenharmony_ci                    i++;
652cabdff1aSopenharmony_ci                    if (fabs(*coefs_ptr) > 2.0 * decoder_standard_deviation[region]) {
653cabdff1aSopenharmony_ci                        i += 3;
654cabdff1aSopenharmony_ci                    }
655cabdff1aSopenharmony_ci                }
656cabdff1aSopenharmony_ci                coefs_ptr++;
657cabdff1aSopenharmony_ci            }
658cabdff1aSopenharmony_ci            if (i >= FF_ARRAY_ELEMS(noise_category5)) {
659cabdff1aSopenharmony_ci                error = 1;
660cabdff1aSopenharmony_ci                break;
661cabdff1aSopenharmony_ci            }
662cabdff1aSopenharmony_ci
663cabdff1aSopenharmony_ci            noise = decoder_standard_deviation[region] * noise_category5[i];
664cabdff1aSopenharmony_ci        } else
665cabdff1aSopenharmony_ci        if (category == 5 || category == 6) {
666cabdff1aSopenharmony_ci            i = 0;
667cabdff1aSopenharmony_ci            for (j = 0; j < REGION_SIZE; j++) {
668cabdff1aSopenharmony_ci                if (*coefs_ptr != 0)
669cabdff1aSopenharmony_ci                    i++;
670cabdff1aSopenharmony_ci                coefs_ptr++;
671cabdff1aSopenharmony_ci            }
672cabdff1aSopenharmony_ci
673cabdff1aSopenharmony_ci            if (category == 5) {
674cabdff1aSopenharmony_ci                noise = decoder_standard_deviation[region] * noise_category5[i];
675cabdff1aSopenharmony_ci            } else
676cabdff1aSopenharmony_ci                noise = decoder_standard_deviation[region] * noise_category6[i];
677cabdff1aSopenharmony_ci        } else if (category == 7) {
678cabdff1aSopenharmony_ci            noise = decoder_standard_deviation[region] * 0.70711f;
679cabdff1aSopenharmony_ci        } else {
680cabdff1aSopenharmony_ci            noise = 0;
681cabdff1aSopenharmony_ci        }
682cabdff1aSopenharmony_ci
683cabdff1aSopenharmony_ci        coefs_ptr = coefs + (region * REGION_SIZE);
684cabdff1aSopenharmony_ci
685cabdff1aSopenharmony_ci        if (category == 5 || category == 6 || category == 7) {
686cabdff1aSopenharmony_ci            dw1 = get_dw(s);
687cabdff1aSopenharmony_ci            dw2 = get_dw(s);
688cabdff1aSopenharmony_ci
689cabdff1aSopenharmony_ci            for (j = 0; j < 10; j++) {
690cabdff1aSopenharmony_ci                if (category == 7 || *coefs_ptr == 0)
691cabdff1aSopenharmony_ci                    *coefs_ptr = dw1 & 1 ? noise : -noise;
692cabdff1aSopenharmony_ci                coefs_ptr++;
693cabdff1aSopenharmony_ci                dw1 >>= 1;
694cabdff1aSopenharmony_ci
695cabdff1aSopenharmony_ci                if (category == 7 || *coefs_ptr == 0)
696cabdff1aSopenharmony_ci                    *coefs_ptr = dw2 & 1 ? noise : -noise;
697cabdff1aSopenharmony_ci                coefs_ptr++;
698cabdff1aSopenharmony_ci                dw2 >>= 1;
699cabdff1aSopenharmony_ci            }
700cabdff1aSopenharmony_ci        }
701cabdff1aSopenharmony_ci    }
702cabdff1aSopenharmony_ci
703cabdff1aSopenharmony_ci    return error == 1 ? AVERROR_INVALIDDATA : (get_bits_left(gb) - s->checksum_bits);
704cabdff1aSopenharmony_ci}
705cabdff1aSopenharmony_ci
706cabdff1aSopenharmony_cistatic int siren_decode(AVCodecContext *avctx, AVFrame *frame,
707cabdff1aSopenharmony_ci                        int *got_frame, AVPacket *avpkt)
708cabdff1aSopenharmony_ci{
709cabdff1aSopenharmony_ci    SirenContext *s = avctx->priv_data;
710cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
711cabdff1aSopenharmony_ci    int ret, number_of_valid_coefs = REGION_SIZE * s->number_of_regions;
712cabdff1aSopenharmony_ci    int frame_error = 0, rate_control = 0;
713cabdff1aSopenharmony_ci    int bits_per_frame;
714cabdff1aSopenharmony_ci
715cabdff1aSopenharmony_ci    if (s->microsoft) {
716cabdff1aSopenharmony_ci        bits_per_frame  = avctx->sample_rate / 50;
717cabdff1aSopenharmony_ci
718cabdff1aSopenharmony_ci        if (avpkt->size < bits_per_frame / 8)
719cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
720cabdff1aSopenharmony_ci
721cabdff1aSopenharmony_ci        if ((ret = init_get_bits(gb, avpkt->data, bits_per_frame)) < 0)
722cabdff1aSopenharmony_ci            return ret;
723cabdff1aSopenharmony_ci    } else
724cabdff1aSopenharmony_ci    if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0)
725cabdff1aSopenharmony_ci        return ret;
726cabdff1aSopenharmony_ci
727cabdff1aSopenharmony_ci    skip_bits(gb, s->sample_rate_bits);
728cabdff1aSopenharmony_ci
729cabdff1aSopenharmony_ci    ret = decode_envelope(s, gb, s->number_of_regions,
730cabdff1aSopenharmony_ci                    s->decoder_standard_deviation,
731cabdff1aSopenharmony_ci                    s->absolute_region_power_index, s->esf_adjustment);
732cabdff1aSopenharmony_ci    if (ret < 0)
733cabdff1aSopenharmony_ci        return ret;
734cabdff1aSopenharmony_ci
735cabdff1aSopenharmony_ci    rate_control = get_bits(gb, 4);
736cabdff1aSopenharmony_ci
737cabdff1aSopenharmony_ci    ret = categorize_regions(s->number_of_regions, get_bits_left(gb) - s->checksum_bits,
738cabdff1aSopenharmony_ci                             s->absolute_region_power_index, s->power_categories,
739cabdff1aSopenharmony_ci                             s->category_balance);
740cabdff1aSopenharmony_ci    if (ret < 0)
741cabdff1aSopenharmony_ci        return ret;
742cabdff1aSopenharmony_ci
743cabdff1aSopenharmony_ci    for (int i = 0; i < rate_control; i++)
744cabdff1aSopenharmony_ci        s->power_categories[s->category_balance[i]]++;
745cabdff1aSopenharmony_ci
746cabdff1aSopenharmony_ci    ret = decode_vector(s, s->number_of_regions,
747cabdff1aSopenharmony_ci                        s->decoder_standard_deviation, s->power_categories,
748cabdff1aSopenharmony_ci                        s->imdct_in, s->scale_factor);
749cabdff1aSopenharmony_ci    if (ret < 0 && !s->microsoft)
750cabdff1aSopenharmony_ci        return ret;
751cabdff1aSopenharmony_ci
752cabdff1aSopenharmony_ci    if (get_bits_left(gb) - s->checksum_bits > 0) {
753cabdff1aSopenharmony_ci        do {
754cabdff1aSopenharmony_ci            frame_error |= !get_bits1(gb);
755cabdff1aSopenharmony_ci        } while (get_bits_left(gb) - s->checksum_bits > 0);
756cabdff1aSopenharmony_ci    } else if (get_bits_left(gb) - s->checksum_bits < 0 &&
757cabdff1aSopenharmony_ci               rate_control + 1 < s->rate_control_possibilities) {
758cabdff1aSopenharmony_ci        frame_error = 1;
759cabdff1aSopenharmony_ci    }
760cabdff1aSopenharmony_ci
761cabdff1aSopenharmony_ci    for (int i = 0; i < s->number_of_regions; i++) {
762cabdff1aSopenharmony_ci        if (s->absolute_region_power_index[i] > 33 ||
763cabdff1aSopenharmony_ci            s->absolute_region_power_index[i] < -31)
764cabdff1aSopenharmony_ci            frame_error = 1;
765cabdff1aSopenharmony_ci    }
766cabdff1aSopenharmony_ci
767cabdff1aSopenharmony_ci    if ((avctx->err_recognition & AV_EF_CRCCHECK) && s->checksum_bits) {
768cabdff1aSopenharmony_ci        static const uint16_t ChecksumTable[4] = {0x7F80, 0x7878, 0x6666, 0x5555};
769cabdff1aSopenharmony_ci        int wpf, checksum, sum, calculated_checksum, temp1;
770cabdff1aSopenharmony_ci
771cabdff1aSopenharmony_ci        checksum = get_bits(gb, s->checksum_bits);
772cabdff1aSopenharmony_ci
773cabdff1aSopenharmony_ci        wpf = bits_per_frame / 16;
774cabdff1aSopenharmony_ci        sum = 0;
775cabdff1aSopenharmony_ci        for (int i = 0; i < wpf - 1; i++)
776cabdff1aSopenharmony_ci            sum ^= AV_RB16(avpkt->data + i * 2) << (i % 15);
777cabdff1aSopenharmony_ci        sum ^= (AV_RB16(avpkt->data + (wpf - 1) * 2) & ~checksum) << ((wpf - 1) % 15);
778cabdff1aSopenharmony_ci        sum = (sum >> 15) ^ (sum & 0x7FFF);
779cabdff1aSopenharmony_ci
780cabdff1aSopenharmony_ci        calculated_checksum = 0;
781cabdff1aSopenharmony_ci        for (int i = 0; i < 4; i++) {
782cabdff1aSopenharmony_ci            temp1 = ChecksumTable[i] & sum;
783cabdff1aSopenharmony_ci
784cabdff1aSopenharmony_ci            for (int j = 8; j > 0; j >>= 1)
785cabdff1aSopenharmony_ci                temp1 ^= temp1 >> j;
786cabdff1aSopenharmony_ci
787cabdff1aSopenharmony_ci            calculated_checksum <<= 1;
788cabdff1aSopenharmony_ci            calculated_checksum |= temp1 & 1;
789cabdff1aSopenharmony_ci        }
790cabdff1aSopenharmony_ci
791cabdff1aSopenharmony_ci        if (checksum != calculated_checksum) {
792cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_WARNING, "Invalid checksum\n");
793cabdff1aSopenharmony_ci            if (avctx->err_recognition & AV_EF_EXPLODE)
794cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
795cabdff1aSopenharmony_ci            frame_error = 1;
796cabdff1aSopenharmony_ci        }
797cabdff1aSopenharmony_ci    }
798cabdff1aSopenharmony_ci
799cabdff1aSopenharmony_ci    if (frame_error) {
800cabdff1aSopenharmony_ci        memcpy(s->imdct_in, s->backup_frame, number_of_valid_coefs * sizeof(float));
801cabdff1aSopenharmony_ci        memset(s->backup_frame, 0, number_of_valid_coefs * sizeof(float));
802cabdff1aSopenharmony_ci    } else {
803cabdff1aSopenharmony_ci        memcpy(s->backup_frame, s->imdct_in, number_of_valid_coefs * sizeof(float));
804cabdff1aSopenharmony_ci    }
805cabdff1aSopenharmony_ci
806cabdff1aSopenharmony_ci    frame->nb_samples = FRAME_SIZE;
807cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
808cabdff1aSopenharmony_ci        return ret;
809cabdff1aSopenharmony_ci
810cabdff1aSopenharmony_ci    for (int i = 0; i < FRAME_SIZE; i += 2)
811cabdff1aSopenharmony_ci        s->imdct_in[i] *= -1;
812cabdff1aSopenharmony_ci
813cabdff1aSopenharmony_ci    s->tx_fn(s->tx_ctx, s->imdct_out, s->imdct_in, sizeof(float));
814cabdff1aSopenharmony_ci    s->fdsp->vector_fmul_window((float *)frame->data[0],
815cabdff1aSopenharmony_ci                                s->imdct_prev + (FRAME_SIZE >> 1),
816cabdff1aSopenharmony_ci                                s->imdct_out, s->window,
817cabdff1aSopenharmony_ci                                FRAME_SIZE >> 1);
818cabdff1aSopenharmony_ci    FFSWAP(float *, s->imdct_out, s->imdct_prev);
819cabdff1aSopenharmony_ci
820cabdff1aSopenharmony_ci    *got_frame = 1;
821cabdff1aSopenharmony_ci
822cabdff1aSopenharmony_ci    return s->microsoft ? bits_per_frame / 8 : avpkt->size;
823cabdff1aSopenharmony_ci}
824cabdff1aSopenharmony_ci
825cabdff1aSopenharmony_cistatic av_cold void siren_flush(AVCodecContext *avctx)
826cabdff1aSopenharmony_ci{
827cabdff1aSopenharmony_ci    SirenContext *s = avctx->priv_data;
828cabdff1aSopenharmony_ci
829cabdff1aSopenharmony_ci    memset(s->backup_frame, 0, sizeof(s->backup_frame));
830cabdff1aSopenharmony_ci    memset(s->imdct_prev, 0, FRAME_SIZE * sizeof(*s->imdct_prev));
831cabdff1aSopenharmony_ci    memset(s->imdct_out, 0, FRAME_SIZE * sizeof(*s->imdct_out));
832cabdff1aSopenharmony_ci}
833cabdff1aSopenharmony_ci
834cabdff1aSopenharmony_cistatic av_cold int siren_close(AVCodecContext *avctx)
835cabdff1aSopenharmony_ci{
836cabdff1aSopenharmony_ci    SirenContext *s = avctx->priv_data;
837cabdff1aSopenharmony_ci
838cabdff1aSopenharmony_ci    av_freep(&s->fdsp);
839cabdff1aSopenharmony_ci    av_tx_uninit(&s->tx_ctx);
840cabdff1aSopenharmony_ci
841cabdff1aSopenharmony_ci    return 0;
842cabdff1aSopenharmony_ci}
843cabdff1aSopenharmony_ci
844cabdff1aSopenharmony_ciconst FFCodec ff_siren_decoder = {
845cabdff1aSopenharmony_ci    .p.name         = "siren",
846cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Siren"),
847cabdff1aSopenharmony_ci    .priv_data_size = sizeof(SirenContext),
848cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
849cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_SIREN,
850cabdff1aSopenharmony_ci    .init           = siren_init,
851cabdff1aSopenharmony_ci    .close          = siren_close,
852cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(siren_decode),
853cabdff1aSopenharmony_ci    .flush          = siren_flush,
854cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
855cabdff1aSopenharmony_ci                      AV_CODEC_CAP_DR1,
856cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
857cabdff1aSopenharmony_ci                      FF_CODEC_CAP_INIT_CLEANUP,
858cabdff1aSopenharmony_ci};
859cabdff1aSopenharmony_ci
860cabdff1aSopenharmony_ciconst FFCodec ff_msnsiren_decoder = {
861cabdff1aSopenharmony_ci    .p.name         = "msnsiren",
862cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("MSN Siren"),
863cabdff1aSopenharmony_ci    .priv_data_size = sizeof(SirenContext),
864cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
865cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_MSNSIREN,
866cabdff1aSopenharmony_ci    .init           = siren_init,
867cabdff1aSopenharmony_ci    .close          = siren_close,
868cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(siren_decode),
869cabdff1aSopenharmony_ci    .flush          = siren_flush,
870cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
871cabdff1aSopenharmony_ci                      AV_CODEC_CAP_DR1,
872cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
873cabdff1aSopenharmony_ci                      FF_CODEC_CAP_INIT_CLEANUP,
874cabdff1aSopenharmony_ci};
875