annotate adpcm.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents 2b75dff01118
children 9f17dd9b80c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
1 /*
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
2 * ADPCM codecs
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
3 * Copyright (c) 2001-2003 The ffmpeg Project
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
4 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
6 * 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
7 * License as published by the Free Software Foundation; either
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
9 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
11 * 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
12 * 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
13 * Lesser General Public License for more details.
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
14 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
18 */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
19 #include "avcodec.h"
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
20
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
21 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
22 * @file adpcm.c
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
23 * ADPCM codecs.
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
24 * 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
25 * 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
26 * by Mike Melanson (melanson@pcisys.net)
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
27 * CD-ROM XA ADPCM codec by BERO
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
28 * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
29 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
30 * Features and limitations:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
31 *
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
32 * Reference documents:
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
33 * 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
34 * 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
35 * http://openquicktime.sourceforge.net/plugins.htm
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
36 * 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
37 * 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
38 * SoX source code http://home.sprynet.com/~cbagwell/sox.html
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
39 *
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
40 * CD-ROM XA:
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
41 * http://ku-www.ss.titech.ac.jp/~yatsushi/xaadpcm.html
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
42 * vagpack & depack http://homepages.compuserve.de/bITmASTER32/psx-index.html
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
43 * 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
44 */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
45
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
46 #define BLKSIZE 1024
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
47
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
48 #define CLAMP_TO_SHORT(value) \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
49 if (value > 32767) \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
50 value = 32767; \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
51 else if (value < -32768) \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
52 value = -32768; \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
53
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
54 /* 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
55 /* This is the index table: */
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
56 static const int index_table[16] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
57 -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
58 -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
59 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
60
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
61 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1093
diff changeset
62 * 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
63 * this table, but such deviations are negligible:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
64 */
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
65 static const int step_table[89] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
66 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
67 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
68 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
69 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
70 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
71 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
72 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
73 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
74 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
75 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
76
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
77 /* These are for MS-ADPCM */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
78 /* 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
79 static const int AdaptationTable[] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
80 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
81 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
82 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
83
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
84 static const int AdaptCoeff1[] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
85 256, 512, 0, 192, 240, 460, 392
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
86 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
87
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
88 static const int AdaptCoeff2[] = {
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
89 0, -256, 0, 64, 0, -208, -232
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
90 };
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
91
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
92 /* These are for CD-ROM XA ADPCM */
1559
alex
parents: 1535
diff changeset
93 static const int xa_adpcm_table[5][2] = {
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
94 { 0, 0 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
95 { 60, 0 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
96 { 115, -52 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
97 { 98, -55 },
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
98 { 122, -60 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
99 };
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
100
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
101 static int ea_adpcm_table[] = {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
102 0, 240, 460, 392, 0, 0, -208, -220, 0, 1,
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
103 3, 4, 7, 8, 10, 11, 0, -1, -3, -4
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
104 };
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
105
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
106 static int ct_adpcm_table[8] = {
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
107 0x00E6, 0x00E6, 0x00E6, 0x00E6,
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
108 0x0133, 0x0199, 0x0200, 0x0266
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
109 };
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
110
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
111 /* end of tables */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
112
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
113 typedef struct ADPCMChannelStatus {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
114 int predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
115 short int step_index;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
116 int step;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
117 /* for encoding */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
118 int prev_sample;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
119
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
120 /* MS version */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
121 short sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
122 short sample2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
123 int coeff1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
124 int coeff2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
125 int idelta;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
126 } ADPCMChannelStatus;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
127
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
128 typedef struct ADPCMContext {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
129 int channel; /* for stereo MOVs, decode left, then decode right, then tell it's decoded */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
130 ADPCMChannelStatus status[2];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
131 short sample_buffer[32]; /* hold left samples while waiting for right samples */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
132 } ADPCMContext;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
133
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
134 /* XXX: implement encoding */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
135
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
136 #ifdef CONFIG_ENCODERS
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
137 static int adpcm_encode_init(AVCodecContext *avctx)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
138 {
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
139 if (avctx->channels > 2)
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
140 return -1; /* only stereo or mono =) */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
141 switch(avctx->codec->id) {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
142 case CODEC_ID_ADPCM_IMA_QT:
1611
d29e96720e21 comment fix
bellard
parents: 1598
diff changeset
143 av_log(avctx, AV_LOG_ERROR, "ADPCM: codec adpcm_ima_qt unsupported for encoding !\n");
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
144 avctx->frame_size = 64; /* XXX: can multiple of avctx->channels * 64 (left and right blocks are interleaved) */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
145 return -1;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
146 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
147 case CODEC_ID_ADPCM_IMA_WAV:
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
148 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
149 /* 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
150 avctx->block_align = BLKSIZE;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
151 /* 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
152 break;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
153 case CODEC_ID_ADPCM_MS:
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
154 avctx->frame_size = (BLKSIZE - 7 * avctx->channels) * 2 / avctx->channels + 2; /* each 16 bits sample gives one nibble */
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
155 /* and we have 7 bytes per channel overhead */
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
156 avctx->block_align = BLKSIZE;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
157 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
158 default:
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
159 return -1;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
160 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
161 }
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
162
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
163 avctx->coded_frame= avcodec_alloc_frame();
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
164 avctx->coded_frame->key_frame= 1;
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
165
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
166 return 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
167 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
168
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
169 static int adpcm_encode_close(AVCodecContext *avctx)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
170 {
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
171 av_freep(&avctx->coded_frame);
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 577
diff changeset
172
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
173 return 0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
174 }
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
175
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
176
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
177 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
178 {
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
179 int step_index;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
180 unsigned char nibble;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
181
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
182 int sign = 0; /* sign bit of the nibble (MSB) */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
183 int delta, predicted_delta;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
184
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
185 delta = sample - c->prev_sample;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
186
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
187 if (delta < 0) {
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
188 sign = 1;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
189 delta = -delta;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
190 }
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
191
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
192 step_index = c->step_index;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
193
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
194 /* nibble = 4 * delta / step_table[step_index]; */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
195 nibble = (delta << 2) / step_table[step_index];
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
196
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
197 if (nibble > 7)
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
198 nibble = 7;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
199
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
200 step_index += index_table[nibble];
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
201 if (step_index < 0)
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
202 step_index = 0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
203 if (step_index > 88)
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
204 step_index = 88;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
205
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
206 /* what the decoder will find */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
207 predicted_delta = ((step_table[step_index] * nibble) / 4) + (step_table[step_index] / 8);
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 if (sign)
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
210 c->prev_sample -= predicted_delta;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
211 else
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
212 c->prev_sample += predicted_delta;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
213
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
214 CLAMP_TO_SHORT(c->prev_sample);
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
215
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
216
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
217 nibble += sign << 3; /* sign * 8 */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
218
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
219 /* save back */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
220 c->step_index = step_index;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
221
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
222 return nibble;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
223 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
224
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
225 static inline unsigned char adpcm_ms_compress_sample(ADPCMChannelStatus *c, short sample)
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
226 {
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
227 int predictor, nibble, bias;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
228
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
229 predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 256;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
230
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
231 nibble= sample - predictor;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
232 if(nibble>=0) bias= c->idelta/2;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
233 else bias=-c->idelta/2;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
234
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
235 nibble= (nibble + bias) / c->idelta;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
236 nibble= clip(nibble, -8, 7)&0x0F;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
237
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
238 predictor += (signed)((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
239 CLAMP_TO_SHORT(predictor);
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
240
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
241 c->sample2 = c->sample1;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
242 c->sample1 = predictor;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
243
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
244 c->idelta = (AdaptationTable[(int)nibble] * c->idelta) >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
245 if (c->idelta < 16) c->idelta = 16;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
246
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
247 return nibble;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
248 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
249
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
250 static int adpcm_encode_frame(AVCodecContext *avctx,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
251 unsigned char *frame, int buf_size, void *data)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
252 {
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
253 int n, i, st;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
254 short *samples;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
255 unsigned char *dst;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
256 ADPCMContext *c = avctx->priv_data;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
257
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
258 dst = frame;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
259 samples = (short *)data;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
260 st= avctx->channels == 2;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
261 /* 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
262
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
263 switch(avctx->codec->id) {
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
264 case CODEC_ID_ADPCM_IMA_QT: /* XXX: can't test until we get .mov writer */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
265 break;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
266 case CODEC_ID_ADPCM_IMA_WAV:
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
267 n = avctx->frame_size / 8;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
268 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
269 /* c->status[0].step_index = 0; *//* XXX: not sure how to init the state machine */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
270 *dst++ = (c->status[0].prev_sample) & 0xFF; /* little endian */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
271 *dst++ = (c->status[0].prev_sample >> 8) & 0xFF;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
272 *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
273 *dst++ = 0; /* unknown */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
274 samples++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
275 if (avctx->channels == 2) {
1559
alex
parents: 1535
diff changeset
276 c->status[1].prev_sample = (signed short)samples[1];
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
277 /* c->status[1].step_index = 0; */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
278 *dst++ = (c->status[1].prev_sample) & 0xFF;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
279 *dst++ = (c->status[1].prev_sample >> 8) & 0xFF;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
280 *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
281 *dst++ = 0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
282 samples++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
283 }
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
284
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
285 /* stereo: 4 bytes (8 samples) for left, 4 bytes for right, 4 bytes left, ... */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
286 for (; n>0; n--) {
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
287 *dst = adpcm_ima_compress_sample(&c->status[0], samples[0]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
288 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
289 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
290 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 2]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
291 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 3]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
292 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
293 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 4]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
294 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 5]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
295 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
296 *dst = adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 6]) & 0x0F;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
297 *dst |= (adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels * 7]) << 4) & 0xF0;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
298 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
299 /* right channel */
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
300 if (avctx->channels == 2) {
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
301 *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
302 *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
303 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
304 *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
305 *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
306 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
307 *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
308 *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
309 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
310 *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
311 *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
312 dst++;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
313 }
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
314 samples += 8 * avctx->channels;
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
315 }
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
316 break;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
317 case CODEC_ID_ADPCM_MS:
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
318 for(i=0; i<avctx->channels; i++){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
319 int predictor=0;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
320
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
321 *dst++ = predictor;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
322 c->status[i].coeff1 = AdaptCoeff1[predictor];
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
323 c->status[i].coeff2 = AdaptCoeff2[predictor];
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
324 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
325 for(i=0; i<avctx->channels; i++){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
326 if (c->status[i].idelta < 16)
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
327 c->status[i].idelta = 16;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
328
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
329 *dst++ = c->status[i].idelta & 0xFF;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
330 *dst++ = c->status[i].idelta >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
331 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
332 for(i=0; i<avctx->channels; i++){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
333 c->status[i].sample1= *samples++;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
334
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
335 *dst++ = c->status[i].sample1 & 0xFF;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
336 *dst++ = c->status[i].sample1 >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
337 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
338 for(i=0; i<avctx->channels; i++){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
339 c->status[i].sample2= *samples++;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
340
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
341 *dst++ = c->status[i].sample2 & 0xFF;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
342 *dst++ = c->status[i].sample2 >> 8;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
343 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
344
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
345 for(i=7*avctx->channels; i<avctx->block_align; i++) {
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
346 int nibble;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
347 nibble = adpcm_ms_compress_sample(&c->status[ 0], *samples++)<<4;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
348 nibble|= adpcm_ms_compress_sample(&c->status[st], *samples++);
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
349 *dst++ = nibble;
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
350 }
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
351 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
352 default:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
353 return -1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
354 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
355 return dst - frame;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
356 }
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
357 #endif //CONFIG_ENCODERS
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
358
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
359 static int adpcm_decode_init(AVCodecContext * avctx)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
360 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
361 ADPCMContext *c = avctx->priv_data;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
362
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
363 c->channel = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
364 c->status[0].predictor = c->status[1].predictor = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
365 c->status[0].step_index = c->status[1].step_index = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
366 c->status[0].step = c->status[1].step = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
367
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
368 switch(avctx->codec->id) {
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
369 case CODEC_ID_ADPCM_CT:
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
370 c->status[0].step = c->status[1].step = 511;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
371 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
372 default:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
373 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
374 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
375 return 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
376 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
377
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
378 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
379 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
380 int step_index;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
381 int predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
382 int sign, delta, diff, step;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
383
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
384 step = step_table[c->step_index];
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
385 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
386 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
387 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
388
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
389 sign = nibble & 8;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
390 delta = nibble & 7;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
391 /* 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
392 * 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
393 * quickly enough */
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
394 diff = ((2 * delta + 1) * step) >> shift;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
395 predictor = c->predictor;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
396 if (sign) predictor -= diff;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
397 else predictor += diff;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
398
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
399 CLAMP_TO_SHORT(predictor);
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
400 c->predictor = predictor;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
401 c->step_index = step_index;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
402
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
403 return (short)predictor;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
404 }
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
405
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
406 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
407 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
408 int predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
409
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
410 predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 256;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
411 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
412 CLAMP_TO_SHORT(predictor);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
413
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
414 c->sample2 = c->sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
415 c->sample1 = predictor;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
416 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
417 if (c->idelta < 16) c->idelta = 16;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
418
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
419 return (short)predictor;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
420 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
421
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
422 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
423 {
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
424 int predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
425 int sign, delta, diff;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
426 int new_step;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
427
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
428 sign = nibble & 8;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
429 delta = nibble & 7;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
430 /* 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
431 * 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
432 * quickly enough */
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
433 diff = ((2 * delta + 1) * c->step) >> 3;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
434 predictor = c->predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
435 /* predictor update is not so trivial: predictor is multiplied on 254/256 before updating */
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
436 if(sign)
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
437 predictor = ((predictor * 254) >> 8) - diff;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
438 else
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
439 predictor = ((predictor * 254) >> 8) + diff;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
440 /* calculate new step and clamp it to range 511..32767 */
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
441 new_step = (ct_adpcm_table[nibble & 7] * c->step) >> 8;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
442 c->step = new_step;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
443 if(c->step < 511)
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
444 c->step = 511;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
445 if(c->step > 32767)
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
446 c->step = 32767;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
447
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
448 CLAMP_TO_SHORT(predictor);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
449 c->predictor = predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
450 return (short)predictor;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
451 }
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
452
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
453 static void xa_decode(short *out, const unsigned char *in,
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
454 ADPCMChannelStatus *left, ADPCMChannelStatus *right, int inc)
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
455 {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
456 int i, j;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
457 int shift,filter,f0,f1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
458 int s_1,s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
459 int d,s,t;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
460
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
461 for(i=0;i<4;i++) {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
462
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
463 shift = 12 - (in[4+i*2] & 15);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
464 filter = in[4+i*2] >> 4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
465 f0 = xa_adpcm_table[filter][0];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
466 f1 = xa_adpcm_table[filter][1];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
467
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
468 s_1 = left->sample1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
469 s_2 = left->sample2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
470
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
471 for(j=0;j<28;j++) {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
472 d = in[16+i+j*4];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
473
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
474 t = (signed char)(d<<4)>>4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
475 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
476 CLAMP_TO_SHORT(s);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
477 *out = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
478 out += inc;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
479 s_2 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
480 s_1 = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
481 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
482
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
483 if (inc==2) { /* stereo */
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
484 left->sample1 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
485 left->sample2 = s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
486 s_1 = right->sample1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
487 s_2 = right->sample2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
488 out = out + 1 - 28*2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
489 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
490
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
491 shift = 12 - (in[5+i*2] & 15);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
492 filter = in[5+i*2] >> 4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
493
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
494 f0 = xa_adpcm_table[filter][0];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
495 f1 = xa_adpcm_table[filter][1];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
496
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
497 for(j=0;j<28;j++) {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
498 d = in[16+i+j*4];
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
499
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
500 t = (signed char)d >> 4;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
501 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
502 CLAMP_TO_SHORT(s);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
503 *out = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
504 out += inc;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
505 s_2 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
506 s_1 = s;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
507 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
508
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
509 if (inc==2) { /* stereo */
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
510 right->sample1 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
511 right->sample2 = s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
512 out -= 1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
513 } else {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
514 left->sample1 = s_1;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
515 left->sample2 = s_2;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
516 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
517 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
518 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
519
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
520
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
521 /* DK3 ADPCM support macro */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
522 #define DK3_GET_NEXT_NIBBLE() \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
523 if (decode_top_nibble_next) \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
524 { \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
525 nibble = (last_byte >> 4) & 0x0F; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
526 decode_top_nibble_next = 0; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
527 } \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
528 else \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
529 { \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
530 last_byte = *src++; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
531 if (src >= buf + buf_size) break; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
532 nibble = last_byte & 0x0F; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
533 decode_top_nibble_next = 1; \
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
534 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
535
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
536 static int adpcm_decode_frame(AVCodecContext *avctx,
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
537 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 925
diff changeset
538 uint8_t *buf, int buf_size)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
539 {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
540 ADPCMContext *c = avctx->priv_data;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
541 ADPCMChannelStatus *cs;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
542 int n, m, channel, i;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
543 int block_predictor[2];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
544 short *samples;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 925
diff changeset
545 uint8_t *src;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
546 int st; /* stereo */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
547
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
548 /* DK3 ADPCM accounting variables */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
549 unsigned char last_byte = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
550 unsigned char nibble;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
551 int decode_top_nibble_next = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
552 int diff_channel;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
553
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
554 /* EA ADPCM state variables */
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
555 uint32_t samples_in_chunk;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
556 int32_t previous_left_sample, previous_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
557 int32_t current_left_sample, current_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
558 int32_t next_left_sample, next_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
559 int32_t coeff1l, coeff2l, coeff1r, coeff2r;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
560 uint8_t shift_left, shift_right;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
561 int count1, count2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
562
1768
45e99aa10395 handle 0-length buffers
melanson
parents: 1737
diff changeset
563 if (!buf_size)
45e99aa10395 handle 0-length buffers
melanson
parents: 1737
diff changeset
564 return 0;
45e99aa10395 handle 0-length buffers
melanson
parents: 1737
diff changeset
565
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
566 samples = data;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
567 src = buf;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
568
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
569 st = avctx->channels == 2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
570
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
571 switch(avctx->codec->id) {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
572 case CODEC_ID_ADPCM_IMA_QT:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
573 n = (buf_size - 2);/* >> 2*avctx->channels;*/
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
574 channel = c->channel;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
575 cs = &(c->status[channel]);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
576 /* (pppppp) (piiiiiii) */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
577
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
578 /* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
579 cs->predictor = (*src++) << 8;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
580 cs->predictor |= (*src & 0x80);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
581 cs->predictor &= 0xFF80;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
582
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
583 /* sign extension */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
584 if(cs->predictor & 0x8000)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
585 cs->predictor -= 0x10000;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
586
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
587 CLAMP_TO_SHORT(cs->predictor);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
588
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
589 cs->step_index = (*src++) & 0x7F;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
590
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1577
diff changeset
591 if (cs->step_index > 88) av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
592 if (cs->step_index > 88) cs->step_index = 88;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
593
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
594 cs->step = step_table[cs->step_index];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
595
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
596 if (st && channel)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
597 samples++;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
598
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
599 for(m=32; n>0 && m>0; n--, m--) { /* in QuickTime, IMA is encoded by chuncks of 34 bytes (=64 samples) */
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
600 *samples = adpcm_ima_expand_nibble(cs, src[0] & 0x0F, 3);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
601 samples += avctx->channels;
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
602 *samples = adpcm_ima_expand_nibble(cs, (src[0] >> 4) & 0x0F, 3);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
603 samples += avctx->channels;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
604 src ++;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
605 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
606
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
607 if(st) { /* handle stereo interlacing */
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
608 c->channel = (channel + 1) % 2; /* we get one packet for left, then one for right data */
1695
2d11403fde4e initial predictors are not sent to the output in QT IMA; fix stereo QT
melanson
parents: 1611
diff changeset
609 if(channel == 1) { /* wait for the other packet before outputing anything */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
610 return src - buf;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
611 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
612 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
613 break;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
614 case CODEC_ID_ADPCM_IMA_WAV:
1576
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
615 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
616 buf_size = avctx->block_align;
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
617
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
618 for(i=0; i<avctx->channels; i++){
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
619 cs = &(c->status[i]);
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
620 cs->predictor = *src++;
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
621 cs->predictor |= (*src++) << 8;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
622 if(cs->predictor & 0x8000)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
623 cs->predictor -= 0x10000;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
624 CLAMP_TO_SHORT(cs->predictor);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
625
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
626 // XXX: is this correct ??: *samples++ = cs->predictor;
577
babaca0899f1 adpcm encoding patch by Franois Revol <revol at free dot fr>
michaelni
parents: 573
diff changeset
627
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
628 cs->step_index = *src++;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
629 if (cs->step_index < 0) cs->step_index = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
630 if (cs->step_index > 88) cs->step_index = 88;
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
631 if (*src++) av_log(avctx, AV_LOG_ERROR, "unused byte should be null !!\n"); /* unused */
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
632 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
633
1093
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
634 for(m=4; src < (buf + buf_size);) {
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
635 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[0] & 0x0F, 3);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
636 if (st)
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
637 *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[4] & 0x0F, 3);
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
638 *samples++ = adpcm_ima_expand_nibble(&c->status[0], (src[0] >> 4) & 0x0F, 3);
1093
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
639 if (st) {
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
640 *samples++ = adpcm_ima_expand_nibble(&c->status[1], (src[4] >> 4) & 0x0F, 3);
1093
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
641 if (!--m) {
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
642 m=4;
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
643 src+=4;
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
644 }
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
645 }
b6442efcdd27 * minor optimalization
kabi
parents: 1081
diff changeset
646 src++;
1081
18157900b434 * fixed IMA WAV decoding (though still might not be fully correct)
kabi
parents: 1064
diff changeset
647 }
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
648 break;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
649 case CODEC_ID_ADPCM_4XM:
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
650 cs = &(c->status[0]);
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
651 c->status[0].predictor= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
652 if(st){
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
653 c->status[1].predictor= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
654 }
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
655 c->status[0].step_index= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
656 if(st){
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
657 c->status[1].step_index= (int16_t)(src[0] + (src[1]<<8)); src+=2;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
658 }
1695
2d11403fde4e initial predictors are not sent to the output in QT IMA; fix stereo QT
melanson
parents: 1611
diff changeset
659 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
660 if (cs->step_index > 88) cs->step_index = 88;
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
661
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
662 m= (buf_size - (src - buf))>>st;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
663 for(i=0; i<m; i++) {
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
664 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[i] & 0x0F, 4);
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
665 if (st)
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
666 *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[i+m] & 0x0F, 4);
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
667 *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[i] >> 4, 4);
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
668 if (st)
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
669 *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[i+m] >> 4, 4);
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
670 }
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
671
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
672 src += m<<st;
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
673
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
674 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
675 case CODEC_ID_ADPCM_MS:
1576
bc4b13ca74de block algn patch by ("Assaf Yaari" <assafy at mobixell dot com>)
michael
parents: 1559
diff changeset
676 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
677 buf_size = avctx->block_align;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
678 n = buf_size - 7 * avctx->channels;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
679 if (n < 0)
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
680 return -1;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
681 block_predictor[0] = clip(*src++, 0, 7);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
682 block_predictor[1] = 0;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
683 if (st)
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
684 block_predictor[1] = clip(*src++, 0, 7);
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
685 c->status[0].idelta = (int16_t)((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
686 src+=2;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
687 if (st){
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
688 c->status[1].idelta = (int16_t)((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
689 src+=2;
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
690 }
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
691 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
692 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
693 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
694 c->status[1].coeff2 = AdaptCoeff2[block_predictor[1]];
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
695
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
696 c->status[0].sample1 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
697 src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
698 if (st) c->status[1].sample1 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
699 if (st) src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
700 c->status[0].sample2 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
701 src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
702 if (st) c->status[1].sample2 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
703 if (st) src+=2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
704
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
705 *samples++ = c->status[0].sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
706 if (st) *samples++ = c->status[1].sample1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
707 *samples++ = c->status[0].sample2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
708 if (st) *samples++ = c->status[1].sample2;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
709 for(;n>0;n--) {
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
710 *samples++ = adpcm_ms_expand_nibble(&c->status[0], (src[0] >> 4) & 0x0F);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
711 *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
712 src ++;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
713 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
714 break;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
715 case CODEC_ID_ADPCM_IMA_DK4:
1577
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
716 if (avctx->block_align != 0 && buf_size > avctx->block_align)
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
717 buf_size = avctx->block_align;
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
718
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
719 c->status[0].predictor = (int16_t)(src[0] | (src[1] << 8));
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
720 c->status[0].step_index = src[2];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
721 src += 4;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
722 *samples++ = c->status[0].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
723 if (st) {
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
724 c->status[1].predictor = (int16_t)(src[0] | (src[1] << 8));
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
725 c->status[1].step_index = src[2];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
726 src += 4;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
727 *samples++ = c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
728 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
729 while (src < buf + buf_size) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
730
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
731 /* take care of the top nibble (always left or mono channel) */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
732 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
733 (src[0] >> 4) & 0x0F, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
734
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
735 /* 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
736 * stereo, or another mono sample */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
737 if (st)
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
738 *samples++ = adpcm_ima_expand_nibble(&c->status[1],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
739 src[0] & 0x0F, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
740 else
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
741 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
742 src[0] & 0x0F, 3);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
743
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
744 src++;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
745 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
746 break;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
747 case CODEC_ID_ADPCM_IMA_DK3:
1577
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
748 if (avctx->block_align != 0 && buf_size > avctx->block_align)
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
749 buf_size = avctx->block_align;
dbd0ede6623d fixing the remaning block-align checks
michael
parents: 1576
diff changeset
750
1794
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
751 c->status[0].predictor = (int16_t)(src[10] | (src[11] << 8));
d133b4ad0620 M$ ADPCM encoding & some simplifications
michael
parents: 1779
diff changeset
752 c->status[1].predictor = (int16_t)(src[12] | (src[13] << 8));
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
753 c->status[0].step_index = src[14];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
754 c->status[1].step_index = src[15];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
755 /* sign extend the predictors */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
756 src += 16;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
757 diff_channel = c->status[1].predictor;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
758
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
759 /* 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
760 * the buffer is consumed */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
761 while (1) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
762
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
763 /* 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
764 * c->status[1] is the diff channel */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
765
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
766 /* 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
767 DK3_GET_NEXT_NIBBLE();
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
768 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
769
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
770 /* process the diff channel predictor */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
771 DK3_GET_NEXT_NIBBLE();
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
772 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
773
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
774 /* 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
775 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
776 *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
777 *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
778
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
779 /* 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
780 DK3_GET_NEXT_NIBBLE();
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
781 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
782
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
783 /* 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
784 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
785 *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
786 *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
787 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
788 break;
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
789 case CODEC_ID_ADPCM_IMA_WS:
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
790 /* 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
791 while (src < buf + buf_size) {
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
792
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
793 if (st) {
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
794 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
795 (src[0] >> 4) & 0x0F, 3);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
796 *samples++ = adpcm_ima_expand_nibble(&c->status[1],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
797 src[0] & 0x0F, 3);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
798 } else {
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
799 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
800 (src[0] >> 4) & 0x0F, 3);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
801 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
1737
d39bb6945761 cleanup
michael
parents: 1695
diff changeset
802 src[0] & 0x0F, 3);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
803 }
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
804
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
805 src++;
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
806 }
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
807 break;
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
808 case CODEC_ID_ADPCM_XA:
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
809 c->status[0].sample1 = c->status[0].sample2 =
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
810 c->status[1].sample1 = c->status[1].sample2 = 0;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
811 while (buf_size >= 128) {
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
812 xa_decode(samples, src, &c->status[0], &c->status[1],
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
813 avctx->channels);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
814 src += 128;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
815 samples += 28 * 8;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
816 buf_size -= 128;
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
817 }
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
818 break;
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
819 case CODEC_ID_ADPCM_EA:
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
820 samples_in_chunk = LE_32(src);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
821 if (samples_in_chunk >= ((buf_size - 12) * 2)) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
822 src += buf_size;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
823 break;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
824 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
825 src += 4;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
826 current_left_sample = (int16_t)LE_16(src);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
827 src += 2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
828 previous_left_sample = (int16_t)LE_16(src);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
829 src += 2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
830 current_right_sample = (int16_t)LE_16(src);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
831 src += 2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
832 previous_right_sample = (int16_t)LE_16(src);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
833 src += 2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
834
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
835 for (count1 = 0; count1 < samples_in_chunk/28;count1++) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
836 coeff1l = ea_adpcm_table[(*src >> 4) & 0x0F];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
837 coeff2l = ea_adpcm_table[((*src >> 4) & 0x0F) + 4];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
838 coeff1r = ea_adpcm_table[*src & 0x0F];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
839 coeff2r = ea_adpcm_table[(*src & 0x0F) + 4];
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
840 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
841
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
842 shift_left = ((*src >> 4) & 0x0F) + 8;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
843 shift_right = (*src & 0x0F) + 8;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
844 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
845
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
846 for (count2 = 0; count2 < 28; count2++) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
847 next_left_sample = (((*src & 0xF0) << 24) >> shift_left);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
848 next_right_sample = (((*src & 0x0F) << 28) >> shift_right);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
849 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
850
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
851 next_left_sample = (next_left_sample +
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
852 (current_left_sample * coeff1l) +
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
853 (previous_left_sample * coeff2l) + 0x80) >> 8;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
854 next_right_sample = (next_right_sample +
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
855 (current_right_sample * coeff1r) +
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
856 (previous_right_sample * coeff2r) + 0x80) >> 8;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
857 CLAMP_TO_SHORT(next_left_sample);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
858 CLAMP_TO_SHORT(next_right_sample);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
859
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
860 previous_left_sample = current_left_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
861 current_left_sample = next_left_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
862 previous_right_sample = current_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
863 current_right_sample = next_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
864 *samples++ = (unsigned short)current_left_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
865 *samples++ = (unsigned short)current_right_sample;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
866 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
867 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
868 break;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
869 case CODEC_ID_ADPCM_IMA_SMJPEG:
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
870 c->status[0].predictor = *src;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
871 src += 2;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
872 c->status[0].step_index = *src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
873 src++; /* skip another byte before getting to the meat */
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
874 while (src < buf + buf_size) {
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
875 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
876 *src & 0x0F, 3);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
877 *samples++ = adpcm_ima_expand_nibble(&c->status[0],
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
878 (*src >> 4) & 0x0F, 3);
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
879 src++;
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
880 }
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
881 break;
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
882 case CODEC_ID_ADPCM_CT:
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
883 while (src < buf + buf_size) {
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
884 if (st) {
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
885 *samples++ = adpcm_ct_expand_nibble(&c->status[0],
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
886 (src[0] >> 4) & 0x0F);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
887 *samples++ = adpcm_ct_expand_nibble(&c->status[1],
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
888 src[0] & 0x0F);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
889 } else {
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
890 *samples++ = adpcm_ct_expand_nibble(&c->status[0],
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
891 (src[0] >> 4) & 0x0F);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
892 *samples++ = adpcm_ct_expand_nibble(&c->status[0],
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
893 src[0] & 0x0F);
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
894 }
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
895 src++;
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
896 }
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
897 break;
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
898 default:
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
899 return -1;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
900 }
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 925
diff changeset
901 *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
902 return src - buf;
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
903 }
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
904
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
905
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
906
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
907 #ifdef CONFIG_ENCODERS
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
908 #define ADPCM_ENCODER(id,name) \
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
909 AVCodec name ## _encoder = { \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
910 #name, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
911 CODEC_TYPE_AUDIO, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
912 id, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
913 sizeof(ADPCMContext), \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
914 adpcm_encode_init, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
915 adpcm_encode_frame, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
916 adpcm_encode_close, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
917 NULL, \
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
918 };
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
919 #else
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
920 #define ADPCM_ENCODER(id,name)
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
921 #endif
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
922
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
923 #ifdef CONFIG_DECODERS
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
924 #define ADPCM_DECODER(id,name) \
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
925 AVCodec name ## _decoder = { \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
926 #name, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
927 CODEC_TYPE_AUDIO, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
928 id, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
929 sizeof(ADPCMContext), \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
930 adpcm_decode_init, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
931 NULL, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
932 NULL, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
933 adpcm_decode_frame, \
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
934 };
1530
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
935 #else
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
936 #define ADPCM_DECODER(id,name)
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
937 #endif
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
938
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
939 #define ADPCM_CODEC(id, name) \
3b31998fe22f disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 1491
diff changeset
940 ADPCM_ENCODER(id,name) ADPCM_DECODER(id,name)
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
941
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
942 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_QT, adpcm_ima_qt);
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
943 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
944 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_DK3, adpcm_ima_dk3);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1296
diff changeset
945 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_DK4, adpcm_ima_dk4);
1491
222643544cf1 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 1443
diff changeset
946 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_WS, adpcm_ima_ws);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
947 ADPCM_CODEC(CODEC_ID_ADPCM_IMA_SMJPEG, adpcm_ima_smjpeg);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
948 ADPCM_CODEC(CODEC_ID_ADPCM_MS, adpcm_ms);
1296
eff1dc4bed49 4xm adpcm
michaelni
parents: 1106
diff changeset
949 ADPCM_CODEC(CODEC_ID_ADPCM_4XM, adpcm_4xm);
1535
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
950 ADPCM_CODEC(CODEC_ID_ADPCM_XA, adpcm_xa);
bcb30ec7e86f activate the XA and ADX ADPCM codecs
melanson
parents: 1530
diff changeset
951 ADPCM_CODEC(CODEC_ID_ADPCM_ADX, adpcm_adx);
1779
9848ca4ad861 added support for EA ADPCM and SMJPEG IMA ADPCM
melanson
parents: 1768
diff changeset
952 ADPCM_CODEC(CODEC_ID_ADPCM_EA, adpcm_ea);
2296
2b75dff01118 Creative ADPCM decoder, format 0x200, courtesy of Konstantin Shishkov
melanson
parents: 2028
diff changeset
953 ADPCM_CODEC(CODEC_ID_ADPCM_CT, adpcm_ct);
573
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
954
b0f52172f4c5 beos/mov/adpcm patch by Franois Revol <revol at free dot fr>
michaelni
parents:
diff changeset
955 #undef ADPCM_CODEC