Mercurial > libavcodec.hg
annotate dpcm.c @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
| author | cehoyos |
|---|---|
| date | Fri, 20 Feb 2009 16:20:01 +0000 |
| parents | 04423b2f6e0b |
| children | b8cb2a9662a5 |
| 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 |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8573
diff
changeset
|
3 * Copyright (c) 2003 The ffmpeg Project |
|
1439
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 |
|
8573
2acf0ae7b041
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
8380
diff
changeset
|
40 #include "libavutil/intreadwrite.h" |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
41 #include "avcodec.h" |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
42 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
43 typedef struct DPCMContext { |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
44 int channels; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
45 short roq_square_array[256]; |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
46 long sample[2];//for SOL_DPCM |
| 3420 | 47 const int *sol_table;//for SOL_DPCM |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
48 } DPCMContext; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
49 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
50 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
51 |
| 7129 | 52 static const int interplay_delta_table[] = { |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
53 0, 1, 2, 3, 4, 5, 6, 7, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
54 8, 9, 10, 11, 12, 13, 14, 15, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
55 16, 17, 18, 19, 20, 21, 22, 23, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
56 24, 25, 26, 27, 28, 29, 30, 31, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
57 32, 33, 34, 35, 36, 37, 38, 39, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
58 40, 41, 42, 43, 47, 51, 56, 61, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
59 66, 72, 79, 86, 94, 102, 112, 122, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
60 133, 145, 158, 173, 189, 206, 225, 245, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
61 267, 292, 318, 348, 379, 414, 452, 493, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
62 538, 587, 640, 699, 763, 832, 908, 991, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
63 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
64 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
65 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
66 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
67 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
68 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
69 1, 1, 5481, 10503, 15105, 19322, 23186, 26728, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
70 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
71 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
72 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
73 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
74 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
75 -1081, -991, -908, -832, -763, -699, -640, -587, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
76 -538, -493, -452, -414, -379, -348, -318, -292, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
77 -267, -245, -225, -206, -189, -173, -158, -145, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
78 -133, -122, -112, -102, -94, -86, -79, -72, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
79 -66, -61, -56, -51, -47, -43, -42, -41, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
80 -40, -39, -38, -37, -36, -35, -34, -33, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
81 -32, -31, -30, -29, -28, -27, -26, -25, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
82 -24, -23, -22, -21, -20, -19, -18, -17, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
83 -16, -15, -14, -13, -12, -11, -10, -9, |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
84 -8, -7, -6, -5, -4, -3, -2, -1 |
|
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 }; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
87 |
| 3420 | 88 static const int sol_table_old[16] = |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
89 { 0x0, 0x1, 0x2 , 0x3, 0x6, 0xA, 0xF, 0x15, |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
90 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0}; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
91 |
| 3420 | 92 static const int sol_table_new[16] = |
|
2275
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 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15}; |
| 2967 | 95 |
| 3420 | 96 static const int sol_table_16[128] = { |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
97 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
|
98 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
|
99 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 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
|
109 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000 |
|
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 |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
113 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
114 static av_cold int dpcm_decode_init(AVCodecContext *avctx) |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
115 { |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
116 DPCMContext *s = avctx->priv_data; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
117 int i; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
118 short square; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
119 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
120 s->channels = avctx->channels; |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
121 s->sample[0] = s->sample[1] = 0; |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
122 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
123 switch(avctx->codec->id) { |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
124 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
125 case CODEC_ID_ROQ_DPCM: |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
126 /* initialize square table */ |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
127 for (i = 0; i < 128; i++) { |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
128 square = i * i; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
129 s->roq_square_array[i] = square; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
130 s->roq_square_array[i + 128] = -square; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
131 } |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
132 break; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
133 |
| 2967 | 134 |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
135 case CODEC_ID_SOL_DPCM: |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
136 switch(avctx->codec_tag){ |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
137 case 1: |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
138 s->sol_table=sol_table_old; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
139 s->sample[0] = s->sample[1] = 0x80; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
140 break; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
141 case 2: |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
142 s->sol_table=sol_table_new; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
143 s->sample[0] = s->sample[1] = 0x80; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
144 break; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
145 case 3: |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
146 s->sol_table=sol_table_16; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
147 break; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
148 default: |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
149 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
|
150 return -1; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
151 } |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
152 break; |
| 2967 | 153 |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
154 default: |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
155 break; |
|
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 |
|
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7129
diff
changeset
|
158 avctx->sample_fmt = SAMPLE_FMT_S16; |
|
1439
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, |
| 6218 | 164 const uint8_t *buf, int buf_size) |
|
1439
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 | 175 if (!buf_size) |
| 176 return 0; | |
| 177 | |
| 5697 | 178 // almost every DPCM variant expands one byte of data into two |
| 179 if(*data_size/2 < buf_size) | |
| 180 return -1; | |
| 181 | |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
182 switch(avctx->codec->id) { |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
183 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
184 case CODEC_ID_ROQ_DPCM: |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
185 if (s->channels == 1) |
| 4364 | 186 predictor[0] = AV_RL16(&buf[6]); |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
187 else { |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
188 predictor[0] = buf[7] << 8; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
189 predictor[1] = buf[6] << 8; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
190 } |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
191 SE_16BIT(predictor[0]); |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
192 SE_16BIT(predictor[1]); |
|
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 /* decode the samples */ |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
195 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
|
196 predictor[channel_number] += s->roq_square_array[buf[in]]; |
| 5523 | 197 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
|
198 output_samples[out] = predictor[channel_number]; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
199 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
200 /* toggle channel */ |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
201 channel_number ^= s->channels - 1; |
|
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 break; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
204 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
205 case CODEC_ID_INTERPLAY_DPCM: |
|
1477
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
206 in = 6; /* skip over the stream mask and stream length */ |
| 4364 | 207 predictor[0] = AV_RL16(&buf[in]); |
|
1477
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
208 in += 2; |
|
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
209 SE_16BIT(predictor[0]) |
|
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
210 output_samples[out++] = predictor[0]; |
|
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
211 if (s->channels == 2) { |
| 4364 | 212 predictor[1] = AV_RL16(&buf[in]); |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
213 in += 2; |
|
1477
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
214 SE_16BIT(predictor[1]) |
|
afc7baa19b62
fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents:
1443
diff
changeset
|
215 output_samples[out++] = predictor[1]; |
|
1439
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 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
218 while (in < buf_size) { |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
219 predictor[channel_number] += interplay_delta_table[buf[in++]]; |
| 5523 | 220 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
|
221 output_samples[out++] = predictor[channel_number]; |
|
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 /* toggle channel */ |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
224 channel_number ^= s->channels - 1; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
225 } |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
226 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
227 break; |
|
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
228 |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
229 case CODEC_ID_XAN_DPCM: |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
230 in = 0; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
231 shift[0] = shift[1] = 4; |
| 4364 | 232 predictor[0] = 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[0]); |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
235 if (s->channels == 2) { |
| 4364 | 236 predictor[1] = AV_RL16(&buf[in]); |
|
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
237 in += 2; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
238 SE_16BIT(predictor[1]); |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
239 } |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
240 |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
241 while (in < buf_size) { |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
242 byte = buf[in++]; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
243 diff = (byte & 0xFC) << 8; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
244 if ((byte & 0x03) == 3) |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
245 shift[channel_number]++; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
246 else |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
247 shift[channel_number] -= (2 * (byte & 3)); |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
248 /* 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
|
249 if (shift[channel_number] < 0) |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
250 shift[channel_number] = 0; |
|
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 diff >>= shift[channel_number]; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
253 predictor[channel_number] += diff; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
254 |
| 5523 | 255 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
|
256 output_samples[out++] = predictor[channel_number]; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
257 |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
258 /* toggle channel */ |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
259 channel_number ^= s->channels - 1; |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
260 } |
|
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
261 break; |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
262 case CODEC_ID_SOL_DPCM: |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
263 in = 0; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
264 if (avctx->codec_tag != 3) { |
| 5697 | 265 if(*data_size/4 < buf_size) |
| 266 return -1; | |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
267 while (in < buf_size) { |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
268 int n1, n2; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
269 n1 = (buf[in] >> 4) & 0xF; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
270 n2 = buf[in++] & 0xF; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
271 s->sample[0] += s->sol_table[n1]; |
| 8380 | 272 if (s->sample[0] < 0) s->sample[0] = 0; |
|
2275
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
273 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
|
274 output_samples[out++] = (s->sample[0] - 128) << 8; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
275 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
|
276 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
|
277 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
|
278 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
|
279 } |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
280 } else { |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
281 while (in < buf_size) { |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
282 int n; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
283 n = buf[in++]; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
284 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
|
285 else s->sample[channel_number] += s->sol_table[n & 0x7F]; |
| 5523 | 286 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
|
287 output_samples[out++] = s->sample[channel_number]; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
288 /* toggle channel */ |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
289 channel_number ^= s->channels - 1; |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
290 } |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
291 } |
|
c443a6af19a7
support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
1881
diff
changeset
|
292 break; |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
293 } |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
294 |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
295 *data_size = out * sizeof(short); |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
296 return buf_size; |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
297 } |
|
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
298 |
|
6800
e3c9fa010282
DPCM codec long names, patch by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6517
diff
changeset
|
299 #define DPCM_DECODER(id, name, long_name_) \ |
| 5862 | 300 AVCodec name ## _decoder = { \ |
| 301 #name, \ | |
| 302 CODEC_TYPE_AUDIO, \ | |
| 303 id, \ | |
| 304 sizeof(DPCMContext), \ | |
| 305 dpcm_decode_init, \ | |
| 306 NULL, \ | |
| 307 NULL, \ | |
| 308 dpcm_decode_frame, \ | |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6800
diff
changeset
|
309 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ |
|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
310 }; |
|
1443
47f4c8a5a7fc
New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents:
1439
diff
changeset
|
311 |
|
6800
e3c9fa010282
DPCM codec long names, patch by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6517
diff
changeset
|
312 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "Interplay DPCM"); |
|
e3c9fa010282
DPCM codec long names, patch by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6517
diff
changeset
|
313 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "id RoQ DPCM"); |
|
e3c9fa010282
DPCM codec long names, patch by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6517
diff
changeset
|
314 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "Sol DPCM"); |
|
e3c9fa010282
DPCM codec long names, patch by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6517
diff
changeset
|
315 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "Xan DPCM"); |
