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