2 /* -----------------------------------------------------------------------------------------------------------
3 Software License for The Fraunhofer FDK AAC Codec Library for Android
5 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
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.
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.
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.
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.
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:
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.
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.
42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43 prior written permission.
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.
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."
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.
59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60 by appropriate patent licenses.
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.
73 5. CONTACT INFORMATION
75 Fraunhofer Institute for Integrated Circuits IIS
76 Attention: Audio and Multimedia Departments - FDK AAC LL
78 91058 Erlangen, Germany
80 www.iis.fraunhofer.de/amm
81 amm-info@iis.fraunhofer.de
82 ----------------------------------------------------------------------------------------------------------- */
87 #include "genericStds.h"
89 static const SBR_FRAME_INFO frameInfo1_2048
= {
97 static const SBR_FRAME_INFO frameInfo2_2048
= {
100 {FREQ_RES_HIGH
, FREQ_RES_HIGH
},
105 static const SBR_FRAME_INFO frameInfo4_2048
= {
108 {FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
},
113 static const SBR_FRAME_INFO frameInfo1_2304
= {
121 static const SBR_FRAME_INFO frameInfo2_2304
= {
124 {FREQ_RES_HIGH
, FREQ_RES_HIGH
},
129 static const SBR_FRAME_INFO frameInfo4_2304
= {
132 {FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
},
137 static const SBR_FRAME_INFO frameInfo1_1920
= {
145 static const SBR_FRAME_INFO frameInfo2_1920
= {
148 {FREQ_RES_HIGH
, FREQ_RES_HIGH
},
153 static const SBR_FRAME_INFO frameInfo4_1920
= {
156 {FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
},
161 static const SBR_FRAME_INFO frameInfo1_1152
= {
169 static const SBR_FRAME_INFO frameInfo2_1152
= {
172 {FREQ_RES_HIGH
, FREQ_RES_HIGH
},
177 static const SBR_FRAME_INFO frameInfo4_1152
= {
181 {FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
},
187 /* AACLD frame info */
188 static const SBR_FRAME_INFO frameInfo1_512LD
= {
196 static const SBR_FRAME_INFO frameInfo2_512LD
= {
199 {FREQ_RES_HIGH
, FREQ_RES_HIGH
},
204 static const SBR_FRAME_INFO frameInfo4_512LD
= {
207 {FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
},
213 calcFillLengthMax (int tranPos
, /*!< input : transient position (ref: tran det) */
214 int numberTimeSlots
/*!< input : number of timeslots */
218 fillFrameTran (const int *v_tuningSegm
, /*!< tuning: desired segment lengths */
219 const int *v_tuningFreq
, /*!< tuning: desired frequency resolutions */
220 int tran
, /*!< input : position of transient */
221 int *v_bord
, /*!< memNew: borders */
222 int *length_v_bord
, /*!< memNew: # borders */
223 int *v_freq
, /*!< memNew: frequency resolutions */
224 int *length_v_freq
, /*!< memNew: # frequency resolutions */
225 int *bmin
, /*!< hlpNew: first mandatory border */
226 int *bmax
/*!< hlpNew: last mandatory border */
229 static void fillFramePre (INT dmax
, INT
*v_bord
, INT
*length_v_bord
,
230 INT
*v_freq
, INT
*length_v_freq
, INT bmin
,
233 static void fillFramePost (INT
*parts
, INT
*d
, INT dmax
, INT
*v_bord
,
234 INT
*length_v_bord
, INT
*v_freq
,
235 INT
*length_v_freq
, INT bmax
,
236 INT bufferFrameStart
, INT numberTimeSlots
, INT fmax
);
238 static void fillFrameInter (INT
*nL
, const int *v_tuningSegm
, INT
*v_bord
,
239 INT
*length_v_bord
, INT bmin
, INT
*v_freq
,
240 INT
*length_v_freq
, INT
*v_bordFollow
,
241 INT
*length_v_bordFollow
, INT
*v_freqFollow
,
242 INT
*length_v_freqFollow
, INT i_fillFollow
,
243 INT dmin
, INT dmax
, INT numberTimeSlots
);
245 static void calcFrameClass (FRAME_CLASS
*frameClass
, FRAME_CLASS
*frameClassOld
, INT tranFlag
,
248 static void specialCase (INT
*spreadFlag
, INT allowSpread
, INT
*v_bord
,
249 INT
*length_v_bord
, INT
*v_freq
, INT
*length_v_freq
,
252 static void calcCmonBorder (INT
*i_cmon
, INT
*i_tran
, INT
*v_bord
,
253 INT
*length_v_bord
, INT tran
,
254 INT bufferFrameStart
, INT numberTimeSlots
);
256 static void keepForFollowUp (INT
*v_bordFollow
, INT
*length_v_bordFollow
,
257 INT
*v_freqFollow
, INT
*length_v_freqFollow
,
258 INT
*i_tranFollow
, INT
*i_fillFollow
,
259 INT
*v_bord
, INT
*length_v_bord
, INT
*v_freq
,
260 INT i_cmon
, INT i_tran
, INT parts
, INT numberTimeSlots
);
262 static void calcCtrlSignal (HANDLE_SBR_GRID hSbrGrid
, FRAME_CLASS frameClass
,
263 INT
*v_bord
, INT length_v_bord
, INT
*v_freq
,
264 INT length_v_freq
, INT i_cmon
, INT i_tran
,
265 INT spreadFlag
, INT nL
);
267 static void ctrlSignal2FrameInfo (HANDLE_SBR_GRID hSbrGrid
,
268 HANDLE_SBR_FRAME_INFO hFrameInfo
,
269 INT freq_res_fixfix
);
272 /* table for 8 time slot index */
273 static const int envelopeTable_8
[8][5] = {
274 /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */
275 /* borders from left to right side; -1 = not in use */
276 /*[|T-|------]*/ { 2, 0, 0, 1, -1 },
277 /*[|-T-|-----]*/ { 2, 0, 0, 2, -1 },
278 /*[--|T-|----]*/ { 3, 1, 1, 2, 4 },
279 /*[---|T-|---]*/ { 3, 1, 1, 3, 5 },
280 /*[----|T-|--]*/ { 3, 1, 1, 4, 6 },
281 /*[-----|T--|]*/ { 2, 1, 1, 5, -1 },
282 /*[------|T-|]*/ { 2, 1, 1, 6, -1 },
283 /*[-------|T|]*/ { 2, 1, 1, 7, -1 },
286 /* table for 16 time slot index */
287 static const int envelopeTable_16
[16][6] = {
288 /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */
289 /* length from left to right side; -1 = not in use */
290 /*[|T---|------------|]*/ { 2, 0, 0, 4, -1, -1},
291 /*[|-T---|-----------|]*/ { 2, 0, 0, 5, -1, -1},
292 /*[|--|T---|----------]*/ { 3, 1, 1, 2, 6, -1},
293 /*[|---|T---|---------]*/ { 3, 1, 1, 3, 7, -1},
294 /*[|----|T---|--------]*/ { 3, 1, 1, 4, 8, -1},
295 /*[|-----|T---|-------]*/ { 3, 1, 1, 5, 9, -1},
296 /*[|------|T---|------]*/ { 3, 1, 1, 6, 10, -1},
297 /*[|-------|T---|-----]*/ { 3, 1, 1, 7, 11, -1},
298 /*[|--------|T---|----]*/ { 3, 1, 1, 8, 12, -1},
299 /*[|---------|T---|---]*/ { 3, 1, 1, 9, 13, -1},
300 /*[|----------|T---|--]*/ { 3, 1, 1,10, 14, -1},
301 /*[|-----------|T----|]*/ { 2, 1, 1,11, -1, -1},
302 /*[|------------|T---|]*/ { 2, 1, 1,12, -1, -1},
303 /*[|-------------|T--|]*/ { 2, 1, 1,13, -1, -1},
304 /*[|--------------|T-|]*/ { 2, 1, 1,14, -1, -1},
305 /*[|---------------|T|]*/ { 2, 1, 1,15, -1, -1},
308 /* table for 15 time slot index */
309 static const int envelopeTable_15
[15][6] = {
310 /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */
311 /* length from left to right side; -1 = not in use */
312 /*[|T---|------------]*/ { 2, 0, 0, 4, -1, -1},
313 /*[|-T---|-----------]*/ { 2, 0, 0, 5, -1, -1},
314 /*[|--|T---|---------]*/ { 3, 1, 1, 2, 6, -1},
315 /*[|---|T---|--------]*/ { 3, 1, 1, 3, 7, -1},
316 /*[|----|T---|-------]*/ { 3, 1, 1, 4, 8, -1},
317 /*[|-----|T---|------]*/ { 3, 1, 1, 5, 9, -1},
318 /*[|------|T---|-----]*/ { 3, 1, 1, 6, 10, -1},
319 /*[|-------|T---|----]*/ { 3, 1, 1, 7, 11, -1},
320 /*[|--------|T---|---]*/ { 3, 1, 1, 8, 12, -1},
321 /*[|---------|T---|--]*/ { 3, 1, 1, 9, 13, -1},
322 /*[|----------|T----|]*/ { 2, 1, 1,10, -1, -1},
323 /*[|-----------|T---|]*/ { 2, 1, 1,11, -1, -1},
324 /*[|------------|T--|]*/ { 2, 1, 1,12, -1, -1},
325 /*[|-------------|T-|]*/ { 2, 1, 1,13, -1, -1},
326 /*[|--------------|T|]*/ { 2, 1, 1,14, -1, -1},
329 static const int minFrameTranDistance
= 4;
331 static const FREQ_RES freqRes_table_8
[] = {FREQ_RES_LOW
, FREQ_RES_LOW
, FREQ_RES_LOW
, FREQ_RES_LOW
, FREQ_RES_LOW
,
332 FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
};
334 static const FREQ_RES freqRes_table_16
[16] = {
335 /* size of envelope */
336 /* 0-4 */ FREQ_RES_LOW
, FREQ_RES_LOW
, FREQ_RES_LOW
, FREQ_RES_LOW
, FREQ_RES_LOW
,
337 /* 5-9 */ FREQ_RES_LOW
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
,
338 /* 10-16 */ FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
, FREQ_RES_HIGH
,
341 static void generateFixFixOnly ( HANDLE_SBR_FRAME_INFO hSbrFrameInfo
,
342 HANDLE_SBR_GRID hSbrGrid
,
349 Functionname: FDKsbrEnc_frameInfoGenerator
351 Description: produces the FRAME_INFO struct for the current frame
353 Arguments: hSbrEnvFrame - pointer to sbr envelope handle
354 v_pre_transient_info - pointer to transient info vector
355 v_transient_info - pointer to previous transient info vector
356 v_tuning - pointer to tuning vector
358 Return: frame_info - pointer to SBR_FRAME_INFO struct
360 *******************************************************************************/
361 HANDLE_SBR_FRAME_INFO
362 FDKsbrEnc_frameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame
,
363 UCHAR
*v_transient_info
,
364 UCHAR
*v_transient_info_pre
,
368 INT numEnv
, tranPosInternal
=0, bmin
=0, bmax
=0, parts
, d
, i_cmon
=0, i_tran
=0, nL
;
371 INT
*v_bord
= hSbrEnvFrame
->v_bord
;
372 INT
*v_freq
= hSbrEnvFrame
->v_freq
;
373 INT
*v_bordFollow
= hSbrEnvFrame
->v_bordFollow
;
374 INT
*v_freqFollow
= hSbrEnvFrame
->v_freqFollow
;
377 INT
*length_v_bordFollow
= &hSbrEnvFrame
->length_v_bordFollow
;
378 INT
*length_v_freqFollow
= &hSbrEnvFrame
->length_v_freqFollow
;
379 INT
*length_v_bord
= &hSbrEnvFrame
->length_v_bord
;
380 INT
*length_v_freq
= &hSbrEnvFrame
->length_v_freq
;
381 INT
*spreadFlag
= &hSbrEnvFrame
->spreadFlag
;
382 INT
*i_tranFollow
= &hSbrEnvFrame
->i_tranFollow
;
383 INT
*i_fillFollow
= &hSbrEnvFrame
->i_fillFollow
;
384 FRAME_CLASS
*frameClassOld
= &hSbrEnvFrame
->frameClassOld
;
385 FRAME_CLASS frameClass
= FIXFIX
;
388 INT allowSpread
= hSbrEnvFrame
->allowSpread
;
389 INT numEnvStatic
= hSbrEnvFrame
->numEnvStatic
;
390 INT staticFraming
= hSbrEnvFrame
->staticFraming
;
391 INT dmin
= hSbrEnvFrame
->dmin
;
392 INT dmax
= hSbrEnvFrame
->dmax
;
394 INT bufferFrameStart
= hSbrEnvFrame
->SbrGrid
.bufferFrameStart
;
395 INT numberTimeSlots
= hSbrEnvFrame
->SbrGrid
.numberTimeSlots
;
396 INT frameMiddleSlot
= hSbrEnvFrame
->frameMiddleSlot
;
398 INT tranPos
= v_transient_info
[0];
399 INT tranFlag
= v_transient_info
[1];
401 const int *v_tuningSegm
= v_tuning
;
402 const int *v_tuningFreq
= v_tuning
+ 3;
404 hSbrEnvFrame
->v_tuningSegm
= v_tuningSegm
;
405 INT freq_res_fixfix
= hSbrEnvFrame
->freq_res_fixfix
;
408 /* in case there was a transient at the very end of the previous frame, start with a transient envelope */
409 if(v_transient_info_pre
[1] && (numberTimeSlots
- v_transient_info_pre
[0] < minFrameTranDistance
)){
418 * The frame generator creates the time-/frequency-grid for one SBR frame.
419 * Input signals are provided by the transient detector and the frame
420 * splitter (transientDetectNew() & FrameSplitter() in tran_det.c). The
421 * framing is controlled by adjusting tuning parameters stored in
422 * FRAME_GEN_TUNING. The parameter values are dependent on frame lengths
423 * and bitrates, and may in the future be signal dependent.
425 * The envelope borders are stored for frame generator internal use in
426 * aBorders. The contents of aBorders represent positions along the time
427 * axis given in the figures in fram_gen.h (the "frame-generator" rows).
428 * The unit is "time slot". The figures in fram_gen.h also define the
429 * detection ranges for the transient detector. For every border in
430 * aBorders, there is a corresponding entry in aFreqRes, which defines the
431 * frequency resolution of the envelope following (delimited by) the
434 * When no transients are present, FIXFIX class frames are used. The
435 * frame splitter decides whether to use one or two envelopes in the
436 * FIXFIX frame. "Sparse transients" (separated by a few frames without
437 * transients) are handeled by [FIXVAR, VARFIX] pairs or (depending on
438 * tuning and transient position relative the nominal frame boundaries)
439 * by [FIXVAR, VARVAR, VARFIX] triples. "Tight transients" (in
440 * consecutive frames) are handeled by [..., VARVAR, VARVAR, ...]
443 * The generator assumes that transients are "sparse", and designs
444 * borders for [FIXVAR, VARFIX] pairs right away, where the first frame
445 * corresponds to the present frame. At the next call of the generator
446 * it is known whether the transient actually is "sparse" or not. If
447 * 'yes', the already calculated VARFIX borders are used. If 'no', new
448 * borders, meeting the requirements of the "tight" transient, are
451 * The generator produces two outputs: A "clear-text bitstream" stored in
452 * SBR_GRID, and a straight-forward representation of the grid stored in
453 * SBR_FRAME_INFO. The former is subsequently converted to the actual
454 * bitstream sbr_grid() (encodeSbrGrid() in bit_sbr.c). The latter is
455 * used by other encoder functions, such as the envelope estimator
456 * (calculateSbrEnvelope() in env_est.c) and the noise floor and missing
457 * harmonics detector (TonCorrParamExtr() in nf_est.c).
461 /*--------------------------------------------------------------------------
462 Ignore transient detector
463 ---------------------------------------------------------------------------*/
466 numEnv
= numEnvStatic
; /* {1,2,4,8} */
467 *frameClassOld
= FIXFIX
; /* for change to dyn */
468 hSbrEnvFrame
->SbrGrid
.bs_num_env
= numEnv
;
469 hSbrEnvFrame
->SbrGrid
.frameClass
= frameClass
;
472 /*--------------------------------------------------------------------------
473 Calculate frame class to use
474 ---------------------------------------------------------------------------*/
475 calcFrameClass (&frameClass
, frameClassOld
, tranFlag
, spreadFlag
);
477 /* patch for new frame class FIXFIXonly for AAC LD */
478 if (tranFlag
&& ldGrid
) {
479 frameClass
= FIXFIXonly
;
480 *frameClassOld
= FIXFIX
;
484 * every transient is processed below by inserting
486 * - one border at the onset of the transient
487 * - one or more "decay borders" (after the onset of the transient)
488 * - optionally one "attack border" (before the onset of the transient)
490 * those borders are referred to as "mandatory borders" and are
491 * defined by the 'segmentLength' array in FRAME_GEN_TUNING
493 * the frequency resolutions of the corresponding envelopes are
494 * defined by the 'segmentRes' array in FRAME_GEN_TUNING
497 /*--------------------------------------------------------------------------
498 Design frame (or follow-up old design)
499 ---------------------------------------------------------------------------*/
500 if (tranFlag
) { /* Always for FixVar, often but not always for VarVar */
501 /*--------------------------------------------------------------------------
502 Design part of T/F-grid around the new transient
503 ---------------------------------------------------------------------------*/
505 tranPosInternal
= frameMiddleSlot
+ tranPos
+ bufferFrameStart
; /* FH 00-06-26 */
507 add mandatory borders around transient
510 fillFrameTran ( v_tuningSegm
,
520 /* make sure we stay within the maximum SBR frame overlap */
521 fmax
= calcFillLengthMax(tranPos
, numberTimeSlots
);
524 switch (frameClass
) {
528 tranPosInternal
= tranPos
;
529 generateFixFixOnly ( &(hSbrEnvFrame
->SbrFrameInfo
),
530 &(hSbrEnvFrame
->SbrGrid
),
535 return &(hSbrEnvFrame
->SbrFrameInfo
);
539 /*--------------------------------------------------------------------------
540 Design remaining parts of T/F-grid (assuming next frame is VarFix)
541 ---------------------------------------------------------------------------*/
543 /*--------------------------------------------------------------------------
544 Fill region before new transient:
545 ---------------------------------------------------------------------------*/
546 fillFramePre (dmax
, v_bord
, length_v_bord
, v_freq
, length_v_freq
,
547 bmin
, bmin
- bufferFrameStart
); /* FH 00-06-26 */
549 /*--------------------------------------------------------------------------
550 Fill region after new transient:
551 ---------------------------------------------------------------------------*/
552 fillFramePost (&parts
, &d
, dmax
, v_bord
, length_v_bord
, v_freq
,
553 length_v_freq
, bmax
, bufferFrameStart
, numberTimeSlots
, fmax
);
555 /*--------------------------------------------------------------------------
556 Take care of special case:
557 ---------------------------------------------------------------------------*/
558 if (parts
== 1 && d
< dmin
) /* no fill, short last envelope */
559 specialCase (spreadFlag
, allowSpread
, v_bord
, length_v_bord
,
560 v_freq
, length_v_freq
, &parts
, d
);
562 /*--------------------------------------------------------------------------
563 Calculate common border (split-point)
564 ---------------------------------------------------------------------------*/
565 calcCmonBorder (&i_cmon
, &i_tran
, v_bord
, length_v_bord
, tranPosInternal
,
566 bufferFrameStart
, numberTimeSlots
); /* FH 00-06-26 */
568 /*--------------------------------------------------------------------------
569 Extract data for proper follow-up in next frame
570 ---------------------------------------------------------------------------*/
571 keepForFollowUp (v_bordFollow
, length_v_bordFollow
, v_freqFollow
,
572 length_v_freqFollow
, i_tranFollow
, i_fillFollow
,
573 v_bord
, length_v_bord
, v_freq
, i_cmon
, i_tran
, parts
, numberTimeSlots
); /* FH 00-06-26 */
575 /*--------------------------------------------------------------------------
576 Calculate control signal
577 ---------------------------------------------------------------------------*/
578 calcCtrlSignal (&hSbrEnvFrame
->SbrGrid
, frameClass
,
579 v_bord
, *length_v_bord
, v_freq
, *length_v_freq
,
580 i_cmon
, i_tran
, *spreadFlag
, DC
);
583 /*--------------------------------------------------------------------------
584 Follow-up old transient - calculate control signal
585 ---------------------------------------------------------------------------*/
586 calcCtrlSignal (&hSbrEnvFrame
->SbrGrid
, frameClass
,
587 v_bordFollow
, *length_v_bordFollow
, v_freqFollow
,
588 *length_v_freqFollow
, DC
, *i_tranFollow
,
592 if (*spreadFlag
) { /* spread across three frames */
593 /*--------------------------------------------------------------------------
594 Follow-up old transient - calculate control signal
595 ---------------------------------------------------------------------------*/
596 calcCtrlSignal (&hSbrEnvFrame
->SbrGrid
,
597 frameClass
, v_bordFollow
, *length_v_bordFollow
,
598 v_freqFollow
, *length_v_freqFollow
, DC
,
599 *i_tranFollow
, *spreadFlag
, DC
);
603 /*--------------------------------------------------------------------------
604 Extract data for proper follow-up in next frame
605 ---------------------------------------------------------------------------*/
606 v_bordFollow
[0] = hSbrEnvFrame
->SbrGrid
.bs_abs_bord_1
- numberTimeSlots
; /* FH 00-06-26 */
608 *length_v_bordFollow
= 1;
609 *length_v_freqFollow
= 1;
615 /*--------------------------------------------------------------------------
616 Design remaining parts of T/F-grid (assuming next frame is VarFix)
617 adapt or fill region before new transient:
618 ---------------------------------------------------------------------------*/
619 fillFrameInter (&nL
, v_tuningSegm
, v_bord
, length_v_bord
, bmin
,
620 v_freq
, length_v_freq
, v_bordFollow
,
621 length_v_bordFollow
, v_freqFollow
,
622 length_v_freqFollow
, *i_fillFollow
, dmin
, dmax
,
625 /*--------------------------------------------------------------------------
626 Fill after transient:
627 ---------------------------------------------------------------------------*/
628 fillFramePost (&parts
, &d
, dmax
, v_bord
, length_v_bord
, v_freq
,
629 length_v_freq
, bmax
, bufferFrameStart
, numberTimeSlots
, fmax
);
631 /*--------------------------------------------------------------------------
632 Take care of special case:
633 ---------------------------------------------------------------------------*/
634 if (parts
== 1 && d
< dmin
) /*% no fill, short last envelope */
635 specialCase (spreadFlag
, allowSpread
, v_bord
, length_v_bord
,
636 v_freq
, length_v_freq
, &parts
, d
);
638 /*--------------------------------------------------------------------------
639 Calculate common border (split-point)
640 ---------------------------------------------------------------------------*/
641 calcCmonBorder (&i_cmon
, &i_tran
, v_bord
, length_v_bord
, tranPosInternal
,
642 bufferFrameStart
, numberTimeSlots
);
644 /*--------------------------------------------------------------------------
645 Extract data for proper follow-up in next frame
646 ---------------------------------------------------------------------------*/
647 keepForFollowUp (v_bordFollow
, length_v_bordFollow
,
648 v_freqFollow
, length_v_freqFollow
,
649 i_tranFollow
, i_fillFollow
, v_bord
,
650 length_v_bord
, v_freq
, i_cmon
, i_tran
, parts
, numberTimeSlots
);
652 /*--------------------------------------------------------------------------
653 Calculate control signal
654 ---------------------------------------------------------------------------*/
655 calcCtrlSignal (&hSbrEnvFrame
->SbrGrid
,
656 frameClass
, v_bord
, *length_v_bord
, v_freq
,
657 *length_v_freq
, i_cmon
, i_tran
, 0, nL
);
666 hSbrEnvFrame
->SbrGrid
.bs_num_env
= numEnv
;
667 hSbrEnvFrame
->SbrGrid
.frameClass
= frameClass
;
675 /*-------------------------------------------------------------------------
676 Convert control signal to frame info struct
677 ---------------------------------------------------------------------------*/
678 ctrlSignal2FrameInfo (&hSbrEnvFrame
->SbrGrid
,
679 &hSbrEnvFrame
->SbrFrameInfo
,
682 return &hSbrEnvFrame
->SbrFrameInfo
;
686 /***************************************************************************/
688 \brief Gnerates frame info for FIXFIXonly frame class used for low delay version
691 ****************************************************************************/
692 static void generateFixFixOnly ( HANDLE_SBR_FRAME_INFO hSbrFrameInfo
,
693 HANDLE_SBR_GRID hSbrGrid
,
698 int nEnv
, i
, k
=0, tranIdx
;
699 const int *pTable
= NULL
;
700 const FREQ_RES
*freqResTable
= NULL
;
702 switch (numberTimeSlots
) {
704 pTable
= envelopeTable_8
[tranPosInternal
];
705 freqResTable
= freqRes_table_8
;
708 pTable
= envelopeTable_15
[tranPosInternal
];
709 freqResTable
= freqRes_table_16
;
712 pTable
= envelopeTable_16
[tranPosInternal
];
713 freqResTable
= freqRes_table_16
;
717 /* look number of envolpes in table */
719 /* look up envolpe distribution in table */
720 for (i
=1; i
<nEnv
; i
++)
721 hSbrFrameInfo
->borders
[i
] = pTable
[i
+2];
723 /* open and close frame border */
724 hSbrFrameInfo
->borders
[0] = 0;
725 hSbrFrameInfo
->borders
[nEnv
] = numberTimeSlots
;
727 /* adjust segment-frequency-resolution according to the segment-length */
728 for (i
=0; i
<nEnv
; i
++){
729 k
= hSbrFrameInfo
->borders
[i
+1] - hSbrFrameInfo
->borders
[i
];
730 hSbrFrameInfo
->freqRes
[i
] = freqResTable
[k
];
731 hSbrGrid
->v_f
[i
] = freqResTable
[k
];
734 hSbrFrameInfo
->nEnvelopes
= nEnv
;
735 hSbrFrameInfo
->shortEnv
= pTable
[2];
739 /* add noise floors */
740 hSbrFrameInfo
->bordersNoise
[0] = 0;
741 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[tranIdx
?tranIdx
:1];
742 hSbrFrameInfo
->bordersNoise
[2] = numberTimeSlots
;
743 hSbrFrameInfo
->nNoiseEnvelopes
= 2;
745 hSbrGrid
->frameClass
= FIXFIXonly
;
746 hSbrGrid
->bs_abs_bord
= tranPosInternal
;
747 hSbrGrid
->bs_num_env
= nEnv
;
753 /*******************************************************************************
754 Functionname: FDKsbrEnc_initFrameInfoGenerator
755 *******************************************************************************
759 Arguments: hSbrEnvFrame - pointer to sbr envelope handle
760 allowSpread - commandline parameter
761 numEnvStatic - commandline parameter
762 staticFraming - commandline parameter
766 *******************************************************************************/
768 FDKsbrEnc_initFrameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame
,
779 FDKmemclear(hSbrEnvFrame
,sizeof(SBR_ENVELOPE_FRAME
));
783 hSbrEnvFrame
->frameClassOld
= FIXFIX
;
784 hSbrEnvFrame
->spreadFlag
= 0;
786 hSbrEnvFrame
->allowSpread
= allowSpread
;
787 hSbrEnvFrame
->numEnvStatic
= numEnvStatic
;
788 hSbrEnvFrame
->staticFraming
= staticFraming
;
789 hSbrEnvFrame
->freq_res_fixfix
= freq_res_fixfix
;
791 hSbrEnvFrame
->length_v_bord
= 0;
792 hSbrEnvFrame
->length_v_bordFollow
= 0;
794 hSbrEnvFrame
->length_v_freq
= 0;
795 hSbrEnvFrame
->length_v_freqFollow
= 0;
797 hSbrEnvFrame
->i_tranFollow
= 0;
798 hSbrEnvFrame
->i_fillFollow
= 0;
800 hSbrEnvFrame
->SbrGrid
.numberTimeSlots
= timeSlots
;
803 /*case CODEC_AACLD:*/
804 hSbrEnvFrame
->dmin
= 2;
805 hSbrEnvFrame
->dmax
= 16;
806 hSbrEnvFrame
->frameMiddleSlot
= FRAME_MIDDLE_SLOT_512LD
;
809 case NUMBER_TIME_SLOTS_1920
:
810 hSbrEnvFrame
->dmin
= 4;
811 hSbrEnvFrame
->dmax
= 12;
812 hSbrEnvFrame
->SbrGrid
.bufferFrameStart
= 0;
813 hSbrEnvFrame
->frameMiddleSlot
= FRAME_MIDDLE_SLOT_1920
;
815 case NUMBER_TIME_SLOTS_2048
:
816 hSbrEnvFrame
->dmin
= 4;
817 hSbrEnvFrame
->dmax
= 12;
818 hSbrEnvFrame
->SbrGrid
.bufferFrameStart
= 0;
819 hSbrEnvFrame
->frameMiddleSlot
= FRAME_MIDDLE_SLOT_2048
;
821 case NUMBER_TIME_SLOTS_1152
:
822 hSbrEnvFrame
->dmin
= 2;
823 hSbrEnvFrame
->dmax
= 8;
824 hSbrEnvFrame
->SbrGrid
.bufferFrameStart
= 0;
825 hSbrEnvFrame
->frameMiddleSlot
= FRAME_MIDDLE_SLOT_1152
;
827 case NUMBER_TIME_SLOTS_2304
:
828 hSbrEnvFrame
->dmin
= 4;
829 hSbrEnvFrame
->dmax
= 15;
830 hSbrEnvFrame
->SbrGrid
.bufferFrameStart
= 0;
831 hSbrEnvFrame
->frameMiddleSlot
= FRAME_MIDDLE_SLOT_2304
;
840 /*******************************************************************************
841 Functionname: fillFrameTran
842 *******************************************************************************
844 Description: Add mandatory borders, as described by the tuning vector
845 and the current transient position
849 v_bord - int pointer to v_bord vector
850 length_v_bord - length of v_bord vector
851 v_freq - int pointer to v_freq vector
852 length_v_freq - length of v_freq vector
853 bmin - int pointer to bmin (call by reference)
854 bmax - int pointer to bmax (call by reference)
856 tran - position of transient
857 v_tuningSegm - int pointer to v_tuningSegm vector
858 v_tuningFreq - int pointer to v_tuningFreq vector
862 *******************************************************************************/
864 fillFrameTran (const int *v_tuningSegm
, /*!< tuning: desired segment lengths */
865 const int *v_tuningFreq
, /*!< tuning: desired frequency resolutions */
866 int tran
, /*!< input : position of transient */
867 int *v_bord
, /*!< memNew: borders */
868 int *length_v_bord
, /*!< memNew: # borders */
869 int *v_freq
, /*!< memNew: frequency resolutions */
870 int *length_v_freq
, /*!< memNew: # frequency resolutions */
871 int *bmin
, /*!< hlpNew: first mandatory border */
872 int *bmax
/*!< hlpNew: last mandatory border */
880 /* add attack env leading border (optional) */
881 if (v_tuningSegm
[0]) {
882 /* v_bord = [(Ba)] start of attack env */
883 FDKsbrEnc_AddRight (v_bord
, length_v_bord
, (tran
- v_tuningSegm
[0]));
885 /* v_freq = [(Fa)] res of attack env */
886 FDKsbrEnc_AddRight (v_freq
, length_v_freq
, v_tuningFreq
[0]);
889 /* add attack env trailing border/first decay env leading border */
891 FDKsbrEnc_AddRight (v_bord
, length_v_bord
, tran
); /* v_bord = [(Ba),Bd1] */
893 /* add first decay env trailing border/2:nd decay env leading border */
894 if (v_tuningSegm
[1]) {
895 bord
+= v_tuningSegm
[1];
897 /* v_bord = [(Ba),Bd1,Bd2] */
898 FDKsbrEnc_AddRight (v_bord
, length_v_bord
, bord
);
900 /* v_freq = [(Fa),Fd1] */
901 FDKsbrEnc_AddRight (v_freq
, length_v_freq
, v_tuningFreq
[1]);
904 /* add 2:nd decay env trailing border (optional) */
905 if (v_tuningSegm
[2] != 0) {
906 bord
+= v_tuningSegm
[2];
908 /* v_bord = [(Ba),Bd1, Bd2,(Bd3)] */
909 FDKsbrEnc_AddRight (v_bord
, length_v_bord
, bord
);
911 /* v_freq = [(Fa),Fd1,(Fd2)] */
912 FDKsbrEnc_AddRight (v_freq
, length_v_freq
, v_tuningFreq
[2]);
915 /* v_freq = [(Fa),Fd1,(Fd2),1] */
916 FDKsbrEnc_AddRight (v_freq
, length_v_freq
, 1);
919 /* calc min and max values of mandatory borders */
921 for (i
= 0; i
< *length_v_bord
; i
++)
922 if (v_bord
[i
] < *bmin
)
926 for (i
= 0; i
< *length_v_bord
; i
++)
927 if (v_bord
[i
] > *bmax
)
934 /*******************************************************************************
935 Functionname: fillFramePre
936 *******************************************************************************
938 Description: Add borders before mandatory borders, if needed
942 v_bord - int pointer to v_bord vector
943 length_v_bord - length of v_bord vector
944 v_freq - int pointer to v_freq vector
945 length_v_freq - length of v_freq vector
953 *******************************************************************************/
955 fillFramePre (INT dmax
,
956 INT
*v_bord
, INT
*length_v_bord
,
957 INT
*v_freq
, INT
*length_v_freq
,
962 v_bord = [(Ba),Bd1, Bd2 ,(Bd3)]
963 v_freq = [(Fa),Fd1,(Fd2),1 ]
966 INT parts
, d
, j
, S
, s
= 0, segm
, bord
;
969 start with one envelope
976 calc # of additional envelopes and corresponding lengths
984 s
= fixMin (8, 2 * S
+ 2);
985 d
= rest
- (parts
- 1) * s
;
989 add borders before mandatory borders
994 for (j
= 0; j
<= parts
- 2; j
++) {
997 /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] */
998 FDKsbrEnc_AddLeft (v_bord
, length_v_bord
, bord
);
1000 /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 ] */
1001 FDKsbrEnc_AddLeft (v_freq
, length_v_freq
, 1);
1005 /***************************************************************************/
1007 \brief Overlap control
1009 Calculate max length of trailing fill segments, such that we always get a
1010 border within the frame overlap region
1014 ****************************************************************************/
1016 calcFillLengthMax (int tranPos
, /*!< input : transient position (ref: tran det) */
1017 int numberTimeSlots
/*!< input : number of timeslots */
1023 calculate transient position within envelope buffer
1025 switch (numberTimeSlots
)
1027 case NUMBER_TIME_SLOTS_2048
:
1030 else if (tranPos
== 4 || tranPos
== 5)
1036 case NUMBER_TIME_SLOTS_1920
:
1039 else if (tranPos
== 4 || tranPos
== 5)
1053 /*******************************************************************************
1054 Functionname: fillFramePost
1055 *******************************************************************************
1057 Description: -Add borders after mandatory borders, if needed
1058 Make a preliminary design of next frame,
1059 assuming no transient is present there
1063 parts - int pointer to parts (call by reference)
1064 d - int pointer to d (call by reference)
1065 v_bord - int pointer to v_bord vector
1066 length_v_bord - length of v_bord vector
1067 v_freq - int pointer to v_freq vector
1068 length_v_freq - length of v_freq vector
1075 *******************************************************************************/
1077 fillFramePost (INT
*parts
, INT
*d
, INT dmax
, INT
*v_bord
, INT
*length_v_bord
,
1078 INT
*v_freq
, INT
*length_v_freq
, INT bmax
,
1079 INT bufferFrameStart
, INT numberTimeSlots
, INT fmax
)
1081 INT j
, rest
, segm
, S
, s
= 0, bord
;
1085 v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)]
1086 v_freq = [...,(1 ),(Fa),Fd1,(Fd2),1 ]
1089 rest
= bufferFrameStart
+ 2 * numberTimeSlots
- bmax
;
1093 *parts
= 1; /* start with one envelope */
1095 /* calc # of additional envelopes and corresponding lengths */
1098 *parts
= *parts
+ 1;
1100 segm
= rest
/ (*parts
);
1102 s
= fixMin (fmax
, 2 * S
+ 2);
1103 *d
= rest
- (*parts
- 1) * s
;
1106 /* add borders after mandatory borders */
1109 for (j
= 0; j
<= *parts
- 2; j
++) {
1112 /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3),(Bf)] */
1113 FDKsbrEnc_AddRight (v_bord
, length_v_bord
, bord
);
1115 /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 , 1! ,1] */
1116 FDKsbrEnc_AddRight (v_freq
, length_v_freq
, 1);
1122 /* remove last element from v_bord and v_freq */
1124 *length_v_bord
= *length_v_bord
- 1;
1125 *length_v_freq
= *length_v_freq
- 1;
1132 /*******************************************************************************
1133 Functionname: fillFrameInter
1134 *******************************************************************************
1146 length_v_bordFollow -
1148 length_v_freqFollow -
1155 *******************************************************************************/
1157 fillFrameInter (INT
*nL
, const int *v_tuningSegm
, INT
*v_bord
, INT
*length_v_bord
,
1158 INT bmin
, INT
*v_freq
, INT
*length_v_freq
, INT
*v_bordFollow
,
1159 INT
*length_v_bordFollow
, INT
*v_freqFollow
,
1160 INT
*length_v_freqFollow
, INT i_fillFollow
, INT dmin
,
1161 INT dmax
, INT numberTimeSlots
)
1163 INT middle
, b_new
, numBordFollow
, bordMaxFollow
, i
;
1165 if (numberTimeSlots
!= NUMBER_TIME_SLOTS_1152
) {
1167 /* % remove fill borders: */
1168 if (i_fillFollow
>= 1) {
1169 *length_v_bordFollow
= i_fillFollow
;
1170 *length_v_freqFollow
= i_fillFollow
;
1173 numBordFollow
= *length_v_bordFollow
;
1174 bordMaxFollow
= v_bordFollow
[numBordFollow
- 1];
1176 /* remove even more borders if needed */
1177 middle
= bmin
- bordMaxFollow
;
1178 while (middle
< 0) {
1180 bordMaxFollow
= v_bordFollow
[numBordFollow
- 1];
1181 middle
= bmin
- bordMaxFollow
;
1184 *length_v_bordFollow
= numBordFollow
;
1185 *length_v_freqFollow
= numBordFollow
;
1186 *nL
= numBordFollow
- 1;
1188 b_new
= *length_v_bord
;
1191 if (middle
<= dmax
) {
1192 if (middle
>= dmin
) { /* concatenate */
1193 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
, *length_v_bordFollow
);
1194 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
, *length_v_freqFollow
);
1198 if (v_tuningSegm
[0] != 0) { /* remove one new border and concatenate */
1199 *length_v_bord
= b_new
- 1;
1200 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
,
1201 *length_v_bordFollow
);
1203 *length_v_freq
= b_new
- 1;
1204 FDKsbrEnc_AddVecLeft (v_freq
+ 1, length_v_freq
, v_freqFollow
,
1205 *length_v_freqFollow
);
1208 if (*length_v_bordFollow
> 1) { /* remove one old border and concatenate */
1209 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
,
1210 *length_v_bordFollow
- 1);
1211 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
,
1212 *length_v_bordFollow
- 1);
1216 else { /* remove new "transient" border and concatenate */
1218 for (i
= 0; i
< *length_v_bord
- 1; i
++)
1219 v_bord
[i
] = v_bord
[i
+ 1];
1221 for (i
= 0; i
< *length_v_freq
- 1; i
++)
1222 v_freq
[i
] = v_freq
[i
+ 1];
1224 *length_v_bord
= b_new
- 1;
1225 *length_v_freq
= b_new
- 1;
1227 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
,
1228 *length_v_bordFollow
);
1229 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
,
1230 *length_v_freqFollow
);
1235 else { /* middle > dmax */
1237 fillFramePre (dmax
, v_bord
, length_v_bord
, v_freq
, length_v_freq
, bmin
,
1239 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
, *length_v_bordFollow
);
1240 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
, *length_v_freqFollow
);
1245 else { /* numberTimeSlots==NUMBER_TIME_SLOTS_1152 */
1250 /*------------------------------------------------------------------------
1252 ------------------------------------------------------------------------*/
1253 if (i_fillFollow
>= 1) {
1254 *length_v_bordFollow
= i_fillFollow
;
1255 *length_v_freqFollow
= i_fillFollow
;
1258 numBordFollow
= *length_v_bordFollow
;
1259 bordMaxFollow
= v_bordFollow
[numBordFollow
- 1];
1261 /*------------------------------------------------------------------------
1262 remove more borders if necessary to eliminate overlap
1263 ------------------------------------------------------------------------*/
1265 /* check for overlap */
1266 middle
= bmin
- bordMaxFollow
;
1269 i) middle < 0 : overlap, must remove borders
1270 ii) 0 <= middle < dmin : no overlap but too tight, must remove borders
1271 iii) dmin <= middle <= dmax : ok, just concatenate
1272 iv) dmax <= middle : too wide, must add borders
1275 /* first remove old non-fill-borders... */
1276 while (middle
< 0) {
1278 /* ...but don't remove all of them */
1279 if (numBordFollow
== 1)
1283 bordMaxFollow
= v_bordFollow
[numBordFollow
- 1];
1284 middle
= bmin
- bordMaxFollow
;
1287 /* if this isn't enough, remove new non-fill borders */
1290 for (l
= 0, m
= 0 ; l
< *length_v_bord
; l
++)
1292 if(v_bord
[l
]> bordMaxFollow
)
1294 v_bord
[m
] = v_bord
[l
];
1295 v_freq
[m
] = v_freq
[l
];
1307 /*------------------------------------------------------------------------
1308 update modified follow-up data
1309 ------------------------------------------------------------------------*/
1311 *length_v_bordFollow
= numBordFollow
;
1312 *length_v_freqFollow
= numBordFollow
;
1314 /* left relative borders correspond to follow-up */
1315 *nL
= numBordFollow
- 1;
1317 /*------------------------------------------------------------------------
1318 take care of intervals ii through iv
1319 ------------------------------------------------------------------------*/
1321 /* now middle should be >= 0 */
1322 middle
= bmin
- bordMaxFollow
;
1324 if (middle
<= dmin
) /* (ii) */
1326 b_new
= *length_v_bord
;
1328 if (v_tuningSegm
[0] != 0)
1330 /* remove new "luxury" border and concatenate */
1331 *length_v_bord
= b_new
- 1;
1332 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
,
1333 *length_v_bordFollow
);
1335 *length_v_freq
= b_new
- 1;
1336 FDKsbrEnc_AddVecLeft (v_freq
+ 1, length_v_freq
, v_freqFollow
,
1337 *length_v_freqFollow
);
1340 else if (*length_v_bordFollow
> 1)
1342 /* remove old border and concatenate */
1343 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
,
1344 *length_v_bordFollow
- 1);
1345 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
,
1346 *length_v_bordFollow
- 1);
1352 /* remove new border and concatenate */
1353 for (i
= 0; i
< *length_v_bord
- 1; i
++)
1354 v_bord
[i
] = v_bord
[i
+ 1];
1356 for (i
= 0; i
< *length_v_freq
- 1; i
++)
1357 v_freq
[i
] = v_freq
[i
+ 1];
1359 *length_v_bord
= b_new
- 1;
1360 *length_v_freq
= b_new
- 1;
1362 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
,
1363 *length_v_bordFollow
);
1364 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
,
1365 *length_v_freqFollow
);
1368 else if ((middle
>= dmin
) && (middle
<= dmax
)) /* (iii) */
1371 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
, *length_v_bordFollow
);
1372 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
, *length_v_freqFollow
);
1377 fillFramePre (dmax
, v_bord
, length_v_bord
, v_freq
, length_v_freq
, bmin
,
1379 FDKsbrEnc_AddVecLeft (v_bord
, length_v_bord
, v_bordFollow
, *length_v_bordFollow
);
1380 FDKsbrEnc_AddVecLeft (v_freq
, length_v_freq
, v_freqFollow
, *length_v_freqFollow
);
1387 /*******************************************************************************
1388 Functionname: calcFrameClass
1389 *******************************************************************************
1393 Arguments: INT* frameClass, INT* frameClassOld, INT tranFlag, INT* spreadFlag)
1397 *******************************************************************************/
1399 calcFrameClass (FRAME_CLASS
*frameClass
, FRAME_CLASS
*frameClassOld
, INT tranFlag
,
1403 switch (*frameClassOld
) {
1406 if (tranFlag
) *frameClass
= FIXVAR
;
1407 else *frameClass
= FIXFIX
;
1410 if (tranFlag
) { *frameClass
= VARVAR
; *spreadFlag
= 0; }
1412 if (*spreadFlag
) *frameClass
= VARVAR
;
1413 else *frameClass
= VARFIX
;
1417 if (tranFlag
) *frameClass
= FIXVAR
;
1418 else *frameClass
= FIXFIX
;
1421 if (tranFlag
) { *frameClass
= VARVAR
; *spreadFlag
= 0; }
1423 if (*spreadFlag
) *frameClass
= VARVAR
;
1424 else *frameClass
= VARFIX
;
1429 *frameClassOld
= *frameClass
;
1434 /*******************************************************************************
1435 Functionname: specialCase
1436 *******************************************************************************
1440 Arguments: spreadFlag
1451 *******************************************************************************/
1453 specialCase (INT
*spreadFlag
, INT allowSpread
, INT
*v_bord
,
1454 INT
*length_v_bord
, INT
*v_freq
, INT
*length_v_freq
, INT
*parts
,
1461 if (allowSpread
) { /* add one "step 8" */
1463 FDKsbrEnc_AddRight (v_bord
, length_v_bord
, v_bord
[L
- 1] + 8);
1464 FDKsbrEnc_AddRight (v_freq
, length_v_freq
, 1);
1468 if (d
== 1) { /* stretch one slot */
1469 *length_v_bord
= L
- 1;
1470 *length_v_freq
= L
- 1;
1473 if ((v_bord
[L
- 1] - v_bord
[L
- 2]) > 2) { /* compress one quant step */
1474 v_bord
[L
- 1] = v_bord
[L
- 1] - 2;
1475 v_freq
[*length_v_freq
- 1] = 0; /* use low res for short segment */
1483 /*******************************************************************************
1484 Functionname: calcCmonBorder
1485 *******************************************************************************
1497 *******************************************************************************/
1499 calcCmonBorder (INT
*i_cmon
, INT
*i_tran
, INT
*v_bord
, INT
*length_v_bord
,
1500 INT tran
, INT bufferFrameStart
, INT numberTimeSlots
)
1504 for (i
= 0; i
< *length_v_bord
; i
++)
1505 if (v_bord
[i
] >= bufferFrameStart
+ numberTimeSlots
) { /* FH 00-06-26 */
1510 /* keep track of transient: */
1511 for (i
= 0; i
< *length_v_bord
; i
++)
1512 if (v_bord
[i
] >= tran
) {
1520 /*******************************************************************************
1521 Functionname: keepForFollowUp
1522 *******************************************************************************
1526 Arguments: v_bordFollow
1541 *******************************************************************************/
1543 keepForFollowUp (INT
*v_bordFollow
, INT
*length_v_bordFollow
,
1544 INT
*v_freqFollow
, INT
*length_v_freqFollow
,
1545 INT
*i_tranFollow
, INT
*i_fillFollow
, INT
*v_bord
,
1546 INT
*length_v_bord
, INT
*v_freq
, INT i_cmon
, INT i_tran
,
1547 INT parts
, INT numberTimeSlots
)
1553 (*length_v_bordFollow
) = 0;
1554 (*length_v_freqFollow
) = 0;
1556 for (j
= 0, i
= i_cmon
; i
< L
; i
++, j
++) {
1557 v_bordFollow
[j
] = v_bord
[i
] - numberTimeSlots
; /* FH 00-06-26 */
1558 v_freqFollow
[j
] = v_freq
[i
];
1559 (*length_v_bordFollow
)++;
1560 (*length_v_freqFollow
)++;
1562 if (i_tran
!= EMPTY
)
1563 *i_tranFollow
= i_tran
- i_cmon
;
1565 *i_tranFollow
= EMPTY
;
1566 *i_fillFollow
= L
- (parts
- 1) - i_cmon
;
1570 /*******************************************************************************
1571 Functionname: calcCtrlSignal
1572 *******************************************************************************
1589 *******************************************************************************/
1591 calcCtrlSignal (HANDLE_SBR_GRID hSbrGrid
,
1592 FRAME_CLASS frameClass
, INT
*v_bord
, INT length_v_bord
, INT
*v_freq
,
1593 INT length_v_freq
, INT i_cmon
, INT i_tran
, INT spreadFlag
,
1598 INT i
, r
, a
, n
, p
, b
, aL
, aR
, ntot
, nmax
, nR
;
1600 INT
*v_f
= hSbrGrid
->v_f
;
1601 INT
*v_fLR
= hSbrGrid
->v_fLR
;
1602 INT
*v_r
= hSbrGrid
->bs_rel_bord
;
1603 INT
*v_rL
= hSbrGrid
->bs_rel_bord_0
;
1604 INT
*v_rR
= hSbrGrid
->bs_rel_bord_1
;
1607 INT length_v_rR
= 0;
1608 INT length_v_rL
= 0;
1610 switch (frameClass
) {
1612 /* absolute border: */
1616 /* relative borders: */
1621 r
= v_bord
[i
] - v_bord
[i
- 1];
1622 FDKsbrEnc_AddRight (v_r
, &length_v_r
, r
);
1627 /* number of relative borders: */
1632 for (i
= 0; i
< i_cmon
; i
++)
1633 v_f
[i
] = v_freq
[i_cmon
- 1 - i
];
1637 p
= (i_cmon
>= i_tran
&& i_tran
!= EMPTY
) ? (i_cmon
- i_tran
+ 1) : (0) ;
1639 hSbrGrid
->frameClass
= frameClass
;
1640 hSbrGrid
->bs_abs_bord
= a
;
1646 /* absolute border: */
1649 /* relative borders: */
1652 for (i
= 1; i
< length_v_bord
; i
++) {
1653 r
= v_bord
[i
] - v_bord
[i
- 1];
1654 FDKsbrEnc_AddRight (v_r
, &length_v_r
, r
);
1657 /* number of relative borders: */
1661 FDKmemcpy (v_f
, v_freq
, length_v_freq
* sizeof (INT
));
1665 p
= (i_tran
>= 0 && i_tran
!= EMPTY
) ? (i_tran
+ 1) : (0) ;
1667 hSbrGrid
->frameClass
= frameClass
;
1668 hSbrGrid
->bs_abs_bord
= a
;
1675 /* absolute borders: */
1682 /* number of relative borders: */
1685 nmax
= 2; /* n: {0,1,2} */
1695 /* relative borders: */
1697 for (i
= 1; i
<= nL
; i
++) {
1698 r
= v_bord
[i
] - v_bord
[i
- 1];
1699 FDKsbrEnc_AddRight (v_rL
, &length_v_rL
, r
);
1704 while (i
>= b
- nR
) {
1705 r
= v_bord
[i
] - v_bord
[i
- 1];
1706 FDKsbrEnc_AddRight (v_rR
, &length_v_rR
, r
);
1710 /* pointer (only one due to constraint in frame info): */
1711 p
= (i_tran
> 0 && i_tran
!= EMPTY
) ? (b
- i_tran
) : (0) ;
1715 for (i
= 0; i
< b
- 1; i
++)
1716 v_fLR
[i
] = v_freq
[i
];
1720 length_v_bord
= i_cmon
+ 1;
1721 length_v_freq
= i_cmon
+ 1;
1724 /* absolute borders: */
1730 /* number of relative borders: */
1734 /* relative borders: */
1736 for (i
= 1; i
<= nL
; i
++) {
1737 r
= v_bord
[i
] - v_bord
[i
- 1];
1738 FDKsbrEnc_AddRight (v_rL
, &length_v_rL
, r
);
1743 while (i
>= b
- nR
) {
1744 r
= v_bord
[i
] - v_bord
[i
- 1];
1745 FDKsbrEnc_AddRight (v_rR
, &length_v_rR
, r
);
1749 /* pointer (only one due to constraint in frame info): */
1750 p
= (i_cmon
>= i_tran
&& i_tran
!= EMPTY
) ? (i_cmon
- i_tran
+ 1) : (0) ;
1753 for (i
= 0; i
< b
- 1; i
++)
1754 v_fLR
[i
] = v_freq
[i
];
1757 hSbrGrid
->frameClass
= frameClass
;
1758 hSbrGrid
->bs_abs_bord_0
= aL
;
1759 hSbrGrid
->bs_abs_bord_1
= aR
;
1760 hSbrGrid
->bs_num_rel_0
= nL
;
1761 hSbrGrid
->bs_num_rel_1
= nR
;
1772 /*******************************************************************************
1773 Functionname: createDefFrameInfo
1774 *******************************************************************************
1776 Description: Copies the default (static) frameInfo structs to the frameInfo
1777 passed by reference; only used for FIXFIX frames
1779 Arguments: hFrameInfo - HANLDE_SBR_FRAME_INFO
1783 Return: none; hSbrFrameInfo contains a copy of the default frameInfo
1785 Written: Andreas Schneider
1787 *******************************************************************************/
1789 createDefFrameInfo(HANDLE_SBR_FRAME_INFO hSbrFrameInfo
, INT nEnv
, INT nTimeSlots
)
1793 switch (nTimeSlots
) {
1794 case NUMBER_TIME_SLOTS_1920
:
1795 FDKmemcpy (hSbrFrameInfo
, &frameInfo1_1920
, sizeof (SBR_FRAME_INFO
));
1797 case NUMBER_TIME_SLOTS_2048
:
1798 FDKmemcpy (hSbrFrameInfo
, &frameInfo1_2048
, sizeof (SBR_FRAME_INFO
));
1800 case NUMBER_TIME_SLOTS_1152
:
1801 FDKmemcpy (hSbrFrameInfo
, &frameInfo1_1152
, sizeof (SBR_FRAME_INFO
));
1803 case NUMBER_TIME_SLOTS_2304
:
1804 FDKmemcpy (hSbrFrameInfo
, &frameInfo1_2304
, sizeof (SBR_FRAME_INFO
));
1806 case NUMBER_TIME_SLOTS_512LD
:
1807 FDKmemcpy (hSbrFrameInfo
, &frameInfo1_512LD
, sizeof (SBR_FRAME_INFO
));
1814 switch (nTimeSlots
) {
1815 case NUMBER_TIME_SLOTS_1920
:
1816 FDKmemcpy (hSbrFrameInfo
, &frameInfo2_1920
, sizeof (SBR_FRAME_INFO
));
1818 case NUMBER_TIME_SLOTS_2048
:
1819 FDKmemcpy (hSbrFrameInfo
, &frameInfo2_2048
, sizeof (SBR_FRAME_INFO
));
1821 case NUMBER_TIME_SLOTS_1152
:
1822 FDKmemcpy (hSbrFrameInfo
, &frameInfo2_1152
, sizeof (SBR_FRAME_INFO
));
1824 case NUMBER_TIME_SLOTS_2304
:
1825 FDKmemcpy (hSbrFrameInfo
, &frameInfo2_2304
, sizeof (SBR_FRAME_INFO
));
1827 case NUMBER_TIME_SLOTS_512LD
:
1828 FDKmemcpy (hSbrFrameInfo
, &frameInfo2_512LD
, sizeof (SBR_FRAME_INFO
));
1835 switch (nTimeSlots
) {
1836 case NUMBER_TIME_SLOTS_1920
:
1837 FDKmemcpy (hSbrFrameInfo
, &frameInfo4_1920
, sizeof (SBR_FRAME_INFO
));
1839 case NUMBER_TIME_SLOTS_2048
:
1840 FDKmemcpy (hSbrFrameInfo
, &frameInfo4_2048
, sizeof (SBR_FRAME_INFO
));
1842 case NUMBER_TIME_SLOTS_1152
:
1843 FDKmemcpy (hSbrFrameInfo
, &frameInfo4_1152
, sizeof (SBR_FRAME_INFO
));
1845 case NUMBER_TIME_SLOTS_2304
:
1846 FDKmemcpy (hSbrFrameInfo
, &frameInfo4_2304
, sizeof (SBR_FRAME_INFO
));
1848 case NUMBER_TIME_SLOTS_512LD
:
1849 FDKmemcpy (hSbrFrameInfo
, &frameInfo4_512LD
, sizeof (SBR_FRAME_INFO
));
1861 /*******************************************************************************
1862 Functionname: ctrlSignal2FrameInfo
1863 *******************************************************************************
1865 Description: Calculates frame_info struct from control signal.
1867 Arguments: hSbrGrid - source
1868 hSbrFrameInfo - destination
1870 Return: void; hSbrFrameInfo contains the updated FRAME_INFO struct
1872 *******************************************************************************/
1874 ctrlSignal2FrameInfo (HANDLE_SBR_GRID hSbrGrid
,
1875 HANDLE_SBR_FRAME_INFO hSbrFrameInfo
,
1876 INT freq_res_fixfix
)
1878 INT nEnv
= 0, border
= 0, i
, k
, p
/*?*/;
1879 INT
*v_r
= hSbrGrid
->bs_rel_bord
;
1880 INT
*v_f
= hSbrGrid
->v_f
;
1882 FRAME_CLASS frameClass
= hSbrGrid
->frameClass
;
1883 INT bufferFrameStart
= hSbrGrid
->bufferFrameStart
;
1884 INT numberTimeSlots
= hSbrGrid
->numberTimeSlots
;
1886 switch (frameClass
) {
1888 createDefFrameInfo(hSbrFrameInfo
, hSbrGrid
->bs_num_env
, numberTimeSlots
);
1890 /* At this point all frequency resolutions are set to FREQ_RES_HIGH, so
1891 * only if freq_res_fixfix is set to FREQ_RES_LOW, they all have to be
1894 if (freq_res_fixfix
== FREQ_RES_LOW
) {
1895 for (i
= 0; i
< hSbrFrameInfo
->nEnvelopes
; i
++) {
1896 hSbrFrameInfo
->freqRes
[i
] = FREQ_RES_LOW
;
1899 /* ELD: store current frequency resolution */
1900 hSbrGrid
->v_f
[0] = hSbrFrameInfo
->freqRes
[0];
1905 nEnv
= hSbrGrid
->n
+ 1; /* read n [SBR_NUM_BITS bits] */ /*? snd*/
1906 FDK_ASSERT(nEnv
<= MAX_ENVELOPES_FIXVAR_VARFIX
);
1908 hSbrFrameInfo
->nEnvelopes
= nEnv
;
1910 border
= hSbrGrid
->bs_abs_bord
; /* read the absolute border */
1913 hSbrFrameInfo
->nNoiseEnvelopes
= 1;
1915 hSbrFrameInfo
->nNoiseEnvelopes
= 2;
1924 switch (frameClass
) {
1926 hSbrFrameInfo
->borders
[0] = bufferFrameStart
; /* start-position of 1st envelope */
1928 hSbrFrameInfo
->borders
[nEnv
] = border
;
1930 for (k
= 0, i
= nEnv
- 1; k
< nEnv
- 1; k
++, i
--) {
1932 hSbrFrameInfo
->borders
[i
] = border
;
1935 /* make either envelope nr. nEnv + 1 - p short; or don't shorten if p == 0 */
1938 hSbrFrameInfo
->shortEnv
= 0;
1940 hSbrFrameInfo
->shortEnv
= nEnv
+ 1 - p
;
1943 for (k
= 0, i
= nEnv
- 1; k
< nEnv
; k
++, i
--) {
1944 hSbrFrameInfo
->freqRes
[i
] = (FREQ_RES
)v_f
[k
];
1947 /* if either there is no short envelope or the last envelope is short... */
1948 if (p
== 0 || p
== 1) {
1949 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[nEnv
- 1];
1951 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[hSbrFrameInfo
->shortEnv
];
1957 /* in this case 'border' indicates the start of the 1st envelope */
1958 hSbrFrameInfo
->borders
[0] = border
;
1960 for (k
= 0; k
< nEnv
- 1; k
++) {
1962 hSbrFrameInfo
->borders
[k
+ 1] = border
;
1965 hSbrFrameInfo
->borders
[nEnv
] = bufferFrameStart
+ numberTimeSlots
;
1968 if (p
== 0 || p
== 1) {
1969 hSbrFrameInfo
->shortEnv
= 0;
1971 hSbrFrameInfo
->shortEnv
= p
- 1;
1974 for (k
= 0; k
< nEnv
; k
++) {
1975 hSbrFrameInfo
->freqRes
[k
] = (FREQ_RES
)v_f
[k
];
1980 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[1];
1983 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[nEnv
- 1];
1986 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[hSbrFrameInfo
->shortEnv
];
1992 nEnv
= hSbrGrid
->bs_num_rel_0
+ hSbrGrid
->bs_num_rel_1
+ 1;
1993 FDK_ASSERT(nEnv
<= MAX_ENVELOPES_VARVAR
); /* just to be sure */
1994 hSbrFrameInfo
->nEnvelopes
= nEnv
;
1996 hSbrFrameInfo
->borders
[0] = border
= hSbrGrid
->bs_abs_bord_0
;
1998 for (k
= 0, i
= 1; k
< hSbrGrid
->bs_num_rel_0
; k
++, i
++) {
1999 border
+= hSbrGrid
->bs_rel_bord_0
[k
];
2000 hSbrFrameInfo
->borders
[i
] = border
;
2003 border
= hSbrGrid
->bs_abs_bord_1
;
2004 hSbrFrameInfo
->borders
[nEnv
] = border
;
2006 for (k
= 0, i
= nEnv
- 1; k
< hSbrGrid
->bs_num_rel_1
; k
++, i
--) {
2007 border
-= hSbrGrid
->bs_rel_bord_1
[k
];
2008 hSbrFrameInfo
->borders
[i
] = border
;
2013 hSbrFrameInfo
->shortEnv
= 0;
2015 hSbrFrameInfo
->shortEnv
= nEnv
+ 1 - p
;
2018 for (k
= 0; k
< nEnv
; k
++) {
2019 hSbrFrameInfo
->freqRes
[k
] = (FREQ_RES
)hSbrGrid
->v_fLR
[k
];
2023 hSbrFrameInfo
->nNoiseEnvelopes
= 1;
2024 hSbrFrameInfo
->bordersNoise
[0] = hSbrGrid
->bs_abs_bord_0
;
2025 hSbrFrameInfo
->bordersNoise
[1] = hSbrGrid
->bs_abs_bord_1
;
2027 hSbrFrameInfo
->nNoiseEnvelopes
= 2;
2028 hSbrFrameInfo
->bordersNoise
[0] = hSbrGrid
->bs_abs_bord_0
;
2030 if (p
== 0 || p
== 1) {
2031 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[nEnv
- 1];
2033 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[hSbrFrameInfo
->shortEnv
];
2035 hSbrFrameInfo
->bordersNoise
[2] = hSbrGrid
->bs_abs_bord_1
;
2044 if (frameClass
== VARFIX
|| frameClass
== FIXVAR
) {
2045 hSbrFrameInfo
->bordersNoise
[0] = hSbrFrameInfo
->borders
[0];
2047 hSbrFrameInfo
->bordersNoise
[1] = hSbrFrameInfo
->borders
[nEnv
];
2049 hSbrFrameInfo
->bordersNoise
[2] = hSbrFrameInfo
->borders
[nEnv
];