annotate alac.c @ 5757:ace63c809071 libavcodec

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