1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/*
19
20 Pathname: pvmp4audiodecodeframe
21
22------------------------------------------------------------------------------
23 REVISION HISTORY
24
25 Description:  Modified from original shareware code
26
27 Description:  Pulled in loop structure from console.c, so that this function
28               now decodes all frames in the file.
29
30               Original program used several global variables.  These have been
31               eliminated, except for situations in which the global variables
32               could be converted into const types.  Otherwise, they are passed
33               by reference through the functions.
34
35 Description:  Begin mods for file I/O removal
36
37 Description:  Merged trans4m_freq_2_time, trans4m_time_2_freq, etc.
38
39 Description:  Removing commented out sections of code.  This includes the
40               removal of unneeded functions init_lt_pred, reset_mc_info,
41
42 Description: Copied from aac_decode_frame.c and renamed file,
43              Made many changes.
44
45 Description: Prepare for code review
46
47 Description: Update per review comments:
48              1) Add comment about leaveGetLoop
49              2) Remove inverseTNSCoef array
50              3) fix wnd_shape_this_bk to wnd_shape_prev_bk in F to T
51              4) Clean up comments
52              5) Change call to long_term_synthesis
53
54 Description: Remove division for calculation of bitrate.
55
56 Description: Remove update of LTP buffers if not LTP audio object type.
57
58 Description: Add hasmask to call to right_ch_sfb_tools_ms
59
60 Description:
61 Modified to call ltp related routines on the left channel
62 before intensity is called on the right channel.  The previous version
63 was causing a problem when IS was used on the right channel and LTP
64 on the left channel for the same scalefactor band.
65
66 This fix required creating a new function, apply_ms_synt, deleting another
67 function (right_ch_sfb_tools_noms.c), and modifying the calling order of
68 the other functions.
69
70 Description: Made changes per review comments.
71
72 Description: Changed name of right_ch_sfb_tools_ms to pns_intensity_right
73
74 Description: Added cast, since pVars->inputStream.usedBits is UInt, and
75 pExt->remainderBits is Int.
76
77 pExt->remainderBits =
78    (Int)(pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK);
79
80 Description: Modified to pass a pointer to scratch memory into
81 tns_setup_filter.c
82
83 Description: Removed include of "s_TNSInfo.h"
84
85 Description: Removed call to "tns_setup_filter" which has been eliminated
86 by merging its functionality into "get_tns"
87
88 Description:  Passing in a pointer to a q-format array, rather than
89 the address of a single q-format, for the inverse filter case for
90 apply_tns.
91
92 Description:
93 (1) Added #include of "e_ElementId.h"
94     Previously, this function was relying on another include file
95     to include "e_ElementId.h"
96
97 (2) Updated the copyright header.
98
99 Description:
100 Per review comments, declared two temporary variables
101
102    pChLeftShare  = pChVars[LEFT]->pShareWfxpCoef;
103    pChRightShare = pChVars[RIGHT]->pShareWfxpCoef;
104
105 Description:
106    long_term_synthesis should have been invoked with max_sfb
107    as the 2nd parameter, rather than pFrameInfo->sfb_per_win[0].
108
109    Old
110                long_term_synthesis(
111                    pChVars[ch]->wnd,
112                    pFrameInfo->sfb_per_win[0] ...
113
114    Correction
115                long_term_synthesis(
116                    pChVars[ch]->wnd,
117                    pChVars[ch]->pShareWfxpCoef->max_sfb ...
118
119    This problem caused long_term_synthesis to read memory which
120    was not initialized in get_ics_info.c
121
122 Description:
123 (1) Utilize scratch memory for the scratch Prog_Config.
124
125 Description: (1) Modified to decode ID_END syntactic element after header
126
127 Description:
128 (1) Reconfigured LTP buffer as a circular buffer.  This saves
129     2048 Int16->Int16 copies per frame.
130
131 Description: Updated so ltp buffers are not used as a wasteful
132 intermediate buffer for LC streams.  Data is transferred directly
133 from the filterbank to the output stream.
134
135 Description: Decode ADIF header if frame count is zero.
136              The AudioSpecificConfig is decoded by a separate API.
137
138 Description: Added comments explaining how the ltp_buffer_state
139 variable is updated.
140
141
142 Description: Modified code to take advantage of new trans4m_freq_2_time_fxp,
143 which writes the output directly into a 16-bit output buffer.  This
144 improvement allows faster operation by reducing the amount of memory
145 transfers.  Speed can be further improved on most platforms via use of a
146 DMA transfer in the function write_output.c
147
148 Description: perChan[] is an array of structures in tDec_Int_File. Made
149              corresponding changes.
150
151 Description: Included changes in interface for q_normalize() and
152              trans4m_freq_2_time_fxp.
153
154 Description: Included changes in interface for long_term_prediction.
155
156 Description: Added support for DSE (Data Streaming Channel). Added
157              function get_dse() and included file get_dse.h
158
159 Description: Added support for the ill-case when a raw data block contains
160              only a terminator <ID_END>. This is illegal but is added
161              for convinience
162
163 Description: Added support for empty audio frames, such the one containing
164              only DSE or FILL elements. A trap was added to stop processing
165              when no audio information was sent.
166
167 Description: Added support for adts format files. Added saturation to
168              floating point version of aac+ decoding
169
170 Description:
171
172------------------------------------------------------------------------------
173 INPUT AND OUTPUT DEFINITIONS
174
175 Inputs:
176    pExt = pointer to the external interface structure. See the file
177           PVMP4AudioDecoder_API.h for a description of each field.
178           Data type of pointer to a tPVMP4AudioDecoderExternal
179           structure.
180
181    pMem = void pointer to hide the internal implementation of the library
182           It is cast back to a tDec_Int_File structure. This structure
183           contains information that needs to persist between calls to
184           this function, or is too big to be placed on the stack, even
185           though the data is only needed during execution of this function
186           Data type void pointer, internally pointer to a tDec_Int_File
187           structure.
188
189 Local Stores/Buffers/Pointers Needed: None
190           (The memory set aside in pMem performs this task)
191
192 Global Stores/Buffers/Pointers Needed: None
193
194 Outputs:
195     status = 0                       if no error occurred
196              MP4AUDEC_NONRECOVERABLE if a non-recoverable error occurred
197              MP4AUDEC_RECOVERABLE    if a recoverable error occurred.
198              Presently a recoverable error does not exist, but this
199              was a requirement.
200
201
202 Pointers and Buffers Modified:
203    pMem contents are modified.
204    pExt: (more detail in the file PVMP4AudioDecoder_API.h)
205    inputBufferUsedLength - number of array elements used up by the stream.
206    remainderBits - remaining bits in the next UInt32 buffer
207    samplingRate - sampling rate in samples per sec
208    bitRate - bit rate in bits per second, varies frame to frame.
209    encodedChannels - channels found on the file (informative)
210    frameLength - length of the frame
211
212 Local Stores Modified: None.
213
214 Global Stores Modified: None.
215
216------------------------------------------------------------------------------
217 FUNCTION DESCRIPTION
218
219 Decodes one frame of an MPEG-2/MPEG-4 encoded audio bitstream.
220
221 This function calls the various components of the decoder in the proper order.
222
223
224         Left Channel                                    Right Channel
225             |                                                 |
226             |                                                 |
227             |                                                 |
228            \|/                                               \|/
229 #1 ____________________                           #2 ____________________
230    |                  |                              |                  |
231    | Huffman Decoding |                              | Huffman Decoding |
232    |__________________|                              |__________________|
233             |                                                 |
234             |                                                 |
235             |                                                 |
236            \|/                                                |
237 #3 ____________________                                       |
238    |                  |                                       |
239    |     PNS LEFT     |                                       |
240    |__________________|                                       |
241             |                                                 |
242             |                                                 |
243             |                                                 |
244            \|/                                               \|/
245 #4 ______________________________________________________________________
246    |                                                                    |
247    |                          Apply MS_Synt                             |
248    |____________________________________________________________________|
249             |                                                 |
250             |                                                 |
251            \|/                                                |
252 #5 ____________________                                       |
253    |                  |                                       W
254    |       LTP        |                                       A
255    |__________________|                                       I
256             |                                                 T
257             |                                                 |
258             |                                                 F
259            \|/                                                O
260 #6 ____________________                                       R
261    |                  |                                       |
262    |   Time -> Freq   |                                       L
263    |__________________|                                       E
264             |                                                 F
265             |                                                 T
266             |                                                 |
267            \|/                                                C
268 #7 ____________________                                       H
269    |                  |                                       A
270    |    TNS Inverse   |                                       N
271    |__________________|                                       N
272             |                                                 E
273             |                                                 L
274             |                                                 |
275            \|/                                                |
276 #8 ____________________                                       |
277    |                  |                                       |
278    | Long Term Synth  |                                       |
279    |__________________|                                       |
280             |                                                 |
281             |                                                \|/
282             |                                     #9 ____________________
283             |                                        |                  |
284             |--DATA ON LEFT CHANNEL MAY BE USED----->| PNS/Intensity Rt |
285             |                                        |__________________|
286             |                                                 |
287             |                                                 |
288             |                                                \|/
289             |                                    #10 ____________________
290             W                                        |                  |
291             A                                        |       LTP        |
292             I                                        |__________________|
293             T                                                 |
294             |                                                 |
295             F                                                 |
296             O                                                \|/
297             R                                    #11 ____________________
298             |                                        |                  |
299             R                                        |   Time -> Freq   |
300             I                                        |__________________|
301             G                                                 |
302             H                                                 |
303             T                                                 |
304             |                                                \|/
305             C                                    #12 ____________________
306             H                                        |                  |
307             A                                        |    TNS Inverse   |
308             N                                        |__________________|
309             N                                                 |
310             E                                                 |
311             L                                                 |
312             |                                                \|/
313             |                                    #13 ____________________
314             |                                        |                  |
315             |                                        | Long Term Synth  |
316             |                                        |__________________|
317             |                                                 |
318             |                                                 |
319             |                                                 |
320            \|/                                               \|/
321#14 ____________________                          #18 ____________________
322    |                  |                              |                  |
323    |       TNS        |                              |       TNS        |
324    |__________________|                              |__________________|
325             |                                                 |
326             |                                                 |
327             |                                                 |
328            \|/                                               \|/
329#15 ____________________                          #19 ____________________
330    |                  |                              |                  |
331    |   qFormatNorm    |                              |   qFormatNorm    |
332    |__________________|                              |__________________|
333             |                                                 |
334             |                                                 |
335             |                                                 |
336            \|/                                               \|/
337#16 ____________________                          #20 ____________________
338    |                  |                              |                  |
339    |   Freq / Time    |                              |   Freq / Time    |
340    |__________________|                              |__________________|
341             |                                                 |
342             |                                                 |
343             |                                                 |
344            \|/                                               \|/
345#17 ____________________                          #21 ____________________
346    |                  |                              |                  |
347    |   Limit Buffer   |                              |   Limit Buffer   |
348    |__________________|                              |__________________|
349             |                                                 |
350             |                                                 |
351             |                                                 |
352            \|/                                               \|/
353#22 ______________________________________________________________________
354    |                                                                    |
355    |                           Write Output                             |
356    |____________________________________________________________________|
357
358
359------------------------------------------------------------------------------
360 REQUIREMENTS
361
362 PacketVideo Document # CCC-AUD-AAC-ERS-0003
363
364------------------------------------------------------------------------------
365 REFERENCES
366
367 (1) MPEG-2 NBC Audio Decoder
368   "This software module was originally developed by AT&T, Dolby
369   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
370   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
371   3. This software module is an implementation of a part of one or more
372   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
373   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
374   standards free license to this software module or modifications thereof
375   for use in hardware or software products claiming conformance to the
376   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
377   module in hardware or software products are advised that this use may
378   infringe existing patents. The original developer of this software
379   module and his/her company, the subsequent editors and their companies,
380   and ISO/IEC have no liability for use of this software module or
381   modifications thereof in an implementation. Copyright is not released
382   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
383   developer retains full right to use the code for his/her own purpose,
384   assign or donate the code to a third party and to inhibit third party
385   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
386   This copyright notice must be included in all copies or derivative
387   works."
388   Copyright(c)1996.
389
390------------------------------------------------------------------------------
391 RESOURCES USED
392   When the code is written for a specific target processor the
393     the resources used should be documented below.
394
395 STACK USAGE: [stack count for this module] + [variable to represent
396          stack usage for each subroutine called]
397
398     where: [stack usage variable] = stack usage for [subroutine
399         name] (see [filename].ext)
400
401 DATA MEMORY USED: x words
402
403 PROGRAM MEMORY USED: x words
404
405 CLOCK CYCLES: [cycle count equation for this module] + [variable
406           used to represent cycle count for each subroutine
407           called]
408
409     where: [cycle count variable] = cycle count for [subroutine
410        name] (see [filename].ext)
411
412------------------------------------------------------------------------------
413*/
414
415
416/*----------------------------------------------------------------------------
417; INCLUDES
418----------------------------------------------------------------------------*/
419#include "pv_audio_type_defs.h"
420
421#include "s_tdec_int_chan.h"
422#include "s_tdec_int_file.h"
423#include "aac_mem_funcs.h"
424#include "sfb.h"                   /* Where samp_rate_info[] is declared */
425#include "e_tmp4audioobjecttype.h"
426#include "e_elementid.h"
427
428
429#include "get_adif_header.h"
430#include "get_adts_header.h"
431#include "get_audio_specific_config.h"
432#include "ibstream.h"           /* where getbits is declared */
433
434#include "huffman.h"            /* where huffdecode is declared */
435#include "get_prog_config.h"
436#include "getfill.h"
437#include "pns_left.h"
438
439#include "apply_ms_synt.h"
440#include "pns_intensity_right.h"
441#include "q_normalize.h"
442#include "long_term_prediction.h"
443#include "long_term_synthesis.h"
444#include "ltp_common_internal.h"
445#include "apply_tns.h"
446
447#include "window_block_fxp.h"
448
449#include "write_output.h"
450
451#include "pvmp4audiodecoder_api.h"   /* Where this function is declared */
452#include "get_dse.h"
453
454#include "sbr_applied.h"
455#include "sbr_open.h"
456#include "get_sbr_bitstream.h"
457#include "e_sbr_element_id.h"
458
459
460
461/*----------------------------------------------------------------------------
462; MACROS
463; Define module specific macros here
464----------------------------------------------------------------------------*/
465
466/*----------------------------------------------------------------------------
467; DEFINES
468; Include all pre-processor statements here. Include conditional
469; compile variables also.
470----------------------------------------------------------------------------*/
471
472#define LEFT (0)
473#define RIGHT (1)
474
475
476/*----------------------------------------------------------------------------
477; LOCAL FUNCTION DEFINITIONS
478; Function Prototype declaration
479----------------------------------------------------------------------------*/
480
481/*----------------------------------------------------------------------------
482; LOCAL STORE/BUFFER/POINTER DEFINITIONS
483; Variable declaration - defined here and used outside this module
484----------------------------------------------------------------------------*/
485
486/*----------------------------------------------------------------------------
487; EXTERNAL FUNCTION REFERENCES
488; Declare functions defined elsewhere and referenced in this module
489----------------------------------------------------------------------------*/
490
491void InitSbrSynFilterbank(bool bDownSampleSBR);
492
493
494
495/*----------------------------------------------------------------------------
496; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
497; Declare variables used in this module but defined elsewhere
498----------------------------------------------------------------------------*/
499
500/*----------------------------------------------------------------------------
501; FUNCTION CODE
502----------------------------------------------------------------------------*/
503
504
505OSCL_EXPORT_REF Int PVMP4AudioDecodeFrame(
506    tPVMP4AudioDecoderExternal  *pExt,
507    void                        *pMem)
508{
509    Int            frameLength;      /* Helper variable */
510    Int            ch;
511    Int            id_syn_ele;
512    UInt           initialUsedBits;  /* Unsigned for C55x */
513    Int            qFormatNorm;
514    Int            qPredictedSamples;
515    Bool           leaveGetLoop;
516    MC_Info       *pMC_Info;        /* Helper pointer */
517    FrameInfo     *pFrameInfo;      /* Helper pointer */
518    tDec_Int_File *pVars;           /* Helper pointer */
519    tDec_Int_Chan *pChVars[Chans];  /* Helper pointer */
520
521    per_chan_share_w_fxpCoef *pChLeftShare;  /* Helper pointer */
522    per_chan_share_w_fxpCoef *pChRightShare; /* Helper pointer */
523
524    Int            status = MP4AUDEC_SUCCESS;
525
526
527    Bool empty_frame;
528
529#ifdef AAC_PLUS
530
531    SBRDECODER_DATA *sbrDecoderData;
532    SBR_DEC         *sbrDec;
533    SBRBITSTREAM    *sbrBitStream;
534
535#endif
536    /*
537     * Initialize "helper" pointers to existing memory.
538     */
539    pVars = (tDec_Int_File *)pMem;
540
541    pMC_Info = &pVars->mc_info;
542
543    pChVars[LEFT]  = &pVars->perChan[LEFT];
544    pChVars[RIGHT] = &pVars->perChan[RIGHT];
545
546    pChLeftShare = pChVars[LEFT]->pShareWfxpCoef;
547    pChRightShare = pChVars[RIGHT]->pShareWfxpCoef;
548
549
550#ifdef AAC_PLUS
551
552    sbrDecoderData = (SBRDECODER_DATA *) & pVars->sbrDecoderData;
553    sbrDec         = (SBR_DEC *) & pVars->sbrDec;
554    sbrBitStream   = (SBRBITSTREAM *) & pVars->sbrBitStr;
555
556#ifdef PARAMETRICSTEREO
557    sbrDecoderData->hParametricStereoDec = (HANDLE_PS_DEC) & pVars->sbrDecoderData.ParametricStereoDec;
558#endif
559
560#endif
561    /*
562     * Translate input buffer variables.
563     */
564    pVars->inputStream.pBuffer = pExt->pInputBuffer;
565
566    pVars->inputStream.inputBufferCurrentLength = (UInt)pExt->inputBufferCurrentLength;
567
568    pVars->inputStream.availableBits =
569        (UInt)(pExt->inputBufferCurrentLength << INBUF_ARRAY_INDEX_SHIFT);
570
571    initialUsedBits =
572        (UInt)((pExt->inputBufferUsedLength << INBUF_ARRAY_INDEX_SHIFT) +
573               pExt->remainderBits);
574
575    pVars->inputStream.usedBits = initialUsedBits;
576
577    if (initialUsedBits > pVars->inputStream.availableBits)
578    {
579        status = MP4AUDEC_INVALID_FRAME;
580    }
581    else if (pVars->bno == 0)
582    {
583        /*
584         * Attempt to read in ADIF format first because it is easily identified.
585         * If its not an ADIF bitstream, get_adif_header rewinds the "pointer"
586         * (actually usedBits).
587         */
588        status =
589            get_adif_header(
590                pVars,
591                &(pVars->scratch.scratch_prog_config));
592
593        byte_align(&pVars->inputStream);
594
595        if (status == SUCCESS)
596        {
597            pVars->prog_config.file_is_adts = FALSE;
598        }
599        else  /* we've tried simple audio config, adif, then it should be adts */
600        {
601            pVars->prog_config.file_is_adts = TRUE;
602        }
603    }
604    else if ((pVars->bno == 1) && (pVars->prog_config.file_is_adts == FALSE))
605    {
606
607        /*
608         * There might be an ID_END element following immediately after the
609         * AudioSpecificConfig header. This syntactic element should be read
610         * and byte_aligned before proceeds to decode "real" AAC raw data.
611         */
612        id_syn_ele = (Int)getbits(LEN_SE_ID, &pVars->inputStream) ;
613
614        if (id_syn_ele == ID_END)
615        {
616
617            byte_align(&pVars->inputStream);
618
619            pExt->inputBufferUsedLength =
620                pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT;
621
622            pExt->remainderBits = pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK;
623
624            pVars->bno++;
625
626            return(status);
627        }
628        else
629        {
630            /*
631             * Rewind bitstream pointer so that the syntactic element can be
632             * read when decoding raw bitstream
633             */
634            pVars->inputStream.usedBits -= LEN_SE_ID;
635        }
636
637    }
638
639    if (pVars->prog_config.file_is_adts == TRUE)
640    {
641        /*
642         *  If file is adts format, let the decoder handle only on data raw
643         *  block at the time, once the last (or only) data block has been
644         *  processed, then synch on the next header
645         */
646        if (pVars->prog_config.headerless_frames)
647        {
648            pVars->prog_config.headerless_frames--;  /* raw data block counter  */
649        }
650        else
651        {
652            status =  get_adts_header(pVars,
653                                      &(pVars->syncword),
654                                      &(pVars->invoke),
655                                      3);     /*   CorrectlyReadFramesCount  */
656
657            if (status != SUCCESS)
658            {
659                status = MP4AUDEC_LOST_FRAME_SYNC;    /*  we lost track of header */
660            }
661        }
662    }
663    else
664    {
665        byte_align(&pVars->inputStream);
666    }
667
668#ifdef AAC_PLUS
669    sbrBitStream->NrElements = 0;
670    sbrBitStream->NrElementsCore = 0;
671
672#endif
673
674    /*
675     * The variable leaveGetLoop is used to signal that the following
676     * loop can be left, which retrieves audio syntatic elements until
677     * an ID_END is found, or an error occurs.
678     */
679    leaveGetLoop = FALSE;
680    empty_frame  = TRUE;
681
682    while ((leaveGetLoop == FALSE) && (status == SUCCESS))
683    {
684        /* get audio syntactic element */
685        id_syn_ele = (Int)get9_n_lessbits(LEN_SE_ID, &pVars->inputStream);
686
687        /*
688         *  As fractional frames are a possible input, check that parsing does not
689         *  go beyond the available bits before parsing the syntax.
690         */
691        if (pVars->inputStream.usedBits > pVars->inputStream.availableBits)
692        {
693            status = MP4AUDEC_INCOMPLETE_FRAME; /* possible EOF or fractional frame */
694            id_syn_ele = ID_END;           /* quit while-loop */
695        }
696
697        switch (id_syn_ele)
698        {
699            case ID_END:        /* terminator field */
700                leaveGetLoop = TRUE;
701                break;
702
703            case ID_SCE:        /* single channel */
704            case ID_CPE:        /* channel pair */
705                empty_frame = FALSE;
706                status =
707                    huffdecode(
708                        id_syn_ele,
709                        &(pVars->inputStream),
710                        pVars,
711                        pChVars);
712
713#ifdef AAC_PLUS
714                if (id_syn_ele == ID_SCE)
715                {
716                    sbrBitStream->sbrElement[sbrBitStream->NrElements].ElementID = SBR_ID_SCE;
717                }
718                else if (id_syn_ele == ID_CPE)
719                {
720                    sbrBitStream->sbrElement[sbrBitStream->NrElements].ElementID = SBR_ID_CPE;
721                }
722                sbrBitStream->NrElementsCore++;
723
724
725#endif
726
727                break;
728
729            case ID_PCE:        /* program config element */
730                /*
731                 * PCE are not accepted in the middle of a
732                 * raw_data_block. If found, a possible error may happen
733                 * If a PCE is encountered during the first 2 frames,
734                 * it will be read and accepted
735                 * if its tag matches the first, with no error checking
736                 * (inside of get_prog_config)
737                 */
738
739                if (pVars->bno <= 1)
740                {
741                    status = get_prog_config(pVars,
742                                             &(pVars->scratch.scratch_prog_config));
743                }
744                else
745                {
746                    status = MP4AUDEC_INVALID_FRAME;
747                }
748                break;
749
750            case ID_FIL:        /* fill element */
751#ifdef AAC_PLUS
752                get_sbr_bitstream(sbrBitStream, &pVars->inputStream);
753
754#else
755                getfill(&pVars->inputStream);
756#endif
757
758                break;
759
760            case ID_DSE:       /* Data Streaming element */
761                get_dse(pVars->share.data_stream_bytes,
762                        &pVars->inputStream);
763                break;
764
765            default: /* Unsupported element, including ID_LFE */
766                status = -1;  /* ERROR CODE needs to be updated */
767                break;
768
769        } /* end switch() */
770
771    } /* end while() */
772
773    byte_align(&pVars->inputStream);
774
775    /*
776     *   After parsing the first frame ( bno=0 (adif), bno=1 (raw))
777     *   verify if implicit signalling is forcing to upsample AAC with
778     *   no AAC+/eAAC+ content. If so, disable upsampling
779     */
780
781#ifdef AAC_PLUS
782    if (pVars->bno <= 1)
783    {
784        if ((pVars->mc_info.ExtendedAudioObjectType == MP4AUDIO_AAC_LC) &&
785                (!sbrBitStream->NrElements))
786        {
787            PVMP4AudioDecoderDisableAacPlus(pExt, pMem);
788        }
789    }
790#endif
791
792    /*
793     *   There might be an empty raw data block with only a
794     *   ID_END element or non audio ID_DSE, ID_FIL
795     *   This is an "illegal" condition but this trap
796     *   avoids any further processing
797     */
798
799    if (empty_frame == TRUE)
800    {
801        pExt->inputBufferUsedLength =
802            pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT;
803
804        pExt->remainderBits = pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK;
805
806        pVars->bno++;
807
808        return(status);
809
810    }
811
812#ifdef AAC_PLUS
813
814    if (sbrBitStream->NrElements)
815    {
816        /* for every core SCE or CPE there must be an SBR element, otherwise sths. wrong */
817        if (sbrBitStream->NrElements != sbrBitStream->NrElementsCore)
818        {
819            status = MP4AUDEC_INVALID_FRAME;
820        }
821
822        if (pExt->aacPlusEnabled == false)
823        {
824            sbrBitStream->NrElements = 0;   /* disable aac processing  */
825        }
826    }
827    else
828    {
829        /*
830         *  This is AAC, but if aac+/eaac+ was declared in the stream, and there is not sbr content
831         *  something is wrong
832         */
833        if (pMC_Info->sbrPresentFlag || pMC_Info->psPresentFlag)
834        {
835            status = MP4AUDEC_INVALID_FRAME;
836        }
837    }
838#endif
839
840
841
842
843    /*
844     * Signal processing section.
845     */
846    frameLength = pVars->frameLength;
847
848    if (status == SUCCESS)
849    {
850        /*
851         *   PNS and INTENSITY STEREO and MS
852         */
853
854        pFrameInfo = pVars->winmap[pChVars[LEFT]->wnd];
855
856        pns_left(
857            pFrameInfo,
858            pChLeftShare->group,
859            pChLeftShare->cb_map,
860            pChLeftShare->factors,
861            pChLeftShare->lt_status.sfb_prediction_used,
862            pChLeftShare->lt_status.ltp_data_present,
863            pChVars[LEFT]->fxpCoef,
864            pChLeftShare->qFormat,
865            &(pVars->pns_cur_noise_state));
866
867        /*
868         * apply_ms_synt can only be ran for common windows.
869         * (where both the left and right channel share the
870         * same grouping, window length, etc.
871         *
872         * pVars->hasmask will be > 0 only if
873         * common windows are enabled for this frame.
874         */
875
876        if (pVars->hasmask > 0)
877        {
878            apply_ms_synt(
879                pFrameInfo,
880                pChLeftShare->group,
881                pVars->mask,
882                pChLeftShare->cb_map,
883                pChVars[LEFT]->fxpCoef,
884                pChVars[RIGHT]->fxpCoef,
885                pChLeftShare->qFormat,
886                pChRightShare->qFormat);
887        }
888
889        for (ch = 0; (ch < pMC_Info->nch); ch++)
890        {
891            pFrameInfo = pVars->winmap[pChVars[ch]->wnd];
892
893            /*
894             * Note: This MP4 library assumes that if there are two channels,
895             * then the second channel is right AND it was a coupled channel,
896             * therefore there is no need to check the "is_cpe" flag.
897             */
898
899            if (ch > 0)
900            {
901                pns_intensity_right(
902                    pVars->hasmask,
903                    pFrameInfo,
904                    pChRightShare->group,
905                    pVars->mask,
906                    pChRightShare->cb_map,
907                    pChLeftShare->factors,
908                    pChRightShare->factors,
909                    pChRightShare->lt_status.sfb_prediction_used,
910                    pChRightShare->lt_status.ltp_data_present,
911                    pChVars[LEFT]->fxpCoef,
912                    pChVars[RIGHT]->fxpCoef,
913                    pChLeftShare->qFormat,
914                    pChRightShare->qFormat,
915                    &(pVars->pns_cur_noise_state));
916            }
917
918            if (pChVars[ch]->pShareWfxpCoef->lt_status.ltp_data_present != FALSE)
919            {
920                /*
921                 * LTP - Long Term Prediction
922                 */
923
924                qPredictedSamples = long_term_prediction(
925                                        pChVars[ch]->wnd,
926                                        pChVars[ch]->pShareWfxpCoef->lt_status.
927                                        weight_index,
928                                        pChVars[ch]->pShareWfxpCoef->lt_status.
929                                        delay,
930                                        pChVars[ch]->ltp_buffer,
931                                        pVars->ltp_buffer_state,
932                                        pChVars[ch]->time_quant,
933                                        pVars->share.predictedSamples,      /* Scratch */
934                                        frameLength);
935
936                trans4m_time_2_freq_fxp(
937                    pVars->share.predictedSamples,
938                    pChVars[ch]->wnd,
939                    pChVars[ch]->wnd_shape_prev_bk,
940                    pChVars[ch]->wnd_shape_this_bk,
941                    &qPredictedSamples,
942                    pVars->scratch.fft);   /* scratch memory for FFT */
943
944
945                /*
946                 * To solve a potential problem where a pointer tied to
947                 * the qFormat was being incremented, a pointer to
948                 * pChVars[ch]->qFormat is passed in here rather than
949                 * the address of qPredictedSamples.
950                 *
951                 * Neither values are actually needed in the case of
952                 * inverse filtering, but the pointer was being
953                 * passed (and incremented) regardless.
954                 *
955                 * So, the solution is to pass a space of memory
956                 * that a pointer can happily point to.
957                 */
958
959                /* This is the inverse filter */
960                apply_tns(
961                    pVars->share.predictedSamples,  /* scratch re-used for each ch */
962                    pChVars[ch]->pShareWfxpCoef->qFormat,     /* Not used by the inv_filter */
963                    pFrameInfo,
964                    &(pChVars[ch]->pShareWfxpCoef->tns),
965                    TRUE,                       /* TRUE is FIR */
966                    pVars->scratch.tns_inv_filter);
967
968                /*
969                 * For the next function long_term_synthesis,
970                 * the third param win_sfb_top[], and
971                 * the tenth param coef_per_win,
972                 * are used differently that in the rest of the project. This
973                 * is because originally the ISO code was going to have
974                 * these parameters change as the "short window" changed.
975                 * These are all now the same value for each of the eight
976                 * windows.  This is why there is a [0] at the
977                 * end of each of theses parameters.
978                 * Note in particular that win_sfb_top was originally an
979                 * array of pointers to arrays, but inside long_term_synthesis
980                 * it is now a simple array.
981                 * When the rest of the project functions are changed, the
982                 * structure FrameInfo changes, and the [0]'s are removed,
983                 * this comment could go away.
984                 */
985                long_term_synthesis(
986                    pChVars[ch]->wnd,
987                    pChVars[ch]->pShareWfxpCoef->max_sfb,
988                    pFrameInfo->win_sfb_top[0], /* Look above */
989                    pChVars[ch]->pShareWfxpCoef->lt_status.win_prediction_used,
990                    pChVars[ch]->pShareWfxpCoef->lt_status.sfb_prediction_used,
991                    pChVars[ch]->fxpCoef,   /* input and output */
992                    pChVars[ch]->pShareWfxpCoef->qFormat,   /* input and output */
993                    pVars->share.predictedSamples,
994                    qPredictedSamples,       /* q format for previous aray */
995                    pFrameInfo->coef_per_win[0], /* Look above */
996                    NUM_SHORT_WINDOWS,
997                    NUM_RECONSTRUCTED_SFB);
998
999            } /* end if (pChVars[ch]->lt_status.ltp_data_present != FALSE) */
1000
1001        } /* for(ch) */
1002
1003        for (ch = 0; (ch < pMC_Info->nch); ch++)
1004        {
1005
1006            pFrameInfo = pVars->winmap[pChVars[ch]->wnd];
1007
1008            /*
1009             * TNS - Temporal Noise Shaping
1010             */
1011
1012            /* This is the forward filter
1013             *
1014             * A special note:  Scratch memory is not used by
1015             * the forward filter, but is passed in to maintain
1016             * common interface for inverse and forward filter
1017             */
1018            apply_tns(
1019                pChVars[ch]->fxpCoef,
1020                pChVars[ch]->pShareWfxpCoef->qFormat,
1021                pFrameInfo,
1022                &(pChVars[ch]->pShareWfxpCoef->tns),
1023                FALSE,                   /* FALSE is IIR */
1024                pVars->scratch.tns_inv_filter);
1025
1026            /*
1027             * Normalize the q format across all scale factor bands
1028             * to one value.
1029             */
1030            qFormatNorm =
1031                q_normalize(
1032                    pChVars[ch]->pShareWfxpCoef->qFormat,
1033                    pFrameInfo,
1034                    pChVars[ch]->abs_max_per_window,
1035                    pChVars[ch]->fxpCoef);
1036
1037            /*
1038             *  filterbank - converts frequency coeficients to time domain.
1039             */
1040
1041#ifdef AAC_PLUS
1042            if (sbrBitStream->NrElements == 0 && pMC_Info->upsamplingFactor == 1)
1043            {
1044                trans4m_freq_2_time_fxp_2(
1045                    pChVars[ch]->fxpCoef,
1046                    pChVars[ch]->time_quant,
1047                    pChVars[ch]->wnd,   /* window sequence */
1048                    pChVars[ch]->wnd_shape_prev_bk,
1049                    pChVars[ch]->wnd_shape_this_bk,
1050                    qFormatNorm,
1051                    pChVars[ch]->abs_max_per_window,
1052                    pVars->scratch.fft,
1053                    &pExt->pOutputBuffer[ch]);
1054                /*
1055                 *  Update LTP buffers if needed
1056                 */
1057
1058                if (pVars->mc_info.audioObjectType == MP4AUDIO_LTP)
1059                {
1060                    Int16 * pt = &pExt->pOutputBuffer[ch];
1061                    Int16 * ptr = &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state]);
1062                    Int16  x, y;
1063                    for (Int32 i = HALF_LONG_WINDOW; i != 0; i--)
1064                    {
1065                        x = *pt;
1066                        pt += 2;
1067                        y = *pt;
1068                        pt += 2;
1069                        *(ptr++) =  x;
1070                        *(ptr++) =  y;
1071                    }
1072                }
1073            }
1074            else
1075            {
1076                trans4m_freq_2_time_fxp_1(
1077                    pChVars[ch]->fxpCoef,
1078                    pChVars[ch]->time_quant,
1079                    &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state + 288]),
1080                    pChVars[ch]->wnd,   /* window sequence */
1081                    pChVars[ch]->wnd_shape_prev_bk,
1082                    pChVars[ch]->wnd_shape_this_bk,
1083                    qFormatNorm,
1084                    pChVars[ch]->abs_max_per_window,
1085                    pVars->scratch.fft);
1086
1087            }
1088#else
1089
1090            trans4m_freq_2_time_fxp_2(
1091                pChVars[ch]->fxpCoef,
1092                pChVars[ch]->time_quant,
1093                pChVars[ch]->wnd,   /* window sequence */
1094                pChVars[ch]->wnd_shape_prev_bk,
1095                pChVars[ch]->wnd_shape_this_bk,
1096                qFormatNorm,
1097                pChVars[ch]->abs_max_per_window,
1098                pVars->scratch.fft,
1099                &pExt->pOutputBuffer[ch]);
1100            /*
1101             *  Update LTP buffers only if needed
1102             */
1103
1104            if (pVars->mc_info.audioObjectType == MP4AUDIO_LTP)
1105            {
1106                Int16 * pt = &pExt->pOutputBuffer[ch];
1107                Int16 * ptr = &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state]);
1108                Int16  x, y;
1109                for (Int32 i = HALF_LONG_WINDOW; i != 0; i--)
1110                {
1111                    x = *pt;
1112                    pt += 2;
1113                    y = *pt;
1114                    pt += 2;
1115                    *(ptr++) =  x;
1116                    *(ptr++) =  y;
1117                }
1118
1119            }
1120
1121
1122#endif
1123
1124
1125            /* Update the window shape */
1126            pChVars[ch]->wnd_shape_prev_bk = pChVars[ch]->wnd_shape_this_bk;
1127
1128        } /* end for() */
1129
1130
1131        /*
1132         * Copy to the final output buffer, taking into account the desired
1133         * channels from the calling environment, the actual channels, and
1134         * whether the data should be interleaved or not.
1135         *
1136         * If the stream had only one channel, write_output will not use
1137         * the right channel data.
1138         *
1139         */
1140
1141
1142        /* CONSIDER USE OF DMA OPTIMIZATIONS WITHIN THE write_output FUNCTION.
1143         *
1144         * It is presumed that the ltp_buffer will reside in internal (fast)
1145         * memory, while the pExt->pOutputBuffer will reside in external
1146         * (slow) memory.
1147         *
1148         */
1149
1150
1151#ifdef AAC_PLUS
1152
1153        if (sbrBitStream->NrElements || pMC_Info->upsamplingFactor == 2)
1154        {
1155
1156            if (pVars->bno <= 1)   /* allows console to operate with ADIF and audio config */
1157            {
1158                if (sbrDec->outSampleRate == 0) /* do it only once (disregarding of signaling type) */
1159                {
1160                    sbr_open(samp_rate_info[pVars->mc_info.sampling_rate_idx].samp_rate,
1161                             sbrDec,
1162                             sbrDecoderData,
1163                             pVars->mc_info.bDownSampledSbr);
1164                }
1165
1166            }
1167            pMC_Info->upsamplingFactor =
1168                sbrDecoderData->SbrChannel[0].frameData.sbr_header.sampleRateMode;
1169
1170
1171            /* reuse right aac spectrum channel  */
1172            {
1173                Int16 *pt_left  =  &(pChVars[LEFT ]->ltp_buffer[pVars->ltp_buffer_state]);
1174                Int16 *pt_right =  &(pChVars[RIGHT]->ltp_buffer[pVars->ltp_buffer_state]);
1175
1176                if (sbr_applied(sbrDecoderData,
1177                                sbrBitStream,
1178                                pt_left,
1179                                pt_right,
1180                                pExt->pOutputBuffer,
1181                                sbrDec,
1182                                pVars,
1183                                pMC_Info->nch) != SBRDEC_OK)
1184                {
1185                    status = MP4AUDEC_INVALID_FRAME;
1186                }
1187            }
1188
1189
1190        }  /*  if( pExt->aacPlusEnabled == FALSE) */
1191#endif
1192
1193        /*
1194         * Copied mono data in both channels or just leave it as mono,
1195         * according with desiredChannels (default is 2)
1196         */
1197
1198        if (pExt->desiredChannels == 2)
1199        {
1200
1201#if defined(AAC_PLUS)
1202#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR)
1203            if (pMC_Info->nch != 2 && pMC_Info->psPresentFlag != 1)
1204#else
1205            if (pMC_Info->nch != 2)
1206#endif
1207#else
1208            if (pMC_Info->nch != 2)
1209#endif
1210            {
1211                /* mono */
1212
1213
1214                Int16 * pt  = &pExt->pOutputBuffer[0];
1215                Int16 * pt2 = &pExt->pOutputBuffer[1];
1216                Int i;
1217                if (pMC_Info->upsamplingFactor == 2)
1218                {
1219                    for (i = 0; i < 1024; i++)
1220                    {
1221                        *pt2 = *pt;
1222                        pt += 2;
1223                        pt2 += 2;
1224                    }
1225                    pt  = &pExt->pOutputBuffer_plus[0];
1226                    pt2 = &pExt->pOutputBuffer_plus[1];
1227
1228                    for (i = 0; i < 1024; i++)
1229                    {
1230                        *pt2 = *pt;
1231                        pt += 2;
1232                        pt2 += 2;
1233                    }
1234                }
1235                else
1236                {
1237                    for (i = 0; i < 1024; i++)
1238                    {
1239                        *pt2 = *pt;
1240                        pt += 2;
1241                        pt2 += 2;
1242                    }
1243                }
1244
1245            }
1246
1247#if defined(AAC_PLUS)
1248#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR)
1249
1250            else if (pMC_Info->psPresentFlag == 1)
1251            {
1252                Int32 frameSize = 0;
1253                if (pExt->aacPlusEnabled == false)
1254                {
1255                    /*
1256                     *  Decoding eaac+ when only aac is enabled, copy L into R
1257                     */
1258                    frameSize = 1024;
1259                }
1260                else if (sbrDecoderData->SbrChannel[0].syncState != SBR_ACTIVE)
1261                {
1262                    /*
1263                     *  Decoding eaac+ when no PS data was found, copy upsampled L into R
1264                     */
1265                    frameSize = 2048;
1266                }
1267
1268                Int16 * pt  = &pExt->pOutputBuffer[0];
1269                Int16 * pt2 = &pExt->pOutputBuffer[1];
1270                Int i;
1271                for (i = 0; i < frameSize; i++)
1272                {
1273                    *pt2 = *pt;
1274                    pt += 2;
1275                    pt2 += 2;
1276                }
1277            }
1278#endif
1279#endif
1280
1281        }
1282        else
1283        {
1284
1285#if defined(AAC_PLUS)
1286#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR)
1287            if (pMC_Info->nch != 2 && pMC_Info->psPresentFlag != 1)
1288#else
1289            if (pMC_Info->nch != 2)
1290#endif
1291#else
1292            if (pMC_Info->nch != 2)
1293#endif
1294            {
1295                /* mono */
1296                Int16 * pt  = &pExt->pOutputBuffer[0];
1297                Int16 * pt2 = &pExt->pOutputBuffer[0];
1298                Int i;
1299
1300                if (pMC_Info->upsamplingFactor == 2)
1301                {
1302                    for (i = 0; i < 1024; i++)
1303                    {
1304                        *pt2++ = *pt;
1305                        pt += 2;
1306                    }
1307
1308                    pt  = &pExt->pOutputBuffer_plus[0];
1309                    pt2 = &pExt->pOutputBuffer_plus[0];
1310
1311                    for (i = 0; i < 1024; i++)
1312                    {
1313                        *pt2++ = *pt;
1314                        pt += 2;
1315                    }
1316                }
1317                else
1318                {
1319                    for (i = 0; i < 1024; i++)
1320                    {
1321                        *pt2++ = *pt;
1322                        pt += 2;
1323                    }
1324                }
1325
1326            }
1327
1328        }
1329
1330
1331
1332
1333        /* pVars->ltp_buffer_state cycles between 0 and 1024.  The value
1334         * indicates the location of the data corresponding to t == -2.
1335         *
1336         * | t == -2 | t == -1 |  pVars->ltp_buffer_state == 0
1337         *
1338         * | t == -1 | t == -2 |  pVars->ltp_buffer_state == 1024
1339         *
1340         */
1341
1342#ifdef AAC_PLUS
1343        if (sbrBitStream->NrElements == 0 && pMC_Info->upsamplingFactor == 1)
1344        {
1345            pVars->ltp_buffer_state ^= frameLength;
1346        }
1347        else
1348        {
1349            pVars->ltp_buffer_state ^= (frameLength + 288);
1350        }
1351#else
1352        pVars->ltp_buffer_state ^= frameLength;
1353#endif
1354
1355
1356        if (pVars->bno <= 1)
1357        {
1358            /*
1359             * to set these values only during the second call
1360             * when they change.
1361             */
1362            pExt->samplingRate =
1363                samp_rate_info[pVars->mc_info.sampling_rate_idx].samp_rate;
1364
1365            pVars->mc_info.implicit_channeling = 0; /* disable flag, as this is allowed
1366                                                      * only the first time
1367                                                      */
1368
1369
1370#ifdef AAC_PLUS
1371
1372            if (pMC_Info->upsamplingFactor == 2)
1373            {
1374                pExt->samplingRate *= pMC_Info->upsamplingFactor;
1375                pExt->aacPlusUpsamplingFactor = pMC_Info->upsamplingFactor;
1376            }
1377
1378#endif
1379
1380            pExt->extendedAudioObjectType = pMC_Info->ExtendedAudioObjectType;
1381            pExt->audioObjectType = pMC_Info->audioObjectType;
1382
1383            pExt->encodedChannels = pMC_Info->nch;
1384            pExt->frameLength = pVars->frameLength;
1385        }
1386
1387        pVars->bno++;
1388
1389
1390        /*
1391         * Using unit analysis, the bitrate is a function of the sampling rate, bits,
1392         * points in a frame
1393         *
1394         *     bits        samples                frame
1395         *     ----  =    --------- *  bits  *   -------
1396         *     sec           sec                  sample
1397         *
1398         * To save a divide, a shift is used. Presently only the value of
1399         * 1024 is used by this library, so make it the most accurate for that
1400         * value. This may need to be updated later.
1401         */
1402
1403        pExt->bitRate = (pExt->samplingRate *
1404                         (pVars->inputStream.usedBits - initialUsedBits)) >> 10;  /*  LONG_WINDOW  1024 */
1405
1406        pExt->bitRate >>= (pMC_Info->upsamplingFactor - 1);
1407
1408
1409    } /* end if (status == SUCCESS) */
1410
1411
1412    if (status != MP4AUDEC_SUCCESS)
1413    {
1414        /*
1415         *  A non-SUCCESS decoding could be due to an error on the bitstream or
1416         *  an incomplete frame. As access to the bitstream beyond frame boundaries
1417         *  are not allowed, in those cases the bitstream reading routine return a 0
1418         *  Zero values guarantees that the data structures are filled in with values
1419         *  that eventually will signal an error (like invalid parameters) or that allow
1420         *  completion of the parsing routine. Either way, the partial frame condition
1421         *  is verified at this time.
1422         */
1423        if (pVars->prog_config.file_is_adts == TRUE)
1424        {
1425            status = MP4AUDEC_LOST_FRAME_SYNC;
1426            pVars->prog_config.headerless_frames = 0; /* synchronization forced */
1427        }
1428        else
1429        {
1430            /*
1431             *  Check if the decoding error was due to buffer overrun, if it was,
1432             *  update status
1433             */
1434            if (pVars->inputStream.usedBits > pVars->inputStream.availableBits)
1435            {
1436                /* all bits were used but were not enough to complete decoding */
1437                pVars->inputStream.usedBits = pVars->inputStream.availableBits;
1438
1439                status = MP4AUDEC_INCOMPLETE_FRAME; /* possible EOF or fractional frame */
1440            }
1441        }
1442    }
1443
1444    /*
1445     * Translate from units of bits back into units of words.
1446     */
1447
1448    pExt->inputBufferUsedLength =
1449        pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT;
1450
1451    pExt->remainderBits = (Int)(pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK);
1452
1453
1454
1455    return (status);
1456
1457} /* PVMP4AudioDecoderDecodeFrame */
1458
1459