You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Merge commit 'd615187f74ddf3413778a8b5b7ae17255b0df88e'
* commit 'd615187f74ddf3413778a8b5b7ae17255b0df88e': aacdec: Support for ER AAC ELD 480. Conflicts: libavcodec/aacdec.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
							
								
								
									
										2
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -2068,7 +2068,7 @@ mpegvideo_select="blockdsp h264chroma hpeldsp idctdsp me_cmp videodsp" | ||||
| mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp" | ||||
|  | ||||
| # decoders / encoders | ||||
| aac_decoder_select="mdct sinewin" | ||||
| aac_decoder_select="imdct15 mdct sinewin" | ||||
| aac_encoder_select="audio_frame_queue iirfilter mdct sinewin" | ||||
| aac_latm_decoder_select="aac_decoder aac_latm_parser" | ||||
| ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct" | ||||
|   | ||||
| @@ -32,6 +32,7 @@ | ||||
|  | ||||
| #include "libavutil/float_dsp.h" | ||||
| #include "avcodec.h" | ||||
| #include "imdct15.h" | ||||
| #include "fft.h" | ||||
| #include "mpeg4audio.h" | ||||
| #include "sbr.h" | ||||
| @@ -294,6 +295,7 @@ struct AACContext { | ||||
|     FFTContext mdct_small; | ||||
|     FFTContext mdct_ld; | ||||
|     FFTContext mdct_ltp; | ||||
|     IMDCT15Context *mdct480; | ||||
|     FmtConvertContext fmt_conv; | ||||
|     AVFloatDSPContext *fdsp; | ||||
|     int random_state; | ||||
|   | ||||
| @@ -87,6 +87,7 @@ | ||||
| #include "internal.h" | ||||
| #include "get_bits.h" | ||||
| #include "fft.h" | ||||
| #include "imdct15.h" | ||||
| #include "fmtconvert.h" | ||||
| #include "lpc.h" | ||||
| #include "kbdwin.h" | ||||
| @@ -800,6 +801,7 @@ static int decode_ga_specific_config(AACContext *ac, AVCodecContext *avctx, | ||||
|         avpriv_request_sample(avctx, "960/120 MDCT window"); | ||||
|         return AVERROR_PATCHWELCOME; | ||||
|     } | ||||
|     m4ac->frame_length_short = 0; | ||||
|  | ||||
|     if (get_bits1(gb))       // dependsOnCoreCoder | ||||
|         skip_bits(gb, 14);   // coreCoderDelay | ||||
| @@ -877,11 +879,7 @@ static int decode_eld_specific_config(AACContext *ac, AVCodecContext *avctx, | ||||
|     m4ac->ps  = 0; | ||||
|     m4ac->sbr = 0; | ||||
|  | ||||
|     if (get_bits1(gb)) { // frameLengthFlag | ||||
|         avpriv_request_sample(avctx, "960/120 MDCT window"); | ||||
|         return AVERROR_PATCHWELCOME; | ||||
|     } | ||||
|  | ||||
|     m4ac->frame_length_short = get_bits1(gb); | ||||
|     res_flags = get_bits(gb, 3); | ||||
|     if (res_flags) { | ||||
|         avpriv_report_missing_feature(avctx, | ||||
| @@ -1159,6 +1157,10 @@ static av_cold int aac_decode_init(AVCodecContext *avctx) | ||||
|     ff_mdct_init(&ac->mdct_ld,    10, 1, 1.0 / (32768.0 * 512.0)); | ||||
|     ff_mdct_init(&ac->mdct_small,  8, 1, 1.0 / (32768.0 * 128.0)); | ||||
|     ff_mdct_init(&ac->mdct_ltp,   11, 0, -2.0 * 32768.0); | ||||
|     ret = ff_imdct15_init(&ac->mdct480, 5); | ||||
|     if (ret < 0) | ||||
|         return ret; | ||||
|  | ||||
|     // window initialization | ||||
|     ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | ||||
|     ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128); | ||||
| @@ -1273,9 +1275,15 @@ static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics, | ||||
|         ics->max_sfb           = get_bits(gb, 6); | ||||
|         ics->num_windows       = 1; | ||||
|         if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) { | ||||
|             ics->swb_offset    =     ff_swb_offset_512[sampling_index]; | ||||
|             ics->num_swb       =    ff_aac_num_swb_512[sampling_index]; | ||||
|             ics->tns_max_bands =  ff_tns_max_bands_512[sampling_index]; | ||||
|             if (m4ac->frame_length_short) { | ||||
|                 ics->swb_offset    =     ff_swb_offset_480[sampling_index]; | ||||
|                 ics->num_swb       =    ff_aac_num_swb_480[sampling_index]; | ||||
|                 ics->tns_max_bands =  ff_tns_max_bands_480[sampling_index]; | ||||
|             } else { | ||||
|                 ics->swb_offset    =     ff_swb_offset_512[sampling_index]; | ||||
|                 ics->num_swb       =    ff_aac_num_swb_512[sampling_index]; | ||||
|                 ics->tns_max_bands =  ff_tns_max_bands_512[sampling_index]; | ||||
|             } | ||||
|             if (!ics->num_swb || !ics->swb_offset) | ||||
|                 return AVERROR_BUG; | ||||
|         } else { | ||||
| @@ -2586,12 +2594,13 @@ static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce) | ||||
|     float *in    = sce->coeffs; | ||||
|     float *out   = sce->ret; | ||||
|     float *saved = sce->saved; | ||||
|     const float *const window = ff_aac_eld_window_512; | ||||
|     float *buf  = ac->buf_mdct; | ||||
|     int i; | ||||
|     const int n  = 512; | ||||
|     const int n  = ac->oc[1].m4ac.frame_length_short ? 480 : 512; | ||||
|     const int n2 = n >> 1; | ||||
|     const int n4 = n >> 2; | ||||
|     const float *const window = n == 480 ? ff_aac_eld_window_480 : | ||||
|                                            ff_aac_eld_window_512; | ||||
|  | ||||
|     // Inverse transform, mapped to the conventional IMDCT by | ||||
|     // Chivukula, R.K.; Reznik, Y.A.; Devarajan, V., | ||||
| @@ -2603,7 +2612,10 @@ static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce) | ||||
|         temp =  in[i    ]; in[i    ] = -in[n - 1 - i]; in[n - 1 - i] = temp; | ||||
|         temp = -in[i + 1]; in[i + 1] =  in[n - 2 - i]; in[n - 2 - i] = temp; | ||||
|     } | ||||
|     ac->mdct.imdct_half(&ac->mdct_ld, buf, in); | ||||
|     if (n == 480) | ||||
|         ac->mdct480->imdct_half(ac->mdct480, buf, in, 1, -1.f/(16*1024*960)); | ||||
|     else | ||||
|         ac->mdct.imdct_half(&ac->mdct_ld, buf, in); | ||||
|     for (i = 0; i < n; i+=2) { | ||||
|         buf[i] = -buf[i]; | ||||
|     } | ||||
| @@ -2836,6 +2848,7 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb) | ||||
|         ac->oc[1].m4ac.sample_rate     = hdr_info.sample_rate; | ||||
|         ac->oc[1].m4ac.sampling_index  = hdr_info.sampling_index; | ||||
|         ac->oc[1].m4ac.object_type     = hdr_info.object_type; | ||||
|         ac->oc[1].m4ac.frame_length_short = 0; | ||||
|         if (ac->oc[0].status != OC_LOCKED || | ||||
|             ac->oc[0].m4ac.chan_config != hdr_info.chan_config || | ||||
|             ac->oc[0].m4ac.sample_rate != hdr_info.sample_rate) { | ||||
| @@ -2855,7 +2868,7 @@ static int aac_decode_er_frame(AVCodecContext *avctx, void *data, | ||||
|     const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac; | ||||
|     ChannelElement *che; | ||||
|     int err, i; | ||||
|     int samples = 1024; | ||||
|     int samples = m4ac->frame_length_short ? 960 : 1024; | ||||
|     int chan_config = m4ac->chan_config; | ||||
|     int aot = m4ac->object_type; | ||||
|  | ||||
| @@ -3171,6 +3184,7 @@ static av_cold int aac_decode_close(AVCodecContext *avctx) | ||||
|     ff_mdct_end(&ac->mdct_small); | ||||
|     ff_mdct_end(&ac->mdct_ld); | ||||
|     ff_mdct_end(&ac->mdct_ltp); | ||||
|     ff_imdct15_uninit(&ac->mdct480); | ||||
|     av_freep(&ac->fdsp); | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
| @@ -38,6 +38,7 @@ typedef struct MPEG4AudioConfig { | ||||
|     int ext_chan_config; | ||||
|     int channels; | ||||
|     int ps;  ///< -1 implicit, 1 presence | ||||
|     int frame_length_short; | ||||
| } MPEG4AudioConfig; | ||||
|  | ||||
| extern av_export const int avpriv_mpeg4audio_sample_rates[16]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user