annotate apedec.c @ 6443:e3adb7e96812 libavcodec

Detect and prevent reading over the end of counts_*. We pass the error through a context variable as this is simpler and i think also faster, but the return value of functions could be used instead of course. The code also ensures as a side effect that the AC decoder state does not become invalid. This fixes all known crashes. And outputs nothing in case of an error instead of random noise.
author michael
date Tue, 04 Mar 2008 21:58:34 +0000
parents 28e45bf84973
children 3572cc5bc8ff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
1 /*
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
2 * Monkey's Audio lossless audio decoder
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Benjamin Zores <ben@geexbox.org>
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
4 * based upon libdemac from Dave Chapman.
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
5 *
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
6 * This file is part of FFmpeg.
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
7 *
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
12 *
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
16 * Lesser General Public License for more details.
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
17 *
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
21 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
22
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
23 #define ALT_BITSTREAM_READER_LE
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
24 #include "avcodec.h"
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
25 #include "dsputil.h"
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
26 #include "bitstream.h"
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
27 #include "bytestream.h"
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
28
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
29 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
30 * @file apedec.c
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
31 * Monkey's Audio lossless audio decoder
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
32 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
33
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
34 #define BLOCKS_PER_LOOP 4608
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
35 #define MAX_CHANNELS 2
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
36 #define MAX_BYTESPERSAMPLE 3
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
37
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
38 #define APE_FRAMECODE_MONO_SILENCE 1
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
39 #define APE_FRAMECODE_STEREO_SILENCE 3
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
40 #define APE_FRAMECODE_PSEUDO_STEREO 4
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
41
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
42 #define HISTORY_SIZE 512
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
43 #define PREDICTOR_ORDER 8
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
44 /** Total size of all predictor histories */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
45 #define PREDICTOR_SIZE 50
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
46
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
47 #define YDELAYA (18 + PREDICTOR_ORDER*4)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
48 #define YDELAYB (18 + PREDICTOR_ORDER*3)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
49 #define XDELAYA (18 + PREDICTOR_ORDER*2)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
50 #define XDELAYB (18 + PREDICTOR_ORDER)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
51
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
52 #define YADAPTCOEFFSA 18
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
53 #define XADAPTCOEFFSA 14
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
54 #define YADAPTCOEFFSB 10
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
55 #define XADAPTCOEFFSB 5
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
56
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
57 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
58 * Possible compression levels
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
59 * @{
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
60 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
61 enum APECompressionLevel {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
62 COMPRESSION_LEVEL_FAST = 1000,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
63 COMPRESSION_LEVEL_NORMAL = 2000,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
64 COMPRESSION_LEVEL_HIGH = 3000,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
65 COMPRESSION_LEVEL_EXTRA_HIGH = 4000,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
66 COMPRESSION_LEVEL_INSANE = 5000
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
67 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
68 /** @} */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
69
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
70 #define APE_FILTER_LEVELS 3
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
71
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
72 /** Filter orders depending on compression level */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
73 static const uint16_t ape_filter_orders[5][APE_FILTER_LEVELS] = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
74 { 0, 0, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
75 { 16, 0, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
76 { 64, 0, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
77 { 32, 256, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
78 { 16, 256, 1280 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
79 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
80
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
81 /** Filter fraction bits depending on compression level */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
82 static const uint16_t ape_filter_fracbits[5][APE_FILTER_LEVELS] = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
83 { 0, 0, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
84 { 11, 0, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
85 { 11, 0, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
86 { 10, 13, 0 },
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
87 { 11, 13, 15 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
88 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
89
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
90
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
91 /** Filters applied to the decoded data */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
92 typedef struct APEFilter {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
93 int16_t *coeffs; ///< actual coefficients used in filtering
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
94 int16_t *adaptcoeffs; ///< adaptive filter coefficients used for correcting of actual filter coefficients
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
95 int16_t *historybuffer; ///< filter memory
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
96 int16_t *delay; ///< filtered values
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
97
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
98 int avg;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
99 } APEFilter;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
100
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
101 typedef struct APERice {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
102 uint32_t k;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
103 uint32_t ksum;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
104 } APERice;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
105
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
106 typedef struct APERangecoder {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
107 uint32_t low; ///< low end of interval
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
108 uint32_t range; ///< length of interval
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
109 uint32_t help; ///< bytes_to_follow resp. intermediate value
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
110 unsigned int buffer; ///< buffer for input/output
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
111 } APERangecoder;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
112
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
113 /** Filter histories */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
114 typedef struct APEPredictor {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
115 int32_t *buf;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
116
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
117 int32_t lastA[2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
118
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
119 int32_t filterA[2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
120 int32_t filterB[2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
121
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
122 int32_t coeffsA[2][4]; ///< adaption coefficients
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
123 int32_t coeffsB[2][5]; ///< adaption coefficients
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
124 int32_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
125 } APEPredictor;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
126
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
127 /** Decoder context */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
128 typedef struct APEContext {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
129 AVCodecContext *avctx;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
130 DSPContext dsp;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
131 int channels;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
132 int samples; ///< samples left to decode in current frame
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
133
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
134 int fileversion; ///< codec version, very important in decoding process
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
135 int compression_level; ///< compression levels
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
136 int fset; ///< which filter set to use (calculated from compression level)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
137 int flags; ///< global decoder flags
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
138
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
139 uint32_t CRC; ///< frame CRC
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
140 int frameflags; ///< frame flags
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
141 int currentframeblocks; ///< samples (per channel) in current frame
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
142 int blocksdecoded; ///< count of decoded samples in current frame
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
143 APEPredictor predictor; ///< predictor used for final reconstruction
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
144
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
145 int32_t decoded0[BLOCKS_PER_LOOP]; ///< decoded data for the first channel
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
146 int32_t decoded1[BLOCKS_PER_LOOP]; ///< decoded data for the second channel
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
147
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
148 int16_t* filterbuf[APE_FILTER_LEVELS]; ///< filter memory
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
149
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
150 APERangecoder rc; ///< rangecoder used to decode actual values
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
151 APERice riceX; ///< rice code parameters for the second channel
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
152 APERice riceY; ///< rice code parameters for the first channel
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
153 APEFilter filters[APE_FILTER_LEVELS][2]; ///< filters used for reconstruction
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
154
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
155 uint8_t *data; ///< current frame data
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
156 uint8_t *data_end; ///< frame data end
6223
michael
parents: 6202
diff changeset
157 const uint8_t *ptr; ///< current position in frame data
michael
parents: 6202
diff changeset
158 const uint8_t *last_ptr; ///< position where last 4608-sample block ended
6443
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
159
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
160 int error;
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
161 } APEContext;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
162
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
163 // TODO: dsputilize
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
164 static inline void vector_add(int16_t * v1, int16_t * v2, int order)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
165 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
166 while (order--)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
167 *v1++ += *v2++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
168 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
169
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
170 // TODO: dsputilize
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
171 static inline void vector_sub(int16_t * v1, int16_t * v2, int order)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
172 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
173 while (order--)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
174 *v1++ -= *v2++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
175 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
176
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
177 // TODO: dsputilize
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
178 static inline int32_t scalarproduct(int16_t * v1, int16_t * v2, int order)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
179 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
180 int res = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
181
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
182 while (order--)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
183 res += *v1++ * *v2++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
184
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
185 return res;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
186 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
187
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
188 static int ape_decode_init(AVCodecContext * avctx)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
189 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
190 APEContext *s = avctx->priv_data;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
191 int i;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
192
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
193 if (avctx->extradata_size != 6) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
194 av_log(avctx, AV_LOG_ERROR, "Incorrect extradata\n");
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
195 return -1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
196 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
197 if (avctx->bits_per_sample != 16) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
198 av_log(avctx, AV_LOG_ERROR, "Only 16-bit samples are supported\n");
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
199 return -1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
200 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
201 if (avctx->channels > 2) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
202 av_log(avctx, AV_LOG_ERROR, "Only mono and stereo is supported\n");
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
203 return -1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
204 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
205 s->avctx = avctx;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
206 s->channels = avctx->channels;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
207 s->fileversion = AV_RL16(avctx->extradata);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
208 s->compression_level = AV_RL16(avctx->extradata + 2);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
209 s->flags = AV_RL16(avctx->extradata + 4);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
210
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
211 av_log(avctx, AV_LOG_DEBUG, "Compression Level: %d - Flags: %d\n", s->compression_level, s->flags);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
212 if (s->compression_level % 1000 || s->compression_level > COMPRESSION_LEVEL_INSANE) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
213 av_log(avctx, AV_LOG_ERROR, "Incorrect compression level %d\n", s->compression_level);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
214 return -1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
215 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
216 s->fset = s->compression_level / 1000 - 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
217 for (i = 0; i < APE_FILTER_LEVELS; i++) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
218 if (!ape_filter_orders[s->fset][i])
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
219 break;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
220 s->filterbuf[i] = av_malloc((ape_filter_orders[s->fset][i] * 3 + HISTORY_SIZE) * 4);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
221 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
222
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
223 dsputil_init(&s->dsp, avctx);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
224 return 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
225 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
226
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
227 static int ape_decode_close(AVCodecContext * avctx)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
228 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
229 APEContext *s = avctx->priv_data;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
230 int i;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
231
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
232 for (i = 0; i < APE_FILTER_LEVELS; i++)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
233 av_freep(&s->filterbuf[i]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
234
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
235 return 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
236 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
237
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
238 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
239 * @defgroup rangecoder APE range decoder
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
240 * @{
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
241 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
242
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
243 #define CODE_BITS 32
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
244 #define TOP_VALUE ((unsigned int)1 << (CODE_BITS-1))
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
245 #define SHIFT_BITS (CODE_BITS - 9)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
246 #define EXTRA_BITS ((CODE_BITS-2) % 8 + 1)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
247 #define BOTTOM_VALUE (TOP_VALUE >> 8)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
248
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
249 /** Start the decoder */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
250 static inline void range_start_decoding(APEContext * ctx)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
251 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
252 ctx->rc.buffer = bytestream_get_byte(&ctx->ptr);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
253 ctx->rc.low = ctx->rc.buffer >> (8 - EXTRA_BITS);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
254 ctx->rc.range = (uint32_t) 1 << EXTRA_BITS;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
255 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
256
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
257 /** Perform normalization */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
258 static inline void range_dec_normalize(APEContext * ctx)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
259 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
260 while (ctx->rc.range <= BOTTOM_VALUE) {
6442
28e45bf84973 Prevent segfault due to reading over the end of the input buffer.
michael
parents: 6223
diff changeset
261 ctx->rc.buffer <<= 8;
28e45bf84973 Prevent segfault due to reading over the end of the input buffer.
michael
parents: 6223
diff changeset
262 if(ctx->ptr < ctx->data_end)
28e45bf84973 Prevent segfault due to reading over the end of the input buffer.
michael
parents: 6223
diff changeset
263 ctx->rc.buffer += *ctx->ptr;
28e45bf84973 Prevent segfault due to reading over the end of the input buffer.
michael
parents: 6223
diff changeset
264 ctx->ptr++;
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
265 ctx->rc.low = (ctx->rc.low << 8) | ((ctx->rc.buffer >> 1) & 0xFF);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
266 ctx->rc.range <<= 8;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
267 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
268 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
269
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
270 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
271 * Calculate culmulative frequency for next symbol. Does NO update!
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
272 * @param tot_f is the total frequency or (code_value)1<<shift
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
273 * @return the culmulative frequency
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
274 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
275 static inline int range_decode_culfreq(APEContext * ctx, int tot_f)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
276 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
277 range_dec_normalize(ctx);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
278 ctx->rc.help = ctx->rc.range / tot_f;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
279 return ctx->rc.low / ctx->rc.help;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
280 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
281
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
282 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
283 * Decode value with given size in bits
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
284 * @param shift number of bits to decode
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
285 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
286 static inline int range_decode_culshift(APEContext * ctx, int shift)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
287 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
288 range_dec_normalize(ctx);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
289 ctx->rc.help = ctx->rc.range >> shift;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
290 return ctx->rc.low / ctx->rc.help;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
291 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
292
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
293
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
294 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
295 * Update decoding state
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
296 * @param sy_f the interval length (frequency of the symbol)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
297 * @param lt_f the lower end (frequency sum of < symbols)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
298 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
299 static inline void range_decode_update(APEContext * ctx, int sy_f, int lt_f)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
300 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
301 ctx->rc.low -= ctx->rc.help * lt_f;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
302 ctx->rc.range = ctx->rc.help * sy_f;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
303 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
304
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
305 /** Decode n bits (n <= 16) without modelling */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
306 static inline int range_decode_bits(APEContext * ctx, int n)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
307 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
308 int sym = range_decode_culshift(ctx, n);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
309 range_decode_update(ctx, 1, sym);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
310 return sym;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
311 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
312
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
313
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
314 #define MODEL_ELEMENTS 64
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
315
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
316 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
317 * Fixed probabilities for symbols in Monkey Audio version 3.97
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
318 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
319 static const uint32_t counts_3970[65] = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
320 0, 14824, 28224, 39348, 47855, 53994, 58171, 60926,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
321 62682, 63786, 64463, 64878, 65126, 65276, 65365, 65419,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
322 65450, 65469, 65480, 65487, 65491, 65493, 65494, 65495,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
323 65496, 65497, 65498, 65499, 65500, 65501, 65502, 65503,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
324 65504, 65505, 65506, 65507, 65508, 65509, 65510, 65511,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
325 65512, 65513, 65514, 65515, 65516, 65517, 65518, 65519,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
326 65520, 65521, 65522, 65523, 65524, 65525, 65526, 65527,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
327 65528, 65529, 65530, 65531, 65532, 65533, 65534, 65535,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
328 65536
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
329 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
330
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
331 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
332 * Probability ranges for symbols in Monkey Audio version 3.97
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
333 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
334 static const uint16_t counts_diff_3970[64] = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
335 14824, 13400, 11124, 8507, 6139, 4177, 2755, 1756,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
336 1104, 677, 415, 248, 150, 89, 54, 31,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
337 19, 11, 7, 4, 2, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
338 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
339 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
340 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
341 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
342 1, 1, 1, 1, 1, 1, 1, 1
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
343 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
344
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
345 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
346 * Fixed probabilities for symbols in Monkey Audio version 3.98
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
347 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
348 static const uint32_t counts_3980[65] = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
349 0, 19578, 36160, 48417, 56323, 60899, 63265, 64435,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
350 64971, 65232, 65351, 65416, 65447, 65466, 65476, 65482,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
351 65485, 65488, 65490, 65491, 65492, 65493, 65494, 65495,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
352 65496, 65497, 65498, 65499, 65500, 65501, 65502, 65503,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
353 65504, 65505, 65506, 65507, 65508, 65509, 65510, 65511,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
354 65512, 65513, 65514, 65515, 65516, 65517, 65518, 65519,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
355 65520, 65521, 65522, 65523, 65524, 65525, 65526, 65527,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
356 65528, 65529, 65530, 65531, 65532, 65533, 65534, 65535,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
357 65536
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
358 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
359
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
360 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
361 * Probability ranges for symbols in Monkey Audio version 3.98
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
362 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
363 static const uint16_t counts_diff_3980[64] = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
364 19578, 16582, 12257, 7906, 4576, 2366, 1170, 536,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
365 261, 119, 65, 31, 19, 10, 6, 3,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
366 3, 2, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
367 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
368 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
369 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
370 1, 1, 1, 1, 1, 1, 1, 1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
371 1, 1, 1, 1, 1, 1, 1, 1
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
372 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
373
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
374 /**
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
375 * Decode symbol
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
376 * @param counts probability range start position
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
377 * @param count_diffs probability range widths
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
378 */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
379 static inline int range_get_symbol(APEContext * ctx,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
380 const uint32_t counts[],
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
381 const uint16_t counts_diff[])
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
382 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
383 int symbol, cf;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
384
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
385 cf = range_decode_culshift(ctx, 16);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
386
6443
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
387 if(cf > 65492){
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
388 symbol= cf - 65535 + 63;
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
389 range_decode_update(ctx, 1, cf);
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
390 if(cf > 65535)
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
391 ctx->error=1;
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
392 return symbol;
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
393 }
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
394 /* figure out the symbol inefficiently; a binary search would be much better */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
395 for (symbol = 0; counts[symbol + 1] <= cf; symbol++);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
396
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
397 range_decode_update(ctx, counts_diff[symbol], counts[symbol]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
398
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
399 return symbol;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
400 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
401 /** @} */ // group rangecoder
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
402
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
403 static inline void update_rice(APERice *rice, int x)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
404 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
405 rice->ksum += ((x + 1) / 2) - ((rice->ksum + 16) >> 5);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
406
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
407 if (rice->k == 0)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
408 rice->k = 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
409 else if (rice->ksum < (1 << (rice->k + 4)))
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
410 rice->k--;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
411 else if (rice->ksum >= (1 << (rice->k + 5)))
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
412 rice->k++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
413 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
414
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
415 static inline int ape_decode_value(APEContext * ctx, APERice *rice)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
416 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
417 int x, overflow;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
418
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
419 if (ctx->fileversion < 3980) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
420 int tmpk;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
421
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
422 overflow = range_get_symbol(ctx, counts_3970, counts_diff_3970);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
423
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
424 if (overflow == (MODEL_ELEMENTS - 1)) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
425 tmpk = range_decode_bits(ctx, 5);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
426 overflow = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
427 } else
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
428 tmpk = (rice->k < 1) ? 0 : rice->k - 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
429
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
430 if (tmpk <= 16)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
431 x = range_decode_bits(ctx, tmpk);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
432 else {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
433 x = range_decode_bits(ctx, 16);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
434 x |= (range_decode_bits(ctx, tmpk - 16) << 16);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
435 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
436 x += overflow << tmpk;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
437 } else {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
438 int base, pivot;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
439
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
440 pivot = rice->ksum >> 5;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
441 if (pivot == 0)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
442 pivot = 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
443
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
444 overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
445
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
446 if (overflow == (MODEL_ELEMENTS - 1)) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
447 overflow = range_decode_bits(ctx, 16) << 16;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
448 overflow |= range_decode_bits(ctx, 16);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
449 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
450
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
451 base = range_decode_culfreq(ctx, pivot);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
452 range_decode_update(ctx, 1, base);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
453
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
454 x = base + overflow * pivot;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
455 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
456
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
457 update_rice(rice, x);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
458
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
459 /* Convert to signed */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
460 if (x & 1)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
461 return (x >> 1) + 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
462 else
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
463 return -(x >> 1);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
464 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
465
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
466 static void entropy_decode(APEContext * ctx, int blockstodecode, int stereo)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
467 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
468 int32_t *decoded0 = ctx->decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
469 int32_t *decoded1 = ctx->decoded1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
470
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
471 ctx->blocksdecoded = blockstodecode;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
472
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
473 if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
474 /* We are pure silence, just memset the output buffer. */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
475 memset(decoded0, 0, blockstodecode * sizeof(int32_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
476 memset(decoded1, 0, blockstodecode * sizeof(int32_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
477 } else {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
478 while (blockstodecode--) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
479 *decoded0++ = ape_decode_value(ctx, &ctx->riceY);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
480 if (stereo)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
481 *decoded1++ = ape_decode_value(ctx, &ctx->riceX);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
482 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
483 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
484
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
485 if (ctx->blocksdecoded == ctx->currentframeblocks)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
486 range_dec_normalize(ctx); /* normalize to use up all bytes */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
487 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
488
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
489 static void init_entropy_decoder(APEContext * ctx)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
490 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
491 /* Read the CRC */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
492 ctx->CRC = bytestream_get_be32(&ctx->ptr);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
493
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
494 /* Read the frame flags if they exist */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
495 ctx->frameflags = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
496 if ((ctx->fileversion > 3820) && (ctx->CRC & 0x80000000)) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
497 ctx->CRC &= ~0x80000000;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
498
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
499 ctx->frameflags = bytestream_get_be32(&ctx->ptr);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
500 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
501
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
502 /* Keep a count of the blocks decoded in this frame */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
503 ctx->blocksdecoded = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
504
5963
80103098c797 spelling
vitor
parents: 5673
diff changeset
505 /* Initialize the rice structs */
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
506 ctx->riceX.k = 10;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
507 ctx->riceX.ksum = (1 << ctx->riceX.k) * 16;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
508 ctx->riceY.k = 10;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
509 ctx->riceY.ksum = (1 << ctx->riceY.k) * 16;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
510
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
511 /* The first 8 bits of input are ignored. */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
512 ctx->ptr++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
513
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
514 range_start_decoding(ctx);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
515 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
516
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
517 static const int32_t initial_coeffs[4] = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
518 360, 317, -109, 98
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
519 };
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
520
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
521 static void init_predictor_decoder(APEContext * ctx)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
522 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
523 APEPredictor *p = &ctx->predictor;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
524
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
525 /* Zero the history buffers */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
526 memset(p->historybuffer, 0, PREDICTOR_SIZE * sizeof(int32_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
527 p->buf = p->historybuffer;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
528
5966
1275461ae6f8 Fix some spelling mistakes.
diego
parents: 5963
diff changeset
529 /* Initialize and zero the coefficients */
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
530 memcpy(p->coeffsA[0], initial_coeffs, sizeof(initial_coeffs));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
531 memcpy(p->coeffsA[1], initial_coeffs, sizeof(initial_coeffs));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
532 memset(p->coeffsB, 0, sizeof(p->coeffsB));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
533
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
534 p->filterA[0] = p->filterA[1] = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
535 p->filterB[0] = p->filterB[1] = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
536 p->lastA[0] = p->lastA[1] = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
537 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
538
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
539 /** Get inverse sign of integer (-1 for positive, 1 for negative and 0 for zero) */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
540 static inline int APESIGN(int32_t x) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
541 return (x < 0) - (x > 0);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
542 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
543
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
544 static int predictor_update_filter(APEPredictor *p, const int decoded, const int filter, const int delayA, const int delayB, const int adaptA, const int adaptB)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
545 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
546 int32_t predictionA, predictionB;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
547
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
548 p->buf[delayA] = p->lastA[filter];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
549 p->buf[adaptA] = APESIGN(p->buf[delayA]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
550 p->buf[delayA - 1] = p->buf[delayA] - p->buf[delayA - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
551 p->buf[adaptA - 1] = APESIGN(p->buf[delayA - 1]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
552
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
553 predictionA = p->buf[delayA ] * p->coeffsA[filter][0] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
554 p->buf[delayA - 1] * p->coeffsA[filter][1] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
555 p->buf[delayA - 2] * p->coeffsA[filter][2] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
556 p->buf[delayA - 3] * p->coeffsA[filter][3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
557
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
558 /* Apply a scaled first-order filter compression */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
559 p->buf[delayB] = p->filterA[filter ^ 1] - ((p->filterB[filter] * 31) >> 5);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
560 p->buf[adaptB] = APESIGN(p->buf[delayB]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
561 p->buf[delayB - 1] = p->buf[delayB] - p->buf[delayB - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
562 p->buf[adaptB - 1] = APESIGN(p->buf[delayB - 1]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
563 p->filterB[filter] = p->filterA[filter ^ 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
564
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
565 predictionB = p->buf[delayB ] * p->coeffsB[filter][0] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
566 p->buf[delayB - 1] * p->coeffsB[filter][1] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
567 p->buf[delayB - 2] * p->coeffsB[filter][2] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
568 p->buf[delayB - 3] * p->coeffsB[filter][3] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
569 p->buf[delayB - 4] * p->coeffsB[filter][4];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
570
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
571 p->lastA[filter] = decoded + ((predictionA + (predictionB >> 1)) >> 10);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
572 p->filterA[filter] = p->lastA[filter] + ((p->filterA[filter] * 31) >> 5);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
573
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
574 if (!decoded) // no need updating filter coefficients
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
575 return p->filterA[filter];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
576
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
577 if (decoded > 0) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
578 p->coeffsA[filter][0] -= p->buf[adaptA ];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
579 p->coeffsA[filter][1] -= p->buf[adaptA - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
580 p->coeffsA[filter][2] -= p->buf[adaptA - 2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
581 p->coeffsA[filter][3] -= p->buf[adaptA - 3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
582
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
583 p->coeffsB[filter][0] -= p->buf[adaptB ];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
584 p->coeffsB[filter][1] -= p->buf[adaptB - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
585 p->coeffsB[filter][2] -= p->buf[adaptB - 2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
586 p->coeffsB[filter][3] -= p->buf[adaptB - 3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
587 p->coeffsB[filter][4] -= p->buf[adaptB - 4];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
588 } else {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
589 p->coeffsA[filter][0] += p->buf[adaptA ];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
590 p->coeffsA[filter][1] += p->buf[adaptA - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
591 p->coeffsA[filter][2] += p->buf[adaptA - 2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
592 p->coeffsA[filter][3] += p->buf[adaptA - 3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
593
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
594 p->coeffsB[filter][0] += p->buf[adaptB ];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
595 p->coeffsB[filter][1] += p->buf[adaptB - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
596 p->coeffsB[filter][2] += p->buf[adaptB - 2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
597 p->coeffsB[filter][3] += p->buf[adaptB - 3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
598 p->coeffsB[filter][4] += p->buf[adaptB - 4];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
599 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
600 return p->filterA[filter];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
601 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
602
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
603 static void predictor_decode_stereo(APEContext * ctx, int count)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
604 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
605 int32_t predictionA, predictionB;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
606 APEPredictor *p = &ctx->predictor;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
607 int32_t *decoded0 = ctx->decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
608 int32_t *decoded1 = ctx->decoded1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
609
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
610 while (count--) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
611 /* Predictor Y */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
612 predictionA = predictor_update_filter(p, *decoded0, 0, YDELAYA, YDELAYB, YADAPTCOEFFSA, YADAPTCOEFFSB);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
613 predictionB = predictor_update_filter(p, *decoded1, 1, XDELAYA, XDELAYB, XADAPTCOEFFSA, XADAPTCOEFFSB);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
614 *(decoded0++) = predictionA;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
615 *(decoded1++) = predictionB;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
616
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
617 /* Combined */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
618 p->buf++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
619
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
620 /* Have we filled the history buffer? */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
621 if (p->buf == p->historybuffer + HISTORY_SIZE) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
622 memmove(p->historybuffer, p->buf, PREDICTOR_SIZE * sizeof(int32_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
623 p->buf = p->historybuffer;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
624 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
625 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
626 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
627
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
628 static void predictor_decode_mono(APEContext * ctx, int count)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
629 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
630 APEPredictor *p = &ctx->predictor;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
631 int32_t *decoded0 = ctx->decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
632 int32_t predictionA, currentA, A;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
633
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
634 currentA = p->lastA[0];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
635
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
636 while (count--) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
637 A = *decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
638
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
639 p->buf[YDELAYA] = currentA;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
640 p->buf[YDELAYA - 1] = p->buf[YDELAYA] - p->buf[YDELAYA - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
641
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
642 predictionA = p->buf[YDELAYA ] * p->coeffsA[0][0] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
643 p->buf[YDELAYA - 1] * p->coeffsA[0][1] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
644 p->buf[YDELAYA - 2] * p->coeffsA[0][2] +
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
645 p->buf[YDELAYA - 3] * p->coeffsA[0][3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
646
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
647 currentA = A + (predictionA >> 10);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
648
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
649 p->buf[YADAPTCOEFFSA] = APESIGN(p->buf[YDELAYA ]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
650 p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
651
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
652 if (A > 0) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
653 p->coeffsA[0][0] -= p->buf[YADAPTCOEFFSA ];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
654 p->coeffsA[0][1] -= p->buf[YADAPTCOEFFSA - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
655 p->coeffsA[0][2] -= p->buf[YADAPTCOEFFSA - 2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
656 p->coeffsA[0][3] -= p->buf[YADAPTCOEFFSA - 3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
657 } else if (A < 0) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
658 p->coeffsA[0][0] += p->buf[YADAPTCOEFFSA ];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
659 p->coeffsA[0][1] += p->buf[YADAPTCOEFFSA - 1];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
660 p->coeffsA[0][2] += p->buf[YADAPTCOEFFSA - 2];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
661 p->coeffsA[0][3] += p->buf[YADAPTCOEFFSA - 3];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
662 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
663
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
664 p->buf++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
665
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
666 /* Have we filled the history buffer? */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
667 if (p->buf == p->historybuffer + HISTORY_SIZE) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
668 memmove(p->historybuffer, p->buf, PREDICTOR_SIZE * sizeof(int32_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
669 p->buf = p->historybuffer;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
670 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
671
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
672 p->filterA[0] = currentA + ((p->filterA[0] * 31) >> 5);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
673 *(decoded0++) = p->filterA[0];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
674 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
675
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
676 p->lastA[0] = currentA;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
677 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
678
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
679 static void do_init_filter(APEFilter *f, int16_t * buf, int order)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
680 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
681 f->coeffs = buf;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
682 f->historybuffer = buf + order;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
683 f->delay = f->historybuffer + order * 2;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
684 f->adaptcoeffs = f->historybuffer + order;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
685
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
686 memset(f->historybuffer, 0, (order * 2) * sizeof(int16_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
687 memset(f->coeffs, 0, order * sizeof(int16_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
688 f->avg = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
689 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
690
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
691 static void init_filter(APEContext * ctx, APEFilter *f, int16_t * buf, int order)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
692 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
693 do_init_filter(&f[0], buf, order);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
694 do_init_filter(&f[1], buf + order * 3 + HISTORY_SIZE, order);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
695 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
696
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
697 static inline void do_apply_filter(int version, APEFilter *f, int32_t *data, int count, int order, int fracbits)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
698 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
699 int res;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
700 int absres;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
701
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
702 while (count--) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
703 /* round fixedpoint scalar product */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
704 res = (scalarproduct(f->delay - order, f->coeffs, order) + (1 << (fracbits - 1))) >> fracbits;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
705
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
706 if (*data < 0)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
707 vector_add(f->coeffs, f->adaptcoeffs - order, order);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
708 else if (*data > 0)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
709 vector_sub(f->coeffs, f->adaptcoeffs - order, order);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
710
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
711 res += *data;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
712
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
713 *data++ = res;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
714
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
715 /* Update the output history */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
716 *f->delay++ = av_clip_int16(res);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
717
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
718 if (version < 3980) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
719 /* Version ??? to < 3.98 files (untested) */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
720 f->adaptcoeffs[0] = (res == 0) ? 0 : ((res >> 28) & 8) - 4;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
721 f->adaptcoeffs[-4] >>= 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
722 f->adaptcoeffs[-8] >>= 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
723 } else {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
724 /* Version 3.98 and later files */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
725
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
726 /* Update the adaption coefficients */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
727 absres = (res < 0 ? -res : res);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
728
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
729 if (absres > (f->avg * 3))
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
730 *f->adaptcoeffs = ((res >> 25) & 64) - 32;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
731 else if (absres > (f->avg * 4) / 3)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
732 *f->adaptcoeffs = ((res >> 26) & 32) - 16;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
733 else if (absres > 0)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
734 *f->adaptcoeffs = ((res >> 27) & 16) - 8;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
735 else
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
736 *f->adaptcoeffs = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
737
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
738 f->avg += (absres - f->avg) / 16;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
739
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
740 f->adaptcoeffs[-1] >>= 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
741 f->adaptcoeffs[-2] >>= 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
742 f->adaptcoeffs[-8] >>= 1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
743 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
744
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
745 f->adaptcoeffs++;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
746
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
747 /* Have we filled the history buffer? */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
748 if (f->delay == f->historybuffer + HISTORY_SIZE + (order * 2)) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
749 memmove(f->historybuffer, f->delay - (order * 2),
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
750 (order * 2) * sizeof(int16_t));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
751 f->delay = f->historybuffer + order * 2;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
752 f->adaptcoeffs = f->historybuffer + order;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
753 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
754 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
755 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
756
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
757 static void apply_filter(APEContext * ctx, APEFilter *f,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
758 int32_t * data0, int32_t * data1,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
759 int count, int order, int fracbits)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
760 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
761 do_apply_filter(ctx->fileversion, &f[0], data0, count, order, fracbits);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
762 if (data1)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
763 do_apply_filter(ctx->fileversion, &f[1], data1, count, order, fracbits);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
764 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
765
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
766 static void ape_apply_filters(APEContext * ctx, int32_t * decoded0,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
767 int32_t * decoded1, int count)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
768 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
769 int i;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
770
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
771 for (i = 0; i < APE_FILTER_LEVELS; i++) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
772 if (!ape_filter_orders[ctx->fset][i])
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
773 break;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
774 apply_filter(ctx, ctx->filters[i], decoded0, decoded1, count, ape_filter_orders[ctx->fset][i], ape_filter_fracbits[ctx->fset][i]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
775 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
776 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
777
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
778 static void init_frame_decoder(APEContext * ctx)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
779 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
780 int i;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
781 init_entropy_decoder(ctx);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
782 init_predictor_decoder(ctx);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
783
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
784 for (i = 0; i < APE_FILTER_LEVELS; i++) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
785 if (!ape_filter_orders[ctx->fset][i])
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
786 break;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
787 init_filter(ctx, ctx->filters[i], ctx->filterbuf[i], ape_filter_orders[ctx->fset][i]);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
788 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
789 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
790
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
791 static void ape_unpack_mono(APEContext * ctx, int count)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
792 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
793 int32_t left;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
794 int32_t *decoded0 = ctx->decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
795 int32_t *decoded1 = ctx->decoded1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
796
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
797 if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
798 entropy_decode(ctx, count, 0);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
799 /* We are pure silence, so we're done. */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
800 av_log(ctx->avctx, AV_LOG_DEBUG, "pure silence mono\n");
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
801 return;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
802 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
803
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
804 entropy_decode(ctx, count, 0);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
805 ape_apply_filters(ctx, decoded0, NULL, count);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
806
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
807 /* Now apply the predictor decoding */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
808 predictor_decode_mono(ctx, count);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
809
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
810 /* Pseudo-stereo - just copy left channel to right channel */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
811 if (ctx->channels == 2) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
812 while (count--) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
813 left = *decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
814 *(decoded1++) = *(decoded0++) = left;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
815 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
816 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
817 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
818
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
819 static void ape_unpack_stereo(APEContext * ctx, int count)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
820 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
821 int32_t left, right;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
822 int32_t *decoded0 = ctx->decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
823 int32_t *decoded1 = ctx->decoded1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
824
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
825 if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
826 /* We are pure silence, so we're done. */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
827 av_log(ctx->avctx, AV_LOG_DEBUG, "pure silence stereo\n");
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
828 return;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
829 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
830
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
831 entropy_decode(ctx, count, 1);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
832 ape_apply_filters(ctx, decoded0, decoded1, count);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
833
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
834 /* Now apply the predictor decoding */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
835 predictor_decode_stereo(ctx, count);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
836
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
837 /* Decorrelate and scale to output depth */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
838 while (count--) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
839 left = *decoded1 - (*decoded0 / 2);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
840 right = left + *decoded0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
841
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
842 *(decoded0++) = left;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
843 *(decoded1++) = right;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
844 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
845 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
846
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
847 static int ape_decode_frame(AVCodecContext * avctx,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
848 void *data, int *data_size,
6223
michael
parents: 6202
diff changeset
849 const uint8_t * buf, int buf_size)
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
850 {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
851 APEContext *s = avctx->priv_data;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
852 int16_t *samples = data;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
853 int nblocks;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
854 int i, n;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
855 int blockstodecode;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
856 int bytes_used;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
857
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
858 if (buf_size == 0 && !s->samples) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
859 *data_size = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
860 return 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
861 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
862
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
863 /* should not happen but who knows */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
864 if (BLOCKS_PER_LOOP * 2 * avctx->channels > *data_size) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
865 av_log (avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lavc! (max is %d where you have %d)\n", *data_size, s->samples * 2 * avctx->channels);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
866 return -1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
867 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
868
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
869 if(!s->samples){
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
870 s->data = av_realloc(s->data, (buf_size + 3) & ~3);
6223
michael
parents: 6202
diff changeset
871 s->dsp.bswap_buf((uint32_t*)s->data, (const uint32_t*)buf, buf_size >> 2);
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
872 s->ptr = s->last_ptr = s->data;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
873 s->data_end = s->data + buf_size;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
874
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
875 nblocks = s->samples = bytestream_get_be32(&s->ptr);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
876 n = bytestream_get_be32(&s->ptr);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
877 if(n < 0 || n > 3){
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
878 av_log(avctx, AV_LOG_ERROR, "Incorrect offset passed\n");
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
879 s->data = NULL;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
880 return -1;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
881 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
882 s->ptr += n;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
883
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
884 s->currentframeblocks = nblocks;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
885 buf += 4;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
886 if (s->samples <= 0) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
887 *data_size = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
888 return buf_size;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
889 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
890
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
891 memset(s->decoded0, 0, sizeof(s->decoded0));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
892 memset(s->decoded1, 0, sizeof(s->decoded1));
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
893
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
894 /* Initialize the frame decoder */
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
895 init_frame_decoder(s);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
896 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
897
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
898 if (!s->data) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
899 *data_size = 0;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
900 return buf_size;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
901 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
902
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
903 nblocks = s->samples;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
904 blockstodecode = FFMIN(BLOCKS_PER_LOOP, nblocks);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
905
6443
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
906 s->error=0;
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
907
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
908 if ((s->channels == 1) || (s->frameflags & APE_FRAMECODE_PSEUDO_STEREO))
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
909 ape_unpack_mono(s, blockstodecode);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
910 else
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
911 ape_unpack_stereo(s, blockstodecode);
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
912
6443
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
913 if(s->error || s->ptr > s->data_end){
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
914 s->samples=0;
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
915 av_log(avctx, AV_LOG_ERROR, "Error decoding frame\n");
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
916 return -1;
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
917 }
e3adb7e96812 Detect and prevent reading over the end of counts_*. We pass the error
michael
parents: 6442
diff changeset
918
5673
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
919 for (i = 0; i < blockstodecode; i++) {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
920 *samples++ = s->decoded0[i];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
921 if(s->channels == 2)
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
922 *samples++ = s->decoded1[i];
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
923 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
924
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
925 s->samples -= blockstodecode;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
926
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
927 *data_size = blockstodecode * 2 * s->channels;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
928 bytes_used = s->samples ? s->ptr - s->last_ptr : buf_size;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
929 s->last_ptr = s->ptr;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
930 return bytes_used;
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
931 }
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
932
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
933 AVCodec ape_decoder = {
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
934 "ape",
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
935 CODEC_TYPE_AUDIO,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
936 CODEC_ID_APE,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
937 sizeof(APEContext),
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
938 ape_decode_init,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
939 NULL,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
940 ape_decode_close,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
941 ape_decode_frame,
9810f0bbacb2 Monkey Audio decoder
kostya
parents:
diff changeset
942 };