---
libavcodec/alac.c | 296 +++++++++++++++++++++++++++--------------------------
1 files changed, 149 insertions(+), 147 deletions(-)
diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index 8e2b803..aefd1c7 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -380,180 +380,182 @@ static int alac_decode_frame(AVCodecContext *avctx,
void *data,
init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
while (channels > 0) {
- enum RawDataBlockType element;
- int paired;
+ enum RawDataBlockType element;
+ int paired;
- element = get_bits(&alac->gb, 3);
- if (element > TYPE_CPE && element != TYPE_LFE) {
- av_log(avctx, AV_LOG_ERROR, "syntax element unsupported: %d", element);
- return AVERROR_PATCHWELCOME;
- }
+ element = get_bits(&alac->gb, 3);
+ if (element > TYPE_CPE && element != TYPE_LFE) {
+ av_log(avctx, AV_LOG_ERROR, "syntax element unsupported: %d",
element);
+ return AVERROR_PATCHWELCOME;
+ }
- paired = (element == TYPE_CPE);
- if (paired && channels < 2) {
- av_log(avctx, AV_LOG_ERROR, "stereo frame in mono audio track\n");
- return AVERROR_INVALIDDATA;
- }
+ paired = (element == TYPE_CPE);
+ if (paired && channels < 2) {
+ av_log(avctx, AV_LOG_ERROR, "stereo frame in mono audio track\n");
+ return AVERROR_INVALIDDATA;
+ }
- /* 2^result = something to do with output waiting.
- * perhaps matters if we read > 1 frame in a pass?
- */
- skip_bits(&alac->gb, 4);
+ /* 2^result = something to do with output waiting.
+ * perhaps matters if we read > 1 frame in a pass?
+ */
+ skip_bits(&alac->gb, 4);
- skip_bits(&alac->gb, 12); /* unknown, skip 12 bits */
+ skip_bits(&alac->gb, 12); /* unknown, skip 12 bits */
- /* the output sample size is stored soon */
- hassize = get_bits1(&alac->gb);
+ /* the output sample size is stored soon */
+ hassize = get_bits1(&alac->gb);
- alac->extra_bits = get_bits(&alac->gb, 2) << 3;
+ alac->extra_bits = get_bits(&alac->gb, 2) << 3;
- /* whether the frame is compressed */
- isnotcompressed = get_bits1(&alac->gb);
+ /* whether the frame is compressed */
+ isnotcompressed = get_bits1(&alac->gb);
- if (outputsamples == 0) {
- if (hassize) {
- /* now read the number of samples as a 32bit integer */
- outputsamples = get_bits_long(&alac->gb, 32);
- if(outputsamples > alac->setinfo_max_samples_per_frame){
- av_log(avctx, AV_LOG_ERROR, "outputsamples %d > %d\n",
outputsamples, alac->setinfo_max_samples_per_frame);
- return -1;
+ if (outputsamples == 0) {
+ if (hassize) {
+ /* now read the number of samples as a 32bit integer */
+ outputsamples = get_bits_long(&alac->gb, 32);
+ if (outputsamples > alac->setinfo_max_samples_per_frame) {
+ av_log(avctx, AV_LOG_ERROR, "outputsamples %d > %d\n",
+ outputsamples, alac->setinfo_max_samples_per_frame);
+ return -1;
+ }
+ }
+ if (outputsamples == 0)
+ outputsamples = alac->setinfo_max_samples_per_frame;
+
+ /* get output buffer */
+ if (outputsamples > INT32_MAX) {
+ av_log(avctx, AV_LOG_ERROR, "unsupported block size: %u\n",
+ outputsamples);
+ return AVERROR_INVALIDDATA;
+ }
+ alac->frame.nb_samples = outputsamples;
+ if ((ret = avctx->get_buffer(avctx, &alac->frame)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+ return ret;
+ }
+ } else {
+ if (hassize && get_bits_long(&alac->gb, 32) != outputsamples) {
+ av_log(avctx, AV_LOG_ERROR, "sample count disparity between
channels\n");
+ return AVERROR_INVALIDDATA;
+ }
}
- }
- if (outputsamples == 0)
- outputsamples = alac->setinfo_max_samples_per_frame;
- /* get output buffer */
- if (outputsamples > INT32_MAX) {
- av_log(avctx, AV_LOG_ERROR, "unsupported block size: %u\n",
outputsamples);
- return AVERROR_INVALIDDATA;
- }
- alac->frame.nb_samples = outputsamples;
- if ((ret = avctx->get_buffer(avctx, &alac->frame)) < 0) {
- av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
- return ret;
- }
- } else {
- if (hassize && get_bits_long(&alac->gb, 32) != outputsamples) {
- av_log(avctx, AV_LOG_ERROR, "sample count disparity between
channels\n");
- return AVERROR_INVALIDDATA;
+ readsamplesize = alac->setinfo_sample_size - alac->extra_bits + paired;
+ if (readsamplesize > MIN_CACHE_BITS) {
+ av_log(avctx, AV_LOG_ERROR, "readsamplesize too big (%d)\n",
readsamplesize);
+ return -1;
}
- }
-
- readsamplesize = alac->setinfo_sample_size - alac->extra_bits + paired;
- if (readsamplesize > MIN_CACHE_BITS) {
- av_log(avctx, AV_LOG_ERROR, "readsamplesize too big (%d)\n",
readsamplesize);
- return -1;
- }
- if (!isnotcompressed) {
- /* so it is compressed */
- int16_t predictor_coef_table[2][32];
- int predictor_coef_num[2];
- int prediction_type[2];
- int prediction_quantitization[2];
- int ricemodifier[2];
+ if (!isnotcompressed) {
+ /* so it is compressed */
+ int16_t predictor_coef_table[2][32];
+ int predictor_coef_num[2];
+ int prediction_type[2];
+ int prediction_quantitization[2];
+ int ricemodifier[2];
- interlacing_shift = get_bits(&alac->gb, 8);
- interlacing_leftweight = get_bits(&alac->gb, 8);
+ interlacing_shift = get_bits(&alac->gb, 8);
+ interlacing_leftweight = get_bits(&alac->gb, 8);
- for (ch = 0; ch <= paired; ch++) {
- prediction_type[ch] = get_bits(&alac->gb, 4);
- prediction_quantitization[ch] = get_bits(&alac->gb, 4);
+ for (ch = 0; ch <= paired; ch++) {
+ prediction_type[ch] = get_bits(&alac->gb, 4);
+ prediction_quantitization[ch] = get_bits(&alac->gb, 4);
- ricemodifier[ch] = get_bits(&alac->gb, 3);
- predictor_coef_num[ch] = get_bits(&alac->gb, 5);
+ ricemodifier[ch] = get_bits(&alac->gb, 3);
+ predictor_coef_num[ch] = get_bits(&alac->gb, 5);
- /* read the predictor table */
- for (i = 0; i < predictor_coef_num[ch]; i++)
- predictor_coef_table[ch][i] = (int16_t)get_bits(&alac->gb, 16);
- }
+ /* read the predictor table */
+ for (i = 0; i < predictor_coef_num[ch]; i++)
+ predictor_coef_table[ch][i] = (int16_t)get_bits(&alac->gb,
16);
+ }
- if (alac->extra_bits) {
- for (i = 0; i < outputsamples; i++) {
- for (ch = 0; ch <= paired; ch++)
- alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb,
alac->extra_bits);
+ if (alac->extra_bits) {
+ for (i = 0; i < outputsamples; i++) {
+ for (ch = 0; ch <= paired; ch++)
+ alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb,
alac->extra_bits);
+ }
}
- }
- for (ch = 0; ch <= paired; ch++) {
- bastardized_rice_decompress(alac,
- alac->predicterror_buffer[ch],
- outputsamples,
- readsamplesize,
- alac->setinfo_rice_initialhistory,
- alac->setinfo_rice_kmodifier,
- ricemodifier[ch] *
alac->setinfo_rice_historymult / 4,
- (1 << alac->setinfo_rice_kmodifier) -
1);
-
- /* adaptive FIR filter */
- if (prediction_type[ch] == 15) {
- /* Prediction type 15 runs the adaptive FIR twice.
- * The first pass uses the special-case coef_num = 31, while
- * the second pass uses the coefs from the bitstream.
- *
- * However, this prediction type is not currently used by the
- * reference encoder.
- */
+ for (ch = 0; ch <= paired; ch++) {
+ bastardized_rice_decompress(alac,
+ alac->predicterror_buffer[ch],
+ outputsamples,
+ readsamplesize,
+ alac->setinfo_rice_initialhistory,
+ alac->setinfo_rice_kmodifier,
+ ricemodifier[ch] *
alac->setinfo_rice_historymult / 4,
+ (1 <<
alac->setinfo_rice_kmodifier) - 1);
+
+ /* adaptive FIR filter */
+ if (prediction_type[ch] == 15) {
+ /* Prediction type 15 runs the adaptive FIR twice.
+ * The first pass uses the special-case coef_num = 31,
while
+ * the second pass uses the coefs from the bitstream.
+ *
+ * However, this prediction type is not currently used by
the
+ * reference encoder.
+ */
+
predictor_decompress_fir_adapt(alac->predicterror_buffer[ch],
+
alac->predicterror_buffer[ch],
+ outputsamples,
readsamplesize,
+ NULL, 31, 0);
+ } else if (prediction_type[ch] > 0) {
+ av_log(avctx, AV_LOG_WARNING, "unknown prediction type:
%i\n",
+ prediction_type[ch]);
+ }
predictor_decompress_fir_adapt(alac->predicterror_buffer[ch],
- alac->predicterror_buffer[ch],
+ alac->outputsamples_buffer[ch],
outputsamples, readsamplesize,
- NULL, 31, 0);
- } else if (prediction_type[ch] > 0) {
- av_log(avctx, AV_LOG_WARNING, "unknown prediction type: %i\n",
- prediction_type[ch]);
+ predictor_coef_table[ch],
+ predictor_coef_num[ch],
+ prediction_quantitization[ch]);
}
- predictor_decompress_fir_adapt(alac->predicterror_buffer[ch],
- alac->outputsamples_buffer[ch],
- outputsamples, readsamplesize,
- predictor_coef_table[ch],
- predictor_coef_num[ch],
- prediction_quantitization[ch]);
- }
- } else {
- /* not compressed, easy case */
- for (i = 0; i < outputsamples; i++) {
- for (ch = 0; ch <= paired; ch++) {
- alac->outputsamples_buffer[ch][i] = get_sbits_long(&alac->gb,
-
alac->setinfo_sample_size);
+ } else {
+ /* not compressed, easy case */
+ for (i = 0; i < outputsamples; i++) {
+ for (ch = 0; ch <= paired; ch++) {
+ alac->outputsamples_buffer[ch][i] =
get_sbits_long(&alac->gb,
+
alac->setinfo_sample_size);
+ }
}
+ alac->extra_bits = 0;
+ interlacing_shift = 0;
+ interlacing_leftweight = 0;
}
- alac->extra_bits = 0;
- interlacing_shift = 0;
- interlacing_leftweight = 0;
- }
- if (paired && interlacing_leftweight) {
- decorrelate_stereo(alac->outputsamples_buffer, outputsamples,
- interlacing_shift, interlacing_leftweight);
- }
- offsetL = alac_channel_layout_offsets[avctx->channels - 1][avctx->channels
- channels];
- if (paired)
- offsetR = alac_channel_layout_offsets[avctx->channels -
1][avctx->channels - channels + 1];
+ if (paired && interlacing_leftweight) {
+ decorrelate_stereo(alac->outputsamples_buffer, outputsamples,
+ interlacing_shift, interlacing_leftweight);
+ }
+ offsetL = alac_channel_layout_offsets[avctx->channels -
1][avctx->channels - channels];
+ if (paired)
+ offsetR = alac_channel_layout_offsets[avctx->channels -
1][avctx->channels - channels + 1];
- if (alac->extra_bits) {
- append_extra_bits(alac->outputsamples_buffer, alac->extra_bits_buffer,
- alac->extra_bits, paired, outputsamples);
- }
+ if (alac->extra_bits) {
+ append_extra_bits(alac->outputsamples_buffer,
alac->extra_bits_buffer,
+ alac->extra_bits, paired, outputsamples);
+ }
- switch(alac->setinfo_sample_size) {
- case 16: {
- int16_t *outbuffer = (int16_t *)alac->frame.data[0];
- for (i = 0; i < outputsamples; i++) {
- outbuffer[i * avctx->channels + offsetL] =
alac->outputsamples_buffer[0][i];
- if (paired)
- outbuffer[i * avctx->channels + offsetR] =
alac->outputsamples_buffer[1][i];
- }}
- break;
- case 24: {
- int32_t *outbuffer = (int32_t *)alac->frame.data[0];
- for (i = 0; i < outputsamples; i++) {
- outbuffer[i * avctx->channels + offsetL] =
alac->outputsamples_buffer[0][i] << 8;
- if (paired)
- outbuffer[i * avctx->channels + offsetR] =
alac->outputsamples_buffer[1][i] << 8;
- }}
- break;
- }
+ switch(alac->setinfo_sample_size) {
+ case 16: {
+ int16_t *outbuffer = (int16_t *)alac->frame.data[0];
+ for (i = 0; i < outputsamples; i++) {
+ outbuffer[i * avctx->channels + offsetL] =
alac->outputsamples_buffer[0][i];
+ if (paired)
+ outbuffer[i * avctx->channels + offsetR] =
alac->outputsamples_buffer[1][i];
+ }}
+ break;
+ case 24: {
+ int32_t *outbuffer = (int32_t *)alac->frame.data[0];
+ for (i = 0; i < outputsamples; i++) {
+ outbuffer[i * avctx->channels + offsetL] =
alac->outputsamples_buffer[0][i] << 8;
+ if (paired)
+ outbuffer[i * avctx->channels + offsetR] =
alac->outputsamples_buffer[1][i] << 8;
+ }}
+ break;
+ }
- channels -= (paired) ? 2 : 1;
+ channels -= (paired) ? 2 : 1;
}
if (get_bits(&alac->gb, 3) != TYPE_END)
--
1.7.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel