annotate alac.c @ 3990:746a60ba3177 libavcodec

enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author michael
date Wed, 11 Oct 2006 12:23:40 +0000
parents c8c591fe26f8
children 43ebe9279fa0
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 * All rights reserved.
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
8 * 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
9 * 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
10 * 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
11 * 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
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3347
diff changeset
13 * 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
14 * 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
15 * 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
16 * Lesser General Public License for more details.
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
17 *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
18 * 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
19 * 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
20 * 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
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 /**
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
24 * @file alac.c
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
25 * ALAC (Apple Lossless Audio Codec) decoder
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
26 * @author 2005 David Hammerton
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
27 *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
28 * 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
29 * http://crazney.net/programs/itunes/alac.html
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
30 *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
31 * 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
32 * 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
33 * 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
34 * 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
35 * 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
36 * bytes 8-35 data bytes needed by decoder
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
37 *
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
38 * Extradata:
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
39 * 32bit size
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
40 * 32bit tag (=alac)
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
41 * 32bit zero?
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
42 * 32bit max sample per frame
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
43 * 8bit ?? (zero?)
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
44 * 8bit sample size
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
45 * 8bit history mult
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
46 * 8bit initial history
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
47 * 8bit kmodifier
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
48 * 8bit channels?
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
49 * 16bit ??
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
50 * 32bit max coded frame size
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
51 * 32bit bitrate?
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
52 * 32bit samplerate
2542
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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
56 #include "avcodec.h"
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
57 #include "bitstream.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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
60
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
61 typedef struct {
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
62
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
63 AVCodecContext *avctx;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
64 GetBitContext gb;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
65 /* 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
66 * set this to 1 */
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
67 int context_initialized;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
68
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
69 int samplesize;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
70 int numchannels;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
71 int bytespersample;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
72
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
73 /* buffers */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
74 int32_t *predicterror_buffer_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
75 int32_t *predicterror_buffer_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
76
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
77 int32_t *outputsamples_buffer_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
78 int32_t *outputsamples_buffer_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
79
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
80 /* stuff from setinfo */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
81 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
82 uint8_t setinfo_7a; /* 0x00 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
83 uint8_t setinfo_sample_size; /* 0x10 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
84 uint8_t setinfo_rice_historymult; /* 0x28 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
85 uint8_t setinfo_rice_initialhistory; /* 0x0a */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
86 uint8_t setinfo_rice_kmodifier; /* 0x0e */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
87 uint8_t setinfo_7f; /* 0x02 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
88 uint16_t setinfo_80; /* 0x00ff */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
89 uint32_t setinfo_82; /* 0x000020e7 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
90 uint32_t setinfo_86; /* 0x00069fe4 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
91 uint32_t setinfo_8a_rate; /* 0x0000ac44 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
92 /* end setinfo stuff */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
93
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
94 } ALACContext;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
95
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
96 static void allocate_buffers(ALACContext *alac)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
97 {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
98 alac->predicterror_buffer_a = av_malloc(alac->setinfo_max_samples_per_frame * 4);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
99 alac->predicterror_buffer_b = av_malloc(alac->setinfo_max_samples_per_frame * 4);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
100
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
101 alac->outputsamples_buffer_a = av_malloc(alac->setinfo_max_samples_per_frame * 4);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
102 alac->outputsamples_buffer_b = av_malloc(alac->setinfo_max_samples_per_frame * 4);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
103 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
104
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
105 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
106 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
107 unsigned char *ptr = alac->avctx->extradata;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
108
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
109 ptr += 4; /* size */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
110 ptr += 4; /* alac */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
111 ptr += 4; /* 0 ? */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
112
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
113 if(BE_32(ptr) >= UINT_MAX/4){
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
114 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
115 return -1;
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
116 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
117 alac->setinfo_max_samples_per_frame = BE_32(ptr); /* buffer size / 2 ? */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
118 ptr += 4;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
119 alac->setinfo_7a = *ptr++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
120 alac->setinfo_sample_size = *ptr++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
121 alac->setinfo_rice_historymult = *ptr++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
122 alac->setinfo_rice_initialhistory = *ptr++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
123 alac->setinfo_rice_kmodifier = *ptr++;
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
124 alac->setinfo_7f = *ptr++; // channels?
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
125 alac->setinfo_80 = BE_16(ptr);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
126 ptr += 2;
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
127 alac->setinfo_82 = BE_32(ptr); // max coded frame size
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
128 ptr += 4;
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
129 alac->setinfo_86 = BE_32(ptr); // bitrate ?
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
130 ptr += 4;
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
131 alac->setinfo_8a_rate = BE_32(ptr); // samplerate
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
132 ptr += 4;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
133
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
134 allocate_buffers(alac);
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
135
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
136 return 0;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
137 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
138
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
139 /* hideously inefficient. could use a bitmask search,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
140 * alternatively bsr on x86,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
141 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
142 static int count_leading_zeros(int32_t input)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
143 {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
144 int i = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
145 while (!(0x80000000 & input) && i < 32) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
146 i++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
147 input = input << 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
148 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
149 return i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
150 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
151
3071
cc0357a90e8f make some functions static (patch by Dieter < freebsd at sopwith.solgatos.com >)
aurel
parents: 3036
diff changeset
152 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
153 int32_t *output_buffer,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
154 int output_size,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
155 int readsamplesize, /* arg_10 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
156 int rice_initialhistory, /* arg424->b */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
157 int rice_kmodifier, /* arg424->d */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
158 int rice_historymult, /* arg424->c */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
159 int rice_kmodifier_mask /* arg424->e */
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 {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
162 int output_count;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
163 unsigned int history = rice_initialhistory;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
164 int sign_modifier = 0;
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 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
167 int32_t x = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
168 int32_t x_modified;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
169 int32_t final_val;
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 /* 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
172 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
173 x++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
174 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
175
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
176
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
177 if (x > 8) { /* RICE THRESHOLD */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
178 /* use alternative encoding */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
179 int32_t value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
180
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
181 value = get_bits(&alac->gb, readsamplesize);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
182
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
183 /* mask value to readsamplesize size */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
184 if (readsamplesize != 32)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
185 value &= (0xffffffff >> (32 - readsamplesize));
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
186
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
187 x = value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
188 } else {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
189 /* standard rice encoding */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
190 int extrabits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
191 int k; /* size of extra bits */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
192
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
193 /* read k, that is bits as is */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
194 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
195
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2782
diff changeset
196 if (k < 0)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
197 k += rice_kmodifier;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2782
diff changeset
198 else
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
199 k = rice_kmodifier;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
200
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
201 if (k != 1) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
202 extrabits = show_bits(&alac->gb, k);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
203
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
204 /* 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
205 x = (x << k) - x;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
206
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
207 if (extrabits > 1) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
208 x += extrabits - 1;
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
209 get_bits(&alac->gb, k);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
210 } else {
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
211 get_bits(&alac->gb, k - 1);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
212 }
2542
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 }
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 x_modified = sign_modifier + x;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
217 final_val = (x_modified + 1) / 2;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
218 if (x_modified & 1) final_val *= -1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
219
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
220 output_buffer[output_count] = final_val;
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 sign_modifier = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
223
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
224 /* now update the history */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
225 history += (x_modified * rice_historymult)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
226 - ((history * rice_historymult) >> 9);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
227
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
228 if (x_modified > 0xffff)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
229 history = 0xffff;
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 /* 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
232 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
233 int block_size;
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 sign_modifier = 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
236
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
237 x = 0;
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
238 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
239 x++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
240 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
241
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
242 if (x > 8) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
243 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
244 block_size &= 0xffff;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
245 } else {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
246 int k;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
247 int extrabits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
248
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
249 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
250
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
251 extrabits = show_bits(&alac->gb, k);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
252
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
253 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
254 + extrabits - 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
255
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
256 if (extrabits < 2) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
257 x = 1 - extrabits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
258 block_size += x;
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
259 get_bits(&alac->gb, k - 1);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
260 } else {
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
261 get_bits(&alac->gb, k);
2542
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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
265 if (block_size > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
266 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
267 output_count += block_size;
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 if (block_size > 0xffff)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
272 sign_modifier = 0;
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 history = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
275 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
276 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
277 }
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 #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
280
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
281 #define SIGN_ONLY(v) \
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
282 ((v < 0) ? (-1) : \
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
283 ((v > 0) ? (1) : \
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
284 (0)))
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
285
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
286 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
287 int32_t *buffer_out,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
288 int output_size,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
289 int readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
290 int16_t *predictor_coef_table,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
291 int predictor_coef_num,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
292 int predictor_quantitization)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
293 {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
294 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
295
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
296 /* first sample always copies */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
297 *buffer_out = *error_buffer;
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 if (!predictor_coef_num) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
300 if (output_size <= 1) return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
301 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
302 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
303 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
304
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
305 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
306 /* second-best case scenario for fir decompression,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
307 * 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
308 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
309 if (output_size <= 1) return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
310 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
311 int32_t prev_value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
312 int32_t error_value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
313
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
314 prev_value = buffer_out[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
315 error_value = error_buffer[i+1];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
316 buffer_out[i+1] = SIGN_EXTENDED32((prev_value + error_value), readsamplesize);
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 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
319 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
320
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
321 /* read warm-up samples */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
322 if (predictor_coef_num > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
323 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
324 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
325 int32_t 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 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
328
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
329 val = SIGN_EXTENDED32(val, readsamplesize);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
330
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
331 buffer_out[i+1] = val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
332 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
333 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
334
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
335 #if 0
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
336 /* 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
337 * should be unrolled and optimised
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
338 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
339 if (predictor_coef_num == 4) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
340 /* FIXME: optimised general case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
341 return;
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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
344 if (predictor_coef_table == 8) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
345 /* FIXME: optimised general case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
346 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
347 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
348 #endif
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
349
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 /* general case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
352 if (predictor_coef_num > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
353 for (i = predictor_coef_num + 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
354 i < output_size;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
355 i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
356 int j;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
357 int sum = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
358 int outval;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
359 int error_val = error_buffer[i];
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 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
362 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
363 predictor_coef_table[j];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
364 }
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 outval = (1 << (predictor_quantitization-1)) + sum;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
367 outval = outval >> predictor_quantitization;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
368 outval = outval + buffer_out[0] + error_val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
369 outval = SIGN_EXTENDED32(outval, readsamplesize);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
370
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
371 buffer_out[predictor_coef_num+1] = outval;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
372
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
373 if (error_val > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
374 int predictor_num = predictor_coef_num - 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
375
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
376 while (predictor_num >= 0 && error_val > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
377 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
378 int sign = SIGN_ONLY(val);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
379
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
380 predictor_coef_table[predictor_num] -= sign;
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 val *= sign; /* absolute value */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
383
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
384 error_val -= ((val >> predictor_quantitization) *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
385 (predictor_coef_num - predictor_num));
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
386
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
387 predictor_num--;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
388 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
389 } else if (error_val < 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
390 int predictor_num = predictor_coef_num - 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
391
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
392 while (predictor_num >= 0 && error_val < 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
393 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
394 int sign = - SIGN_ONLY(val);
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 predictor_coef_table[predictor_num] -= sign;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
397
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
398 val *= sign; /* neg value */
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 error_val -= ((val >> predictor_quantitization) *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
401 (predictor_coef_num - predictor_num));
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
402
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
403 predictor_num--;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
404 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
405 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
406
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
407 buffer_out++;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
408 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
409 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
410 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
411
3347
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3303
diff changeset
412 static void deinterlace_16(int32_t *buffer_a, int32_t *buffer_b,
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
413 int16_t *buffer_out,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
414 int numchannels, int numsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
415 uint8_t interlacing_shift,
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
416 uint8_t interlacing_leftweight)
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
417 {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
418 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
419 if (numsamples <= 0) return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
420
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
421 /* weighted interlacing */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
422 if (interlacing_leftweight) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
423 for (i = 0; i < numsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
424 int32_t difference, midright;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
425 int16_t left;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
426 int16_t right;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
427
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
428 midright = buffer_a[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
429 difference = buffer_b[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
430
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
431
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
432 right = midright - ((difference * interlacing_leftweight) >> interlacing_shift);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
433 left = (midright - ((difference * interlacing_leftweight) >> interlacing_shift))
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
434 + difference;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
435
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
436 buffer_out[i*numchannels] = left;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
437 buffer_out[i*numchannels + 1] = right;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
438 }
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 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
441 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
442
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
443 /* otherwise basic interlacing took place */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
444 for (i = 0; i < numsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
445 int16_t left, right;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
446
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
447 left = buffer_a[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
448 right = buffer_b[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
449
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
450 buffer_out[i*numchannels] = left;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
451 buffer_out[i*numchannels + 1] = right;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
452 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
453 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
454
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
455 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
456 void *outbuffer, int *outputsize,
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
457 uint8_t *inbuffer, int input_buffer_size)
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
458 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
459 ALACContext *alac = avctx->priv_data;
2544
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 int channels;
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
462 int32_t outputsamples;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
463
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
464 /* short-circuit null buffers */
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
465 if (!inbuffer || !input_buffer_size)
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
466 return input_buffer_size;
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
467
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
468 /* initialize from the extradata */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
469 if (!alac->context_initialized) {
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
470 if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
471 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
472 ALAC_EXTRADATA_SIZE);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
473 return input_buffer_size;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
474 }
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
475 alac_set_info(alac);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
476 alac->context_initialized = 1;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
477 }
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
478
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
479 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
480
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
481 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
482
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
483 channels = get_bits(&alac->gb, 3);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
484
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
485 *outputsize = outputsamples * alac->bytespersample;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
486
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
487 switch(channels) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
488 case 0: { /* 1 channel */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
489 int hassize;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
490 int isnotcompressed;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
491 int readsamplesize;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
492
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
493 int wasted_bytes;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
494 int ricemodifier;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
495
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
496
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
497 /* 2^result = something to do with output waiting.
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
498 * perhaps matters if we read > 1 frame in a pass?
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
499 */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
500 get_bits(&alac->gb, 4);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
501
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
502 get_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
503
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
504 hassize = get_bits(&alac->gb, 1); /* the output sample size is stored soon */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
505
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
506 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
507
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
508 isnotcompressed = get_bits(&alac->gb, 1); /* whether the frame is compressed */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
509
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
510 if (hassize) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
511 /* now read the number of samples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
512 * as a 32bit integer */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
513 outputsamples = get_bits(&alac->gb, 32);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
514 *outputsize = outputsamples * alac->bytespersample;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
515 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
516
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
517 readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
518
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
519 if (!isnotcompressed) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
520 /* so it is compressed */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
521 int16_t predictor_coef_table[32];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
522 int predictor_coef_num;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
523 int prediction_type;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
524 int prediction_quantitization;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
525 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
526
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
527 /* FIXME: skip 16 bits, not sure what they are. seem to be used in
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
528 * two channel case */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
529 get_bits(&alac->gb, 8);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
530 get_bits(&alac->gb, 8);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
531
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
532 prediction_type = get_bits(&alac->gb, 4);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
533 prediction_quantitization = get_bits(&alac->gb, 4);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
534
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
535 ricemodifier = get_bits(&alac->gb, 3);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
536 predictor_coef_num = get_bits(&alac->gb, 5);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
537
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
538 /* read the predictor table */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
539 for (i = 0; i < predictor_coef_num; i++) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
540 predictor_coef_table[i] = (int16_t)get_bits(&alac->gb, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
541 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
543 if (wasted_bytes) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
544 /* these bytes seem to have something to do with
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
545 * > 2 channel files.
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
546 */
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
547 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
548 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
549
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
550 bastardized_rice_decompress(alac,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
551 alac->predicterror_buffer_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
552 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
553 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
554 alac->setinfo_rice_initialhistory,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
555 alac->setinfo_rice_kmodifier,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
556 ricemodifier * alac->setinfo_rice_historymult / 4,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
557 (1 << alac->setinfo_rice_kmodifier) - 1);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
558
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
559 if (prediction_type == 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
560 /* adaptive fir */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
561 predictor_decompress_fir_adapt(alac->predicterror_buffer_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
562 alac->outputsamples_buffer_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
563 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
564 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
565 predictor_coef_table,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
566 predictor_coef_num,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
567 prediction_quantitization);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
568 } else {
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
569 av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
570 /* i think the only other prediction type (or perhaps this is just a
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
571 * boolean?) runs adaptive fir twice.. like:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
572 * predictor_decompress_fir_adapt(predictor_error, tempout, ...)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
573 * predictor_decompress_fir_adapt(predictor_error, outputsamples ...)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
574 * little strange..
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
575 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
576 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
577
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
578 } else {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
579 /* not compressed, easy case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
580 if (readsamplesize <= 16) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
581 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
582 for (i = 0; i < outputsamples; i++) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
583 int32_t audiobits = get_bits(&alac->gb, readsamplesize);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
584
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
585 audiobits = SIGN_EXTENDED32(audiobits, readsamplesize);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
586
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
587 alac->outputsamples_buffer_a[i] = audiobits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
588 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
589 } else {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
590 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
591 for (i = 0; i < outputsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
592 int32_t audiobits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
593
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
594 audiobits = get_bits(&alac->gb, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
595 /* special case of sign extension..
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
596 * as we'll be ORing the low 16bits into this */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
597 audiobits = audiobits << 16;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
598 audiobits = audiobits >> (32 - readsamplesize);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
599
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
600 audiobits |= get_bits(&alac->gb, readsamplesize - 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
601
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
602 alac->outputsamples_buffer_a[i] = audiobits;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
603 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
604 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
605 /* wasted_bytes = 0; // unused */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
606 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
607
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
608 switch(alac->setinfo_sample_size) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
609 case 16: {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
610 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
611 for (i = 0; i < outputsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
612 int16_t sample = alac->outputsamples_buffer_a[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
613 ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
614 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
615 break;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
616 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
617 case 20:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
618 case 24:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
619 case 32:
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
620 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
621 break;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
622 default:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
623 break;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
624 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
625 break;
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 case 1: { /* 2 channels */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
628 int hassize;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
629 int isnotcompressed;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
630 int readsamplesize;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
631
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
632 int wasted_bytes;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
633
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
634 uint8_t interlacing_shift;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
635 uint8_t interlacing_leftweight;
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 /* 2^result = something to do with output waiting.
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
638 * perhaps matters if we read > 1 frame in a pass?
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
639 */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
640 get_bits(&alac->gb, 4);
2542
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 get_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
643
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
644 hassize = get_bits(&alac->gb, 1); /* the output sample size is stored soon */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
645
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
646 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
647
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
648 isnotcompressed = get_bits(&alac->gb, 1); /* whether the frame is compressed */
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 if (hassize) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
651 /* now read the number of samples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
652 * as a 32bit integer */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
653 outputsamples = get_bits(&alac->gb, 32);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
654 *outputsize = outputsamples * alac->bytespersample;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
655 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
656
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
657 readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
658
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
659 if (!isnotcompressed) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
660 /* compressed */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
661 int16_t predictor_coef_table_a[32];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
662 int predictor_coef_num_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
663 int prediction_type_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
664 int prediction_quantitization_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
665 int ricemodifier_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
666
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
667 int16_t predictor_coef_table_b[32];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
668 int predictor_coef_num_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
669 int prediction_type_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
670 int prediction_quantitization_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
671 int ricemodifier_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
672
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
673 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
674
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
675 interlacing_shift = get_bits(&alac->gb, 8);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
676 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
677
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
678 /******** channel 1 ***********/
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
679 prediction_type_a = get_bits(&alac->gb, 4);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
680 prediction_quantitization_a = get_bits(&alac->gb, 4);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
681
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
682 ricemodifier_a = get_bits(&alac->gb, 3);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
683 predictor_coef_num_a = get_bits(&alac->gb, 5);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
684
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
685 /* read the predictor table */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
686 for (i = 0; i < predictor_coef_num_a; i++) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
687 predictor_coef_table_a[i] = (int16_t)get_bits(&alac->gb, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
688 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
689
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
690 /******** channel 2 *********/
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
691 prediction_type_b = get_bits(&alac->gb, 4);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
692 prediction_quantitization_b = get_bits(&alac->gb, 4);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
693
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
694 ricemodifier_b = get_bits(&alac->gb, 3);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
695 predictor_coef_num_b = get_bits(&alac->gb, 5);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
696
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
697 /* read the predictor table */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
698 for (i = 0; i < predictor_coef_num_b; i++) {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
699 predictor_coef_table_b[i] = (int16_t)get_bits(&alac->gb, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
700 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
701
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
702 /*********************/
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
703 if (wasted_bytes) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
704 /* see mono case */
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
705 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
706 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
707
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
708 /* channel 1 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
709 bastardized_rice_decompress(alac,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
710 alac->predicterror_buffer_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
711 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
712 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
713 alac->setinfo_rice_initialhistory,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
714 alac->setinfo_rice_kmodifier,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
715 ricemodifier_a * alac->setinfo_rice_historymult / 4,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
716 (1 << alac->setinfo_rice_kmodifier) - 1);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
717
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
718 if (prediction_type_a == 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
719 /* adaptive fir */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
720 predictor_decompress_fir_adapt(alac->predicterror_buffer_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
721 alac->outputsamples_buffer_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
722 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
723 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
724 predictor_coef_table_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
725 predictor_coef_num_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
726 prediction_quantitization_a);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
727 } else {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
728 /* see mono case */
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
729 av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_a);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
730 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
731
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
732 /* channel 2 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
733 bastardized_rice_decompress(alac,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
734 alac->predicterror_buffer_b,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
735 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
736 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
737 alac->setinfo_rice_initialhistory,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
738 alac->setinfo_rice_kmodifier,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
739 ricemodifier_b * alac->setinfo_rice_historymult / 4,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
740 (1 << alac->setinfo_rice_kmodifier) - 1);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
741
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
742 if (prediction_type_b == 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
743 /* adaptive fir */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
744 predictor_decompress_fir_adapt(alac->predicterror_buffer_b,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
745 alac->outputsamples_buffer_b,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
746 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
747 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
748 predictor_coef_table_b,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
749 predictor_coef_num_b,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
750 prediction_quantitization_b);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
751 } else {
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
752 av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_b);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
753 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2782
diff changeset
754 } else {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
755 /* not compressed, easy case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
756 if (alac->setinfo_sample_size <= 16) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
757 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
758 for (i = 0; i < outputsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
759 int32_t audiobits_a, audiobits_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
760
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
761 audiobits_a = get_bits(&alac->gb, alac->setinfo_sample_size);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
762 audiobits_b = get_bits(&alac->gb, alac->setinfo_sample_size);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
763
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
764 audiobits_a = SIGN_EXTENDED32(audiobits_a, alac->setinfo_sample_size);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
765 audiobits_b = SIGN_EXTENDED32(audiobits_b, alac->setinfo_sample_size);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
766
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
767 alac->outputsamples_buffer_a[i] = audiobits_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
768 alac->outputsamples_buffer_b[i] = audiobits_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
769 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
770 } else {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
771 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
772 for (i = 0; i < outputsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
773 int32_t audiobits_a, audiobits_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
774
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
775 audiobits_a = get_bits(&alac->gb, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
776 audiobits_a = audiobits_a << 16;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
777 audiobits_a = audiobits_a >> (32 - alac->setinfo_sample_size);
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
778 audiobits_a |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
779
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
780 audiobits_b = get_bits(&alac->gb, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
781 audiobits_b = audiobits_b << 16;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
782 audiobits_b = audiobits_b >> (32 - alac->setinfo_sample_size);
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
783 audiobits_b |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
784
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
785 alac->outputsamples_buffer_a[i] = audiobits_a;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
786 alac->outputsamples_buffer_b[i] = audiobits_b;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
787 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
788 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
789 /* wasted_bytes = 0; */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
790 interlacing_shift = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
791 interlacing_leftweight = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
792 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
793
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
794 switch(alac->setinfo_sample_size) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
795 case 16: {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
796 deinterlace_16(alac->outputsamples_buffer_a,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
797 alac->outputsamples_buffer_b,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
798 (int16_t*)outbuffer,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
799 alac->numchannels,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
800 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
801 interlacing_shift,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
802 interlacing_leftweight);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
803 break;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
804 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
805 case 20:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
806 case 24:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
807 case 32:
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
808 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
809 break;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
810 default:
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
811 break;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
812 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
813
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
814 break;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
815 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
816 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
817
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
818 return input_buffer_size;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
819 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
820
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
821 static int alac_decode_init(AVCodecContext * avctx)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
822 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
823 ALACContext *alac = avctx->priv_data;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
824 alac->avctx = avctx;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
825 alac->context_initialized = 0;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
826
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
827 alac->samplesize = alac->avctx->bits_per_sample;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
828 alac->numchannels = alac->avctx->channels;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
829 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
830
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
831 return 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
832 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
833
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
834 static int alac_decode_close(AVCodecContext *avctx)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
835 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
836 ALACContext *alac = avctx->priv_data;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
837
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
838 av_free(alac->predicterror_buffer_a);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
839 av_free(alac->predicterror_buffer_b);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
840
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
841 av_free(alac->outputsamples_buffer_a);
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
842 av_free(alac->outputsamples_buffer_b);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
843
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
844 return 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
845 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
846
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
847 AVCodec alac_decoder = {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
848 "alac",
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
849 CODEC_TYPE_AUDIO,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
850 CODEC_ID_ALAC,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
851 sizeof(ALACContext),
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
852 alac_decode_init,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
853 NULL,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
854 alac_decode_close,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
855 alac_decode_frame,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
856 };