annotate dpcm.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 c443a6af19a7
children ef2149182f1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
1 /*
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
2 * Assorted DPCM codecs
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
3 * Copyright (c) 2003 The ffmpeg Project.
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
4 *
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
9 *
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
13 * Lesser General Public License for more details.
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
14 *
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
18 */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
19
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
20 /**
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
21 * @file: dpcm.c
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
22 * Assorted DPCM (differential pulse code modulation) audio codecs
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
23 * by Mike Melanson (melanson@pcisys.net)
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
24 * Xan DPCM decoder by Mario Brito (mbrito@student.dei.uc.pt)
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
25 * for more information on the specific data formats, visit:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
26 * http://www.pcisys.net/~melanson/codecs/simpleaudio.html
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
27 * SOL DPCMs implemented by Konstantin Shishkov
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
28 *
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
29 * Note about using the Xan DPCM decoder: Xan DPCM is used in AVI files
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
30 * found in the Wing Commander IV computer game. These AVI files contain
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
31 * WAVEFORMAT headers which report the audio format as 0x01: raw PCM.
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
32 * Clearly incorrect. To detect Xan DPCM, you will probably have to
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
33 * special-case your AVI demuxer to use Xan DPCM if the file uses 'Xxan'
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
34 * (Xan video) for its video codec. Alternately, such AVI files also contain
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
35 * the fourcc 'Axan' in the 'auds' chunk of the AVI header.
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
36 */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
37
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
38 #include "avcodec.h"
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
39
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
40 typedef struct DPCMContext {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
41 int channels;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
42 short roq_square_array[256];
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
43 long sample[2];//for SOL_DPCM
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
44 int *sol_table;//for SOL_DPCM
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
45 } DPCMContext;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
46
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
47 #define SATURATE_S16(x) if (x < -32768) x = -32768; \
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
48 else if (x > 32767) x = 32767;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
49 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
50
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
51 static int interplay_delta_table[] = {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
52 0, 1, 2, 3, 4, 5, 6, 7,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
53 8, 9, 10, 11, 12, 13, 14, 15,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
54 16, 17, 18, 19, 20, 21, 22, 23,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
55 24, 25, 26, 27, 28, 29, 30, 31,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
56 32, 33, 34, 35, 36, 37, 38, 39,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
57 40, 41, 42, 43, 47, 51, 56, 61,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
58 66, 72, 79, 86, 94, 102, 112, 122,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
59 133, 145, 158, 173, 189, 206, 225, 245,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
60 267, 292, 318, 348, 379, 414, 452, 493,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
61 538, 587, 640, 699, 763, 832, 908, 991,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
62 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
63 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
64 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
65 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
66 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
67 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
68 1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
69 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
70 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
71 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
72 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
73 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
74 -1081, -991, -908, -832, -763, -699, -640, -587,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
75 -538, -493, -452, -414, -379, -348, -318, -292,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
76 -267, -245, -225, -206, -189, -173, -158, -145,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
77 -133, -122, -112, -102, -94, -86, -79, -72,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
78 -66, -61, -56, -51, -47, -43, -42, -41,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
79 -40, -39, -38, -37, -36, -35, -34, -33,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
80 -32, -31, -30, -29, -28, -27, -26, -25,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
81 -24, -23, -22, -21, -20, -19, -18, -17,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
82 -16, -15, -14, -13, -12, -11, -10, -9,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
83 -8, -7, -6, -5, -4, -3, -2, -1
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
84
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
85 };
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
86
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
87 static int sol_table_old[16] =
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
88 { 0x0, 0x1, 0x2 , 0x3, 0x6, 0xA, 0xF, 0x15,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
89 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0};
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
90
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
91 static int sol_table_new[16] =
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
92 { 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
93 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15};
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
94
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
95 static int sol_table_16[128] = {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
96 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
97 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
98 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
99 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
100 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
101 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
102 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
103 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
104 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
105 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
106 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
107 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
108 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
109 };
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
110
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
111
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
112
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
113 static int dpcm_decode_init(AVCodecContext *avctx)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
114 {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
115 DPCMContext *s = avctx->priv_data;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
116 int i;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
117 short square;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
118
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
119 s->channels = avctx->channels;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
120 s->sample[0] = s->sample[1] = 0;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
121
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
122 switch(avctx->codec->id) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
123
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
124 case CODEC_ID_ROQ_DPCM:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
125 /* initialize square table */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
126 for (i = 0; i < 128; i++) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
127 square = i * i;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
128 s->roq_square_array[i] = square;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
129 s->roq_square_array[i + 128] = -square;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
130 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
131 break;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
132
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
133
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
134 case CODEC_ID_SOL_DPCM:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
135 switch(avctx->codec_tag){
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
136 case 1:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
137 s->sol_table=sol_table_old;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
138 s->sample[0] = s->sample[1] = 0x80;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
139 break;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
140 case 2:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
141 s->sol_table=sol_table_new;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
142 s->sample[0] = s->sample[1] = 0x80;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
143 break;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
144 case 3:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
145 s->sol_table=sol_table_16;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
146 break;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
147 default:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
148 av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
149 return -1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
150 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
151 break;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
152
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
153 default:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
154 break;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
155 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
156
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
157 return 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
158 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
159
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
160 static int dpcm_decode_frame(AVCodecContext *avctx,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
161 void *data, int *data_size,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
162 uint8_t *buf, int buf_size)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
163 {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
164 DPCMContext *s = avctx->priv_data;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
165 int in, out = 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
166 int predictor[2];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
167 int channel_number = 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
168 short *output_samples = data;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
169 int shift[2];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
170 unsigned char byte;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
171 short diff;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
172
1767
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
173 if (!buf_size)
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
174 return 0;
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
175
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
176 switch(avctx->codec->id) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
177
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
178 case CODEC_ID_ROQ_DPCM:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
179 if (s->channels == 1)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
180 predictor[0] = LE_16(&buf[6]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
181 else {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
182 predictor[0] = buf[7] << 8;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
183 predictor[1] = buf[6] << 8;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
184 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
185 SE_16BIT(predictor[0]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
186 SE_16BIT(predictor[1]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
187
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
188 /* decode the samples */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
189 for (in = 8, out = 0; in < buf_size; in++, out++) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
190 predictor[channel_number] += s->roq_square_array[buf[in]];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
191 SATURATE_S16(predictor[channel_number]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
192 output_samples[out] = predictor[channel_number];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
193
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
194 /* toggle channel */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
195 channel_number ^= s->channels - 1;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
196 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
197 break;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
198
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
199 case CODEC_ID_INTERPLAY_DPCM:
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
200 in = 6; /* skip over the stream mask and stream length */
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
201 predictor[0] = LE_16(&buf[in]);
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
202 in += 2;
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
203 SE_16BIT(predictor[0])
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
204 output_samples[out++] = predictor[0];
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
205 if (s->channels == 2) {
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
206 predictor[1] = LE_16(&buf[in]);
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
207 in += 2;
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
208 SE_16BIT(predictor[1])
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
209 output_samples[out++] = predictor[1];
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
210 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
211
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
212 while (in < buf_size) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
213 predictor[channel_number] += interplay_delta_table[buf[in++]];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
214 SATURATE_S16(predictor[channel_number]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
215 output_samples[out++] = predictor[channel_number];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
216
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
217 /* toggle channel */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
218 channel_number ^= s->channels - 1;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
219 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
220
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
221 break;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
222
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
223 case CODEC_ID_XAN_DPCM:
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
224 in = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
225 shift[0] = shift[1] = 4;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
226 predictor[0] = LE_16(&buf[in]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
227 in += 2;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
228 SE_16BIT(predictor[0]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
229 if (s->channels == 2) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
230 predictor[1] = LE_16(&buf[in]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
231 in += 2;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
232 SE_16BIT(predictor[1]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
233 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
234
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
235 while (in < buf_size) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
236 byte = buf[in++];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
237 diff = (byte & 0xFC) << 8;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
238 if ((byte & 0x03) == 3)
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
239 shift[channel_number]++;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
240 else
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
241 shift[channel_number] -= (2 * (byte & 3));
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
242 /* saturate the shifter to a lower limit of 0 */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
243 if (shift[channel_number] < 0)
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
244 shift[channel_number] = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
245
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
246 diff >>= shift[channel_number];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
247 predictor[channel_number] += diff;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
248
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
249 SATURATE_S16(predictor[channel_number]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
250 output_samples[out++] = predictor[channel_number];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
251
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
252 /* toggle channel */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
253 channel_number ^= s->channels - 1;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
254 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
255 break;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
256 case CODEC_ID_SOL_DPCM:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
257 in = 0;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
258 if (avctx->codec_tag != 3) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
259 while (in < buf_size) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
260 int n1, n2;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
261 n1 = (buf[in] >> 4) & 0xF;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
262 n2 = buf[in++] & 0xF;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
263 s->sample[0] += s->sol_table[n1];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
264 if (s->sample[0] < 0) s->sample[0] = 0;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
265 if (s->sample[0] > 255) s->sample[0] = 255;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
266 output_samples[out++] = (s->sample[0] - 128) << 8;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
267 s->sample[s->channels - 1] += s->sol_table[n2];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
268 if (s->sample[s->channels - 1] < 0) s->sample[s->channels - 1] = 0;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
269 if (s->sample[s->channels - 1] > 255) s->sample[s->channels - 1] = 255;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
270 output_samples[out++] = (s->sample[s->channels - 1] - 128) << 8;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
271 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
272 } else {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
273 while (in < buf_size) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
274 int n;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
275 n = buf[in++];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
276 if (n & 0x80) s->sample[channel_number] -= s->sol_table[n & 0x7F];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
277 else s->sample[channel_number] += s->sol_table[n & 0x7F];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
278 SATURATE_S16(s->sample[channel_number]);
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
279 output_samples[out++] = s->sample[channel_number];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
280 /* toggle channel */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
281 channel_number ^= s->channels - 1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
282 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
283 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
284 break;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
285 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
286
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
287 *data_size = out * sizeof(short);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
288 return buf_size;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
289 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
290
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
291 AVCodec roq_dpcm_decoder = {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
292 "roq_dpcm",
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
293 CODEC_TYPE_AUDIO,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
294 CODEC_ID_ROQ_DPCM,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
295 sizeof(DPCMContext),
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
296 dpcm_decode_init,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
297 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
298 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
299 dpcm_decode_frame,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
300 };
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
301
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
302 AVCodec interplay_dpcm_decoder = {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
303 "interplay_dpcm",
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
304 CODEC_TYPE_AUDIO,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
305 CODEC_ID_INTERPLAY_DPCM,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
306 sizeof(DPCMContext),
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
307 dpcm_decode_init,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
308 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
309 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
310 dpcm_decode_frame,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
311 };
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
312
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
313 AVCodec xan_dpcm_decoder = {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
314 "xan_dpcm",
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
315 CODEC_TYPE_AUDIO,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
316 CODEC_ID_XAN_DPCM,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
317 sizeof(DPCMContext),
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
318 dpcm_decode_init,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
319 NULL,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
320 NULL,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
321 dpcm_decode_frame,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
322 };
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
323
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
324 AVCodec sol_dpcm_decoder = {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
325 "sol_dpcm",
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
326 CODEC_TYPE_AUDIO,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
327 CODEC_ID_SOL_DPCM,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
328 sizeof(DPCMContext),
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
329 dpcm_decode_init,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
330 NULL,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
331 NULL,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
332 dpcm_decode_frame,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
333 };