Mercurial > libavcodec.hg
annotate adpcm.c @ 9675:2e84b386a8b6 libavcodec
Fix for a problem with inverted sign of output data from ffvorbis decoder.
Now the sign of audio samples in ffvorbis output is the same as in original
uncompressed audio file and this also allows the use of tiny_psnr to compare
ffvorbis with libvorbis/tremor.
author | serge |
---|---|
date | Wed, 20 May 2009 07:24:38 +0000 |
parents | 0b4ee8aa4c11 |
children | 88c0a9c62987 |
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" |
9428 | 22 #include "get_bits.h" |
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
9355
diff
changeset
|
23 #include "put_bits.h" |
4810
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
24 #include "bytestream.h" |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
25 |
1106 | 26 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8696
diff
changeset
|
27 * @file libavcodec/adpcm.c |
1106 | 28 * ADPCM codecs. |
1535 | 29 * 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
|
30 * 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
|
31 * by Mike Melanson (melanson@pcisys.net) |
1535 | 32 * CD-ROM XA ADPCM codec by BERO |
1779 | 33 * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com) |
5851 | 34 * EA ADPCM R1/R2/R3 decoder by Peter Ross (pross@xvid.org) |
5854 | 35 * EA IMA EACS decoder by Peter Ross (pross@xvid.org) |
5853 | 36 * EA IMA SEAD decoder by Peter Ross (pross@xvid.org) |
5870 | 37 * EA ADPCM XAS decoder by Peter Ross (pross@xvid.org) |
6596 | 38 * MAXIS EA ADPCM decoder by Robert Marston (rmarston@gmail.com) |
4800 | 39 * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl) |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
40 * |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
41 * Features and limitations: |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
42 * |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
43 * Reference documents: |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
44 * 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
|
45 * 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
|
46 * http://openquicktime.sourceforge.net/plugins.htm |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
47 * 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
|
48 * 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
|
49 * SoX source code http://home.sprynet.com/~cbagwell/sox.html |
1535 | 50 * |
51 * CD-ROM XA: | |
52 * http://ku-www.ss.titech.ac.jp/~yatsushi/xaadpcm.html | |
53 * vagpack & depack http://homepages.compuserve.de/bITmASTER32/psx-index.html | |
54 * 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
|
55 */ |
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 #define BLKSIZE 1024 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
58 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
59 /* 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
|
60 /* This is the index table: */ |
1081
18157900b434
* fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents:
1064
diff
changeset
|
61 static const int index_table[16] = { |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
62 -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
|
63 -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
|
64 }; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
65 |
2967 | 66 /** |
1106 | 67 * 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
|
68 * this table, but such deviations are negligible: |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
69 */ |
1081
18157900b434
* fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents:
1064
diff
changeset
|
70 static const int step_table[89] = { |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 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
|
80 }; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
81 |
1535 | 82 /* These are for MS-ADPCM */ |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
83 /* 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
|
84 static const int AdaptationTable[] = { |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
85 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
|
86 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
|
87 }; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
88 |
7247
35744b4e5082
100l, fix MS ADPCM decoding for e.g. http://samples.mplayerhq.hu/mov/qtaudio/surge-2-16-L-ms02.mov
reimar
parents:
7246
diff
changeset
|
89 static const uint8_t AdaptCoeff1[] = { |
7245
b79a3cd9ed94
Change MS ADPCM table so they fit into int8_t and change array type.
reimar
parents:
7197
diff
changeset
|
90 64, 128, 0, 48, 60, 115, 98 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
91 }; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
92 |
7245
b79a3cd9ed94
Change MS ADPCM table so they fit into int8_t and change array type.
reimar
parents:
7197
diff
changeset
|
93 static const int8_t AdaptCoeff2[] = { |
b79a3cd9ed94
Change MS ADPCM table so they fit into int8_t and change array type.
reimar
parents:
7197
diff
changeset
|
94 0, -64, 0, 16, 0, -52, -58 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
95 }; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
96 |
1535 | 97 /* These are for CD-ROM XA ADPCM */ |
1559 | 98 static const int xa_adpcm_table[5][2] = { |
1535 | 99 { 0, 0 }, |
100 { 60, 0 }, | |
101 { 115, -52 }, | |
102 { 98, -55 }, | |
103 { 122, -60 } | |
104 }; | |
105 | |
2753 | 106 static const int ea_adpcm_table[] = { |
1779 | 107 0, 240, 460, 392, 0, 0, -208, -220, 0, 1, |
108 3, 4, 7, 8, 10, 11, 0, -1, -3, -4 | |
109 }; | |
110 | |
2516
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
111 // padded to zero where table size is less then 16 |
2753 | 112 static const int swf_index_tables[4][16] = { |
2516
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
113 /*2*/ { -1, 2 }, |
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
114 /*3*/ { -1, -1, 2, 4 }, |
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
115 /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 }, |
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
116 /*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
|
117 }; |
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
118 |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
119 static const int yamaha_indexscale[] = { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
120 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
|
121 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
|
122 }; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
123 |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
124 static const int yamaha_difflookup[] = { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
125 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
|
126 -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
|
127 }; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
128 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
129 /* end of tables */ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
130 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
131 typedef struct ADPCMChannelStatus { |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
132 int predictor; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
133 short int step_index; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
134 int step; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
135 /* for encoding */ |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
136 int prev_sample; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
137 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
138 /* MS version */ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
139 short sample1; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
140 short sample2; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
141 int coeff1; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
142 int coeff2; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
143 int idelta; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
144 } ADPCMChannelStatus; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
145 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
146 typedef struct ADPCMContext { |
5851 | 147 ADPCMChannelStatus status[6]; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
148 } ADPCMContext; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
149 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
150 /* XXX: implement encoding */ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
151 |
8590 | 152 #if CONFIG_ENCODERS |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8734
diff
changeset
|
153 static av_cold int adpcm_encode_init(AVCodecContext *avctx) |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
154 { |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
155 if (avctx->channels > 2) |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
156 return -1; /* only stereo or mono =) */ |
6920
d02af7474bff
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
michael
parents:
6813
diff
changeset
|
157 |
d02af7474bff
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
michael
parents:
6813
diff
changeset
|
158 if(avctx->trellis && (unsigned)avctx->trellis > 16U){ |
d02af7474bff
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
michael
parents:
6813
diff
changeset
|
159 av_log(avctx, AV_LOG_ERROR, "invalid trellis size\n"); |
d02af7474bff
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
michael
parents:
6813
diff
changeset
|
160 return -1; |
d02af7474bff
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
michael
parents:
6813
diff
changeset
|
161 } |
d02af7474bff
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
michael
parents:
6813
diff
changeset
|
162 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
163 switch(avctx->codec->id) { |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
164 case CODEC_ID_ADPCM_IMA_WAV: |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
165 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
|
166 /* 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
|
167 avctx->block_align = BLKSIZE; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
168 /* 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
|
169 break; |
6461 | 170 case CODEC_ID_ADPCM_IMA_QT: |
171 avctx->frame_size = 64; | |
172 avctx->block_align = 34 * avctx->channels; | |
173 break; | |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
174 case CODEC_ID_ADPCM_MS: |
1794 | 175 avctx->frame_size = (BLKSIZE - 7 * avctx->channels) * 2 / avctx->channels + 2; /* each 16 bits sample gives one nibble */ |
176 /* and we have 7 bytes per channel overhead */ | |
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; |
4840 | 183 case CODEC_ID_ADPCM_SWF: |
5370
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
184 if (avctx->sample_rate != 11025 && |
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
185 avctx->sample_rate != 22050 && |
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
186 avctx->sample_rate != 44100) { |
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
187 av_log(avctx, AV_LOG_ERROR, "Sample rate must be 11025, 22050 or 44100\n"); |
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
188 return -1; |
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
189 } |
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
190 avctx->frame_size = 512 * (avctx->sample_rate / 11025); |
4840 | 191 break; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
192 default: |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
193 return -1; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
194 break; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
195 } |
925 | 196 |
197 avctx->coded_frame= avcodec_alloc_frame(); | |
198 avctx->coded_frame->key_frame= 1; | |
199 | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
200 return 0; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
201 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
202 |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8734
diff
changeset
|
203 static av_cold int adpcm_encode_close(AVCodecContext *avctx) |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
204 { |
925 | 205 av_freep(&avctx->coded_frame); |
206 | |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
207 return 0; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
208 } |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
209 |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
210 |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
211 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
|
212 { |
3334 | 213 int delta = sample - c->prev_sample; |
214 int nibble = FFMIN(7, abs(delta)*4/step_table[c->step_index]) + (delta<0)*8; | |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
215 c->prev_sample += ((step_table[c->step_index] * yamaha_difflookup[nibble]) / 8); |
5523 | 216 c->prev_sample = av_clip_int16(c->prev_sample); |
4594 | 217 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
|
218 return nibble; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
219 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
220 |
1794 | 221 static inline unsigned char adpcm_ms_compress_sample(ADPCMChannelStatus *c, short sample) |
222 { | |
223 int predictor, nibble, bias; | |
224 | |
7245
b79a3cd9ed94
Change MS ADPCM table so they fit into int8_t and change array type.
reimar
parents:
7197
diff
changeset
|
225 predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 64; |
2967 | 226 |
1794 | 227 nibble= sample - predictor; |
228 if(nibble>=0) bias= c->idelta/2; | |
229 else bias=-c->idelta/2; | |
2967 | 230 |
1794 | 231 nibble= (nibble + bias) / c->idelta; |
4594 | 232 nibble= av_clip(nibble, -8, 7)&0x0F; |
2967 | 233 |
1794 | 234 predictor += (signed)((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta; |
235 | |
236 c->sample2 = c->sample1; | |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
237 c->sample1 = av_clip_int16(predictor); |
1794 | 238 |
239 c->idelta = (AdaptationTable[(int)nibble] * c->idelta) >> 8; | |
240 if (c->idelta < 16) c->idelta = 16; | |
241 | |
242 return nibble; | |
243 } | |
244 | |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
245 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
|
246 { |
3334 | 247 int nibble, delta; |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
248 |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
249 if(!c->step) { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
250 c->predictor = 0; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
251 c->step = 127; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
252 } |
3334 | 253 |
254 delta = sample - c->predictor; | |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
255 |
3334 | 256 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
|
257 |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
258 c->predictor += ((c->step * yamaha_difflookup[nibble]) / 8); |
5523 | 259 c->predictor = av_clip_int16(c->predictor); |
3334 | 260 c->step = (c->step * yamaha_indexscale[nibble]) >> 8; |
4594 | 261 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
|
262 |
3334 | 263 return nibble; |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
264 } |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
265 |
3336 | 266 typedef struct TrellisPath { |
267 int nibble; | |
268 int prev; | |
269 } TrellisPath; | |
270 | |
271 typedef struct TrellisNode { | |
272 uint32_t ssd; | |
273 int path; | |
274 int sample1; | |
275 int sample2; | |
276 int step; | |
277 } TrellisNode; | |
278 | |
279 static void adpcm_compress_trellis(AVCodecContext *avctx, const short *samples, | |
280 uint8_t *dst, ADPCMChannelStatus *c, int n) | |
281 { | |
282 #define FREEZE_INTERVAL 128 | |
283 //FIXME 6% faster if frontier is a compile-time constant | |
284 const int frontier = 1 << avctx->trellis; | |
285 const int stride = avctx->channels; | |
286 const int version = avctx->codec->id; | |
287 const int max_paths = frontier*FREEZE_INTERVAL; | |
288 TrellisPath paths[max_paths], *p; | |
289 TrellisNode node_buf[2][frontier]; | |
290 TrellisNode *nodep_buf[2][frontier]; | |
291 TrellisNode **nodes = nodep_buf[0]; // nodes[] is always sorted by .ssd | |
292 TrellisNode **nodes_next = nodep_buf[1]; | |
293 int pathn = 0, froze = -1, i, j, k; | |
294 | |
295 assert(!(max_paths&(max_paths-1))); | |
296 | |
297 memset(nodep_buf, 0, sizeof(nodep_buf)); | |
298 nodes[0] = &node_buf[1][0]; | |
299 nodes[0]->ssd = 0; | |
300 nodes[0]->path = 0; | |
301 nodes[0]->step = c->step_index; | |
302 nodes[0]->sample1 = c->sample1; | |
303 nodes[0]->sample2 = c->sample2; | |
6461 | 304 if((version == CODEC_ID_ADPCM_IMA_WAV) || (version == CODEC_ID_ADPCM_IMA_QT) || (version == CODEC_ID_ADPCM_SWF)) |
3336 | 305 nodes[0]->sample1 = c->prev_sample; |
306 if(version == CODEC_ID_ADPCM_MS) | |
307 nodes[0]->step = c->idelta; | |
308 if(version == CODEC_ID_ADPCM_YAMAHA) { | |
309 if(c->step == 0) { | |
310 nodes[0]->step = 127; | |
311 nodes[0]->sample1 = 0; | |
312 } else { | |
313 nodes[0]->step = c->step; | |
314 nodes[0]->sample1 = c->predictor; | |
315 } | |
316 } | |
317 | |
318 for(i=0; i<n; i++) { | |
319 TrellisNode *t = node_buf[i&1]; | |
320 TrellisNode **u; | |
321 int sample = samples[i*stride]; | |
322 memset(nodes_next, 0, frontier*sizeof(TrellisNode*)); | |
323 for(j=0; j<frontier && nodes[j]; j++) { | |
324 // higher j have higher ssd already, so they're unlikely to use a suboptimal next sample too | |
325 const int range = (j < frontier/2) ? 1 : 0; | |
326 const int step = nodes[j]->step; | |
327 int nidx; | |
328 if(version == CODEC_ID_ADPCM_MS) { | |
7245
b79a3cd9ed94
Change MS ADPCM table so they fit into int8_t and change array type.
reimar
parents:
7197
diff
changeset
|
329 const int predictor = ((nodes[j]->sample1 * c->coeff1) + (nodes[j]->sample2 * c->coeff2)) / 64; |
3336 | 330 const int div = (sample - predictor) / step; |
4594 | 331 const int nmin = av_clip(div-range, -8, 6); |
332 const int nmax = av_clip(div+range, -7, 7); | |
3336 | 333 for(nidx=nmin; nidx<=nmax; nidx++) { |
334 const int nibble = nidx & 0xf; | |
335 int dec_sample = predictor + nidx * step; | |
336 #define STORE_NODE(NAME, STEP_INDEX)\ | |
337 int d;\ | |
338 uint32_t ssd;\ | |
5523 | 339 dec_sample = av_clip_int16(dec_sample);\ |
3336 | 340 d = sample - dec_sample;\ |
341 ssd = nodes[j]->ssd + d*d;\ | |
342 if(nodes_next[frontier-1] && ssd >= nodes_next[frontier-1]->ssd)\ | |
343 continue;\ | |
344 /* Collapse any two states with the same previous sample value. \ | |
345 * One could also distinguish states by step and by 2nd to last | |
346 * sample, but the effects of that are negligible. */\ | |
347 for(k=0; k<frontier && nodes_next[k]; k++) {\ | |
348 if(dec_sample == nodes_next[k]->sample1) {\ | |
349 assert(ssd >= nodes_next[k]->ssd);\ | |
350 goto next_##NAME;\ | |
351 }\ | |
352 }\ | |
353 for(k=0; k<frontier; k++) {\ | |
354 if(!nodes_next[k] || ssd < nodes_next[k]->ssd) {\ | |
355 TrellisNode *u = nodes_next[frontier-1];\ | |
356 if(!u) {\ | |
357 assert(pathn < max_paths);\ | |
358 u = t++;\ | |
359 u->path = pathn++;\ | |
360 }\ | |
361 u->ssd = ssd;\ | |
362 u->step = STEP_INDEX;\ | |
363 u->sample2 = nodes[j]->sample1;\ | |
364 u->sample1 = dec_sample;\ | |
365 paths[u->path].nibble = nibble;\ | |
366 paths[u->path].prev = nodes[j]->path;\ | |
367 memmove(&nodes_next[k+1], &nodes_next[k], (frontier-k-1)*sizeof(TrellisNode*));\ | |
368 nodes_next[k] = u;\ | |
369 break;\ | |
370 }\ | |
371 }\ | |
372 next_##NAME:; | |
373 STORE_NODE(ms, FFMAX(16, (AdaptationTable[nibble] * step) >> 8)); | |
374 } | |
6461 | 375 } else if((version == CODEC_ID_ADPCM_IMA_WAV)|| (version == CODEC_ID_ADPCM_IMA_QT)|| (version == CODEC_ID_ADPCM_SWF)) { |
3336 | 376 #define LOOP_NODES(NAME, STEP_TABLE, STEP_INDEX)\ |
377 const int predictor = nodes[j]->sample1;\ | |
378 const int div = (sample - predictor) * 4 / STEP_TABLE;\ | |
4594 | 379 int nmin = av_clip(div-range, -7, 6);\ |
380 int nmax = av_clip(div+range, -6, 7);\ | |
3336 | 381 if(nmin<=0) nmin--; /* distinguish -0 from +0 */\ |
382 if(nmax<0) nmax--;\ | |
383 for(nidx=nmin; nidx<=nmax; nidx++) {\ | |
384 const int nibble = nidx<0 ? 7-nidx : nidx;\ | |
385 int dec_sample = predictor + (STEP_TABLE * yamaha_difflookup[nibble]) / 8;\ | |
386 STORE_NODE(NAME, STEP_INDEX);\ | |
387 } | |
4594 | 388 LOOP_NODES(ima, step_table[step], av_clip(step + index_table[nibble], 0, 88)); |
3336 | 389 } else { //CODEC_ID_ADPCM_YAMAHA |
4594 | 390 LOOP_NODES(yamaha, step, av_clip((step * yamaha_indexscale[nibble]) >> 8, 127, 24567)); |
3336 | 391 #undef LOOP_NODES |
392 #undef STORE_NODE | |
393 } | |
394 } | |
395 | |
396 u = nodes; | |
397 nodes = nodes_next; | |
398 nodes_next = u; | |
399 | |
400 // prevent overflow | |
401 if(nodes[0]->ssd > (1<<28)) { | |
402 for(j=1; j<frontier && nodes[j]; j++) | |
403 nodes[j]->ssd -= nodes[0]->ssd; | |
404 nodes[0]->ssd = 0; | |
405 } | |
406 | |
407 // merge old paths to save memory | |
408 if(i == froze + FREEZE_INTERVAL) { | |
409 p = &paths[nodes[0]->path]; | |
410 for(k=i; k>froze; k--) { | |
411 dst[k] = p->nibble; | |
412 p = &paths[p->prev]; | |
413 } | |
414 froze = i; | |
415 pathn = 0; | |
416 // other nodes might use paths that don't coincide with the frozen one. | |
417 // checking which nodes do so is too slow, so just kill them all. | |
418 // this also slightly improves quality, but I don't know why. | |
419 memset(nodes+1, 0, (frontier-1)*sizeof(TrellisNode*)); | |
420 } | |
421 } | |
422 | |
423 p = &paths[nodes[0]->path]; | |
424 for(i=n-1; i>froze; i--) { | |
425 dst[i] = p->nibble; | |
426 p = &paths[p->prev]; | |
427 } | |
428 | |
429 c->predictor = nodes[0]->sample1; | |
430 c->sample1 = nodes[0]->sample1; | |
431 c->sample2 = nodes[0]->sample2; | |
432 c->step_index = nodes[0]->step; | |
433 c->step = nodes[0]->step; | |
434 c->idelta = nodes[0]->step; | |
435 } | |
436 | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
437 static int adpcm_encode_frame(AVCodecContext *avctx, |
2979 | 438 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
|
439 { |
1794 | 440 int n, i, st; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
441 short *samples; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
442 unsigned char *dst; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
443 ADPCMContext *c = avctx->priv_data; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
444 |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
445 dst = frame; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
446 samples = (short *)data; |
1794 | 447 st= avctx->channels == 2; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
448 /* 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
|
449 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
450 switch(avctx->codec->id) { |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
451 case CODEC_ID_ADPCM_IMA_WAV: |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
452 n = avctx->frame_size / 8; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
453 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
|
454 /* c->status[0].step_index = 0; *//* XXX: not sure how to init the state machine */ |
5089 | 455 bytestream_put_le16(&dst, c->status[0].prev_sample); |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
456 *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
|
457 *dst++ = 0; /* unknown */ |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
458 samples++; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
459 if (avctx->channels == 2) { |
5877
aea495619138
fix predictor initialization for adpcm-ima encoder not to lose first sample
benoit
parents:
5870
diff
changeset
|
460 c->status[1].prev_sample = (signed short)samples[0]; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
461 /* c->status[1].step_index = 0; */ |
5089 | 462 bytestream_put_le16(&dst, c->status[1].prev_sample); |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
463 *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
|
464 *dst++ = 0; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
465 samples++; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
466 } |
2967 | 467 |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
468 /* stereo: 4 bytes (8 samples) for left, 4 bytes for right, 4 bytes left, ... */ |
3336 | 469 if(avctx->trellis > 0) { |
470 uint8_t buf[2][n*8]; | |
471 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n*8); | |
472 if(avctx->channels == 2) | |
473 adpcm_compress_trellis(avctx, samples+1, buf[1], &c->status[1], n*8); | |
474 for(i=0; i<n; i++) { | |
475 *dst++ = buf[0][8*i+0] | (buf[0][8*i+1] << 4); | |
476 *dst++ = buf[0][8*i+2] | (buf[0][8*i+3] << 4); | |
477 *dst++ = buf[0][8*i+4] | (buf[0][8*i+5] << 4); | |
478 *dst++ = buf[0][8*i+6] | (buf[0][8*i+7] << 4); | |
479 if (avctx->channels == 2) { | |
480 *dst++ = buf[1][8*i+0] | (buf[1][8*i+1] << 4); | |
481 *dst++ = buf[1][8*i+2] | (buf[1][8*i+3] << 4); | |
482 *dst++ = buf[1][8*i+4] | (buf[1][8*i+5] << 4); | |
483 *dst++ = buf[1][8*i+6] | (buf[1][8*i+7] << 4); | |
484 } | |
485 } | |
486 } else | |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
487 for (; n>0; n--) { |
5834
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
488 *dst = adpcm_ima_compress_sample(&c->status[0], samples[0]); |
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
489 *dst |= adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels]) << 4; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
490 dst++; |
5834
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
491 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 2]); |
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
492 *dst |= adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 3]) << 4; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
493 dst++; |
5834
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
494 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 4]); |
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
495 *dst |= adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 5]) << 4; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
496 dst++; |
5834
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
497 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 6]); |
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
498 *dst |= adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 7]) << 4; |
577
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
499 dst++; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
500 /* right channel */ |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
501 if (avctx->channels == 2) { |
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[1]); |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
503 *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
|
504 dst++; |
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[5]); |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
506 *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
|
507 dst++; |
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[9]); |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
509 *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
|
510 dst++; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
511 *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
|
512 *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
|
513 dst++; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
514 } |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
515 samples += 8 * avctx->channels; |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
516 } |
babaca0899f1
adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents:
573
diff
changeset
|
517 break; |
6461 | 518 case CODEC_ID_ADPCM_IMA_QT: |
519 { | |
520 int ch, i; | |
521 PutBitContext pb; | |
522 init_put_bits(&pb, dst, buf_size*8); | |
523 | |
524 for(ch=0; ch<avctx->channels; ch++){ | |
525 put_bits(&pb, 9, (c->status[ch].prev_sample + 0x10000) >> 7); | |
526 put_bits(&pb, 7, c->status[ch].step_index); | |
527 if(avctx->trellis > 0) { | |
528 uint8_t buf[64]; | |
529 adpcm_compress_trellis(avctx, samples+ch, buf, &c->status[ch], 64); | |
530 for(i=0; i<64; i++) | |
531 put_bits(&pb, 4, buf[i^1]); | |
532 c->status[ch].prev_sample = c->status[ch].predictor & ~0x7F; | |
533 } else { | |
534 for (i=0; i<64; i+=2){ | |
535 int t1, t2; | |
536 t1 = adpcm_ima_compress_sample(&c->status[ch], samples[avctx->channels*(i+0)+ch]); | |
537 t2 = adpcm_ima_compress_sample(&c->status[ch], samples[avctx->channels*(i+1)+ch]); | |
538 put_bits(&pb, 4, t2); | |
539 put_bits(&pb, 4, t1); | |
540 } | |
541 c->status[ch].prev_sample &= ~0x7F; | |
542 } | |
543 } | |
544 | |
545 dst += put_bits_count(&pb)>>3; | |
546 break; | |
547 } | |
4840 | 548 case CODEC_ID_ADPCM_SWF: |
549 { | |
550 int i; | |
551 PutBitContext pb; | |
552 init_put_bits(&pb, dst, buf_size*8); | |
553 | |
5549 | 554 n = avctx->frame_size-1; |
555 | |
4840 | 556 //Store AdpcmCodeSize |
557 put_bits(&pb, 2, 2); //Set 4bits flash adpcm format | |
558 | |
559 //Init the encoder state | |
560 for(i=0; i<avctx->channels; i++){ | |
5371
74680ec68fd1
Set the step index correctly for flash adpcm. Patch by Baptiste
banan
parents:
5370
diff
changeset
|
561 c->status[i].step_index = av_clip(c->status[i].step_index, 0, 63); // clip step so it fits 6 bits |
7260
3ec34b551aae
bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents:
7259
diff
changeset
|
562 put_sbits(&pb, 16, samples[i]); |
5371
74680ec68fd1
Set the step index correctly for flash adpcm. Patch by Baptiste
banan
parents:
5370
diff
changeset
|
563 put_bits(&pb, 6, c->status[i].step_index); |
4840 | 564 c->status[i].prev_sample = (signed short)samples[i]; |
565 } | |
566 | |
5549 | 567 if(avctx->trellis > 0) { |
568 uint8_t buf[2][n]; | |
569 adpcm_compress_trellis(avctx, samples+2, buf[0], &c->status[0], n); | |
570 if (avctx->channels == 2) | |
571 adpcm_compress_trellis(avctx, samples+3, buf[1], &c->status[1], n); | |
572 for(i=0; i<n; i++) { | |
573 put_bits(&pb, 4, buf[0][i]); | |
574 if (avctx->channels == 2) | |
575 put_bits(&pb, 4, buf[1][i]); | |
576 } | |
577 } else { | |
5550 | 578 for (i=1; i<avctx->frame_size; i++) { |
5834
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
579 put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels*i])); |
5550 | 580 if (avctx->channels == 2) |
5834
1edffbe7d57d
Remove unnecessary guarding &=0x0f around adpcm_ima_compress_sample().
diego
parents:
5775
diff
changeset
|
581 put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[1], samples[2*i+1])); |
5549 | 582 } |
4840 | 583 } |
5370
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
584 flush_put_bits(&pb); |
bbb982818ce7
Calculate the correct blocksize for flash adpcm. Patch by Baptiste
banan
parents:
5129
diff
changeset
|
585 dst += put_bits_count(&pb)>>3; |
4840 | 586 break; |
587 } | |
1794 | 588 case CODEC_ID_ADPCM_MS: |
589 for(i=0; i<avctx->channels; i++){ | |
590 int predictor=0; | |
591 | |
592 *dst++ = predictor; | |
593 c->status[i].coeff1 = AdaptCoeff1[predictor]; | |
594 c->status[i].coeff2 = AdaptCoeff2[predictor]; | |
595 } | |
596 for(i=0; i<avctx->channels; i++){ | |
2967 | 597 if (c->status[i].idelta < 16) |
1794 | 598 c->status[i].idelta = 16; |
2967 | 599 |
5089 | 600 bytestream_put_le16(&dst, c->status[i].idelta); |
1794 | 601 } |
602 for(i=0; i<avctx->channels; i++){ | |
7257
9b836800690a
Fix MS ADPCM de- and encoding: first and second sample are swapped.
reimar
parents:
7247
diff
changeset
|
603 c->status[i].sample2= *samples++; |
9b836800690a
Fix MS ADPCM de- and encoding: first and second sample are swapped.
reimar
parents:
7247
diff
changeset
|
604 } |
9b836800690a
Fix MS ADPCM de- and encoding: first and second sample are swapped.
reimar
parents:
7247
diff
changeset
|
605 for(i=0; i<avctx->channels; i++){ |
1794 | 606 c->status[i].sample1= *samples++; |
607 | |
5089 | 608 bytestream_put_le16(&dst, c->status[i].sample1); |
1794 | 609 } |
7257
9b836800690a
Fix MS ADPCM de- and encoding: first and second sample are swapped.
reimar
parents:
7247
diff
changeset
|
610 for(i=0; i<avctx->channels; i++) |
5089 | 611 bytestream_put_le16(&dst, c->status[i].sample2); |
1794 | 612 |
3336 | 613 if(avctx->trellis > 0) { |
614 int n = avctx->block_align - 7*avctx->channels; | |
615 uint8_t buf[2][n]; | |
616 if(avctx->channels == 1) { | |
617 n *= 2; | |
618 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n); | |
619 for(i=0; i<n; i+=2) | |
620 *dst++ = (buf[0][i] << 4) | buf[0][i+1]; | |
621 } else { | |
622 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n); | |
623 adpcm_compress_trellis(avctx, samples+1, buf[1], &c->status[1], n); | |
624 for(i=0; i<n; i++) | |
625 *dst++ = (buf[0][i] << 4) | buf[1][i]; | |
626 } | |
627 } else | |
1794 | 628 for(i=7*avctx->channels; i<avctx->block_align; i++) { |
629 int nibble; | |
630 nibble = adpcm_ms_compress_sample(&c->status[ 0], *samples++)<<4; | |
631 nibble|= adpcm_ms_compress_sample(&c->status[st], *samples++); | |
632 *dst++ = nibble; | |
633 } | |
634 break; | |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
635 case CODEC_ID_ADPCM_YAMAHA: |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
636 n = avctx->frame_size / 2; |
3336 | 637 if(avctx->trellis > 0) { |
638 uint8_t buf[2][n*2]; | |
639 n *= 2; | |
640 if(avctx->channels == 1) { | |
641 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n); | |
642 for(i=0; i<n; i+=2) | |
643 *dst++ = buf[0][i] | (buf[0][i+1] << 4); | |
644 } else { | |
645 adpcm_compress_trellis(avctx, samples, buf[0], &c->status[0], n); | |
646 adpcm_compress_trellis(avctx, samples+1, buf[1], &c->status[1], n); | |
647 for(i=0; i<n; i++) | |
648 *dst++ = buf[0][i] | (buf[1][i] << 4); | |
649 } | |
650 } else | |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
651 for (; n>0; n--) { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
652 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
|
653 int nibble; |
2795
de03cac6f7c2
yamaha adpcm nibbles in the wrong order fix by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2794
diff
changeset
|
654 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
|
655 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
|
656 *dst++ = nibble; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
657 } |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
658 samples += 2 * avctx->channels; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
659 } |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
660 break; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
661 default: |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
662 return -1; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
663 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
664 return dst - frame; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
665 } |
1530
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
666 #endif //CONFIG_ENCODERS |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
667 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6461
diff
changeset
|
668 static av_cold int adpcm_decode_init(AVCodecContext * avctx) |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
669 { |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
670 ADPCMContext *c = avctx->priv_data; |
6678 | 671 unsigned int max_channels = 2; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
672 |
5851 | 673 switch(avctx->codec->id) { |
674 case CODEC_ID_ADPCM_EA_R1: | |
675 case CODEC_ID_ADPCM_EA_R2: | |
676 case CODEC_ID_ADPCM_EA_R3: | |
677 max_channels = 6; | |
678 break; | |
679 } | |
680 if(avctx->channels > max_channels){ | |
4461
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
681 return -1; |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
682 } |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
683 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
684 switch(avctx->codec->id) { |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
685 case CODEC_ID_ADPCM_CT: |
2979 | 686 c->status[0].step = c->status[1].step = 511; |
687 break; | |
4809 | 688 case CODEC_ID_ADPCM_IMA_WS: |
689 if (avctx->extradata && avctx->extradata_size == 2 * 4) { | |
690 c->status[0].predictor = AV_RL32(avctx->extradata); | |
691 c->status[1].predictor = AV_RL32(avctx->extradata + 4); | |
692 } | |
693 break; | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
694 default: |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
695 break; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
696 } |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7260
diff
changeset
|
697 avctx->sample_fmt = SAMPLE_FMT_S16; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
698 return 0; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
699 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
700 |
1737 | 701 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
|
702 { |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
703 int step_index; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
704 int predictor; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
705 int sign, delta, diff, step; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
706 |
1081
18157900b434
* fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents:
1064
diff
changeset
|
707 step = step_table[c->step_index]; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
708 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
|
709 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
|
710 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
|
711 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
712 sign = nibble & 8; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
713 delta = nibble & 7; |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
714 /* 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
|
715 * 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
|
716 * quickly enough */ |
1737 | 717 diff = ((2 * delta + 1) * step) >> shift; |
1296 | 718 predictor = c->predictor; |
719 if (sign) predictor -= diff; | |
720 else predictor += diff; | |
721 | |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
722 c->predictor = av_clip_int16(predictor); |
1296 | 723 c->step_index = step_index; |
724 | |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
725 return (short)c->predictor; |
1296 | 726 } |
727 | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
728 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
|
729 { |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
730 int predictor; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
731 |
7246 | 732 predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 64; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
733 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
|
734 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
735 c->sample2 = c->sample1; |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
736 c->sample1 = av_clip_int16(predictor); |
1794 | 737 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
|
738 if (c->idelta < 16) c->idelta = 16; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
739 |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
740 return c->sample1; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
741 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
742 |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
743 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
|
744 { |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
745 int sign, delta, diff; |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
746 int new_step; |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
747 |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
748 sign = nibble & 8; |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
749 delta = nibble & 7; |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
750 /* 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
|
751 * 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
|
752 * quickly enough */ |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
753 diff = ((2 * delta + 1) * c->step) >> 3; |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
754 /* predictor update is not so trivial: predictor is multiplied on 254/256 before updating */ |
5526 | 755 c->predictor = ((c->predictor * 254) >> 8) + (sign ? -diff : diff); |
756 c->predictor = av_clip_int16(c->predictor); | |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
757 /* calculate new step and clamp it to range 511..32767 */ |
8696 | 758 new_step = (AdaptationTable[nibble & 7] * c->step) >> 8; |
5527 | 759 c->step = av_clip(new_step, 511, 32767); |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
760 |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
761 return (short)c->predictor; |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
762 } |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
763 |
3127 | 764 static inline short adpcm_sbpro_expand_nibble(ADPCMChannelStatus *c, char nibble, int size, int shift) |
765 { | |
766 int sign, delta, diff; | |
767 | |
768 sign = nibble & (1<<(size-1)); | |
769 delta = nibble & ((1<<(size-1))-1); | |
770 diff = delta << (7 + c->step + shift); | |
771 | |
772 /* clamp result */ | |
5527 | 773 c->predictor = av_clip(c->predictor + (sign ? -diff : diff), -16384,16256); |
3127 | 774 |
775 /* calculate new step */ | |
776 if (delta >= (2*size - 3) && c->step < 3) | |
777 c->step++; | |
778 else if (delta == 0 && c->step > 0) | |
779 c->step--; | |
780 | |
781 return (short) c->predictor; | |
782 } | |
783 | |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
784 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
|
785 { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
786 if(!c->step) { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
787 c->predictor = 0; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
788 c->step = 127; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
789 } |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
790 |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
791 c->predictor += (c->step * yamaha_difflookup[nibble]) / 8; |
5523 | 792 c->predictor = av_clip_int16(c->predictor); |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
793 c->step = (c->step * yamaha_indexscale[nibble]) >> 8; |
4594 | 794 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
|
795 return c->predictor; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
796 } |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
797 |
2967 | 798 static void xa_decode(short *out, const unsigned char *in, |
1535 | 799 ADPCMChannelStatus *left, ADPCMChannelStatus *right, int inc) |
800 { | |
801 int i, j; | |
802 int shift,filter,f0,f1; | |
803 int s_1,s_2; | |
804 int d,s,t; | |
805 | |
806 for(i=0;i<4;i++) { | |
807 | |
808 shift = 12 - (in[4+i*2] & 15); | |
809 filter = in[4+i*2] >> 4; | |
810 f0 = xa_adpcm_table[filter][0]; | |
811 f1 = xa_adpcm_table[filter][1]; | |
812 | |
813 s_1 = left->sample1; | |
814 s_2 = left->sample2; | |
815 | |
816 for(j=0;j<28;j++) { | |
817 d = in[16+i+j*4]; | |
818 | |
819 t = (signed char)(d<<4)>>4; | |
820 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6); | |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
821 s_2 = s_1; |
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
822 s_1 = av_clip_int16(s); |
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
823 *out = s_1; |
1535 | 824 out += inc; |
825 } | |
826 | |
827 if (inc==2) { /* stereo */ | |
828 left->sample1 = s_1; | |
829 left->sample2 = s_2; | |
830 s_1 = right->sample1; | |
831 s_2 = right->sample2; | |
832 out = out + 1 - 28*2; | |
833 } | |
834 | |
835 shift = 12 - (in[5+i*2] & 15); | |
836 filter = in[5+i*2] >> 4; | |
837 | |
838 f0 = xa_adpcm_table[filter][0]; | |
839 f1 = xa_adpcm_table[filter][1]; | |
840 | |
841 for(j=0;j<28;j++) { | |
842 d = in[16+i+j*4]; | |
843 | |
844 t = (signed char)d >> 4; | |
845 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6); | |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
846 s_2 = s_1; |
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
847 s_1 = av_clip_int16(s); |
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
848 *out = s_1; |
1535 | 849 out += inc; |
850 } | |
851 | |
852 if (inc==2) { /* stereo */ | |
853 right->sample1 = s_1; | |
854 right->sample2 = s_2; | |
855 out -= 1; | |
856 } else { | |
857 left->sample1 = s_1; | |
858 left->sample2 = s_2; | |
859 } | |
860 } | |
861 } | |
862 | |
863 | |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
864 /* DK3 ADPCM support macro */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
865 #define DK3_GET_NEXT_NIBBLE() \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
866 if (decode_top_nibble_next) \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
867 { \ |
6586 | 868 nibble = last_byte >> 4; \ |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
869 decode_top_nibble_next = 0; \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
870 } \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
871 else \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
872 { \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
873 last_byte = *src++; \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
874 if (src >= buf + buf_size) break; \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
875 nibble = last_byte & 0x0F; \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
876 decode_top_nibble_next = 1; \ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
877 } |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
878 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
879 static int adpcm_decode_frame(AVCodecContext *avctx, |
2979 | 880 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9087
diff
changeset
|
881 AVPacket *avpkt) |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
882 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9087
diff
changeset
|
883 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9087
diff
changeset
|
884 int buf_size = avpkt->size; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
885 ADPCMContext *c = avctx->priv_data; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
886 ADPCMChannelStatus *cs; |
1296 | 887 int n, m, channel, i; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
888 int block_predictor[2]; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
889 short *samples; |
4461
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
890 short *samples_end; |
6259 | 891 const uint8_t *src; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
892 int st; /* stereo */ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
893 |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
894 /* DK3 ADPCM accounting variables */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
895 unsigned char last_byte = 0; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
896 unsigned char nibble; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
897 int decode_top_nibble_next = 0; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
898 int diff_channel; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
899 |
1779 | 900 /* EA ADPCM state variables */ |
901 uint32_t samples_in_chunk; | |
902 int32_t previous_left_sample, previous_right_sample; | |
903 int32_t current_left_sample, current_right_sample; | |
904 int32_t next_left_sample, next_right_sample; | |
905 int32_t coeff1l, coeff2l, coeff1r, coeff2r; | |
906 uint8_t shift_left, shift_right; | |
907 int count1, count2; | |
6596 | 908 int coeff[2][2], shift[2];//used in EA MAXIS ADPCM |
1779 | 909 |
1768 | 910 if (!buf_size) |
911 return 0; | |
912 | |
4461
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
913 //should protect all 4bit ADPCM variants |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
914 //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
|
915 // |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
916 if(*data_size/4 < buf_size + 8) |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
917 return -1; |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
918 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
919 samples = data; |
4461
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
920 samples_end= samples + *data_size/2; |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
921 *data_size= 0; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
922 src = buf; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
923 |
3127 | 924 st = avctx->channels == 2 ? 1 : 0; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
925 |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
926 switch(avctx->codec->id) { |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
927 case CODEC_ID_ADPCM_IMA_QT: |
6677
abb1f01ca0db
remove ima qt decoding hack, decode whole frame at once
bcoudurier
parents:
6676
diff
changeset
|
928 n = buf_size - 2*avctx->channels; |
abb1f01ca0db
remove ima qt decoding hack, decode whole frame at once
bcoudurier
parents:
6676
diff
changeset
|
929 for (channel = 0; channel < avctx->channels; channel++) { |
6680 | 930 cs = &(c->status[channel]); |
931 /* (pppppp) (piiiiiii) */ | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
932 |
6680 | 933 /* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */ |
934 cs->predictor = (*src++) << 8; | |
935 cs->predictor |= (*src & 0x80); | |
936 cs->predictor &= 0xFF80; | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
937 |
6680 | 938 /* sign extension */ |
939 if(cs->predictor & 0x8000) | |
940 cs->predictor -= 0x10000; | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
941 |
6680 | 942 cs->predictor = av_clip_int16(cs->predictor); |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
943 |
6680 | 944 cs->step_index = (*src++) & 0x7F; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
945 |
6680 | 946 if (cs->step_index > 88){ |
947 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index); | |
948 cs->step_index = 88; | |
949 } | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
950 |
6680 | 951 cs->step = step_table[cs->step_index]; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
952 |
6680 | 953 samples = (short*)data + channel; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
954 |
6680 | 955 for(m=32; n>0 && m>0; n--, m--) { /* in QuickTime, IMA is encoded by chuncks of 34 bytes (=64 samples) */ |
956 *samples = adpcm_ima_expand_nibble(cs, src[0] & 0x0F, 3); | |
957 samples += avctx->channels; | |
958 *samples = adpcm_ima_expand_nibble(cs, src[0] >> 4 , 3); | |
959 samples += avctx->channels; | |
960 src ++; | |
961 } | |
6677
abb1f01ca0db
remove ima qt decoding hack, decode whole frame at once
bcoudurier
parents:
6676
diff
changeset
|
962 } |
abb1f01ca0db
remove ima qt decoding hack, decode whole frame at once
bcoudurier
parents:
6676
diff
changeset
|
963 if (st) |
6676
36d091f338ca
fix adpcm ima qt decoding, channel at init is 0, correct stereo out since samples += avctx->channels
bcoudurier
parents:
6637
diff
changeset
|
964 samples--; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
965 break; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
966 case CODEC_ID_ADPCM_IMA_WAV: |
1576
bc4b13ca74de
block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents:
1559
diff
changeset
|
967 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
|
968 buf_size = avctx->block_align; |
bc4b13ca74de
block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents:
1559
diff
changeset
|
969 |
3157 | 970 // samples_per_block= (block_align-4*chanels)*8 / (bits_per_sample * chanels) + 1; |
971 | |
1737 | 972 for(i=0; i<avctx->channels; i++){ |
973 cs = &(c->status[i]); | |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
974 cs->predictor = *samples++ = (int16_t)bytestream_get_le16(&src); |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
975 |
1737 | 976 cs->step_index = *src++; |
3157 | 977 if (cs->step_index > 88){ |
978 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index); | |
979 cs->step_index = 88; | |
980 } | |
981 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
|
982 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
983 |
3157 | 984 while(src < buf + buf_size){ |
985 for(m=0; m<4; m++){ | |
986 for(i=0; i<=st; i++) | |
987 *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] & 0x0F, 3); | |
988 for(i=0; i<=st; i++) | |
989 *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] >> 4 , 3); | |
990 src++; | |
2979 | 991 } |
3157 | 992 src += 4*st; |
2979 | 993 } |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
994 break; |
1296 | 995 case CODEC_ID_ADPCM_4XM: |
996 cs = &(c->status[0]); | |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
997 c->status[0].predictor= (int16_t)bytestream_get_le16(&src); |
1296 | 998 if(st){ |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
999 c->status[1].predictor= (int16_t)bytestream_get_le16(&src); |
1296 | 1000 } |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1001 c->status[0].step_index= (int16_t)bytestream_get_le16(&src); |
1296 | 1002 if(st){ |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1003 c->status[1].step_index= (int16_t)bytestream_get_le16(&src); |
1296 | 1004 } |
1695
2d11403fde4e
initial predictors are not sent to the output in QT IMA; fix stereo QT
melanson
parents:
1611
diff
changeset
|
1005 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
|
1006 if (cs->step_index > 88) cs->step_index = 88; |
1296 | 1007 |
1008 m= (buf_size - (src - buf))>>st; | |
1009 for(i=0; i<m; i++) { | |
2979 | 1010 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[i] & 0x0F, 4); |
1296 | 1011 if (st) |
1737 | 1012 *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[i+m] & 0x0F, 4); |
1013 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[i] >> 4, 4); | |
2979 | 1014 if (st) |
1737 | 1015 *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[i+m] >> 4, 4); |
2979 | 1016 } |
1296 | 1017 |
1018 src += m<<st; | |
1019 | |
1020 break; | |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1021 case CODEC_ID_ADPCM_MS: |
1576
bc4b13ca74de
block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents:
1559
diff
changeset
|
1022 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
|
1023 buf_size = avctx->block_align; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1024 n = buf_size - 7 * avctx->channels; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1025 if (n < 0) |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1026 return -1; |
7259
9de4bc7d4938
clip MS ADPCM predictor range to correct [0..6] range, not [0..7]
reimar
parents:
7258
diff
changeset
|
1027 block_predictor[0] = av_clip(*src++, 0, 6); |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1028 block_predictor[1] = 0; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1029 if (st) |
7259
9de4bc7d4938
clip MS ADPCM predictor range to correct [0..6] range, not [0..7]
reimar
parents:
7258
diff
changeset
|
1030 block_predictor[1] = av_clip(*src++, 0, 6); |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1031 c->status[0].idelta = (int16_t)bytestream_get_le16(&src); |
1794 | 1032 if (st){ |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1033 c->status[1].idelta = (int16_t)bytestream_get_le16(&src); |
1794 | 1034 } |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1035 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
|
1036 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
|
1037 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
|
1038 c->status[1].coeff2 = AdaptCoeff2[block_predictor[1]]; |
2967 | 1039 |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1040 c->status[0].sample1 = bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1041 if (st) c->status[1].sample1 = bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1042 c->status[0].sample2 = bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1043 if (st) c->status[1].sample2 = bytestream_get_le16(&src); |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1044 |
7257
9b836800690a
Fix MS ADPCM de- and encoding: first and second sample are swapped.
reimar
parents:
7247
diff
changeset
|
1045 *samples++ = c->status[0].sample2; |
9b836800690a
Fix MS ADPCM de- and encoding: first and second sample are swapped.
reimar
parents:
7247
diff
changeset
|
1046 if (st) *samples++ = c->status[1].sample2; |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1047 *samples++ = c->status[0].sample1; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1048 if (st) *samples++ = c->status[1].sample1; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1049 for(;n>0;n--) { |
6586 | 1050 *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], src[0] >> 4 ); |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1051 *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
|
1052 src ++; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1053 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1054 break; |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1055 case CODEC_ID_ADPCM_IMA_DK4: |
1577 | 1056 if (avctx->block_align != 0 && buf_size > avctx->block_align) |
1057 buf_size = avctx->block_align; | |
1058 | |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1059 c->status[0].predictor = (int16_t)bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1060 c->status[0].step_index = *src++; |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1061 src++; |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1062 *samples++ = c->status[0].predictor; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1063 if (st) { |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1064 c->status[1].predictor = (int16_t)bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1065 c->status[1].step_index = *src++; |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1066 src++; |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1067 *samples++ = c->status[1].predictor; |
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 while (src < buf + buf_size) { |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1070 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1071 /* take care of the top nibble (always left or mono channel) */ |
2967 | 1072 *samples++ = adpcm_ima_expand_nibble(&c->status[0], |
6586 | 1073 src[0] >> 4, 3); |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1074 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1075 /* 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
|
1076 * stereo, or another mono sample */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1077 if (st) |
2967 | 1078 *samples++ = adpcm_ima_expand_nibble(&c->status[1], |
1737 | 1079 src[0] & 0x0F, 3); |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1080 else |
2967 | 1081 *samples++ = adpcm_ima_expand_nibble(&c->status[0], |
1737 | 1082 src[0] & 0x0F, 3); |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1083 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1084 src++; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1085 } |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1086 break; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1087 case CODEC_ID_ADPCM_IMA_DK3: |
1577 | 1088 if (avctx->block_align != 0 && buf_size > avctx->block_align) |
1089 buf_size = avctx->block_align; | |
1090 | |
4461
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
1091 if(buf_size + 16 > (samples_end - samples)*3/8) |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
1092 return -1; |
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
1093 |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1094 c->status[0].predictor = (int16_t)AV_RL16(src + 10); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1095 c->status[1].predictor = (int16_t)AV_RL16(src + 12); |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1096 c->status[0].step_index = src[14]; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1097 c->status[1].step_index = src[15]; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1098 /* sign extend the predictors */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1099 src += 16; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1100 diff_channel = c->status[1].predictor; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1101 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1102 /* 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
|
1103 * the buffer is consumed */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1104 while (1) { |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1105 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1106 /* 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
|
1107 * c->status[1] is the diff channel */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1108 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1109 /* 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
|
1110 DK3_GET_NEXT_NIBBLE(); |
1737 | 1111 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
|
1112 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1113 /* process the diff channel predictor */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1114 DK3_GET_NEXT_NIBBLE(); |
1737 | 1115 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
|
1116 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1117 /* 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
|
1118 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
|
1119 *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
|
1120 *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
|
1121 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1122 /* 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
|
1123 DK3_GET_NEXT_NIBBLE(); |
1737 | 1124 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
|
1125 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1126 /* 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
|
1127 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
|
1128 *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
|
1129 *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
|
1130 } |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1296
diff
changeset
|
1131 break; |
8615 | 1132 case CODEC_ID_ADPCM_IMA_ISS: |
1133 c->status[0].predictor = (int16_t)AV_RL16(src + 0); | |
1134 c->status[0].step_index = src[2]; | |
1135 src += 4; | |
1136 if(st) { | |
1137 c->status[1].predictor = (int16_t)AV_RL16(src + 0); | |
1138 c->status[1].step_index = src[2]; | |
1139 src += 4; | |
1140 } | |
1141 | |
1142 while (src < buf + buf_size) { | |
1143 | |
1144 if (st) { | |
1145 *samples++ = adpcm_ima_expand_nibble(&c->status[0], | |
1146 src[0] >> 4 , 3); | |
1147 *samples++ = adpcm_ima_expand_nibble(&c->status[1], | |
1148 src[0] & 0x0F, 3); | |
1149 } else { | |
1150 *samples++ = adpcm_ima_expand_nibble(&c->status[0], | |
1151 src[0] & 0x0F, 3); | |
1152 *samples++ = adpcm_ima_expand_nibble(&c->status[0], | |
1153 src[0] >> 4 , 3); | |
1154 } | |
1155 | |
1156 src++; | |
1157 } | |
1158 break; | |
1491
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1159 case CODEC_ID_ADPCM_IMA_WS: |
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1160 /* 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
|
1161 while (src < buf + buf_size) { |
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1162 |
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1163 if (st) { |
2967 | 1164 *samples++ = adpcm_ima_expand_nibble(&c->status[0], |
6586 | 1165 src[0] >> 4 , 3); |
2967 | 1166 *samples++ = adpcm_ima_expand_nibble(&c->status[1], |
1737 | 1167 src[0] & 0x0F, 3); |
1491
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1168 } else { |
2967 | 1169 *samples++ = adpcm_ima_expand_nibble(&c->status[0], |
6586 | 1170 src[0] >> 4 , 3); |
2967 | 1171 *samples++ = adpcm_ima_expand_nibble(&c->status[0], |
1737 | 1172 src[0] & 0x0F, 3); |
1491
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1173 } |
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1174 |
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1175 src++; |
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1176 } |
222643544cf1
New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents:
1443
diff
changeset
|
1177 break; |
1535 | 1178 case CODEC_ID_ADPCM_XA: |
1179 while (buf_size >= 128) { | |
2967 | 1180 xa_decode(samples, src, &c->status[0], &c->status[1], |
1535 | 1181 avctx->channels); |
1182 src += 128; | |
1183 samples += 28 * 8; | |
1184 buf_size -= 128; | |
1185 } | |
1186 break; | |
5854 | 1187 case CODEC_ID_ADPCM_IMA_EA_EACS: |
1188 samples_in_chunk = bytestream_get_le32(&src) >> (1-st); | |
1189 | |
1190 if (samples_in_chunk > buf_size-4-(8<<st)) { | |
1191 src += buf_size - 4; | |
1192 break; | |
1193 } | |
1194 | |
1195 for (i=0; i<=st; i++) | |
1196 c->status[i].step_index = bytestream_get_le32(&src); | |
1197 for (i=0; i<=st; i++) | |
1198 c->status[i].predictor = bytestream_get_le32(&src); | |
1199 | |
1200 for (; samples_in_chunk; samples_in_chunk--, src++) { | |
1201 *samples++ = adpcm_ima_expand_nibble(&c->status[0], *src>>4, 3); | |
1202 *samples++ = adpcm_ima_expand_nibble(&c->status[st], *src&0x0F, 3); | |
1203 } | |
1204 break; | |
5853 | 1205 case CODEC_ID_ADPCM_IMA_EA_SEAD: |
1206 for (; src < buf+buf_size; src++) { | |
1207 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[0] >> 4, 6); | |
1208 *samples++ = adpcm_ima_expand_nibble(&c->status[st],src[0]&0x0F, 6); | |
1209 } | |
1210 break; | |
1779 | 1211 case CODEC_ID_ADPCM_EA: |
9577
0b4ee8aa4c11
Check if there is enough bytes before reading the buffer in the EA ADPCM
vitor
parents:
9576
diff
changeset
|
1212 if (buf_size < 4 || AV_RL32(src) >= ((buf_size - 12) * 2)) { |
1779 | 1213 src += buf_size; |
1214 break; | |
1215 } | |
9577
0b4ee8aa4c11
Check if there is enough bytes before reading the buffer in the EA ADPCM
vitor
parents:
9576
diff
changeset
|
1216 samples_in_chunk = AV_RL32(src); |
1779 | 1217 src += 4; |
7258
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1218 current_left_sample = (int16_t)bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1219 previous_left_sample = (int16_t)bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1220 current_right_sample = (int16_t)bytestream_get_le16(&src); |
48c9043b1372
Use bytestream and AV_RL* functions in ADPCM code where possible
reimar
parents:
7257
diff
changeset
|
1221 previous_right_sample = (int16_t)bytestream_get_le16(&src); |
1779 | 1222 |
1223 for (count1 = 0; count1 < samples_in_chunk/28;count1++) { | |
6586 | 1224 coeff1l = ea_adpcm_table[ *src >> 4 ]; |
1225 coeff2l = ea_adpcm_table[(*src >> 4 ) + 4]; | |
1779 | 1226 coeff1r = ea_adpcm_table[*src & 0x0F]; |
1227 coeff2r = ea_adpcm_table[(*src & 0x0F) + 4]; | |
1228 src++; | |
1229 | |
6586 | 1230 shift_left = (*src >> 4 ) + 8; |
1779 | 1231 shift_right = (*src & 0x0F) + 8; |
1232 src++; | |
1233 | |
1234 for (count2 = 0; count2 < 28; count2++) { | |
6592 | 1235 next_left_sample = (int32_t)((*src & 0xF0) << 24) >> shift_left; |
1236 next_right_sample = (int32_t)((*src & 0x0F) << 28) >> shift_right; | |
1779 | 1237 src++; |
1238 | |
2967 | 1239 next_left_sample = (next_left_sample + |
1240 (current_left_sample * coeff1l) + | |
1779 | 1241 (previous_left_sample * coeff2l) + 0x80) >> 8; |
2967 | 1242 next_right_sample = (next_right_sample + |
1243 (current_right_sample * coeff1r) + | |
1779 | 1244 (previous_right_sample * coeff2r) + 0x80) >> 8; |
1245 | |
1246 previous_left_sample = current_left_sample; | |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
1247 current_left_sample = av_clip_int16(next_left_sample); |
1779 | 1248 previous_right_sample = current_right_sample; |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
1249 current_right_sample = av_clip_int16(next_right_sample); |
1779 | 1250 *samples++ = (unsigned short)current_left_sample; |
1251 *samples++ = (unsigned short)current_right_sample; | |
1252 } | |
1253 } | |
9576 | 1254 |
1255 if (src - buf == buf_size - 2) | |
1256 src += 2; // Skip terminating 0x0000 | |
1257 | |
1779 | 1258 break; |
6596 | 1259 case CODEC_ID_ADPCM_EA_MAXIS_XA: |
1260 for(channel = 0; channel < avctx->channels; channel++) { | |
1261 for (i=0; i<2; i++) | |
1262 coeff[channel][i] = ea_adpcm_table[(*src >> 4) + 4*i]; | |
1263 shift[channel] = (*src & 0x0F) + 8; | |
1264 src++; | |
1265 } | |
1266 for (count1 = 0; count1 < (buf_size - avctx->channels) / avctx->channels; count1++) { | |
1267 for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */ | |
1268 for(channel = 0; channel < avctx->channels; channel++) { | |
1269 int32_t sample = (int32_t)(((*(src+channel) >> i) & 0x0F) << 0x1C) >> shift[channel]; | |
1270 sample = (sample + | |
1271 c->status[channel].sample1 * coeff[channel][0] + | |
1272 c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8; | |
1273 c->status[channel].sample2 = c->status[channel].sample1; | |
1274 c->status[channel].sample1 = av_clip_int16(sample); | |
1275 *samples++ = c->status[channel].sample1; | |
1276 } | |
1277 } | |
1278 src+=avctx->channels; | |
1279 } | |
1280 break; | |
5851 | 1281 case CODEC_ID_ADPCM_EA_R1: |
1282 case CODEC_ID_ADPCM_EA_R2: | |
1283 case CODEC_ID_ADPCM_EA_R3: { | |
1284 /* channel numbering | |
1285 2chan: 0=fl, 1=fr | |
1286 4chan: 0=fl, 1=rl, 2=fr, 3=rr | |
1287 6chan: 0=fl, 1=c, 2=fr, 3=rl, 4=rr, 5=sub */ | |
1288 const int big_endian = avctx->codec->id == CODEC_ID_ADPCM_EA_R3; | |
1289 int32_t previous_sample, current_sample, next_sample; | |
1290 int32_t coeff1, coeff2; | |
1291 uint8_t shift; | |
1292 unsigned int channel; | |
1293 uint16_t *samplesC; | |
6259 | 1294 const uint8_t *srcC; |
8734 | 1295 const uint8_t *src_end = buf + buf_size; |
5851 | 1296 |
1297 samples_in_chunk = (big_endian ? bytestream_get_be32(&src) | |
1298 : bytestream_get_le32(&src)) / 28; | |
1299 if (samples_in_chunk > UINT32_MAX/(28*avctx->channels) || | |
1300 28*samples_in_chunk*avctx->channels > samples_end-samples) { | |
1301 src += buf_size - 4; | |
1302 break; | |
1303 } | |
1304 | |
1305 for (channel=0; channel<avctx->channels; channel++) { | |
8734 | 1306 int32_t offset = (big_endian ? bytestream_get_be32(&src) |
1307 : bytestream_get_le32(&src)) | |
1308 + (avctx->channels-channel-1) * 4; | |
1309 | |
1310 if ((offset < 0) || (offset >= src_end - src - 4)) break; | |
1311 srcC = src + offset; | |
5851 | 1312 samplesC = samples + channel; |
1313 | |
1314 if (avctx->codec->id == CODEC_ID_ADPCM_EA_R1) { | |
1315 current_sample = (int16_t)bytestream_get_le16(&srcC); | |
1316 previous_sample = (int16_t)bytestream_get_le16(&srcC); | |
1317 } else { | |
1318 current_sample = c->status[channel].predictor; | |
1319 previous_sample = c->status[channel].prev_sample; | |
1320 } | |
1321 | |
1322 for (count1=0; count1<samples_in_chunk; count1++) { | |
1323 if (*srcC == 0xEE) { /* only seen in R2 and R3 */ | |
1324 srcC++; | |
8734 | 1325 if (srcC > src_end - 30*2) break; |
5851 | 1326 current_sample = (int16_t)bytestream_get_be16(&srcC); |
1327 previous_sample = (int16_t)bytestream_get_be16(&srcC); | |
1328 | |
1329 for (count2=0; count2<28; count2++) { | |
1330 *samplesC = (int16_t)bytestream_get_be16(&srcC); | |
1331 samplesC += avctx->channels; | |
1332 } | |
1333 } else { | |
6586 | 1334 coeff1 = ea_adpcm_table[ *srcC>>4 ]; |
1335 coeff2 = ea_adpcm_table[(*srcC>>4) + 4]; | |
5851 | 1336 shift = (*srcC++ & 0x0F) + 8; |
1337 | |
8734 | 1338 if (srcC > src_end - 14) break; |
5851 | 1339 for (count2=0; count2<28; count2++) { |
1340 if (count2 & 1) | |
6592 | 1341 next_sample = (int32_t)((*srcC++ & 0x0F) << 28) >> shift; |
5851 | 1342 else |
6592 | 1343 next_sample = (int32_t)((*srcC & 0xF0) << 24) >> shift; |
5851 | 1344 |
1345 next_sample += (current_sample * coeff1) + | |
1346 (previous_sample * coeff2); | |
1347 next_sample = av_clip_int16(next_sample >> 8); | |
1348 | |
1349 previous_sample = current_sample; | |
1350 current_sample = next_sample; | |
1351 *samplesC = current_sample; | |
1352 samplesC += avctx->channels; | |
1353 } | |
1354 } | |
1355 } | |
1356 | |
1357 if (avctx->codec->id != CODEC_ID_ADPCM_EA_R1) { | |
1358 c->status[channel].predictor = current_sample; | |
1359 c->status[channel].prev_sample = previous_sample; | |
1360 } | |
1361 } | |
1362 | |
1363 src = src + buf_size - (4 + 4*avctx->channels); | |
1364 samples += 28 * samples_in_chunk * avctx->channels; | |
1365 break; | |
1366 } | |
5870 | 1367 case CODEC_ID_ADPCM_EA_XAS: |
1368 if (samples_end-samples < 32*4*avctx->channels | |
1369 || buf_size < (4+15)*4*avctx->channels) { | |
1370 src += buf_size; | |
1371 break; | |
1372 } | |
1373 for (channel=0; channel<avctx->channels; channel++) { | |
1374 int coeff[2][4], shift[4]; | |
1375 short *s2, *s = &samples[channel]; | |
1376 for (n=0; n<4; n++, s+=32*avctx->channels) { | |
1377 for (i=0; i<2; i++) | |
1378 coeff[i][n] = ea_adpcm_table[(src[0]&0x0F)+4*i]; | |
1379 shift[n] = (src[2]&0x0F) + 8; | |
1380 for (s2=s, i=0; i<2; i++, src+=2, s2+=avctx->channels) | |
1381 s2[0] = (src[0]&0xF0) + (src[1]<<8); | |
1382 } | |
1383 | |
1384 for (m=2; m<32; m+=2) { | |
1385 s = &samples[m*avctx->channels + channel]; | |
1386 for (n=0; n<4; n++, src++, s+=32*avctx->channels) { | |
1387 for (s2=s, i=0; i<8; i+=4, s2+=avctx->channels) { | |
6592 | 1388 int level = (int32_t)((*src & (0xF0>>i)) << (24+i)) >> shift[n]; |
5870 | 1389 int pred = s2[-1*avctx->channels] * coeff[0][n] |
1390 + s2[-2*avctx->channels] * coeff[1][n]; | |
1391 s2[0] = av_clip_int16((level + pred + 0x80) >> 8); | |
1392 } | |
1393 } | |
1394 } | |
1395 } | |
1396 samples += 32*4*avctx->channels; | |
1397 break; | |
5726 | 1398 case CODEC_ID_ADPCM_IMA_AMV: |
1779 | 1399 case CODEC_ID_ADPCM_IMA_SMJPEG: |
5775
38f220befc32
Replace "signed short" typecast with "int16_t" as suggested by
voroshil
parents:
5766
diff
changeset
|
1400 c->status[0].predictor = (int16_t)bytestream_get_le16(&src); |
5766
ad8345572a2e
Fix audio clicks in ADPCM IMA AMV by casting predictor as "signed short"
voroshil
parents:
5726
diff
changeset
|
1401 c->status[0].step_index = bytestream_get_le16(&src); |
5726 | 1402 |
1403 if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) | |
1404 src+=4; | |
1405 | |
1779 | 1406 while (src < buf + buf_size) { |
5726 | 1407 char hi, lo; |
1408 lo = *src & 0x0F; | |
6586 | 1409 hi = *src >> 4; |
5726 | 1410 |
1411 if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) | |
1412 FFSWAP(char, hi, lo); | |
1413 | |
1779 | 1414 *samples++ = adpcm_ima_expand_nibble(&c->status[0], |
5726 | 1415 lo, 3); |
1779 | 1416 *samples++ = adpcm_ima_expand_nibble(&c->status[0], |
5726 | 1417 hi, 3); |
1779 | 1418 src++; |
1419 } | |
1420 break; | |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1421 case CODEC_ID_ADPCM_CT: |
2979 | 1422 while (src < buf + buf_size) { |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1423 if (st) { |
2967 | 1424 *samples++ = adpcm_ct_expand_nibble(&c->status[0], |
6586 | 1425 src[0] >> 4); |
2967 | 1426 *samples++ = adpcm_ct_expand_nibble(&c->status[1], |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1427 src[0] & 0x0F); |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1428 } else { |
2967 | 1429 *samples++ = adpcm_ct_expand_nibble(&c->status[0], |
6586 | 1430 src[0] >> 4); |
2967 | 1431 *samples++ = adpcm_ct_expand_nibble(&c->status[0], |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1432 src[0] & 0x0F); |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1433 } |
2979 | 1434 src++; |
2296
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1435 } |
2b75dff01118
Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents:
2028
diff
changeset
|
1436 break; |
3127 | 1437 case CODEC_ID_ADPCM_SBPRO_4: |
1438 case CODEC_ID_ADPCM_SBPRO_3: | |
1439 case CODEC_ID_ADPCM_SBPRO_2: | |
1440 if (!c->status[0].step_index) { | |
1441 /* the first byte is a raw sample */ | |
1442 *samples++ = 128 * (*src++ - 0x80); | |
1443 if (st) | |
1444 *samples++ = 128 * (*src++ - 0x80); | |
1445 c->status[0].step_index = 1; | |
1446 } | |
1447 if (avctx->codec->id == CODEC_ID_ADPCM_SBPRO_4) { | |
1448 while (src < buf + buf_size) { | |
1449 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0], | |
6586 | 1450 src[0] >> 4, 4, 0); |
3127 | 1451 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st], |
1452 src[0] & 0x0F, 4, 0); | |
1453 src++; | |
1454 } | |
1455 } 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
|
1456 while (src < buf + buf_size && samples + 2 < samples_end) { |
3127 | 1457 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0], |
6586 | 1458 src[0] >> 5 , 3, 0); |
3127 | 1459 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0], |
1460 (src[0] >> 2) & 0x07, 3, 0); | |
1461 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0], | |
1462 src[0] & 0x03, 2, 0); | |
1463 src++; | |
1464 } | |
1465 } else { | |
4461
c95e0df9841f
some (probably exploitable) out of array write fixes
michael
parents:
4364
diff
changeset
|
1466 while (src < buf + buf_size && samples + 3 < samples_end) { |
3127 | 1467 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0], |
6586 | 1468 src[0] >> 6 , 2, 2); |
3127 | 1469 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st], |
1470 (src[0] >> 4) & 0x03, 2, 2); | |
1471 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0], | |
1472 (src[0] >> 2) & 0x03, 2, 2); | |
1473 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st], | |
1474 src[0] & 0x03, 2, 2); | |
1475 src++; | |
1476 } | |
1477 } | |
1478 break; | |
2516
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
1479 case CODEC_ID_ADPCM_SWF: |
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
1480 { |
2979 | 1481 GetBitContext gb; |
1482 const int *table; | |
5494
c2512a13877e
fix decoding of adpcm swf big frames, fix RamboMJPEGAVP6_1Mbps.swf
bcoudurier
parents:
5371
diff
changeset
|
1483 int k0, signmask, nb_bits, count; |
2979 | 1484 int size = buf_size*8; |
2967 | 1485 |
2979 | 1486 init_get_bits(&gb, buf, size); |
2516
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
1487 |
5129 | 1488 //read bits & initial values |
4614 | 1489 nb_bits = get_bits(&gb, 2)+2; |
1490 //av_log(NULL,AV_LOG_INFO,"nb_bits: %d\n", nb_bits); | |
1491 table = swf_index_tables[nb_bits-2]; | |
1492 k0 = 1 << (nb_bits-2); | |
1493 signmask = 1 << (nb_bits-1); | |
1494 | |
5494
c2512a13877e
fix decoding of adpcm swf big frames, fix RamboMJPEGAVP6_1Mbps.swf
bcoudurier
parents:
5371
diff
changeset
|
1495 while (get_bits_count(&gb) <= size - 22*avctx->channels) { |
5500 | 1496 for (i = 0; i < avctx->channels; i++) { |
1497 *samples++ = c->status[i].predictor = get_sbits(&gb, 16); | |
1498 c->status[i].step_index = get_bits(&gb, 6); | |
1499 } | |
2967 | 1500 |
5500 | 1501 for (count = 0; get_bits_count(&gb) <= size - nb_bits*avctx->channels && count < 4095; count++) { |
1502 int i; | |
2516
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
1503 |
5500 | 1504 for (i = 0; i < avctx->channels; i++) { |
1505 // similar to IMA adpcm | |
1506 int delta = get_bits(&gb, nb_bits); | |
1507 int step = step_table[c->status[i].step_index]; | |
1508 long vpdiff = 0; // vpdiff = (delta+0.5)*step/4 | |
1509 int k = k0; | |
2967 | 1510 |
5500 | 1511 do { |
1512 if (delta & k) | |
1513 vpdiff += step; | |
1514 step >>= 1; | |
1515 k >>= 1; | |
1516 } while(k); | |
1517 vpdiff += step; | |
2967 | 1518 |
5500 | 1519 if (delta & signmask) |
1520 c->status[i].predictor -= vpdiff; | |
1521 else | |
1522 c->status[i].predictor += vpdiff; | |
2967 | 1523 |
5500 | 1524 c->status[i].step_index += table[delta & (~signmask)]; |
2967 | 1525 |
5500 | 1526 c->status[i].step_index = av_clip(c->status[i].step_index, 0, 88); |
5523 | 1527 c->status[i].predictor = av_clip_int16(c->status[i].predictor); |
2967 | 1528 |
5500 | 1529 *samples++ = c->status[i].predictor; |
1530 if (samples >= samples_end) { | |
1531 av_log(avctx, AV_LOG_ERROR, "allocated output buffer is too small\n"); | |
1532 return -1; | |
1533 } | |
4614 | 1534 } |
2979 | 1535 } |
1536 } | |
4614 | 1537 src += buf_size; |
2979 | 1538 break; |
2516
9f17dd9b80c6
macromedia flavour adpcm decoding (used in flv and swf)
alex
parents:
2296
diff
changeset
|
1539 } |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1540 case CODEC_ID_ADPCM_YAMAHA: |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1541 while (src < buf + buf_size) { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1542 if (st) { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1543 *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
|
1544 src[0] & 0x0F); |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1545 *samples++ = adpcm_yamaha_expand_nibble(&c->status[1], |
6586 | 1546 src[0] >> 4 ); |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1547 } else { |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1548 *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
|
1549 src[0] & 0x0F); |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1550 *samples++ = adpcm_yamaha_expand_nibble(&c->status[0], |
6586 | 1551 src[0] >> 4 ); |
2794
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1552 } |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1553 src++; |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1554 } |
ed1ab1566353
Add Yamaha ADPCM encoding/decoding patch by (Vidar Madsen: vidarino, gmail com)
michael
parents:
2753
diff
changeset
|
1555 break; |
4800 | 1556 case CODEC_ID_ADPCM_THP: |
4821 | 1557 { |
4804
39975b6c49bb
table[index][ch] -> table[ch][index] (might be faster ...)
michael
parents:
4800
diff
changeset
|
1558 int table[2][16]; |
4800 | 1559 unsigned int samplecnt; |
4807 | 1560 int prev[2][2]; |
4800 | 1561 int ch; |
1562 | |
1563 if (buf_size < 80) { | |
1564 av_log(avctx, AV_LOG_ERROR, "frame too small\n"); | |
1565 return -1; | |
1566 } | |
1567 | |
4810
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1568 src+=4; |
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1569 samplecnt = bytestream_get_be32(&src); |
4800 | 1570 |
4806 | 1571 for (i = 0; i < 32; i++) |
4810
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1572 table[0][i] = (int16_t)bytestream_get_be16(&src); |
4800 | 1573 |
1574 /* Initialize the previous sample. */ | |
4808 | 1575 for (i = 0; i < 4; i++) |
4810
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1576 prev[0][i] = (int16_t)bytestream_get_be16(&src); |
4800 | 1577 |
1578 if (samplecnt >= (samples_end - samples) / (st + 1)) { | |
1579 av_log(avctx, AV_LOG_ERROR, "allocated output buffer is too small\n"); | |
1580 return -1; | |
1581 } | |
1582 | |
1583 for (ch = 0; ch <= st; ch++) { | |
1584 samples = (unsigned short *) data + ch; | |
1585 | |
1586 /* Read in every sample for this channel. */ | |
1587 for (i = 0; i < samplecnt / 14; i++) { | |
4810
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1588 int index = (*src >> 4) & 7; |
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1589 unsigned int exp = 28 - (*src++ & 15); |
4804
39975b6c49bb
table[index][ch] -> table[ch][index] (might be faster ...)
michael
parents:
4800
diff
changeset
|
1590 int factor1 = table[ch][index * 2]; |
39975b6c49bb
table[index][ch] -> table[ch][index] (might be faster ...)
michael
parents:
4800
diff
changeset
|
1591 int factor2 = table[ch][index * 2 + 1]; |
4800 | 1592 |
1593 /* Decode 14 samples. */ | |
1594 for (n = 0; n < 14; n++) { | |
4810
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1595 int32_t sampledat; |
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1596 if(n&1) sampledat= *src++ <<28; |
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1597 else sampledat= (*src&0xF0)<<24; |
4800 | 1598 |
4835
ae2f8c9bc25d
Fix an underflow/overflow that was causing some crackles when playing
diego
parents:
4821
diff
changeset
|
1599 sampledat = ((prev[ch][0]*factor1 |
4810
0066256e99da
use bytestream reader instead of bitstream for THP
michael
parents:
4809
diff
changeset
|
1600 + prev[ch][1]*factor2) >> 11) + (sampledat>>exp); |
5525
bc4791868c52
various simplifications around recent av_clip_int16() usage
aurel
parents:
5523
diff
changeset
|
1601 *samples = av_clip_int16(sampledat); |
4807 | 1602 prev[ch][1] = prev[ch][0]; |
1603 prev[ch][0] = *samples++; | |
4800 | 1604 |
1605 /* In case of stereo, skip one sample, this sample | |
1606 is for the other channel. */ | |
1607 samples += st; | |
1608 } | |
1609 } | |
1610 } | |
1611 | |
1612 /* In the previous loop, in case stereo is used, samples is | |
1613 increased exactly one time too often. */ | |
1614 samples -= st; | |
1615 break; | |
4821 | 1616 } |
4800 | 1617 |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1618 default: |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1619 return -1; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1620 } |
1064 | 1621 *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
|
1622 return src - buf; |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1623 } |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1624 |
1530
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1625 |
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1626 |
8590 | 1627 #if CONFIG_ENCODERS |
6801
047a6a80dca4
ADPCM codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6680
diff
changeset
|
1628 #define ADPCM_ENCODER(id,name,long_name_) \ |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1629 AVCodec name ## _encoder = { \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1630 #name, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1631 CODEC_TYPE_AUDIO, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1632 id, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1633 sizeof(ADPCMContext), \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1634 adpcm_encode_init, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1635 adpcm_encode_frame, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1636 adpcm_encode_close, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1637 NULL, \ |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7260
diff
changeset
|
1638 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, \ |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6920
diff
changeset
|
1639 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ |
1530
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1640 }; |
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1641 #else |
6801
047a6a80dca4
ADPCM codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6680
diff
changeset
|
1642 #define ADPCM_ENCODER(id,name,long_name_) |
1530
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1643 #endif |
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1644 |
8590 | 1645 #if CONFIG_DECODERS |
6801
047a6a80dca4
ADPCM codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6680
diff
changeset
|
1646 #define ADPCM_DECODER(id,name,long_name_) \ |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1647 AVCodec name ## _decoder = { \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1648 #name, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1649 CODEC_TYPE_AUDIO, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1650 id, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1651 sizeof(ADPCMContext), \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1652 adpcm_decode_init, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1653 NULL, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1654 NULL, \ |
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1655 adpcm_decode_frame, \ |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6920
diff
changeset
|
1656 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1657 }; |
1530
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1658 #else |
6801
047a6a80dca4
ADPCM codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6680
diff
changeset
|
1659 #define ADPCM_DECODER(id,name,long_name_) |
1530
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1660 #endif |
3b31998fe22f
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
1491
diff
changeset
|
1661 |
6801
047a6a80dca4
ADPCM codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6680
diff
changeset
|
1662 #define ADPCM_CODEC(id,name,long_name_) \ |
047a6a80dca4
ADPCM codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6680
diff
changeset
|
1663 ADPCM_ENCODER(id,name,long_name_) ADPCM_DECODER(id,name,long_name_) |
573
b0f52172f4c5
beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff
changeset
|
1664 |
7197
54f8d960f15b
Add a note to remind people that new PCM/ADPCM formats need to be added to
diego
parents:
7040
diff
changeset
|
1665 /* Note: Do not forget to add new entries to the Makefile as well. */ |
9087
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1666 ADPCM_DECODER(CODEC_ID_ADPCM_4XM, adpcm_4xm, "ADPCM 4X Movie"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1667 ADPCM_DECODER(CODEC_ID_ADPCM_CT, adpcm_ct, "ADPCM Creative Technology"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1668 ADPCM_DECODER(CODEC_ID_ADPCM_EA, adpcm_ea, "ADPCM Electronic Arts"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1669 ADPCM_DECODER(CODEC_ID_ADPCM_EA_MAXIS_XA, adpcm_ea_maxis_xa, "ADPCM Electronic Arts Maxis CDROM XA"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1670 ADPCM_DECODER(CODEC_ID_ADPCM_EA_R1, adpcm_ea_r1, "ADPCM Electronic Arts R1"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1671 ADPCM_DECODER(CODEC_ID_ADPCM_EA_R2, adpcm_ea_r2, "ADPCM Electronic Arts R2"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1672 ADPCM_DECODER(CODEC_ID_ADPCM_EA_R3, adpcm_ea_r3, "ADPCM Electronic Arts R3"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1673 ADPCM_DECODER(CODEC_ID_ADPCM_EA_XAS, adpcm_ea_xas, "ADPCM Electronic Arts XAS"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1674 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_AMV, adpcm_ima_amv, "ADPCM IMA AMV"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1675 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_DK3, adpcm_ima_dk3, "ADPCM IMA Duck DK3"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1676 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_DK4, adpcm_ima_dk4, "ADPCM IMA Duck DK4"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1677 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_EA_EACS, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1678 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_EA_SEAD, adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1679 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_ISS, adpcm_ima_iss, "ADPCM IMA Funcom ISS"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1680 ADPCM_CODEC (CODEC_ID_ADPCM_IMA_QT, adpcm_ima_qt, "ADPCM IMA QuickTime"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1681 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_SMJPEG, adpcm_ima_smjpeg, "ADPCM IMA Loki SDL MJPEG"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1682 ADPCM_CODEC (CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav, "ADPCM IMA WAV"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1683 ADPCM_DECODER(CODEC_ID_ADPCM_IMA_WS, adpcm_ima_ws, "ADPCM IMA Westwood"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1684 ADPCM_CODEC (CODEC_ID_ADPCM_MS, adpcm_ms, "ADPCM Microsoft"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1685 ADPCM_DECODER(CODEC_ID_ADPCM_SBPRO_2, adpcm_sbpro_2, "ADPCM Sound Blaster Pro 2-bit"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1686 ADPCM_DECODER(CODEC_ID_ADPCM_SBPRO_3, adpcm_sbpro_3, "ADPCM Sound Blaster Pro 2.6-bit"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1687 ADPCM_DECODER(CODEC_ID_ADPCM_SBPRO_4, adpcm_sbpro_4, "ADPCM Sound Blaster Pro 4-bit"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1688 ADPCM_CODEC (CODEC_ID_ADPCM_SWF, adpcm_swf, "ADPCM Shockwave Flash"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1689 ADPCM_DECODER(CODEC_ID_ADPCM_THP, adpcm_thp, "ADPCM Nintendo Gamecube THP"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1690 ADPCM_DECODER(CODEC_ID_ADPCM_XA, adpcm_xa, "ADPCM CDROM XA"); |
95b679f9de63
cosmetics: Reformat long_names so that "ADPCM" comes first.
diego
parents:
9083
diff
changeset
|
1691 ADPCM_CODEC (CODEC_ID_ADPCM_YAMAHA, adpcm_yamaha, "ADPCM Yamaha"); |