1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2001-2003 The FFmpeg project
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * first version by Francois Revol (revol@free.fr)
5cabdff1aSopenharmony_ci * fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
6cabdff1aSopenharmony_ci *   by Mike Melanson (melanson@pcisys.net)
7cabdff1aSopenharmony_ci * CD-ROM XA ADPCM codec by BERO
8cabdff1aSopenharmony_ci * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com)
9cabdff1aSopenharmony_ci * EA ADPCM R1/R2/R3 decoder by Peter Ross (pross@xvid.org)
10cabdff1aSopenharmony_ci * EA IMA EACS decoder by Peter Ross (pross@xvid.org)
11cabdff1aSopenharmony_ci * EA IMA SEAD decoder by Peter Ross (pross@xvid.org)
12cabdff1aSopenharmony_ci * EA ADPCM XAS decoder by Peter Ross (pross@xvid.org)
13cabdff1aSopenharmony_ci * MAXIS EA ADPCM decoder by Robert Marston (rmarston@gmail.com)
14cabdff1aSopenharmony_ci * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl)
15cabdff1aSopenharmony_ci * Argonaut Games ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
16cabdff1aSopenharmony_ci * Simon & Schuster Interactive ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
17cabdff1aSopenharmony_ci * Ubisoft ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
18cabdff1aSopenharmony_ci * High Voltage Software ALP decoder by Zane van Iperen (zane@zanevaniperen.com)
19cabdff1aSopenharmony_ci * Cunning Developments decoder by Zane van Iperen (zane@zanevaniperen.com)
20cabdff1aSopenharmony_ci *
21cabdff1aSopenharmony_ci * This file is part of FFmpeg.
22cabdff1aSopenharmony_ci *
23cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
24cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
25cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
26cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
27cabdff1aSopenharmony_ci *
28cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
29cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
30cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
31cabdff1aSopenharmony_ci * Lesser General Public License for more details.
32cabdff1aSopenharmony_ci *
33cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
34cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
35cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
36cabdff1aSopenharmony_ci */
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#include "config_components.h"
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci#include "avcodec.h"
41cabdff1aSopenharmony_ci#include "get_bits.h"
42cabdff1aSopenharmony_ci#include "bytestream.h"
43cabdff1aSopenharmony_ci#include "adpcm.h"
44cabdff1aSopenharmony_ci#include "adpcm_data.h"
45cabdff1aSopenharmony_ci#include "codec_internal.h"
46cabdff1aSopenharmony_ci#include "internal.h"
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci/**
49cabdff1aSopenharmony_ci * @file
50cabdff1aSopenharmony_ci * ADPCM decoders
51cabdff1aSopenharmony_ci * Features and limitations:
52cabdff1aSopenharmony_ci *
53cabdff1aSopenharmony_ci * Reference documents:
54cabdff1aSopenharmony_ci * http://wiki.multimedia.cx/index.php?title=Category:ADPCM_Audio_Codecs
55cabdff1aSopenharmony_ci * http://www.pcisys.net/~melanson/codecs/simpleaudio.html [dead]
56cabdff1aSopenharmony_ci * http://www.geocities.com/SiliconValley/8682/aud3.txt [dead]
57cabdff1aSopenharmony_ci * http://openquicktime.sourceforge.net/
58cabdff1aSopenharmony_ci * XAnim sources (xa_codec.c) http://xanim.polter.net/
59cabdff1aSopenharmony_ci * http://www.cs.ucla.edu/~leec/mediabench/applications.html [dead]
60cabdff1aSopenharmony_ci * SoX source code http://sox.sourceforge.net/
61cabdff1aSopenharmony_ci *
62cabdff1aSopenharmony_ci * CD-ROM XA:
63cabdff1aSopenharmony_ci * http://ku-www.ss.titech.ac.jp/~yatsushi/xaadpcm.html [dead]
64cabdff1aSopenharmony_ci * vagpack & depack http://homepages.compuserve.de/bITmASTER32/psx-index.html [dead]
65cabdff1aSopenharmony_ci * readstr http://www.geocities.co.jp/Playtown/2004/
66cabdff1aSopenharmony_ci */
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_ci#define CASE_0(codec_id, ...)
69cabdff1aSopenharmony_ci#define CASE_1(codec_id, ...) \
70cabdff1aSopenharmony_ci    case codec_id:            \
71cabdff1aSopenharmony_ci    { __VA_ARGS__ }           \
72cabdff1aSopenharmony_ci    break;
73cabdff1aSopenharmony_ci#define CASE_2(enabled, codec_id, ...) \
74cabdff1aSopenharmony_ci        CASE_ ## enabled(codec_id, __VA_ARGS__)
75cabdff1aSopenharmony_ci#define CASE_3(config, codec_id, ...) \
76cabdff1aSopenharmony_ci        CASE_2(config, codec_id, __VA_ARGS__)
77cabdff1aSopenharmony_ci#define CASE(codec, ...) \
78cabdff1aSopenharmony_ci        CASE_3(CONFIG_ ## codec ## _DECODER, AV_CODEC_ID_ ## codec, __VA_ARGS__)
79cabdff1aSopenharmony_ci
80cabdff1aSopenharmony_ci/* These are for CD-ROM XA ADPCM */
81cabdff1aSopenharmony_cistatic const int8_t xa_adpcm_table[5][2] = {
82cabdff1aSopenharmony_ci    {   0,   0 },
83cabdff1aSopenharmony_ci    {  60,   0 },
84cabdff1aSopenharmony_ci    { 115, -52 },
85cabdff1aSopenharmony_ci    {  98, -55 },
86cabdff1aSopenharmony_ci    { 122, -60 }
87cabdff1aSopenharmony_ci};
88cabdff1aSopenharmony_ci
89cabdff1aSopenharmony_cistatic const int16_t afc_coeffs[2][16] = {
90cabdff1aSopenharmony_ci    { 0, 2048, 0, 1024, 4096, 3584, 3072, 4608, 4200, 4800, 5120, 2048, 1024, -1024, -1024, -2048 },
91cabdff1aSopenharmony_ci    { 0, 0, 2048, 1024, -2048, -1536, -1024, -2560, -2248, -2300, -3072, -2048, -1024, 1024, 0, 0 }
92cabdff1aSopenharmony_ci};
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_cistatic const int16_t ea_adpcm_table[] = {
95cabdff1aSopenharmony_ci    0,  240,  460,  392,
96cabdff1aSopenharmony_ci    0,    0, -208, -220,
97cabdff1aSopenharmony_ci    0,    1,    3,    4,
98cabdff1aSopenharmony_ci    7,    8,   10,   11,
99cabdff1aSopenharmony_ci    0,   -1,   -3,   -4
100cabdff1aSopenharmony_ci};
101cabdff1aSopenharmony_ci
102cabdff1aSopenharmony_ci/*
103cabdff1aSopenharmony_ci * Dumped from the binaries:
104cabdff1aSopenharmony_ci * - FantasticJourney.exe - 0x794D2, DGROUP:0x47A4D2
105cabdff1aSopenharmony_ci * - BigRaceUSA.exe       - 0x9B8AA, DGROUP:0x49C4AA
106cabdff1aSopenharmony_ci * - Timeshock!.exe       - 0x8506A, DGROUP:0x485C6A
107cabdff1aSopenharmony_ci */
108cabdff1aSopenharmony_cistatic const int8_t ima_cunning_index_table[9] = {
109cabdff1aSopenharmony_ci    -1, -1, -1, -1, 1, 2, 3, 4, -1
110cabdff1aSopenharmony_ci};
111cabdff1aSopenharmony_ci
112cabdff1aSopenharmony_ci/*
113cabdff1aSopenharmony_ci * Dumped from the binaries:
114cabdff1aSopenharmony_ci * - FantasticJourney.exe - 0x79458, DGROUP:0x47A458
115cabdff1aSopenharmony_ci * - BigRaceUSA.exe       - 0x9B830, DGROUP:0x49C430
116cabdff1aSopenharmony_ci * - Timeshock!.exe       - 0x84FF0, DGROUP:0x485BF0
117cabdff1aSopenharmony_ci */
118cabdff1aSopenharmony_cistatic const int16_t ima_cunning_step_table[61] = {
119cabdff1aSopenharmony_ci       1,    1,   1,      1,     2,     2,     3,     3,    4,      5,
120cabdff1aSopenharmony_ci       6,    7,   8,     10,    12,    14,    16,    20,    24,    28,
121cabdff1aSopenharmony_ci      32,   40,  48,     56,    64,    80,    96,   112,   128,   160,
122cabdff1aSopenharmony_ci     192,  224,  256,   320,   384,   448,   512,   640,   768,   896,
123cabdff1aSopenharmony_ci    1024, 1280, 1536,  1792,  2048,  2560,  3072,  3584,  4096,  5120,
124cabdff1aSopenharmony_ci    6144, 7168, 8192, 10240, 12288, 14336, 16384, 20480, 24576, 28672, 0
125cabdff1aSopenharmony_ci};
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_cistatic const int8_t adpcm_index_table2[4] = {
128cabdff1aSopenharmony_ci    -1,  2,
129cabdff1aSopenharmony_ci    -1,  2,
130cabdff1aSopenharmony_ci};
131cabdff1aSopenharmony_ci
132cabdff1aSopenharmony_cistatic const int8_t adpcm_index_table3[8] = {
133cabdff1aSopenharmony_ci    -1, -1,  1,  2,
134cabdff1aSopenharmony_ci    -1, -1,  1,  2,
135cabdff1aSopenharmony_ci};
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_cistatic const int8_t adpcm_index_table5[32] = {
138cabdff1aSopenharmony_ci    -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16,
139cabdff1aSopenharmony_ci    -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16,
140cabdff1aSopenharmony_ci};
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_cistatic const int8_t * const adpcm_index_tables[4] = {
143cabdff1aSopenharmony_ci    &adpcm_index_table2[0],
144cabdff1aSopenharmony_ci    &adpcm_index_table3[0],
145cabdff1aSopenharmony_ci    &ff_adpcm_index_table[0],
146cabdff1aSopenharmony_ci    &adpcm_index_table5[0],
147cabdff1aSopenharmony_ci};
148cabdff1aSopenharmony_ci
149cabdff1aSopenharmony_cistatic const int16_t mtaf_stepsize[32][16] = {
150cabdff1aSopenharmony_ci    {     1,     5,     9,    13,    16,    20,    24,    28,
151cabdff1aSopenharmony_ci         -1,    -5,    -9,   -13,   -16,   -20,   -24,   -28, },
152cabdff1aSopenharmony_ci    {     2,     6,    11,    15,    20,    24,    29,    33,
153cabdff1aSopenharmony_ci         -2,    -6,   -11,   -15,   -20,   -24,   -29,   -33, },
154cabdff1aSopenharmony_ci    {     2,     7,    13,    18,    23,    28,    34,    39,
155cabdff1aSopenharmony_ci         -2,    -7,   -13,   -18,   -23,   -28,   -34,   -39, },
156cabdff1aSopenharmony_ci    {     3,     9,    15,    21,    28,    34,    40,    46,
157cabdff1aSopenharmony_ci         -3,    -9,   -15,   -21,   -28,   -34,   -40,   -46, },
158cabdff1aSopenharmony_ci    {     3,    11,    18,    26,    33,    41,    48,    56,
159cabdff1aSopenharmony_ci         -3,   -11,   -18,   -26,   -33,   -41,   -48,   -56, },
160cabdff1aSopenharmony_ci    {     4,    13,    22,    31,    40,    49,    58,    67,
161cabdff1aSopenharmony_ci         -4,   -13,   -22,   -31,   -40,   -49,   -58,   -67, },
162cabdff1aSopenharmony_ci    {     5,    16,    26,    37,    48,    59,    69,    80,
163cabdff1aSopenharmony_ci         -5,   -16,   -26,   -37,   -48,   -59,   -69,   -80, },
164cabdff1aSopenharmony_ci    {     6,    19,    31,    44,    57,    70,    82,    95,
165cabdff1aSopenharmony_ci         -6,   -19,   -31,   -44,   -57,   -70,   -82,   -95, },
166cabdff1aSopenharmony_ci    {     7,    22,    38,    53,    68,    83,    99,   114,
167cabdff1aSopenharmony_ci         -7,   -22,   -38,   -53,   -68,   -83,   -99,  -114, },
168cabdff1aSopenharmony_ci    {     9,    27,    45,    63,    81,    99,   117,   135,
169cabdff1aSopenharmony_ci         -9,   -27,   -45,   -63,   -81,   -99,  -117,  -135, },
170cabdff1aSopenharmony_ci    {    10,    32,    53,    75,    96,   118,   139,   161,
171cabdff1aSopenharmony_ci        -10,   -32,   -53,   -75,   -96,  -118,  -139,  -161, },
172cabdff1aSopenharmony_ci    {    12,    38,    64,    90,   115,   141,   167,   193,
173cabdff1aSopenharmony_ci        -12,   -38,   -64,   -90,  -115,  -141,  -167,  -193, },
174cabdff1aSopenharmony_ci    {    15,    45,    76,   106,   137,   167,   198,   228,
175cabdff1aSopenharmony_ci        -15,   -45,   -76,  -106,  -137,  -167,  -198,  -228, },
176cabdff1aSopenharmony_ci    {    18,    54,    91,   127,   164,   200,   237,   273,
177cabdff1aSopenharmony_ci        -18,   -54,   -91,  -127,  -164,  -200,  -237,  -273, },
178cabdff1aSopenharmony_ci    {    21,    65,   108,   152,   195,   239,   282,   326,
179cabdff1aSopenharmony_ci        -21,   -65,  -108,  -152,  -195,  -239,  -282,  -326, },
180cabdff1aSopenharmony_ci    {    25,    77,   129,   181,   232,   284,   336,   388,
181cabdff1aSopenharmony_ci        -25,   -77,  -129,  -181,  -232,  -284,  -336,  -388, },
182cabdff1aSopenharmony_ci    {    30,    92,   153,   215,   276,   338,   399,   461,
183cabdff1aSopenharmony_ci        -30,   -92,  -153,  -215,  -276,  -338,  -399,  -461, },
184cabdff1aSopenharmony_ci    {    36,   109,   183,   256,   329,   402,   476,   549,
185cabdff1aSopenharmony_ci        -36,  -109,  -183,  -256,  -329,  -402,  -476,  -549, },
186cabdff1aSopenharmony_ci    {    43,   130,   218,   305,   392,   479,   567,   654,
187cabdff1aSopenharmony_ci        -43,  -130,  -218,  -305,  -392,  -479,  -567,  -654, },
188cabdff1aSopenharmony_ci    {    52,   156,   260,   364,   468,   572,   676,   780,
189cabdff1aSopenharmony_ci        -52,  -156,  -260,  -364,  -468,  -572,  -676,  -780, },
190cabdff1aSopenharmony_ci    {    62,   186,   310,   434,   558,   682,   806,   930,
191cabdff1aSopenharmony_ci        -62,  -186,  -310,  -434,  -558,  -682,  -806,  -930, },
192cabdff1aSopenharmony_ci    {    73,   221,   368,   516,   663,   811,   958,  1106,
193cabdff1aSopenharmony_ci        -73,  -221,  -368,  -516,  -663,  -811,  -958, -1106, },
194cabdff1aSopenharmony_ci    {    87,   263,   439,   615,   790,   966,  1142,  1318,
195cabdff1aSopenharmony_ci        -87,  -263,  -439,  -615,  -790,  -966, -1142, -1318, },
196cabdff1aSopenharmony_ci    {   104,   314,   523,   733,   942,  1152,  1361,  1571,
197cabdff1aSopenharmony_ci       -104,  -314,  -523,  -733,  -942, -1152, -1361, -1571, },
198cabdff1aSopenharmony_ci    {   124,   374,   623,   873,  1122,  1372,  1621,  1871,
199cabdff1aSopenharmony_ci       -124,  -374,  -623,  -873, -1122, -1372, -1621, -1871, },
200cabdff1aSopenharmony_ci    {   148,   445,   743,  1040,  1337,  1634,  1932,  2229,
201cabdff1aSopenharmony_ci       -148,  -445,  -743, -1040, -1337, -1634, -1932, -2229, },
202cabdff1aSopenharmony_ci    {   177,   531,   885,  1239,  1593,  1947,  2301,  2655,
203cabdff1aSopenharmony_ci       -177,  -531,  -885, -1239, -1593, -1947, -2301, -2655, },
204cabdff1aSopenharmony_ci    {   210,   632,  1053,  1475,  1896,  2318,  2739,  3161,
205cabdff1aSopenharmony_ci       -210,  -632, -1053, -1475, -1896, -2318, -2739, -3161, },
206cabdff1aSopenharmony_ci    {   251,   753,  1255,  1757,  2260,  2762,  3264,  3766,
207cabdff1aSopenharmony_ci       -251,  -753, -1255, -1757, -2260, -2762, -3264, -3766, },
208cabdff1aSopenharmony_ci    {   299,   897,  1495,  2093,  2692,  3290,  3888,  4486,
209cabdff1aSopenharmony_ci       -299,  -897, -1495, -2093, -2692, -3290, -3888, -4486, },
210cabdff1aSopenharmony_ci    {   356,  1068,  1781,  2493,  3206,  3918,  4631,  5343,
211cabdff1aSopenharmony_ci       -356, -1068, -1781, -2493, -3206, -3918, -4631, -5343, },
212cabdff1aSopenharmony_ci    {   424,  1273,  2121,  2970,  3819,  4668,  5516,  6365,
213cabdff1aSopenharmony_ci       -424, -1273, -2121, -2970, -3819, -4668, -5516, -6365, },
214cabdff1aSopenharmony_ci};
215cabdff1aSopenharmony_ci
216cabdff1aSopenharmony_cistatic const int16_t oki_step_table[49] = {
217cabdff1aSopenharmony_ci     16,  17,  19,  21,   23,   25,   28,   31,   34,  37,
218cabdff1aSopenharmony_ci     41,  45,  50,  55,   60,   66,   73,   80,   88,  97,
219cabdff1aSopenharmony_ci    107, 118, 130, 143,  157,  173,  190,  209,  230, 253,
220cabdff1aSopenharmony_ci    279, 307, 337, 371,  408,  449,  494,  544,  598, 658,
221cabdff1aSopenharmony_ci    724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552
222cabdff1aSopenharmony_ci};
223cabdff1aSopenharmony_ci
224cabdff1aSopenharmony_ci// padded to zero where table size is less then 16
225cabdff1aSopenharmony_cistatic const int8_t swf_index_tables[4][16] = {
226cabdff1aSopenharmony_ci    /*2*/ { -1, 2 },
227cabdff1aSopenharmony_ci    /*3*/ { -1, -1, 2, 4 },
228cabdff1aSopenharmony_ci    /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 },
229cabdff1aSopenharmony_ci    /*5*/ { -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16 }
230cabdff1aSopenharmony_ci};
231cabdff1aSopenharmony_ci
232cabdff1aSopenharmony_cistatic const int8_t zork_index_table[8] = {
233cabdff1aSopenharmony_ci    -1, -1, -1, 1, 4, 7, 10, 12,
234cabdff1aSopenharmony_ci};
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_cistatic const int8_t mtf_index_table[16] = {
237cabdff1aSopenharmony_ci     8,  6,  4,  2, -1, -1, -1, -1,
238cabdff1aSopenharmony_ci    -1, -1, -1, -1,  2,  4,  6,  8,
239cabdff1aSopenharmony_ci};
240cabdff1aSopenharmony_ci
241cabdff1aSopenharmony_ci/* end of tables */
242cabdff1aSopenharmony_ci
243cabdff1aSopenharmony_citypedef struct ADPCMDecodeContext {
244cabdff1aSopenharmony_ci    ADPCMChannelStatus status[14];
245cabdff1aSopenharmony_ci    int vqa_version;                /**< VQA version. Used for ADPCM_IMA_WS */
246cabdff1aSopenharmony_ci    int has_status;                 /**< Status flag. Reset to 0 after a flush. */
247cabdff1aSopenharmony_ci} ADPCMDecodeContext;
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_cistatic void adpcm_flush(AVCodecContext *avctx);
250cabdff1aSopenharmony_ci
251cabdff1aSopenharmony_cistatic av_cold int adpcm_decode_init(AVCodecContext * avctx)
252cabdff1aSopenharmony_ci{
253cabdff1aSopenharmony_ci    ADPCMDecodeContext *c = avctx->priv_data;
254cabdff1aSopenharmony_ci    unsigned int min_channels = 1;
255cabdff1aSopenharmony_ci    unsigned int max_channels = 2;
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_ci    adpcm_flush(avctx);
258cabdff1aSopenharmony_ci
259cabdff1aSopenharmony_ci    switch(avctx->codec->id) {
260cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_AMV:
261cabdff1aSopenharmony_ci        max_channels = 1;
262cabdff1aSopenharmony_ci        break;
263cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_DTK:
264cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA:
265cabdff1aSopenharmony_ci        min_channels = 2;
266cabdff1aSopenharmony_ci        break;
267cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_AFC:
268cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R1:
269cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R2:
270cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R3:
271cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_XAS:
272cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_MS:
273cabdff1aSopenharmony_ci        max_channels = 6;
274cabdff1aSopenharmony_ci        break;
275cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_MTAF:
276cabdff1aSopenharmony_ci        min_channels = 2;
277cabdff1aSopenharmony_ci        max_channels = 8;
278cabdff1aSopenharmony_ci        if (avctx->ch_layout.nb_channels & 1) {
279cabdff1aSopenharmony_ci            avpriv_request_sample(avctx, "channel count %d", avctx->ch_layout.nb_channels);
280cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
281cabdff1aSopenharmony_ci        }
282cabdff1aSopenharmony_ci        break;
283cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_PSX:
284cabdff1aSopenharmony_ci        max_channels = 8;
285cabdff1aSopenharmony_ci        if (avctx->ch_layout.nb_channels <= 0 ||
286cabdff1aSopenharmony_ci            avctx->block_align % (16 * avctx->ch_layout.nb_channels))
287cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
288cabdff1aSopenharmony_ci        break;
289cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_DAT4:
290cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP:
291cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP_LE:
292cabdff1aSopenharmony_ci        max_channels = 14;
293cabdff1aSopenharmony_ci        break;
294cabdff1aSopenharmony_ci    }
295cabdff1aSopenharmony_ci    if (avctx->ch_layout.nb_channels < min_channels ||
296cabdff1aSopenharmony_ci        avctx->ch_layout.nb_channels > max_channels) {
297cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
298cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
299cabdff1aSopenharmony_ci    }
300cabdff1aSopenharmony_ci
301cabdff1aSopenharmony_ci    switch(avctx->codec->id) {
302cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_WAV:
303cabdff1aSopenharmony_ci        if (avctx->bits_per_coded_sample < 2 || avctx->bits_per_coded_sample > 5)
304cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
305cabdff1aSopenharmony_ci        break;
306cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_ARGO:
307cabdff1aSopenharmony_ci        if (avctx->bits_per_coded_sample != 4 ||
308cabdff1aSopenharmony_ci            avctx->block_align != 17 * avctx->ch_layout.nb_channels)
309cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
310cabdff1aSopenharmony_ci        break;
311cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_ZORK:
312cabdff1aSopenharmony_ci        if (avctx->bits_per_coded_sample != 8)
313cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
314cabdff1aSopenharmony_ci        break;
315cabdff1aSopenharmony_ci    default:
316cabdff1aSopenharmony_ci        break;
317cabdff1aSopenharmony_ci    }
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_ci    switch (avctx->codec->id) {
320cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_AICA:
321cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_CUNNING:
322cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_DAT4:
323cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_QT:
324cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_WAV:
325cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_4XM:
326cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_XA:
327cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R1:
328cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R2:
329cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R3:
330cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_XAS:
331cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP:
332cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP_LE:
333cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_AFC:
334cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_DTK:
335cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_PSX:
336cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_MTAF:
337cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_ARGO:
338cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_MOFLEX:
339cabdff1aSopenharmony_ci        avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
340cabdff1aSopenharmony_ci        break;
341cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_WS:
342cabdff1aSopenharmony_ci        avctx->sample_fmt = c->vqa_version == 3 ? AV_SAMPLE_FMT_S16P :
343cabdff1aSopenharmony_ci                                                  AV_SAMPLE_FMT_S16;
344cabdff1aSopenharmony_ci        break;
345cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_MS:
346cabdff1aSopenharmony_ci        avctx->sample_fmt = avctx->ch_layout.nb_channels > 2 ? AV_SAMPLE_FMT_S16P :
347cabdff1aSopenharmony_ci                                                  AV_SAMPLE_FMT_S16;
348cabdff1aSopenharmony_ci        break;
349cabdff1aSopenharmony_ci    default:
350cabdff1aSopenharmony_ci        avctx->sample_fmt = AV_SAMPLE_FMT_S16;
351cabdff1aSopenharmony_ci    }
352cabdff1aSopenharmony_ci    return 0;
353cabdff1aSopenharmony_ci}
354cabdff1aSopenharmony_ci
355cabdff1aSopenharmony_cistatic inline int16_t adpcm_agm_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
356cabdff1aSopenharmony_ci{
357cabdff1aSopenharmony_ci    int delta, pred, step, add;
358cabdff1aSopenharmony_ci
359cabdff1aSopenharmony_ci    pred = c->predictor;
360cabdff1aSopenharmony_ci    delta = nibble & 7;
361cabdff1aSopenharmony_ci    step = c->step;
362cabdff1aSopenharmony_ci    add = (delta * 2 + 1) * step;
363cabdff1aSopenharmony_ci    if (add < 0)
364cabdff1aSopenharmony_ci        add = add + 7;
365cabdff1aSopenharmony_ci
366cabdff1aSopenharmony_ci    if ((nibble & 8) == 0)
367cabdff1aSopenharmony_ci        pred = av_clip(pred + (add >> 3), -32767, 32767);
368cabdff1aSopenharmony_ci    else
369cabdff1aSopenharmony_ci        pred = av_clip(pred - (add >> 3), -32767, 32767);
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ci    switch (delta) {
372cabdff1aSopenharmony_ci    case 7:
373cabdff1aSopenharmony_ci        step *= 0x99;
374cabdff1aSopenharmony_ci        break;
375cabdff1aSopenharmony_ci    case 6:
376cabdff1aSopenharmony_ci        c->step = av_clip(c->step * 2, 127, 24576);
377cabdff1aSopenharmony_ci        c->predictor = pred;
378cabdff1aSopenharmony_ci        return pred;
379cabdff1aSopenharmony_ci    case 5:
380cabdff1aSopenharmony_ci        step *= 0x66;
381cabdff1aSopenharmony_ci        break;
382cabdff1aSopenharmony_ci    case 4:
383cabdff1aSopenharmony_ci        step *= 0x4d;
384cabdff1aSopenharmony_ci        break;
385cabdff1aSopenharmony_ci    default:
386cabdff1aSopenharmony_ci        step *= 0x39;
387cabdff1aSopenharmony_ci        break;
388cabdff1aSopenharmony_ci    }
389cabdff1aSopenharmony_ci
390cabdff1aSopenharmony_ci    if (step < 0)
391cabdff1aSopenharmony_ci        step += 0x3f;
392cabdff1aSopenharmony_ci
393cabdff1aSopenharmony_ci    c->step = step >> 6;
394cabdff1aSopenharmony_ci    c->step = av_clip(c->step, 127, 24576);
395cabdff1aSopenharmony_ci    c->predictor = pred;
396cabdff1aSopenharmony_ci    return pred;
397cabdff1aSopenharmony_ci}
398cabdff1aSopenharmony_ci
399cabdff1aSopenharmony_cistatic inline int16_t adpcm_ima_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int shift)
400cabdff1aSopenharmony_ci{
401cabdff1aSopenharmony_ci    int step_index;
402cabdff1aSopenharmony_ci    int predictor;
403cabdff1aSopenharmony_ci    int sign, delta, diff, step;
404cabdff1aSopenharmony_ci
405cabdff1aSopenharmony_ci    step = ff_adpcm_step_table[c->step_index];
406cabdff1aSopenharmony_ci    step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
407cabdff1aSopenharmony_ci    step_index = av_clip(step_index, 0, 88);
408cabdff1aSopenharmony_ci
409cabdff1aSopenharmony_ci    sign = nibble & 8;
410cabdff1aSopenharmony_ci    delta = nibble & 7;
411cabdff1aSopenharmony_ci    /* perform direct multiplication instead of series of jumps proposed by
412cabdff1aSopenharmony_ci     * the reference ADPCM implementation since modern CPUs can do the mults
413cabdff1aSopenharmony_ci     * quickly enough */
414cabdff1aSopenharmony_ci    diff = ((2 * delta + 1) * step) >> shift;
415cabdff1aSopenharmony_ci    predictor = c->predictor;
416cabdff1aSopenharmony_ci    if (sign) predictor -= diff;
417cabdff1aSopenharmony_ci    else predictor += diff;
418cabdff1aSopenharmony_ci
419cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(predictor);
420cabdff1aSopenharmony_ci    c->step_index = step_index;
421cabdff1aSopenharmony_ci
422cabdff1aSopenharmony_ci    return (int16_t)c->predictor;
423cabdff1aSopenharmony_ci}
424cabdff1aSopenharmony_ci
425cabdff1aSopenharmony_cistatic inline int16_t adpcm_ima_alp_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int shift)
426cabdff1aSopenharmony_ci{
427cabdff1aSopenharmony_ci    int step_index;
428cabdff1aSopenharmony_ci    int predictor;
429cabdff1aSopenharmony_ci    int sign, delta, diff, step;
430cabdff1aSopenharmony_ci
431cabdff1aSopenharmony_ci    step = ff_adpcm_step_table[c->step_index];
432cabdff1aSopenharmony_ci    step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
433cabdff1aSopenharmony_ci    step_index = av_clip(step_index, 0, 88);
434cabdff1aSopenharmony_ci
435cabdff1aSopenharmony_ci    sign = nibble & 8;
436cabdff1aSopenharmony_ci    delta = nibble & 7;
437cabdff1aSopenharmony_ci    diff = (delta * step) >> shift;
438cabdff1aSopenharmony_ci    predictor = c->predictor;
439cabdff1aSopenharmony_ci    if (sign) predictor -= diff;
440cabdff1aSopenharmony_ci    else predictor += diff;
441cabdff1aSopenharmony_ci
442cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(predictor);
443cabdff1aSopenharmony_ci    c->step_index = step_index;
444cabdff1aSopenharmony_ci
445cabdff1aSopenharmony_ci    return (int16_t)c->predictor;
446cabdff1aSopenharmony_ci}
447cabdff1aSopenharmony_ci
448cabdff1aSopenharmony_cistatic inline int16_t adpcm_ima_mtf_expand_nibble(ADPCMChannelStatus *c, int nibble)
449cabdff1aSopenharmony_ci{
450cabdff1aSopenharmony_ci    int step_index, step, delta, predictor;
451cabdff1aSopenharmony_ci
452cabdff1aSopenharmony_ci    step = ff_adpcm_step_table[c->step_index];
453cabdff1aSopenharmony_ci
454cabdff1aSopenharmony_ci    delta = step * (2 * nibble - 15);
455cabdff1aSopenharmony_ci    predictor = c->predictor + delta;
456cabdff1aSopenharmony_ci
457cabdff1aSopenharmony_ci    step_index = c->step_index + mtf_index_table[(unsigned)nibble];
458cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(predictor >> 4);
459cabdff1aSopenharmony_ci    c->step_index = av_clip(step_index, 0, 88);
460cabdff1aSopenharmony_ci
461cabdff1aSopenharmony_ci    return (int16_t)c->predictor;
462cabdff1aSopenharmony_ci}
463cabdff1aSopenharmony_ci
464cabdff1aSopenharmony_cistatic inline int16_t adpcm_ima_cunning_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
465cabdff1aSopenharmony_ci{
466cabdff1aSopenharmony_ci    int step_index;
467cabdff1aSopenharmony_ci    int predictor;
468cabdff1aSopenharmony_ci    int step;
469cabdff1aSopenharmony_ci
470cabdff1aSopenharmony_ci    nibble = sign_extend(nibble & 0xF, 4);
471cabdff1aSopenharmony_ci
472cabdff1aSopenharmony_ci    step = ima_cunning_step_table[c->step_index];
473cabdff1aSopenharmony_ci    step_index = c->step_index + ima_cunning_index_table[abs(nibble)];
474cabdff1aSopenharmony_ci    step_index = av_clip(step_index, 0, 60);
475cabdff1aSopenharmony_ci
476cabdff1aSopenharmony_ci    predictor = c->predictor + step * nibble;
477cabdff1aSopenharmony_ci
478cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(predictor);
479cabdff1aSopenharmony_ci    c->step_index = step_index;
480cabdff1aSopenharmony_ci
481cabdff1aSopenharmony_ci    return c->predictor;
482cabdff1aSopenharmony_ci}
483cabdff1aSopenharmony_ci
484cabdff1aSopenharmony_cistatic inline int16_t adpcm_ima_wav_expand_nibble(ADPCMChannelStatus *c, GetBitContext *gb, int bps)
485cabdff1aSopenharmony_ci{
486cabdff1aSopenharmony_ci    int nibble, step_index, predictor, sign, delta, diff, step, shift;
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci    shift = bps - 1;
489cabdff1aSopenharmony_ci    nibble = get_bits_le(gb, bps),
490cabdff1aSopenharmony_ci    step = ff_adpcm_step_table[c->step_index];
491cabdff1aSopenharmony_ci    step_index = c->step_index + adpcm_index_tables[bps - 2][nibble];
492cabdff1aSopenharmony_ci    step_index = av_clip(step_index, 0, 88);
493cabdff1aSopenharmony_ci
494cabdff1aSopenharmony_ci    sign = nibble & (1 << shift);
495cabdff1aSopenharmony_ci    delta = av_mod_uintp2(nibble, shift);
496cabdff1aSopenharmony_ci    diff = ((2 * delta + 1) * step) >> shift;
497cabdff1aSopenharmony_ci    predictor = c->predictor;
498cabdff1aSopenharmony_ci    if (sign) predictor -= diff;
499cabdff1aSopenharmony_ci    else predictor += diff;
500cabdff1aSopenharmony_ci
501cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(predictor);
502cabdff1aSopenharmony_ci    c->step_index = step_index;
503cabdff1aSopenharmony_ci
504cabdff1aSopenharmony_ci    return (int16_t)c->predictor;
505cabdff1aSopenharmony_ci}
506cabdff1aSopenharmony_ci
507cabdff1aSopenharmony_cistatic inline int adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble)
508cabdff1aSopenharmony_ci{
509cabdff1aSopenharmony_ci    int step_index;
510cabdff1aSopenharmony_ci    int predictor;
511cabdff1aSopenharmony_ci    int diff, step;
512cabdff1aSopenharmony_ci
513cabdff1aSopenharmony_ci    step = ff_adpcm_step_table[c->step_index];
514cabdff1aSopenharmony_ci    step_index = c->step_index + ff_adpcm_index_table[nibble];
515cabdff1aSopenharmony_ci    step_index = av_clip(step_index, 0, 88);
516cabdff1aSopenharmony_ci
517cabdff1aSopenharmony_ci    diff = step >> 3;
518cabdff1aSopenharmony_ci    if (nibble & 4) diff += step;
519cabdff1aSopenharmony_ci    if (nibble & 2) diff += step >> 1;
520cabdff1aSopenharmony_ci    if (nibble & 1) diff += step >> 2;
521cabdff1aSopenharmony_ci
522cabdff1aSopenharmony_ci    if (nibble & 8)
523cabdff1aSopenharmony_ci        predictor = c->predictor - diff;
524cabdff1aSopenharmony_ci    else
525cabdff1aSopenharmony_ci        predictor = c->predictor + diff;
526cabdff1aSopenharmony_ci
527cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(predictor);
528cabdff1aSopenharmony_ci    c->step_index = step_index;
529cabdff1aSopenharmony_ci
530cabdff1aSopenharmony_ci    return c->predictor;
531cabdff1aSopenharmony_ci}
532cabdff1aSopenharmony_ci
533cabdff1aSopenharmony_cistatic inline int16_t adpcm_ms_expand_nibble(ADPCMChannelStatus *c, int nibble)
534cabdff1aSopenharmony_ci{
535cabdff1aSopenharmony_ci    int predictor;
536cabdff1aSopenharmony_ci
537cabdff1aSopenharmony_ci    predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 64;
538cabdff1aSopenharmony_ci    predictor += ((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta;
539cabdff1aSopenharmony_ci
540cabdff1aSopenharmony_ci    c->sample2 = c->sample1;
541cabdff1aSopenharmony_ci    c->sample1 = av_clip_int16(predictor);
542cabdff1aSopenharmony_ci    c->idelta = (ff_adpcm_AdaptationTable[(int)nibble] * c->idelta) >> 8;
543cabdff1aSopenharmony_ci    if (c->idelta < 16) c->idelta = 16;
544cabdff1aSopenharmony_ci    if (c->idelta > INT_MAX/768) {
545cabdff1aSopenharmony_ci        av_log(NULL, AV_LOG_WARNING, "idelta overflow\n");
546cabdff1aSopenharmony_ci        c->idelta = INT_MAX/768;
547cabdff1aSopenharmony_ci    }
548cabdff1aSopenharmony_ci
549cabdff1aSopenharmony_ci    return c->sample1;
550cabdff1aSopenharmony_ci}
551cabdff1aSopenharmony_ci
552cabdff1aSopenharmony_cistatic inline int16_t adpcm_ima_oki_expand_nibble(ADPCMChannelStatus *c, int nibble)
553cabdff1aSopenharmony_ci{
554cabdff1aSopenharmony_ci    int step_index, predictor, sign, delta, diff, step;
555cabdff1aSopenharmony_ci
556cabdff1aSopenharmony_ci    step = oki_step_table[c->step_index];
557cabdff1aSopenharmony_ci    step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
558cabdff1aSopenharmony_ci    step_index = av_clip(step_index, 0, 48);
559cabdff1aSopenharmony_ci
560cabdff1aSopenharmony_ci    sign = nibble & 8;
561cabdff1aSopenharmony_ci    delta = nibble & 7;
562cabdff1aSopenharmony_ci    diff = ((2 * delta + 1) * step) >> 3;
563cabdff1aSopenharmony_ci    predictor = c->predictor;
564cabdff1aSopenharmony_ci    if (sign) predictor -= diff;
565cabdff1aSopenharmony_ci    else predictor += diff;
566cabdff1aSopenharmony_ci
567cabdff1aSopenharmony_ci    c->predictor = av_clip_intp2(predictor, 11);
568cabdff1aSopenharmony_ci    c->step_index = step_index;
569cabdff1aSopenharmony_ci
570cabdff1aSopenharmony_ci    return c->predictor * 16;
571cabdff1aSopenharmony_ci}
572cabdff1aSopenharmony_ci
573cabdff1aSopenharmony_cistatic inline int16_t adpcm_ct_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
574cabdff1aSopenharmony_ci{
575cabdff1aSopenharmony_ci    int sign, delta, diff;
576cabdff1aSopenharmony_ci    int new_step;
577cabdff1aSopenharmony_ci
578cabdff1aSopenharmony_ci    sign = nibble & 8;
579cabdff1aSopenharmony_ci    delta = nibble & 7;
580cabdff1aSopenharmony_ci    /* perform direct multiplication instead of series of jumps proposed by
581cabdff1aSopenharmony_ci     * the reference ADPCM implementation since modern CPUs can do the mults
582cabdff1aSopenharmony_ci     * quickly enough */
583cabdff1aSopenharmony_ci    diff = ((2 * delta + 1) * c->step) >> 3;
584cabdff1aSopenharmony_ci    /* predictor update is not so trivial: predictor is multiplied on 254/256 before updating */
585cabdff1aSopenharmony_ci    c->predictor = ((c->predictor * 254) >> 8) + (sign ? -diff : diff);
586cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(c->predictor);
587cabdff1aSopenharmony_ci    /* calculate new step and clamp it to range 511..32767 */
588cabdff1aSopenharmony_ci    new_step = (ff_adpcm_AdaptationTable[nibble & 7] * c->step) >> 8;
589cabdff1aSopenharmony_ci    c->step = av_clip(new_step, 511, 32767);
590cabdff1aSopenharmony_ci
591cabdff1aSopenharmony_ci    return (int16_t)c->predictor;
592cabdff1aSopenharmony_ci}
593cabdff1aSopenharmony_ci
594cabdff1aSopenharmony_cistatic inline int16_t adpcm_sbpro_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int size, int shift)
595cabdff1aSopenharmony_ci{
596cabdff1aSopenharmony_ci    int sign, delta, diff;
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_ci    sign = nibble & (1<<(size-1));
599cabdff1aSopenharmony_ci    delta = nibble & ((1<<(size-1))-1);
600cabdff1aSopenharmony_ci    diff = delta << (7 + c->step + shift);
601cabdff1aSopenharmony_ci
602cabdff1aSopenharmony_ci    /* clamp result */
603cabdff1aSopenharmony_ci    c->predictor = av_clip(c->predictor + (sign ? -diff : diff), -16384,16256);
604cabdff1aSopenharmony_ci
605cabdff1aSopenharmony_ci    /* calculate new step */
606cabdff1aSopenharmony_ci    if (delta >= (2*size - 3) && c->step < 3)
607cabdff1aSopenharmony_ci        c->step++;
608cabdff1aSopenharmony_ci    else if (delta == 0 && c->step > 0)
609cabdff1aSopenharmony_ci        c->step--;
610cabdff1aSopenharmony_ci
611cabdff1aSopenharmony_ci    return (int16_t) c->predictor;
612cabdff1aSopenharmony_ci}
613cabdff1aSopenharmony_ci
614cabdff1aSopenharmony_cistatic inline int16_t adpcm_yamaha_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
615cabdff1aSopenharmony_ci{
616cabdff1aSopenharmony_ci    if(!c->step) {
617cabdff1aSopenharmony_ci        c->predictor = 0;
618cabdff1aSopenharmony_ci        c->step = 127;
619cabdff1aSopenharmony_ci    }
620cabdff1aSopenharmony_ci
621cabdff1aSopenharmony_ci    c->predictor += (c->step * ff_adpcm_yamaha_difflookup[nibble]) / 8;
622cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(c->predictor);
623cabdff1aSopenharmony_ci    c->step = (c->step * ff_adpcm_yamaha_indexscale[nibble]) >> 8;
624cabdff1aSopenharmony_ci    c->step = av_clip(c->step, 127, 24576);
625cabdff1aSopenharmony_ci    return c->predictor;
626cabdff1aSopenharmony_ci}
627cabdff1aSopenharmony_ci
628cabdff1aSopenharmony_cistatic inline int16_t adpcm_mtaf_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
629cabdff1aSopenharmony_ci{
630cabdff1aSopenharmony_ci    c->predictor += mtaf_stepsize[c->step][nibble];
631cabdff1aSopenharmony_ci    c->predictor = av_clip_int16(c->predictor);
632cabdff1aSopenharmony_ci    c->step += ff_adpcm_index_table[nibble];
633cabdff1aSopenharmony_ci    c->step = av_clip_uintp2(c->step, 5);
634cabdff1aSopenharmony_ci    return c->predictor;
635cabdff1aSopenharmony_ci}
636cabdff1aSopenharmony_ci
637cabdff1aSopenharmony_cistatic inline int16_t adpcm_zork_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
638cabdff1aSopenharmony_ci{
639cabdff1aSopenharmony_ci    int16_t index = c->step_index;
640cabdff1aSopenharmony_ci    uint32_t lookup_sample = ff_adpcm_step_table[index];
641cabdff1aSopenharmony_ci    int32_t sample = 0;
642cabdff1aSopenharmony_ci
643cabdff1aSopenharmony_ci    if (nibble & 0x40)
644cabdff1aSopenharmony_ci        sample += lookup_sample;
645cabdff1aSopenharmony_ci    if (nibble & 0x20)
646cabdff1aSopenharmony_ci        sample += lookup_sample >> 1;
647cabdff1aSopenharmony_ci    if (nibble & 0x10)
648cabdff1aSopenharmony_ci        sample += lookup_sample >> 2;
649cabdff1aSopenharmony_ci    if (nibble & 0x08)
650cabdff1aSopenharmony_ci        sample += lookup_sample >> 3;
651cabdff1aSopenharmony_ci    if (nibble & 0x04)
652cabdff1aSopenharmony_ci        sample += lookup_sample >> 4;
653cabdff1aSopenharmony_ci    if (nibble & 0x02)
654cabdff1aSopenharmony_ci        sample += lookup_sample >> 5;
655cabdff1aSopenharmony_ci    if (nibble & 0x01)
656cabdff1aSopenharmony_ci        sample += lookup_sample >> 6;
657cabdff1aSopenharmony_ci    if (nibble & 0x80)
658cabdff1aSopenharmony_ci        sample = -sample;
659cabdff1aSopenharmony_ci
660cabdff1aSopenharmony_ci    sample += c->predictor;
661cabdff1aSopenharmony_ci    sample = av_clip_int16(sample);
662cabdff1aSopenharmony_ci
663cabdff1aSopenharmony_ci    index += zork_index_table[(nibble >> 4) & 7];
664cabdff1aSopenharmony_ci    index = av_clip(index, 0, 88);
665cabdff1aSopenharmony_ci
666cabdff1aSopenharmony_ci    c->predictor = sample;
667cabdff1aSopenharmony_ci    c->step_index = index;
668cabdff1aSopenharmony_ci
669cabdff1aSopenharmony_ci    return sample;
670cabdff1aSopenharmony_ci}
671cabdff1aSopenharmony_ci
672cabdff1aSopenharmony_cistatic int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
673cabdff1aSopenharmony_ci                     const uint8_t *in, ADPCMChannelStatus *left,
674cabdff1aSopenharmony_ci                     ADPCMChannelStatus *right, int channels, int sample_offset)
675cabdff1aSopenharmony_ci{
676cabdff1aSopenharmony_ci    int i, j;
677cabdff1aSopenharmony_ci    int shift,filter,f0,f1;
678cabdff1aSopenharmony_ci    int s_1,s_2;
679cabdff1aSopenharmony_ci    int d,s,t;
680cabdff1aSopenharmony_ci
681cabdff1aSopenharmony_ci    out0 += sample_offset;
682cabdff1aSopenharmony_ci    if (channels == 1)
683cabdff1aSopenharmony_ci        out1 = out0 + 28;
684cabdff1aSopenharmony_ci    else
685cabdff1aSopenharmony_ci        out1 += sample_offset;
686cabdff1aSopenharmony_ci
687cabdff1aSopenharmony_ci    for(i=0;i<4;i++) {
688cabdff1aSopenharmony_ci        shift  = 12 - (in[4+i*2] & 15);
689cabdff1aSopenharmony_ci        filter = in[4+i*2] >> 4;
690cabdff1aSopenharmony_ci        if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
691cabdff1aSopenharmony_ci            avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
692cabdff1aSopenharmony_ci            filter=0;
693cabdff1aSopenharmony_ci        }
694cabdff1aSopenharmony_ci        if (shift < 0) {
695cabdff1aSopenharmony_ci            avpriv_request_sample(avctx, "unknown XA-ADPCM shift %d", shift);
696cabdff1aSopenharmony_ci            shift = 0;
697cabdff1aSopenharmony_ci        }
698cabdff1aSopenharmony_ci        f0 = xa_adpcm_table[filter][0];
699cabdff1aSopenharmony_ci        f1 = xa_adpcm_table[filter][1];
700cabdff1aSopenharmony_ci
701cabdff1aSopenharmony_ci        s_1 = left->sample1;
702cabdff1aSopenharmony_ci        s_2 = left->sample2;
703cabdff1aSopenharmony_ci
704cabdff1aSopenharmony_ci        for(j=0;j<28;j++) {
705cabdff1aSopenharmony_ci            d = in[16+i+j*4];
706cabdff1aSopenharmony_ci
707cabdff1aSopenharmony_ci            t = sign_extend(d, 4);
708cabdff1aSopenharmony_ci            s = t*(1<<shift) + ((s_1*f0 + s_2*f1+32)>>6);
709cabdff1aSopenharmony_ci            s_2 = s_1;
710cabdff1aSopenharmony_ci            s_1 = av_clip_int16(s);
711cabdff1aSopenharmony_ci            out0[j] = s_1;
712cabdff1aSopenharmony_ci        }
713cabdff1aSopenharmony_ci
714cabdff1aSopenharmony_ci        if (channels == 2) {
715cabdff1aSopenharmony_ci            left->sample1 = s_1;
716cabdff1aSopenharmony_ci            left->sample2 = s_2;
717cabdff1aSopenharmony_ci            s_1 = right->sample1;
718cabdff1aSopenharmony_ci            s_2 = right->sample2;
719cabdff1aSopenharmony_ci        }
720cabdff1aSopenharmony_ci
721cabdff1aSopenharmony_ci        shift  = 12 - (in[5+i*2] & 15);
722cabdff1aSopenharmony_ci        filter = in[5+i*2] >> 4;
723cabdff1aSopenharmony_ci        if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table) || shift < 0) {
724cabdff1aSopenharmony_ci            avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
725cabdff1aSopenharmony_ci            filter=0;
726cabdff1aSopenharmony_ci        }
727cabdff1aSopenharmony_ci        if (shift < 0) {
728cabdff1aSopenharmony_ci            avpriv_request_sample(avctx, "unknown XA-ADPCM shift %d", shift);
729cabdff1aSopenharmony_ci            shift = 0;
730cabdff1aSopenharmony_ci        }
731cabdff1aSopenharmony_ci
732cabdff1aSopenharmony_ci        f0 = xa_adpcm_table[filter][0];
733cabdff1aSopenharmony_ci        f1 = xa_adpcm_table[filter][1];
734cabdff1aSopenharmony_ci
735cabdff1aSopenharmony_ci        for(j=0;j<28;j++) {
736cabdff1aSopenharmony_ci            d = in[16+i+j*4];
737cabdff1aSopenharmony_ci
738cabdff1aSopenharmony_ci            t = sign_extend(d >> 4, 4);
739cabdff1aSopenharmony_ci            s = t*(1<<shift) + ((s_1*f0 + s_2*f1+32)>>6);
740cabdff1aSopenharmony_ci            s_2 = s_1;
741cabdff1aSopenharmony_ci            s_1 = av_clip_int16(s);
742cabdff1aSopenharmony_ci            out1[j] = s_1;
743cabdff1aSopenharmony_ci        }
744cabdff1aSopenharmony_ci
745cabdff1aSopenharmony_ci        if (channels == 2) {
746cabdff1aSopenharmony_ci            right->sample1 = s_1;
747cabdff1aSopenharmony_ci            right->sample2 = s_2;
748cabdff1aSopenharmony_ci        } else {
749cabdff1aSopenharmony_ci            left->sample1 = s_1;
750cabdff1aSopenharmony_ci            left->sample2 = s_2;
751cabdff1aSopenharmony_ci        }
752cabdff1aSopenharmony_ci
753cabdff1aSopenharmony_ci        out0 += 28 * (3 - channels);
754cabdff1aSopenharmony_ci        out1 += 28 * (3 - channels);
755cabdff1aSopenharmony_ci    }
756cabdff1aSopenharmony_ci
757cabdff1aSopenharmony_ci    return 0;
758cabdff1aSopenharmony_ci}
759cabdff1aSopenharmony_ci
760cabdff1aSopenharmony_cistatic void adpcm_swf_decode(AVCodecContext *avctx, const uint8_t *buf, int buf_size, int16_t *samples)
761cabdff1aSopenharmony_ci{
762cabdff1aSopenharmony_ci    ADPCMDecodeContext *c = avctx->priv_data;
763cabdff1aSopenharmony_ci    GetBitContext gb;
764cabdff1aSopenharmony_ci    const int8_t *table;
765cabdff1aSopenharmony_ci    int channels = avctx->ch_layout.nb_channels;
766cabdff1aSopenharmony_ci    int k0, signmask, nb_bits, count;
767cabdff1aSopenharmony_ci    int size = buf_size*8;
768cabdff1aSopenharmony_ci    int i;
769cabdff1aSopenharmony_ci
770cabdff1aSopenharmony_ci    init_get_bits(&gb, buf, size);
771cabdff1aSopenharmony_ci
772cabdff1aSopenharmony_ci    //read bits & initial values
773cabdff1aSopenharmony_ci    nb_bits = get_bits(&gb, 2)+2;
774cabdff1aSopenharmony_ci    table = swf_index_tables[nb_bits-2];
775cabdff1aSopenharmony_ci    k0 = 1 << (nb_bits-2);
776cabdff1aSopenharmony_ci    signmask = 1 << (nb_bits-1);
777cabdff1aSopenharmony_ci
778cabdff1aSopenharmony_ci    while (get_bits_count(&gb) <= size - 22 * channels) {
779cabdff1aSopenharmony_ci        for (i = 0; i < channels; i++) {
780cabdff1aSopenharmony_ci            *samples++ = c->status[i].predictor = get_sbits(&gb, 16);
781cabdff1aSopenharmony_ci            c->status[i].step_index = get_bits(&gb, 6);
782cabdff1aSopenharmony_ci        }
783cabdff1aSopenharmony_ci
784cabdff1aSopenharmony_ci        for (count = 0; get_bits_count(&gb) <= size - nb_bits * channels && count < 4095; count++) {
785cabdff1aSopenharmony_ci            int i;
786cabdff1aSopenharmony_ci
787cabdff1aSopenharmony_ci            for (i = 0; i < channels; i++) {
788cabdff1aSopenharmony_ci                // similar to IMA adpcm
789cabdff1aSopenharmony_ci                int delta = get_bits(&gb, nb_bits);
790cabdff1aSopenharmony_ci                int step = ff_adpcm_step_table[c->status[i].step_index];
791cabdff1aSopenharmony_ci                int vpdiff = 0; // vpdiff = (delta+0.5)*step/4
792cabdff1aSopenharmony_ci                int k = k0;
793cabdff1aSopenharmony_ci
794cabdff1aSopenharmony_ci                do {
795cabdff1aSopenharmony_ci                    if (delta & k)
796cabdff1aSopenharmony_ci                        vpdiff += step;
797cabdff1aSopenharmony_ci                    step >>= 1;
798cabdff1aSopenharmony_ci                    k >>= 1;
799cabdff1aSopenharmony_ci                } while(k);
800cabdff1aSopenharmony_ci                vpdiff += step;
801cabdff1aSopenharmony_ci
802cabdff1aSopenharmony_ci                if (delta & signmask)
803cabdff1aSopenharmony_ci                    c->status[i].predictor -= vpdiff;
804cabdff1aSopenharmony_ci                else
805cabdff1aSopenharmony_ci                    c->status[i].predictor += vpdiff;
806cabdff1aSopenharmony_ci
807cabdff1aSopenharmony_ci                c->status[i].step_index += table[delta & (~signmask)];
808cabdff1aSopenharmony_ci
809cabdff1aSopenharmony_ci                c->status[i].step_index = av_clip(c->status[i].step_index, 0, 88);
810cabdff1aSopenharmony_ci                c->status[i].predictor = av_clip_int16(c->status[i].predictor);
811cabdff1aSopenharmony_ci
812cabdff1aSopenharmony_ci                *samples++ = c->status[i].predictor;
813cabdff1aSopenharmony_ci            }
814cabdff1aSopenharmony_ci        }
815cabdff1aSopenharmony_ci    }
816cabdff1aSopenharmony_ci}
817cabdff1aSopenharmony_ci
818cabdff1aSopenharmony_ciint16_t ff_adpcm_argo_expand_nibble(ADPCMChannelStatus *cs, int nibble, int shift, int flag)
819cabdff1aSopenharmony_ci{
820cabdff1aSopenharmony_ci    int sample = sign_extend(nibble, 4) * (1 << shift);
821cabdff1aSopenharmony_ci
822cabdff1aSopenharmony_ci    if (flag)
823cabdff1aSopenharmony_ci        sample += (8 * cs->sample1) - (4 * cs->sample2);
824cabdff1aSopenharmony_ci    else
825cabdff1aSopenharmony_ci        sample += 4 * cs->sample1;
826cabdff1aSopenharmony_ci
827cabdff1aSopenharmony_ci    sample = av_clip_int16(sample >> 2);
828cabdff1aSopenharmony_ci
829cabdff1aSopenharmony_ci    cs->sample2 = cs->sample1;
830cabdff1aSopenharmony_ci    cs->sample1 = sample;
831cabdff1aSopenharmony_ci
832cabdff1aSopenharmony_ci    return sample;
833cabdff1aSopenharmony_ci}
834cabdff1aSopenharmony_ci
835cabdff1aSopenharmony_ci/**
836cabdff1aSopenharmony_ci * Get the number of samples (per channel) that will be decoded from the packet.
837cabdff1aSopenharmony_ci * In one case, this is actually the maximum number of samples possible to
838cabdff1aSopenharmony_ci * decode with the given buf_size.
839cabdff1aSopenharmony_ci *
840cabdff1aSopenharmony_ci * @param[out] coded_samples set to the number of samples as coded in the
841cabdff1aSopenharmony_ci *                           packet, or 0 if the codec does not encode the
842cabdff1aSopenharmony_ci *                           number of samples in each frame.
843cabdff1aSopenharmony_ci * @param[out] approx_nb_samples set to non-zero if the number of samples
844cabdff1aSopenharmony_ci *                               returned is an approximation.
845cabdff1aSopenharmony_ci */
846cabdff1aSopenharmony_cistatic int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
847cabdff1aSopenharmony_ci                          int buf_size, int *coded_samples, int *approx_nb_samples)
848cabdff1aSopenharmony_ci{
849cabdff1aSopenharmony_ci    ADPCMDecodeContext *s = avctx->priv_data;
850cabdff1aSopenharmony_ci    int nb_samples        = 0;
851cabdff1aSopenharmony_ci    int ch                = avctx->ch_layout.nb_channels;
852cabdff1aSopenharmony_ci    int has_coded_samples = 0;
853cabdff1aSopenharmony_ci    int header_size;
854cabdff1aSopenharmony_ci
855cabdff1aSopenharmony_ci    *coded_samples = 0;
856cabdff1aSopenharmony_ci    *approx_nb_samples = 0;
857cabdff1aSopenharmony_ci
858cabdff1aSopenharmony_ci    if(ch <= 0)
859cabdff1aSopenharmony_ci        return 0;
860cabdff1aSopenharmony_ci
861cabdff1aSopenharmony_ci    switch (avctx->codec->id) {
862cabdff1aSopenharmony_ci    /* constant, only check buf_size */
863cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_XAS:
864cabdff1aSopenharmony_ci        if (buf_size < 76 * ch)
865cabdff1aSopenharmony_ci            return 0;
866cabdff1aSopenharmony_ci        nb_samples = 128;
867cabdff1aSopenharmony_ci        break;
868cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_QT:
869cabdff1aSopenharmony_ci        if (buf_size < 34 * ch)
870cabdff1aSopenharmony_ci            return 0;
871cabdff1aSopenharmony_ci        nb_samples = 64;
872cabdff1aSopenharmony_ci        break;
873cabdff1aSopenharmony_ci    /* simple 4-bit adpcm */
874cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_CT:
875cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_APC:
876cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_CUNNING:
877cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
878cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_OKI:
879cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_WS:
880cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_YAMAHA:
881cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_AICA:
882cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_SSI:
883cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_APM:
884cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_ALP:
885cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_MTF:
886cabdff1aSopenharmony_ci        nb_samples = buf_size * 2 / ch;
887cabdff1aSopenharmony_ci        break;
888cabdff1aSopenharmony_ci    }
889cabdff1aSopenharmony_ci    if (nb_samples)
890cabdff1aSopenharmony_ci        return nb_samples;
891cabdff1aSopenharmony_ci
892cabdff1aSopenharmony_ci    /* simple 4-bit adpcm, with header */
893cabdff1aSopenharmony_ci    header_size = 0;
894cabdff1aSopenharmony_ci    switch (avctx->codec->id) {
895cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_4XM:
896cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_AGM:
897cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_IMA_ACORN:
898cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_IMA_DAT4:
899cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_IMA_MOFLEX:
900cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_IMA_ISS:     header_size = 4 * ch;      break;
901cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_IMA_SMJPEG:  header_size = 4 * ch;      break;
902cabdff1aSopenharmony_ci    }
903cabdff1aSopenharmony_ci    if (header_size > 0)
904cabdff1aSopenharmony_ci        return (buf_size - header_size) * 2 / ch;
905cabdff1aSopenharmony_ci
906cabdff1aSopenharmony_ci    /* more complex formats */
907cabdff1aSopenharmony_ci    switch (avctx->codec->id) {
908cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_AMV:
909cabdff1aSopenharmony_ci        bytestream2_skip(gb, 4);
910cabdff1aSopenharmony_ci        has_coded_samples  = 1;
911cabdff1aSopenharmony_ci        *coded_samples     = bytestream2_get_le32u(gb);
912cabdff1aSopenharmony_ci        nb_samples         = FFMIN((buf_size - 8) * 2, *coded_samples);
913cabdff1aSopenharmony_ci        bytestream2_seek(gb, -8, SEEK_CUR);
914cabdff1aSopenharmony_ci        break;
915cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA:
916cabdff1aSopenharmony_ci        has_coded_samples = 1;
917cabdff1aSopenharmony_ci        *coded_samples  = bytestream2_get_le32(gb);
918cabdff1aSopenharmony_ci        *coded_samples -= *coded_samples % 28;
919cabdff1aSopenharmony_ci        nb_samples      = (buf_size - 12) / 30 * 28;
920cabdff1aSopenharmony_ci        break;
921cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_EA_EACS:
922cabdff1aSopenharmony_ci        has_coded_samples = 1;
923cabdff1aSopenharmony_ci        *coded_samples = bytestream2_get_le32(gb);
924cabdff1aSopenharmony_ci        nb_samples     = (buf_size - (4 + 8 * ch)) * 2 / ch;
925cabdff1aSopenharmony_ci        break;
926cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_MAXIS_XA:
927cabdff1aSopenharmony_ci        nb_samples = (buf_size - ch) / ch * 2;
928cabdff1aSopenharmony_ci        break;
929cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R1:
930cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R2:
931cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R3:
932cabdff1aSopenharmony_ci        /* maximum number of samples */
933cabdff1aSopenharmony_ci        /* has internal offsets and a per-frame switch to signal raw 16-bit */
934cabdff1aSopenharmony_ci        has_coded_samples = 1;
935cabdff1aSopenharmony_ci        switch (avctx->codec->id) {
936cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_EA_R1:
937cabdff1aSopenharmony_ci            header_size    = 4 + 9 * ch;
938cabdff1aSopenharmony_ci            *coded_samples = bytestream2_get_le32(gb);
939cabdff1aSopenharmony_ci            break;
940cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_EA_R2:
941cabdff1aSopenharmony_ci            header_size    = 4 + 5 * ch;
942cabdff1aSopenharmony_ci            *coded_samples = bytestream2_get_le32(gb);
943cabdff1aSopenharmony_ci            break;
944cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_EA_R3:
945cabdff1aSopenharmony_ci            header_size    = 4 + 5 * ch;
946cabdff1aSopenharmony_ci            *coded_samples = bytestream2_get_be32(gb);
947cabdff1aSopenharmony_ci            break;
948cabdff1aSopenharmony_ci        }
949cabdff1aSopenharmony_ci        *coded_samples -= *coded_samples % 28;
950cabdff1aSopenharmony_ci        nb_samples      = (buf_size - header_size) * 2 / ch;
951cabdff1aSopenharmony_ci        nb_samples     -= nb_samples % 28;
952cabdff1aSopenharmony_ci        *approx_nb_samples = 1;
953cabdff1aSopenharmony_ci        break;
954cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_DK3:
955cabdff1aSopenharmony_ci        if (avctx->block_align > 0)
956cabdff1aSopenharmony_ci            buf_size = FFMIN(buf_size, avctx->block_align);
957cabdff1aSopenharmony_ci        nb_samples = ((buf_size - 16) * 2 / 3 * 4) / ch;
958cabdff1aSopenharmony_ci        break;
959cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_DK4:
960cabdff1aSopenharmony_ci        if (avctx->block_align > 0)
961cabdff1aSopenharmony_ci            buf_size = FFMIN(buf_size, avctx->block_align);
962cabdff1aSopenharmony_ci        if (buf_size < 4 * ch)
963cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
964cabdff1aSopenharmony_ci        nb_samples = 1 + (buf_size - 4 * ch) * 2 / ch;
965cabdff1aSopenharmony_ci        break;
966cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_RAD:
967cabdff1aSopenharmony_ci        if (avctx->block_align > 0)
968cabdff1aSopenharmony_ci            buf_size = FFMIN(buf_size, avctx->block_align);
969cabdff1aSopenharmony_ci        nb_samples = (buf_size - 4 * ch) * 2 / ch;
970cabdff1aSopenharmony_ci        break;
971cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_WAV,
972cabdff1aSopenharmony_ci        int bsize = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
973cabdff1aSopenharmony_ci        int bsamples = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
974cabdff1aSopenharmony_ci        if (avctx->block_align > 0)
975cabdff1aSopenharmony_ci            buf_size = FFMIN(buf_size, avctx->block_align);
976cabdff1aSopenharmony_ci        if (buf_size < 4 * ch)
977cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
978cabdff1aSopenharmony_ci        nb_samples = 1 + (buf_size - 4 * ch) / (bsize * ch) * bsamples;
979cabdff1aSopenharmony_ci        ) /* End of CASE */
980cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_MS:
981cabdff1aSopenharmony_ci        if (avctx->block_align > 0)
982cabdff1aSopenharmony_ci            buf_size = FFMIN(buf_size, avctx->block_align);
983cabdff1aSopenharmony_ci        nb_samples = (buf_size - 6 * ch) * 2 / ch;
984cabdff1aSopenharmony_ci        break;
985cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_MTAF:
986cabdff1aSopenharmony_ci        if (avctx->block_align > 0)
987cabdff1aSopenharmony_ci            buf_size = FFMIN(buf_size, avctx->block_align);
988cabdff1aSopenharmony_ci        nb_samples = (buf_size - 16 * (ch / 2)) * 2 / ch;
989cabdff1aSopenharmony_ci        break;
990cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_SBPRO_2:
991cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_SBPRO_3:
992cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_SBPRO_4:
993cabdff1aSopenharmony_ci    {
994cabdff1aSopenharmony_ci        int samples_per_byte;
995cabdff1aSopenharmony_ci        switch (avctx->codec->id) {
996cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_SBPRO_2: samples_per_byte = 4; break;
997cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_SBPRO_3: samples_per_byte = 3; break;
998cabdff1aSopenharmony_ci        case AV_CODEC_ID_ADPCM_SBPRO_4: samples_per_byte = 2; break;
999cabdff1aSopenharmony_ci        }
1000cabdff1aSopenharmony_ci        if (!s->status[0].step_index) {
1001cabdff1aSopenharmony_ci            if (buf_size < ch)
1002cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1003cabdff1aSopenharmony_ci            nb_samples++;
1004cabdff1aSopenharmony_ci            buf_size -= ch;
1005cabdff1aSopenharmony_ci        }
1006cabdff1aSopenharmony_ci        nb_samples += buf_size * samples_per_byte / ch;
1007cabdff1aSopenharmony_ci        break;
1008cabdff1aSopenharmony_ci    }
1009cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_SWF:
1010cabdff1aSopenharmony_ci    {
1011cabdff1aSopenharmony_ci        int buf_bits       = buf_size * 8 - 2;
1012cabdff1aSopenharmony_ci        int nbits          = (bytestream2_get_byte(gb) >> 6) + 2;
1013cabdff1aSopenharmony_ci        int block_hdr_size = 22 * ch;
1014cabdff1aSopenharmony_ci        int block_size     = block_hdr_size + nbits * ch * 4095;
1015cabdff1aSopenharmony_ci        int nblocks        = buf_bits / block_size;
1016cabdff1aSopenharmony_ci        int bits_left      = buf_bits - nblocks * block_size;
1017cabdff1aSopenharmony_ci        nb_samples         = nblocks * 4096;
1018cabdff1aSopenharmony_ci        if (bits_left >= block_hdr_size)
1019cabdff1aSopenharmony_ci            nb_samples += 1 + (bits_left - block_hdr_size) / (nbits * ch);
1020cabdff1aSopenharmony_ci        break;
1021cabdff1aSopenharmony_ci    }
1022cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP:
1023cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP_LE:
1024cabdff1aSopenharmony_ci        if (avctx->extradata) {
1025cabdff1aSopenharmony_ci            nb_samples = buf_size * 14 / (8 * ch);
1026cabdff1aSopenharmony_ci            break;
1027cabdff1aSopenharmony_ci        }
1028cabdff1aSopenharmony_ci        has_coded_samples = 1;
1029cabdff1aSopenharmony_ci        bytestream2_skip(gb, 4); // channel size
1030cabdff1aSopenharmony_ci        *coded_samples  = (avctx->codec->id == AV_CODEC_ID_ADPCM_THP_LE) ?
1031cabdff1aSopenharmony_ci                          bytestream2_get_le32(gb) :
1032cabdff1aSopenharmony_ci                          bytestream2_get_be32(gb);
1033cabdff1aSopenharmony_ci        buf_size       -= 8 + 36 * ch;
1034cabdff1aSopenharmony_ci        buf_size       /= ch;
1035cabdff1aSopenharmony_ci        nb_samples      = buf_size / 8 * 14;
1036cabdff1aSopenharmony_ci        if (buf_size % 8 > 1)
1037cabdff1aSopenharmony_ci            nb_samples     += (buf_size % 8 - 1) * 2;
1038cabdff1aSopenharmony_ci        *approx_nb_samples = 1;
1039cabdff1aSopenharmony_ci        break;
1040cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_AFC:
1041cabdff1aSopenharmony_ci        nb_samples = buf_size / (9 * ch) * 16;
1042cabdff1aSopenharmony_ci        break;
1043cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_XA:
1044cabdff1aSopenharmony_ci        nb_samples = (buf_size / 128) * 224 / ch;
1045cabdff1aSopenharmony_ci        break;
1046cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_DTK:
1047cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_PSX:
1048cabdff1aSopenharmony_ci        nb_samples = buf_size / (16 * ch) * 28;
1049cabdff1aSopenharmony_ci        break;
1050cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_ARGO:
1051cabdff1aSopenharmony_ci        nb_samples = buf_size / avctx->block_align * 32;
1052cabdff1aSopenharmony_ci        break;
1053cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_ZORK:
1054cabdff1aSopenharmony_ci        nb_samples = buf_size / ch;
1055cabdff1aSopenharmony_ci        break;
1056cabdff1aSopenharmony_ci    }
1057cabdff1aSopenharmony_ci
1058cabdff1aSopenharmony_ci    /* validate coded sample count */
1059cabdff1aSopenharmony_ci    if (has_coded_samples && (*coded_samples <= 0 || *coded_samples > nb_samples))
1060cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1061cabdff1aSopenharmony_ci
1062cabdff1aSopenharmony_ci    return nb_samples;
1063cabdff1aSopenharmony_ci}
1064cabdff1aSopenharmony_ci
1065cabdff1aSopenharmony_cistatic int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1066cabdff1aSopenharmony_ci                              int *got_frame_ptr, AVPacket *avpkt)
1067cabdff1aSopenharmony_ci{
1068cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
1069cabdff1aSopenharmony_ci    int buf_size = avpkt->size;
1070cabdff1aSopenharmony_ci    ADPCMDecodeContext *c = avctx->priv_data;
1071cabdff1aSopenharmony_ci    int channels = avctx->ch_layout.nb_channels;
1072cabdff1aSopenharmony_ci    int16_t *samples;
1073cabdff1aSopenharmony_ci    int16_t **samples_p;
1074cabdff1aSopenharmony_ci    int st; /* stereo */
1075cabdff1aSopenharmony_ci    int nb_samples, coded_samples, approx_nb_samples, ret;
1076cabdff1aSopenharmony_ci    GetByteContext gb;
1077cabdff1aSopenharmony_ci
1078cabdff1aSopenharmony_ci    bytestream2_init(&gb, buf, buf_size);
1079cabdff1aSopenharmony_ci    nb_samples = get_nb_samples(avctx, &gb, buf_size, &coded_samples, &approx_nb_samples);
1080cabdff1aSopenharmony_ci    if (nb_samples <= 0) {
1081cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "invalid number of samples in packet\n");
1082cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1083cabdff1aSopenharmony_ci    }
1084cabdff1aSopenharmony_ci
1085cabdff1aSopenharmony_ci    /* get output buffer */
1086cabdff1aSopenharmony_ci    frame->nb_samples = nb_samples;
1087cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
1088cabdff1aSopenharmony_ci        return ret;
1089cabdff1aSopenharmony_ci    samples = (int16_t *)frame->data[0];
1090cabdff1aSopenharmony_ci    samples_p = (int16_t **)frame->extended_data;
1091cabdff1aSopenharmony_ci
1092cabdff1aSopenharmony_ci    /* use coded_samples when applicable */
1093cabdff1aSopenharmony_ci    /* it is always <= nb_samples, so the output buffer will be large enough */
1094cabdff1aSopenharmony_ci    if (coded_samples) {
1095cabdff1aSopenharmony_ci        if (!approx_nb_samples && coded_samples != nb_samples)
1096cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_WARNING, "mismatch in coded sample count\n");
1097cabdff1aSopenharmony_ci        frame->nb_samples = nb_samples = coded_samples;
1098cabdff1aSopenharmony_ci    }
1099cabdff1aSopenharmony_ci
1100cabdff1aSopenharmony_ci    st = channels == 2 ? 1 : 0;
1101cabdff1aSopenharmony_ci
1102cabdff1aSopenharmony_ci    switch(avctx->codec->id) {
1103cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_QT,
1104cabdff1aSopenharmony_ci        /* In QuickTime, IMA is encoded by chunks of 34 bytes (=64 samples).
1105cabdff1aSopenharmony_ci           Channel data is interleaved per-chunk. */
1106cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1107cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[channel];
1108cabdff1aSopenharmony_ci            int predictor;
1109cabdff1aSopenharmony_ci            int step_index;
1110cabdff1aSopenharmony_ci            /* (pppppp) (piiiiiii) */
1111cabdff1aSopenharmony_ci
1112cabdff1aSopenharmony_ci            /* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */
1113cabdff1aSopenharmony_ci            predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
1114cabdff1aSopenharmony_ci            step_index = predictor & 0x7F;
1115cabdff1aSopenharmony_ci            predictor &= ~0x7F;
1116cabdff1aSopenharmony_ci
1117cabdff1aSopenharmony_ci            if (cs->step_index == step_index) {
1118cabdff1aSopenharmony_ci                int diff = predictor - cs->predictor;
1119cabdff1aSopenharmony_ci                if (diff < 0)
1120cabdff1aSopenharmony_ci                    diff = - diff;
1121cabdff1aSopenharmony_ci                if (diff > 0x7f)
1122cabdff1aSopenharmony_ci                    goto update;
1123cabdff1aSopenharmony_ci            } else {
1124cabdff1aSopenharmony_ci            update:
1125cabdff1aSopenharmony_ci                cs->step_index = step_index;
1126cabdff1aSopenharmony_ci                cs->predictor = predictor;
1127cabdff1aSopenharmony_ci            }
1128cabdff1aSopenharmony_ci
1129cabdff1aSopenharmony_ci            if (cs->step_index > 88u){
1130cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1131cabdff1aSopenharmony_ci                       channel, cs->step_index);
1132cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1133cabdff1aSopenharmony_ci            }
1134cabdff1aSopenharmony_ci
1135cabdff1aSopenharmony_ci            samples = samples_p[channel];
1136cabdff1aSopenharmony_ci
1137cabdff1aSopenharmony_ci            for (int m = 0; m < 64; m += 2) {
1138cabdff1aSopenharmony_ci                int byte = bytestream2_get_byteu(&gb);
1139cabdff1aSopenharmony_ci                samples[m    ] = adpcm_ima_qt_expand_nibble(cs, byte & 0x0F);
1140cabdff1aSopenharmony_ci                samples[m + 1] = adpcm_ima_qt_expand_nibble(cs, byte >> 4  );
1141cabdff1aSopenharmony_ci            }
1142cabdff1aSopenharmony_ci        }
1143cabdff1aSopenharmony_ci        ) /* End of CASE */
1144cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_WAV,
1145cabdff1aSopenharmony_ci        for (int i = 0; i < channels; i++) {
1146cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[i];
1147cabdff1aSopenharmony_ci            cs->predictor = samples_p[i][0] = sign_extend(bytestream2_get_le16u(&gb), 16);
1148cabdff1aSopenharmony_ci
1149cabdff1aSopenharmony_ci            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
1150cabdff1aSopenharmony_ci            if (cs->step_index > 88u){
1151cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1152cabdff1aSopenharmony_ci                       i, cs->step_index);
1153cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1154cabdff1aSopenharmony_ci            }
1155cabdff1aSopenharmony_ci        }
1156cabdff1aSopenharmony_ci
1157cabdff1aSopenharmony_ci        if (avctx->bits_per_coded_sample != 4) {
1158cabdff1aSopenharmony_ci            int samples_per_block = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
1159cabdff1aSopenharmony_ci            int block_size = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
1160cabdff1aSopenharmony_ci            uint8_t temp[20 + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 };
1161cabdff1aSopenharmony_ci            GetBitContext g;
1162cabdff1aSopenharmony_ci
1163cabdff1aSopenharmony_ci            for (int n = 0; n < (nb_samples - 1) / samples_per_block; n++) {
1164cabdff1aSopenharmony_ci                for (int i = 0; i < channels; i++) {
1165cabdff1aSopenharmony_ci                    ADPCMChannelStatus *cs = &c->status[i];
1166cabdff1aSopenharmony_ci                    samples = &samples_p[i][1 + n * samples_per_block];
1167cabdff1aSopenharmony_ci                    for (int j = 0; j < block_size; j++) {
1168cabdff1aSopenharmony_ci                        temp[j] = buf[4 * channels + block_size * n * channels +
1169cabdff1aSopenharmony_ci                                        (j % 4) + (j / 4) * (channels * 4) + i * 4];
1170cabdff1aSopenharmony_ci                    }
1171cabdff1aSopenharmony_ci                    ret = init_get_bits8(&g, (const uint8_t *)&temp, block_size);
1172cabdff1aSopenharmony_ci                    if (ret < 0)
1173cabdff1aSopenharmony_ci                        return ret;
1174cabdff1aSopenharmony_ci                    for (int m = 0; m < samples_per_block; m++) {
1175cabdff1aSopenharmony_ci                        samples[m] = adpcm_ima_wav_expand_nibble(cs, &g,
1176cabdff1aSopenharmony_ci                                          avctx->bits_per_coded_sample);
1177cabdff1aSopenharmony_ci                    }
1178cabdff1aSopenharmony_ci                }
1179cabdff1aSopenharmony_ci            }
1180cabdff1aSopenharmony_ci            bytestream2_skip(&gb, avctx->block_align - channels * 4);
1181cabdff1aSopenharmony_ci        } else {
1182cabdff1aSopenharmony_ci            for (int n = 0; n < (nb_samples - 1) / 8; n++) {
1183cabdff1aSopenharmony_ci                for (int i = 0; i < channels; i++) {
1184cabdff1aSopenharmony_ci                    ADPCMChannelStatus *cs = &c->status[i];
1185cabdff1aSopenharmony_ci                    samples = &samples_p[i][1 + n * 8];
1186cabdff1aSopenharmony_ci                    for (int m = 0; m < 8; m += 2) {
1187cabdff1aSopenharmony_ci                        int v = bytestream2_get_byteu(&gb);
1188cabdff1aSopenharmony_ci                        samples[m    ] = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
1189cabdff1aSopenharmony_ci                        samples[m + 1] = adpcm_ima_expand_nibble(cs, v >> 4  , 3);
1190cabdff1aSopenharmony_ci                    }
1191cabdff1aSopenharmony_ci                }
1192cabdff1aSopenharmony_ci            }
1193cabdff1aSopenharmony_ci        }
1194cabdff1aSopenharmony_ci        ) /* End of CASE */
1195cabdff1aSopenharmony_ci    CASE(ADPCM_4XM,
1196cabdff1aSopenharmony_ci        for (int i = 0; i < channels; i++)
1197cabdff1aSopenharmony_ci            c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
1198cabdff1aSopenharmony_ci
1199cabdff1aSopenharmony_ci        for (int i = 0; i < channels; i++) {
1200cabdff1aSopenharmony_ci            c->status[i].step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
1201cabdff1aSopenharmony_ci            if (c->status[i].step_index > 88u) {
1202cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1203cabdff1aSopenharmony_ci                       i, c->status[i].step_index);
1204cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1205cabdff1aSopenharmony_ci            }
1206cabdff1aSopenharmony_ci        }
1207cabdff1aSopenharmony_ci
1208cabdff1aSopenharmony_ci        for (int i = 0; i < channels; i++) {
1209cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[i];
1210cabdff1aSopenharmony_ci            samples = (int16_t *)frame->data[i];
1211cabdff1aSopenharmony_ci            for (int n = nb_samples >> 1; n > 0; n--) {
1212cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1213cabdff1aSopenharmony_ci                *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
1214cabdff1aSopenharmony_ci                *samples++ = adpcm_ima_expand_nibble(cs, v >> 4  , 4);
1215cabdff1aSopenharmony_ci            }
1216cabdff1aSopenharmony_ci        }
1217cabdff1aSopenharmony_ci        ) /* End of CASE */
1218cabdff1aSopenharmony_ci    CASE(ADPCM_AGM,
1219cabdff1aSopenharmony_ci        for (int i = 0; i < channels; i++)
1220cabdff1aSopenharmony_ci            c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
1221cabdff1aSopenharmony_ci        for (int i = 0; i < channels; i++)
1222cabdff1aSopenharmony_ci            c->status[i].step = sign_extend(bytestream2_get_le16u(&gb), 16);
1223cabdff1aSopenharmony_ci
1224cabdff1aSopenharmony_ci        for (int n = 0; n < nb_samples >> (1 - st); n++) {
1225cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1226cabdff1aSopenharmony_ci            *samples++ = adpcm_agm_expand_nibble(&c->status[0], v & 0xF);
1227cabdff1aSopenharmony_ci            *samples++ = adpcm_agm_expand_nibble(&c->status[st], v >> 4 );
1228cabdff1aSopenharmony_ci        }
1229cabdff1aSopenharmony_ci        ) /* End of CASE */
1230cabdff1aSopenharmony_ci    CASE(ADPCM_MS,
1231cabdff1aSopenharmony_ci        int block_predictor;
1232cabdff1aSopenharmony_ci
1233cabdff1aSopenharmony_ci        if (avctx->ch_layout.nb_channels > 2) {
1234cabdff1aSopenharmony_ci            for (int channel = 0; channel < avctx->ch_layout.nb_channels; channel++) {
1235cabdff1aSopenharmony_ci                samples = samples_p[channel];
1236cabdff1aSopenharmony_ci                block_predictor = bytestream2_get_byteu(&gb);
1237cabdff1aSopenharmony_ci                if (block_predictor > 6) {
1238cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[%d] = %d\n",
1239cabdff1aSopenharmony_ci                           channel, block_predictor);
1240cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1241cabdff1aSopenharmony_ci                }
1242cabdff1aSopenharmony_ci                c->status[channel].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
1243cabdff1aSopenharmony_ci                c->status[channel].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
1244cabdff1aSopenharmony_ci                c->status[channel].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
1245cabdff1aSopenharmony_ci                c->status[channel].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
1246cabdff1aSopenharmony_ci                c->status[channel].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
1247cabdff1aSopenharmony_ci                *samples++ = c->status[channel].sample2;
1248cabdff1aSopenharmony_ci                *samples++ = c->status[channel].sample1;
1249cabdff1aSopenharmony_ci                for (int n = (nb_samples - 2) >> 1; n > 0; n--) {
1250cabdff1aSopenharmony_ci                    int byte = bytestream2_get_byteu(&gb);
1251cabdff1aSopenharmony_ci                    *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte >> 4  );
1252cabdff1aSopenharmony_ci                    *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte & 0x0F);
1253cabdff1aSopenharmony_ci                }
1254cabdff1aSopenharmony_ci            }
1255cabdff1aSopenharmony_ci        } else {
1256cabdff1aSopenharmony_ci            block_predictor = bytestream2_get_byteu(&gb);
1257cabdff1aSopenharmony_ci            if (block_predictor > 6) {
1258cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[0] = %d\n",
1259cabdff1aSopenharmony_ci                       block_predictor);
1260cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1261cabdff1aSopenharmony_ci            }
1262cabdff1aSopenharmony_ci            c->status[0].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
1263cabdff1aSopenharmony_ci            c->status[0].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
1264cabdff1aSopenharmony_ci            if (st) {
1265cabdff1aSopenharmony_ci                block_predictor = bytestream2_get_byteu(&gb);
1266cabdff1aSopenharmony_ci                if (block_predictor > 6) {
1267cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[1] = %d\n",
1268cabdff1aSopenharmony_ci                           block_predictor);
1269cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1270cabdff1aSopenharmony_ci                }
1271cabdff1aSopenharmony_ci                c->status[1].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
1272cabdff1aSopenharmony_ci                c->status[1].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
1273cabdff1aSopenharmony_ci            }
1274cabdff1aSopenharmony_ci            c->status[0].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
1275cabdff1aSopenharmony_ci            if (st){
1276cabdff1aSopenharmony_ci                c->status[1].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
1277cabdff1aSopenharmony_ci            }
1278cabdff1aSopenharmony_ci
1279cabdff1aSopenharmony_ci            c->status[0].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
1280cabdff1aSopenharmony_ci            if (st) c->status[1].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
1281cabdff1aSopenharmony_ci            c->status[0].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
1282cabdff1aSopenharmony_ci            if (st) c->status[1].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
1283cabdff1aSopenharmony_ci
1284cabdff1aSopenharmony_ci            *samples++ = c->status[0].sample2;
1285cabdff1aSopenharmony_ci            if (st) *samples++ = c->status[1].sample2;
1286cabdff1aSopenharmony_ci            *samples++ = c->status[0].sample1;
1287cabdff1aSopenharmony_ci            if (st) *samples++ = c->status[1].sample1;
1288cabdff1aSopenharmony_ci            for (int n = (nb_samples - 2) >> (1 - st); n > 0; n--) {
1289cabdff1aSopenharmony_ci                int byte = bytestream2_get_byteu(&gb);
1290cabdff1aSopenharmony_ci                *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], byte >> 4  );
1291cabdff1aSopenharmony_ci                *samples++ = adpcm_ms_expand_nibble(&c->status[st], byte & 0x0F);
1292cabdff1aSopenharmony_ci            }
1293cabdff1aSopenharmony_ci        }
1294cabdff1aSopenharmony_ci        ) /* End of CASE */
1295cabdff1aSopenharmony_ci    CASE(ADPCM_MTAF,
1296cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel += 2) {
1297cabdff1aSopenharmony_ci            bytestream2_skipu(&gb, 4);
1298cabdff1aSopenharmony_ci            c->status[channel    ].step      = bytestream2_get_le16u(&gb) & 0x1f;
1299cabdff1aSopenharmony_ci            c->status[channel + 1].step      = bytestream2_get_le16u(&gb) & 0x1f;
1300cabdff1aSopenharmony_ci            c->status[channel    ].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
1301cabdff1aSopenharmony_ci            bytestream2_skipu(&gb, 2);
1302cabdff1aSopenharmony_ci            c->status[channel + 1].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
1303cabdff1aSopenharmony_ci            bytestream2_skipu(&gb, 2);
1304cabdff1aSopenharmony_ci            for (int n = 0; n < nb_samples; n += 2) {
1305cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1306cabdff1aSopenharmony_ci                samples_p[channel][n    ] = adpcm_mtaf_expand_nibble(&c->status[channel], v & 0x0F);
1307cabdff1aSopenharmony_ci                samples_p[channel][n + 1] = adpcm_mtaf_expand_nibble(&c->status[channel], v >> 4  );
1308cabdff1aSopenharmony_ci            }
1309cabdff1aSopenharmony_ci            for (int n = 0; n < nb_samples; n += 2) {
1310cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1311cabdff1aSopenharmony_ci                samples_p[channel + 1][n    ] = adpcm_mtaf_expand_nibble(&c->status[channel + 1], v & 0x0F);
1312cabdff1aSopenharmony_ci                samples_p[channel + 1][n + 1] = adpcm_mtaf_expand_nibble(&c->status[channel + 1], v >> 4  );
1313cabdff1aSopenharmony_ci            }
1314cabdff1aSopenharmony_ci        }
1315cabdff1aSopenharmony_ci        ) /* End of CASE */
1316cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_DK4,
1317cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1318cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[channel];
1319cabdff1aSopenharmony_ci            cs->predictor  = *samples++ = sign_extend(bytestream2_get_le16u(&gb), 16);
1320cabdff1aSopenharmony_ci            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
1321cabdff1aSopenharmony_ci            if (cs->step_index > 88u){
1322cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1323cabdff1aSopenharmony_ci                       channel, cs->step_index);
1324cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1325cabdff1aSopenharmony_ci            }
1326cabdff1aSopenharmony_ci        }
1327cabdff1aSopenharmony_ci        for (int n = (nb_samples - 1) >> (1 - st); n > 0; n--) {
1328cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1329cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v >> 4  , 3);
1330cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
1331cabdff1aSopenharmony_ci        }
1332cabdff1aSopenharmony_ci        ) /* End of CASE */
1333cabdff1aSopenharmony_ci
1334cabdff1aSopenharmony_ci        /* DK3 ADPCM support macro */
1335cabdff1aSopenharmony_ci#define DK3_GET_NEXT_NIBBLE() \
1336cabdff1aSopenharmony_ci    if (decode_top_nibble_next) { \
1337cabdff1aSopenharmony_ci        nibble = last_byte >> 4; \
1338cabdff1aSopenharmony_ci        decode_top_nibble_next = 0; \
1339cabdff1aSopenharmony_ci    } else { \
1340cabdff1aSopenharmony_ci        last_byte = bytestream2_get_byteu(&gb); \
1341cabdff1aSopenharmony_ci        nibble = last_byte & 0x0F; \
1342cabdff1aSopenharmony_ci        decode_top_nibble_next = 1; \
1343cabdff1aSopenharmony_ci    }
1344cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_DK3,
1345cabdff1aSopenharmony_ci        int last_byte = 0;
1346cabdff1aSopenharmony_ci        int nibble;
1347cabdff1aSopenharmony_ci        int decode_top_nibble_next = 0;
1348cabdff1aSopenharmony_ci        int diff_channel;
1349cabdff1aSopenharmony_ci        const int16_t *samples_end = samples + channels * nb_samples;
1350cabdff1aSopenharmony_ci
1351cabdff1aSopenharmony_ci        bytestream2_skipu(&gb, 10);
1352cabdff1aSopenharmony_ci        c->status[0].predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
1353cabdff1aSopenharmony_ci        c->status[1].predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
1354cabdff1aSopenharmony_ci        c->status[0].step_index = bytestream2_get_byteu(&gb);
1355cabdff1aSopenharmony_ci        c->status[1].step_index = bytestream2_get_byteu(&gb);
1356cabdff1aSopenharmony_ci        if (c->status[0].step_index > 88u || c->status[1].step_index > 88u){
1357cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i/%i\n",
1358cabdff1aSopenharmony_ci                   c->status[0].step_index, c->status[1].step_index);
1359cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1360cabdff1aSopenharmony_ci        }
1361cabdff1aSopenharmony_ci        /* sign extend the predictors */
1362cabdff1aSopenharmony_ci        diff_channel = c->status[1].predictor;
1363cabdff1aSopenharmony_ci
1364cabdff1aSopenharmony_ci        while (samples < samples_end) {
1365cabdff1aSopenharmony_ci
1366cabdff1aSopenharmony_ci            /* for this algorithm, c->status[0] is the sum channel and
1367cabdff1aSopenharmony_ci             * c->status[1] is the diff channel */
1368cabdff1aSopenharmony_ci
1369cabdff1aSopenharmony_ci            /* process the first predictor of the sum channel */
1370cabdff1aSopenharmony_ci            DK3_GET_NEXT_NIBBLE();
1371cabdff1aSopenharmony_ci            adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
1372cabdff1aSopenharmony_ci
1373cabdff1aSopenharmony_ci            /* process the diff channel predictor */
1374cabdff1aSopenharmony_ci            DK3_GET_NEXT_NIBBLE();
1375cabdff1aSopenharmony_ci            adpcm_ima_expand_nibble(&c->status[1], nibble, 3);
1376cabdff1aSopenharmony_ci
1377cabdff1aSopenharmony_ci            /* process the first pair of stereo PCM samples */
1378cabdff1aSopenharmony_ci            diff_channel = (diff_channel + c->status[1].predictor) / 2;
1379cabdff1aSopenharmony_ci            *samples++ = c->status[0].predictor + c->status[1].predictor;
1380cabdff1aSopenharmony_ci            *samples++ = c->status[0].predictor - c->status[1].predictor;
1381cabdff1aSopenharmony_ci
1382cabdff1aSopenharmony_ci            /* process the second predictor of the sum channel */
1383cabdff1aSopenharmony_ci            DK3_GET_NEXT_NIBBLE();
1384cabdff1aSopenharmony_ci            adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
1385cabdff1aSopenharmony_ci
1386cabdff1aSopenharmony_ci            /* process the second pair of stereo PCM samples */
1387cabdff1aSopenharmony_ci            diff_channel = (diff_channel + c->status[1].predictor) / 2;
1388cabdff1aSopenharmony_ci            *samples++ = c->status[0].predictor + c->status[1].predictor;
1389cabdff1aSopenharmony_ci            *samples++ = c->status[0].predictor - c->status[1].predictor;
1390cabdff1aSopenharmony_ci        }
1391cabdff1aSopenharmony_ci
1392cabdff1aSopenharmony_ci        if ((bytestream2_tell(&gb) & 1))
1393cabdff1aSopenharmony_ci            bytestream2_skip(&gb, 1);
1394cabdff1aSopenharmony_ci        ) /* End of CASE */
1395cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_ISS,
1396cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1397cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[channel];
1398cabdff1aSopenharmony_ci            cs->predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
1399cabdff1aSopenharmony_ci            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
1400cabdff1aSopenharmony_ci            if (cs->step_index > 88u){
1401cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1402cabdff1aSopenharmony_ci                       channel, cs->step_index);
1403cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1404cabdff1aSopenharmony_ci            }
1405cabdff1aSopenharmony_ci        }
1406cabdff1aSopenharmony_ci
1407cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1408cabdff1aSopenharmony_ci            int v1, v2;
1409cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1410cabdff1aSopenharmony_ci            /* nibbles are swapped for mono */
1411cabdff1aSopenharmony_ci            if (st) {
1412cabdff1aSopenharmony_ci                v1 = v >> 4;
1413cabdff1aSopenharmony_ci                v2 = v & 0x0F;
1414cabdff1aSopenharmony_ci            } else {
1415cabdff1aSopenharmony_ci                v2 = v >> 4;
1416cabdff1aSopenharmony_ci                v1 = v & 0x0F;
1417cabdff1aSopenharmony_ci            }
1418cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v1, 3);
1419cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[st], v2, 3);
1420cabdff1aSopenharmony_ci        }
1421cabdff1aSopenharmony_ci        ) /* End of CASE */
1422cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_MOFLEX,
1423cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1424cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[channel];
1425cabdff1aSopenharmony_ci            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
1426cabdff1aSopenharmony_ci            cs->predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
1427cabdff1aSopenharmony_ci            if (cs->step_index > 88u){
1428cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1429cabdff1aSopenharmony_ci                       channel, cs->step_index);
1430cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1431cabdff1aSopenharmony_ci            }
1432cabdff1aSopenharmony_ci        }
1433cabdff1aSopenharmony_ci
1434cabdff1aSopenharmony_ci        for (int subframe = 0; subframe < nb_samples / 256; subframe++) {
1435cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
1436cabdff1aSopenharmony_ci                samples = samples_p[channel] + 256 * subframe;
1437cabdff1aSopenharmony_ci                for (int n = 0; n < 256; n += 2) {
1438cabdff1aSopenharmony_ci                    int v = bytestream2_get_byteu(&gb);
1439cabdff1aSopenharmony_ci                    *samples++ = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
1440cabdff1aSopenharmony_ci                    *samples++ = adpcm_ima_expand_nibble(&c->status[channel], v >> 4  , 3);
1441cabdff1aSopenharmony_ci                }
1442cabdff1aSopenharmony_ci            }
1443cabdff1aSopenharmony_ci        }
1444cabdff1aSopenharmony_ci        ) /* End of CASE */
1445cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_DAT4,
1446cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1447cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[channel];
1448cabdff1aSopenharmony_ci            samples = samples_p[channel];
1449cabdff1aSopenharmony_ci            bytestream2_skip(&gb, 4);
1450cabdff1aSopenharmony_ci            for (int n = 0; n < nb_samples; n += 2) {
1451cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1452cabdff1aSopenharmony_ci                *samples++ = adpcm_ima_expand_nibble(cs, v >> 4  , 3);
1453cabdff1aSopenharmony_ci                *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
1454cabdff1aSopenharmony_ci            }
1455cabdff1aSopenharmony_ci        }
1456cabdff1aSopenharmony_ci        ) /* End of CASE */
1457cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_APC,
1458cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1459cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1460cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0],  v >> 4  , 3);
1461cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
1462cabdff1aSopenharmony_ci        }
1463cabdff1aSopenharmony_ci        ) /* End of CASE */
1464cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_SSI,
1465cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1466cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1467cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0],  v >> 4  );
1468cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0x0F);
1469cabdff1aSopenharmony_ci        }
1470cabdff1aSopenharmony_ci        ) /* End of CASE */
1471cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_APM,
1472cabdff1aSopenharmony_ci        for (int n = nb_samples / 2; n > 0; n--) {
1473cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
1474cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1475cabdff1aSopenharmony_ci                *samples++  = adpcm_ima_qt_expand_nibble(&c->status[channel], v >> 4  );
1476cabdff1aSopenharmony_ci                samples[st] = adpcm_ima_qt_expand_nibble(&c->status[channel], v & 0x0F);
1477cabdff1aSopenharmony_ci            }
1478cabdff1aSopenharmony_ci            samples += channels;
1479cabdff1aSopenharmony_ci        }
1480cabdff1aSopenharmony_ci        ) /* End of CASE */
1481cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_ALP,
1482cabdff1aSopenharmony_ci        for (int n = nb_samples / 2; n > 0; n--) {
1483cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
1484cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1485cabdff1aSopenharmony_ci                *samples++  = adpcm_ima_alp_expand_nibble(&c->status[channel], v >> 4  , 2);
1486cabdff1aSopenharmony_ci                samples[st] = adpcm_ima_alp_expand_nibble(&c->status[channel], v & 0x0F, 2);
1487cabdff1aSopenharmony_ci            }
1488cabdff1aSopenharmony_ci            samples += channels;
1489cabdff1aSopenharmony_ci        }
1490cabdff1aSopenharmony_ci        ) /* End of CASE */
1491cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_CUNNING,
1492cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1493cabdff1aSopenharmony_ci            int16_t *smp = samples_p[channel];
1494cabdff1aSopenharmony_ci            for (int n = 0; n < nb_samples / 2; n++) {
1495cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1496cabdff1aSopenharmony_ci                *smp++ = adpcm_ima_cunning_expand_nibble(&c->status[channel], v & 0x0F);
1497cabdff1aSopenharmony_ci                *smp++ = adpcm_ima_cunning_expand_nibble(&c->status[channel], v >> 4);
1498cabdff1aSopenharmony_ci            }
1499cabdff1aSopenharmony_ci        }
1500cabdff1aSopenharmony_ci        ) /* End of CASE */
1501cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_OKI,
1502cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1503cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1504cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_oki_expand_nibble(&c->status[0],  v >> 4  );
1505cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_oki_expand_nibble(&c->status[st], v & 0x0F);
1506cabdff1aSopenharmony_ci        }
1507cabdff1aSopenharmony_ci        ) /* End of CASE */
1508cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_RAD,
1509cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1510cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[channel];
1511cabdff1aSopenharmony_ci            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
1512cabdff1aSopenharmony_ci            cs->predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
1513cabdff1aSopenharmony_ci            if (cs->step_index > 88u){
1514cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1515cabdff1aSopenharmony_ci                       channel, cs->step_index);
1516cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1517cabdff1aSopenharmony_ci            }
1518cabdff1aSopenharmony_ci        }
1519cabdff1aSopenharmony_ci        for (int n = 0; n < nb_samples / 2; n++) {
1520cabdff1aSopenharmony_ci            int byte[2];
1521cabdff1aSopenharmony_ci
1522cabdff1aSopenharmony_ci            byte[0] = bytestream2_get_byteu(&gb);
1523cabdff1aSopenharmony_ci            if (st)
1524cabdff1aSopenharmony_ci                byte[1] = bytestream2_get_byteu(&gb);
1525cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
1526cabdff1aSopenharmony_ci                *samples++ = adpcm_ima_expand_nibble(&c->status[channel], byte[channel] & 0x0F, 3);
1527cabdff1aSopenharmony_ci            }
1528cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
1529cabdff1aSopenharmony_ci                *samples++ = adpcm_ima_expand_nibble(&c->status[channel], byte[channel] >> 4  , 3);
1530cabdff1aSopenharmony_ci            }
1531cabdff1aSopenharmony_ci        }
1532cabdff1aSopenharmony_ci        ) /* End of CASE */
1533cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_WS,
1534cabdff1aSopenharmony_ci        if (c->vqa_version == 3) {
1535cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
1536cabdff1aSopenharmony_ci                int16_t *smp = samples_p[channel];
1537cabdff1aSopenharmony_ci
1538cabdff1aSopenharmony_ci                for (int n = nb_samples / 2; n > 0; n--) {
1539cabdff1aSopenharmony_ci                    int v = bytestream2_get_byteu(&gb);
1540cabdff1aSopenharmony_ci                    *smp++ = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
1541cabdff1aSopenharmony_ci                    *smp++ = adpcm_ima_expand_nibble(&c->status[channel], v >> 4  , 3);
1542cabdff1aSopenharmony_ci                }
1543cabdff1aSopenharmony_ci            }
1544cabdff1aSopenharmony_ci        } else {
1545cabdff1aSopenharmony_ci            for (int n = nb_samples / 2; n > 0; n--) {
1546cabdff1aSopenharmony_ci                for (int channel = 0; channel < channels; channel++) {
1547cabdff1aSopenharmony_ci                    int v = bytestream2_get_byteu(&gb);
1548cabdff1aSopenharmony_ci                    *samples++  = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
1549cabdff1aSopenharmony_ci                    samples[st] = adpcm_ima_expand_nibble(&c->status[channel], v >> 4  , 3);
1550cabdff1aSopenharmony_ci                }
1551cabdff1aSopenharmony_ci                samples += channels;
1552cabdff1aSopenharmony_ci            }
1553cabdff1aSopenharmony_ci        }
1554cabdff1aSopenharmony_ci        bytestream2_seek(&gb, 0, SEEK_END);
1555cabdff1aSopenharmony_ci        ) /* End of CASE */
1556cabdff1aSopenharmony_ci    CASE(ADPCM_XA,
1557cabdff1aSopenharmony_ci        int16_t *out0 = samples_p[0];
1558cabdff1aSopenharmony_ci        int16_t *out1 = samples_p[1];
1559cabdff1aSopenharmony_ci        int samples_per_block = 28 * (3 - channels) * 4;
1560cabdff1aSopenharmony_ci        int sample_offset = 0;
1561cabdff1aSopenharmony_ci        int bytes_remaining;
1562cabdff1aSopenharmony_ci        while (bytestream2_get_bytes_left(&gb) >= 128) {
1563cabdff1aSopenharmony_ci            if ((ret = xa_decode(avctx, out0, out1, buf + bytestream2_tell(&gb),
1564cabdff1aSopenharmony_ci                                 &c->status[0], &c->status[1],
1565cabdff1aSopenharmony_ci                                 channels, sample_offset)) < 0)
1566cabdff1aSopenharmony_ci                return ret;
1567cabdff1aSopenharmony_ci            bytestream2_skipu(&gb, 128);
1568cabdff1aSopenharmony_ci            sample_offset += samples_per_block;
1569cabdff1aSopenharmony_ci        }
1570cabdff1aSopenharmony_ci        /* Less than a full block of data left, e.g. when reading from
1571cabdff1aSopenharmony_ci         * 2324 byte per sector XA; the remainder is padding */
1572cabdff1aSopenharmony_ci        bytes_remaining = bytestream2_get_bytes_left(&gb);
1573cabdff1aSopenharmony_ci        if (bytes_remaining > 0) {
1574cabdff1aSopenharmony_ci            bytestream2_skip(&gb, bytes_remaining);
1575cabdff1aSopenharmony_ci        }
1576cabdff1aSopenharmony_ci        ) /* End of CASE */
1577cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_EA_EACS,
1578cabdff1aSopenharmony_ci        for (int i = 0; i <= st; i++) {
1579cabdff1aSopenharmony_ci            c->status[i].step_index = bytestream2_get_le32u(&gb);
1580cabdff1aSopenharmony_ci            if (c->status[i].step_index > 88u) {
1581cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1582cabdff1aSopenharmony_ci                       i, c->status[i].step_index);
1583cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1584cabdff1aSopenharmony_ci            }
1585cabdff1aSopenharmony_ci        }
1586cabdff1aSopenharmony_ci        for (int i = 0; i <= st; i++) {
1587cabdff1aSopenharmony_ci            c->status[i].predictor  = bytestream2_get_le32u(&gb);
1588cabdff1aSopenharmony_ci            if (FFABS((int64_t)c->status[i].predictor) > (1<<16))
1589cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1590cabdff1aSopenharmony_ci        }
1591cabdff1aSopenharmony_ci
1592cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1593cabdff1aSopenharmony_ci            int byte   = bytestream2_get_byteu(&gb);
1594cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0],  byte >> 4,   3);
1595cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 3);
1596cabdff1aSopenharmony_ci        }
1597cabdff1aSopenharmony_ci        ) /* End of CASE */
1598cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_EA_SEAD,
1599cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1600cabdff1aSopenharmony_ci            int byte = bytestream2_get_byteu(&gb);
1601cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0],  byte >> 4,   6);
1602cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 6);
1603cabdff1aSopenharmony_ci        }
1604cabdff1aSopenharmony_ci        ) /* End of CASE */
1605cabdff1aSopenharmony_ci    CASE(ADPCM_EA,
1606cabdff1aSopenharmony_ci        int previous_left_sample, previous_right_sample;
1607cabdff1aSopenharmony_ci        int current_left_sample, current_right_sample;
1608cabdff1aSopenharmony_ci        int next_left_sample, next_right_sample;
1609cabdff1aSopenharmony_ci        int coeff1l, coeff2l, coeff1r, coeff2r;
1610cabdff1aSopenharmony_ci        int shift_left, shift_right;
1611cabdff1aSopenharmony_ci
1612cabdff1aSopenharmony_ci        /* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces,
1613cabdff1aSopenharmony_ci           each coding 28 stereo samples. */
1614cabdff1aSopenharmony_ci
1615cabdff1aSopenharmony_ci        if (channels != 2)
1616cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1617cabdff1aSopenharmony_ci
1618cabdff1aSopenharmony_ci        current_left_sample   = sign_extend(bytestream2_get_le16u(&gb), 16);
1619cabdff1aSopenharmony_ci        previous_left_sample  = sign_extend(bytestream2_get_le16u(&gb), 16);
1620cabdff1aSopenharmony_ci        current_right_sample  = sign_extend(bytestream2_get_le16u(&gb), 16);
1621cabdff1aSopenharmony_ci        previous_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
1622cabdff1aSopenharmony_ci
1623cabdff1aSopenharmony_ci        for (int count1 = 0; count1 < nb_samples / 28; count1++) {
1624cabdff1aSopenharmony_ci            int byte = bytestream2_get_byteu(&gb);
1625cabdff1aSopenharmony_ci            coeff1l = ea_adpcm_table[ byte >> 4       ];
1626cabdff1aSopenharmony_ci            coeff2l = ea_adpcm_table[(byte >> 4  ) + 4];
1627cabdff1aSopenharmony_ci            coeff1r = ea_adpcm_table[ byte & 0x0F];
1628cabdff1aSopenharmony_ci            coeff2r = ea_adpcm_table[(byte & 0x0F) + 4];
1629cabdff1aSopenharmony_ci
1630cabdff1aSopenharmony_ci            byte = bytestream2_get_byteu(&gb);
1631cabdff1aSopenharmony_ci            shift_left  = 20 - (byte >> 4);
1632cabdff1aSopenharmony_ci            shift_right = 20 - (byte & 0x0F);
1633cabdff1aSopenharmony_ci
1634cabdff1aSopenharmony_ci            for (int count2 = 0; count2 < 28; count2++) {
1635cabdff1aSopenharmony_ci                byte = bytestream2_get_byteu(&gb);
1636cabdff1aSopenharmony_ci                next_left_sample  = sign_extend(byte >> 4, 4) * (1 << shift_left);
1637cabdff1aSopenharmony_ci                next_right_sample = sign_extend(byte,      4) * (1 << shift_right);
1638cabdff1aSopenharmony_ci
1639cabdff1aSopenharmony_ci                next_left_sample = (next_left_sample +
1640cabdff1aSopenharmony_ci                    (current_left_sample * coeff1l) +
1641cabdff1aSopenharmony_ci                    (previous_left_sample * coeff2l) + 0x80) >> 8;
1642cabdff1aSopenharmony_ci                next_right_sample = (next_right_sample +
1643cabdff1aSopenharmony_ci                    (current_right_sample * coeff1r) +
1644cabdff1aSopenharmony_ci                    (previous_right_sample * coeff2r) + 0x80) >> 8;
1645cabdff1aSopenharmony_ci
1646cabdff1aSopenharmony_ci                previous_left_sample = current_left_sample;
1647cabdff1aSopenharmony_ci                current_left_sample = av_clip_int16(next_left_sample);
1648cabdff1aSopenharmony_ci                previous_right_sample = current_right_sample;
1649cabdff1aSopenharmony_ci                current_right_sample = av_clip_int16(next_right_sample);
1650cabdff1aSopenharmony_ci                *samples++ = current_left_sample;
1651cabdff1aSopenharmony_ci                *samples++ = current_right_sample;
1652cabdff1aSopenharmony_ci            }
1653cabdff1aSopenharmony_ci        }
1654cabdff1aSopenharmony_ci
1655cabdff1aSopenharmony_ci        bytestream2_skip(&gb, 2); // Skip terminating 0x0000
1656cabdff1aSopenharmony_ci        ) /* End of CASE */
1657cabdff1aSopenharmony_ci    CASE(ADPCM_EA_MAXIS_XA,
1658cabdff1aSopenharmony_ci        int coeff[2][2], shift[2];
1659cabdff1aSopenharmony_ci
1660cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1661cabdff1aSopenharmony_ci            int byte = bytestream2_get_byteu(&gb);
1662cabdff1aSopenharmony_ci            for (int i = 0; i < 2; i++)
1663cabdff1aSopenharmony_ci                coeff[channel][i] = ea_adpcm_table[(byte >> 4) + 4*i];
1664cabdff1aSopenharmony_ci            shift[channel] = 20 - (byte & 0x0F);
1665cabdff1aSopenharmony_ci        }
1666cabdff1aSopenharmony_ci        for (int count1 = 0; count1 < nb_samples / 2; count1++) {
1667cabdff1aSopenharmony_ci            int byte[2];
1668cabdff1aSopenharmony_ci
1669cabdff1aSopenharmony_ci            byte[0] = bytestream2_get_byteu(&gb);
1670cabdff1aSopenharmony_ci            if (st) byte[1] = bytestream2_get_byteu(&gb);
1671cabdff1aSopenharmony_ci            for (int i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
1672cabdff1aSopenharmony_ci                for (int channel = 0; channel < channels; channel++) {
1673cabdff1aSopenharmony_ci                    int sample = sign_extend(byte[channel] >> i, 4) * (1 << shift[channel]);
1674cabdff1aSopenharmony_ci                    sample = (sample +
1675cabdff1aSopenharmony_ci                             c->status[channel].sample1 * coeff[channel][0] +
1676cabdff1aSopenharmony_ci                             c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
1677cabdff1aSopenharmony_ci                    c->status[channel].sample2 = c->status[channel].sample1;
1678cabdff1aSopenharmony_ci                    c->status[channel].sample1 = av_clip_int16(sample);
1679cabdff1aSopenharmony_ci                    *samples++ = c->status[channel].sample1;
1680cabdff1aSopenharmony_ci                }
1681cabdff1aSopenharmony_ci            }
1682cabdff1aSopenharmony_ci        }
1683cabdff1aSopenharmony_ci        bytestream2_seek(&gb, 0, SEEK_END);
1684cabdff1aSopenharmony_ci        ) /* End of CASE */
1685cabdff1aSopenharmony_ci#if CONFIG_ADPCM_EA_R1_DECODER || CONFIG_ADPCM_EA_R2_DECODER || CONFIG_ADPCM_EA_R3_DECODER
1686cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R1:
1687cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R2:
1688cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_EA_R3: {
1689cabdff1aSopenharmony_ci        /* channel numbering
1690cabdff1aSopenharmony_ci           2chan: 0=fl, 1=fr
1691cabdff1aSopenharmony_ci           4chan: 0=fl, 1=rl, 2=fr, 3=rr
1692cabdff1aSopenharmony_ci           6chan: 0=fl, 1=c,  2=fr, 3=rl,  4=rr, 5=sub */
1693cabdff1aSopenharmony_ci        const int big_endian = avctx->codec->id == AV_CODEC_ID_ADPCM_EA_R3;
1694cabdff1aSopenharmony_ci        int previous_sample, current_sample, next_sample;
1695cabdff1aSopenharmony_ci        int coeff1, coeff2;
1696cabdff1aSopenharmony_ci        int shift;
1697cabdff1aSopenharmony_ci        uint16_t *samplesC;
1698cabdff1aSopenharmony_ci        int count = 0;
1699cabdff1aSopenharmony_ci        int offsets[6];
1700cabdff1aSopenharmony_ci
1701cabdff1aSopenharmony_ci        for (unsigned channel = 0; channel < channels; channel++)
1702cabdff1aSopenharmony_ci            offsets[channel] = (big_endian ? bytestream2_get_be32(&gb) :
1703cabdff1aSopenharmony_ci                                             bytestream2_get_le32(&gb)) +
1704cabdff1aSopenharmony_ci                               (channels + 1) * 4;
1705cabdff1aSopenharmony_ci
1706cabdff1aSopenharmony_ci        for (unsigned channel = 0; channel < channels; channel++) {
1707cabdff1aSopenharmony_ci            int count1;
1708cabdff1aSopenharmony_ci
1709cabdff1aSopenharmony_ci            bytestream2_seek(&gb, offsets[channel], SEEK_SET);
1710cabdff1aSopenharmony_ci            samplesC = samples_p[channel];
1711cabdff1aSopenharmony_ci
1712cabdff1aSopenharmony_ci            if (avctx->codec->id == AV_CODEC_ID_ADPCM_EA_R1) {
1713cabdff1aSopenharmony_ci                current_sample  = sign_extend(bytestream2_get_le16(&gb), 16);
1714cabdff1aSopenharmony_ci                previous_sample = sign_extend(bytestream2_get_le16(&gb), 16);
1715cabdff1aSopenharmony_ci            } else {
1716cabdff1aSopenharmony_ci                current_sample  = c->status[channel].predictor;
1717cabdff1aSopenharmony_ci                previous_sample = c->status[channel].prev_sample;
1718cabdff1aSopenharmony_ci            }
1719cabdff1aSopenharmony_ci
1720cabdff1aSopenharmony_ci            for (count1 = 0; count1 < nb_samples / 28; count1++) {
1721cabdff1aSopenharmony_ci                int byte = bytestream2_get_byte(&gb);
1722cabdff1aSopenharmony_ci                if (byte == 0xEE) {  /* only seen in R2 and R3 */
1723cabdff1aSopenharmony_ci                    current_sample  = sign_extend(bytestream2_get_be16(&gb), 16);
1724cabdff1aSopenharmony_ci                    previous_sample = sign_extend(bytestream2_get_be16(&gb), 16);
1725cabdff1aSopenharmony_ci
1726cabdff1aSopenharmony_ci                    for (int count2 = 0; count2 < 28; count2++)
1727cabdff1aSopenharmony_ci                        *samplesC++ = sign_extend(bytestream2_get_be16(&gb), 16);
1728cabdff1aSopenharmony_ci                } else {
1729cabdff1aSopenharmony_ci                    coeff1 = ea_adpcm_table[ byte >> 4     ];
1730cabdff1aSopenharmony_ci                    coeff2 = ea_adpcm_table[(byte >> 4) + 4];
1731cabdff1aSopenharmony_ci                    shift = 20 - (byte & 0x0F);
1732cabdff1aSopenharmony_ci
1733cabdff1aSopenharmony_ci                    for (int count2 = 0; count2 < 28; count2++) {
1734cabdff1aSopenharmony_ci                        if (count2 & 1)
1735cabdff1aSopenharmony_ci                            next_sample = (unsigned)sign_extend(byte,    4) << shift;
1736cabdff1aSopenharmony_ci                        else {
1737cabdff1aSopenharmony_ci                            byte = bytestream2_get_byte(&gb);
1738cabdff1aSopenharmony_ci                            next_sample = (unsigned)sign_extend(byte >> 4, 4) << shift;
1739cabdff1aSopenharmony_ci                        }
1740cabdff1aSopenharmony_ci
1741cabdff1aSopenharmony_ci                        next_sample += (current_sample  * coeff1) +
1742cabdff1aSopenharmony_ci                                       (previous_sample * coeff2);
1743cabdff1aSopenharmony_ci                        next_sample = av_clip_int16(next_sample >> 8);
1744cabdff1aSopenharmony_ci
1745cabdff1aSopenharmony_ci                        previous_sample = current_sample;
1746cabdff1aSopenharmony_ci                        current_sample  = next_sample;
1747cabdff1aSopenharmony_ci                        *samplesC++ = current_sample;
1748cabdff1aSopenharmony_ci                    }
1749cabdff1aSopenharmony_ci                }
1750cabdff1aSopenharmony_ci            }
1751cabdff1aSopenharmony_ci            if (!count) {
1752cabdff1aSopenharmony_ci                count = count1;
1753cabdff1aSopenharmony_ci            } else if (count != count1) {
1754cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_WARNING, "per-channel sample count mismatch\n");
1755cabdff1aSopenharmony_ci                count = FFMAX(count, count1);
1756cabdff1aSopenharmony_ci            }
1757cabdff1aSopenharmony_ci
1758cabdff1aSopenharmony_ci            if (avctx->codec->id != AV_CODEC_ID_ADPCM_EA_R1) {
1759cabdff1aSopenharmony_ci                c->status[channel].predictor   = current_sample;
1760cabdff1aSopenharmony_ci                c->status[channel].prev_sample = previous_sample;
1761cabdff1aSopenharmony_ci            }
1762cabdff1aSopenharmony_ci        }
1763cabdff1aSopenharmony_ci
1764cabdff1aSopenharmony_ci        frame->nb_samples = count * 28;
1765cabdff1aSopenharmony_ci        bytestream2_seek(&gb, 0, SEEK_END);
1766cabdff1aSopenharmony_ci        break;
1767cabdff1aSopenharmony_ci    }
1768cabdff1aSopenharmony_ci#endif /* CONFIG_ADPCM_EA_Rx_DECODER */
1769cabdff1aSopenharmony_ci    CASE(ADPCM_EA_XAS,
1770cabdff1aSopenharmony_ci        for (int channel=0; channel < channels; channel++) {
1771cabdff1aSopenharmony_ci            int coeff[2][4], shift[4];
1772cabdff1aSopenharmony_ci            int16_t *s = samples_p[channel];
1773cabdff1aSopenharmony_ci            for (int n = 0; n < 4; n++, s += 32) {
1774cabdff1aSopenharmony_ci                int val = sign_extend(bytestream2_get_le16u(&gb), 16);
1775cabdff1aSopenharmony_ci                for (int i = 0; i < 2; i++)
1776cabdff1aSopenharmony_ci                    coeff[i][n] = ea_adpcm_table[(val&0x0F)+4*i];
1777cabdff1aSopenharmony_ci                s[0] = val & ~0x0F;
1778cabdff1aSopenharmony_ci
1779cabdff1aSopenharmony_ci                val = sign_extend(bytestream2_get_le16u(&gb), 16);
1780cabdff1aSopenharmony_ci                shift[n] = 20 - (val & 0x0F);
1781cabdff1aSopenharmony_ci                s[1] = val & ~0x0F;
1782cabdff1aSopenharmony_ci            }
1783cabdff1aSopenharmony_ci
1784cabdff1aSopenharmony_ci            for (int m = 2; m < 32; m += 2) {
1785cabdff1aSopenharmony_ci                s = &samples_p[channel][m];
1786cabdff1aSopenharmony_ci                for (int n = 0; n < 4; n++, s += 32) {
1787cabdff1aSopenharmony_ci                    int level, pred;
1788cabdff1aSopenharmony_ci                    int byte = bytestream2_get_byteu(&gb);
1789cabdff1aSopenharmony_ci
1790cabdff1aSopenharmony_ci                    level = sign_extend(byte >> 4, 4) * (1 << shift[n]);
1791cabdff1aSopenharmony_ci                    pred  = s[-1] * coeff[0][n] + s[-2] * coeff[1][n];
1792cabdff1aSopenharmony_ci                    s[0]  = av_clip_int16((level + pred + 0x80) >> 8);
1793cabdff1aSopenharmony_ci
1794cabdff1aSopenharmony_ci                    level = sign_extend(byte, 4) * (1 << shift[n]);
1795cabdff1aSopenharmony_ci                    pred  = s[0] * coeff[0][n] + s[-1] * coeff[1][n];
1796cabdff1aSopenharmony_ci                    s[1]  = av_clip_int16((level + pred + 0x80) >> 8);
1797cabdff1aSopenharmony_ci                }
1798cabdff1aSopenharmony_ci            }
1799cabdff1aSopenharmony_ci        }
1800cabdff1aSopenharmony_ci        ) /* End of CASE */
1801cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_ACORN,
1802cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1803cabdff1aSopenharmony_ci            ADPCMChannelStatus *cs = &c->status[channel];
1804cabdff1aSopenharmony_ci            cs->predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
1805cabdff1aSopenharmony_ci            cs->step_index = bytestream2_get_le16u(&gb) & 0xFF;
1806cabdff1aSopenharmony_ci            if (cs->step_index > 88u){
1807cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1808cabdff1aSopenharmony_ci                       channel, cs->step_index);
1809cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1810cabdff1aSopenharmony_ci            }
1811cabdff1aSopenharmony_ci        }
1812cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1813cabdff1aSopenharmony_ci            int byte = bytestream2_get_byteu(&gb);
1814cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0],  byte & 0x0F, 3);
1815cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[st], byte >> 4,   3);
1816cabdff1aSopenharmony_ci        }
1817cabdff1aSopenharmony_ci        ) /* End of CASE */
1818cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_AMV,
1819cabdff1aSopenharmony_ci        av_assert0(channels == 1);
1820cabdff1aSopenharmony_ci
1821cabdff1aSopenharmony_ci        /*
1822cabdff1aSopenharmony_ci         * Header format:
1823cabdff1aSopenharmony_ci         *   int16_t  predictor;
1824cabdff1aSopenharmony_ci         *   uint8_t  step_index;
1825cabdff1aSopenharmony_ci         *   uint8_t  reserved;
1826cabdff1aSopenharmony_ci         *   uint32_t frame_size;
1827cabdff1aSopenharmony_ci         *
1828cabdff1aSopenharmony_ci         * Some implementations have step_index as 16-bits, but others
1829cabdff1aSopenharmony_ci         * only use the lower 8 and store garbage in the upper 8.
1830cabdff1aSopenharmony_ci         */
1831cabdff1aSopenharmony_ci        c->status[0].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
1832cabdff1aSopenharmony_ci        c->status[0].step_index = bytestream2_get_byteu(&gb);
1833cabdff1aSopenharmony_ci        bytestream2_skipu(&gb, 5);
1834cabdff1aSopenharmony_ci        if (c->status[0].step_index > 88u) {
1835cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
1836cabdff1aSopenharmony_ci                   c->status[0].step_index);
1837cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1838cabdff1aSopenharmony_ci        }
1839cabdff1aSopenharmony_ci
1840cabdff1aSopenharmony_ci        for (int n = nb_samples >> 1; n > 0; n--) {
1841cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1842cabdff1aSopenharmony_ci
1843cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4, 3);
1844cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0], v & 0xf, 3);
1845cabdff1aSopenharmony_ci        }
1846cabdff1aSopenharmony_ci
1847cabdff1aSopenharmony_ci        if (nb_samples & 1) {
1848cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1849cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4, 3);
1850cabdff1aSopenharmony_ci
1851cabdff1aSopenharmony_ci            if (v & 0x0F) {
1852cabdff1aSopenharmony_ci                /* Holds true on all the http://samples.mplayerhq.hu/amv samples. */
1853cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_WARNING, "Last nibble set on packet with odd sample count.\n");
1854cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_WARNING, "Sample will be skipped.\n");
1855cabdff1aSopenharmony_ci            }
1856cabdff1aSopenharmony_ci        }
1857cabdff1aSopenharmony_ci        ) /* End of CASE */
1858cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_SMJPEG,
1859cabdff1aSopenharmony_ci        for (int i = 0; i < channels; i++) {
1860cabdff1aSopenharmony_ci            c->status[i].predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
1861cabdff1aSopenharmony_ci            c->status[i].step_index = bytestream2_get_byteu(&gb);
1862cabdff1aSopenharmony_ci            bytestream2_skipu(&gb, 1);
1863cabdff1aSopenharmony_ci            if (c->status[i].step_index > 88u) {
1864cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
1865cabdff1aSopenharmony_ci                       c->status[i].step_index);
1866cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1867cabdff1aSopenharmony_ci            }
1868cabdff1aSopenharmony_ci        }
1869cabdff1aSopenharmony_ci
1870cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1871cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1872cabdff1aSopenharmony_ci
1873cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4 );
1874cabdff1aSopenharmony_ci            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf);
1875cabdff1aSopenharmony_ci        }
1876cabdff1aSopenharmony_ci        ) /* End of CASE */
1877cabdff1aSopenharmony_ci    CASE(ADPCM_CT,
1878cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1879cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1880cabdff1aSopenharmony_ci            *samples++ = adpcm_ct_expand_nibble(&c->status[0 ], v >> 4  );
1881cabdff1aSopenharmony_ci            *samples++ = adpcm_ct_expand_nibble(&c->status[st], v & 0x0F);
1882cabdff1aSopenharmony_ci        }
1883cabdff1aSopenharmony_ci        ) /* End of CASE */
1884cabdff1aSopenharmony_ci#if CONFIG_ADPCM_SBPRO_2_DECODER || CONFIG_ADPCM_SBPRO_3_DECODER || \
1885cabdff1aSopenharmony_ci    CONFIG_ADPCM_SBPRO_4_DECODER
1886cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_SBPRO_4:
1887cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_SBPRO_3:
1888cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_SBPRO_2:
1889cabdff1aSopenharmony_ci        if (!c->status[0].step_index) {
1890cabdff1aSopenharmony_ci            /* the first byte is a raw sample */
1891cabdff1aSopenharmony_ci            *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
1892cabdff1aSopenharmony_ci            if (st)
1893cabdff1aSopenharmony_ci                *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
1894cabdff1aSopenharmony_ci            c->status[0].step_index = 1;
1895cabdff1aSopenharmony_ci            nb_samples--;
1896cabdff1aSopenharmony_ci        }
1897cabdff1aSopenharmony_ci        if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_4) {
1898cabdff1aSopenharmony_ci            for (int n = nb_samples >> (1 - st); n > 0; n--) {
1899cabdff1aSopenharmony_ci                int byte = bytestream2_get_byteu(&gb);
1900cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1901cabdff1aSopenharmony_ci                                                       byte >> 4,   4, 0);
1902cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
1903cabdff1aSopenharmony_ci                                                       byte & 0x0F, 4, 0);
1904cabdff1aSopenharmony_ci            }
1905cabdff1aSopenharmony_ci        } else if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_3) {
1906cabdff1aSopenharmony_ci            for (int n = (nb_samples<<st) / 3; n > 0; n--) {
1907cabdff1aSopenharmony_ci                int byte = bytestream2_get_byteu(&gb);
1908cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1909cabdff1aSopenharmony_ci                                                        byte >> 5        , 3, 0);
1910cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1911cabdff1aSopenharmony_ci                                                       (byte >> 2) & 0x07, 3, 0);
1912cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1913cabdff1aSopenharmony_ci                                                        byte & 0x03,       2, 0);
1914cabdff1aSopenharmony_ci            }
1915cabdff1aSopenharmony_ci        } else {
1916cabdff1aSopenharmony_ci            for (int n = nb_samples >> (2 - st); n > 0; n--) {
1917cabdff1aSopenharmony_ci                int byte = bytestream2_get_byteu(&gb);
1918cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1919cabdff1aSopenharmony_ci                                                        byte >> 6        , 2, 2);
1920cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
1921cabdff1aSopenharmony_ci                                                       (byte >> 4) & 0x03, 2, 2);
1922cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1923cabdff1aSopenharmony_ci                                                       (byte >> 2) & 0x03, 2, 2);
1924cabdff1aSopenharmony_ci                *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
1925cabdff1aSopenharmony_ci                                                        byte & 0x03,       2, 2);
1926cabdff1aSopenharmony_ci            }
1927cabdff1aSopenharmony_ci        }
1928cabdff1aSopenharmony_ci        break;
1929cabdff1aSopenharmony_ci#endif /* CONFIG_ADPCM_SBPRO_x_DECODER */
1930cabdff1aSopenharmony_ci    CASE(ADPCM_SWF,
1931cabdff1aSopenharmony_ci        adpcm_swf_decode(avctx, buf, buf_size, samples);
1932cabdff1aSopenharmony_ci        bytestream2_seek(&gb, 0, SEEK_END);
1933cabdff1aSopenharmony_ci        ) /* End of CASE */
1934cabdff1aSopenharmony_ci    CASE(ADPCM_YAMAHA,
1935cabdff1aSopenharmony_ci        for (int n = nb_samples >> (1 - st); n > 0; n--) {
1936cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
1937cabdff1aSopenharmony_ci            *samples++ = adpcm_yamaha_expand_nibble(&c->status[0 ], v & 0x0F);
1938cabdff1aSopenharmony_ci            *samples++ = adpcm_yamaha_expand_nibble(&c->status[st], v >> 4  );
1939cabdff1aSopenharmony_ci        }
1940cabdff1aSopenharmony_ci        ) /* End of CASE */
1941cabdff1aSopenharmony_ci    CASE(ADPCM_AICA,
1942cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
1943cabdff1aSopenharmony_ci            samples = samples_p[channel];
1944cabdff1aSopenharmony_ci            for (int n = nb_samples >> 1; n > 0; n--) {
1945cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
1946cabdff1aSopenharmony_ci                *samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v & 0x0F);
1947cabdff1aSopenharmony_ci                *samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v >> 4  );
1948cabdff1aSopenharmony_ci            }
1949cabdff1aSopenharmony_ci        }
1950cabdff1aSopenharmony_ci        ) /* End of CASE */
1951cabdff1aSopenharmony_ci    CASE(ADPCM_AFC,
1952cabdff1aSopenharmony_ci        int samples_per_block;
1953cabdff1aSopenharmony_ci        int blocks;
1954cabdff1aSopenharmony_ci
1955cabdff1aSopenharmony_ci        if (avctx->extradata && avctx->extradata_size == 1 && avctx->extradata[0]) {
1956cabdff1aSopenharmony_ci            samples_per_block = avctx->extradata[0] / 16;
1957cabdff1aSopenharmony_ci            blocks = nb_samples / avctx->extradata[0];
1958cabdff1aSopenharmony_ci        } else {
1959cabdff1aSopenharmony_ci            samples_per_block = nb_samples / 16;
1960cabdff1aSopenharmony_ci            blocks = 1;
1961cabdff1aSopenharmony_ci        }
1962cabdff1aSopenharmony_ci
1963cabdff1aSopenharmony_ci        for (int m = 0; m < blocks; m++) {
1964cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
1965cabdff1aSopenharmony_ci                int prev1 = c->status[channel].sample1;
1966cabdff1aSopenharmony_ci                int prev2 = c->status[channel].sample2;
1967cabdff1aSopenharmony_ci
1968cabdff1aSopenharmony_ci                samples = samples_p[channel] + m * 16;
1969cabdff1aSopenharmony_ci                /* Read in every sample for this channel.  */
1970cabdff1aSopenharmony_ci                for (int i = 0; i < samples_per_block; i++) {
1971cabdff1aSopenharmony_ci                    int byte = bytestream2_get_byteu(&gb);
1972cabdff1aSopenharmony_ci                    int scale = 1 << (byte >> 4);
1973cabdff1aSopenharmony_ci                    int index = byte & 0xf;
1974cabdff1aSopenharmony_ci                    int factor1 = afc_coeffs[0][index];
1975cabdff1aSopenharmony_ci                    int factor2 = afc_coeffs[1][index];
1976cabdff1aSopenharmony_ci
1977cabdff1aSopenharmony_ci                    /* Decode 16 samples.  */
1978cabdff1aSopenharmony_ci                    for (int n = 0; n < 16; n++) {
1979cabdff1aSopenharmony_ci                        int32_t sampledat;
1980cabdff1aSopenharmony_ci
1981cabdff1aSopenharmony_ci                        if (n & 1) {
1982cabdff1aSopenharmony_ci                            sampledat = sign_extend(byte, 4);
1983cabdff1aSopenharmony_ci                        } else {
1984cabdff1aSopenharmony_ci                            byte = bytestream2_get_byteu(&gb);
1985cabdff1aSopenharmony_ci                            sampledat = sign_extend(byte >> 4, 4);
1986cabdff1aSopenharmony_ci                        }
1987cabdff1aSopenharmony_ci
1988cabdff1aSopenharmony_ci                        sampledat = ((prev1 * factor1 + prev2 * factor2) >> 11) +
1989cabdff1aSopenharmony_ci                                    sampledat * scale;
1990cabdff1aSopenharmony_ci                        *samples = av_clip_int16(sampledat);
1991cabdff1aSopenharmony_ci                        prev2 = prev1;
1992cabdff1aSopenharmony_ci                        prev1 = *samples++;
1993cabdff1aSopenharmony_ci                    }
1994cabdff1aSopenharmony_ci                }
1995cabdff1aSopenharmony_ci
1996cabdff1aSopenharmony_ci                c->status[channel].sample1 = prev1;
1997cabdff1aSopenharmony_ci                c->status[channel].sample2 = prev2;
1998cabdff1aSopenharmony_ci            }
1999cabdff1aSopenharmony_ci        }
2000cabdff1aSopenharmony_ci        bytestream2_seek(&gb, 0, SEEK_END);
2001cabdff1aSopenharmony_ci        ) /* End of CASE */
2002cabdff1aSopenharmony_ci#if CONFIG_ADPCM_THP_DECODER || CONFIG_ADPCM_THP_LE_DECODER
2003cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP:
2004cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_THP_LE:
2005cabdff1aSopenharmony_ci    {
2006cabdff1aSopenharmony_ci        int table[14][16];
2007cabdff1aSopenharmony_ci
2008cabdff1aSopenharmony_ci#define THP_GET16(g) \
2009cabdff1aSopenharmony_ci    sign_extend( \
2010cabdff1aSopenharmony_ci        avctx->codec->id == AV_CODEC_ID_ADPCM_THP_LE ? \
2011cabdff1aSopenharmony_ci        bytestream2_get_le16u(&(g)) : \
2012cabdff1aSopenharmony_ci        bytestream2_get_be16u(&(g)), 16)
2013cabdff1aSopenharmony_ci
2014cabdff1aSopenharmony_ci        if (avctx->extradata) {
2015cabdff1aSopenharmony_ci            GetByteContext tb;
2016cabdff1aSopenharmony_ci            if (avctx->extradata_size < 32 * channels) {
2017cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Missing coeff table\n");
2018cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
2019cabdff1aSopenharmony_ci            }
2020cabdff1aSopenharmony_ci
2021cabdff1aSopenharmony_ci            bytestream2_init(&tb, avctx->extradata, avctx->extradata_size);
2022cabdff1aSopenharmony_ci            for (int i = 0; i < channels; i++)
2023cabdff1aSopenharmony_ci                for (int n = 0; n < 16; n++)
2024cabdff1aSopenharmony_ci                    table[i][n] = THP_GET16(tb);
2025cabdff1aSopenharmony_ci        } else {
2026cabdff1aSopenharmony_ci            for (int i = 0; i < channels; i++)
2027cabdff1aSopenharmony_ci                for (int n = 0; n < 16; n++)
2028cabdff1aSopenharmony_ci                    table[i][n] = THP_GET16(gb);
2029cabdff1aSopenharmony_ci
2030cabdff1aSopenharmony_ci            if (!c->has_status) {
2031cabdff1aSopenharmony_ci                /* Initialize the previous sample.  */
2032cabdff1aSopenharmony_ci                for (int i = 0; i < channels; i++) {
2033cabdff1aSopenharmony_ci                    c->status[i].sample1 = THP_GET16(gb);
2034cabdff1aSopenharmony_ci                    c->status[i].sample2 = THP_GET16(gb);
2035cabdff1aSopenharmony_ci                }
2036cabdff1aSopenharmony_ci                c->has_status = 1;
2037cabdff1aSopenharmony_ci            } else {
2038cabdff1aSopenharmony_ci                bytestream2_skip(&gb, channels * 4);
2039cabdff1aSopenharmony_ci            }
2040cabdff1aSopenharmony_ci        }
2041cabdff1aSopenharmony_ci
2042cabdff1aSopenharmony_ci        for (int ch = 0; ch < channels; ch++) {
2043cabdff1aSopenharmony_ci            samples = samples_p[ch];
2044cabdff1aSopenharmony_ci
2045cabdff1aSopenharmony_ci            /* Read in every sample for this channel.  */
2046cabdff1aSopenharmony_ci            for (int i = 0; i < (nb_samples + 13) / 14; i++) {
2047cabdff1aSopenharmony_ci                int byte = bytestream2_get_byteu(&gb);
2048cabdff1aSopenharmony_ci                int index = (byte >> 4) & 7;
2049cabdff1aSopenharmony_ci                unsigned int exp = byte & 0x0F;
2050cabdff1aSopenharmony_ci                int64_t factor1 = table[ch][index * 2];
2051cabdff1aSopenharmony_ci                int64_t factor2 = table[ch][index * 2 + 1];
2052cabdff1aSopenharmony_ci
2053cabdff1aSopenharmony_ci                /* Decode 14 samples.  */
2054cabdff1aSopenharmony_ci                for (int n = 0; n < 14 && (i * 14 + n < nb_samples); n++) {
2055cabdff1aSopenharmony_ci                    int32_t sampledat;
2056cabdff1aSopenharmony_ci
2057cabdff1aSopenharmony_ci                    if (n & 1) {
2058cabdff1aSopenharmony_ci                        sampledat = sign_extend(byte, 4);
2059cabdff1aSopenharmony_ci                    } else {
2060cabdff1aSopenharmony_ci                        byte = bytestream2_get_byteu(&gb);
2061cabdff1aSopenharmony_ci                        sampledat = sign_extend(byte >> 4, 4);
2062cabdff1aSopenharmony_ci                    }
2063cabdff1aSopenharmony_ci
2064cabdff1aSopenharmony_ci                    sampledat = ((c->status[ch].sample1 * factor1
2065cabdff1aSopenharmony_ci                                + c->status[ch].sample2 * factor2) >> 11) + sampledat * (1 << exp);
2066cabdff1aSopenharmony_ci                    *samples = av_clip_int16(sampledat);
2067cabdff1aSopenharmony_ci                    c->status[ch].sample2 = c->status[ch].sample1;
2068cabdff1aSopenharmony_ci                    c->status[ch].sample1 = *samples++;
2069cabdff1aSopenharmony_ci                }
2070cabdff1aSopenharmony_ci            }
2071cabdff1aSopenharmony_ci        }
2072cabdff1aSopenharmony_ci        break;
2073cabdff1aSopenharmony_ci    }
2074cabdff1aSopenharmony_ci#endif /* CONFIG_ADPCM_THP(_LE)_DECODER */
2075cabdff1aSopenharmony_ci    CASE(ADPCM_DTK,
2076cabdff1aSopenharmony_ci        for (int channel = 0; channel < channels; channel++) {
2077cabdff1aSopenharmony_ci            samples = samples_p[channel];
2078cabdff1aSopenharmony_ci
2079cabdff1aSopenharmony_ci            /* Read in every sample for this channel.  */
2080cabdff1aSopenharmony_ci            for (int i = 0; i < nb_samples / 28; i++) {
2081cabdff1aSopenharmony_ci                int byte, header;
2082cabdff1aSopenharmony_ci                if (channel)
2083cabdff1aSopenharmony_ci                    bytestream2_skipu(&gb, 1);
2084cabdff1aSopenharmony_ci                header = bytestream2_get_byteu(&gb);
2085cabdff1aSopenharmony_ci                bytestream2_skipu(&gb, 3 - channel);
2086cabdff1aSopenharmony_ci
2087cabdff1aSopenharmony_ci                /* Decode 28 samples.  */
2088cabdff1aSopenharmony_ci                for (int n = 0; n < 28; n++) {
2089cabdff1aSopenharmony_ci                    int32_t sampledat, prev;
2090cabdff1aSopenharmony_ci
2091cabdff1aSopenharmony_ci                    switch (header >> 4) {
2092cabdff1aSopenharmony_ci                    case 1:
2093cabdff1aSopenharmony_ci                        prev = (c->status[channel].sample1 * 0x3c);
2094cabdff1aSopenharmony_ci                        break;
2095cabdff1aSopenharmony_ci                    case 2:
2096cabdff1aSopenharmony_ci                        prev = (c->status[channel].sample1 * 0x73) - (c->status[channel].sample2 * 0x34);
2097cabdff1aSopenharmony_ci                        break;
2098cabdff1aSopenharmony_ci                    case 3:
2099cabdff1aSopenharmony_ci                        prev = (c->status[channel].sample1 * 0x62) - (c->status[channel].sample2 * 0x37);
2100cabdff1aSopenharmony_ci                        break;
2101cabdff1aSopenharmony_ci                    default:
2102cabdff1aSopenharmony_ci                        prev = 0;
2103cabdff1aSopenharmony_ci                    }
2104cabdff1aSopenharmony_ci
2105cabdff1aSopenharmony_ci                    prev = av_clip_intp2((prev + 0x20) >> 6, 21);
2106cabdff1aSopenharmony_ci
2107cabdff1aSopenharmony_ci                    byte = bytestream2_get_byteu(&gb);
2108cabdff1aSopenharmony_ci                    if (!channel)
2109cabdff1aSopenharmony_ci                        sampledat = sign_extend(byte, 4);
2110cabdff1aSopenharmony_ci                    else
2111cabdff1aSopenharmony_ci                        sampledat = sign_extend(byte >> 4, 4);
2112cabdff1aSopenharmony_ci
2113cabdff1aSopenharmony_ci                    sampledat = ((sampledat * (1 << 12)) >> (header & 0xf)) * (1 << 6) + prev;
2114cabdff1aSopenharmony_ci                    *samples++ = av_clip_int16(sampledat >> 6);
2115cabdff1aSopenharmony_ci                    c->status[channel].sample2 = c->status[channel].sample1;
2116cabdff1aSopenharmony_ci                    c->status[channel].sample1 = sampledat;
2117cabdff1aSopenharmony_ci                }
2118cabdff1aSopenharmony_ci            }
2119cabdff1aSopenharmony_ci            if (!channel)
2120cabdff1aSopenharmony_ci                bytestream2_seek(&gb, 0, SEEK_SET);
2121cabdff1aSopenharmony_ci        }
2122cabdff1aSopenharmony_ci        ) /* End of CASE */
2123cabdff1aSopenharmony_ci    CASE(ADPCM_PSX,
2124cabdff1aSopenharmony_ci        for (int block = 0; block < avpkt->size / FFMAX(avctx->block_align, 16 * channels); block++) {
2125cabdff1aSopenharmony_ci            int nb_samples_per_block = 28 * FFMAX(avctx->block_align, 16 * channels) / (16 * channels);
2126cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
2127cabdff1aSopenharmony_ci                samples = samples_p[channel] + block * nb_samples_per_block;
2128cabdff1aSopenharmony_ci                av_assert0((block + 1) * nb_samples_per_block <= nb_samples);
2129cabdff1aSopenharmony_ci
2130cabdff1aSopenharmony_ci                /* Read in every sample for this channel.  */
2131cabdff1aSopenharmony_ci                for (int i = 0; i < nb_samples_per_block / 28; i++) {
2132cabdff1aSopenharmony_ci                    int filter, shift, flag, byte;
2133cabdff1aSopenharmony_ci
2134cabdff1aSopenharmony_ci                    filter = bytestream2_get_byteu(&gb);
2135cabdff1aSopenharmony_ci                    shift  = filter & 0xf;
2136cabdff1aSopenharmony_ci                    filter = filter >> 4;
2137cabdff1aSopenharmony_ci                    if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table))
2138cabdff1aSopenharmony_ci                        return AVERROR_INVALIDDATA;
2139cabdff1aSopenharmony_ci                    flag   = bytestream2_get_byteu(&gb) & 0x7;
2140cabdff1aSopenharmony_ci
2141cabdff1aSopenharmony_ci                    /* Decode 28 samples.  */
2142cabdff1aSopenharmony_ci                    for (int n = 0; n < 28; n++) {
2143cabdff1aSopenharmony_ci                        int sample = 0, scale;
2144cabdff1aSopenharmony_ci
2145cabdff1aSopenharmony_ci                        if (n & 1) {
2146cabdff1aSopenharmony_ci                            scale = sign_extend(byte >> 4, 4);
2147cabdff1aSopenharmony_ci                        } else {
2148cabdff1aSopenharmony_ci                            byte  = bytestream2_get_byteu(&gb);
2149cabdff1aSopenharmony_ci                            scale = sign_extend(byte, 4);
2150cabdff1aSopenharmony_ci                        }
2151cabdff1aSopenharmony_ci
2152cabdff1aSopenharmony_ci                        if (flag < 0x07) {
2153cabdff1aSopenharmony_ci                            scale  = scale * (1 << 12);
2154cabdff1aSopenharmony_ci                            sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64);
2155cabdff1aSopenharmony_ci                        }
2156cabdff1aSopenharmony_ci                        *samples++ = av_clip_int16(sample);
2157cabdff1aSopenharmony_ci                        c->status[channel].sample2 = c->status[channel].sample1;
2158cabdff1aSopenharmony_ci                        c->status[channel].sample1 = sample;
2159cabdff1aSopenharmony_ci                    }
2160cabdff1aSopenharmony_ci                }
2161cabdff1aSopenharmony_ci            }
2162cabdff1aSopenharmony_ci        }
2163cabdff1aSopenharmony_ci        ) /* End of CASE */
2164cabdff1aSopenharmony_ci    CASE(ADPCM_ARGO,
2165cabdff1aSopenharmony_ci        /*
2166cabdff1aSopenharmony_ci         * The format of each block:
2167cabdff1aSopenharmony_ci         *   uint8_t left_control;
2168cabdff1aSopenharmony_ci         *   uint4_t left_samples[nb_samples];
2169cabdff1aSopenharmony_ci         *   ---- and if stereo ----
2170cabdff1aSopenharmony_ci         *   uint8_t right_control;
2171cabdff1aSopenharmony_ci         *   uint4_t right_samples[nb_samples];
2172cabdff1aSopenharmony_ci         *
2173cabdff1aSopenharmony_ci         * Format of the control byte:
2174cabdff1aSopenharmony_ci         * MSB [SSSSRDRR] LSB
2175cabdff1aSopenharmony_ci         *   S = (Shift Amount - 2)
2176cabdff1aSopenharmony_ci         *   D = Decoder flag.
2177cabdff1aSopenharmony_ci         *   R = Reserved
2178cabdff1aSopenharmony_ci         *
2179cabdff1aSopenharmony_ci         * Each block relies on the previous two samples of each channel.
2180cabdff1aSopenharmony_ci         * They should be 0 initially.
2181cabdff1aSopenharmony_ci         */
2182cabdff1aSopenharmony_ci        for (int block = 0; block < avpkt->size / avctx->block_align; block++) {
2183cabdff1aSopenharmony_ci            for (int channel = 0; channel < avctx->ch_layout.nb_channels; channel++) {
2184cabdff1aSopenharmony_ci                ADPCMChannelStatus *cs = c->status + channel;
2185cabdff1aSopenharmony_ci                int control, shift;
2186cabdff1aSopenharmony_ci
2187cabdff1aSopenharmony_ci                samples = samples_p[channel] + block * 32;
2188cabdff1aSopenharmony_ci
2189cabdff1aSopenharmony_ci                /* Get the control byte and decode the samples, 2 at a time. */
2190cabdff1aSopenharmony_ci                control = bytestream2_get_byteu(&gb);
2191cabdff1aSopenharmony_ci                shift = (control >> 4) + 2;
2192cabdff1aSopenharmony_ci
2193cabdff1aSopenharmony_ci                for (int n = 0; n < 16; n++) {
2194cabdff1aSopenharmony_ci                    int sample = bytestream2_get_byteu(&gb);
2195cabdff1aSopenharmony_ci                    *samples++ = ff_adpcm_argo_expand_nibble(cs, sample >> 4, shift, control & 0x04);
2196cabdff1aSopenharmony_ci                    *samples++ = ff_adpcm_argo_expand_nibble(cs, sample >> 0, shift, control & 0x04);
2197cabdff1aSopenharmony_ci                }
2198cabdff1aSopenharmony_ci            }
2199cabdff1aSopenharmony_ci        }
2200cabdff1aSopenharmony_ci        ) /* End of CASE */
2201cabdff1aSopenharmony_ci    CASE(ADPCM_ZORK,
2202cabdff1aSopenharmony_ci        for (int n = 0; n < nb_samples * channels; n++) {
2203cabdff1aSopenharmony_ci            int v = bytestream2_get_byteu(&gb);
2204cabdff1aSopenharmony_ci            *samples++ = adpcm_zork_expand_nibble(&c->status[n % channels], v);
2205cabdff1aSopenharmony_ci        }
2206cabdff1aSopenharmony_ci        ) /* End of CASE */
2207cabdff1aSopenharmony_ci    CASE(ADPCM_IMA_MTF,
2208cabdff1aSopenharmony_ci        for (int n = nb_samples / 2; n > 0; n--) {
2209cabdff1aSopenharmony_ci            for (int channel = 0; channel < channels; channel++) {
2210cabdff1aSopenharmony_ci                int v = bytestream2_get_byteu(&gb);
2211cabdff1aSopenharmony_ci                *samples++  = adpcm_ima_mtf_expand_nibble(&c->status[channel], v >> 4);
2212cabdff1aSopenharmony_ci                samples[st] = adpcm_ima_mtf_expand_nibble(&c->status[channel], v & 0x0F);
2213cabdff1aSopenharmony_ci            }
2214cabdff1aSopenharmony_ci            samples += channels;
2215cabdff1aSopenharmony_ci        }
2216cabdff1aSopenharmony_ci        ) /* End of CASE */
2217cabdff1aSopenharmony_ci    default:
2218cabdff1aSopenharmony_ci        av_assert0(0); // unsupported codec_id should not happen
2219cabdff1aSopenharmony_ci    }
2220cabdff1aSopenharmony_ci
2221cabdff1aSopenharmony_ci    if (avpkt->size && bytestream2_tell(&gb) == 0) {
2222cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Nothing consumed\n");
2223cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
2224cabdff1aSopenharmony_ci    }
2225cabdff1aSopenharmony_ci
2226cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
2227cabdff1aSopenharmony_ci
2228cabdff1aSopenharmony_ci    if (avpkt->size < bytestream2_tell(&gb)) {
2229cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Overread of %d < %d\n", avpkt->size, bytestream2_tell(&gb));
2230cabdff1aSopenharmony_ci        return avpkt->size;
2231cabdff1aSopenharmony_ci    }
2232cabdff1aSopenharmony_ci
2233cabdff1aSopenharmony_ci    return bytestream2_tell(&gb);
2234cabdff1aSopenharmony_ci}
2235cabdff1aSopenharmony_ci
2236cabdff1aSopenharmony_cistatic void adpcm_flush(AVCodecContext *avctx)
2237cabdff1aSopenharmony_ci{
2238cabdff1aSopenharmony_ci    ADPCMDecodeContext *c = avctx->priv_data;
2239cabdff1aSopenharmony_ci
2240cabdff1aSopenharmony_ci    /* Just nuke the entire state and re-init. */
2241cabdff1aSopenharmony_ci    memset(c, 0, sizeof(ADPCMDecodeContext));
2242cabdff1aSopenharmony_ci
2243cabdff1aSopenharmony_ci    switch(avctx->codec_id) {
2244cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_CT:
2245cabdff1aSopenharmony_ci        c->status[0].step = c->status[1].step = 511;
2246cabdff1aSopenharmony_ci        break;
2247cabdff1aSopenharmony_ci
2248cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_APC:
2249cabdff1aSopenharmony_ci        if (avctx->extradata && avctx->extradata_size >= 8) {
2250cabdff1aSopenharmony_ci            c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata    ), 18);
2251cabdff1aSopenharmony_ci            c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18);
2252cabdff1aSopenharmony_ci        }
2253cabdff1aSopenharmony_ci        break;
2254cabdff1aSopenharmony_ci
2255cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_APM:
2256cabdff1aSopenharmony_ci        if (avctx->extradata && avctx->extradata_size >= 28) {
2257cabdff1aSopenharmony_ci            c->status[0].predictor  = av_clip_intp2(AV_RL32(avctx->extradata + 16), 18);
2258cabdff1aSopenharmony_ci            c->status[0].step_index = av_clip(AV_RL32(avctx->extradata + 20), 0, 88);
2259cabdff1aSopenharmony_ci            c->status[1].predictor  = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18);
2260cabdff1aSopenharmony_ci            c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 8), 0, 88);
2261cabdff1aSopenharmony_ci        }
2262cabdff1aSopenharmony_ci        break;
2263cabdff1aSopenharmony_ci
2264cabdff1aSopenharmony_ci    case AV_CODEC_ID_ADPCM_IMA_WS:
2265cabdff1aSopenharmony_ci        if (avctx->extradata && avctx->extradata_size >= 2)
2266cabdff1aSopenharmony_ci            c->vqa_version = AV_RL16(avctx->extradata);
2267cabdff1aSopenharmony_ci        break;
2268cabdff1aSopenharmony_ci    default:
2269cabdff1aSopenharmony_ci        /* Other codecs may want to handle this during decoding. */
2270cabdff1aSopenharmony_ci        c->has_status = 0;
2271cabdff1aSopenharmony_ci        return;
2272cabdff1aSopenharmony_ci    }
2273cabdff1aSopenharmony_ci
2274cabdff1aSopenharmony_ci    c->has_status = 1;
2275cabdff1aSopenharmony_ci}
2276cabdff1aSopenharmony_ci
2277cabdff1aSopenharmony_ci
2278cabdff1aSopenharmony_cistatic const enum AVSampleFormat sample_fmts_s16[]  = { AV_SAMPLE_FMT_S16,
2279cabdff1aSopenharmony_ci                                                        AV_SAMPLE_FMT_NONE };
2280cabdff1aSopenharmony_cistatic const enum AVSampleFormat sample_fmts_s16p[] = { AV_SAMPLE_FMT_S16P,
2281cabdff1aSopenharmony_ci                                                        AV_SAMPLE_FMT_NONE };
2282cabdff1aSopenharmony_cistatic const enum AVSampleFormat sample_fmts_both[] = { AV_SAMPLE_FMT_S16,
2283cabdff1aSopenharmony_ci                                                        AV_SAMPLE_FMT_S16P,
2284cabdff1aSopenharmony_ci                                                        AV_SAMPLE_FMT_NONE };
2285cabdff1aSopenharmony_ci
2286cabdff1aSopenharmony_ci#define ADPCM_DECODER_0(id_, sample_fmts_, name_, long_name_)
2287cabdff1aSopenharmony_ci#define ADPCM_DECODER_1(id_, sample_fmts_, name_, long_name_) \
2288cabdff1aSopenharmony_ciconst FFCodec ff_ ## name_ ## _decoder = {                  \
2289cabdff1aSopenharmony_ci    .p.name         = #name_,                               \
2290cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL(long_name_),     \
2291cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,                   \
2292cabdff1aSopenharmony_ci    .p.id           = id_,                                  \
2293cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1,                     \
2294cabdff1aSopenharmony_ci    .p.sample_fmts  = sample_fmts_,                         \
2295cabdff1aSopenharmony_ci    .priv_data_size = sizeof(ADPCMDecodeContext),           \
2296cabdff1aSopenharmony_ci    .init           = adpcm_decode_init,                    \
2297cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(adpcm_decode_frame),                 \
2298cabdff1aSopenharmony_ci    .flush          = adpcm_flush,                          \
2299cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,         \
2300cabdff1aSopenharmony_ci};
2301cabdff1aSopenharmony_ci#define ADPCM_DECODER_2(enabled, codec_id, name, sample_fmts, long_name) \
2302cabdff1aSopenharmony_ci    ADPCM_DECODER_ ## enabled(codec_id, name, sample_fmts, long_name)
2303cabdff1aSopenharmony_ci#define ADPCM_DECODER_3(config, codec_id, name, sample_fmts, long_name) \
2304cabdff1aSopenharmony_ci    ADPCM_DECODER_2(config, codec_id, name, sample_fmts, long_name)
2305cabdff1aSopenharmony_ci#define ADPCM_DECODER(codec, name, sample_fmts, long_name) \
2306cabdff1aSopenharmony_ci    ADPCM_DECODER_3(CONFIG_ ## codec ## _DECODER, AV_CODEC_ID_ ## codec, \
2307cabdff1aSopenharmony_ci                    name, sample_fmts, long_name)
2308cabdff1aSopenharmony_ci
2309cabdff1aSopenharmony_ci/* Note: Do not forget to add new entries to the Makefile as well. */
2310cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_4XM,         sample_fmts_s16p, adpcm_4xm,         "ADPCM 4X Movie")
2311cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_AFC,         sample_fmts_s16p, adpcm_afc,         "ADPCM Nintendo Gamecube AFC")
2312cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_AGM,         sample_fmts_s16,  adpcm_agm,         "ADPCM AmuseGraphics Movie")
2313cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_AICA,        sample_fmts_s16p, adpcm_aica,        "ADPCM Yamaha AICA")
2314cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_ARGO,        sample_fmts_s16p, adpcm_argo,        "ADPCM Argonaut Games")
2315cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_CT,          sample_fmts_s16,  adpcm_ct,          "ADPCM Creative Technology")
2316cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_DTK,         sample_fmts_s16p, adpcm_dtk,         "ADPCM Nintendo Gamecube DTK")
2317cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_EA,          sample_fmts_s16,  adpcm_ea,          "ADPCM Electronic Arts")
2318cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_EA_MAXIS_XA, sample_fmts_s16,  adpcm_ea_maxis_xa, "ADPCM Electronic Arts Maxis CDROM XA")
2319cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_EA_R1,       sample_fmts_s16p, adpcm_ea_r1,       "ADPCM Electronic Arts R1")
2320cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_EA_R2,       sample_fmts_s16p, adpcm_ea_r2,       "ADPCM Electronic Arts R2")
2321cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_EA_R3,       sample_fmts_s16p, adpcm_ea_r3,       "ADPCM Electronic Arts R3")
2322cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_EA_XAS,      sample_fmts_s16p, adpcm_ea_xas,      "ADPCM Electronic Arts XAS")
2323cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_ACORN,   sample_fmts_s16,  adpcm_ima_acorn,   "ADPCM IMA Acorn Replay")
2324cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_AMV,     sample_fmts_s16,  adpcm_ima_amv,     "ADPCM IMA AMV")
2325cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_APC,     sample_fmts_s16,  adpcm_ima_apc,     "ADPCM IMA CRYO APC")
2326cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_APM,     sample_fmts_s16,  adpcm_ima_apm,     "ADPCM IMA Ubisoft APM")
2327cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_CUNNING, sample_fmts_s16p, adpcm_ima_cunning, "ADPCM IMA Cunning Developments")
2328cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_DAT4,    sample_fmts_s16,  adpcm_ima_dat4,    "ADPCM IMA Eurocom DAT4")
2329cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_DK3,     sample_fmts_s16,  adpcm_ima_dk3,     "ADPCM IMA Duck DK3")
2330cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_DK4,     sample_fmts_s16,  adpcm_ima_dk4,     "ADPCM IMA Duck DK4")
2331cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_EA_EACS, sample_fmts_s16,  adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS")
2332cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_EA_SEAD, sample_fmts_s16,  adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD")
2333cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_ISS,     sample_fmts_s16,  adpcm_ima_iss,     "ADPCM IMA Funcom ISS")
2334cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_MOFLEX,  sample_fmts_s16p, adpcm_ima_moflex,  "ADPCM IMA MobiClip MOFLEX")
2335cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_MTF,     sample_fmts_s16,  adpcm_ima_mtf,     "ADPCM IMA Capcom's MT Framework")
2336cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_OKI,     sample_fmts_s16,  adpcm_ima_oki,     "ADPCM IMA Dialogic OKI")
2337cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_QT,      sample_fmts_s16p, adpcm_ima_qt,      "ADPCM IMA QuickTime")
2338cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_RAD,     sample_fmts_s16,  adpcm_ima_rad,     "ADPCM IMA Radical")
2339cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_SSI,     sample_fmts_s16,  adpcm_ima_ssi,     "ADPCM IMA Simon & Schuster Interactive")
2340cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_SMJPEG,  sample_fmts_s16,  adpcm_ima_smjpeg,  "ADPCM IMA Loki SDL MJPEG")
2341cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_ALP,     sample_fmts_s16,  adpcm_ima_alp,     "ADPCM IMA High Voltage Software ALP")
2342cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_WAV,     sample_fmts_s16p, adpcm_ima_wav,     "ADPCM IMA WAV")
2343cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_IMA_WS,      sample_fmts_both, adpcm_ima_ws,      "ADPCM IMA Westwood")
2344cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_MS,          sample_fmts_both, adpcm_ms,          "ADPCM Microsoft")
2345cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_MTAF,        sample_fmts_s16p, adpcm_mtaf,        "ADPCM MTAF")
2346cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_PSX,         sample_fmts_s16p, adpcm_psx,         "ADPCM Playstation")
2347cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_SBPRO_2,     sample_fmts_s16,  adpcm_sbpro_2,     "ADPCM Sound Blaster Pro 2-bit")
2348cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_SBPRO_3,     sample_fmts_s16,  adpcm_sbpro_3,     "ADPCM Sound Blaster Pro 2.6-bit")
2349cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_SBPRO_4,     sample_fmts_s16,  adpcm_sbpro_4,     "ADPCM Sound Blaster Pro 4-bit")
2350cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_SWF,         sample_fmts_s16,  adpcm_swf,         "ADPCM Shockwave Flash")
2351cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_THP_LE,      sample_fmts_s16p, adpcm_thp_le,      "ADPCM Nintendo THP (little-endian)")
2352cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_THP,         sample_fmts_s16p, adpcm_thp,         "ADPCM Nintendo THP")
2353cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_XA,          sample_fmts_s16p, adpcm_xa,          "ADPCM CDROM XA")
2354cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_YAMAHA,      sample_fmts_s16,  adpcm_yamaha,      "ADPCM Yamaha")
2355cabdff1aSopenharmony_ciADPCM_DECODER(ADPCM_ZORK,        sample_fmts_s16,  adpcm_zork,        "ADPCM Zork")
2356