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