annotate alac.c @ 6693:6f13852a9161 libavcodec

Skip blocks in B-frames reuse motion vectors from next reference frame. So if referenced blocks is 16x8, 8x16 or 8x8 partitions, skip block will have them too.
author kostya
date Sat, 26 Apr 2008 13:09:36 +0000
parents 25a963680a88
children a4104482ceef
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 numchannels;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
72 int bytespersample;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
73
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
74 /* buffers */
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
75 int32_t *predicterror_buffer[MAX_CHANNELS];
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
76
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
77 int32_t *outputsamples_buffer[MAX_CHANNELS];
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
78
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
79 /* stuff from setinfo */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
80 uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
81 uint8_t setinfo_sample_size; /* 0x10 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
82 uint8_t setinfo_rice_historymult; /* 0x28 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
83 uint8_t setinfo_rice_initialhistory; /* 0x0a */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
84 uint8_t setinfo_rice_kmodifier; /* 0x0e */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
85 /* end setinfo stuff */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
86
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
87 } ALACContext;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
88
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
89 static void allocate_buffers(ALACContext *alac)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
90 {
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
91 int chan;
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
92 for (chan = 0; chan < MAX_CHANNELS; chan++) {
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
93 alac->predicterror_buffer[chan] =
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
94 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
95
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
96 alac->outputsamples_buffer[chan] =
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
97 av_malloc(alac->setinfo_max_samples_per_frame * 4);
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
98 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
99 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
100
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
101 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
102 {
6221
michael
parents: 5963
diff changeset
103 const unsigned char *ptr = alac->avctx->extradata;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
104
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
105 ptr += 4; /* size */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
106 ptr += 4; /* alac */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
107 ptr += 4; /* 0 ? */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
108
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4226
diff changeset
109 if(AV_RB32(ptr) >= UINT_MAX/4){
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
110 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
111 return -1;
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
112 }
5276
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
113
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
114 /* buffer size / 2 ? */
0d71d658b19f Use proper bytestream functions
vitor
parents: 5272
diff changeset
115 alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr);
6634
981e2f43ea36 10l: my last commit broke compilation and introduced warnings
vitor
parents: 6633
diff changeset
116 ptr++; /* ??? */
5360
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
117 alac->setinfo_sample_size = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
118 alac->setinfo_rice_historymult = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
119 alac->setinfo_rice_initialhistory = *ptr++;
6648c82e15c7 Cosmetics: alignment
vitor
parents: 5359
diff changeset
120 alac->setinfo_rice_kmodifier = *ptr++;
6634
981e2f43ea36 10l: my last commit broke compilation and introduced warnings
vitor
parents: 6633
diff changeset
121 ptr++; /* channels? */
6633
f1674aac3a1a Remove unneeded variables from context
vitor
parents: 6632
diff changeset
122 bytestream_get_be16(&ptr); /* ??? */
f1674aac3a1a Remove unneeded variables from context
vitor
parents: 6632
diff changeset
123 bytestream_get_be32(&ptr); /* max coded frame size */
f1674aac3a1a Remove unneeded variables from context
vitor
parents: 6632
diff changeset
124 bytestream_get_be32(&ptr); /* bitrate ? */
6634
981e2f43ea36 10l: my last commit broke compilation and introduced warnings
vitor
parents: 6633
diff changeset
125 bytestream_get_be32(&ptr); /* samplerate */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
126
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
127 allocate_buffers(alac);
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
128
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3299
diff changeset
129 return 0;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
130 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
131
6626
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
132 static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsamplesize){
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
133 /* read x - number of 1s before 0 represent the rice */
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
134 int x = get_unary_0_9(gb);
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
135
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
136 if (x > 8) { /* RICE THRESHOLD */
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
137 /* use alternative encoding */
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
138 x = get_bits(gb, readsamplesize);
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
139 } else {
6627
michael
parents: 6626
diff changeset
140 if (k >= limit)
michael
parents: 6626
diff changeset
141 k = limit;
6625
1f4a86db7835 Factorize decode_postfix() out.
michael
parents: 6624
diff changeset
142
6627
michael
parents: 6626
diff changeset
143 if (k != 1) {
michael
parents: 6626
diff changeset
144 int extrabits = show_bits(gb, k);
6625
1f4a86db7835 Factorize decode_postfix() out.
michael
parents: 6624
diff changeset
145
6627
michael
parents: 6626
diff changeset
146 /* multiply x by 2^k - 1, as part of their strange algorithm */
michael
parents: 6626
diff changeset
147 x = (x << k) - x;
6625
1f4a86db7835 Factorize decode_postfix() out.
michael
parents: 6624
diff changeset
148
6627
michael
parents: 6626
diff changeset
149 if (extrabits > 1) {
michael
parents: 6626
diff changeset
150 x += extrabits - 1;
michael
parents: 6626
diff changeset
151 skip_bits(gb, k);
michael
parents: 6626
diff changeset
152 } else
michael
parents: 6626
diff changeset
153 skip_bits(gb, k - 1);
michael
parents: 6626
diff changeset
154 }
6626
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
155 }
6625
1f4a86db7835 Factorize decode_postfix() out.
michael
parents: 6624
diff changeset
156 return x;
1f4a86db7835 Factorize decode_postfix() out.
michael
parents: 6624
diff changeset
157 }
1f4a86db7835 Factorize decode_postfix() out.
michael
parents: 6624
diff changeset
158
3071
cc0357a90e8f make some functions static (patch by Dieter < freebsd at sopwith.solgatos.com >)
aurel
parents: 3036
diff changeset
159 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
160 int32_t *output_buffer,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
161 int output_size,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
162 int readsamplesize, /* arg_10 */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
163 int rice_initialhistory, /* arg424->b */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
164 int rice_kmodifier, /* arg424->d */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
165 int rice_historymult, /* arg424->c */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
166 int rice_kmodifier_mask /* arg424->e */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
167 )
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
168 {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
169 int output_count;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
170 unsigned int history = rice_initialhistory;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
171 int sign_modifier = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
172
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
173 for (output_count = 0; output_count < output_size; output_count++) {
5628
cf88751d8ab7 Remove reimplementation of get_unary.
vitor
parents: 5625
diff changeset
174 int32_t x;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
175 int32_t x_modified;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
176 int32_t final_val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
177
6627
michael
parents: 6626
diff changeset
178 /* standard rice encoding */
michael
parents: 6626
diff changeset
179 int k; /* size of extra bits */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
180
6627
michael
parents: 6626
diff changeset
181 /* read k, that is bits as is */
6632
4aa644a88500 Remove wrapper around av_log2()
vitor
parents: 6627
diff changeset
182 k = av_log2((history >> 9) + 3);
6627
michael
parents: 6626
diff changeset
183 x= decode_scalar(&alac->gb, k, rice_kmodifier, readsamplesize);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
184
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
185 x_modified = sign_modifier + x;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
186 final_val = (x_modified + 1) / 2;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
187 if (x_modified & 1) final_val *= -1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
188
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
189 output_buffer[output_count] = final_val;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
190
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
191 sign_modifier = 0;
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 /* now update the history */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
194 history += x_modified * rice_historymult
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
195 - ((history * rice_historymult) >> 9);
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 if (x_modified > 0xffff)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
198 history = 0xffff;
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 /* 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
201 if ((history < 128) && (output_count+1 < output_size)) {
6626
a2f1a461dac6 Factorize more code.
michael
parents: 6625
diff changeset
202 int block_size, 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 sign_modifier = 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
205
6632
4aa644a88500 Remove wrapper around av_log2()
vitor
parents: 6627
diff changeset
206 k = 7 - av_log2(history) + ((history + 16) >> 6 /* / 64 */);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
207
6627
michael
parents: 6626
diff changeset
208 block_size= decode_scalar(&alac->gb, k, rice_kmodifier, 16);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
209
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
210 if (block_size > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
211 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
212 output_count += block_size;
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 if (block_size > 0xffff)
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
216 sign_modifier = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
217
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
218 history = 0;
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 }
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
5617
4051bdeecabf Rename function
vitor
parents: 5616
diff changeset
223 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
224 {
cb5999c836af Replace two #define's by inline functions
vitor
parents: 5518
diff changeset
225 return (val << (32 - bits)) >> (32 - bits);
cb5999c836af Replace two #define's by inline functions
vitor
parents: 5518
diff changeset
226 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
227
5616
cb5999c836af Replace two #define's by inline functions
vitor
parents: 5518
diff changeset
228 static inline int sign_only(int v)
cb5999c836af Replace two #define's by inline functions
vitor
parents: 5518
diff changeset
229 {
cb5999c836af Replace two #define's by inline functions
vitor
parents: 5518
diff changeset
230 return v ? FFSIGN(v) : 0;
cb5999c836af Replace two #define's by inline functions
vitor
parents: 5518
diff changeset
231 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
232
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
233 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
234 int32_t *buffer_out,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
235 int output_size,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
236 int readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
237 int16_t *predictor_coef_table,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
238 int predictor_coef_num,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
239 int predictor_quantitization)
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 int i;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
242
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
243 /* first sample always copies */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
244 *buffer_out = *error_buffer;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
245
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
246 if (!predictor_coef_num) {
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
247 if (output_size <= 1)
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
248 return;
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
249
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
250 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
251 return;
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 (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
255 /* second-best case scenario for fir decompression,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
256 * 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
257 */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
258 if (output_size <= 1)
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
259 return;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
260 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
261 int32_t prev_value;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
262 int32_t error_value;
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 prev_value = buffer_out[i];
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
265 error_value = error_buffer[i+1];
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
266 buffer_out[i+1] =
5617
4051bdeecabf Rename function
vitor
parents: 5616
diff changeset
267 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
268 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
269 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
270 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
271
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
272 /* read warm-up samples */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
273 if (predictor_coef_num > 0)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
274 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
275 int32_t val;
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 val = buffer_out[i] + error_buffer[i+1];
5617
4051bdeecabf Rename function
vitor
parents: 5616
diff changeset
278 val = extend_sign32(val, readsamplesize);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
279 buffer_out[i+1] = val;
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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
282 #if 0
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
283 /* 4 and 8 are very common cases (the only ones i've seen). these
5963
80103098c797 spelling
vitor
parents: 5628
diff changeset
284 * should be unrolled and optimized
2542
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 if (predictor_coef_num == 4) {
5963
80103098c797 spelling
vitor
parents: 5628
diff changeset
287 /* FIXME: optimized general case */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
288 return;
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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
291 if (predictor_coef_table == 8) {
5963
80103098c797 spelling
vitor
parents: 5628
diff changeset
292 /* FIXME: optimized general case */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
293 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
294 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
295 #endif
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 /* general case */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
298 if (predictor_coef_num > 0) {
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
299 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
300 int j;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
301 int sum = 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
302 int outval;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
303 int error_val = error_buffer[i];
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 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
306 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
307 predictor_coef_table[j];
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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
310 outval = (1 << (predictor_quantitization-1)) + sum;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
311 outval = outval >> predictor_quantitization;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
312 outval = outval + buffer_out[0] + error_val;
5617
4051bdeecabf Rename function
vitor
parents: 5616
diff changeset
313 outval = extend_sign32(outval, readsamplesize);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
314
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
315 buffer_out[predictor_coef_num+1] = outval;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
316
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
317 if (error_val > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
318 int predictor_num = predictor_coef_num - 1;
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 while (predictor_num >= 0 && error_val > 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
321 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
322 int sign = sign_only(val);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
323
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
324 predictor_coef_table[predictor_num] -= sign;
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 val *= sign; /* absolute value */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
327
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
328 error_val -= ((val >> predictor_quantitization) *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
329 (predictor_coef_num - predictor_num));
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 predictor_num--;
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 } else if (error_val < 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
334 int predictor_num = predictor_coef_num - 1;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
335
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
336 while (predictor_num >= 0 && error_val < 0) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
337 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
338 int sign = - sign_only(val);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
339
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
340 predictor_coef_table[predictor_num] -= sign;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
341
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
342 val *= sign; /* neg value */
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 error_val -= ((val >> predictor_quantitization) *
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
345 (predictor_coef_num - predictor_num));
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
346
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
347 predictor_num--;
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 }
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 buffer_out++;
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 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
355
5504
06956c599c4d Rename function
vitor
parents: 5400
diff changeset
356 static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS],
5505
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
357 int16_t *buffer_out,
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
358 int numchannels, int numsamples,
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
359 uint8_t interlacing_shift,
5d1dd4849a15 Cosmetics: indentation
vitor
parents: 5504
diff changeset
360 uint8_t interlacing_leftweight)
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
361 {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
362 int i;
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
363 if (numsamples <= 0)
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
364 return;
2542
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 /* weighted interlacing */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
367 if (interlacing_leftweight) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
368 for (i = 0; i < numsamples; i++) {
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
369 int32_t a, b;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
370
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
371 a = buffer[0][i];
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
372 b = buffer[1][i];
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
373
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
374 a -= (b * interlacing_leftweight) >> interlacing_shift;
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
375 b += a;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
376
5372
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
377 buffer_out[i*numchannels] = b;
04a9bb415804 Another minor simplification
vitor
parents: 5368
diff changeset
378 buffer_out[i*numchannels + 1] = a;
2542
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
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
381 return;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
382 }
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 /* otherwise basic interlacing took place */
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
385 for (i = 0; i < numsamples; i++) {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
386 int16_t left, right;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
387
5368
a31f6ae7e83d Make deinterlace_16 receive an array as a parameter and not two separated vars
vitor
parents: 5367
diff changeset
388 left = buffer[0][i];
a31f6ae7e83d Make deinterlace_16 receive an array as a parameter and not two separated vars
vitor
parents: 5367
diff changeset
389 right = buffer[1][i];
2542
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 buffer_out[i*numchannels] = left;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
392 buffer_out[i*numchannels + 1] = right;
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
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
396 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
397 void *outbuffer, int *outputsize,
6221
michael
parents: 5963
diff changeset
398 const uint8_t *inbuffer, int input_buffer_size)
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
399 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
400 ALACContext *alac = avctx->priv_data;
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
401
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
402 int channels;
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
403 int32_t outputsamples;
5271
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
404 int hassize;
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
405 int readsamplesize;
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
406 int wasted_bytes;
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
407 int isnotcompressed;
5358
f3a26c190f9a Move var. declaration to allow further clean up
vitor
parents: 5357
diff changeset
408 uint8_t interlacing_shift;
f3a26c190f9a Move var. declaration to allow further clean up
vitor
parents: 5357
diff changeset
409 uint8_t interlacing_leftweight;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
410
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
411 /* short-circuit null buffers */
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
412 if (!inbuffer || !input_buffer_size)
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
413 return input_buffer_size;
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
414
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
415 /* initialize from the extradata */
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
416 if (!alac->context_initialized) {
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
417 if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
3135
41a01cea8885 explain extradata and pass avctx to av_log's
alex
parents: 3071
diff changeset
418 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
419 ALAC_EXTRADATA_SIZE);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
420 return input_buffer_size;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
421 }
4226
43ebe9279fa0 fix some potential security issues, patch by Matthias Hopf, mat at mshopf dot de
bcoudurier
parents: 3947
diff changeset
422 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
423 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
424 return input_buffer_size;
43ebe9279fa0 fix some potential security issues, patch by Matthias Hopf, mat at mshopf dot de
bcoudurier
parents: 3947
diff changeset
425 }
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
426 alac->context_initialized = 1;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
427 }
2543
e8f1f57215ad do not use a variable before proper initialization
melanson
parents: 2542
diff changeset
428
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
429 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
430
5298
e00f7048c50c Make "channels" variable mean the number of channels, not the number of
vitor
parents: 5292
diff changeset
431 channels = get_bits(&alac->gb, 3) + 1;
5362
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
432 if (channels > MAX_CHANNELS) {
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
433 av_log(avctx, AV_LOG_ERROR, "channels > %d not supported\n",
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
434 MAX_CHANNELS);
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
435 return input_buffer_size;
e0b7c248c33e Test for supported number of channels
vitor
parents: 5361
diff changeset
436 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
437
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
438 /* 2^result = something to do with output waiting.
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
439 * perhaps matters if we read > 1 frame in a pass?
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
440 */
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
441 skip_bits(&alac->gb, 4);
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
442
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
443 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
444
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
445 /* the output sample size is stored soon */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5506
diff changeset
446 hassize = get_bits1(&alac->gb);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
447
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
448 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
449
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
450 /* whether the frame is compressed */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5506
diff changeset
451 isnotcompressed = get_bits1(&alac->gb);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
452
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
453 if (hassize) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
454 /* now read the number of samples as a 32bit integer */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
455 outputsamples = get_bits(&alac->gb, 32);
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
456 } else
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
457 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
458
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
459 *outputsize = outputsamples * alac->bytespersample;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
460 readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + channels - 1;
5271
289e5c2a9c98 Remove some duplicated code
vitor
parents: 5267
diff changeset
461
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
462 if (!isnotcompressed) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
463 /* so it is compressed */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
464 int16_t predictor_coef_table[channels][32];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
465 int predictor_coef_num[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
466 int prediction_type[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
467 int prediction_quantitization[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
468 int ricemodifier[channels];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
469 int i, chan;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
470
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
471 interlacing_shift = get_bits(&alac->gb, 8);
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
472 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
473
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
474 for (chan = 0; chan < channels; chan++) {
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
475 prediction_type[chan] = get_bits(&alac->gb, 4);
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
476 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
477
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
478 ricemodifier[chan] = get_bits(&alac->gb, 3);
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
479 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
480
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
481 /* read the predictor table */
5365
8feb956bdbee More cosmetics
vitor
parents: 5364
diff changeset
482 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
483 predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16);
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
484 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
485
5400
2433e0070455 Minor cosmetics
vitor
parents: 5372
diff changeset
486 if (wasted_bytes)
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
487 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
488
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
489 for (chan = 0; chan < channels; chan++) {
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
490 bastardized_rice_decompress(alac,
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
491 alac->predicterror_buffer[chan],
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
492 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
493 readsamplesize,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
494 alac->setinfo_rice_initialhistory,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
495 alac->setinfo_rice_kmodifier,
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
496 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
497 (1 << alac->setinfo_rice_kmodifier) - 1);
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
498
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
499 if (prediction_type[chan] == 0) {
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
500 /* adaptive fir */
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
501 predictor_decompress_fir_adapt(alac->predicterror_buffer[chan],
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
502 alac->outputsamples_buffer[chan],
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
503 outputsamples,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
504 readsamplesize,
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
505 predictor_coef_table[chan],
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
506 predictor_coef_num[chan],
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
507 prediction_quantitization[chan]);
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
508 } else {
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
509 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
510 /* I think the only other prediction type (or perhaps this is
59a9c1e471fc Yet more cosmetics
vitor
parents: 5365
diff changeset
511 * 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
512 * predictor_decompress_fir_adapt(predictor_error, tempout, ...)
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
513 * predictor_decompress_fir_adapt(predictor_error, outputsamples ...)
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
514 * little strange..
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
515 */
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
516 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
517 }
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
518 } else {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
519 /* not compressed, easy case */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
520 if (alac->setinfo_sample_size <= 16) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
521 int i, chan;
5366
59a9c1e471fc Yet more cosmetics
vitor
parents: 5365
diff changeset
522 for (chan = 0; chan < channels; chan++)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
523 for (i = 0; i < outputsamples; i++) {
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
524 int32_t audiobits;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
525
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
526 audiobits = get_bits(&alac->gb, alac->setinfo_sample_size);
5617
4051bdeecabf Rename function
vitor
parents: 5616
diff changeset
527 audiobits = extend_sign32(audiobits, readsamplesize);
5359
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
528
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
529 alac->outputsamples_buffer[chan][i] = audiobits;
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
530 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
531 } else {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
532 int i, chan;
5366
59a9c1e471fc Yet more cosmetics
vitor
parents: 5365
diff changeset
533 for (chan = 0; chan < channels; chan++)
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
534 for (i = 0; i < outputsamples; i++) {
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
535 int32_t audiobits;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
536
5357
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
537 audiobits = get_bits(&alac->gb, 16);
5359
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
538 /* special case of sign extension..
4743a1e95531 Remove more code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5358
diff changeset
539 * 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
540 audiobits = audiobits << 16;
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
541 audiobits = audiobits >> (32 - alac->setinfo_sample_size);
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
542 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
543
07c6fa478918 Remove code duplication. Based on a patch by Matthieu Castet.
vitor
parents: 5298
diff changeset
544 alac->outputsamples_buffer[chan][i] = audiobits;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
545 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
546 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
547 /* wasted_bytes = 0; */
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
548 interlacing_shift = 0;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
549 interlacing_leftweight = 0;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
550 }
6641
25a963680a88 check alac EOF marker
benoit
parents: 6635
diff changeset
551 if (get_bits(&alac->gb, 3) != 7)
25a963680a88 check alac EOF marker
benoit
parents: 6635
diff changeset
552 av_log(avctx, AV_LOG_ERROR, "Error : Wrong End Of Frame\n");
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
553
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
554 switch(alac->setinfo_sample_size) {
5400
2433e0070455 Minor cosmetics
vitor
parents: 5372
diff changeset
555 case 16:
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
556 if (channels == 2) {
5504
06956c599c4d Rename function
vitor
parents: 5400
diff changeset
557 reconstruct_stereo_16(alac->outputsamples_buffer,
5506
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
558 (int16_t*)outbuffer,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
559 alac->numchannels,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
560 outputsamples,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
561 interlacing_shift,
737a4c7266da More indentation
vitor
parents: 5505
diff changeset
562 interlacing_leftweight);
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
563 } else {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
564 int i;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
565 for (i = 0; i < outputsamples; i++) {
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
566 int16_t sample = alac->outputsamples_buffer[0][i];
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
567 ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
568 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
569 }
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
570 break;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
571 case 20:
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
572 case 24:
5624
27612e429508 Comment about unsupported sample size
vitor
parents: 5617
diff changeset
573 // 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
574 // files. iTunes convert 24 bit raw files to 16 bit before encoding.
5361
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
575 case 32:
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
576 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
577 break;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
578 default:
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
579 break;
3c0a5cb7fc6b Cosmetics: indentation
vitor
parents: 5360
diff changeset
580 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
581
6641
25a963680a88 check alac EOF marker
benoit
parents: 6635
diff changeset
582 if (input_buffer_size * 8 - get_bits_count(&alac->gb) > 8)
25a963680a88 check alac EOF marker
benoit
parents: 6635
diff changeset
583 av_log(avctx, AV_LOG_ERROR, "Error : %d bits left\n", input_buffer_size * 8 - get_bits_count(&alac->gb));
25a963680a88 check alac EOF marker
benoit
parents: 6635
diff changeset
584
2544
8c426f5a09ae decoder works fine now, when fed properly-sized chunks by the demuxer;
melanson
parents: 2543
diff changeset
585 return input_buffer_size;
2542
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
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6221
diff changeset
588 static av_cold int alac_decode_init(AVCodecContext * avctx)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
589 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
590 ALACContext *alac = avctx->priv_data;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
591 alac->avctx = avctx;
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
592 alac->context_initialized = 0;
2542
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 alac->numchannels = alac->avctx->channels;
6635
b3d2659c756b Remove another unneeded var from context
vitor
parents: 6634
diff changeset
595 alac->bytespersample = (avctx->bits_per_sample / 8) * alac->numchannels;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
596
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
597 return 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
598 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
599
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6221
diff changeset
600 static av_cold int alac_decode_close(AVCodecContext *avctx)
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
601 {
2559
7d8ba28e18d9 replace custom bit-reading functions with FFmpeg's internal function;
melanson
parents: 2546
diff changeset
602 ALACContext *alac = avctx->priv_data;
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
603
5272
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
604 int chan;
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
605 for (chan = 0; chan < MAX_CHANNELS; chan++) {
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
606 av_free(alac->predicterror_buffer[chan]);
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
607 av_free(alac->outputsamples_buffer[chan]);
b51c25603164 Prepare to remove more duplicated code
vitor
parents: 5271
diff changeset
608 }
2542
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
609
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
610 return 0;
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
611 }
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
612
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
613 AVCodec alac_decoder = {
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
614 "alac",
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
615 CODEC_TYPE_AUDIO,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
616 CODEC_ID_ALAC,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
617 sizeof(ALACContext),
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
618 alac_decode_init,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
619 NULL,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
620 alac_decode_close,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
621 alac_decode_frame,
a27a580f292e first pass at ALAC decoder from David Hammerton; while David's original
melanson
parents:
diff changeset
622 };