• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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: ./src/deinterleave.c
21 
22 ------------------------------------------------------------------------------
23  REVISION HISTORY
24 
25  Description:  Modified from original shareware code
26 
27  Description: (1) Modified with new template, rename variables
28               (2) Removed for-loop to calculate win_inc, win_inc = SN2 (128)
29               (3) Replaced for-loop with memcpy
30               (4) Converted Int16 -> Int
31 
32  Description: Modified per review comments
33 
34  Who:                       Date:
35  Description:
36 
37 ------------------------------------------------------------------------------
38  INPUT AND OUTPUT DEFINITIONS
39 
40  Inputs:
41     interleaved   = input array that contains interleaved coefficients
42                     Data Type Int
43 
44     deinterleaved = output array that will be updated with de-interleaved
45                     coefficients of input array. Data Type Int
46 
47     pFrameInfo = pointer to structure that holds information of current
48                  frame. Data Type FrameInfo
49 
50  Local Stores/Buffers/Pointers Needed:
51     None
52 
53  Global Stores/Buffers/Pointers Needed:
54     None
55 
56  Outputs:
57     None
58 
59  Pointers and Buffers Modified:
60     deinterleaved  contents updated with de-interleaved coefficients from
61                    the input array: interleaved
62 
63  Local Stores Modified:
64     None
65 
66  Global Stores Modified:
67     None
68 
69 ------------------------------------------------------------------------------
70  FUNCTION DESCRIPTION
71 
72  This function performs the deinterleaving across all short windows in
73  each group
74 
75 ------------------------------------------------------------------------------
76  REQUIREMENTS
77 
78  This function should replace the contents of pDeinterleaved with the
79  de-interleaved 1024 coefficients of one frame
80 
81 ------------------------------------------------------------------------------
82  REFERENCES
83 
84  (1) MPEG-2 NBC Audio Decoder
85    "This software module was originally developed by AT&T, Dolby
86    Laboratories, Fraunhofer Gesellschaft IIS in the course of development
87    of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
88    3. This software module is an implementation of a part of one or more
89    MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
90    Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
91    standards free license to this software module or modifications thereof
92    for use in hardware or software products claiming conformance to the
93    MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
94    module in hardware or software products are advised that this use may
95    infringe existing patents. The original developer of this software
96    module and his/her company, the subsequent editors and their companies,
97    and ISO/IEC have no liability for use of this software module or
98    modifications thereof in an implementation. Copyright is not released
99    for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
100    developer retains full right to use the code for his/her own purpose,
101    assign or donate the code to a third party and to inhibit third party
102    from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
103    This copyright notice must be included in all copies or derivative
104    works."
105    Copyright(c)1996.
106 
107  (2) ISO/IEC 14496-3: 1999(E)
108     Subpart 4           p78     quant_to_spec
109 
110 ------------------------------------------------------------------------------
111  PSEUDO-CODE
112 
113     pInterleaved   = interleaved;
114     pDeinterleaved = deinterleaved;
115 
116     pSfbPerWin  = pFrameInfo->sfb_per_win;
117     ngroups     = pFrameInfo->num_groups;
118     pGroupLen   = pFrameInfo->group_len;
119 
120     pGroup = pDeinterleaved;
121 
122     FOR (group = ngroups; group > 0; group--)
123 
124         pSfbWidth   = pFrameInfo->sfb_width_128;
125         sfb_inc = 0;
126         pStart = pInterleaved;
127 
128         FOR (sfb = pSfbPerWin[ngroups-group]; sfb > 0; sfb--)
129 
130             pWin = pGroup;
131 
132             FOR (win = pGroupLen[ngroups-group]; win > 0; win--)
133 
134                 pDeinterleaved = pWin + sfb_inc;
135 
136                 pv_memcpy(
137                      pDeinterleaved,
138                      pInterleaved,
139                     *pSfbWidth*sizeof(*pInterleaved));
140 
141                 pInterleaved += *pSfbWidth;
142 
143                 pWin += SN2;
144 
145             ENDFOR (win)
146 
147             sfb_inc += *pSfbWidth++;
148 
149         ENDFOR (sfb)
150 
151     pGroup += (pInterleaved - pStart);
152 
153     ENDFOR (group)
154 
155 ------------------------------------------------------------------------------
156  RESOURCES USED
157    When the code is written for a specific target processor the
158      the resources used should be documented below.
159 
160  STACK USAGE: [stack count for this module] + [variable to represent
161           stack usage for each subroutine called]
162 
163      where: [stack usage variable] = stack usage for [subroutine
164          name] (see [filename].ext)
165 
166  DATA MEMORY USED: x words
167 
168  PROGRAM MEMORY USED: x words
169 
170  CLOCK CYCLES: [cycle count equation for this module] + [variable
171            used to represent cycle count for each subroutine
172            called]
173 
174      where: [cycle count variable] = cycle count for [subroutine
175         name] (see [filename].ext)
176 
177 ------------------------------------------------------------------------------
178 */
179 
180 
181 /*----------------------------------------------------------------------------
182 ; INCLUDES
183 ----------------------------------------------------------------------------*/
184 #include    "pv_audio_type_defs.h"
185 #include    "huffman.h"
186 #include    "aac_mem_funcs.h"
187 
188 /*----------------------------------------------------------------------------
189 ; MACROS
190 ; Define module specific macros here
191 ----------------------------------------------------------------------------*/
192 
193 /*----------------------------------------------------------------------------
194 ; DEFINES
195 ; Include all pre-processor statements here. Include conditional
196 ; compile variables also.
197 ----------------------------------------------------------------------------*/
198 
199 /*----------------------------------------------------------------------------
200 ; LOCAL FUNCTION DEFINITIONS
201 ; Function Prototype declaration
202 ----------------------------------------------------------------------------*/
203 
204 /*----------------------------------------------------------------------------
205 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
206 ; Variable declaration - defined here and used outside this module
207 ----------------------------------------------------------------------------*/
208 
209 /*----------------------------------------------------------------------------
210 ; EXTERNAL FUNCTION REFERENCES
211 ; Declare functions defined elsewhere and referenced in this module
212 ----------------------------------------------------------------------------*/
213 
214 /*----------------------------------------------------------------------------
215 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
216 ; Declare variables used in this module but defined elsewhere
217 ----------------------------------------------------------------------------*/
218 
219 /*----------------------------------------------------------------------------
220 ; FUNCTION CODE
221 ----------------------------------------------------------------------------*/
deinterleave(Int16 interleaved[],Int16 deinterleaved[],FrameInfo * pFrameInfo)222 void deinterleave(
223     Int16        interleaved[],
224     Int16        deinterleaved[],
225     FrameInfo   *pFrameInfo)
226 {
227 
228     Int      group;  /* group index */
229     Int      sfb;    /* scalefactor band index */
230     Int      win;    /* window index */
231     Int16    *pGroup;
232     Int16    *pWin;
233     Int16    *pStart;
234     Int16    *pInterleaved;
235     Int16    *pDeinterleaved;
236     Int      sfb_inc;
237 
238     Int      ngroups;
239     Int     *pGroupLen;
240     Int     *pSfbPerWin;
241     Int     *pSfbWidth;
242 
243     pInterleaved   = interleaved;
244     pDeinterleaved = deinterleaved;
245 
246     pSfbPerWin  = pFrameInfo->sfb_per_win;
247     ngroups     = pFrameInfo->num_groups;
248     pGroupLen   = pFrameInfo->group_len;
249 
250     pGroup = pDeinterleaved;
251 
252     for (group = ngroups; group > 0; group--)
253     {
254         pSfbWidth   = pFrameInfo->sfb_width_128;
255         sfb_inc = 0;
256         pStart = pInterleaved;
257 
258         /* Perform the deinterleaving across all windows in a group */
259 
260         for (sfb = pSfbPerWin[ngroups-group]; sfb > 0; sfb--)
261         {
262             pWin = pGroup;
263 
264             for (win = pGroupLen[ngroups-group]; win > 0; win--)
265             {
266                 pDeinterleaved = pWin + sfb_inc;
267 
268                 pv_memcpy(
269                     pDeinterleaved,
270                     pInterleaved,
271                     *pSfbWidth*sizeof(*pInterleaved));
272 
273                 pInterleaved += *pSfbWidth;
274 
275                 pWin += SN2;
276 
277             } /* for (win) */
278 
279             sfb_inc += *pSfbWidth++;
280 
281         } /* for (sfb) */
282 
283         pGroup += (pInterleaved - pStart);
284 
285     } /* for (group) */
286 
287 } /* deinterleave */
288