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