00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00038 #include "avcodec.h"
00039 #include "bitstream.h"
00040
00041 #define ALAC_EXTRADATA_SIZE 36
00042
00043 typedef struct {
00044
00045 AVCodecContext *avctx;
00046 GetBitContext gb;
00047
00048
00049 int context_initialized;
00050
00051 int samplesize;
00052 int numchannels;
00053 int bytespersample;
00054
00055
00056 int32_t *predicterror_buffer_a;
00057 int32_t *predicterror_buffer_b;
00058
00059 int32_t *outputsamples_buffer_a;
00060 int32_t *outputsamples_buffer_b;
00061
00062
00063 uint32_t setinfo_max_samples_per_frame;
00064 uint8_t setinfo_7a;
00065 uint8_t setinfo_sample_size;
00066 uint8_t setinfo_rice_historymult;
00067 uint8_t setinfo_rice_initialhistory;
00068 uint8_t setinfo_rice_kmodifier;
00069 uint8_t setinfo_7f;
00070 uint16_t setinfo_80;
00071 uint32_t setinfo_82;
00072 uint32_t setinfo_86;
00073 uint32_t setinfo_8a_rate;
00074
00075
00076 } ALACContext;
00077
00078 static void allocate_buffers(ALACContext *alac)
00079 {
00080 alac->predicterror_buffer_a = av_malloc(alac->setinfo_max_samples_per_frame * 4);
00081 alac->predicterror_buffer_b = av_malloc(alac->setinfo_max_samples_per_frame * 4);
00082
00083 alac->outputsamples_buffer_a = av_malloc(alac->setinfo_max_samples_per_frame * 4);
00084 alac->outputsamples_buffer_b = av_malloc(alac->setinfo_max_samples_per_frame * 4);
00085 }
00086
00087 void alac_set_info(ALACContext *alac)
00088 {
00089 unsigned char *ptr = alac->avctx->extradata;
00090
00091 ptr += 4;
00092 ptr += 4;
00093 ptr += 4;
00094
00095 alac->setinfo_max_samples_per_frame = BE_32(ptr);
00096 ptr += 4;
00097 alac->setinfo_7a = *ptr++;
00098 alac->setinfo_sample_size = *ptr++;
00099 alac->setinfo_rice_historymult = *ptr++;
00100 alac->setinfo_rice_initialhistory = *ptr++;
00101 alac->setinfo_rice_kmodifier = *ptr++;
00102 alac->setinfo_7f = *ptr++;
00103 alac->setinfo_80 = BE_16(ptr);
00104 ptr += 2;
00105 alac->setinfo_82 = BE_32(ptr);
00106 ptr += 4;
00107 alac->setinfo_86 = BE_32(ptr);
00108 ptr += 4;
00109 alac->setinfo_8a_rate = BE_32(ptr);
00110 ptr += 4;
00111
00112 allocate_buffers(alac);
00113 }
00114
00115
00116
00117
00118 static int count_leading_zeros(int32_t input)
00119 {
00120 int i = 0;
00121 while (!(0x80000000 & input) && i < 32) {
00122 i++;
00123 input = input << 1;
00124 }
00125 return i;
00126 }
00127
00128 void bastardized_rice_decompress(ALACContext *alac,
00129 int32_t *output_buffer,
00130 int output_size,
00131 int readsamplesize,
00132 int rice_initialhistory,
00133 int rice_kmodifier,
00134 int rice_historymult,
00135 int rice_kmodifier_mask
00136 )
00137 {
00138 int output_count;
00139 unsigned int history = rice_initialhistory;
00140 int sign_modifier = 0;
00141
00142 for (output_count = 0; output_count < output_size; output_count++) {
00143 int32_t x = 0;
00144 int32_t x_modified;
00145 int32_t final_val;
00146
00147
00148 while (x <= 8 && get_bits1(&alac->gb)) {
00149 x++;
00150 }
00151
00152
00153 if (x > 8) {
00154
00155 int32_t value;
00156
00157 value = get_bits(&alac->gb, readsamplesize);
00158
00159
00160 if (readsamplesize != 32)
00161 value &= (0xffffffff >> (32 - readsamplesize));
00162
00163 x = value;
00164 } else {
00165
00166 int extrabits;
00167 int k;
00168
00169
00170 k = 31 - rice_kmodifier - count_leading_zeros((history >> 9) + 3);
00171
00172 if (k < 0)
00173 k += rice_kmodifier;
00174 else
00175 k = rice_kmodifier;
00176
00177 if (k != 1) {
00178 extrabits = show_bits(&alac->gb, k);
00179
00180
00181 x = (x << k) - x;
00182
00183 if (extrabits > 1) {
00184 x += extrabits - 1;
00185 get_bits(&alac->gb, k);
00186 } else {
00187 get_bits(&alac->gb, k - 1);
00188 }
00189 }
00190 }
00191
00192 x_modified = sign_modifier + x;
00193 final_val = (x_modified + 1) / 2;
00194 if (x_modified & 1) final_val *= -1;
00195
00196 output_buffer[output_count] = final_val;
00197
00198 sign_modifier = 0;
00199
00200
00201 history += (x_modified * rice_historymult)
00202 - ((history * rice_historymult) >> 9);
00203
00204 if (x_modified > 0xffff)
00205 history = 0xffff;
00206
00207
00208 if ((history < 128) && (output_count+1 < output_size)) {
00209 int block_size;
00210
00211 sign_modifier = 1;
00212
00213 x = 0;
00214 while (x <= 8 && get_bits1(&alac->gb)) {
00215 x++;
00216 }
00217
00218 if (x > 8) {
00219 block_size = get_bits(&alac->gb, 16);
00220 block_size &= 0xffff;
00221 } else {
00222 int k;
00223 int extrabits;
00224
00225 k = count_leading_zeros(history) + ((history + 16) >> 6 ) - 24;
00226
00227 extrabits = show_bits(&alac->gb, k);
00228
00229 block_size = (((1 << k) - 1) & rice_kmodifier_mask) * x
00230 + extrabits - 1;
00231
00232 if (extrabits < 2) {
00233 x = 1 - extrabits;
00234 block_size += x;
00235 get_bits(&alac->gb, k - 1);
00236 } else {
00237 get_bits(&alac->gb, k);
00238 }
00239 }
00240
00241 if (block_size > 0) {
00242 memset(&output_buffer[output_count+1], 0, block_size * 4);
00243 output_count += block_size;
00244
00245 }
00246
00247 if (block_size > 0xffff)
00248 sign_modifier = 0;
00249
00250 history = 0;
00251 }
00252 }
00253 }
00254
00255 #define SIGN_EXTENDED32(val, bits) ((val << (32 - bits)) >> (32 - bits))
00256
00257 #define SIGN_ONLY(v) \
00258 ((v < 0) ? (-1) : \
00259 ((v > 0) ? (1) : \
00260 (0)))
00261
00262 static void predictor_decompress_fir_adapt(int32_t *error_buffer,
00263 int32_t *buffer_out,
00264 int output_size,
00265 int readsamplesize,
00266 int16_t *predictor_coef_table,
00267 int predictor_coef_num,
00268 int predictor_quantitization)
00269 {
00270 int i;
00271
00272
00273 *buffer_out = *error_buffer;
00274
00275 if (!predictor_coef_num) {
00276 if (output_size <= 1) return;
00277 memcpy(buffer_out+1, error_buffer+1, (output_size-1) * 4);
00278 return;
00279 }
00280
00281 if (predictor_coef_num == 0x1f) {
00282
00283
00284
00285 if (output_size <= 1) return;
00286 for (i = 0; i < output_size - 1; i++) {
00287 int32_t prev_value;
00288 int32_t error_value;
00289
00290 prev_value = buffer_out[i];
00291 error_value = error_buffer[i+1];
00292 buffer_out[i+1] = SIGN_EXTENDED32((prev_value + error_value), readsamplesize);
00293 }
00294 return;
00295 }
00296
00297
00298 if (predictor_coef_num > 0) {
00299 int i;
00300 for (i = 0; i < predictor_coef_num; i++) {
00301 int32_t val;
00302
00303 val = buffer_out[i] + error_buffer[i+1];
00304
00305 val = SIGN_EXTENDED32(val, readsamplesize);
00306
00307 buffer_out[i+1] = val;
00308 }
00309 }
00310
00311 #if 0
00312
00313
00314
00315 if (predictor_coef_num == 4) {
00316
00317 return;
00318 }
00319
00320 if (predictor_coef_table == 8) {
00321
00322 return;
00323 }
00324 #endif
00325
00326
00327
00328 if (predictor_coef_num > 0) {
00329 for (i = predictor_coef_num + 1;
00330 i < output_size;
00331 i++) {
00332 int j;
00333 int sum = 0;
00334 int outval;
00335 int error_val = error_buffer[i];
00336
00337 for (j = 0; j < predictor_coef_num; j++) {
00338 sum += (buffer_out[predictor_coef_num-j] - buffer_out[0]) *
00339 predictor_coef_table[j];
00340 }
00341
00342 outval = (1 << (predictor_quantitization-1)) + sum;
00343 outval = outval >> predictor_quantitization;
00344 outval = outval + buffer_out[0] + error_val;
00345 outval = SIGN_EXTENDED32(outval, readsamplesize);
00346
00347 buffer_out[predictor_coef_num+1] = outval;
00348
00349 if (error_val > 0) {
00350 int predictor_num = predictor_coef_num - 1;
00351
00352 while (predictor_num >= 0 && error_val > 0) {
00353 int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
00354 int sign = SIGN_ONLY(val);
00355
00356 predictor_coef_table[predictor_num] -= sign;
00357
00358 val *= sign;
00359
00360 error_val -= ((val >> predictor_quantitization) *
00361 (predictor_coef_num - predictor_num));
00362
00363 predictor_num--;
00364 }
00365 } else if (error_val < 0) {
00366 int predictor_num = predictor_coef_num - 1;
00367
00368 while (predictor_num >= 0 && error_val < 0) {
00369 int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
00370 int sign = - SIGN_ONLY(val);
00371
00372 predictor_coef_table[predictor_num] -= sign;
00373
00374 val *= sign;
00375
00376 error_val -= ((val >> predictor_quantitization) *
00377 (predictor_coef_num - predictor_num));
00378
00379 predictor_num--;
00380 }
00381 }
00382
00383 buffer_out++;
00384 }
00385 }
00386 }
00387
00388 void deinterlace_16(int32_t *buffer_a, int32_t *buffer_b,
00389 int16_t *buffer_out,
00390 int numchannels, int numsamples,
00391 uint8_t interlacing_shift,
00392 uint8_t interlacing_leftweight)
00393 {
00394 int i;
00395 if (numsamples <= 0) return;
00396
00397
00398 if (interlacing_leftweight) {
00399 for (i = 0; i < numsamples; i++) {
00400 int32_t difference, midright;
00401 int16_t left;
00402 int16_t right;
00403
00404 midright = buffer_a[i];
00405 difference = buffer_b[i];
00406
00407
00408 right = midright - ((difference * interlacing_leftweight) >> interlacing_shift);
00409 left = (midright - ((difference * interlacing_leftweight) >> interlacing_shift))
00410 + difference;
00411
00412 buffer_out[i*numchannels] = left;
00413 buffer_out[i*numchannels + 1] = right;
00414 }
00415
00416 return;
00417 }
00418
00419
00420 for (i = 0; i < numsamples; i++) {
00421 int16_t left, right;
00422
00423 left = buffer_a[i];
00424 right = buffer_b[i];
00425
00426 buffer_out[i*numchannels] = left;
00427 buffer_out[i*numchannels + 1] = right;
00428 }
00429 }
00430
00431 static int alac_decode_frame(AVCodecContext *avctx,
00432 void *outbuffer, int *outputsize,
00433 uint8_t *inbuffer, int input_buffer_size)
00434 {
00435 ALACContext *alac = avctx->priv_data;
00436
00437 int channels;
00438 int32_t outputsamples;
00439
00440
00441 if (!inbuffer || !input_buffer_size)
00442 return input_buffer_size;
00443
00444
00445 if (!alac->context_initialized) {
00446 if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
00447 av_log(NULL, AV_LOG_ERROR, "alac: expected %d extradata bytes\n",
00448 ALAC_EXTRADATA_SIZE);
00449 return input_buffer_size;
00450 }
00451 alac_set_info(alac);
00452 alac->context_initialized = 1;
00453 }
00454
00455 outputsamples = alac->setinfo_max_samples_per_frame;
00456
00457 init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
00458
00459 channels = get_bits(&alac->gb, 3);
00460
00461 *outputsize = outputsamples * alac->bytespersample;
00462
00463 switch(channels) {
00464 case 0: {
00465 int hassize;
00466 int isnotcompressed;
00467 int readsamplesize;
00468
00469 int wasted_bytes;
00470 int ricemodifier;
00471
00472
00473
00474
00475
00476 get_bits(&alac->gb, 4);
00477
00478 get_bits(&alac->gb, 12);
00479
00480 hassize = get_bits(&alac->gb, 1);
00481
00482 wasted_bytes = get_bits(&alac->gb, 2);
00483
00484 isnotcompressed = get_bits(&alac->gb, 1);
00485
00486 if (hassize) {
00487
00488
00489 outputsamples = get_bits(&alac->gb, 32);
00490 *outputsize = outputsamples * alac->bytespersample;
00491 }
00492
00493 readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8);
00494
00495 if (!isnotcompressed) {
00496
00497 int16_t predictor_coef_table[32];
00498 int predictor_coef_num;
00499 int prediction_type;
00500 int prediction_quantitization;
00501 int i;
00502
00503
00504
00505 get_bits(&alac->gb, 8);
00506 get_bits(&alac->gb, 8);
00507
00508 prediction_type = get_bits(&alac->gb, 4);
00509 prediction_quantitization = get_bits(&alac->gb, 4);
00510
00511 ricemodifier = get_bits(&alac->gb, 3);
00512 predictor_coef_num = get_bits(&alac->gb, 5);
00513
00514
00515 for (i = 0; i < predictor_coef_num; i++) {
00516 predictor_coef_table[i] = (int16_t)get_bits(&alac->gb, 16);
00517 }
00518
00519 if (wasted_bytes) {
00520
00521
00522
00523 av_log(NULL, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
00524 }
00525
00526 bastardized_rice_decompress(alac,
00527 alac->predicterror_buffer_a,
00528 outputsamples,
00529 readsamplesize,
00530 alac->setinfo_rice_initialhistory,
00531 alac->setinfo_rice_kmodifier,
00532 ricemodifier * alac->setinfo_rice_historymult / 4,
00533 (1 << alac->setinfo_rice_kmodifier) - 1);
00534
00535 if (prediction_type == 0) {
00536
00537 predictor_decompress_fir_adapt(alac->predicterror_buffer_a,
00538 alac->outputsamples_buffer_a,
00539 outputsamples,
00540 readsamplesize,
00541 predictor_coef_table,
00542 predictor_coef_num,
00543 prediction_quantitization);
00544 } else {
00545 av_log(NULL, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type);
00546
00547
00548
00549
00550
00551
00552 }
00553
00554 } else {
00555
00556 if (readsamplesize <= 16) {
00557 int i;
00558 for (i = 0; i < outputsamples; i++) {
00559 int32_t audiobits = get_bits(&alac->gb, readsamplesize);
00560
00561 audiobits = SIGN_EXTENDED32(audiobits, readsamplesize);
00562
00563 alac->outputsamples_buffer_a[i] = audiobits;
00564 }
00565 } else {
00566 int i;
00567 for (i = 0; i < outputsamples; i++) {
00568 int32_t audiobits;
00569
00570 audiobits = get_bits(&alac->gb, 16);
00571
00572
00573 audiobits = audiobits << 16;
00574 audiobits = audiobits >> (32 - readsamplesize);
00575
00576 audiobits |= get_bits(&alac->gb, readsamplesize - 16);
00577
00578 alac->outputsamples_buffer_a[i] = audiobits;
00579 }
00580 }
00581
00582 }
00583
00584 switch(alac->setinfo_sample_size) {
00585 case 16: {
00586 int i;
00587 for (i = 0; i < outputsamples; i++) {
00588 int16_t sample = alac->outputsamples_buffer_a[i];
00589 sample = be2me_16(sample);
00590 ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
00591 }
00592 break;
00593 }
00594 case 20:
00595 case 24:
00596 case 32:
00597 av_log(NULL, AV_LOG_ERROR, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
00598 break;
00599 default:
00600 break;
00601 }
00602 break;
00603 }
00604 case 1: {
00605 int hassize;
00606 int isnotcompressed;
00607 int readsamplesize;
00608
00609 int wasted_bytes;
00610
00611 uint8_t interlacing_shift;
00612 uint8_t interlacing_leftweight;
00613
00614
00615
00616
00617 get_bits(&alac->gb, 4);
00618
00619 get_bits(&alac->gb, 12);
00620
00621 hassize = get_bits(&alac->gb, 1);
00622
00623 wasted_bytes = get_bits(&alac->gb, 2);
00624
00625 isnotcompressed = get_bits(&alac->gb, 1);
00626
00627 if (hassize) {
00628
00629
00630 outputsamples = get_bits(&alac->gb, 32);
00631 *outputsize = outputsamples * alac->bytespersample;
00632 }
00633
00634 readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + 1;
00635
00636 if (!isnotcompressed) {
00637
00638 int16_t predictor_coef_table_a[32];
00639 int predictor_coef_num_a;
00640 int prediction_type_a;
00641 int prediction_quantitization_a;
00642 int ricemodifier_a;
00643
00644 int16_t predictor_coef_table_b[32];
00645 int predictor_coef_num_b;
00646 int prediction_type_b;
00647 int prediction_quantitization_b;
00648 int ricemodifier_b;
00649
00650 int i;
00651
00652 interlacing_shift = get_bits(&alac->gb, 8);
00653 interlacing_leftweight = get_bits(&alac->gb, 8);
00654
00655
00656 prediction_type_a = get_bits(&alac->gb, 4);
00657 prediction_quantitization_a = get_bits(&alac->gb, 4);
00658
00659 ricemodifier_a = get_bits(&alac->gb, 3);
00660 predictor_coef_num_a = get_bits(&alac->gb, 5);
00661
00662
00663 for (i = 0; i < predictor_coef_num_a; i++) {
00664 predictor_coef_table_a[i] = (int16_t)get_bits(&alac->gb, 16);
00665 }
00666
00667
00668 prediction_type_b = get_bits(&alac->gb, 4);
00669 prediction_quantitization_b = get_bits(&alac->gb, 4);
00670
00671 ricemodifier_b = get_bits(&alac->gb, 3);
00672 predictor_coef_num_b = get_bits(&alac->gb, 5);
00673
00674
00675 for (i = 0; i < predictor_coef_num_b; i++) {
00676 predictor_coef_table_b[i] = (int16_t)get_bits(&alac->gb, 16);
00677 }
00678
00679
00680 if (wasted_bytes) {
00681
00682 av_log(NULL, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
00683 }
00684
00685
00686 bastardized_rice_decompress(alac,
00687 alac->predicterror_buffer_a,
00688 outputsamples,
00689 readsamplesize,
00690 alac->setinfo_rice_initialhistory,
00691 alac->setinfo_rice_kmodifier,
00692 ricemodifier_a * alac->setinfo_rice_historymult / 4,
00693 (1 << alac->setinfo_rice_kmodifier) - 1);
00694
00695 if (prediction_type_a == 0) {
00696
00697 predictor_decompress_fir_adapt(alac->predicterror_buffer_a,
00698 alac->outputsamples_buffer_a,
00699 outputsamples,
00700 readsamplesize,
00701 predictor_coef_table_a,
00702 predictor_coef_num_a,
00703 prediction_quantitization_a);
00704 } else {
00705
00706 av_log(NULL, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_a);
00707 }
00708
00709
00710 bastardized_rice_decompress(alac,
00711 alac->predicterror_buffer_b,
00712 outputsamples,
00713 readsamplesize,
00714 alac->setinfo_rice_initialhistory,
00715 alac->setinfo_rice_kmodifier,
00716 ricemodifier_b * alac->setinfo_rice_historymult / 4,
00717 (1 << alac->setinfo_rice_kmodifier) - 1);
00718
00719 if (prediction_type_b == 0) {
00720
00721 predictor_decompress_fir_adapt(alac->predicterror_buffer_b,
00722 alac->outputsamples_buffer_b,
00723 outputsamples,
00724 readsamplesize,
00725 predictor_coef_table_b,
00726 predictor_coef_num_b,
00727 prediction_quantitization_b);
00728 } else {
00729 av_log(NULL, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_b);
00730 }
00731 } else {
00732
00733 if (alac->setinfo_sample_size <= 16) {
00734 int i;
00735 for (i = 0; i < outputsamples; i++) {
00736 int32_t audiobits_a, audiobits_b;
00737
00738 audiobits_a = get_bits(&alac->gb, alac->setinfo_sample_size);
00739 audiobits_b = get_bits(&alac->gb, alac->setinfo_sample_size);
00740
00741 audiobits_a = SIGN_EXTENDED32(audiobits_a, alac->setinfo_sample_size);
00742 audiobits_b = SIGN_EXTENDED32(audiobits_b, alac->setinfo_sample_size);
00743
00744 alac->outputsamples_buffer_a[i] = audiobits_a;
00745 alac->outputsamples_buffer_b[i] = audiobits_b;
00746 }
00747 } else {
00748 int i;
00749 for (i = 0; i < outputsamples; i++) {
00750 int32_t audiobits_a, audiobits_b;
00751
00752 audiobits_a = get_bits(&alac->gb, 16);
00753 audiobits_a = audiobits_a << 16;
00754 audiobits_a = audiobits_a >> (32 - alac->setinfo_sample_size);
00755 audiobits_a |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
00756
00757 audiobits_b = get_bits(&alac->gb, 16);
00758 audiobits_b = audiobits_b << 16;
00759 audiobits_b = audiobits_b >> (32 - alac->setinfo_sample_size);
00760 audiobits_b |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
00761
00762 alac->outputsamples_buffer_a[i] = audiobits_a;
00763 alac->outputsamples_buffer_b[i] = audiobits_b;
00764 }
00765 }
00766
00767 interlacing_shift = 0;
00768 interlacing_leftweight = 0;
00769 }
00770
00771 switch(alac->setinfo_sample_size) {
00772 case 16: {
00773 deinterlace_16(alac->outputsamples_buffer_a,
00774 alac->outputsamples_buffer_b,
00775 (int16_t*)outbuffer,
00776 alac->numchannels,
00777 outputsamples,
00778 interlacing_shift,
00779 interlacing_leftweight);
00780 break;
00781 }
00782 case 20:
00783 case 24:
00784 case 32:
00785 av_log(NULL, AV_LOG_ERROR, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
00786 break;
00787 default:
00788 break;
00789 }
00790
00791 break;
00792 }
00793 }
00794
00795 return input_buffer_size;
00796 }
00797
00798 static int alac_decode_init(AVCodecContext * avctx)
00799 {
00800 ALACContext *alac = avctx->priv_data;
00801 alac->avctx = avctx;
00802 alac->context_initialized = 0;
00803
00804 alac->samplesize = alac->avctx->bits_per_sample;
00805 alac->numchannels = alac->avctx->channels;
00806 alac->bytespersample = (alac->samplesize / 8) * alac->numchannels;
00807
00808 return 0;
00809 }
00810
00811 static int alac_decode_close(AVCodecContext *avctx)
00812 {
00813 ALACContext *alac = avctx->priv_data;
00814
00815 av_free(alac->predicterror_buffer_a);
00816 av_free(alac->predicterror_buffer_b);
00817
00818 av_free(alac->outputsamples_buffer_a);
00819 av_free(alac->outputsamples_buffer_b);
00820
00821 return 0;
00822 }
00823
00824 AVCodec alac_decoder = {
00825 "alac",
00826 CODEC_TYPE_AUDIO,
00827 CODEC_ID_ALAC,
00828 sizeof(ALACContext),
00829 alac_decode_init,
00830 NULL,
00831 alac_decode_close,
00832 alac_decode_frame,
00833 };