1 
2 /* -----------------------------------------------------------------------------------------------------------
3 Software License for The Fraunhofer FDK AAC Codec Library for Android
4 
5 � Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
6   All rights reserved.
7 
8  1.    INTRODUCTION
9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12 
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16 of the MPEG specifications.
17 
18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
24 
25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27 applications information and documentation.
28 
29 2.    COPYRIGHT LICENSE
30 
31 Redistribution and use in source and binary forms, with or without modification, are permitted without
32 payment of copyright license fees provided that you satisfy the following conditions:
33 
34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35 your modifications thereto in source code form.
36 
37 You must retain the complete text of this software license in the documentation and/or other materials
38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40 modifications thereto to recipients of copies in binary form.
41 
42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43 prior written permission.
44 
45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46 software or your modifications thereto.
47 
48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49 and the date of any change. For modified versions of the FDK AAC Codec, the term
50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
52 
53 3.    NO PATENT LICENSE
54 
55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57 respect to this software.
58 
59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60 by appropriate patent licenses.
61 
62 4.    DISCLAIMER
63 
64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69 or business interruption, however caused and on any theory of liability, whether in contract, strict
70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
71 advised of the possibility of such damage.
72 
73 5.    CONTACT INFORMATION
74 
75 Fraunhofer Institute for Integrated Circuits IIS
76 Attention: Audio and Multimedia Departments - FDK AAC LL
77 Am Wolfsmantel 33
78 91058 Erlangen, Germany
79 
80 www.iis.fraunhofer.de/amm
81 amm-info@iis.fraunhofer.de
82 ----------------------------------------------------------------------------------------------------------- */
83 
84 /***************************  Fraunhofer IIS FDK Tools  ***********************
85 
86    Author(s): Andreas Ehret, Tobias Chalupka
87    Description: SBR encoder top level processing.
88 
89 ******************************************************************************/
90 
91 #include "sbr_encoder.h"
92 
93 #include "sbr_ram.h"
94 #include "sbr_rom.h"
95 #include "sbrenc_freq_sca.h"
96 #include "env_bit.h"
97 #include "cmondata.h"
98 #include "sbr_misc.h"
99 #include "sbr.h"
100 #include "qmf.h"
101 
102 #include "ps_main.h"
103 
104 #define SBRENCODER_LIB_VL0 3
105 #define SBRENCODER_LIB_VL1 3
106 #define SBRENCODER_LIB_VL2 4
107 
108 
109 
110 /***************************************************************************/
111 /*
112  * SBR Delay balancing definitions.
113  */
114 
115 /*
116       input buffer (1ch)
117 
118       |------------ 1537   -------------|-----|---------- 2048 -------------|
119            (core2sbr delay     )          ds     (read, core and ds area)
120 */
121 
122 #define SFB(dwnsmp)        (32 << (dwnsmp-1))     /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */
123 #define STS(fl)            (((fl)==1024)?32:30)   /* SBR Time Slots: 32 for core frame length 1024, 30 for core frame length 960 */
124 
125 #define DELAY_QMF_ANA(dwnsmp) ((320<<((dwnsmp)-1)) - (32<<((dwnsmp)-1))) /* Full bandwidth */
126 #define DELAY_HYB_ANA         (10*64)       /* + 0.5 */              /*  */
127 #define DELAY_HYB_SYN         (6*64 - 32)                            /*  */
128 #define DELAY_QMF_POSTPROC(dwnsmp) (32*(dwnsmp))                     /* QMF postprocessing delay */
129 #define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp) )                     /* Decoder QMF overlap */
130 #define DELAY_QMF_SYN         (2)                                    /* NO_POLY/2=2.5, rounded down to 2 */
131 #define DELAY_QMF_DS          (32)                                   /* QMF synthesis for downsampled time signal */
132 
133 /* Delay in QMF paths */
134 #define DELAY_SBR(fl,dwnsmp)     (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp)*STS(fl) - 1) + DELAY_QMF_SYN)
135 #define DELAY_PS(fl,dwnsmp)      (DELAY_QMF_ANA(dwnsmp) + DELAY_HYB_ANA + DELAY_DEC_QMF(dwnsmp) + (SFB(dwnsmp)*STS(fl)-1) + DELAY_HYB_SYN + DELAY_QMF_SYN)
136 #define DELAY_ELDSBR(fl,dwnsmp)  ( ( ((fl)/2)*(dwnsmp) ) - 1 + DELAY_QMF_POSTPROC(dwnsmp) )
137 
138 /* Delay differences for SBR and SBR+PS */
139 #define MAX_DS_FILTER_DELAY (5)                                           /* the additional max downsampler filter delay (source fs) */
140 #define DELAY_AAC2SBR(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN) - DELAY_SBR((fl),(dwnsmp)))
141 #define DELAY_ELD2SBR(fl,dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp)) - DELAY_ELDSBR(fl,dwnsmp))
142 #define DELAY_AAC2PS(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_QMF_DS + /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_HYB_SYN + DELAY_QMF_SYN) - DELAY_PS(fl,dwnsmp)) /* 2048 - 463*2 */
143 
144 /* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller than the sample delay implied by DELAY_AAC2SBR */
145 #define MAX_SAMPLE_DELAY       (DELAY_AAC2SBR(1024,2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame length of 1024 and dual-rate sbr */
146 
147 /***************************************************************************/
148 
149 
150 
151 #define INVALID_TABLE_IDX -1
152 
153 /***************************************************************************/
154 /*!
155 
156   \brief  Selects the SBR tuning settings to use dependent on number of
157           channels, bitrate, sample rate and core coder
158 
159   \return Index to the appropriate table
160 
161 ****************************************************************************/
162 #define DISTANCE_CEIL_VALUE 5000000
163 static INT
getSbrTuningTableIndex(UINT bitrate,UINT numChannels,UINT sampleRate,AUDIO_OBJECT_TYPE core,UINT * pBitRateClosest)164 getSbrTuningTableIndex(UINT bitrate,    /*! the total bitrate in bits/sec */
165                        UINT numChannels,/*! the number of channels for the core coder */
166                        UINT sampleRate,  /*! the sampling rate of the core coder */
167                        AUDIO_OBJECT_TYPE core,
168                        UINT *pBitRateClosest
169                        )
170 {
171   int i, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0;
172   UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE;
173   int isforThisCodec=0;
174 
175   #define isForThisCore(i) \
176     ( ( sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD ) || \
177       ( sbrTuningTable[i].coreCoder == CODEC_AAC   && core != AOT_ER_AAC_ELD ) )
178 
179   for (i=0; i < sbrTuningTableSize ; i++) {
180     if ( isForThisCore(i) ) /* tuning table is for this core codec */
181     {
182       if ( numChannels == sbrTuningTable [i].numChannels
183         && sampleRate == sbrTuningTable [i].sampleRate )
184       {
185         found = 1;
186         if ((bitrate >= sbrTuningTable [i].bitrateFrom) &&
187             (bitrate < sbrTuningTable [i].bitrateTo)) {
188               bitRateClosestLower = bitrate;
189               bitRateClosestUpper = bitrate;
190               //FDKprintf("entry %d\n", i);
191           return i ;
192         } else {
193           if ( sbrTuningTable [i].bitrateFrom > bitrate ) {
194             if (sbrTuningTable [i].bitrateFrom < bitRateClosestLower) {
195               bitRateClosestLower = sbrTuningTable [i].bitrateFrom;
196               bitRateClosestLowerIndex = i;
197             }
198           }
199           if ( sbrTuningTable [i].bitrateTo <= bitrate ) {
200             if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) {
201               bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1;
202               bitRateClosestUpperIndex = i;
203             }
204           }
205         }
206       }
207     }
208   }
209 
210   if (pBitRateClosest != NULL)
211   {
212     /* If there was at least one matching tuning entry found then pick the least distance bit rate */
213     if (found)
214     {
215       int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE;
216       if (bitRateClosestLowerIndex >= 0) {
217         distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate;
218       }
219       if (bitRateClosestUpperIndex >= 0) {
220         distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo;
221       }
222       if ( distanceUpper < distanceLower )
223       {
224         *pBitRateClosest = bitRateClosestUpper;
225       } else {
226         *pBitRateClosest = bitRateClosestLower;
227       }
228     } else {
229       *pBitRateClosest = 0;
230     }
231   }
232 
233   return INVALID_TABLE_IDX;
234 }
235 
236 /***************************************************************************/
237 /*!
238 
239   \brief  Selects the PS tuning settings to use dependent on bitrate
240   and core coder
241 
242   \return Index to the appropriate table
243 
244 ****************************************************************************/
245 static INT
getPsTuningTableIndex(UINT bitrate,UINT * pBitRateClosest)246 getPsTuningTableIndex(UINT bitrate, UINT *pBitRateClosest){
247 
248   INT i, paramSets = sizeof (psTuningTable) / sizeof (psTuningTable [0]);
249   int bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1;
250   UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE;
251 
252   for (i = 0 ; i < paramSets ; i++)  {
253     if ((bitrate >= psTuningTable [i].bitrateFrom) &&
254         (bitrate < psTuningTable [i].bitrateTo)) {
255       return i ;
256     } else {
257       if ( psTuningTable [i].bitrateFrom > bitrate ) {
258         if (psTuningTable [i].bitrateFrom < bitRateClosestLower) {
259           bitRateClosestLower = psTuningTable [i].bitrateFrom;
260           bitRateClosestLowerIndex = i;
261         }
262       }
263       if ( psTuningTable [i].bitrateTo <= bitrate ) {
264         if (psTuningTable [i].bitrateTo > bitRateClosestUpper) {
265           bitRateClosestUpper = psTuningTable [i].bitrateTo-1;
266           bitRateClosestUpperIndex = i;
267         }
268       }
269     }
270   }
271 
272   if (pBitRateClosest != NULL)
273   {
274     int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE;
275     if (bitRateClosestLowerIndex >= 0) {
276       distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate;
277     }
278     if (bitRateClosestUpperIndex >= 0) {
279       distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo;
280     }
281     if ( distanceUpper < distanceLower )
282     {
283       *pBitRateClosest = bitRateClosestUpper;
284     } else {
285       *pBitRateClosest = bitRateClosestLower;
286     }
287   }
288 
289   return INVALID_TABLE_IDX;
290 }
291 
292 /***************************************************************************/
293 /*!
294 
295   \brief  In case of downsampled SBR we may need to lower the stop freq
296           of a tuning setting to fit into the lower half of the
297           spectrum ( which is sampleRate/4 )
298 
299   \return the adapted stop frequency index (-1 -> error)
300 
301   \ingroup SbrEncCfg
302 
303 ****************************************************************************/
304 static INT
FDKsbrEnc_GetDownsampledStopFreq(const INT sampleRateCore,const INT startFreq,INT stopFreq,const INT downSampleFactor)305 FDKsbrEnc_GetDownsampledStopFreq (
306         const INT sampleRateCore,
307         const INT startFreq,
308               INT stopFreq,
309         const INT downSampleFactor
310         )
311 {
312   INT maxStopFreqRaw = sampleRateCore / 2;
313   INT startBand, stopBand;
314   HANDLE_ERROR_INFO err;
315 
316   while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) {
317     stopFreq--;
318   }
319 
320   if (FDKsbrEnc_getSbrStopFreqRAW( stopFreq, sampleRateCore) > maxStopFreqRaw)
321     return -1;
322 
323   err = FDKsbrEnc_FindStartAndStopBand (
324                 sampleRateCore<<(downSampleFactor-1),
325                 sampleRateCore,
326                 32<<(downSampleFactor-1),
327                 startFreq,
328                 stopFreq,
329                &startBand,
330                &stopBand
331                 );
332   if (err)
333     return -1;
334 
335   return stopFreq;
336 }
337 
338 
339 /***************************************************************************/
340 /*!
341 
342   \brief  tells us, if for the given coreCoder, bitrate, number of channels
343           and input sampling rate an SBR setting is available. If yes, it
344           tells us also the core sampling rate we would need to run with
345 
346   \return a flag indicating success: yes (1) or no (0)
347 
348 ****************************************************************************/
349 static UINT
FDKsbrEnc_IsSbrSettingAvail(UINT bitrate,UINT vbrMode,UINT numOutputChannels,UINT sampleRateInput,UINT sampleRateCore,AUDIO_OBJECT_TYPE core)350 FDKsbrEnc_IsSbrSettingAvail (
351         UINT bitrate,           /*! the total bitrate in bits/sec */
352         UINT vbrMode,           /*! the vbr paramter, 0 means constant bitrate */
353         UINT numOutputChannels, /*! the number of channels for the core coder */
354         UINT sampleRateInput,   /*! the input sample rate [in Hz] */
355         UINT sampleRateCore,    /*! the core's sampling rate */
356         AUDIO_OBJECT_TYPE core
357         )
358 {
359   INT idx = INVALID_TABLE_IDX;
360 
361   if (sampleRateInput < 16000)
362     return 0;
363 
364   if (bitrate==0) {
365     /* map vbr quality to bitrate */
366     if (vbrMode < 30)
367       bitrate = 24000;
368     else if (vbrMode < 40)
369       bitrate = 28000;
370     else if (vbrMode < 60)
371       bitrate = 32000;
372     else if (vbrMode < 75)
373       bitrate = 40000;
374     else
375       bitrate = 48000;
376     bitrate *= numOutputChannels;
377   }
378 
379   idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, NULL);
380 
381   return (idx == INVALID_TABLE_IDX ? 0 : 1);
382 }
383 
384 
385 /***************************************************************************/
386 /*!
387 
388   \brief  Adjusts the SBR settings according to the chosen core coder
389           settings which are accessible via config->codecSettings
390 
391   \return A flag indicating success: yes (1) or no (0)
392 
393 ****************************************************************************/
394 static UINT
FDKsbrEnc_AdjustSbrSettings(const sbrConfigurationPtr config,UINT bitRate,UINT numChannels,UINT sampleRateCore,UINT sampleRateSbr,UINT transFac,UINT standardBitrate,UINT vbrMode,UINT useSpeechConfig,UINT lcsMode,UINT bParametricStereo,AUDIO_OBJECT_TYPE core)395 FDKsbrEnc_AdjustSbrSettings (const sbrConfigurationPtr config, /*! output, modified */
396                    UINT bitRate,             /*! the total bitrate in bits/sec */
397                    UINT numChannels,         /*! the core coder number of channels */
398                    UINT sampleRateCore,      /*! the core coder sampling rate in Hz */
399                    UINT sampleRateSbr,       /*! the sbr coder sampling rate in Hz */
400                    UINT transFac,            /*! the short block to long block ratio */
401                    UINT standardBitrate,     /*! the standard bitrate per channel in bits/sec */
402                    UINT vbrMode,             /*! the vbr paramter, 0 poor quality .. 100 high quality*/
403                    UINT useSpeechConfig,     /*!< adapt tuning parameters for speech ? */
404                    UINT lcsMode,             /*! the low complexity stereo mode */
405                    UINT bParametricStereo,   /*!< use parametric stereo */
406                    AUDIO_OBJECT_TYPE core)   /* Core audio codec object type */
407 {
408   INT idx = INVALID_TABLE_IDX;
409   /* set the core codec settings */
410   config->codecSettings.bitRate         = bitRate;
411   config->codecSettings.nChannels       = numChannels;
412   config->codecSettings.sampleFreq      = sampleRateCore;
413   config->codecSettings.transFac        = transFac;
414   config->codecSettings.standardBitrate = standardBitrate;
415 
416   if (bitRate==0) {
417     /* map vbr quality to bitrate */
418     if (vbrMode < 30)
419       bitRate = 24000;
420     else if (vbrMode < 40)
421       bitRate = 28000;
422     else if (vbrMode < 60)
423       bitRate = 32000;
424     else if (vbrMode < 75)
425       bitRate = 40000;
426     else
427       bitRate = 48000;
428     bitRate *= numChannels;
429     /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */
430     if (numChannels==1) {
431       if (sampleRateSbr==44100 || sampleRateSbr==48000) {
432         if (vbrMode<40) bitRate = 32000;
433       }
434     }
435   }
436 
437   idx = getSbrTuningTableIndex(bitRate,numChannels,sampleRateCore, core, NULL);
438 
439   if (idx != INVALID_TABLE_IDX) {
440     config->startFreq       = sbrTuningTable[idx].startFreq ;
441     config->stopFreq        = sbrTuningTable[idx].stopFreq ;
442     if (useSpeechConfig) {
443       config->startFreq     = sbrTuningTable[idx].startFreqSpeech;
444       config->stopFreq      = sbrTuningTable[idx].stopFreqSpeech;
445     }
446 
447     /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */
448     if (1 == config->downSampleFactor) {
449       INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq(
450                                sampleRateCore,
451                                config->startFreq,
452                                config->stopFreq,
453                                config->downSampleFactor
454                                );
455       if (dsStopFreq < 0) {
456         return 0;
457       }
458 
459       config->stopFreq = dsStopFreq;
460     }
461 
462     config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands ;
463     if (core == AOT_ER_AAC_ELD)
464       config->init_amp_res_FF = SBR_AMP_RES_1_5;
465     config->noiseFloorOffset= sbrTuningTable[idx].noiseFloorOffset;
466 
467     config->ana_max_level   = sbrTuningTable[idx].noiseMaxLevel ;
468     config->stereoMode      = sbrTuningTable[idx].stereoMode ;
469     config->freqScale       = sbrTuningTable[idx].freqScale ;
470 
471     /* adjust usage of parametric coding dependent on bitrate and speech config flag */
472     if (useSpeechConfig)
473       config->parametricCoding  = 0;
474 
475     if (core == AOT_ER_AAC_ELD) {
476       if (bitRate < 28000)
477         config->init_amp_res_FF = SBR_AMP_RES_3_0;
478       config->SendHeaderDataTime = -1;
479     }
480 
481     if (numChannels == 1) {
482       if (bitRate < 16000) {
483         config->parametricCoding  = 0;
484       }
485     }
486     else {
487       if (bitRate < 20000) {
488         config->parametricCoding  = 0;
489       }
490     }
491 
492     config->useSpeechConfig = useSpeechConfig;
493 
494     /* PS settings */
495     config->bParametricStereo = bParametricStereo;
496 
497     return 1 ;
498   }
499   else {
500     return 0 ;
501   }
502 }
503 
504 /*****************************************************************************
505 
506  functionname: FDKsbrEnc_InitializeSbrDefaults
507  description:  initializes the SBR confifuration
508  returns:      error status
509  input:        - core codec type,
510                - factor of SBR to core frame length,
511                - core frame length
512  output:       initialized SBR configuration
513 
514 *****************************************************************************/
515 static UINT
FDKsbrEnc_InitializeSbrDefaults(sbrConfigurationPtr config,INT downSampleFactor,UINT codecGranuleLen)516 FDKsbrEnc_InitializeSbrDefaults (sbrConfigurationPtr config,
517                                  INT                 downSampleFactor,
518                                  UINT                codecGranuleLen
519                                  )
520 {
521     if ( (downSampleFactor < 1 || downSampleFactor > 2) ||
522          (codecGranuleLen*downSampleFactor > QMF_CHANNELS*QMF_MAX_TIME_SLOTS) )
523        return(0); /* error */
524 
525     config->SendHeaderDataTime     = 1000;
526     config->useWaveCoding          = 0;
527     config->crcSbr                 = 0;
528     config->dynBwSupported         = 1;
529     config->tran_thr               = 13000;
530     config->parametricCoding       = 1;
531 
532     config->sbrFrameSize           = codecGranuleLen * downSampleFactor;
533     config->downSampleFactor       = downSampleFactor;
534 
535     /* sbr default parameters */
536     config->sbr_data_extra         = 0;
537     config->amp_res                = SBR_AMP_RES_3_0 ;
538     config->tran_fc                = 0 ;
539     config->tran_det_mode          = 1 ;
540     config->spread                 = 1 ;
541     config->stat                   = 0 ;
542     config->e                      = 1 ;
543     config->deltaTAcrossFrames     = 1 ;
544     config->dF_edge_1stEnv         = FL2FXCONST_DBL(0.3f) ;
545     config->dF_edge_incr           = FL2FXCONST_DBL(0.3f) ;
546 
547     config->sbr_invf_mode   = INVF_SWITCHED;
548     config->sbr_xpos_mode   = XPOS_LC;
549     config->sbr_xpos_ctrl   = SBR_XPOS_CTRL_DEFAULT;
550     config->sbr_xpos_level  = 0;
551     config->useSaPan        = 0;
552     config->dynBwEnabled    = 0;
553 
554 
555     /* the following parameters are overwritten by the FDKsbrEnc_AdjustSbrSettings() function since
556        they are included in the tuning table */
557     config->stereoMode             = SBR_SWITCH_LRC;
558     config->ana_max_level          = 6;
559     config->noiseFloorOffset       = 0;
560     config->startFreq              = 5; /*  5.9 respectively  6.0 kHz at fs = 44.1/48 kHz */
561     config->stopFreq               = 9; /* 16.2 respectively 16.8 kHz at fs = 44.1/48 kHz */
562 
563 
564     /* header_extra_1 */
565     config->freqScale       = SBR_FREQ_SCALE_DEFAULT;
566     config->alterScale      = SBR_ALTER_SCALE_DEFAULT;
567     config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT;
568 
569     /* header_extra_2 */
570     config->sbr_limiter_bands    = SBR_LIMITER_BANDS_DEFAULT;
571     config->sbr_limiter_gains    = SBR_LIMITER_GAINS_DEFAULT;
572     config->sbr_interpol_freq    = SBR_INTERPOL_FREQ_DEFAULT;
573     config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT;
574 
575     return 1;
576 }
577 
578 
579 /*****************************************************************************
580 
581  functionname: DeleteEnvChannel
582  description:  frees memory of one SBR channel
583  returns:      -
584  input:        handle of channel
585  output:       released handle
586 
587 *****************************************************************************/
588 static void
deleteEnvChannel(HANDLE_ENV_CHANNEL hEnvCut)589 deleteEnvChannel (HANDLE_ENV_CHANNEL hEnvCut)
590 {
591   if (hEnvCut) {
592 
593     FDKsbrEnc_DeleteTonCorrParamExtr(&hEnvCut->TonCorr);
594 
595     FDKsbrEnc_deleteExtractSbrEnvelope (&hEnvCut->sbrExtractEnvelope);
596   }
597 
598 }
599 
600 
601 /*****************************************************************************
602 
603  functionname: sbrEncoder_ChannelClose
604  description:  close the channel coding handle
605  returns:
606  input:        phSbrChannel
607  output:
608 
609 *****************************************************************************/
610 static void
sbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel)611 sbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel)
612 {
613   if (hSbrChannel != NULL)
614   {
615     deleteEnvChannel (&hSbrChannel->hEnvChannel);
616   }
617 }
618 
619 /*****************************************************************************
620 
621  functionname: sbrEncoder_ElementClose
622  description:  close the channel coding handle
623  returns:
624  input:        phSbrChannel
625  output:
626 
627 *****************************************************************************/
628 static void
sbrEncoder_ElementClose(HANDLE_SBR_ELEMENT * phSbrElement)629 sbrEncoder_ElementClose(HANDLE_SBR_ELEMENT *phSbrElement)
630 {
631   HANDLE_SBR_ELEMENT hSbrElement = *phSbrElement;
632 
633   if (hSbrElement!=NULL) {
634     if (hSbrElement->sbrConfigData.v_k_master)
635       FreeRam_Sbr_v_k_master(&hSbrElement->sbrConfigData.v_k_master);
636     if (hSbrElement->sbrConfigData.freqBandTable[LO])
637       FreeRam_Sbr_freqBandTableLO(&hSbrElement->sbrConfigData.freqBandTable[LO]);
638     if (hSbrElement->sbrConfigData.freqBandTable[HI])
639       FreeRam_Sbr_freqBandTableHI(&hSbrElement->sbrConfigData.freqBandTable[HI]);
640 
641     FreeRam_SbrElement(phSbrElement);
642   }
643   return ;
644 
645 }
646 
647 
sbrEncoder_Close(HANDLE_SBR_ENCODER * phSbrEncoder)648 void sbrEncoder_Close (HANDLE_SBR_ENCODER *phSbrEncoder)
649 {
650   HANDLE_SBR_ENCODER hSbrEncoder = *phSbrEncoder;
651 
652   if (hSbrEncoder != NULL)
653   {
654     int el, ch;
655 
656     for (el=0; el<(8); el++)
657     {
658       if (hSbrEncoder->sbrElement[el]!=NULL) {
659         sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]);
660       }
661     }
662 
663     /* Close sbr Channels */
664     for (ch=0; ch<(8); ch++)
665     {
666       if (hSbrEncoder->pSbrChannel[ch]) {
667         sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]);
668         FreeRam_SbrChannel(&hSbrEncoder->pSbrChannel[ch]);
669       }
670 
671       if (hSbrEncoder->QmfAnalysis[ch].FilterStates)
672         FreeRam_Sbr_QmfStatesAnalysis((FIXP_QAS**)&hSbrEncoder->QmfAnalysis[ch].FilterStates);
673 
674 
675     }
676 
677     if (hSbrEncoder->hParametricStereo)
678       PSEnc_Destroy(&hSbrEncoder->hParametricStereo);
679     if (hSbrEncoder->qmfSynthesisPS.FilterStates)
680       FreeRam_PsQmfStatesSynthesis((FIXP_DBL**)&hSbrEncoder->qmfSynthesisPS.FilterStates);
681 
682     /* Release Overlay */
683     FreeRam_SbrDynamic_RAM((FIXP_DBL**)&hSbrEncoder->pSBRdynamic_RAM);
684 
685 
686     FreeRam_SbrEncoder(phSbrEncoder);
687   }
688 
689 }
690 
691 /*****************************************************************************
692 
693  functionname: updateFreqBandTable
694  description:  updates vk_master
695  returns:      -
696  input:        config handle
697  output:       error info
698 
699 *****************************************************************************/
updateFreqBandTable(HANDLE_SBR_CONFIG_DATA sbrConfigData,HANDLE_SBR_HEADER_DATA sbrHeaderData,const INT downSampleFactor)700 static INT updateFreqBandTable(
701         HANDLE_SBR_CONFIG_DATA  sbrConfigData,
702         HANDLE_SBR_HEADER_DATA  sbrHeaderData,
703         const INT               downSampleFactor
704         )
705 {
706   INT k0, k2;
707 
708   if( FDKsbrEnc_FindStartAndStopBand (
709               sbrConfigData->sampleFreq,
710               sbrConfigData->sampleFreq >> (downSampleFactor-1),
711               sbrConfigData->noQmfBands,
712               sbrHeaderData->sbr_start_frequency,
713               sbrHeaderData->sbr_stop_frequency,
714              &k0,
715              &k2
716               )
717     )
718     return(1);
719 
720 
721   if( FDKsbrEnc_UpdateFreqScale(
722               sbrConfigData->v_k_master,
723              &sbrConfigData->num_Master,
724               k0,
725               k2,
726               sbrHeaderData->freqScale,
727               sbrHeaderData->alterScale
728               )
729     )
730     return(1);
731 
732 
733   sbrHeaderData->sbr_xover_band=0;
734 
735 
736   if( FDKsbrEnc_UpdateHiRes(
737               sbrConfigData->freqBandTable[HI],
738               &sbrConfigData->nSfb[HI],
739               sbrConfigData->v_k_master,
740               sbrConfigData->num_Master,
741               &sbrHeaderData->sbr_xover_band
742               )
743     )
744     return(1);
745 
746 
747   FDKsbrEnc_UpdateLoRes(
748           sbrConfigData->freqBandTable[LO],
749           &sbrConfigData->nSfb[LO],
750           sbrConfigData->freqBandTable[HI],
751           sbrConfigData->nSfb[HI]
752           );
753 
754 
755   sbrConfigData->xOverFreq = (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / sbrConfigData->noQmfBands+1)>>1;
756 
757   return (0);
758 }
759 
760 
761 /*****************************************************************************
762 
763  functionname: resetEnvChannel
764  description:  resets parameters and allocates memory
765  returns:      error status
766  input:
767  output:       hEnv
768 
769 *****************************************************************************/
resetEnvChannel(HANDLE_SBR_CONFIG_DATA sbrConfigData,HANDLE_SBR_HEADER_DATA sbrHeaderData,HANDLE_ENV_CHANNEL hEnv)770 static INT resetEnvChannel (HANDLE_SBR_CONFIG_DATA  sbrConfigData,
771                             HANDLE_SBR_HEADER_DATA  sbrHeaderData,
772                             HANDLE_ENV_CHANNEL      hEnv)
773 {
774   /* note !!! hEnv->encEnvData.noOfnoisebands will be updated later in function FDKsbrEnc_extractSbrEnvelope !!!*/
775   hEnv->TonCorr.sbrNoiseFloorEstimate.noiseBands =  sbrHeaderData->sbr_noise_bands;
776 
777 
778   if(FDKsbrEnc_ResetTonCorrParamExtr(&hEnv->TonCorr,
779                            sbrConfigData->xposCtrlSwitch,
780                            sbrConfigData->freqBandTable[HI][0],
781                            sbrConfigData->v_k_master,
782                            sbrConfigData->num_Master,
783                            sbrConfigData->sampleFreq,
784                            sbrConfigData->freqBandTable,
785                            sbrConfigData->nSfb,
786                            sbrConfigData->noQmfBands))
787     return(1);
788 
789   hEnv->sbrCodeNoiseFloor.nSfb[LO] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
790   hEnv->sbrCodeNoiseFloor.nSfb[HI] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
791 
792   hEnv->sbrCodeEnvelope.nSfb[LO] = sbrConfigData->nSfb[LO];
793   hEnv->sbrCodeEnvelope.nSfb[HI] = sbrConfigData->nSfb[HI];
794 
795   hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI];
796 
797   hEnv->sbrCodeEnvelope.upDate = 0;
798   hEnv->sbrCodeNoiseFloor.upDate = 0;
799 
800   return (0);
801 }
802 
803 /* ****************************** FDKsbrEnc_SbrGetXOverFreq ******************************/
804 /**
805  * @fn
806  * @brief       calculates the closest possible crossover frequency
807  * @return      the crossover frequency SBR accepts
808  *
809  */
810 static INT
FDKsbrEnc_SbrGetXOverFreq(HANDLE_SBR_ELEMENT hEnv,INT xoverFreq)811 FDKsbrEnc_SbrGetXOverFreq(HANDLE_SBR_ELEMENT  hEnv,        /*!< handle to SBR encoder instance */
812                           INT                 xoverFreq)   /*!< from core coder suggested crossover frequency */
813 {
814   INT band;
815   INT lastDiff, newDiff;
816   INT cutoffSb;
817 
818   UCHAR *RESTRICT pVKMaster = hEnv->sbrConfigData.v_k_master;
819 
820   /* Check if there is a matching cutoff frequency in the master table */
821   cutoffSb = (4*xoverFreq * hEnv->sbrConfigData.noQmfBands / hEnv->sbrConfigData.sampleFreq + 1)>>1;
822   lastDiff = cutoffSb;
823   for (band = 0; band < hEnv->sbrConfigData.num_Master; band++) {
824 
825     newDiff = fixp_abs((INT)pVKMaster[band] - cutoffSb);
826 
827     if(newDiff >= lastDiff) {
828       band--;
829       break;
830     }
831 
832     lastDiff = newDiff;
833   }
834 
835   return ((pVKMaster[band] * hEnv->sbrConfigData.sampleFreq/hEnv->sbrConfigData.noQmfBands+1)>>1);
836 }
837 
838 /*****************************************************************************
839 
840  functionname: FDKsbrEnc_EnvEncodeFrame
841  description: performs the sbr envelope calculation for one element
842  returns:
843  input:
844  output:
845 
846 *****************************************************************************/
847 INT
FDKsbrEnc_EnvEncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder,int iElement,INT_PCM * samples,UINT timeInStride,UINT * sbrDataBits,UCHAR * sbrData,int clearOutput)848 FDKsbrEnc_EnvEncodeFrame(HANDLE_SBR_ENCODER   hEnvEncoder,
849                          int                  iElement,
850                          INT_PCM             *samples,                 /*!< time samples, always interleaved */
851                          UINT                 timeInStride,            /*!< time buffer channel interleaving stride */
852                          UINT                *sbrDataBits,             /*!< Size of SBR payload  */
853                          UCHAR               *sbrData,                 /*!< SBR payload  */
854                          int                  clearOutput              /*!< Do not consider any input signal */
855                         )
856 {
857   HANDLE_SBR_ELEMENT hSbrElement = hEnvEncoder->sbrElement[iElement];
858   FDK_CRCINFO  crcInfo;
859   INT    crcReg;
860   INT    ch;
861   INT    band;
862   INT    cutoffSb;
863   INT    newXOver;
864 
865   if (hEnvEncoder == NULL)
866     return -1;
867 
868   hSbrElement = hEnvEncoder->sbrElement[iElement];
869 
870   if (hSbrElement == NULL)
871     return -1;
872 
873 
874   /* header bitstream handling */
875   HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData = &hSbrElement->sbrBitstreamData;
876 
877   INT psHeaderActive = 0;
878   sbrBitstreamData->HeaderActive = 0;
879 
880   /* Anticipate PS header because of internal PS bitstream delay in order to be in sync with SBR header. */
881   if ( sbrBitstreamData->CountSendHeaderData==(sbrBitstreamData->NrSendHeaderData-1) )
882   {
883       psHeaderActive = 1;
884   }
885 
886   /* Signal SBR header to be written into bitstream */
887   if ( sbrBitstreamData->CountSendHeaderData==0  )
888   {
889      sbrBitstreamData->HeaderActive = 1;
890   }
891 
892   /* Increment header interval counter */
893   if (sbrBitstreamData->NrSendHeaderData == 0) {
894     sbrBitstreamData->CountSendHeaderData = 1;
895   }
896   else {
897     if (sbrBitstreamData->CountSendHeaderData >= 0) {
898       sbrBitstreamData->CountSendHeaderData++;
899       sbrBitstreamData->CountSendHeaderData %= sbrBitstreamData->NrSendHeaderData;
900     }
901   }
902 
903   if (hSbrElement->CmonData.dynBwEnabled ) {
904     INT i;
905     for ( i = 4; i > 0; i-- )
906       hSbrElement->dynXOverFreqDelay[i] = hSbrElement->dynXOverFreqDelay[i-1];
907 
908     hSbrElement->dynXOverFreqDelay[0] = hSbrElement->CmonData.dynXOverFreqEnc;
909     if (hSbrElement->dynXOverFreqDelay[1] > hSbrElement->dynXOverFreqDelay[2])
910       newXOver = hSbrElement->dynXOverFreqDelay[2];
911     else
912       newXOver = hSbrElement->dynXOverFreqDelay[1];
913 
914     /* has the crossover frequency changed? */
915     if ( hSbrElement->sbrConfigData.dynXOverFreq != newXOver ) {
916 
917       /* get corresponding master band */
918       cutoffSb = ((4* newXOver * hSbrElement->sbrConfigData.noQmfBands
919                   / hSbrElement->sbrConfigData.sampleFreq)+1)>>1;
920 
921       for ( band = 0; band < hSbrElement->sbrConfigData.num_Master; band++ ) {
922         if ( cutoffSb == hSbrElement->sbrConfigData.v_k_master[band] )
923           break;
924       }
925       FDK_ASSERT( band < hSbrElement->sbrConfigData.num_Master );
926 
927       hSbrElement->sbrConfigData.dynXOverFreq = newXOver;
928       hSbrElement->sbrHeaderData.sbr_xover_band = band;
929       hSbrElement->sbrBitstreamData.HeaderActive=1;
930       psHeaderActive = 1; /* ps header is one frame delayed */
931 
932       /*
933         update vk_master table
934       */
935       if(updateFreqBandTable(&hSbrElement->sbrConfigData,
936                              &hSbrElement->sbrHeaderData,
937                              hEnvEncoder->downSampleFactor
938                              ))
939         return(1);
940 
941 
942       /* reset SBR channels */
943       INT nEnvCh = hSbrElement->sbrConfigData.nChannels;
944       for ( ch = 0; ch < nEnvCh; ch++ ) {
945         if(resetEnvChannel (&hSbrElement->sbrConfigData,
946                             &hSbrElement->sbrHeaderData,
947                             &hSbrElement->sbrChannel[ch]->hEnvChannel))
948           return(1);
949 
950       }
951     }
952   }
953 
954   /*
955     allocate space for dummy header and crc
956   */
957   crcReg = FDKsbrEnc_InitSbrBitstream(&hSbrElement->CmonData,
958                                        hSbrElement->payloadDelayLine[hEnvEncoder->nBitstrDelay],
959                                        MAX_PAYLOAD_SIZE*sizeof(UCHAR),
960                                       &crcInfo,
961                                        hSbrElement->sbrConfigData.sbrSyntaxFlags);
962 
963   /* Temporal Envelope Data */
964   SBR_FRAME_TEMP_DATA _fData;
965   SBR_FRAME_TEMP_DATA *fData = &_fData;
966   SBR_ENV_TEMP_DATA eData[MAX_NUM_CHANNELS];
967 
968   /* Init Temporal Envelope Data */
969   {
970     int i;
971 
972     FDKmemclear(&eData[0], sizeof(SBR_ENV_TEMP_DATA));
973     FDKmemclear(&eData[1], sizeof(SBR_ENV_TEMP_DATA));
974     FDKmemclear(fData, sizeof(SBR_FRAME_TEMP_DATA));
975 
976     for(i=0; i<MAX_NUM_NOISE_VALUES; i++)
977       fData->res[i] = FREQ_RES_HIGH;
978   }
979 
980 
981   if (!clearOutput)
982   {
983     /*
984      * Transform audio data into QMF domain
985      */
986     for(ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++)
987     {
988       HANDLE_ENV_CHANNEL h_envChan = &hSbrElement->sbrChannel[ch]->hEnvChannel;
989       HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &h_envChan->sbrExtractEnvelope;
990 
991       if(hSbrElement->elInfo.fParametricStereo == 0)
992       {
993         QMF_SCALE_FACTOR tmpScale;
994         FIXP_DBL **pQmfReal, **pQmfImag;
995         C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
996 
997 
998         /* Obtain pointers to QMF buffers. */
999         pQmfReal = sbrExtrEnv->rBuffer;
1000         pQmfImag = sbrExtrEnv->iBuffer;
1001 
1002         qmfAnalysisFiltering( hSbrElement->hQmfAnalysis[ch],
1003                                pQmfReal,
1004                                pQmfImag,
1005                               &tmpScale,
1006                                samples + hSbrElement->elInfo.ChannelIndex[ch],
1007                                timeInStride,
1008                                qmfWorkBuffer );
1009 
1010         h_envChan->qmfScale = tmpScale.lb_scale + 7;
1011 
1012 
1013         C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
1014 
1015       } /* fParametricStereo == 0 */
1016 
1017 
1018       /*
1019         Parametric Stereo processing
1020       */
1021       if (hSbrElement->elInfo.fParametricStereo)
1022       {
1023         INT error = noError;
1024 
1025 
1026         /* Limit Parametric Stereo to one instance */
1027         FDK_ASSERT(ch == 0);
1028 
1029 
1030         if(error == noError){
1031           /* parametric stereo processing:
1032              - input:
1033                o left and right time domain samples
1034              - processing:
1035                o stereo qmf analysis
1036                o stereo hybrid analysis
1037                o ps parameter extraction
1038                o downmix + hybrid synthesis
1039              - output:
1040                o downmixed qmf data is written to sbrExtrEnv->rBuffer and sbrExtrEnv->iBuffer
1041           */
1042           SCHAR qmfScale;
1043           INT_PCM* pSamples[2] = {samples + hSbrElement->elInfo.ChannelIndex[0],samples + hSbrElement->elInfo.ChannelIndex[1]};
1044           error = FDKsbrEnc_PSEnc_ParametricStereoProcessing( hEnvEncoder->hParametricStereo,
1045                                                               pSamples,
1046                                                               timeInStride,
1047                                                               hSbrElement->hQmfAnalysis,
1048                                                               sbrExtrEnv->rBuffer,
1049                                                               sbrExtrEnv->iBuffer,
1050                                                               samples + hSbrElement->elInfo.ChannelIndex[ch],
1051                                                              &hEnvEncoder->qmfSynthesisPS,
1052                                                              &qmfScale,
1053                                                               psHeaderActive );
1054           if (noError != error)
1055           {
1056             error = handBack(error);
1057           }
1058           h_envChan->qmfScale = (int)qmfScale;
1059         }
1060 
1061 
1062       } /* if (hEnvEncoder->hParametricStereo) */
1063 
1064       /*
1065 
1066          Extract Envelope relevant things from QMF data
1067 
1068       */
1069       FDKsbrEnc_extractSbrEnvelope1(
1070                                 &hSbrElement->sbrConfigData,
1071                                 &hSbrElement->sbrHeaderData,
1072                                 &hSbrElement->sbrBitstreamData,
1073                                  h_envChan,
1074                                 &hSbrElement->CmonData,
1075                                 &eData[ch],
1076                                  fData
1077                                  );
1078 
1079     } /* hEnvEncoder->sbrConfigData.nChannels */
1080  }
1081 
1082   /*
1083      Process Envelope relevant things and calculate envelope data and write payload
1084   */
1085   FDKsbrEnc_extractSbrEnvelope2(
1086                                 &hSbrElement->sbrConfigData,
1087                                 &hSbrElement->sbrHeaderData,
1088                                 (hSbrElement->elInfo.fParametricStereo) ? hEnvEncoder->hParametricStereo : NULL,
1089                                 &hSbrElement->sbrBitstreamData,
1090                                 &hSbrElement->sbrChannel[0]->hEnvChannel,
1091                                 &hSbrElement->sbrChannel[1]->hEnvChannel,
1092                                 &hSbrElement->CmonData,
1093                                  eData,
1094                                  fData,
1095                                  clearOutput
1096                                );
1097 
1098   /*
1099     format payload, calculate crc
1100   */
1101   FDKsbrEnc_AssembleSbrBitstream(&hSbrElement->CmonData, &crcInfo, crcReg, hSbrElement->sbrConfigData.sbrSyntaxFlags);
1102 
1103   /*
1104     save new payload, set to zero length if greater than MAX_PAYLOAD_SIZE
1105   */
1106   hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = FDKgetValidBits(&hSbrElement->CmonData.sbrBitbuf);
1107 
1108   if(hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] > (MAX_PAYLOAD_SIZE<<3))
1109     hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay]=0;
1110 
1111   /* While filling the Delay lines, sbrData is NULL */
1112   if (sbrData) {
1113     *sbrDataBits = hSbrElement->payloadDelayLineSize[0];
1114     FDKmemcpy(sbrData, hSbrElement->payloadDelayLine[0], (hSbrElement->payloadDelayLineSize[0]+7)>>3);
1115 
1116 
1117   }
1118 
1119 
1120 /*******************************/
1121 
1122   if (hEnvEncoder->fTimeDomainDownsampling)
1123   {
1124     int ch;
1125     int nChannels = hSbrElement->sbrConfigData.nChannels;
1126 
1127     for (ch=0; ch < nChannels; ch++)
1128     {
1129       INT nOutSamples;
1130 
1131       FDKaacEnc_Downsample(&hSbrElement->sbrChannel[ch]->downSampler,
1132                             samples + hSbrElement->elInfo.ChannelIndex[ch] + hEnvEncoder->bufferOffset,
1133                             hSbrElement->sbrConfigData.frameSize,
1134                             timeInStride,
1135                             samples + hSbrElement->elInfo.ChannelIndex[ch],
1136                            &nOutSamples,
1137                             hEnvEncoder->nChannels);
1138     }
1139   } /* downsample */
1140 
1141 
1142   return (0);
1143 }
1144 
1145 /*****************************************************************************
1146 
1147  functionname: createEnvChannel
1148  description:  initializes parameters and allocates memory
1149  returns:      error status
1150  input:
1151  output:       hEnv
1152 
1153 *****************************************************************************/
1154 
1155 static INT
createEnvChannel(HANDLE_ENV_CHANNEL hEnv,INT channel,UCHAR * dynamic_RAM)1156 createEnvChannel (HANDLE_ENV_CHANNEL     hEnv,
1157                   INT                    channel
1158                  ,UCHAR*                 dynamic_RAM
1159                  )
1160 {
1161   FDKmemclear(hEnv,sizeof (struct ENV_CHANNEL));
1162 
1163   if ( FDKsbrEnc_CreateTonCorrParamExtr(&hEnv->TonCorr,
1164                                          channel) )
1165   {
1166     return(1);
1167   }
1168 
1169   if ( FDKsbrEnc_CreateExtractSbrEnvelope (&hEnv->sbrExtractEnvelope,
1170                                channel
1171                               ,/*chan*/0
1172                               ,dynamic_RAM
1173                               ) )
1174   {
1175     return(1);
1176   }
1177 
1178   return 0;
1179 }
1180 
1181 /*****************************************************************************
1182 
1183  functionname: initEnvChannel
1184  description:  initializes parameters
1185  returns:      error status
1186  input:
1187  output:
1188 
1189 *****************************************************************************/
1190 static INT
initEnvChannel(HANDLE_SBR_CONFIG_DATA sbrConfigData,HANDLE_SBR_HEADER_DATA sbrHeaderData,HANDLE_ENV_CHANNEL hEnv,sbrConfigurationPtr params,ULONG statesInitFlag,INT chanInEl,UCHAR * dynamic_RAM)1191 initEnvChannel (  HANDLE_SBR_CONFIG_DATA sbrConfigData,
1192                   HANDLE_SBR_HEADER_DATA sbrHeaderData,
1193                   HANDLE_ENV_CHANNEL     hEnv,
1194                   sbrConfigurationPtr    params,
1195                   ULONG                  statesInitFlag
1196                  ,INT                    chanInEl
1197                  ,UCHAR*                 dynamic_RAM
1198                  )
1199 {
1200   int frameShift, tran_off=0;
1201   INT e;
1202   INT tran_fc;
1203   INT timeSlots, timeStep, startIndex;
1204   INT noiseBands[2] = { 3, 3 };
1205 
1206   e = 1 << params->e;
1207 
1208   FDK_ASSERT(params->e >= 0);
1209 
1210   hEnv->encEnvData.freq_res_fixfix = 1;
1211   hEnv->fLevelProtect = 0;
1212 
1213   hEnv->encEnvData.ldGrid = (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? 1 : 0;
1214 
1215   hEnv->encEnvData.sbr_xpos_mode = (XPOS_MODE)params->sbr_xpos_mode;
1216 
1217   if (hEnv->encEnvData.sbr_xpos_mode == XPOS_SWITCHED) {
1218     /*
1219        no other type than XPOS_MDCT or XPOS_SPEECH allowed,
1220        but enable switching
1221     */
1222     sbrConfigData->switchTransposers = TRUE;
1223     hEnv->encEnvData.sbr_xpos_mode = XPOS_MDCT;
1224   }
1225   else {
1226     sbrConfigData->switchTransposers = FALSE;
1227   }
1228 
1229   hEnv->encEnvData.sbr_xpos_ctrl = params->sbr_xpos_ctrl;
1230 
1231 
1232   /* extended data */
1233   if(params->parametricCoding) {
1234     hEnv->encEnvData.extended_data = 1;
1235   }
1236   else {
1237     hEnv->encEnvData.extended_data = 0;
1238   }
1239 
1240   hEnv->encEnvData.extension_size = 0;
1241 
1242   startIndex = QMF_FILTER_PROTOTYPE_SIZE - sbrConfigData->noQmfBands;
1243 
1244   switch (params->sbrFrameSize) {
1245   case 2304:
1246     timeSlots = 18;
1247     break;
1248   case 2048:
1249   case 1024:
1250   case 512:
1251     timeSlots = 16;
1252     break;
1253   case 1920:
1254   case 960:
1255   case 480:
1256     timeSlots = 15;
1257     break;
1258   case 1152:
1259     timeSlots = 9;
1260     break;
1261   default:
1262     return (1); /* Illegal frame size */
1263   }
1264 
1265   timeStep = sbrConfigData->noQmfSlots / timeSlots;
1266 
1267   if ( FDKsbrEnc_InitTonCorrParamExtr(params->sbrFrameSize,
1268                                      &hEnv->TonCorr,
1269                                       sbrConfigData,
1270                                       timeSlots,
1271                                       params->sbr_xpos_ctrl,
1272                                       params->ana_max_level,
1273                                       sbrHeaderData->sbr_noise_bands,
1274                                       params->noiseFloorOffset,
1275                                       params->useSpeechConfig) )
1276     return(1);
1277 
1278   hEnv->encEnvData.noOfnoisebands = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
1279 
1280   noiseBands[0] = hEnv->encEnvData.noOfnoisebands;
1281   noiseBands[1] = hEnv->encEnvData.noOfnoisebands;
1282 
1283   hEnv->encEnvData.sbr_invf_mode = (INVF_MODE)params->sbr_invf_mode;
1284 
1285   if (hEnv->encEnvData.sbr_invf_mode == INVF_SWITCHED) {
1286     hEnv->encEnvData.sbr_invf_mode = INVF_MID_LEVEL;
1287     hEnv->TonCorr.switchInverseFilt = TRUE;
1288   }
1289   else {
1290     hEnv->TonCorr.switchInverseFilt = FALSE;
1291   }
1292 
1293 
1294   tran_fc  = params->tran_fc;
1295 
1296   if (tran_fc == 0) {
1297     tran_fc = fixMin (5000, FDKsbrEnc_getSbrStartFreqRAW (sbrHeaderData->sbr_start_frequency,params->codecSettings.sampleFreq));
1298   }
1299 
1300   tran_fc = (tran_fc*4*sbrConfigData->noQmfBands/sbrConfigData->sampleFreq + 1)>>1;
1301 
1302   if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) {
1303     frameShift = LD_PRETRAN_OFF;
1304     tran_off = LD_PRETRAN_OFF + FRAME_MIDDLE_SLOT_512LD*timeStep;
1305   } else
1306   {
1307     frameShift = 0;
1308     switch (timeSlots) {
1309       /* The factor of 2 is by definition. */
1310       case NUMBER_TIME_SLOTS_2048: tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; break;
1311       case NUMBER_TIME_SLOTS_1920: tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; break;
1312       default: return 1;
1313     }
1314   }
1315   if ( FDKsbrEnc_InitExtractSbrEnvelope (&hEnv->sbrExtractEnvelope,
1316                                sbrConfigData->noQmfSlots,
1317                                sbrConfigData->noQmfBands, startIndex,
1318                                timeSlots, timeStep, tran_off,
1319                                statesInitFlag
1320                               ,chanInEl
1321                               ,dynamic_RAM
1322                               ,sbrConfigData->sbrSyntaxFlags
1323                                ) )
1324     return(1);
1325 
1326   if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeEnvelope,
1327                             sbrConfigData->nSfb,
1328                             params->deltaTAcrossFrames,
1329                             params->dF_edge_1stEnv,
1330                             params->dF_edge_incr))
1331     return(1);
1332 
1333   if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeNoiseFloor,
1334                             noiseBands,
1335                             params->deltaTAcrossFrames,
1336                             0,0))
1337     return(1);
1338 
1339   sbrConfigData->initAmpResFF = params->init_amp_res_FF;
1340 
1341   if(FDKsbrEnc_InitSbrHuffmanTables (&hEnv->encEnvData,
1342                            &hEnv->sbrCodeEnvelope,
1343                            &hEnv->sbrCodeNoiseFloor,
1344                            sbrHeaderData->sbr_amp_res))
1345    return(1);
1346 
1347   FDKsbrEnc_initFrameInfoGenerator (&hEnv->SbrEnvFrame,
1348                             params->spread,
1349                             e,
1350                             params->stat,
1351                             timeSlots,
1352                             hEnv->encEnvData.freq_res_fixfix
1353                             ,hEnv->encEnvData.ldGrid
1354                             );
1355 
1356   if(FDKsbrEnc_InitSbrTransientDetector (&hEnv->sbrTransientDetector,
1357                                           sbrConfigData->frameSize,
1358                                           sbrConfigData->sampleFreq,
1359                                           params,
1360                                           tran_fc,
1361                                           sbrConfigData->noQmfSlots,
1362                                           sbrConfigData->noQmfBands,
1363                                           hEnv->sbrExtractEnvelope.YBufferWriteOffset,
1364                                           hEnv->sbrExtractEnvelope.YBufferSzShift,
1365                                           frameShift,
1366                                           tran_off
1367                                           ))
1368   return(1);
1369 
1370 
1371   sbrConfigData->xposCtrlSwitch = params->sbr_xpos_ctrl;
1372 
1373   hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI];
1374   hEnv->encEnvData.addHarmonicFlag = 0;
1375 
1376   return (0);
1377 }
1378 
sbrEncoder_Open(HANDLE_SBR_ENCODER * phSbrEncoder,INT nElements,INT nChannels,INT supportPS)1379 INT sbrEncoder_Open(
1380         HANDLE_SBR_ENCODER  *phSbrEncoder,
1381         INT                  nElements,
1382         INT                  nChannels,
1383         INT                  supportPS
1384         )
1385 {
1386   INT i;
1387   INT errorStatus = 1;
1388   HANDLE_SBR_ENCODER hSbrEncoder = NULL;
1389 
1390   if (phSbrEncoder==NULL
1391      )
1392   {
1393     goto bail;
1394   }
1395 
1396   hSbrEncoder = GetRam_SbrEncoder();
1397   if (hSbrEncoder==NULL) {
1398     goto bail;
1399   }
1400   FDKmemclear(hSbrEncoder, sizeof(SBR_ENCODER));
1401 
1402       hSbrEncoder->pSBRdynamic_RAM = (UCHAR*)GetRam_SbrDynamic_RAM();
1403       hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM;
1404 
1405   for (i=0; i<nElements; i++) {
1406     hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i);
1407     if (hSbrEncoder->sbrElement[i]==NULL) {
1408         goto bail;
1409     }
1410     FDKmemclear(hSbrEncoder->sbrElement[i], sizeof(SBR_ELEMENT));
1411     hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] =  GetRam_Sbr_freqBandTableLO(i);
1412     hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] =  GetRam_Sbr_freqBandTableHI(i);
1413     hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master        =  GetRam_Sbr_v_k_master(i);
1414     if ( (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO]==NULL) ||
1415          (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI]==NULL) ||
1416          (hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master==NULL) )
1417     {
1418         goto bail;
1419     }
1420   }
1421 
1422   for (i=0; i<nChannels; i++) {
1423     hSbrEncoder->pSbrChannel[i] = GetRam_SbrChannel(i);
1424     if (hSbrEncoder->pSbrChannel[i]==NULL) {
1425         goto bail;
1426     }
1427 
1428     if ( createEnvChannel(&hSbrEncoder->pSbrChannel[i]->hEnvChannel,
1429                            i
1430                           ,hSbrEncoder->dynamicRam
1431                            ) )
1432     {
1433         goto bail;
1434     }
1435 
1436   }
1437 
1438   for (i=0; i<fixMax(nChannels,(supportPS)?2:0); i++) {
1439     hSbrEncoder->QmfAnalysis[i].FilterStates = GetRam_Sbr_QmfStatesAnalysis(i);
1440     if (hSbrEncoder->QmfAnalysis[i].FilterStates==NULL) {
1441         goto bail;
1442     }
1443   }
1444 
1445   if (supportPS) {
1446     if (PSEnc_Create(&hSbrEncoder->hParametricStereo))
1447     {
1448       goto bail;
1449     }
1450 
1451     hSbrEncoder->qmfSynthesisPS.FilterStates = GetRam_PsQmfStatesSynthesis();
1452     if (hSbrEncoder->qmfSynthesisPS.FilterStates==NULL) {
1453       goto bail;
1454     }
1455   }  /* supportPS */
1456 
1457   *phSbrEncoder = hSbrEncoder;
1458 
1459   errorStatus = 0;
1460   return errorStatus;
1461 
1462 bail:
1463   /* Close SBR encoder instance */
1464   sbrEncoder_Close(&hSbrEncoder);
1465   return errorStatus;
1466 }
1467 
1468 static
FDKsbrEnc_Reallocate(HANDLE_SBR_ENCODER hSbrEncoder,SBR_ELEMENT_INFO elInfo[(8)],const INT noElements)1469 INT FDKsbrEnc_Reallocate(
1470                     HANDLE_SBR_ENCODER   hSbrEncoder,
1471                     SBR_ELEMENT_INFO     elInfo[(8)],
1472                     const INT            noElements)
1473 {
1474   INT totalCh = 0;
1475   INT totalQmf = 0;
1476   INT coreEl;
1477   INT el=-1;
1478 
1479   hSbrEncoder->lfeChIdx = -1; /* default value, until lfe found */
1480 
1481   for (coreEl=0; coreEl<noElements; coreEl++)
1482   {
1483     /* SBR only handles SCE and CPE's */
1484     if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) {
1485       el++;
1486     } else {
1487       if (elInfo[coreEl].elType == ID_LFE) {
1488           hSbrEncoder->lfeChIdx = elInfo[coreEl].ChannelIndex[0];
1489       }
1490       continue;
1491     }
1492 
1493     SBR_ELEMENT_INFO    *pelInfo = &elInfo[coreEl];
1494     HANDLE_SBR_ELEMENT  hSbrElement = hSbrEncoder->sbrElement[el];
1495 
1496     int ch;
1497     for ( ch = 0; ch < pelInfo->nChannelsInEl; ch++ ) {
1498       hSbrElement->sbrChannel[ch] = hSbrEncoder->pSbrChannel[totalCh];
1499       totalCh++;
1500     }
1501     /* analysis QMF */
1502     for ( ch = 0; ch < ((pelInfo->fParametricStereo)?2:pelInfo->nChannelsInEl); ch++ ) {
1503       hSbrElement->elInfo.ChannelIndex[ch] = pelInfo->ChannelIndex[ch];
1504       hSbrElement->hQmfAnalysis[ch] = &hSbrEncoder->QmfAnalysis[totalQmf++];
1505     }
1506 
1507     /* Copy Element info */
1508     hSbrElement->elInfo.elType            = pelInfo->elType;
1509     hSbrElement->elInfo.instanceTag       = pelInfo->instanceTag;
1510     hSbrElement->elInfo.nChannelsInEl     = pelInfo->nChannelsInEl;
1511     hSbrElement->elInfo.fParametricStereo = pelInfo->fParametricStereo;
1512   } /* coreEl */
1513 
1514   return 0;
1515 }
1516 
1517 
1518 
1519 /*****************************************************************************
1520 
1521  functionname: FDKsbrEnc_EnvInit
1522  description:  initializes parameters
1523  returns:      error status
1524  input:
1525  output:       hEnv
1526 
1527 *****************************************************************************/
1528 static
FDKsbrEnc_EnvInit(HANDLE_SBR_ELEMENT hSbrElement,sbrConfigurationPtr params,INT * coreBandWith,AUDIO_OBJECT_TYPE aot,int nBitstrDelay,int nElement,const int headerPeriod,ULONG statesInitFlag,int fTimeDomainDownsampling,UCHAR * dynamic_RAM)1529 INT FDKsbrEnc_EnvInit (
1530                        HANDLE_SBR_ELEMENT   hSbrElement,
1531                        sbrConfigurationPtr params,
1532                        INT      *coreBandWith,
1533                        AUDIO_OBJECT_TYPE aot,
1534                        int       nBitstrDelay,
1535                        int       nElement,
1536                        const int headerPeriod,
1537                        ULONG     statesInitFlag,
1538                        int       fTimeDomainDownsampling
1539                       ,UCHAR    *dynamic_RAM
1540                       )
1541 {
1542   UCHAR    *bitstreamBuffer;
1543   int ch, i;
1544 
1545   if ((params->codecSettings.nChannels < 1) || (params->codecSettings.nChannels > MAX_NUM_CHANNELS)){
1546     return(1);
1547   }
1548 
1549   /* initialize the encoder handle  and structs*/
1550   bitstreamBuffer = hSbrElement->payloadDelayLine[nBitstrDelay];
1551 
1552   /* init and set syntax flags */
1553   hSbrElement->sbrConfigData.sbrSyntaxFlags = 0;
1554 
1555   switch (aot) {
1556   case AOT_DRM_MPEG_PS:
1557   case AOT_DRM_SBR:
1558     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_SCALABLE;
1559     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_DRM_CRC;
1560     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC;
1561     break;
1562   case AOT_ER_AAC_ELD:
1563     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_LOW_DELAY;
1564     break;
1565   default:
1566     break;
1567   }
1568   if (params->crcSbr) {
1569     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC;
1570   }
1571 
1572   hSbrElement->sbrConfigData.noQmfBands = QMF_CHANNELS>>(2-params->downSampleFactor);
1573   switch (hSbrElement->sbrConfigData.noQmfBands)
1574   {
1575     case 64: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
1576              break;
1577     case 32: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>5;
1578              break;
1579     default: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
1580              return(2);
1581   }
1582 
1583   FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, MAX_PAYLOAD_SIZE*sizeof(UCHAR), 0, BS_WRITER);
1584 
1585   /*
1586     now initialize sbrConfigData, sbrHeaderData and sbrBitstreamData,
1587   */
1588   hSbrElement->sbrConfigData.nChannels = params->codecSettings.nChannels;
1589 
1590   if(params->codecSettings.nChannels == 2)
1591      hSbrElement->sbrConfigData.stereoMode = params->stereoMode;
1592   else
1593      hSbrElement->sbrConfigData.stereoMode = SBR_MONO;
1594 
1595   hSbrElement->sbrConfigData.frameSize   = params->sbrFrameSize;
1596 
1597   hSbrElement->sbrConfigData.sampleFreq = params->downSampleFactor * params->codecSettings.sampleFreq;
1598 
1599   hSbrElement->sbrBitstreamData.CountSendHeaderData = 0;
1600   if (params->SendHeaderDataTime > 0 ) {
1601 
1602     if (headerPeriod==-1) {
1603 
1604       hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)(params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq
1605                                                / (1000 * hSbrElement->sbrConfigData.frameSize));
1606       hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData,1);
1607     }
1608     else {
1609       /* assure header period at least once per second */
1610       hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin(fixMax(headerPeriod,1),(hSbrElement->sbrConfigData.sampleFreq/hSbrElement->sbrConfigData.frameSize));
1611     }
1612   }
1613   else {
1614    hSbrElement->sbrBitstreamData.NrSendHeaderData = 0;
1615   }
1616 
1617   hSbrElement->sbrHeaderData.sbr_data_extra = params->sbr_data_extra;
1618   hSbrElement->sbrBitstreamData.HeaderActive = 0;
1619   hSbrElement->sbrHeaderData.sbr_start_frequency = params->startFreq;
1620   hSbrElement->sbrHeaderData.sbr_stop_frequency  = params->stopFreq;
1621   hSbrElement->sbrHeaderData.sbr_xover_band = 0;
1622   hSbrElement->sbrHeaderData.sbr_lc_stereo_mode = 0;
1623 
1624   /* data_extra */
1625   if (params->sbr_xpos_ctrl!= SBR_XPOS_CTRL_DEFAULT)
1626      hSbrElement->sbrHeaderData.sbr_data_extra = 1;
1627 
1628   hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res;
1629 
1630   /* header_extra_1 */
1631   hSbrElement->sbrHeaderData.freqScale  = params->freqScale;
1632   hSbrElement->sbrHeaderData.alterScale = params->alterScale;
1633   hSbrElement->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands;
1634   hSbrElement->sbrHeaderData.header_extra_1 = 0;
1635 
1636   if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) ||
1637       (params->alterScale != SBR_ALTER_SCALE_DEFAULT) ||
1638       (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT))
1639   {
1640    hSbrElement->sbrHeaderData.header_extra_1 = 1;
1641   }
1642 
1643   /* header_extra_2 */
1644   hSbrElement->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands;
1645   hSbrElement->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains;
1646 
1647   if ((hSbrElement->sbrConfigData.sampleFreq > 48000) &&
1648       (hSbrElement->sbrHeaderData.sbr_start_frequency >= 9))
1649   {
1650     hSbrElement->sbrHeaderData.sbr_limiter_gains = SBR_LIMITER_GAINS_INFINITE;
1651   }
1652 
1653   hSbrElement->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq;
1654   hSbrElement->sbrHeaderData.sbr_smoothing_length = params->sbr_smoothing_length;
1655   hSbrElement->sbrHeaderData.header_extra_2 = 0;
1656 
1657   if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) ||
1658       (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) ||
1659       (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) ||
1660       (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT))
1661   {
1662      hSbrElement->sbrHeaderData.header_extra_2 = 1;
1663   }
1664 
1665    /* other switches */
1666   hSbrElement->sbrConfigData.useWaveCoding             = params->useWaveCoding;
1667   hSbrElement->sbrConfigData.useParametricCoding       = params->parametricCoding;
1668 
1669   /* init freq band table */
1670   if(updateFreqBandTable(&hSbrElement->sbrConfigData,
1671                          &hSbrElement->sbrHeaderData,
1672                          params->downSampleFactor
1673                          ))
1674   {
1675     return(1);
1676   }
1677 
1678   /* now create envelope ext and QMF for each available channel */
1679   for ( ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++ ) {
1680 
1681      if ( initEnvChannel(&hSbrElement->sbrConfigData,
1682                          &hSbrElement->sbrHeaderData,
1683                          &hSbrElement->sbrChannel[ch]->hEnvChannel,
1684                           params,
1685                           statesInitFlag
1686                         ,ch
1687                         ,dynamic_RAM
1688                          ) )
1689      {
1690        return(1);
1691      }
1692 
1693 
1694   } /* nChannels */
1695 
1696   /* reset and intialize analysis qmf */
1697   for ( ch = 0; ch < ((hSbrElement->elInfo.fParametricStereo)?2:hSbrElement->sbrConfigData.nChannels); ch++ )
1698   {
1699     int err;
1700     UINT qmfFlags = (hSbrElement->sbrConfigData.sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? QMF_FLAG_CLDFB : 0;
1701     if (statesInitFlag)
1702       qmfFlags &= ~QMF_FLAG_KEEP_STATES;
1703     else
1704       qmfFlags |=  QMF_FLAG_KEEP_STATES;
1705 
1706     err = qmfInitAnalysisFilterBank( hSbrElement->hQmfAnalysis[ch],
1707                                      (FIXP_QAS*)hSbrElement->hQmfAnalysis[ch]->FilterStates,
1708                                      hSbrElement->sbrConfigData.noQmfSlots,
1709                                      hSbrElement->sbrConfigData.noQmfBands,
1710                                      hSbrElement->sbrConfigData.noQmfBands,
1711                                      hSbrElement->sbrConfigData.noQmfBands,
1712                                      qmfFlags );
1713     if (0!=err) {
1714       return err;
1715     }
1716   }
1717 
1718   /*  */
1719   hSbrElement->CmonData.xOverFreq = hSbrElement->sbrConfigData.xOverFreq;
1720   hSbrElement->CmonData.dynBwEnabled = (params->dynBwSupported && params->dynBwEnabled);
1721   hSbrElement->CmonData.dynXOverFreqEnc = FDKsbrEnc_SbrGetXOverFreq( hSbrElement, hSbrElement->CmonData.xOverFreq);
1722   for ( i = 0; i < 5; i++ )
1723       hSbrElement->dynXOverFreqDelay[i] = hSbrElement->CmonData.dynXOverFreqEnc;
1724   hSbrElement->CmonData.sbrNumChannels  = hSbrElement->sbrConfigData.nChannels;
1725   hSbrElement->sbrConfigData.dynXOverFreq = hSbrElement->CmonData.xOverFreq;
1726 
1727   /* Update Bandwith to be passed to the core encoder */
1728   *coreBandWith = hSbrElement->CmonData.xOverFreq;
1729 
1730   return(0);
1731  }
1732 
sbrEncoder_GetInBufferSize(int noChannels)1733 INT sbrEncoder_GetInBufferSize(int noChannels)
1734 {
1735   INT temp;
1736 
1737   temp = (2048);
1738   temp += 1024 + MAX_SAMPLE_DELAY;
1739   temp *= noChannels;
1740   temp *= sizeof(INT_PCM);
1741   return temp;
1742 }
1743 
1744 /*
1745  * Encode Dummy SBR payload frames to fill the delay lines.
1746  */
1747 static
FDKsbrEnc_DelayCompensation(HANDLE_SBR_ENCODER hEnvEnc,INT_PCM * timeBuffer)1748 INT FDKsbrEnc_DelayCompensation (
1749                                   HANDLE_SBR_ENCODER hEnvEnc,
1750                                   INT_PCM *timeBuffer
1751                                  )
1752 {
1753     int n, el;
1754 
1755     for (n=hEnvEnc->nBitstrDelay; n>0; n--)
1756     {
1757       for (el=0; el<hEnvEnc->noElements; el++)
1758       {
1759         if (FDKsbrEnc_EnvEncodeFrame(
1760                                      hEnvEnc,
1761                                      el,
1762                                      timeBuffer + hEnvEnc->downsampledOffset,
1763                                      hEnvEnc->sbrElement[el]->sbrConfigData.nChannels,
1764                                      NULL,
1765                                      NULL,
1766                                      1
1767                                     ))
1768           return -1;
1769       }
1770       sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer);
1771     }
1772 	  return 0;
1773 }
1774 
sbrEncoder_LimitBitRate(UINT bitRate,UINT numChannels,UINT coreSampleRate,AUDIO_OBJECT_TYPE aot)1775 UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, UINT coreSampleRate, AUDIO_OBJECT_TYPE aot)
1776 {
1777   UINT newBitRate;
1778   INT index;
1779 
1780   FDK_ASSERT(numChannels > 0 && numChannels <= 2);
1781   if (aot == AOT_PS) {
1782     if (numChannels == 2) {
1783       index = getPsTuningTableIndex(bitRate, &newBitRate);
1784       if (index == INVALID_TABLE_IDX) {
1785         bitRate = newBitRate;
1786       }
1787       /* Set numChannels to 1 because for PS we need a SBR SCE (mono) element. */
1788       numChannels = 1;
1789     } else {
1790       return 0;
1791     }
1792   }
1793   index = getSbrTuningTableIndex(bitRate, numChannels, coreSampleRate, aot, &newBitRate);
1794   if (index != INVALID_TABLE_IDX) {
1795     newBitRate = bitRate;
1796   }
1797 
1798   return newBitRate;
1799 }
1800 
sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot)1801 UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot)
1802 {
1803   UINT isPossible=(AOT_PS==aot)?0:1;
1804   return isPossible;
1805 }
1806 
sbrEncoder_Init(HANDLE_SBR_ENCODER hSbrEncoder,SBR_ELEMENT_INFO elInfo[(8)],int noElements,INT_PCM * inputBuffer,INT * coreBandwidth,INT * inputBufferOffset,INT * numChannels,INT * coreSampleRate,UINT * downSampleFactor,INT * frameLength,AUDIO_OBJECT_TYPE aot,int * delay,int transformFactor,const int headerPeriod,ULONG statesInitFlag)1807 INT sbrEncoder_Init(
1808         HANDLE_SBR_ENCODER   hSbrEncoder,
1809         SBR_ELEMENT_INFO     elInfo[(8)],
1810         int                  noElements,
1811         INT_PCM             *inputBuffer,
1812         INT                 *coreBandwidth,
1813         INT                 *inputBufferOffset,
1814         INT                 *numChannels,
1815         INT                 *coreSampleRate,
1816         UINT                *downSampleFactor,
1817         INT                 *frameLength,
1818         AUDIO_OBJECT_TYPE    aot,
1819         int                 *delay,
1820         int                  transformFactor,
1821         const int            headerPeriod,
1822         ULONG                statesInitFlag
1823         )
1824 {
1825     HANDLE_ERROR_INFO errorInfo = noError;
1826     sbrConfiguration sbrConfig[(8)];
1827     INT error = 0;
1828     INT lowestBandwidth;
1829     /* Save input parameters */
1830     INT inputSampleRate = *coreSampleRate;
1831     int coreFrameLength = *frameLength;
1832     int inputBandWidth = *coreBandwidth;
1833     int inputChannels = *numChannels;
1834 
1835     int downsampledOffset = 0;
1836     int sbrOffset = 0;
1837     int downsamplerDelay = 0;
1838     int timeDomainDownsample = 0;
1839     int nBitstrDelay = 0;
1840     int highestSbrStartFreq, highestSbrStopFreq;
1841     int lowDelay = 0;
1842     int usePs = 0;
1843 
1844     /* check whether SBR setting is available for the current encoder configuration (bitrate, samplerate) */
1845     if (!sbrEncoder_IsSingleRatePossible(aot)) {
1846       *downSampleFactor = 2;
1847     }
1848 
1849 
1850 
1851     if ( (aot==AOT_PS) || (aot==AOT_MP2_PS) || (aot==AOT_DABPLUS_PS) || (aot==AOT_DRM_MPEG_PS) ) {
1852         usePs = 1;
1853     }
1854     if ( (aot==AOT_ER_AAC_ELD) ) {
1855         lowDelay = 1;
1856     }
1857     else if ( (aot==AOT_ER_AAC_LD) ) {
1858         error = 1;
1859         goto bail;
1860     }
1861 
1862     /* Parametric Stereo */
1863     if ( usePs ) {
1864       if ( *numChannels == 2 && noElements == 1) {
1865         /* Override Element type in case of Parametric stereo */
1866         elInfo[0].elType = ID_SCE;
1867         elInfo[0].fParametricStereo = 1;
1868         elInfo[0].nChannelsInEl = 1;
1869         /* core encoder gets downmixed mono signal */
1870         *numChannels  = 1;
1871       } else {
1872         error = 1;
1873         goto bail;
1874       }
1875     } /* usePs */
1876 
1877     /* set the core's sample rate */
1878     switch (*downSampleFactor) {
1879     case 1:
1880       *coreSampleRate = inputSampleRate;
1881       break;
1882     case 2:
1883       *coreSampleRate = inputSampleRate>>1;
1884       break;
1885     default:
1886       *coreSampleRate = inputSampleRate>>1;
1887       return 0; /* return error */
1888     }
1889 
1890     /* check whether SBR setting is available for the current encoder configuration (bitrate, coreSampleRate) */
1891     {
1892       int delayDiff = 0;
1893       int el, coreEl;
1894 
1895       /* Check if every element config is feasible */
1896       for (coreEl=0; coreEl<noElements; coreEl++)
1897       {
1898         /* SBR only handles SCE and CPE's */
1899         if (elInfo[coreEl].elType != ID_SCE && elInfo[coreEl].elType != ID_CPE) {
1900           continue;
1901         }
1902         /* check if desired configuration is available */
1903         if ( !FDKsbrEnc_IsSbrSettingAvail (elInfo[coreEl].bitRate, 0, elInfo[coreEl].nChannelsInEl, inputSampleRate, *coreSampleRate, aot) )
1904         {
1905             error = 1;
1906             goto bail;
1907         }
1908       }
1909 
1910       /* Determine Delay balancing and new encoder delay */
1911       if (lowDelay) {
1912         {
1913         delayDiff = (*delay * *downSampleFactor) + DELAY_ELD2SBR(coreFrameLength,*downSampleFactor);
1914         *delay = DELAY_ELDSBR(coreFrameLength,*downSampleFactor);
1915         }
1916       }
1917       else if (usePs) {
1918         delayDiff = (*delay * *downSampleFactor) + DELAY_AAC2PS(coreFrameLength,*downSampleFactor);
1919         *delay = DELAY_PS(coreFrameLength,*downSampleFactor);
1920       }
1921       else {
1922         delayDiff = DELAY_AAC2SBR(coreFrameLength,*downSampleFactor);
1923         delayDiff += (*delay * *downSampleFactor);
1924         *delay = DELAY_SBR(coreFrameLength,*downSampleFactor);
1925       }
1926 
1927       if (!usePs) {
1928           timeDomainDownsample = *downSampleFactor-1;  /* activate time domain downsampler when downSampleFactor is != 1 */
1929       }
1930 
1931 
1932       /* Take care about downsampled data bound to the SBR path */
1933       if (!timeDomainDownsample && delayDiff > 0) {
1934         /*
1935          * We must tweak the balancing into a situation where the downsampled path
1936          * is the one to be delayed, because delaying the QMF domain input, also delays
1937          * the downsampled audio, counteracting to the purpose of delay balancing.
1938          */
1939         while ( delayDiff > 0 )
1940         {
1941           /* Encoder delay increases */
1942           {
1943             *delay += coreFrameLength * *downSampleFactor;
1944             /* Add one frame delay to SBR path */
1945             delayDiff -= coreFrameLength * *downSampleFactor;
1946           }
1947           nBitstrDelay += 1;
1948         }
1949       } else
1950       {
1951         *delay += fixp_abs(delayDiff);
1952       }
1953 
1954       if (delayDiff < 0) {
1955         /* Delay AAC data */
1956         delayDiff = -delayDiff;
1957         /* Multiply downsampled offset by AAC core channels. Divide by 2 because of half samplerate of downsampled data. */
1958         FDK_ASSERT(*downSampleFactor>0 && *downSampleFactor<=2);
1959         downsampledOffset = (delayDiff*(*numChannels))>>(*downSampleFactor-1);
1960         sbrOffset = 0;
1961       } else {
1962         /* Delay SBR input */
1963         if ( delayDiff > (int)coreFrameLength * (int)*downSampleFactor )
1964         {
1965           /* Do bitstream frame-wise delay balancing if we have more than SBR framelength samples delay difference */
1966           delayDiff -= coreFrameLength * *downSampleFactor;
1967           nBitstrDelay = 1;
1968         }
1969         /* Multiply input offset by input channels */
1970         sbrOffset = delayDiff*(*numChannels);
1971         downsampledOffset = 0;
1972       }
1973       hSbrEncoder->nBitstrDelay            = nBitstrDelay;
1974       hSbrEncoder->nChannels               = *numChannels;
1975       hSbrEncoder->frameSize               = coreFrameLength * *downSampleFactor;
1976       hSbrEncoder->fTimeDomainDownsampling = timeDomainDownsample;
1977       hSbrEncoder->downSampleFactor        = *downSampleFactor;
1978       hSbrEncoder->estimateBitrate         = 0;
1979       hSbrEncoder->inputDataDelay          = 0;
1980 
1981 
1982       /* Open SBR elements */
1983       el = -1;
1984       highestSbrStartFreq = highestSbrStopFreq = 0;
1985       lowestBandwidth = 99999;
1986 
1987       /* Loop through each core encoder element and get a matching SBR element config */
1988       for (coreEl=0; coreEl<noElements; coreEl++)
1989       {
1990         /* SBR only handles SCE and CPE's */
1991         if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) {
1992           el++;
1993         } else {
1994           continue;
1995         }
1996 
1997         /* Set parametric Stereo Flag. */
1998         if (usePs) {
1999           elInfo[coreEl].fParametricStereo = 1;
2000         } else {
2001           elInfo[coreEl].fParametricStereo = 0;
2002         }
2003 
2004         /*
2005          * Init sbrConfig structure
2006          */
2007         if ( ! FDKsbrEnc_InitializeSbrDefaults ( &sbrConfig[el],
2008                                                  *downSampleFactor,
2009                                                   coreFrameLength
2010                                                   ) )
2011         {
2012           error = 1;
2013           goto bail;
2014         }
2015 
2016         /*
2017          * Modify sbrConfig structure according to Element parameters
2018          */
2019         if ( ! FDKsbrEnc_AdjustSbrSettings (&sbrConfig[el],
2020                                              elInfo[coreEl].bitRate,
2021                                              elInfo[coreEl].nChannelsInEl,
2022                                             *coreSampleRate,
2023                                              inputSampleRate,
2024                                              transformFactor,
2025                                              24000,
2026                                              0,
2027                                              0,     /* useSpeechConfig */
2028                                              0,     /* lcsMode */
2029                                              usePs, /* bParametricStereo */
2030                                              aot) )
2031         {
2032           error = 1;
2033           goto bail;
2034         }
2035 
2036         /* Find common frequency border for all SBR elements */
2037         highestSbrStartFreq = fixMax(highestSbrStartFreq, sbrConfig[el].startFreq);
2038         highestSbrStopFreq = fixMax(highestSbrStopFreq, sbrConfig[el].stopFreq);
2039 
2040       } /* first element loop */
2041 
2042       /* Set element count (can be less than core encoder element count) */
2043       hSbrEncoder->noElements = el+1;
2044 
2045       FDKsbrEnc_Reallocate(hSbrEncoder,
2046                            elInfo,
2047                            noElements);
2048 
2049       for (el=0; el<hSbrEncoder->noElements; el++) {
2050 
2051         int bandwidth = *coreBandwidth;
2052 
2053         /* Use lowest common bandwidth */
2054         sbrConfig[el].startFreq = highestSbrStartFreq;
2055         sbrConfig[el].stopFreq = highestSbrStopFreq;
2056 
2057         /* initialize SBR element, and get core bandwidth */
2058         error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el],
2059                                   &sbrConfig[el],
2060                                   &bandwidth,
2061                                    aot,
2062                                    nBitstrDelay,
2063                                    el,
2064                                    headerPeriod,
2065                                    statesInitFlag,
2066                                    hSbrEncoder->fTimeDomainDownsampling
2067                                   ,hSbrEncoder->dynamicRam
2068                                   );
2069 
2070         if (error != 0) {
2071           error = 2;
2072           goto bail;
2073         }
2074 
2075         /* Get lowest core encoder bandwidth to be returned later. */
2076         lowestBandwidth = fixMin(lowestBandwidth, bandwidth);
2077 
2078       } /* second element loop */
2079 
2080       /* Initialize a downsampler for each channel in each SBR element */
2081       if (hSbrEncoder->fTimeDomainDownsampling)
2082       {
2083         for (el=0; el<hSbrEncoder->noElements; el++)
2084         {
2085           HANDLE_SBR_ELEMENT hSbrEl = hSbrEncoder->sbrElement[el];
2086           INT Wc, ch;
2087 
2088           /* Calculated required normalized cutoff frequency (Wc = 1.0 -> lowestBandwidth = inputSampleRate/2) */
2089           Wc = (2*lowestBandwidth)*1000 / inputSampleRate;
2090 
2091           for (ch=0; ch<hSbrEl->elInfo.nChannelsInEl; ch++)
2092           {
2093             FDKaacEnc_InitDownsampler (&hSbrEl->sbrChannel[ch]->downSampler, Wc, *downSampleFactor);
2094             FDK_ASSERT (hSbrEl->sbrChannel[ch]->downSampler.delay <=MAX_DS_FILTER_DELAY);
2095           }
2096 
2097           downsamplerDelay = hSbrEl->sbrChannel[0]->downSampler.delay;
2098         } /* third element loop */
2099 
2100         /* lfe */
2101         FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, *downSampleFactor);
2102 
2103         /* Add the resampler additional delay to get the final delay and buffer offset values. */
2104         if (sbrOffset > 0 || downsampledOffset <= ((downsamplerDelay * (*numChannels))>>(*downSampleFactor-1))) {
2105           sbrOffset += (downsamplerDelay - downsampledOffset) * (*numChannels) ;
2106           *delay += downsamplerDelay - downsampledOffset;
2107           downsampledOffset = 0;
2108         } else {
2109           downsampledOffset -= (downsamplerDelay * (*numChannels))>>(*downSampleFactor-1);
2110           sbrOffset = 0;
2111         }
2112 
2113         hSbrEncoder->inputDataDelay = downsamplerDelay;
2114       }
2115 
2116       /* Assign core encoder Bandwidth */
2117       *coreBandwidth = lowestBandwidth;
2118 
2119       /* Estimate sbr bitrate, 2.5 kBit/s per sbr channel */
2120       hSbrEncoder->estimateBitrate += 2500 * (*numChannels);
2121 
2122       /* initialize parametric stereo */
2123       if (usePs)
2124       {
2125         PSENC_CONFIG psEncConfig;
2126         FDK_ASSERT(hSbrEncoder->noElements == 1);
2127         INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL);
2128 
2129         psEncConfig.frameSize           = coreFrameLength; //sbrConfig.sbrFrameSize;
2130         psEncConfig.qmfFilterMode       = 0;
2131         psEncConfig.sbrPsDelay          = 0;
2132 
2133         /* tuning parameters */
2134         if (psTuningTableIdx  != INVALID_TABLE_IDX) {
2135           psEncConfig.nStereoBands           = psTuningTable[psTuningTableIdx].nStereoBands;
2136           psEncConfig.maxEnvelopes           = psTuningTable[psTuningTableIdx].nEnvelopes;
2137           psEncConfig.iidQuantErrorThreshold = (FIXP_DBL)psTuningTable[psTuningTableIdx].iidQuantErrorThreshold;
2138 
2139           /* calculation is not quite linear, increased number of envelopes causes more bits */
2140           /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope configuration */
2141           hSbrEncoder->estimateBitrate += ( (((*coreSampleRate) * 5 * psEncConfig.nStereoBands * psEncConfig.maxEnvelopes) / hSbrEncoder->frameSize));
2142 
2143         } else {
2144           error = ERROR(CDI, "Invalid ps tuning table index.");
2145           goto bail;
2146         }
2147 
2148         qmfInitSynthesisFilterBank(&hSbrEncoder->qmfSynthesisPS,
2149                                     (FIXP_DBL*)hSbrEncoder->qmfSynthesisPS.FilterStates,
2150                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots,
2151                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
2152                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
2153                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
2154                                     (statesInitFlag) ? 0 : QMF_FLAG_KEEP_STATES);
2155 
2156         if(errorInfo == noError){
2157           /* update delay */
2158           psEncConfig.sbrPsDelay = FDKsbrEnc_GetEnvEstDelay(&hSbrEncoder->sbrElement[0]->sbrChannel[0]->hEnvChannel.sbrExtractEnvelope);
2159 
2160           if(noError != (errorInfo = PSEnc_Init( hSbrEncoder->hParametricStereo,
2161                                                 &psEncConfig,
2162                                                  hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots,
2163                                                  hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands
2164                                                 ,hSbrEncoder->dynamicRam
2165                                                  )))
2166           {
2167             errorInfo = handBack(errorInfo);
2168           }
2169         }
2170 
2171         /* QMF analysis + Hybrid analysis + Hybrid synthesis + QMF synthesis + downsampled input buffer delay */
2172         hSbrEncoder->inputDataDelay = (64*10/2) + (6*64) +  (0) + (64*10/2-64+1) + ((*downSampleFactor)*downsampledOffset);
2173       }
2174 
2175       hSbrEncoder->downsampledOffset = downsampledOffset;
2176       {
2177         hSbrEncoder->downmixSize = coreFrameLength*(*numChannels);
2178       }
2179 
2180       hSbrEncoder->bufferOffset = sbrOffset;
2181       /* Delay Compensation: fill bitstream delay buffer with zero input signal */
2182       if ( hSbrEncoder->nBitstrDelay > 0 )
2183       {
2184         error = FDKsbrEnc_DelayCompensation (hSbrEncoder, inputBuffer);
2185         if (error != 0)
2186           goto bail;
2187       }
2188 
2189       /* Set Output frame length */
2190       *frameLength = coreFrameLength * *downSampleFactor;
2191       /* Input buffer offset */
2192       *inputBufferOffset = fixMax(sbrOffset, downsampledOffset);
2193 
2194 
2195     }
2196 
2197     return error;
2198 
2199 bail:
2200     /* Restore input settings */
2201     *coreSampleRate = inputSampleRate;
2202     *frameLength = coreFrameLength;
2203     *numChannels = inputChannels;
2204     *coreBandwidth = inputBandWidth;
2205 
2206     return error;
2207  }
2208 
2209 
2210 INT
sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hSbrEncoder,INT_PCM * samples,UINT timeInStride,UINT sbrDataBits[(8)],UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE])2211 sbrEncoder_EncodeFrame(  HANDLE_SBR_ENCODER   hSbrEncoder,
2212                          INT_PCM             *samples,
2213                          UINT                 timeInStride,
2214                          UINT                 sbrDataBits[(8)],
2215                          UCHAR                sbrData[(8)][MAX_PAYLOAD_SIZE]
2216                         )
2217 {
2218   INT error;
2219   int el;
2220 
2221   for (el=0; el<hSbrEncoder->noElements; el++)
2222   {
2223     if (hSbrEncoder->sbrElement[el] != NULL)
2224     {
2225       error = FDKsbrEnc_EnvEncodeFrame(
2226                                         hSbrEncoder,
2227                                         el,
2228                                         samples + hSbrEncoder->downsampledOffset,
2229                                         timeInStride,
2230                                        &sbrDataBits[el],
2231                                         sbrData[el],
2232                                         0
2233                                        );
2234       if (error)
2235         return error;
2236     }
2237   }
2238 
2239   if ( ( hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->downSampleFactor > 1) )
2240   {   /* lfe downsampler */
2241       INT nOutSamples;
2242 
2243       FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler,
2244                             samples + hSbrEncoder->downsampledOffset + hSbrEncoder->bufferOffset + hSbrEncoder->lfeChIdx,
2245                             hSbrEncoder->frameSize,
2246                             timeInStride,
2247                             samples + hSbrEncoder->downsampledOffset + hSbrEncoder->lfeChIdx,
2248                            &nOutSamples,
2249                             hSbrEncoder->nChannels);
2250 
2251 
2252   }
2253 
2254   return 0;
2255 }
2256 
2257 
sbrEncoder_UpdateBuffers(HANDLE_SBR_ENCODER hSbrEncoder,INT_PCM * timeBuffer)2258 INT sbrEncoder_UpdateBuffers(
2259                             HANDLE_SBR_ENCODER hSbrEncoder,
2260                             INT_PCM *timeBuffer
2261                             )
2262  {
2263     if ( hSbrEncoder->downsampledOffset > 0 ) {
2264       /* Move delayed downsampled data */
2265       FDKmemcpy ( timeBuffer,
2266                   timeBuffer + hSbrEncoder->downmixSize,
2267                   sizeof(INT_PCM) * (hSbrEncoder->downsampledOffset) );
2268     } else {
2269       /* Move delayed input data */
2270       FDKmemcpy ( timeBuffer,
2271         timeBuffer + hSbrEncoder->nChannels * hSbrEncoder->frameSize,
2272                   sizeof(INT_PCM) * hSbrEncoder->bufferOffset );
2273     }
2274     if ( hSbrEncoder->nBitstrDelay > 0  )
2275     {
2276       int el;
2277 
2278       for (el=0; el<hSbrEncoder->noElements; el++)
2279       {
2280         FDKmemmove ( hSbrEncoder->sbrElement[el]->payloadDelayLine[0],
2281                      hSbrEncoder->sbrElement[el]->payloadDelayLine[1],
2282                      sizeof(UCHAR) * (hSbrEncoder->nBitstrDelay*MAX_PAYLOAD_SIZE) );
2283 
2284         FDKmemmove( &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[0],
2285                     &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[1],
2286                     sizeof(UINT) * (hSbrEncoder->nBitstrDelay) );
2287       }
2288     }
2289     return 0;
2290  }
2291 
2292 
sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder)2293 INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder)
2294 {
2295   INT estimateBitrate = 0;
2296 
2297   if(hSbrEncoder) {
2298     estimateBitrate += hSbrEncoder->estimateBitrate;
2299   }
2300 
2301   return estimateBitrate;
2302 }
2303 
sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder)2304 INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder)
2305 {
2306   INT delay = -1;
2307 
2308   if(hSbrEncoder) {
2309     delay = hSbrEncoder->inputDataDelay;
2310   }
2311   return delay;
2312 }
2313 
2314 
sbrEncoder_GetLibInfo(LIB_INFO * info)2315 INT sbrEncoder_GetLibInfo( LIB_INFO *info )
2316 {
2317   int i;
2318 
2319   if (info == NULL) {
2320     return -1;
2321   }
2322   /* search for next free tab */
2323   for (i = 0; i < FDK_MODULE_LAST; i++) {
2324     if (info[i].module_id == FDK_NONE) break;
2325   }
2326   if (i == FDK_MODULE_LAST) {
2327     return -1;
2328   }
2329   info += i;
2330 
2331   info->module_id = FDK_SBRENC;
2332   info->version = LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2);
2333   LIB_VERSION_STRING(info);
2334   info->build_date = __DATE__;
2335   info->build_time = __TIME__;
2336   info->title = "SBR Encoder";
2337 
2338   /* Set flags */
2339   info->flags = 0
2340     | CAPF_SBR_HQ
2341     | CAPF_SBR_PS_MPEG
2342     ;
2343   /* End of flags */
2344 
2345   return 0;
2346 }
2347