~ppsspp/ppsspp/ffmpeg

« back to all changes in this revision

Viewing changes to libavcodec/ac3dec.c

  • Committer: Henrik Rydgård
  • Date: 2014-01-03 10:44:32 UTC
  • Revision ID: git-v1:87c6c126784b1718bfa448ecf2e6a9fef781eb4e
Update our ffmpeg snapshot to a clone of the official repository.

This is because Maxim's at3plus support has been officially merged!

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
#include <math.h>
30
30
#include <string.h>
31
31
 
 
32
#include "libavutil/channel_layout.h"
32
33
#include "libavutil/crc.h"
33
34
#include "libavutil/opt.h"
34
35
#include "internal.h"
178
179
    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
179
180
 
180
181
    /* allow downmixing to stereo or mono */
181
 
    if (avctx->channels > 0 && avctx->request_channels > 0 &&
182
 
            avctx->request_channels < avctx->channels &&
183
 
            avctx->request_channels <= 2) {
184
 
        avctx->channels = avctx->request_channels;
185
 
    }
 
182
#if FF_API_REQUEST_CHANNELS
 
183
FF_DISABLE_DEPRECATION_WARNINGS
 
184
    if (avctx->request_channels == 1)
 
185
        avctx->request_channel_layout = AV_CH_LAYOUT_MONO;
 
186
    else if (avctx->request_channels == 2)
 
187
        avctx->request_channel_layout = AV_CH_LAYOUT_STEREO;
 
188
FF_ENABLE_DEPRECATION_WARNINGS
 
189
#endif
 
190
    if (avctx->channels > 1 &&
 
191
        avctx->request_channel_layout == AV_CH_LAYOUT_MONO)
 
192
        avctx->channels = 1;
 
193
    else if (avctx->channels > 2 &&
 
194
             avctx->request_channel_layout == AV_CH_LAYOUT_STEREO)
 
195
        avctx->channels = 2;
186
196
    s->downmixed = 1;
187
197
 
188
198
    for (i = 0; i < AC3_MAX_CHANNELS; i++) {
251
261
    s->bit_alloc_params.sr_code     = hdr.sr_code;
252
262
    s->bitstream_mode               = hdr.bitstream_mode;
253
263
    s->channel_mode                 = hdr.channel_mode;
254
 
    s->channel_layout               = hdr.channel_layout;
255
264
    s->lfe_on                       = hdr.lfe_on;
256
265
    s->bit_alloc_params.sr_shift    = hdr.sr_shift;
257
266
    s->sample_rate                  = hdr.sample_rate;
488
497
            break;
489
498
        default: /* 6 to 15 */
490
499
            /* Shift mantissa and sign-extend it. */
 
500
            if (bap > 15) {
 
501
                av_log(s->avctx, AV_LOG_ERROR, "bap %d is invalid in plain AC-3\n", bap);
 
502
                bap = 15;
 
503
            }
491
504
            mantissa = get_sbits(gbc, quantization_tab[bap]);
492
505
            mantissa <<= 24 - quantization_tab[bap];
493
506
            break;
747
760
    i = !s->channel_mode;
748
761
    do {
749
762
        if (get_bits1(gbc)) {
750
 
            s->dynamic_range[i] = ((dynamic_range_tab[get_bits(gbc, 8)] - 1.0) *
751
 
                                  s->drc_scale) + 1.0;
 
763
            s->dynamic_range[i] = powf(dynamic_range_tab[get_bits(gbc, 8)],
 
764
                                       s->drc_scale);
752
765
        } else if (blk == 0) {
753
766
            s->dynamic_range[i] = 1.0f;
754
767
        }
1330
1343
            if (av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, &buf[2],
1331
1344
                       s->frame_size - 2)) {
1332
1345
                av_log(avctx, AV_LOG_ERROR, "frame CRC mismatch\n");
 
1346
                if (avctx->err_recognition & AV_EF_EXPLODE)
 
1347
                    return AVERROR_INVALIDDATA;
1333
1348
                err = AAC_AC3_PARSE_ERROR_CRC;
1334
1349
            }
1335
1350
        }
1347
1362
        s->output_mode  = s->channel_mode;
1348
1363
        if (s->lfe_on)
1349
1364
            s->output_mode |= AC3_OUTPUT_LFEON;
1350
 
        if (avctx->request_channels > 0 && avctx->request_channels <= 2 &&
1351
 
                avctx->request_channels < s->channels) {
1352
 
            s->out_channels = avctx->request_channels;
1353
 
            s->output_mode  = avctx->request_channels == 1 ? AC3_CHMODE_MONO : AC3_CHMODE_STEREO;
1354
 
            s->channel_layout = avpriv_ac3_channel_layout_tab[s->output_mode];
 
1365
        if (s->channels > 1 &&
 
1366
            avctx->request_channel_layout == AV_CH_LAYOUT_MONO) {
 
1367
            s->out_channels = 1;
 
1368
            s->output_mode  = AC3_CHMODE_MONO;
 
1369
        } else if (s->channels > 2 &&
 
1370
                   avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) {
 
1371
            s->out_channels = 2;
 
1372
            s->output_mode  = AC3_CHMODE_STEREO;
1355
1373
        }
1356
 
        avctx->channels       = s->out_channels;
1357
 
        avctx->channel_layout = s->channel_layout;
1358
1374
 
1359
1375
        s->loro_center_mix_level   = gain_levels[s->  center_mix_level];
1360
1376
        s->loro_surround_mix_level = gain_levels[s->surround_mix_level];
1370
1386
        return AVERROR_INVALIDDATA;
1371
1387
    }
1372
1388
    avctx->channels = s->out_channels;
 
1389
    avctx->channel_layout = avpriv_ac3_channel_layout_tab[s->output_mode & ~AC3_OUTPUT_LFEON];
 
1390
    if (s->output_mode & AC3_OUTPUT_LFEON)
 
1391
        avctx->channel_layout |= AV_CH_LOW_FREQUENCY;
1373
1392
 
1374
1393
    /* set audio service type based on bitstream mode for AC-3 */
1375
1394
    avctx->audio_service_type = s->bitstream_mode;