tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mpeg4audio.c (5691B)


      1 /*
      2 * MPEG-4 Audio common code
      3 * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr>
      4 * Copyright (c) 2009 Alex Converse <alex.converse@gmail.com>
      5 *
      6 * This file is part of FFmpeg.
      7 *
      8 * FFmpeg is free software; you can redistribute it and/or
      9 * modify it under the terms of the GNU Lesser General Public
     10 * License as published by the Free Software Foundation; either
     11 * version 2.1 of the License, or (at your option) any later version.
     12 *
     13 * FFmpeg is distributed in the hope that it will be useful,
     14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16 * Lesser General Public License for more details.
     17 *
     18 * You should have received a copy of the GNU Lesser General Public
     19 * License along with FFmpeg; if not, write to the Free Software
     20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     21 */
     22 
     23 #include "get_bits.h"
     24 #include "mpeg4audio.h"
     25 
     26 /**
     27 * Parse MPEG-4 audio configuration for ALS object type.
     28 * @param[in] gb       bit reader context
     29 * @param[in] c        MPEG4AudioConfig structure to fill
     30 * @return on success 0 is returned, otherwise a value < 0
     31 */
     32 static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c, void *logctx)
     33 {
     34    if (get_bits_left(gb) < 112)
     35        return AVERROR_INVALIDDATA;
     36 
     37    if (get_bits_long(gb, 32) != MKBETAG('A','L','S','\0'))
     38        return AVERROR_INVALIDDATA;
     39 
     40    // override AudioSpecificConfig channel configuration and sample rate
     41    // which are buggy in old ALS conformance files
     42    c->sample_rate = get_bits_long(gb, 32);
     43 
     44    if (c->sample_rate <= 0) {
     45        av_log(logctx, AV_LOG_ERROR, "Invalid sample rate %d\n", c->sample_rate);
     46        return AVERROR_INVALIDDATA;
     47    }
     48 
     49    // skip number of samples
     50    skip_bits_long(gb, 32);
     51 
     52    // read number of channels
     53    c->chan_config = 0;
     54    c->channels    = get_bits(gb, 16) + 1;
     55 
     56    return 0;
     57 }
     58 
     59 const uint8_t ff_mpeg4audio_channels[15] = {
     60    0,
     61    1, // mono (1/0)
     62    2, // stereo (2/0)
     63    3, // 3/0
     64    4, // 3/1
     65    5, // 3/2
     66    6, // 3/2.1
     67    8, // 5/2.1
     68    0,
     69    0,
     70    0,
     71    7, // 3/3.1
     72    8, // 3/2/2.1
     73    24, // 3/3/3 - 5/2/3 - 3/0/0.2
     74    8, // 3/2.1 - 2/0
     75 };
     76 
     77 static inline int get_object_type(GetBitContext *gb)
     78 {
     79    int object_type = get_bits(gb, 5);
     80    if (object_type == AOT_ESCAPE)
     81        object_type = 32 + get_bits(gb, 6);
     82    return object_type;
     83 }
     84 
     85 static inline int get_sample_rate(GetBitContext *gb, int *index)
     86 {
     87    *index = get_bits(gb, 4);
     88    return *index == 0x0f ? get_bits(gb, 24) :
     89        ff_mpeg4audio_sample_rates[*index];
     90 }
     91 
     92 int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
     93                                int sync_extension, void *logctx)
     94 {
     95    int specific_config_bitindex, ret;
     96    int start_bit_index = get_bits_count(gb);
     97    c->object_type = get_object_type(gb);
     98    c->sample_rate = get_sample_rate(gb, &c->sampling_index);
     99    c->chan_config = get_bits(gb, 4);
    100    if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
    101        c->channels = ff_mpeg4audio_channels[c->chan_config];
    102    else {
    103        av_log(logctx, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
    104        return AVERROR_INVALIDDATA;
    105    }
    106    c->sbr = -1;
    107    c->ps  = -1;
    108    if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&
    109        // check for W6132 Annex YYYY draft MP3onMP4
    110        !(show_bits(gb, 3) & 0x03 && !(show_bits(gb, 9) & 0x3F)))) {
    111        if (c->object_type == AOT_PS)
    112            c->ps = 1;
    113        c->ext_object_type = AOT_SBR;
    114        c->sbr = 1;
    115        c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index);
    116        c->object_type = get_object_type(gb);
    117        if (c->object_type == AOT_ER_BSAC)
    118            c->ext_chan_config = get_bits(gb, 4);
    119    } else {
    120        c->ext_object_type = AOT_NULL;
    121        c->ext_sample_rate = 0;
    122    }
    123    specific_config_bitindex = get_bits_count(gb);
    124 
    125    if (c->object_type == AOT_ALS) {
    126        skip_bits(gb, 5);
    127        if (show_bits(gb, 24) != MKBETAG('\0','A','L','S'))
    128            skip_bits(gb, 24);
    129 
    130        specific_config_bitindex = get_bits_count(gb);
    131 
    132        ret = parse_config_ALS(gb, c, logctx);
    133        if (ret < 0)
    134            return ret;
    135    }
    136 
    137    if (c->ext_object_type != AOT_SBR && sync_extension) {
    138        while (get_bits_left(gb) > 15) {
    139            if (show_bits(gb, 11) == 0x2b7) { // sync extension
    140                get_bits(gb, 11);
    141                c->ext_object_type = get_object_type(gb);
    142                if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(gb)) == 1) {
    143                    c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index);
    144                    if (c->ext_sample_rate == c->sample_rate)
    145                        c->sbr = -1;
    146                }
    147                if (get_bits_left(gb) > 11 && get_bits(gb, 11) == 0x548)
    148                    c->ps = get_bits1(gb);
    149                break;
    150            } else
    151                get_bits1(gb); // skip 1 bit
    152        }
    153    }
    154 
    155    //PS requires SBR
    156    if (!c->sbr)
    157        c->ps = 0;
    158    //Limit implicit PS to the HE-AACv2 Profile
    159    if ((c->ps == -1 && c->object_type != AOT_AAC_LC) || c->channels & ~0x01)
    160        c->ps = 0;
    161 
    162    return specific_config_bitindex - start_bit_index;
    163 }
    164 
    165 int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf,
    166                                  int size, int sync_extension, void *logctx)
    167 {
    168    GetBitContext gb;
    169    int ret;
    170 
    171    if (size <= 0)
    172        return AVERROR_INVALIDDATA;
    173 
    174    ret = init_get_bits8(&gb, buf, size);
    175    if (ret < 0)
    176        return ret;
    177 
    178    return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension, logctx);
    179 }