annotate dpcm.c @ 4630:1416371d4a6c libavcodec

add avcodec_get_context_defaults2() / avcodec_alloc_context2() which take CodecType as an additional parameter also mark them as NOT part of the public API yet, so we can change their argument to CodecID if we decide to do so
author michael
date Wed, 07 Mar 2007 09:29:44 +0000
parents 05e932ddaaa9
children c2ab2ac31edb
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 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3420
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3420
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3420
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
8 * 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
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3420
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3420
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
13 * 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
14 * 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
15 * Lesser General Public License for more details.
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
16 *
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3420
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2967
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1439
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
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
22 /**
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
23 * @file: dpcm.c
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
24 * Assorted DPCM (differential pulse code modulation) audio codecs
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
25 * by Mike Melanson (melanson@pcisys.net)
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
26 * 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
27 * for more information on the specific data formats, visit:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
28 * 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
29 * SOL DPCMs implemented by Konstantin Shishkov
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
30 *
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
31 * 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
32 * 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
33 * 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
34 * 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
35 * 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
36 * (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
37 * 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
38 */
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 #include "avcodec.h"
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
41
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
42 typedef struct DPCMContext {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
43 int channels;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
44 short roq_square_array[256];
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
45 long sample[2];//for SOL_DPCM
3420
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
46 const int *sol_table;//for SOL_DPCM
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
47 } DPCMContext;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
48
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
49 #define SATURATE_S16(x) if (x < -32768) x = -32768; \
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
50 else if (x > 32767) x = 32767;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
51 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
52
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
53 static int interplay_delta_table[] = {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
54 0, 1, 2, 3, 4, 5, 6, 7,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
55 8, 9, 10, 11, 12, 13, 14, 15,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
56 16, 17, 18, 19, 20, 21, 22, 23,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
57 24, 25, 26, 27, 28, 29, 30, 31,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
58 32, 33, 34, 35, 36, 37, 38, 39,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
59 40, 41, 42, 43, 47, 51, 56, 61,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
60 66, 72, 79, 86, 94, 102, 112, 122,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
61 133, 145, 158, 173, 189, 206, 225, 245,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
62 267, 292, 318, 348, 379, 414, 452, 493,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
63 538, 587, 640, 699, 763, 832, 908, 991,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
64 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
65 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
66 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
67 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
68 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
69 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
70 1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
71 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
72 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
73 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
74 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
75 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
76 -1081, -991, -908, -832, -763, -699, -640, -587,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
77 -538, -493, -452, -414, -379, -348, -318, -292,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
78 -267, -245, -225, -206, -189, -173, -158, -145,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
79 -133, -122, -112, -102, -94, -86, -79, -72,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
80 -66, -61, -56, -51, -47, -43, -42, -41,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
81 -40, -39, -38, -37, -36, -35, -34, -33,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
82 -32, -31, -30, -29, -28, -27, -26, -25,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
83 -24, -23, -22, -21, -20, -19, -18, -17,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
84 -16, -15, -14, -13, -12, -11, -10, -9,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
85 -8, -7, -6, -5, -4, -3, -2, -1
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
86
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
87 };
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
88
3420
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
89 static const int sol_table_old[16] =
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
90 { 0x0, 0x1, 0x2 , 0x3, 0x6, 0xA, 0xF, 0x15,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
91 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0};
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
92
3420
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
93 static const int sol_table_new[16] =
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
94 { 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
95 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15};
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2275
diff changeset
96
3420
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
97 static const int sol_table_16[128] = {
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
98 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
99 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
100 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
101 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
102 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
103 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
104 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
105 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
106 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
107 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
108 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
109 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
110 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
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
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
113
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
114
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
115 static int dpcm_decode_init(AVCodecContext *avctx)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
116 {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
117 DPCMContext *s = avctx->priv_data;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
118 int i;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
119 short square;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
120
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
121 s->channels = avctx->channels;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
122 s->sample[0] = s->sample[1] = 0;
1439
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 switch(avctx->codec->id) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
125
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
126 case CODEC_ID_ROQ_DPCM:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
127 /* initialize square table */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
128 for (i = 0; i < 128; i++) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
129 square = i * i;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
130 s->roq_square_array[i] = square;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
131 s->roq_square_array[i + 128] = -square;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
132 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
133 break;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
134
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2275
diff changeset
135
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
136 case CODEC_ID_SOL_DPCM:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
137 switch(avctx->codec_tag){
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
138 case 1:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
139 s->sol_table=sol_table_old;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
140 s->sample[0] = s->sample[1] = 0x80;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
141 break;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
142 case 2:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
143 s->sol_table=sol_table_new;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
144 s->sample[0] = s->sample[1] = 0x80;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
145 break;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
146 case 3:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
147 s->sol_table=sol_table_16;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
148 break;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
149 default:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
150 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
151 return -1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
152 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
153 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2275
diff changeset
154
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
155 default:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
156 break;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
157 }
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 return 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
160 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
161
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
162 static int dpcm_decode_frame(AVCodecContext *avctx,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
163 void *data, int *data_size,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
164 uint8_t *buf, int buf_size)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
165 {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
166 DPCMContext *s = avctx->priv_data;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
167 int in, out = 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
168 int predictor[2];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
169 int channel_number = 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
170 short *output_samples = data;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
171 int shift[2];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
172 unsigned char byte;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
173 short diff;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
174
1767
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
175 if (!buf_size)
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
176 return 0;
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
177
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
178 switch(avctx->codec->id) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
179
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
180 case CODEC_ID_ROQ_DPCM:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
181 if (s->channels == 1)
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
182 predictor[0] = AV_RL16(&buf[6]);
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
183 else {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
184 predictor[0] = buf[7] << 8;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
185 predictor[1] = buf[6] << 8;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
186 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
187 SE_16BIT(predictor[0]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
188 SE_16BIT(predictor[1]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
189
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
190 /* decode the samples */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
191 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
192 predictor[channel_number] += s->roq_square_array[buf[in]];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
193 SATURATE_S16(predictor[channel_number]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
194 output_samples[out] = predictor[channel_number];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
195
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
196 /* toggle channel */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
197 channel_number ^= s->channels - 1;
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 break;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
200
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
201 case CODEC_ID_INTERPLAY_DPCM:
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
202 in = 6; /* skip over the stream mask and stream length */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
203 predictor[0] = AV_RL16(&buf[in]);
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
204 in += 2;
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
205 SE_16BIT(predictor[0])
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
206 output_samples[out++] = predictor[0];
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
207 if (s->channels == 2) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
208 predictor[1] = AV_RL16(&buf[in]);
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
209 in += 2;
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
210 SE_16BIT(predictor[1])
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
211 output_samples[out++] = predictor[1];
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
212 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
213
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
214 while (in < buf_size) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
215 predictor[channel_number] += interplay_delta_table[buf[in++]];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
216 SATURATE_S16(predictor[channel_number]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
217 output_samples[out++] = predictor[channel_number];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
218
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
219 /* toggle channel */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
220 channel_number ^= s->channels - 1;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
221 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
222
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
223 break;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
224
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
225 case CODEC_ID_XAN_DPCM:
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
226 in = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
227 shift[0] = shift[1] = 4;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
228 predictor[0] = AV_RL16(&buf[in]);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
229 in += 2;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
230 SE_16BIT(predictor[0]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
231 if (s->channels == 2) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
232 predictor[1] = AV_RL16(&buf[in]);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
233 in += 2;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
234 SE_16BIT(predictor[1]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
235 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
236
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
237 while (in < buf_size) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
238 byte = buf[in++];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
239 diff = (byte & 0xFC) << 8;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
240 if ((byte & 0x03) == 3)
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
241 shift[channel_number]++;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
242 else
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
243 shift[channel_number] -= (2 * (byte & 3));
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
244 /* 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
245 if (shift[channel_number] < 0)
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
246 shift[channel_number] = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
247
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
248 diff >>= shift[channel_number];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
249 predictor[channel_number] += diff;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
250
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
251 SATURATE_S16(predictor[channel_number]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
252 output_samples[out++] = predictor[channel_number];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
253
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
254 /* toggle channel */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
255 channel_number ^= s->channels - 1;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
256 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
257 break;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
258 case CODEC_ID_SOL_DPCM:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
259 in = 0;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
260 if (avctx->codec_tag != 3) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
261 while (in < buf_size) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
262 int n1, n2;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
263 n1 = (buf[in] >> 4) & 0xF;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
264 n2 = buf[in++] & 0xF;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
265 s->sample[0] += s->sol_table[n1];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
266 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
267 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
268 output_samples[out++] = (s->sample[0] - 128) << 8;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
269 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
270 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
271 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
272 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
273 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
274 } else {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
275 while (in < buf_size) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
276 int n;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
277 n = buf[in++];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
278 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
279 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
280 SATURATE_S16(s->sample[channel_number]);
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
281 output_samples[out++] = s->sample[channel_number];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
282 /* toggle channel */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
283 channel_number ^= s->channels - 1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
284 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
285 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
286 break;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
287 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
288
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
289 *data_size = out * sizeof(short);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
290 return buf_size;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
291 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
292
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
293 AVCodec roq_dpcm_decoder = {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
294 "roq_dpcm",
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
295 CODEC_TYPE_AUDIO,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
296 CODEC_ID_ROQ_DPCM,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
297 sizeof(DPCMContext),
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
298 dpcm_decode_init,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
299 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
300 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
301 dpcm_decode_frame,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
302 };
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
303
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
304 AVCodec interplay_dpcm_decoder = {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
305 "interplay_dpcm",
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
306 CODEC_TYPE_AUDIO,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
307 CODEC_ID_INTERPLAY_DPCM,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
308 sizeof(DPCMContext),
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
309 dpcm_decode_init,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
310 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
311 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
312 dpcm_decode_frame,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
313 };
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
314
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
315 AVCodec xan_dpcm_decoder = {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
316 "xan_dpcm",
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
317 CODEC_TYPE_AUDIO,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
318 CODEC_ID_XAN_DPCM,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
319 sizeof(DPCMContext),
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
320 dpcm_decode_init,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
321 NULL,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
322 NULL,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
323 dpcm_decode_frame,
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
324 };
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
325
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
326 AVCodec sol_dpcm_decoder = {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
327 "sol_dpcm",
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
328 CODEC_TYPE_AUDIO,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
329 CODEC_ID_SOL_DPCM,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
330 sizeof(DPCMContext),
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
331 dpcm_decode_init,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
332 NULL,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
333 NULL,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
334 dpcm_decode_frame,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
335 };