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);