annotate dpcm.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 560095a27bd0
children
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
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 /**
12057
560095a27bd0 Remove redundant and harmful explicit filename after @file Doxygen command.
diego
parents: 11560
diff changeset
23 * @file
1439
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
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
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
322023e630a6 mark read-only data as const
stefang
parents: 7040
diff changeset
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
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
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
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2275
diff changeset
95
3420
54814e15aa3d Mark some read-only datastructures as const.
diego
parents: 3036
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2275
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2275
diff changeset
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,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9088
diff changeset
164 AVPacket *avpkt)
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
165 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9088
diff changeset
166 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9088
diff changeset
167 int buf_size = avpkt->size;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
168 DPCMContext *s = avctx->priv_data;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
169 int in, out = 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
170 int predictor[2];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
171 int channel_number = 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
172 short *output_samples = data;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
173 int shift[2];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
174 unsigned char byte;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
175 short diff;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
176
1767
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
177 if (!buf_size)
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
178 return 0;
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
179
5697
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
180 // almost every DPCM variant expands one byte of data into two
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
181 if(*data_size/2 < buf_size)
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
182 return -1;
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
183
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
184 switch(avctx->codec->id) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
185
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
186 case CODEC_ID_ROQ_DPCM:
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
187 if (s->channels == 1)
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
188 predictor[0] = AV_RL16(&buf[6]);
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
189 else {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
190 predictor[0] = buf[7] << 8;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
191 predictor[1] = buf[6] << 8;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
192 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
193 SE_16BIT(predictor[0]);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
194 SE_16BIT(predictor[1]);
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 /* decode the samples */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
197 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
198 predictor[channel_number] += s->roq_square_array[buf[in]];
5523
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
199 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
200 output_samples[out] = predictor[channel_number];
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
201
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
202 /* toggle channel */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
203 channel_number ^= s->channels - 1;
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 break;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
206
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
207 case CODEC_ID_INTERPLAY_DPCM:
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
208 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
209 predictor[0] = AV_RL16(&buf[in]);
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
210 in += 2;
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
211 SE_16BIT(predictor[0])
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
212 output_samples[out++] = predictor[0];
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
213 if (s->channels == 2) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
214 predictor[1] = AV_RL16(&buf[in]);
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
215 in += 2;
1477
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
216 SE_16BIT(predictor[1])
afc7baa19b62 fix Interplay DPCM (frames are intracoded, predictors do not carry
tmmm
parents: 1443
diff changeset
217 output_samples[out++] = predictor[1];
1439
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
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
220 while (in < buf_size) {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
221 predictor[channel_number] += interplay_delta_table[buf[in++]];
5523
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
222 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
223 output_samples[out++] = predictor[channel_number];
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 /* toggle channel */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
226 channel_number ^= s->channels - 1;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
227 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
228
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
229 break;
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
230
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
231 case CODEC_ID_XAN_DPCM:
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
232 in = 0;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
233 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
234 predictor[0] = 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[0]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
237 if (s->channels == 2) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
238 predictor[1] = AV_RL16(&buf[in]);
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
239 in += 2;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
240 SE_16BIT(predictor[1]);
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
241 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
242
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
243 while (in < buf_size) {
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
244 byte = buf[in++];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
245 diff = (byte & 0xFC) << 8;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
246 if ((byte & 0x03) == 3)
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
247 shift[channel_number]++;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
248 else
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
249 shift[channel_number] -= (2 * (byte & 3));
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
250 /* 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
251 if (shift[channel_number] < 0)
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
252 shift[channel_number] = 0;
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 diff >>= shift[channel_number];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
255 predictor[channel_number] += diff;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
256
5523
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
257 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
258 output_samples[out++] = predictor[channel_number];
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
259
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
260 /* toggle channel */
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
261 channel_number ^= s->channels - 1;
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
262 }
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
263 break;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
264 case CODEC_ID_SOL_DPCM:
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
265 in = 0;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
266 if (avctx->codec_tag != 3) {
5697
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
267 if(*data_size/4 < buf_size)
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
268 return -1;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
269 while (in < buf_size) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
270 int n1, n2;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
271 n1 = (buf[in] >> 4) & 0xF;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
272 n2 = buf[in++] & 0xF;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
273 s->sample[0] += s->sol_table[n1];
8380
a7435ffc0015 cosmetics: remove one unneeded space
kostya
parents: 7451
diff changeset
274 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
275 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
276 output_samples[out++] = (s->sample[0] - 128) << 8;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
277 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
278 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
279 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
280 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
281 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
282 } else {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
283 while (in < buf_size) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
284 int n;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
285 n = buf[in++];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
286 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
287 else s->sample[channel_number] += s->sol_table[n & 0x7F];
5523
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
288 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
289 output_samples[out++] = s->sample[channel_number];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
290 /* toggle channel */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
291 channel_number ^= s->channels - 1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
292 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
293 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 1881
diff changeset
294 break;
1439
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
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
297 *data_size = out * sizeof(short);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
298 return buf_size;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
299 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
300
6800
e3c9fa010282 DPCM codec long names, patch by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents: 6517
diff changeset
301 #define DPCM_DECODER(id, name, long_name_) \
5862
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
302 AVCodec name ## _decoder = { \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
303 #name, \
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9355
diff changeset
304 AVMEDIA_TYPE_AUDIO, \
5862
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
305 id, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
306 sizeof(DPCMContext), \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
307 dpcm_decode_init, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
308 NULL, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
309 NULL, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
310 dpcm_decode_frame, \
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6800
diff changeset
311 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
312 };
1443
47f4c8a5a7fc New fringe codecs: WC3/Xan video, Xan DPCM, DK3 & DK4 ADPCM
tmmm
parents: 1439
diff changeset
313
9088
b8cb2a9662a5 cosmetics: Reformat long_names so that "DPCM" comes first.
diego
parents: 8629
diff changeset
314 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
b8cb2a9662a5 cosmetics: Reformat long_names so that "DPCM" comes first.
diego
parents: 8629
diff changeset
315 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
b8cb2a9662a5 cosmetics: Reformat long_names so that "DPCM" comes first.
diego
parents: 8629
diff changeset
316 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
b8cb2a9662a5 cosmetics: Reformat long_names so that "DPCM" comes first.
diego
parents: 8629
diff changeset
317 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");