Mercurial > libavcodec.hg
annotate dpcm.c @ 5876:731ee5ad6bde libavcodec
Correct assignment of interlaced_frame; was being set on output frames,
in display order, based on decoding information in decoding order. Now
set properly, immediately upon completion of decode.
Based on original patch from Reinhard Nissl, rnisssl % gmx , de
Original Thread: [FFmpeg-devel] H.264 + PAFF: BBC HD recording shows
extreme interlacing artefacts, Thu, 01 Nov 2007 22:43:09
author | heydowns |
---|---|
date | Mon, 05 Nov 2007 18:16:42 +0000 |
parents | 8983530be918 |
children | dfdff1ca78a7 |
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 | 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 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 |
3420 | 87 static const int sol_table_old[16] = |
2275
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 |
3420 | 91 static const int sol_table_new[16] = |
2275
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}; |
2967 | 94 |
3420 | 95 static const int sol_table_16[128] = { |
2275
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 |
2967 | 133 |
2275
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; |
2967 | 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 | 173 if (!buf_size) |
174 return 0; | |
175 | |
5697 | 176 // almost every DPCM variant expands one byte of data into two |
177 if(*data_size/2 < buf_size) | |
178 return -1; | |
179 | |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
180 switch(avctx->codec->id) { |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
181 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
182 case CODEC_ID_ROQ_DPCM: |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
183 if (s->channels == 1) |
4364 | 184 predictor[0] = AV_RL16(&buf[6]); |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
185 else { |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
186 predictor[0] = buf[7] << 8; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
187 predictor[1] = buf[6] << 8; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
188 } |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
189 SE_16BIT(predictor[0]); |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
190 SE_16BIT(predictor[1]); |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
191 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
192 /* decode the samples */ |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
193 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
|
194 predictor[channel_number] += s->roq_square_array[buf[in]]; |
5523 | 195 predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
196 output_samples[out] = predictor[channel_number]; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
197 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
198 /* toggle channel */ |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
199 channel_number ^= s->channels - 1; |
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 break; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
202 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
203 case CODEC_ID_INTERPLAY_DPCM: |
1477
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
204 in = 6; /* skip over the stream mask and stream length */ |
4364 | 205 predictor[0] = AV_RL16(&buf[in]); |
1477
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
206 in += 2; |
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
207 SE_16BIT(predictor[0]) |
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
208 output_samples[out++] = predictor[0]; |
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
209 if (s->channels == 2) { |
4364 | 210 predictor[1] = AV_RL16(&buf[in]); |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
211 in += 2; |
1477
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
212 SE_16BIT(predictor[1]) |
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
213 output_samples[out++] = predictor[1]; |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
214 } |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
215 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
216 while (in < buf_size) { |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
217 predictor[channel_number] += interplay_delta_table[buf[in++]]; |
5523 | 218 predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
219 output_samples[out++] = predictor[channel_number]; |
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 /* toggle channel */ |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
222 channel_number ^= s->channels - 1; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
223 } |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
224 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
225 break; |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
226 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
227 case CODEC_ID_XAN_DPCM: |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
228 in = 0; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
229 shift[0] = shift[1] = 4; |
4364 | 230 predictor[0] = AV_RL16(&buf[in]); |
1443
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[0]); |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
233 if (s->channels == 2) { |
4364 | 234 predictor[1] = AV_RL16(&buf[in]); |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
235 in += 2; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
236 SE_16BIT(predictor[1]); |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
237 } |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
238 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
239 while (in < buf_size) { |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
240 byte = buf[in++]; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
241 diff = (byte & 0xFC) << 8; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
242 if ((byte & 0x03) == 3) |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
243 shift[channel_number]++; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
244 else |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
245 shift[channel_number] -= (2 * (byte & 3)); |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
246 /* 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
|
247 if (shift[channel_number] < 0) |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
248 shift[channel_number] = 0; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
249 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
250 diff >>= shift[channel_number]; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
251 predictor[channel_number] += diff; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
252 |
5523 | 253 predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
254 output_samples[out++] = predictor[channel_number]; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
255 |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
256 /* toggle channel */ |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
257 channel_number ^= s->channels - 1; |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
258 } |
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
259 break; |
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
260 case CODEC_ID_SOL_DPCM: |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
261 in = 0; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
262 if (avctx->codec_tag != 3) { |
5697 | 263 if(*data_size/4 < buf_size) |
264 return -1; | |
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
265 while (in < buf_size) { |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
266 int n1, n2; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
267 n1 = (buf[in] >> 4) & 0xF; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
268 n2 = buf[in++] & 0xF; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
269 s->sample[0] += s->sol_table[n1]; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
270 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
|
271 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
|
272 output_samples[out++] = (s->sample[0] - 128) << 8; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
273 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
|
274 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
|
275 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
|
276 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
|
277 } |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
278 } else { |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
279 while (in < buf_size) { |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
280 int n; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
281 n = buf[in++]; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
282 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
|
283 else s->sample[channel_number] += s->sol_table[n & 0x7F]; |
5523 | 284 s->sample[channel_number] = av_clip_int16(s->sample[channel_number]); |
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
285 output_samples[out++] = s->sample[channel_number]; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
286 /* toggle channel */ |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
287 channel_number ^= s->channels - 1; |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
288 } |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
289 } |
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
290 break; |
1439
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 *data_size = out * sizeof(short); |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
294 return buf_size; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
295 } |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
296 |
5862 | 297 #define DPCM_DECODER(id, name) \ |
298 AVCodec name ## _decoder = { \ | |
299 #name, \ | |
300 CODEC_TYPE_AUDIO, \ | |
301 id, \ | |
302 sizeof(DPCMContext), \ | |
303 dpcm_decode_init, \ | |
304 NULL, \ | |
305 NULL, \ | |
306 dpcm_decode_frame, \ | |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
307 }; |
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
308 |
5862 | 309 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm); |
310 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm); | |
311 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm); | |
312 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm); |