annotate dpcm.c @ 8790:1045a26cb90d libavcodec

Fix crash when encoding using libschroedinger. Currently only pixel and half-pixel motion vector precisions are supported in libschroedinger. Setting the mv_precision field to 2 (i.e. quarter pixel) causes a crash in the libschroedinger encoder calls. By not setting this parameter, we fall back to the default value used in libschroedinger. patch by Anuradha Suraparaju, anuradha rd.bbc.co uk
author diego
date Tue, 10 Feb 2009 14:27:16 +0000
parents 04423b2f6e0b
children b8cb2a9662a5
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 /**
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
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,
6218
michael
parents: 5862
diff changeset
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
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
175 if (!buf_size)
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
176 return 0;
19ee8ddea820 handle 0-length buffers
melanson
parents: 1477
diff changeset
177
5697
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
178 // almost every DPCM variant expands one byte of data into two
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
179 if(*data_size/2 < buf_size)
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
180 return -1;
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
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
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
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
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
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
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
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
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
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
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
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
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
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
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
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
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
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
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
265 if(*data_size/4 < buf_size)
a3fec73667af Guard against output buffer overflows
kostya
parents: 5523
diff changeset
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
a7435ffc0015 cosmetics: remove one unneeded space
kostya
parents: 7451
diff changeset
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
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 4364
diff changeset
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
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
300 AVCodec name ## _decoder = { \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
301 #name, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
302 CODEC_TYPE_AUDIO, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
303 id, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
304 sizeof(DPCMContext), \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
305 dpcm_decode_init, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
306 NULL, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
307 NULL, \
8983530be918 simplify dpcm decoders declaration using a macro
aurel
parents: 5697
diff changeset
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");