Mercurial > libavcodec.hg
comparison alacenc.c @ 7617:924dc060db81 libavcodec
Import more OKed parts of ALAC encoder from GSoC repo.
author | ramiro |
---|---|
date | Tue, 19 Aug 2008 16:07:58 +0000 |
parents | 6250ff63990b |
children | 2b023daf5329 |
comparison
equal
deleted
inserted
replaced
7616:685ef77c9fe5 | 7617:924dc060db81 |
---|---|
36 #define DEFAULT_MAX_PRED_ORDER 6 | 36 #define DEFAULT_MAX_PRED_ORDER 6 |
37 #define DEFAULT_MIN_PRED_ORDER 4 | 37 #define DEFAULT_MIN_PRED_ORDER 4 |
38 #define ALAC_MAX_LPC_PRECISION 9 | 38 #define ALAC_MAX_LPC_PRECISION 9 |
39 #define ALAC_MAX_LPC_SHIFT 9 | 39 #define ALAC_MAX_LPC_SHIFT 9 |
40 | 40 |
41 #define ALAC_CHMODE_LEFT_RIGHT 0 | |
42 #define ALAC_CHMODE_LEFT_SIDE 1 | |
43 #define ALAC_CHMODE_RIGHT_SIDE 2 | |
44 #define ALAC_CHMODE_MID_SIDE 3 | |
45 | |
41 typedef struct RiceContext { | 46 typedef struct RiceContext { |
42 int history_mult; | 47 int history_mult; |
43 int initial_history; | 48 int initial_history; |
44 int k_modifier; | 49 int k_modifier; |
45 int rice_modifier; | 50 int rice_modifier; |
51 int lpc_quant; | 56 int lpc_quant; |
52 } LPCContext; | 57 } LPCContext; |
53 | 58 |
54 typedef struct AlacEncodeContext { | 59 typedef struct AlacEncodeContext { |
55 int compression_level; | 60 int compression_level; |
61 int min_prediction_order; | |
62 int max_prediction_order; | |
56 int max_coded_frame_size; | 63 int max_coded_frame_size; |
57 int write_sample_size; | 64 int write_sample_size; |
58 int32_t sample_buf[MAX_CHANNELS][DEFAULT_FRAME_SIZE]; | 65 int32_t sample_buf[MAX_CHANNELS][DEFAULT_FRAME_SIZE]; |
66 int32_t predictor_buf[DEFAULT_FRAME_SIZE]; | |
59 int interlacing_shift; | 67 int interlacing_shift; |
60 int interlacing_leftweight; | 68 int interlacing_leftweight; |
61 PutBitContext pbctx; | 69 PutBitContext pbctx; |
62 RiceContext rc; | 70 RiceContext rc; |
63 LPCContext lpc[MAX_CHANNELS]; | 71 LPCContext lpc[MAX_CHANNELS]; |
112 put_bits(&s->pbctx, 16, 0); // Seems to be zero | 120 put_bits(&s->pbctx, 16, 0); // Seems to be zero |
113 put_bits(&s->pbctx, 1, 1); // Sample count is in the header | 121 put_bits(&s->pbctx, 1, 1); // Sample count is in the header |
114 put_bits(&s->pbctx, 2, 0); // FIXME: Wasted bytes field | 122 put_bits(&s->pbctx, 2, 0); // FIXME: Wasted bytes field |
115 put_bits(&s->pbctx, 1, is_verbatim); // Audio block is verbatim | 123 put_bits(&s->pbctx, 1, is_verbatim); // Audio block is verbatim |
116 put_bits(&s->pbctx, 32, s->avctx->frame_size); // No. of samples in the frame | 124 put_bits(&s->pbctx, 32, s->avctx->frame_size); // No. of samples in the frame |
125 } | |
126 | |
127 static void calc_predictor_params(AlacEncodeContext *s, int ch) | |
128 { | |
129 int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER]; | |
130 int shift[MAX_LPC_ORDER]; | |
131 int opt_order; | |
132 | |
133 opt_order = ff_lpc_calc_coefs(&s->dspctx, s->sample_buf[ch], s->avctx->frame_size, DEFAULT_MIN_PRED_ORDER, DEFAULT_MAX_PRED_ORDER, | |
134 ALAC_MAX_LPC_PRECISION, coefs, shift, 1, ORDER_METHOD_EST, ALAC_MAX_LPC_SHIFT, 1); | |
135 | |
136 s->lpc[ch].lpc_order = opt_order; | |
137 s->lpc[ch].lpc_quant = shift[opt_order-1]; | |
138 memcpy(s->lpc[ch].lpc_coeff, coefs[opt_order-1], opt_order*sizeof(int)); | |
117 } | 139 } |
118 | 140 |
119 static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n) | 141 static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n) |
120 { | 142 { |
121 int i, best; | 143 int i, best; |
145 for(i=1; i<4; i++) { | 167 for(i=1; i<4; i++) { |
146 if(score[i] < score[best]) { | 168 if(score[i] < score[best]) { |
147 best = i; | 169 best = i; |
148 } | 170 } |
149 } | 171 } |
172 return best; | |
173 } | |
174 | |
175 static void alac_stereo_decorrelation(AlacEncodeContext *s) | |
176 { | |
177 int32_t *left = s->sample_buf[0], *right = s->sample_buf[1]; | |
178 int i, mode, n = s->avctx->frame_size; | |
179 int32_t tmp; | |
180 | |
181 mode = estimate_stereo_mode(left, right, n); | |
182 | |
183 switch(mode) | |
184 { | |
185 case ALAC_CHMODE_LEFT_RIGHT: | |
186 s->interlacing_leftweight = 0; | |
187 s->interlacing_shift = 0; | |
188 break; | |
189 | |
190 case ALAC_CHMODE_LEFT_SIDE: | |
191 for(i=0; i<n; i++) { | |
192 right[i] = left[i] - right[i]; | |
193 } | |
194 s->interlacing_leftweight = 1; | |
195 s->interlacing_shift = 0; | |
196 break; | |
197 | |
198 case ALAC_CHMODE_RIGHT_SIDE: | |
199 for(i=0; i<n; i++) { | |
200 tmp = right[i]; | |
201 right[i] = left[i] - right[i]; | |
202 left[i] = tmp + (right[i] >> 31); | |
203 } | |
204 s->interlacing_leftweight = 1; | |
205 s->interlacing_shift = 31; | |
206 break; | |
207 | |
208 default: | |
209 for(i=0; i<n; i++) { | |
210 tmp = left[i]; | |
211 left[i] = (tmp + right[i]) >> 1; | |
212 right[i] = tmp - right[i]; | |
213 } | |
214 s->interlacing_leftweight = 1; | |
215 s->interlacing_shift = 1; | |
216 break; | |
217 } | |
218 } | |
150 | 219 |
151 static void write_compressed_frame(AlacEncodeContext *s) | 220 static void write_compressed_frame(AlacEncodeContext *s) |
152 { | 221 { |
153 int i, j; | 222 int i, j; |
154 | 223 |
224 AV_WB8(alac_extradata+18, s->rc.history_mult); | 293 AV_WB8(alac_extradata+18, s->rc.history_mult); |
225 AV_WB8(alac_extradata+19, s->rc.initial_history); | 294 AV_WB8(alac_extradata+19, s->rc.initial_history); |
226 AV_WB8(alac_extradata+20, s->rc.k_modifier); | 295 AV_WB8(alac_extradata+20, s->rc.k_modifier); |
227 } | 296 } |
228 | 297 |
298 if(avctx->min_prediction_order >= 0) { | |
299 if(avctx->min_prediction_order < MIN_LPC_ORDER || | |
300 avctx->min_prediction_order > MAX_LPC_ORDER) { | |
301 av_log(avctx, AV_LOG_ERROR, "invalid min prediction order: %d\n", avctx->min_prediction_order); | |
302 return -1; | |
303 } | |
304 | |
305 s->min_prediction_order = avctx->min_prediction_order; | |
306 } | |
307 | |
308 if(avctx->max_prediction_order >= 0) { | |
309 if(avctx->max_prediction_order < MIN_LPC_ORDER || | |
310 avctx->max_prediction_order > MAX_LPC_ORDER) { | |
311 av_log(avctx, AV_LOG_ERROR, "invalid max prediction order: %d\n", avctx->max_prediction_order); | |
312 return -1; | |
313 } | |
314 | |
315 s->max_prediction_order = avctx->max_prediction_order; | |
316 } | |
317 | |
318 if(s->max_prediction_order < s->min_prediction_order) { | |
319 av_log(avctx, AV_LOG_ERROR, "invalid prediction orders: min=%d max=%d\n", | |
320 s->min_prediction_order, s->max_prediction_order); | |
321 return -1; | |
322 } | |
323 | |
229 avctx->extradata = alac_extradata; | 324 avctx->extradata = alac_extradata; |
230 avctx->extradata_size = ALAC_EXTRADATA_SIZE; | 325 avctx->extradata_size = ALAC_EXTRADATA_SIZE; |
231 | 326 |
232 avctx->coded_frame = avcodec_alloc_frame(); | 327 avctx->coded_frame = avcodec_alloc_frame(); |
233 avctx->coded_frame->key_frame = 1; | 328 avctx->coded_frame->key_frame = 1; |
252 | 347 |
253 if(buf_size < 2*s->max_coded_frame_size) { | 348 if(buf_size < 2*s->max_coded_frame_size) { |
254 av_log(avctx, AV_LOG_ERROR, "buffer size is too small\n"); | 349 av_log(avctx, AV_LOG_ERROR, "buffer size is too small\n"); |
255 return -1; | 350 return -1; |
256 } | 351 } |
352 | |
353 verbatim: | |
354 init_put_bits(pb, frame, buf_size); | |
257 | 355 |
258 if((s->compression_level == 0) || verbatim_flag) { | 356 if((s->compression_level == 0) || verbatim_flag) { |
259 // Verbatim mode | 357 // Verbatim mode |
260 int16_t *samples = data; | 358 int16_t *samples = data; |
261 write_frame_header(s, 1); | 359 write_frame_header(s, 1); |