annotate adpcm.c @ 4714:fc70a43a4f01 libavcodec

Fix H.264 8x8 transform selection It seems that it's opt parse bug, it can't process the flags which start by digit. After change 8x8dct to dct8x8, I can set it without problem. I guess nobody will use it since it can't work as expected, so the quick fix is change the option name. Patch by Limin Wang lance dot lmwang at gmail com
author mru
date Sat, 24 Mar 2007 12:07:07 +0000
parents 3c6c557aa977
children d6b2ddac2c5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1 /*
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
2 * ADPCM codecs
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
3 * Copyright (c) 2001-2003 The ffmpeg Project
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3445
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3445
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3445
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3445
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3445
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
15 * Lesser General Public License for more details.
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
16 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3445
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
20 */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
21 #include "avcodec.h"
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
22 #include "bitstream.h"
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
23
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
24 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
25 * @file adpcm.c
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
26 * ADPCM codecs.
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
27 * First version by Francois Revol (revol@free.fr)
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
28 * Fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
29 * by Mike Melanson (melanson@pcisys.net)
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
30 * CD-ROM XA ADPCM codec by BERO
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
31 * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
32 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
33 * Features and limitations:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
34 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
35 * Reference documents:
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
36 * http://www.pcisys.net/~melanson/codecs/simpleaudio.html
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
37 * http://www.geocities.com/SiliconValley/8682/aud3.txt
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
38 * http://openquicktime.sourceforge.net/plugins.htm
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
39 * XAnim sources (xa_codec.c) http://www.rasnaimaging.com/people/lapus/download.html
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
40 * http://www.cs.ucla.edu/~leec/mediabench/applications.html
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
41 * SoX source code http://home.sprynet.com/~cbagwell/sox.html
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
42 *
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
43 * CD-ROM XA:
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
44 * http://ku-www.ss.titech.ac.jp/~yatsushi/xaadpcm.html
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
45 * vagpack & depack http://homepages.compuserve.de/bITmASTER32/psx-index.html
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
46 * readstr http://www.geocities.co.jp/Playtown/2004/
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
47 */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
48
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
49 #define BLKSIZE 1024
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
50
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
51 #define CLAMP_TO_SHORT(value) \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
52 if (value > 32767) \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
53 value = 32767; \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
54 else if (value < -32768) \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
55 value = -32768; \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
56
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
57 /* step_table[] and index_table[] are from the ADPCM reference source */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
58 /* This is the index table: */
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
59 static const int index_table[16] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
60 -1, -1, -1, -1, 2, 4, 6, 8,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
61 -1, -1, -1, -1, 2, 4, 6, 8,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
62 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
63
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
64 /**
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
65 * This is the step table. Note that many programs use slight deviations from
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
66 * this table, but such deviations are negligible:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
67 */
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
68 static const int step_table[89] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
69 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
70 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
71 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
72 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
73 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
74 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
75 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
76 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
77 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
78 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
79
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
80 /* These are for MS-ADPCM */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
81 /* AdaptationTable[], AdaptCoeff1[], and AdaptCoeff2[] are from libsndfile */
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
82 static const int AdaptationTable[] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
83 230, 230, 230, 230, 307, 409, 512, 614,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
84 768, 614, 512, 409, 307, 230, 230, 230
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
85 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
86
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
87 static const int AdaptCoeff1[] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
88 256, 512, 0, 192, 240, 460, 392
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
89 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
90
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
91 static const int AdaptCoeff2[] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
92 0, -256, 0, 64, 0, -208, -232
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
93 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
94
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
95 /* These are for CD-ROM XA ADPCM */
1559
alex
parents: 1535
diff changeset
96 static const int xa_adpcm_table[5][2] = {
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
97 { 0, 0 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
98 { 60, 0 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
99 { 115, -52 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
100 { 98, -55 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
101 { 122, -60 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
102 };
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
103
2753
ba8ecddf5598 adding a few const
michael
parents: 2516
diff changeset
104 static const int ea_adpcm_table[] = {
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
105 0, 240, 460, 392, 0, 0, -208, -220, 0, 1,
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
106 3, 4, 7, 8, 10, 11, 0, -1, -3, -4
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
107 };
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
108
2753
ba8ecddf5598 adding a few const
michael
parents: 2516
diff changeset
109 static const int ct_adpcm_table[8] = {
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
110 0x00E6, 0x00E6, 0x00E6, 0x00E6,
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
111 0x0133, 0x0199, 0x0200, 0x0266
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
112 };
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
113
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
114 // padded to zero where table size is less then 16
2753
ba8ecddf5598 adding a few const
michael
parents: 2516
diff changeset
115 static const int swf_index_tables[4][16] = {
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
116 /*2*/ { -1, 2 },
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
117 /*3*/ { -1, -1, 2, 4 },
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
118 /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 },
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
119 /*5*/ { -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16 }
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
120 };
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
121
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
122 static const int yamaha_indexscale[] = {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
123 230, 230, 230, 230, 307, 409, 512, 614,
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
124 230, 230, 230, 230, 307, 409, 512, 614
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
125 };
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
126
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
127 static const int yamaha_difflookup[] = {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
128 1, 3, 5, 7, 9, 11, 13, 15,
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
129 -1, -3, -5, -7, -9, -11, -13, -15
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
130 };
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
131
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
132 /* end of tables */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
133
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
134 typedef struct ADPCMChannelStatus {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
135 int predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
136 short int step_index;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
137 int step;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
138 /* for encoding */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
139 int prev_sample;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
140
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
141 /* MS version */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
142 short sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
143 short sample2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
144 int coeff1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
145 int coeff2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
146 int idelta;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
147 } ADPCMChannelStatus;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
148
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
149 typedef struct ADPCMContext {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
150 int channel; /* for stereo MOVs, decode left, then decode right, then tell it's decoded */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
151 ADPCMChannelStatus status[2];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
152 short sample_buffer[32]; /* hold left samples while waiting for right samples */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
153 } ADPCMContext;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
154
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
155 /* XXX: implement encoding */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
156
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
157 #ifdef CONFIG_ENCODERS
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
158 static int adpcm_encode_init(AVCodecContext *avctx)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
159 {
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
160 if (avctx->channels > 2)
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
161 return -1; /* only stereo or mono =) */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
162 switch(avctx->codec->id) {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
163 case CODEC_ID_ADPCM_IMA_QT:
1611
d29e96720e21 comment fix
bellard
parents: 1598
diff changeset
164 av_log(avctx, AV_LOG_ERROR, "ADPCM: codec adpcm_ima_qt unsupported for encoding !\n");
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
165 avctx->frame_size = 64; /* XXX: can multiple of avctx->channels * 64 (left and right blocks are interleaved) */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
166 return -1;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
167 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
168 case CODEC_ID_ADPCM_IMA_WAV:
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
169 avctx->frame_size = (BLKSIZE - 4 * avctx->channels) * 8 / (4 * avctx->channels) + 1; /* each 16 bits sample gives one nibble */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
170 /* and we have 4 bytes per channel overhead */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
171 avctx->block_align = BLKSIZE;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
172 /* seems frame_size isn't taken into account... have to buffer the samples :-( */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
173 break;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
174 case CODEC_ID_ADPCM_MS:
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
175 avctx->frame_size = (BLKSIZE - 7 * avctx->channels) * 2 / avctx->channels + 2; /* each 16 bits sample gives one nibble */
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
176 /* and we have 7 bytes per channel overhead */
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
177 avctx->block_align = BLKSIZE;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
178 break;
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
179 case CODEC_ID_ADPCM_YAMAHA:
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
180 avctx->frame_size = BLKSIZE * avctx->channels;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
181 avctx->block_align = BLKSIZE;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
182 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
183 default:
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
184 return -1;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
185 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
186 }
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
187
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
188 avctx->coded_frame= avcodec_alloc_frame();
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
189 avctx->coded_frame->key_frame= 1;
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
190
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
191 return 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
192 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
193
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
194 static int adpcm_encode_close(AVCodecContext *avctx)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
195 {
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
196 av_freep(&avctx->coded_frame);
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
197
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
198 return 0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
199 }
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
200
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
201
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
202 static inline unsigned char adpcm_ima_compress_sample(ADPCMChannelStatus *c, short sample)
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
203 {
3334
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
204 int delta = sample - c->prev_sample;
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
205 int nibble = FFMIN(7, abs(delta)*4/step_table[c->step_index]) + (delta<0)*8;
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
206 c->prev_sample = c->prev_sample + ((step_table[c->step_index] * yamaha_difflookup[nibble]) / 8);
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
207 CLAMP_TO_SHORT(c->prev_sample);
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
208 c->step_index = av_clip(c->step_index + index_table[nibble], 0, 88);
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
209 return nibble;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
210 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
211
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
212 static inline unsigned char adpcm_ms_compress_sample(ADPCMChannelStatus *c, short sample)
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
213 {
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
214 int predictor, nibble, bias;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
215
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
216 predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 256;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
217
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
218 nibble= sample - predictor;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
219 if(nibble>=0) bias= c->idelta/2;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
220 else bias=-c->idelta/2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
221
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
222 nibble= (nibble + bias) / c->idelta;
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
223 nibble= av_clip(nibble, -8, 7)&0x0F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
224
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
225 predictor += (signed)((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
226 CLAMP_TO_SHORT(predictor);
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
227
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
228 c->sample2 = c->sample1;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
229 c->sample1 = predictor;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
230
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
231 c->idelta = (AdaptationTable[(int)nibble] * c->idelta) >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
232 if (c->idelta < 16) c->idelta = 16;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
233
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
234 return nibble;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
235 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
236
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
237 static inline unsigned char adpcm_yamaha_compress_sample(ADPCMChannelStatus *c, short sample)
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
238 {
3334
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
239 int nibble, delta;
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
240
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
241 if(!c->step) {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
242 c->predictor = 0;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
243 c->step = 127;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
244 }
3334
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
245
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
246 delta = sample - c->predictor;
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
247
3334
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
248 nibble = FFMIN(7, abs(delta)*4/c->step) + (delta<0)*8;
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
249
3334
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
250 c->predictor = c->predictor + ((c->step * yamaha_difflookup[nibble]) / 8);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
251 CLAMP_TO_SHORT(c->predictor);
3334
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
252 c->step = (c->step * yamaha_indexscale[nibble]) >> 8;
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
253 c->step = av_clip(c->step, 127, 24567);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
254
3334
97d9937d4ce7 adpcm_ima & adpcm_yamaha: improved quantization
lorenm
parents: 3157
diff changeset
255 return nibble;
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
256 }
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
257
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
258 typedef struct TrellisPath {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
259 int nibble;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
260 int prev;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
261 } TrellisPath;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
262
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
263 typedef struct TrellisNode {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
264 uint32_t ssd;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
265 int path;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
266 int sample1;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
267 int sample2;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
268 int step;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
269 } TrellisNode;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
270
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
271 static void adpcm_compress_trellis(AVCodecContext *avctx, const short *samples,
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
272 uint8_t *dst, ADPCMChannelStatus *c, int n)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
273 {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
274 #define FREEZE_INTERVAL 128
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
275 //FIXME 6% faster if frontier is a compile-time constant
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
276 const int frontier = 1 << avctx->trellis;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
277 const int stride = avctx->channels;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
278 const int version = avctx->codec->id;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
279 const int max_paths = frontier*FREEZE_INTERVAL;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
280 TrellisPath paths[max_paths], *p;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
281 TrellisNode node_buf[2][frontier];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
282 TrellisNode *nodep_buf[2][frontier];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
283 TrellisNode **nodes = nodep_buf[0]; // nodes[] is always sorted by .ssd
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
284 TrellisNode **nodes_next = nodep_buf[1];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
285 int pathn = 0, froze = -1, i, j, k;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
286
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
287 assert(!(max_paths&(max_paths-1)));
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
288
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
289 memset(nodep_buf, 0, sizeof(nodep_buf));
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
290 nodes[0] = &node_buf[1][0];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
291 nodes[0]->ssd = 0;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
292 nodes[0]->path = 0;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
293 nodes[0]->step = c->step_index;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
294 nodes[0]->sample1 = c->sample1;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
295 nodes[0]->sample2 = c->sample2;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
296 if(version == CODEC_ID_ADPCM_IMA_WAV)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
297 nodes[0]->sample1 = c->prev_sample;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
298 if(version == CODEC_ID_ADPCM_MS)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
299 nodes[0]->step = c->idelta;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
300 if(version == CODEC_ID_ADPCM_YAMAHA) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
301 if(c->step == 0) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
302 nodes[0]->step = 127;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
303 nodes[0]->sample1 = 0;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
304 } else {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
305 nodes[0]->step = c->step;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
306 nodes[0]->sample1 = c->predictor;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
307 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
308 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
309
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
310 for(i=0; i<n; i++) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
311 TrellisNode *t = node_buf[i&1];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
312 TrellisNode **u;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
313 int sample = samples[i*stride];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
314 memset(nodes_next, 0, frontier*sizeof(TrellisNode*));
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
315 for(j=0; j<frontier && nodes[j]; j++) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
316 // higher j have higher ssd already, so they're unlikely to use a suboptimal next sample too
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
317 const int range = (j < frontier/2) ? 1 : 0;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
318 const int step = nodes[j]->step;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
319 int nidx;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
320 if(version == CODEC_ID_ADPCM_MS) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
321 const int predictor = ((nodes[j]->sample1 * c->coeff1) + (nodes[j]->sample2 * c->coeff2)) / 256;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
322 const int div = (sample - predictor) / step;
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
323 const int nmin = av_clip(div-range, -8, 6);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
324 const int nmax = av_clip(div+range, -7, 7);
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
325 for(nidx=nmin; nidx<=nmax; nidx++) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
326 const int nibble = nidx & 0xf;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
327 int dec_sample = predictor + nidx * step;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
328 #define STORE_NODE(NAME, STEP_INDEX)\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
329 int d;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
330 uint32_t ssd;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
331 CLAMP_TO_SHORT(dec_sample);\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
332 d = sample - dec_sample;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
333 ssd = nodes[j]->ssd + d*d;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
334 if(nodes_next[frontier-1] && ssd >= nodes_next[frontier-1]->ssd)\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
335 continue;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
336 /* Collapse any two states with the same previous sample value. \
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
337 * One could also distinguish states by step and by 2nd to last
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
338 * sample, but the effects of that are negligible. */\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
339 for(k=0; k<frontier && nodes_next[k]; k++) {\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
340 if(dec_sample == nodes_next[k]->sample1) {\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
341 assert(ssd >= nodes_next[k]->ssd);\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
342 goto next_##NAME;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
343 }\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
344 }\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
345 for(k=0; k<frontier; k++) {\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
346 if(!nodes_next[k] || ssd < nodes_next[k]->ssd) {\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
347 TrellisNode *u = nodes_next[frontier-1];\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
348 if(!u) {\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
349 assert(pathn < max_paths);\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
350 u = t++;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
351 u->path = pathn++;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
352 }\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
353 u->ssd = ssd;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
354 u->step = STEP_INDEX;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
355 u->sample2 = nodes[j]->sample1;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
356 u->sample1 = dec_sample;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
357 paths[u->path].nibble = nibble;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
358 paths[u->path].prev = nodes[j]->path;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
359 memmove(&nodes_next[k+1], &nodes_next[k], (frontier-k-1)*sizeof(TrellisNode*));\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
360 nodes_next[k] = u;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
361 break;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
362 }\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
363 }\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
364 next_##NAME:;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
365 STORE_NODE(ms, FFMAX(16, (AdaptationTable[nibble] * step) >> 8));
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
366 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
367 } else if(version == CODEC_ID_ADPCM_IMA_WAV) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
368 #define LOOP_NODES(NAME, STEP_TABLE, STEP_INDEX)\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
369 const int predictor = nodes[j]->sample1;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
370 const int div = (sample - predictor) * 4 / STEP_TABLE;\
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
371 int nmin = av_clip(div-range, -7, 6);\
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
372 int nmax = av_clip(div+range, -6, 7);\
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
373 if(nmin<=0) nmin--; /* distinguish -0 from +0 */\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
374 if(nmax<0) nmax--;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
375 for(nidx=nmin; nidx<=nmax; nidx++) {\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
376 const int nibble = nidx<0 ? 7-nidx : nidx;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
377 int dec_sample = predictor + (STEP_TABLE * yamaha_difflookup[nibble]) / 8;\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
378 STORE_NODE(NAME, STEP_INDEX);\
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
379 }
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
380 LOOP_NODES(ima, step_table[step], av_clip(step + index_table[nibble], 0, 88));
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
381 } else { //CODEC_ID_ADPCM_YAMAHA
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
382 LOOP_NODES(yamaha, step, av_clip((step * yamaha_indexscale[nibble]) >> 8, 127, 24567));
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
383 #undef LOOP_NODES
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
384 #undef STORE_NODE
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
385 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
386 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
387
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
388 u = nodes;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
389 nodes = nodes_next;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
390 nodes_next = u;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
391
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
392 // prevent overflow
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
393 if(nodes[0]->ssd > (1<<28)) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
394 for(j=1; j<frontier && nodes[j]; j++)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
395 nodes[j]->ssd -= nodes[0]->ssd;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
396 nodes[0]->ssd = 0;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
397 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
398
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
399 // merge old paths to save memory
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
400 if(i == froze + FREEZE_INTERVAL) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
401 p = &paths[nodes[0]->path];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
402 for(k=i; k>froze; k--) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
403 dst[k] = p->nibble;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
404 p = &paths[p->prev];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
405 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
406 froze = i;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
407 pathn = 0;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
408 // other nodes might use paths that don't coincide with the frozen one.
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
409 // checking which nodes do so is too slow, so just kill them all.
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
410 // this also slightly improves quality, but I don't know why.
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
411 memset(nodes+1, 0, (frontier-1)*sizeof(TrellisNode*));
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
412 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
413 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
414
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
415 p = &paths[nodes[0]->path];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
416 for(i=n-1; i>froze; i--) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
417 dst[i] = p->nibble;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
418 p = &paths[p->prev];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
419 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
420
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
421 c->predictor = nodes[0]->sample1;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
422 c->sample1 = nodes[0]->sample1;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
423 c->sample2 = nodes[0]->sample2;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
424 c->step_index = nodes[0]->step;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
425 c->step = nodes[0]->step;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
426 c->idelta = nodes[0]->step;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
427 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
428
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
429 static int adpcm_encode_frame(AVCodecContext *avctx,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
430 unsigned char *frame, int buf_size, void *data)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
431 {
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
432 int n, i, st;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
433 short *samples;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
434 unsigned char *dst;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
435 ADPCMContext *c = avctx->priv_data;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
436
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
437 dst = frame;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
438 samples = (short *)data;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
439 st= avctx->channels == 2;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
440 /* n = (BLKSIZE - 4 * avctx->channels) / (2 * 8 * avctx->channels); */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
441
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
442 switch(avctx->codec->id) {
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
443 case CODEC_ID_ADPCM_IMA_QT: /* XXX: can't test until we get .mov writer */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
444 break;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
445 case CODEC_ID_ADPCM_IMA_WAV:
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
446 n = avctx->frame_size / 8;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
447 c->status[0].prev_sample = (signed short)samples[0]; /* XXX */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
448 /* c->status[0].step_index = 0; *//* XXX: not sure how to init the state machine */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
449 *dst++ = (c->status[0].prev_sample) & 0xFF; /* little endian */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
450 *dst++ = (c->status[0].prev_sample >> 8) & 0xFF;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
451 *dst++ = (unsigned char)c->status[0].step_index;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
452 *dst++ = 0; /* unknown */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
453 samples++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
454 if (avctx->channels == 2) {
1559
alex
parents: 1535
diff changeset
455 c->status[1].prev_sample = (signed short)samples[1];
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
456 /* c->status[1].step_index = 0; */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
457 *dst++ = (c->status[1].prev_sample) & 0xFF;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
458 *dst++ = (c->status[1].prev_sample >> 8) & 0xFF;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
459 *dst++ = (unsigned char)c->status[1].step_index;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
460 *dst++ = 0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
461 samples++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
462 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
463
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
464 /* stereo: 4 bytes (8 samples) for left, 4 bytes for right, 4 bytes left, ... */
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
465 if(avctx->trellis > 0) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
466 uint8_t buf[2][n*8];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
467 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n*8);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
468 if(avctx->channels == 2)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
469 adpcm_compress_trellis(avctx, samples+1, buf[1], &c->status[1], n*8);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
470 for(i=0; i<n; i++) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
471 *dst++ = buf[0][8*i+0] | (buf[0][8*i+1] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
472 *dst++ = buf[0][8*i+2] | (buf[0][8*i+3] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
473 *dst++ = buf[0][8*i+4] | (buf[0][8*i+5] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
474 *dst++ = buf[0][8*i+6] | (buf[0][8*i+7] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
475 if (avctx->channels == 2) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
476 *dst++ = buf[1][8*i+0] | (buf[1][8*i+1] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
477 *dst++ = buf[1][8*i+2] | (buf[1][8*i+3] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
478 *dst++ = buf[1][8*i+4] | (buf[1][8*i+5] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
479 *dst++ = buf[1][8*i+6] | (buf[1][8*i+7] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
480 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
481 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
482 } else
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
483 for (; n>0; n--) {
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
484 *dst = adpcm_ima_compress_sample(&c->status[0], samples[0]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
485 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
486 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
487 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 2]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
488 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 3]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
489 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
490 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 4]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
491 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 5]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
492 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
493 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 6]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
494 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 7]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
495 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
496 /* right channel */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
497 if (avctx->channels == 2) {
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
498 *dst = adpcm_ima_compress_sample(&c->status[1], samples[1]);
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
499 *dst |= adpcm_ima_compress_sample(&c->status[1], samples[3]) << 4;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
500 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
501 *dst = adpcm_ima_compress_sample(&c->status[1], samples[5]);
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
502 *dst |= adpcm_ima_compress_sample(&c->status[1], samples[7]) << 4;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
503 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
504 *dst = adpcm_ima_compress_sample(&c->status[1], samples[9]);
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
505 *dst |= adpcm_ima_compress_sample(&c->status[1], samples[11]) << 4;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
506 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
507 *dst = adpcm_ima_compress_sample(&c->status[1], samples[13]);
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
508 *dst |= adpcm_ima_compress_sample(&c->status[1], samples[15]) << 4;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
509 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
510 }
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
511 samples += 8 * avctx->channels;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
512 }
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
513 break;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
514 case CODEC_ID_ADPCM_MS:
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
515 for(i=0; i<avctx->channels; i++){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
516 int predictor=0;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
517
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
518 *dst++ = predictor;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
519 c->status[i].coeff1 = AdaptCoeff1[predictor];
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
520 c->status[i].coeff2 = AdaptCoeff2[predictor];
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
521 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
522 for(i=0; i<avctx->channels; i++){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
523 if (c->status[i].idelta < 16)
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
524 c->status[i].idelta = 16;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
525
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
526 *dst++ = c->status[i].idelta & 0xFF;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
527 *dst++ = c->status[i].idelta >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
528 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
529 for(i=0; i<avctx->channels; i++){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
530 c->status[i].sample1= *samples++;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
531
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
532 *dst++ = c->status[i].sample1 & 0xFF;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
533 *dst++ = c->status[i].sample1 >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
534 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
535 for(i=0; i<avctx->channels; i++){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
536 c->status[i].sample2= *samples++;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
537
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
538 *dst++ = c->status[i].sample2 & 0xFF;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
539 *dst++ = c->status[i].sample2 >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
540 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
541
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
542 if(avctx->trellis > 0) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
543 int n = avctx->block_align - 7*avctx->channels;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
544 uint8_t buf[2][n];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
545 if(avctx->channels == 1) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
546 n *= 2;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
547 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
548 for(i=0; i<n; i+=2)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
549 *dst++ = (buf[0][i] << 4) | buf[0][i+1];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
550 } else {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
551 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
552 adpcm_compress_trellis(avctx, samples+1, buf[1], &c->status[1], n);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
553 for(i=0; i<n; i++)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
554 *dst++ = (buf[0][i] << 4) | buf[1][i];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
555 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
556 } else
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
557 for(i=7*avctx->channels; i<avctx->block_align; i++) {
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
558 int nibble;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
559 nibble = adpcm_ms_compress_sample(&c->status[ 0], *samples++)<<4;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
560 nibble|= adpcm_ms_compress_sample(&c->status[st], *samples++);
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
561 *dst++ = nibble;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
562 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
563 break;
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
564 case CODEC_ID_ADPCM_YAMAHA:
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
565 n = avctx->frame_size / 2;
3336
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
566 if(avctx->trellis > 0) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
567 uint8_t buf[2][n*2];
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
568 n *= 2;
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
569 if(avctx->channels == 1) {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
570 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
571 for(i=0; i<n; i+=2)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
572 *dst++ = buf[0][i] | (buf[0][i+1] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
573 } else {
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
574 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
575 adpcm_compress_trellis(avctx, samples+1, buf[1], &c->status[1], n);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
576 for(i=0; i<n; i++)
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
577 *dst++ = buf[0][i] | (buf[1][i] << 4);
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
578 }
4d807145f29a ADPCM: trellis quantization
lorenm
parents: 3334
diff changeset
579 } else
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
580 for (; n>0; n--) {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
581 for(i = 0; i < avctx->channels; i++) {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
582 int nibble;
2795
de03cac6f7c2 yamaha adpcm nibbles in the wrong order fix by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2794
diff changeset
583 nibble = adpcm_yamaha_compress_sample(&c->status[i], samples[i]);
de03cac6f7c2 yamaha adpcm nibbles in the wrong order fix by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2794
diff changeset
584 nibble |= adpcm_yamaha_compress_sample(&c->status[i], samples[i+avctx->channels]) << 4;
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
585 *dst++ = nibble;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
586 }
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
587 samples += 2 * avctx->channels;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
588 }
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
589 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
590 default:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
591 return -1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
592 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
593 return dst - frame;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
594 }
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
595 #endif //CONFIG_ENCODERS
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
596
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
597 static int adpcm_decode_init(AVCodecContext * avctx)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
598 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
599 ADPCMContext *c = avctx->priv_data;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
600
4461
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
601 if(avctx->channels > 2U){
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
602 return -1;
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
603 }
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
604
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
605 c->channel = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
606 c->status[0].predictor = c->status[1].predictor = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
607 c->status[0].step_index = c->status[1].step_index = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
608 c->status[0].step = c->status[1].step = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
609
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
610 switch(avctx->codec->id) {
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
611 case CODEC_ID_ADPCM_CT:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
612 c->status[0].step = c->status[1].step = 511;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
613 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
614 default:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
615 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
616 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
617 return 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
618 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
619
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
620 static inline short adpcm_ima_expand_nibble(ADPCMChannelStatus *c, char nibble, int shift)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
621 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
622 int step_index;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
623 int predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
624 int sign, delta, diff, step;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
625
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
626 step = step_table[c->step_index];
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
627 step_index = c->step_index + index_table[(unsigned)nibble];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
628 if (step_index < 0) step_index = 0;
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
629 else if (step_index > 88) step_index = 88;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
630
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
631 sign = nibble & 8;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
632 delta = nibble & 7;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
633 /* perform direct multiplication instead of series of jumps proposed by
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
634 * the reference ADPCM implementation since modern CPUs can do the mults
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
635 * quickly enough */
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
636 diff = ((2 * delta + 1) * step) >> shift;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
637 predictor = c->predictor;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
638 if (sign) predictor -= diff;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
639 else predictor += diff;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
640
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
641 CLAMP_TO_SHORT(predictor);
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
642 c->predictor = predictor;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
643 c->step_index = step_index;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
644
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
645 return (short)predictor;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
646 }
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
647
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
648 static inline short adpcm_ms_expand_nibble(ADPCMChannelStatus *c, char nibble)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
649 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
650 int predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
651
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
652 predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 256;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
653 predictor += (signed)((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
654 CLAMP_TO_SHORT(predictor);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
655
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
656 c->sample2 = c->sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
657 c->sample1 = predictor;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
658 c->idelta = (AdaptationTable[(int)nibble] * c->idelta) >> 8;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
659 if (c->idelta < 16) c->idelta = 16;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
660
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
661 return (short)predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
662 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
663
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
664 static inline short adpcm_ct_expand_nibble(ADPCMChannelStatus *c, char nibble)
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
665 {
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
666 int predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
667 int sign, delta, diff;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
668 int new_step;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
669
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
670 sign = nibble & 8;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
671 delta = nibble & 7;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
672 /* perform direct multiplication instead of series of jumps proposed by
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
673 * the reference ADPCM implementation since modern CPUs can do the mults
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
674 * quickly enough */
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
675 diff = ((2 * delta + 1) * c->step) >> 3;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
676 predictor = c->predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
677 /* predictor update is not so trivial: predictor is multiplied on 254/256 before updating */
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
678 if(sign)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
679 predictor = ((predictor * 254) >> 8) - diff;
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
680 else
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
681 predictor = ((predictor * 254) >> 8) + diff;
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
682 /* calculate new step and clamp it to range 511..32767 */
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
683 new_step = (ct_adpcm_table[nibble & 7] * c->step) >> 8;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
684 c->step = new_step;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
685 if(c->step < 511)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
686 c->step = 511;
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
687 if(c->step > 32767)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
688 c->step = 32767;
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
689
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
690 CLAMP_TO_SHORT(predictor);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
691 c->predictor = predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
692 return (short)predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
693 }
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
694
3127
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
695 static inline short adpcm_sbpro_expand_nibble(ADPCMChannelStatus *c, char nibble, int size, int shift)
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
696 {
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
697 int sign, delta, diff;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
698
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
699 sign = nibble & (1<<(size-1));
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
700 delta = nibble & ((1<<(size-1))-1);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
701 diff = delta << (7 + c->step + shift);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
702
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
703 if (sign)
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
704 c->predictor -= diff;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
705 else
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
706 c->predictor += diff;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
707
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
708 /* clamp result */
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
709 if (c->predictor > 16256)
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
710 c->predictor = 16256;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
711 else if (c->predictor < -16384)
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
712 c->predictor = -16384;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
713
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
714 /* calculate new step */
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
715 if (delta >= (2*size - 3) && c->step < 3)
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
716 c->step++;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
717 else if (delta == 0 && c->step > 0)
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
718 c->step--;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
719
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
720 return (short) c->predictor;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
721 }
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
722
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
723 static inline short adpcm_yamaha_expand_nibble(ADPCMChannelStatus *c, unsigned char nibble)
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
724 {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
725 if(!c->step) {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
726 c->predictor = 0;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
727 c->step = 127;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
728 }
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
729
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
730 c->predictor += (c->step * yamaha_difflookup[nibble]) / 8;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
731 CLAMP_TO_SHORT(c->predictor);
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
732 c->step = (c->step * yamaha_indexscale[nibble]) >> 8;
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
733 c->step = av_clip(c->step, 127, 24567);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
734 return c->predictor;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
735 }
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
736
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
737 static void xa_decode(short *out, const unsigned char *in,
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
738 ADPCMChannelStatus *left, ADPCMChannelStatus *right, int inc)
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
739 {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
740 int i, j;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
741 int shift,filter,f0,f1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
742 int s_1,s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
743 int d,s,t;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
744
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
745 for(i=0;i<4;i++) {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
746
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
747 shift = 12 - (in[4+i*2] & 15);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
748 filter = in[4+i*2] >> 4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
749 f0 = xa_adpcm_table[filter][0];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
750 f1 = xa_adpcm_table[filter][1];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
751
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
752 s_1 = left->sample1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
753 s_2 = left->sample2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
754
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
755 for(j=0;j<28;j++) {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
756 d = in[16+i+j*4];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
757
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
758 t = (signed char)(d<<4)>>4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
759 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
760 CLAMP_TO_SHORT(s);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
761 *out = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
762 out += inc;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
763 s_2 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
764 s_1 = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
765 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
766
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
767 if (inc==2) { /* stereo */
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
768 left->sample1 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
769 left->sample2 = s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
770 s_1 = right->sample1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
771 s_2 = right->sample2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
772 out = out + 1 - 28*2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
773 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
774
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
775 shift = 12 - (in[5+i*2] & 15);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
776 filter = in[5+i*2] >> 4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
777
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
778 f0 = xa_adpcm_table[filter][0];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
779 f1 = xa_adpcm_table[filter][1];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
780
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
781 for(j=0;j<28;j++) {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
782 d = in[16+i+j*4];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
783
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
784 t = (signed char)d >> 4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
785 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
786 CLAMP_TO_SHORT(s);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
787 *out = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
788 out += inc;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
789 s_2 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
790 s_1 = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
791 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
792
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
793 if (inc==2) { /* stereo */
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
794 right->sample1 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
795 right->sample2 = s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
796 out -= 1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
797 } else {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
798 left->sample1 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
799 left->sample2 = s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
800 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
801 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
802 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
803
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
804
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
805 /* DK3 ADPCM support macro */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
806 #define DK3_GET_NEXT_NIBBLE() \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
807 if (decode_top_nibble_next) \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
808 { \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
809 nibble = (last_byte >> 4) & 0x0F; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
810 decode_top_nibble_next = 0; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
811 } \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
812 else \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
813 { \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
814 last_byte = *src++; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
815 if (src >= buf + buf_size) break; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
816 nibble = last_byte & 0x0F; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
817 decode_top_nibble_next = 1; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
818 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
819
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
820 static int adpcm_decode_frame(AVCodecContext *avctx,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
821 void *data, int *data_size,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
822 uint8_t *buf, int buf_size)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
823 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
824 ADPCMContext *c = avctx->priv_data;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
825 ADPCMChannelStatus *cs;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
826 int n, m, channel, i;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
827 int block_predictor[2];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
828 short *samples;
4461
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
829 short *samples_end;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 925
diff changeset
830 uint8_t *src;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
831 int st; /* stereo */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
832
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
833 /* DK3 ADPCM accounting variables */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
834 unsigned char last_byte = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
835 unsigned char nibble;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
836 int decode_top_nibble_next = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
837 int diff_channel;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
838
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
839 /* EA ADPCM state variables */
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
840 uint32_t samples_in_chunk;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
841 int32_t previous_left_sample, previous_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
842 int32_t current_left_sample, current_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
843 int32_t next_left_sample, next_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
844 int32_t coeff1l, coeff2l, coeff1r, coeff2r;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
845 uint8_t shift_left, shift_right;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
846 int count1, count2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
847
1768
45e99aa10395 handle 0-length buffers
melanson
parents: 1737
diff changeset
848 if (!buf_size)
45e99aa10395 handle 0-length buffers
melanson
parents: 1737
diff changeset
849 return 0;
45e99aa10395 handle 0-length buffers
melanson
parents: 1737
diff changeset
850
4461
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
851 //should protect all 4bit ADPCM variants
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
852 //8 is needed for CODEC_ID_ADPCM_IMA_WAV with 2 channels
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
853 //
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
854 if(*data_size/4 < buf_size + 8)
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
855 return -1;
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
856
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
857 samples = data;
4461
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
858 samples_end= samples + *data_size/2;
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
859 *data_size= 0;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
860 src = buf;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
861
3127
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
862 st = avctx->channels == 2 ? 1 : 0;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
863
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
864 switch(avctx->codec->id) {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
865 case CODEC_ID_ADPCM_IMA_QT:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
866 n = (buf_size - 2);/* >> 2*avctx->channels;*/
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
867 channel = c->channel;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
868 cs = &(c->status[channel]);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
869 /* (pppppp) (piiiiiii) */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
870
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
871 /* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
872 cs->predictor = (*src++) << 8;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
873 cs->predictor |= (*src & 0x80);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
874 cs->predictor &= 0xFF80;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
875
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
876 /* sign extension */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
877 if(cs->predictor & 0x8000)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
878 cs->predictor -= 0x10000;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
879
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
880 CLAMP_TO_SHORT(cs->predictor);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
881
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
882 cs->step_index = (*src++) & 0x7F;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
883
3157
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
884 if (cs->step_index > 88){
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
885 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index);
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
886 cs->step_index = 88;
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
887 }
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
888
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
889 cs->step = step_table[cs->step_index];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
890
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
891 if (st && channel)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
892 samples++;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
893
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
894 for(m=32; n>0 && m>0; n--, m--) { /* in QuickTime, IMA is encoded by chuncks of 34 bytes (=64 samples) */
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
895 *samples = adpcm_ima_expand_nibble(cs, src[0] & 0x0F, 3);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
896 samples += avctx->channels;
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
897 *samples = adpcm_ima_expand_nibble(cs, (src[0] >> 4) & 0x0F, 3);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
898 samples += avctx->channels;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
899 src ++;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
900 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
901
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
902 if(st) { /* handle stereo interlacing */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
903 c->channel = (channel + 1) % 2; /* we get one packet for left, then one for right data */
1695
2d11403fde4e initial predictors are not sent to the output in QT IMA; fix stereo QT
melanson
parents: 1611
diff changeset
904 if(channel == 1) { /* wait for the other packet before outputing anything */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
905 return src - buf;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
906 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
907 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
908 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
909 case CODEC_ID_ADPCM_IMA_WAV:
1576
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
910 if (avctx->block_align != 0 && buf_size > avctx->block_align)
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
911 buf_size = avctx->block_align;
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
912
3157
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
913 // samples_per_block= (block_align-4*chanels)*8 / (bits_per_sample * chanels) + 1;
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
914
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
915 for(i=0; i<avctx->channels; i++){
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
916 cs = &(c->status[i]);
3157
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
917 cs->predictor = (int16_t)(src[0] + (src[1]<<8));
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
918 src+=2;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
919
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
920 // XXX: is this correct ??: *samples++ = cs->predictor;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
921
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
922 cs->step_index = *src++;
3157
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
923 if (cs->step_index > 88){
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
924 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index);
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
925 cs->step_index = 88;
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
926 }
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
927 if (*src++) av_log(avctx, AV_LOG_ERROR, "unused byte should be null but is %d!!\n", src[-1]); /* unused */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
928 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
929
3157
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
930 while(src < buf + buf_size){
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
931 for(m=0; m<4; m++){
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
932 for(i=0; i<=st; i++)
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
933 *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] & 0x0F, 3);
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
934 for(i=0; i<=st; i++)
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
935 *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] >> 4 , 3);
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
936 src++;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
937 }
3157
58dc6ca8c92d cleanup IMA-ADPCM WAV decoder
michael
parents: 3127
diff changeset
938 src += 4*st;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
939 }
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
940 break;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
941 case CODEC_ID_ADPCM_4XM:
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
942 cs = &(c->status[0]);
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
943 c->status[0].predictor= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
944 if(st){
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
945 c->status[1].predictor= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
946 }
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
947 c->status[0].step_index= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
948 if(st){
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
949 c->status[1].step_index= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
950 }
1695
2d11403fde4e initial predictors are not sent to the output in QT IMA; fix stereo QT
melanson
parents: 1611
diff changeset
951 if (cs->step_index < 0) cs->step_index = 0;
2d11403fde4e initial predictors are not sent to the output in QT IMA; fix stereo QT
melanson
parents: 1611
diff changeset
952 if (cs->step_index > 88) cs->step_index = 88;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
953
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
954 m= (buf_size - (src - buf))>>st;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
955 for(i=0; i<m; i++) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
956 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[i] & 0x0F, 4);
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
957 if (st)
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
958 *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[i+m] & 0x0F, 4);
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
959 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[i] >> 4, 4);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
960 if (st)
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
961 *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[i+m] >> 4, 4);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
962 }
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
963
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
964 src += m<<st;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
965
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
966 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
967 case CODEC_ID_ADPCM_MS:
1576
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
968 if (avctx->block_align != 0 && buf_size > avctx->block_align)
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
969 buf_size = avctx->block_align;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
970 n = buf_size - 7 * avctx->channels;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
971 if (n < 0)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
972 return -1;
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
973 block_predictor[0] = av_clip(*src++, 0, 7);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
974 block_predictor[1] = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
975 if (st)
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
976 block_predictor[1] = av_clip(*src++, 0, 7);
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
977 c->status[0].idelta = (int16_t)((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
978 src+=2;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
979 if (st){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
980 c->status[1].idelta = (int16_t)((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
981 src+=2;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
982 }
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
983 c->status[0].coeff1 = AdaptCoeff1[block_predictor[0]];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
984 c->status[0].coeff2 = AdaptCoeff2[block_predictor[0]];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
985 c->status[1].coeff1 = AdaptCoeff1[block_predictor[1]];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
986 c->status[1].coeff2 = AdaptCoeff2[block_predictor[1]];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
987
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
988 c->status[0].sample1 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
989 src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
990 if (st) c->status[1].sample1 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
991 if (st) src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
992 c->status[0].sample2 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
993 src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
994 if (st) c->status[1].sample2 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
995 if (st) src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
996
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
997 *samples++ = c->status[0].sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
998 if (st) *samples++ = c->status[1].sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
999 *samples++ = c->status[0].sample2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1000 if (st) *samples++ = c->status[1].sample2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1001 for(;n>0;n--) {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1002 *samples++ = adpcm_ms_expand_nibble(&c->status[0], (src[0] >> 4) & 0x0F);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1003 *samples++ = adpcm_ms_expand_nibble(&c->status[st], src[0] & 0x0F);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1004 src ++;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1005 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1006 break;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1007 case CODEC_ID_ADPCM_IMA_DK4:
1577
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
1008 if (avctx->block_align != 0 && buf_size > avctx->block_align)
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
1009 buf_size = avctx->block_align;
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
1010
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
1011 c->status[0].predictor = (int16_t)(src[0] | (src[1] << 8));
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1012 c->status[0].step_index = src[2];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1013 src += 4;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1014 *samples++ = c->status[0].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1015 if (st) {
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
1016 c->status[1].predictor = (int16_t)(src[0] | (src[1] << 8));
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1017 c->status[1].step_index = src[2];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1018 src += 4;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1019 *samples++ = c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1020 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1021 while (src < buf + buf_size) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1022
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1023 /* take care of the top nibble (always left or mono channel) */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1024 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1025 (src[0] >> 4) & 0x0F, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1026
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1027 /* take care of the bottom nibble, which is right sample for
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1028 * stereo, or another mono sample */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1029 if (st)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1030 *samples++ = adpcm_ima_expand_nibble(&c->status[1],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1031 src[0] & 0x0F, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1032 else
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1033 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1034 src[0] & 0x0F, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1035
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1036 src++;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1037 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1038 break;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1039 case CODEC_ID_ADPCM_IMA_DK3:
1577
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
1040 if (avctx->block_align != 0 && buf_size > avctx->block_align)
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
1041 buf_size = avctx->block_align;
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
1042
4461
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
1043 if(buf_size + 16 > (samples_end - samples)*3/8)
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
1044 return -1;
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
1045
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
1046 c->status[0].predictor = (int16_t)(src[10] | (src[11] << 8));
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
1047 c->status[1].predictor = (int16_t)(src[12] | (src[13] << 8));
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1048 c->status[0].step_index = src[14];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1049 c->status[1].step_index = src[15];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1050 /* sign extend the predictors */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1051 src += 16;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1052 diff_channel = c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1053
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1054 /* the DK3_GET_NEXT_NIBBLE macro issues the break statement when
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1055 * the buffer is consumed */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1056 while (1) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1057
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1058 /* for this algorithm, c->status[0] is the sum channel and
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1059 * c->status[1] is the diff channel */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1060
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1061 /* process the first predictor of the sum channel */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1062 DK3_GET_NEXT_NIBBLE();
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1063 adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1064
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1065 /* process the diff channel predictor */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1066 DK3_GET_NEXT_NIBBLE();
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1067 adpcm_ima_expand_nibble(&c->status[1], nibble, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1068
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1069 /* process the first pair of stereo PCM samples */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1070 diff_channel = (diff_channel + c->status[1].predictor) / 2;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1071 *samples++ = c->status[0].predictor + c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1072 *samples++ = c->status[0].predictor - c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1073
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1074 /* process the second predictor of the sum channel */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1075 DK3_GET_NEXT_NIBBLE();
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1076 adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1077
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1078 /* process the second pair of stereo PCM samples */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1079 diff_channel = (diff_channel + c->status[1].predictor) / 2;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1080 *samples++ = c->status[0].predictor + c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1081 *samples++ = c->status[0].predictor - c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1082 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1083 break;
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1084 case CODEC_ID_ADPCM_IMA_WS:
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1085 /* no per-block initialization; just start decoding the data */
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1086 while (src < buf + buf_size) {
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1087
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1088 if (st) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1089 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1090 (src[0] >> 4) & 0x0F, 3);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1091 *samples++ = adpcm_ima_expand_nibble(&c->status[1],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1092 src[0] & 0x0F, 3);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1093 } else {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1094 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1095 (src[0] >> 4) & 0x0F, 3);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1096 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
1097 src[0] & 0x0F, 3);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1098 }
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1099
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1100 src++;
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1101 }
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1102 break;
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1103 case CODEC_ID_ADPCM_XA:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1104 c->status[0].sample1 = c->status[0].sample2 =
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1105 c->status[1].sample1 = c->status[1].sample2 = 0;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1106 while (buf_size >= 128) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1107 xa_decode(samples, src, &c->status[0], &c->status[1],
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1108 avctx->channels);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1109 src += 128;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1110 samples += 28 * 8;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1111 buf_size -= 128;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1112 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1113 break;
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1114 case CODEC_ID_ADPCM_EA:
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1115 samples_in_chunk = AV_RL32(src);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1116 if (samples_in_chunk >= ((buf_size - 12) * 2)) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1117 src += buf_size;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1118 break;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1119 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1120 src += 4;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1121 current_left_sample = (int16_t)AV_RL16(src);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1122 src += 2;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1123 previous_left_sample = (int16_t)AV_RL16(src);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1124 src += 2;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1125 current_right_sample = (int16_t)AV_RL16(src);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1126 src += 2;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1127 previous_right_sample = (int16_t)AV_RL16(src);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1128 src += 2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1129
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1130 for (count1 = 0; count1 < samples_in_chunk/28;count1++) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1131 coeff1l = ea_adpcm_table[(*src >> 4) & 0x0F];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1132 coeff2l = ea_adpcm_table[((*src >> 4) & 0x0F) + 4];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1133 coeff1r = ea_adpcm_table[*src & 0x0F];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1134 coeff2r = ea_adpcm_table[(*src & 0x0F) + 4];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1135 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1136
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1137 shift_left = ((*src >> 4) & 0x0F) + 8;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1138 shift_right = (*src & 0x0F) + 8;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1139 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1140
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1141 for (count2 = 0; count2 < 28; count2++) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1142 next_left_sample = (((*src & 0xF0) << 24) >> shift_left);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1143 next_right_sample = (((*src & 0x0F) << 28) >> shift_right);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1144 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1145
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1146 next_left_sample = (next_left_sample +
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1147 (current_left_sample * coeff1l) +
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1148 (previous_left_sample * coeff2l) + 0x80) >> 8;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1149 next_right_sample = (next_right_sample +
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1150 (current_right_sample * coeff1r) +
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1151 (previous_right_sample * coeff2r) + 0x80) >> 8;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1152 CLAMP_TO_SHORT(next_left_sample);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1153 CLAMP_TO_SHORT(next_right_sample);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1154
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1155 previous_left_sample = current_left_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1156 current_left_sample = next_left_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1157 previous_right_sample = current_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1158 current_right_sample = next_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1159 *samples++ = (unsigned short)current_left_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1160 *samples++ = (unsigned short)current_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1161 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1162 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1163 break;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1164 case CODEC_ID_ADPCM_IMA_SMJPEG:
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1165 c->status[0].predictor = *src;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1166 src += 2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1167 c->status[0].step_index = *src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1168 src++; /* skip another byte before getting to the meat */
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1169 while (src < buf + buf_size) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1170 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1171 *src & 0x0F, 3);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1172 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1173 (*src >> 4) & 0x0F, 3);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1174 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1175 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1176 break;
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1177 case CODEC_ID_ADPCM_CT:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1178 while (src < buf + buf_size) {
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1179 if (st) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1180 *samples++ = adpcm_ct_expand_nibble(&c->status[0],
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1181 (src[0] >> 4) & 0x0F);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1182 *samples++ = adpcm_ct_expand_nibble(&c->status[1],
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1183 src[0] & 0x0F);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1184 } else {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1185 *samples++ = adpcm_ct_expand_nibble(&c->status[0],
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1186 (src[0] >> 4) & 0x0F);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1187 *samples++ = adpcm_ct_expand_nibble(&c->status[0],
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1188 src[0] & 0x0F);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1189 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1190 src++;
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1191 }
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1192 break;
3127
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1193 case CODEC_ID_ADPCM_SBPRO_4:
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1194 case CODEC_ID_ADPCM_SBPRO_3:
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1195 case CODEC_ID_ADPCM_SBPRO_2:
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1196 if (!c->status[0].step_index) {
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1197 /* the first byte is a raw sample */
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1198 *samples++ = 128 * (*src++ - 0x80);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1199 if (st)
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1200 *samples++ = 128 * (*src++ - 0x80);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1201 c->status[0].step_index = 1;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1202 }
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1203 if (avctx->codec->id == CODEC_ID_ADPCM_SBPRO_4) {
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1204 while (src < buf + buf_size) {
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1205 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1206 (src[0] >> 4) & 0x0F, 4, 0);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1207 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1208 src[0] & 0x0F, 4, 0);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1209 src++;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1210 }
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1211 } else if (avctx->codec->id == CODEC_ID_ADPCM_SBPRO_3) {
4461
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
1212 while (src < buf + buf_size && samples + 2 < samples_end) {
3127
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1213 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1214 (src[0] >> 5) & 0x07, 3, 0);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1215 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1216 (src[0] >> 2) & 0x07, 3, 0);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1217 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1218 src[0] & 0x03, 2, 0);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1219 src++;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1220 }
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1221 } else {
4461
c95e0df9841f some (probably exploitable) out of array write fixes
michael
parents: 4364
diff changeset
1222 while (src < buf + buf_size && samples + 3 < samples_end) {
3127
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1223 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1224 (src[0] >> 6) & 0x03, 2, 2);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1225 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1226 (src[0] >> 4) & 0x03, 2, 2);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1227 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1228 (src[0] >> 2) & 0x03, 2, 2);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1229 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1230 src[0] & 0x03, 2, 2);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1231 src++;
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1232 }
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1233 }
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1234 break;
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
1235 case CODEC_ID_ADPCM_SWF:
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
1236 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1237 GetBitContext gb;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1238 const int *table;
4614
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1239 int k0, signmask, nb_bits;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1240 int size = buf_size*8;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1241
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1242 init_get_bits(&gb, buf, size);
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
1243
4614
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1244 //read bits & inital values
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1245 nb_bits = get_bits(&gb, 2)+2;
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1246 //av_log(NULL,AV_LOG_INFO,"nb_bits: %d\n", nb_bits);
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1247 table = swf_index_tables[nb_bits-2];
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1248 k0 = 1 << (nb_bits-2);
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1249 signmask = 1 << (nb_bits-1);
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1250
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1251 for (i = 0; i < avctx->channels; i++) {
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1252 *samples++ = c->status[i].predictor = get_sbits(&gb, 16);
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1253 c->status[i].step_index = get_bits(&gb, 6);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1254 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1255
4614
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1256 while (get_bits_count(&gb) < size)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1257 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1258 int i;
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
1259
4614
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1260 for (i = 0; i < avctx->channels; i++) {
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1261 // similar to IMA adpcm
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1262 int delta = get_bits(&gb, nb_bits);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1263 int step = step_table[c->status[i].step_index];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1264 long vpdiff = 0; // vpdiff = (delta+0.5)*step/4
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1265 int k = k0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1266
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1267 do {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1268 if (delta & k)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1269 vpdiff += step;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1270 step >>= 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1271 k >>= 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1272 } while(k);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1273 vpdiff += step;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1274
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1275 if (delta & signmask)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1276 c->status[i].predictor -= vpdiff;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1277 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1278 c->status[i].predictor += vpdiff;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1279
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1280 c->status[i].step_index += table[delta & (~signmask)];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1281
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
1282 c->status[i].step_index = av_clip(c->status[i].step_index, 0, 88);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4463
diff changeset
1283 c->status[i].predictor = av_clip(c->status[i].predictor, -32768, 32767);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2795
diff changeset
1284
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1285 *samples++ = c->status[i].predictor;
4614
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1286 if (samples >= samples_end) {
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1287 av_log(avctx, AV_LOG_ERROR, "allocated output buffer is too small\n");
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1288 return -1;
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1289 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1290 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1291 }
4614
3c6c557aa977 fix adpcm swf decoding
bcoudurier
parents: 4594
diff changeset
1292 src += buf_size;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1293 break;
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
1294 }
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1295 case CODEC_ID_ADPCM_YAMAHA:
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1296 while (src < buf + buf_size) {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1297 if (st) {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1298 *samples++ = adpcm_yamaha_expand_nibble(&c->status[0],
2795
de03cac6f7c2 yamaha adpcm nibbles in the wrong order fix by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2794
diff changeset
1299 src[0] & 0x0F);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1300 *samples++ = adpcm_yamaha_expand_nibble(&c->status[1],
2795
de03cac6f7c2 yamaha adpcm nibbles in the wrong order fix by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2794
diff changeset
1301 (src[0] >> 4) & 0x0F);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1302 } else {
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1303 *samples++ = adpcm_yamaha_expand_nibble(&c->status[0],
2795
de03cac6f7c2 yamaha adpcm nibbles in the wrong order fix by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2794
diff changeset
1304 src[0] & 0x0F);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1305 *samples++ = adpcm_yamaha_expand_nibble(&c->status[0],
2795
de03cac6f7c2 yamaha adpcm nibbles in the wrong order fix by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2794
diff changeset
1306 (src[0] >> 4) & 0x0F);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1307 }
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1308 src++;
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1309 }
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1310 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1311 default:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1312 return -1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1313 }
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 925
diff changeset
1314 *data_size = (uint8_t *)samples - (uint8_t *)data;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1315 return src - buf;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1316 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1317
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1318
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1319
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1320 #ifdef CONFIG_ENCODERS
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1321 #define ADPCM_ENCODER(id,name) \
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1322 AVCodec name ## _encoder = { \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1323 #name, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1324 CODEC_TYPE_AUDIO, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1325 id, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1326 sizeof(ADPCMContext), \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1327 adpcm_encode_init, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1328 adpcm_encode_frame, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1329 adpcm_encode_close, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1330 NULL, \
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1331 };
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1332 #else
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1333 #define ADPCM_ENCODER(id,name)
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1334 #endif
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1335
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1336 #ifdef CONFIG_DECODERS
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1337 #define ADPCM_DECODER(id,name) \
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1338 AVCodec name ## _decoder = { \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1339 #name, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1340 CODEC_TYPE_AUDIO, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1341 id, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1342 sizeof(ADPCMContext), \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1343 adpcm_decode_init, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1344 NULL, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1345 NULL, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1346 adpcm_decode_frame, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1347 };
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1348 #else
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1349 #define ADPCM_DECODER(id,name)
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1350 #endif
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1351
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1352 #define ADPCM_CODEC(id, name) \
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
1353 ADPCM_ENCODER(id,name) ADPCM_DECODER(id,name)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1354
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1355 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_QT, adpcm_ima_qt);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1356 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1357 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_DK3, adpcm_ima_dk3);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
1358 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_DK4, adpcm_ima_dk4);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
1359 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WS, adpcm_ima_ws);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1360 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_SMJPEG, adpcm_ima_smjpeg);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1361 ADPCM_CODEC(CODEC_ID_ADPCM_MS, adpcm_ms);
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
1362 ADPCM_CODEC(CODEC_ID_ADPCM_4XM, adpcm_4xm);
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
1363 ADPCM_CODEC(CODEC_ID_ADPCM_XA, adpcm_xa);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
1364 ADPCM_CODEC(CODEC_ID_ADPCM_EA, adpcm_ea);
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
1365 ADPCM_CODEC(CODEC_ID_ADPCM_CT, adpcm_ct);
2516
9f17dd9b80c6 macromedia flavour adpcm decoding (used in flv and swf)
alex
parents: 2296
diff changeset
1366 ADPCM_CODEC(CODEC_ID_ADPCM_SWF, adpcm_swf);
2794
ed1ab1566353 Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents: 2753
diff changeset
1367 ADPCM_CODEC(CODEC_ID_ADPCM_YAMAHA, adpcm_yamaha);
3127
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1368 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_4, adpcm_sbpro_4);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1369 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_3, adpcm_sbpro_3);
6bae70889b35 add Creative 8 bits ADPCM schemes support
aurel
parents: 3036
diff changeset
1370 ADPCM_CODEC(CODEC_ID_ADPCM_SBPRO_2, adpcm_sbpro_2);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1371
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1372 #undef ADPCM_CODEC