annotate alac.c @ 5594:384629ebcb93 libavcodec

avoid overflow in the 3rd lifting step, this now needs mmx2 at minimum (patch for plain mmx support is welcome ...)
author michael
date Sun, 26 Aug 2007 01:11:02 +0000
parents d2ef80f5fd7e
children cb5999c836af
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
1 /*
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
2 * ALAC (Apple Lossless Audio Codec) decoder
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
3 * Copyright (c) 2005 David Hammerton
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
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: 3347
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
15 * Lesser General Public License for more details.
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
16 *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
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: 3347
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
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
20 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
21
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
22 /**
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
23 * @file alac.c
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
24 * ALAC (Apple Lossless Audio Codec) decoder
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
25 * @author 2005 David Hammerton
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
26 *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
27 * For more information on the ALAC format, visit:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
28 * http://crazney.net/programs/itunes/alac.html
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
29 *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
30 * Note: This decoder expects a 36- (0x24-)byte QuickTime atom to be
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
31 * passed through the extradata[_size] fields. This atom is tacked onto
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
32 * the end of an 'alac' stsd atom and has the following format:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
33 * bytes 0-3 atom size (0x24), big-endian
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
34 * bytes 4-7 atom type ('alac', not the 'alac' tag from start of stsd)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
35 * bytes 8-35 data bytes needed by decoder
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
36 *
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
37 * Extradata:
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
38 * 32bit size
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
39 * 32bit tag (=alac)
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
40 * 32bit zero?
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
41 * 32bit max sample per frame
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
42 * 8bit ?? (zero?)
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
43 * 8bit sample size
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
44 * 8bit history mult
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
45 * 8bit initial history
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
46 * 8bit kmodifier
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
47 * 8bit channels?
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
48 * 16bit ??
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
49 * 32bit max coded frame size
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
50 * 32bit bitrate?
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
51 * 32bit samplerate
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
52 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
53
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
54
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
55 #include "avcodec.h"
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
56 #include "bitstream.h"
5276
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
57 #include "bytestream.h"
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
58
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
59 #define ALAC_EXTRADATA_SIZE 36
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
60 #define MAX_CHANNELS 2
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
61
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
62 typedef struct {
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
63
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
64 AVCodecContext *avctx;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
65 GetBitContext gb;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
66 /* init to 0; first frame decode should initialize from extradata and
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
67 * set this to 1 */
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
68 int context_initialized;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
69
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
70 int samplesize;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
71 int numchannels;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
72 int bytespersample;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
73
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
74 /* buffers */
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
75 int32_t *predicterror_buffer[MAX_CHANNELS];
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
76
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
77 int32_t *outputsamples_buffer[MAX_CHANNELS];
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
78
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
79 /* stuff from setinfo */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
80 uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
81 uint8_t setinfo_7a; /* 0x00 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
82 uint8_t setinfo_sample_size; /* 0x10 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
83 uint8_t setinfo_rice_historymult; /* 0x28 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
84 uint8_t setinfo_rice_initialhistory; /* 0x0a */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
85 uint8_t setinfo_rice_kmodifier; /* 0x0e */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
86 uint8_t setinfo_7f; /* 0x02 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
87 uint16_t setinfo_80; /* 0x00ff */
5267
8256f8ec2fac Port some useful comments from newest version of David Hammerton's decoder (from which alac.c is based)
vitor
parents: 4364
diff changeset
88 uint32_t setinfo_82; /* 0x000020e7 */ /* max sample size?? */
8256f8ec2fac Port some useful comments from newest version of David Hammerton's decoder (from which alac.c is based)
vitor
parents: 4364
diff changeset
89 uint32_t setinfo_86; /* 0x00069fe4 */ /* bit rate (average)?? */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
90 uint32_t setinfo_8a_rate; /* 0x0000ac44 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
91 /* end setinfo stuff */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
92
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
93 } ALACContext;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
94
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
95 static void allocate_buffers(ALACContext *alac)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
96 {
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
97 int chan;
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
98 for (chan = 0; chan < MAX_CHANNELS; chan++) {
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
99 alac->predicterror_buffer[chan] =
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
100 av_malloc(alac->setinfo_max_samples_per_frame * 4);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
101
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
102 alac->outputsamples_buffer[chan] =
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
103 av_malloc(alac->setinfo_max_samples_per_frame * 4);
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
104 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
105 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
106
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
107 static int alac_set_info(ALACContext *alac)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
108 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
109 unsigned char *ptr = alac->avctx->extradata;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
110
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
111 ptr += 4; /* size */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
112 ptr += 4; /* alac */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
113 ptr += 4; /* 0 ? */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
114
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4226
diff changeset
115 if(AV_RB32(ptr) >= UINT_MAX/4){
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
116 av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n");
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
117 return -1;
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
118 }
5276
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
119
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
120 /* buffer size / 2 ? */
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
121 alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr);
5360
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
122 alac->setinfo_7a = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
123 alac->setinfo_sample_size = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
124 alac->setinfo_rice_historymult = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
125 alac->setinfo_rice_initialhistory = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
126 alac->setinfo_rice_kmodifier = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
127 /* channels? */
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
128 alac->setinfo_7f = *ptr++;
5276
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
129 alac->setinfo_80 = bytestream_get_be16(&ptr);
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
130 /* max coded frame size */
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
131 alac->setinfo_82 = bytestream_get_be32(&ptr);
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
132 /* bitrate ? */
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
133 alac->setinfo_86 = bytestream_get_be32(&ptr);
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
134 /* samplerate */
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
135 alac->setinfo_8a_rate = bytestream_get_be32(&ptr);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
136
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
137 allocate_buffers(alac);
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
138
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
139 return 0;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
140 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
141
5364
50454f3b0e88 Remove reimplementation of av_log2
vitor
parents: 5362
diff changeset
142 static inline int count_leading_zeros(int32_t input)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
143 {
5364
50454f3b0e88 Remove reimplementation of av_log2
vitor
parents: 5362
diff changeset
144 return 31-av_log2(input);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
145 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
146
3071
cc0357a90e8f make some functions static (patch by Dieter < freebsd at sopwith.solgatos.com >)
aurel
parents: 3036
diff changeset
147 static void bastardized_rice_decompress(ALACContext *alac,
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
148 int32_t *output_buffer,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
149 int output_size,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
150 int readsamplesize, /* arg_10 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
151 int rice_initialhistory, /* arg424->b */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
152 int rice_kmodifier, /* arg424->d */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
153 int rice_historymult, /* arg424->c */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
154 int rice_kmodifier_mask /* arg424->e */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
155 )
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
156 {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
157 int output_count;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
158 unsigned int history = rice_initialhistory;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
159 int sign_modifier = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
160
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
161 for (output_count = 0; output_count < output_size; output_count++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
162 int32_t x = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
163 int32_t x_modified;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
164 int32_t final_val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
165
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
166 /* read x - number of 1s before 0 represent the rice */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
167 while (x <= 8 && get_bits1(&alac->gb)) {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
168 x++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
169 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
170
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
171
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
172 if (x > 8) { /* RICE THRESHOLD */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
173 /* use alternative encoding */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
174 int32_t value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
175
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
176 value = get_bits(&alac->gb, readsamplesize);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
177
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
178 /* mask value to readsamplesize size */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
179 if (readsamplesize != 32)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
180 value &= (0xffffffff >> (32 - readsamplesize));
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
181
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
182 x = value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
183 } else {
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
184 /* standard rice encoding */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
185 int extrabits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
186 int k; /* size of extra bits */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
187
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
188 /* read k, that is bits as is */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
189 k = 31 - rice_kmodifier - count_leading_zeros((history >> 9) + 3);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
190
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2782
diff changeset
191 if (k < 0)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
192 k += rice_kmodifier;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2782
diff changeset
193 else
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
194 k = rice_kmodifier;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
195
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
196 if (k != 1) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
197 extrabits = show_bits(&alac->gb, k);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
198
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
199 /* multiply x by 2^k - 1, as part of their strange algorithm */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
200 x = (x << k) - x;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
201
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
202 if (extrabits > 1) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
203 x += extrabits - 1;
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
204 skip_bits(&alac->gb, k);
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
205 } else
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
206 skip_bits(&alac->gb, k - 1);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
207 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
208 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
209
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
210 x_modified = sign_modifier + x;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
211 final_val = (x_modified + 1) / 2;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
212 if (x_modified & 1) final_val *= -1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
213
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
214 output_buffer[output_count] = final_val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
215
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
216 sign_modifier = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
217
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
218 /* now update the history */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
219 history += x_modified * rice_historymult
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
220 - ((history * rice_historymult) >> 9);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
221
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
222 if (x_modified > 0xffff)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
223 history = 0xffff;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
224
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
225 /* special case: there may be compressed blocks of 0 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
226 if ((history < 128) && (output_count+1 < output_size)) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
227 int block_size;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
228
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
229 sign_modifier = 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
230
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
231 x = 0;
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
232 while (x <= 8 && get_bits1(&alac->gb)) {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
233 x++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
234 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
235
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
236 if (x > 8) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
237 block_size = get_bits(&alac->gb, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
238 block_size &= 0xffff;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
239 } else {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
240 int k;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
241 int extrabits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
242
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
243 k = count_leading_zeros(history) + ((history + 16) >> 6 /* / 64 */) - 24;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
244
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
245 extrabits = show_bits(&alac->gb, k);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
246
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
247 block_size = (((1 << k) - 1) & rice_kmodifier_mask) * x
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
248 + extrabits - 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
249
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
250 if (extrabits < 2) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
251 x = 1 - extrabits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
252 block_size += x;
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
253 skip_bits(&alac->gb, k - 1);
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
254 } else {
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
255 skip_bits(&alac->gb, k);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
256 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
257 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
258
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
259 if (block_size > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
260 memset(&output_buffer[output_count+1], 0, block_size * 4);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
261 output_count += block_size;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
262 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
263
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
264 if (block_size > 0xffff)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
265 sign_modifier = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
266
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
267 history = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
268 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
269 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
270 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
271
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
272 #define SIGN_EXTENDED32(val, bits) ((val << (32 - bits)) >> (32 - bits))
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
273
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
274 #define SIGN_ONLY(v) \
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
275 ((v < 0) ? (-1) : \
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
276 ((v > 0) ? (1) : \
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
277 (0)))
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
278
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
279 static void predictor_decompress_fir_adapt(int32_t *error_buffer,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
280 int32_t *buffer_out,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
281 int output_size,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
282 int readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
283 int16_t *predictor_coef_table,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
284 int predictor_coef_num,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
285 int predictor_quantitization)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
286 {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
287 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
288
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
289 /* first sample always copies */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
290 *buffer_out = *error_buffer;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
291
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
292 if (!predictor_coef_num) {
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
293 if (output_size <= 1)
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
294 return;
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
295
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
296 memcpy(buffer_out+1, error_buffer+1, (output_size-1) * 4);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
297 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
298 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
299
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
300 if (predictor_coef_num == 0x1f) { /* 11111 - max value of predictor_coef_num */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
301 /* second-best case scenario for fir decompression,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
302 * error describes a small difference from the previous sample only
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
303 */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
304 if (output_size <= 1)
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
305 return;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
306 for (i = 0; i < output_size - 1; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
307 int32_t prev_value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
308 int32_t error_value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
309
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
310 prev_value = buffer_out[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
311 error_value = error_buffer[i+1];
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
312 buffer_out[i+1] =
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
313 SIGN_EXTENDED32((prev_value + error_value), readsamplesize);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
314 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
315 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
316 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
317
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
318 /* read warm-up samples */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
319 if (predictor_coef_num > 0)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
320 for (i = 0; i < predictor_coef_num; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
321 int32_t val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
322
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
323 val = buffer_out[i] + error_buffer[i+1];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
324 val = SIGN_EXTENDED32(val, readsamplesize);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
325 buffer_out[i+1] = val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
326 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
327
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
328 #if 0
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
329 /* 4 and 8 are very common cases (the only ones i've seen). these
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
330 * should be unrolled and optimised
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
331 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
332 if (predictor_coef_num == 4) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
333 /* FIXME: optimised general case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
334 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
335 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
336
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
337 if (predictor_coef_table == 8) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
338 /* FIXME: optimised general case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
339 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
340 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
341 #endif
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
342
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
343 /* general case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
344 if (predictor_coef_num > 0) {
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
345 for (i = predictor_coef_num + 1; i < output_size; i++) {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
346 int j;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
347 int sum = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
348 int outval;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
349 int error_val = error_buffer[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
350
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
351 for (j = 0; j < predictor_coef_num; j++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
352 sum += (buffer_out[predictor_coef_num-j] - buffer_out[0]) *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
353 predictor_coef_table[j];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
354 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
355
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
356 outval = (1 << (predictor_quantitization-1)) + sum;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
357 outval = outval >> predictor_quantitization;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
358 outval = outval + buffer_out[0] + error_val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
359 outval = SIGN_EXTENDED32(outval, readsamplesize);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
360
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
361 buffer_out[predictor_coef_num+1] = outval;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
362
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
363 if (error_val > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
364 int predictor_num = predictor_coef_num - 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
365
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
366 while (predictor_num >= 0 && error_val > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
367 int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
368 int sign = SIGN_ONLY(val);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
369
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
370 predictor_coef_table[predictor_num] -= sign;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
371
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
372 val *= sign; /* absolute value */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
373
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
374 error_val -= ((val >> predictor_quantitization) *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
375 (predictor_coef_num - predictor_num));
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
376
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
377 predictor_num--;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
378 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
379 } else if (error_val < 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
380 int predictor_num = predictor_coef_num - 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
381
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
382 while (predictor_num >= 0 && error_val < 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
383 int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
384 int sign = - SIGN_ONLY(val);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
385
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
386 predictor_coef_table[predictor_num] -= sign;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
387
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
388 val *= sign; /* neg value */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
389
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
390 error_val -= ((val >> predictor_quantitization) *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
391 (predictor_coef_num - predictor_num));
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
392
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
393 predictor_num--;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
394 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
395 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
396
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
397 buffer_out++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
398 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
399 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
400 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
401
5504
06956c599c4d Rename function
vitor
parents: 5400
diff changeset
402 static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS],
5505
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
403 int16_t *buffer_out,
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
404 int numchannels, int numsamples,
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
405 uint8_t interlacing_shift,
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
406 uint8_t interlacing_leftweight)
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
407 {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
408 int i;
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
409 if (numsamples <= 0)
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
410 return;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
411
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
412 /* weighted interlacing */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
413 if (interlacing_leftweight) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
414 for (i = 0; i < numsamples; i++) {
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
415 int32_t a, b;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
416
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
417 a = buffer[0][i];
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
418 b = buffer[1][i];
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
419
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
420 a -= (b * interlacing_leftweight) >> interlacing_shift;
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
421 b += a;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
422
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
423 buffer_out[i*numchannels] = b;
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
424 buffer_out[i*numchannels + 1] = a;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
425 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
426
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
427 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
428 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
429
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
430 /* otherwise basic interlacing took place */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
431 for (i = 0; i < numsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
432 int16_t left, right;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
433
5368
a31f6ae7e83d Make deinterlace_16 receive an array as a parameter and not two separated vars
vitor
parents: 5367
diff changeset
434 left = buffer[0][i];
a31f6ae7e83d Make deinterlace_16 receive an array as a parameter and not two separated vars
vitor
parents: 5367
diff changeset
435 right = buffer[1][i];
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
436
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
437 buffer_out[i*numchannels] = left;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
438 buffer_out[i*numchannels + 1] = right;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
439 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
440 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
441
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
442 static int alac_decode_frame(AVCodecContext *avctx,
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
443 void *outbuffer, int *outputsize,
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
444 uint8_t *inbuffer, int input_buffer_size)
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
445 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
446 ALACContext *alac = avctx->priv_data;
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
447
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
448 int channels;
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
449 int32_t outputsamples;
5271
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
450 int hassize;
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
451 int readsamplesize;
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
452 int wasted_bytes;
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
453 int isnotcompressed;
5358
f3a26c190f9a Move var. declaration to allow further clean up
vitor
parents: 5357
diff changeset
454 uint8_t interlacing_shift;
f3a26c190f9a Move var. declaration to allow further clean up
vitor
parents: 5357
diff changeset
455 uint8_t interlacing_leftweight;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
456
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
457 /* short-circuit null buffers */
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
458 if (!inbuffer || !input_buffer_size)
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
459 return input_buffer_size;
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
460
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
461 /* initialize from the extradata */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
462 if (!alac->context_initialized) {
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
463 if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
464 av_log(avctx, AV_LOG_ERROR, "alac: expected %d extradata bytes\n",
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
465 ALAC_EXTRADATA_SIZE);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
466 return input_buffer_size;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
467 }
4226
43ebe9279fa0 fix some potential security issues, patch by Matthias Hopf, mat at mshopf dot de
bcoudurier
parents: 3947
diff changeset
468 if (alac_set_info(alac)) {
43ebe9279fa0 fix some potential security issues, patch by Matthias Hopf, mat at mshopf dot de
bcoudurier
parents: 3947
diff changeset
469 av_log(avctx, AV_LOG_ERROR, "alac: set_info failed\n");
43ebe9279fa0 fix some potential security issues, patch by Matthias Hopf, mat at mshopf dot de
bcoudurier
parents: 3947
diff changeset
470 return input_buffer_size;
43ebe9279fa0 fix some potential security issues, patch by Matthias Hopf, mat at mshopf dot de
bcoudurier
parents: 3947
diff changeset
471 }
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
472 alac->context_initialized = 1;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
473 }
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
474
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
475 init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
476
5298
e00f7048c50c Make "channels" variable mean the number of channels, not the number of
vitor
parents: 5292
diff changeset
477 channels = get_bits(&alac->gb, 3) + 1;
5362
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
478 if (channels > MAX_CHANNELS) {
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
479 av_log(avctx, AV_LOG_ERROR, "channels > %d not supported\n",
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
480 MAX_CHANNELS);
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
481 return input_buffer_size;
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
482 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
483
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
484 /* 2^result = something to do with output waiting.
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
485 * perhaps matters if we read > 1 frame in a pass?
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
486 */
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
487 skip_bits(&alac->gb, 4);
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
488
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
489 skip_bits(&alac->gb, 12); /* unknown, skip 12 bits */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
490
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
491 /* the output sample size is stored soon */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5506
diff changeset
492 hassize = get_bits1(&alac->gb);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
493
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
494 wasted_bytes = get_bits(&alac->gb, 2); /* unknown ? */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
495
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
496 /* whether the frame is compressed */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5506
diff changeset
497 isnotcompressed = get_bits1(&alac->gb);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
498
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
499 if (hassize) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
500 /* now read the number of samples as a 32bit integer */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
501 outputsamples = get_bits(&alac->gb, 32);
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
502 } else
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
503 outputsamples = alac->setinfo_max_samples_per_frame;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
504
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
505 *outputsize = outputsamples * alac->bytespersample;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
506 readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + channels - 1;
5271
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
507
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
508 if (!isnotcompressed) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
509 /* so it is compressed */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
510 int16_t predictor_coef_table[channels][32];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
511 int predictor_coef_num[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
512 int prediction_type[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
513 int prediction_quantitization[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
514 int ricemodifier[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
515 int i, chan;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
516
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
517 interlacing_shift = get_bits(&alac->gb, 8);
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
518 interlacing_leftweight = get_bits(&alac->gb, 8);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
519
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
520 for (chan = 0; chan < channels; chan++) {
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
521 prediction_type[chan] = get_bits(&alac->gb, 4);
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
522 prediction_quantitization[chan] = get_bits(&alac->gb, 4);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
523
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
524 ricemodifier[chan] = get_bits(&alac->gb, 3);
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
525 predictor_coef_num[chan] = get_bits(&alac->gb, 5);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
526
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
527 /* read the predictor table */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
528 for (i = 0; i < predictor_coef_num[chan]; i++)
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
529 predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16);
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
530 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
531
5400
2433e0070455 Minor cosmetics
vitor
parents: 5372
diff changeset
532 if (wasted_bytes)
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
533 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
534
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
535 for (chan = 0; chan < channels; chan++) {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
536 bastardized_rice_decompress(alac,
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
537 alac->predicterror_buffer[chan],
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
538 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
539 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
540 alac->setinfo_rice_initialhistory,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
541 alac->setinfo_rice_kmodifier,
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
542 ricemodifier[chan] * alac->setinfo_rice_historymult / 4,
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
543 (1 << alac->setinfo_rice_kmodifier) - 1);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
544
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
545 if (prediction_type[chan] == 0) {
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
546 /* adaptive fir */
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
547 predictor_decompress_fir_adapt(alac->predicterror_buffer[chan],
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
548 alac->outputsamples_buffer[chan],
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
549 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
550 readsamplesize,
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
551 predictor_coef_table[chan],
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
552 predictor_coef_num[chan],
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
553 prediction_quantitization[chan]);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
554 } else {
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
555 av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[chan]);
5366
59a9c1e471fc Yet more cosmetics
vitor
parents: 5365
diff changeset
556 /* I think the only other prediction type (or perhaps this is
59a9c1e471fc Yet more cosmetics
vitor
parents: 5365
diff changeset
557 * just a boolean?) runs adaptive fir twice.. like:
5359
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
558 * predictor_decompress_fir_adapt(predictor_error, tempout, ...)
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
559 * predictor_decompress_fir_adapt(predictor_error, outputsamples ...)
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
560 * little strange..
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
561 */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
562 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
563 }
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
564 } else {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
565 /* not compressed, easy case */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
566 if (alac->setinfo_sample_size <= 16) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
567 int i, chan;
5366
59a9c1e471fc Yet more cosmetics
vitor
parents: 5365
diff changeset
568 for (chan = 0; chan < channels; chan++)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
569 for (i = 0; i < outputsamples; i++) {
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
570 int32_t audiobits;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
571
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
572 audiobits = get_bits(&alac->gb, alac->setinfo_sample_size);
5359
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
573 audiobits = SIGN_EXTENDED32(audiobits, readsamplesize);
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
574
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
575 alac->outputsamples_buffer[chan][i] = audiobits;
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
576 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
577 } else {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
578 int i, chan;
5366
59a9c1e471fc Yet more cosmetics
vitor
parents: 5365
diff changeset
579 for (chan = 0; chan < channels; chan++)
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
580 for (i = 0; i < outputsamples; i++) {
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
581 int32_t audiobits;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
582
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
583 audiobits = get_bits(&alac->gb, 16);
5359
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
584 /* special case of sign extension..
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
585 * as we'll be ORing the low 16bits into this */
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
586 audiobits = audiobits << 16;
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
587 audiobits = audiobits >> (32 - alac->setinfo_sample_size);
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
588 audiobits |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
589
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
590 alac->outputsamples_buffer[chan][i] = audiobits;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
591 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
592 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
593 /* wasted_bytes = 0; */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
594 interlacing_shift = 0;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
595 interlacing_leftweight = 0;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
596 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
597
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
598 switch(alac->setinfo_sample_size) {
5400
2433e0070455 Minor cosmetics
vitor
parents: 5372
diff changeset
599 case 16:
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
600 if (channels == 2) {
5504
06956c599c4d Rename function
vitor
parents: 5400
diff changeset
601 reconstruct_stereo_16(alac->outputsamples_buffer,
5506
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
602 (int16_t*)outbuffer,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
603 alac->numchannels,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
604 outputsamples,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
605 interlacing_shift,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
606 interlacing_leftweight);
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
607 } else {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
608 int i;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
609 for (i = 0; i < outputsamples; i++) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
610 int16_t sample = alac->outputsamples_buffer[0][i];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
611 ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
612 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
613 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
614 break;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
615 case 20:
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
616 case 24:
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
617 case 32:
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
618 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
619 break;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
620 default:
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
621 break;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
622 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
623
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
624 return input_buffer_size;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
625 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
626
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
627 static int alac_decode_init(AVCodecContext * avctx)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
628 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
629 ALACContext *alac = avctx->priv_data;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
630 alac->avctx = avctx;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
631 alac->context_initialized = 0;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
632
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
633 alac->samplesize = alac->avctx->bits_per_sample;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
634 alac->numchannels = alac->avctx->channels;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
635 alac->bytespersample = (alac->samplesize / 8) * alac->numchannels;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
636
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
637 return 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
638 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
639
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
640 static int alac_decode_close(AVCodecContext *avctx)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
641 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
642 ALACContext *alac = avctx->priv_data;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
643
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
644 int chan;
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
645 for (chan = 0; chan < MAX_CHANNELS; chan++) {
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
646 av_free(alac->predicterror_buffer[chan]);
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
647 av_free(alac->outputsamples_buffer[chan]);
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
648 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
649
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
650 return 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
651 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
652
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
653 AVCodec alac_decoder = {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
654 "alac",
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
655 CODEC_TYPE_AUDIO,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
656 CODEC_ID_ALAC,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
657 sizeof(ALACContext),
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
658 alac_decode_init,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
659 NULL,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
660 alac_decode_close,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
661 alac_decode_frame,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
662 };