Ticket #1693: ssr_drop.patch
| File ssr_drop.patch, 3.3 KB (added by , 9 years ago) |
|---|
-
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, 997 997 switch (m4ac->object_type) { 998 998 case AOT_AAC_MAIN: 999 999 case AOT_AAC_LC: 1000 case AOT_AAC_SSR: 1000 1001 case AOT_AAC_LTP: 1001 1002 case AOT_ER_AAC_LC: 1002 1003 case AOT_ER_AAC_LD: … … static void apply_prediction(AACContext *ac, SingleChannelElement *sce) 1967 1968 reset_all_predictors(sce->predictor_state); 1968 1969 } 1969 1970 1971 static 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 1970 2010 /** 1971 2011 * Decode an individual_channel_stream payload; reference: table 4.44. 1972 2012 * … … static int decode_ics(AACContext *ac, SingleChannelElement *sce, 2034 2074 goto fail; 2035 2075 } 2036 2076 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 } 2040 2084 } 2041 2085 // I see no textual basis in the spec for this occurring after SSR gain 2042 2086 // control, but this is what both reference and real implmentations do
