Ticket #1693: ssr_drop.patch

File ssr_drop.patch, 3.3 KB (added by Dale Curtis, 9 years ago)

Decodes and drops gain control data.

  • libavcodec/aacdec_template.c

    From e3e3e1a878a25f902f9a0d8bde87357cfa41bc9e Mon Sep 17 00:00:00 2001
    From: Dale Curtis <dalecurtis@chromium.org>
    Date: Thu, 15 Feb 2018 16:22:55 -0800
    Subject: [PATCH] [aac] Parse and drop gain control data, so that SSR packets
     decode.
    
    This will result in poor quality audio for SSR streams, but they
    will at least demux and decode without error.
    
    This just pulls in the decode_gain_control() function from the
    ffmpeg summer-of-code repo: svn://svn.mplayerhq.hu/soc/aac/aac.c
    and adds AOT_AAC_SSR to decode_audio_specific_config_gb().
    
    Signed-off-by: Dale Curtis <dalecurtis@chromium.org>
    ---
     libavcodec/aacdec_template.c | 50 +++++++++++++++++++++++++++++++++---
     1 file changed, 47 insertions(+), 3 deletions(-)
    
    diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
    index 6c6cdd84af..328c3c35e4 100644
    a b static int decode_audio_specific_config_gb(AACContext *ac,  
    997997    switch (m4ac->object_type) {
    998998    case AOT_AAC_MAIN:
    999999    case AOT_AAC_LC:
     1000    case AOT_AAC_SSR:
    10001001    case AOT_AAC_LTP:
    10011002    case AOT_ER_AAC_LC:
    10021003    case AOT_ER_AAC_LD:
    static void apply_prediction(AACContext *ac, SingleChannelElement *sce)  
    19671968        reset_all_predictors(sce->predictor_state);
    19681969}
    19691970
     1971static int decode_gain_control(SingleChannelElement * sce, GetBitContext * gb)
     1972{
     1973    // wd_num, wd_test, aloc_size
     1974    static const int gain_mode[4][3] = {
     1975        {1, 0, 5},  // ONLY_LONG_SEQUENCE = 0,
     1976        {2, 1, 2},  // LONG_START_SEQUENCE,
     1977        {8, 0, 2},  // EIGHT_SHORT_SEQUENCE,
     1978        {2, 1, 5},  // LONG_STOP_SEQUENCE
     1979    };
     1980
     1981    /**
     1982     * per-element gain control for SSR
     1983     */
     1984    struct {
     1985      int max_band;
     1986      int adjust_num[4][8];
     1987      int alev[4][8][8];
     1988      int aloc[4][8][8];
     1989    } ssr;
     1990
     1991    const int mode = sce->ics.window_sequence[0];
     1992    int bd, wd, ad;
     1993
     1994    ssr.max_band = get_bits(gb, 2);
     1995    for (bd = 0; bd < ssr.max_band; bd++) {
     1996        for (wd = 0; wd < gain_mode[mode][0]; wd++) {
     1997            ssr.adjust_num[bd][wd] = get_bits(gb, 3);
     1998            for (ad = 0; ad < ssr.adjust_num[bd][wd]; ad++) {
     1999                ssr.alev[bd][wd][ad] = get_bits(gb, 4);
     2000                if (wd == 0 && gain_mode[mode][1])
     2001                    ssr.aloc[bd][wd][ad] = get_bits(gb, 4);
     2002                else
     2003                    ssr.aloc[bd][wd][ad] = get_bits(gb, gain_mode[mode][2]);
     2004            }
     2005        }
     2006    }
     2007    return 0;
     2008}
     2009
    19702010/**
    19712011 * Decode an individual_channel_stream payload; reference: table 4.44.
    19722012 *
    static int decode_ics(AACContext *ac, SingleChannelElement *sce,  
    20342074                goto fail;
    20352075        }
    20362076        if (!eld_syntax && get_bits1(gb)) {
    2037             avpriv_request_sample(ac->avctx, "SSR");
    2038             ret = AVERROR_PATCHWELCOME;
    2039             goto fail;
     2077            // FIXME: Do something with the gain control data...
     2078            ret = decode_gain_control(sce, gb);
     2079            if (ret < 0) {
     2080                ret = AVERROR_PATCHWELCOME;
     2081                avpriv_request_sample(ac->avctx, "SSR");
     2082                goto fail;
     2083            }
    20402084        }
    20412085        // I see no textual basis in the spec for this occurring after SSR gain
    20422086        // control, but this is what both reference and real implmentations do