1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_reorder.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Inputs:
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 xr[ ],                rescaled data
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    struct gr_info_s *gr_info,  granule structure
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mp3Header *info,            mp3 header info
43f4ea1f92bc56a8ffceddba0dbd3979fe0219b13cAndreas Huber    int32  Scratch_mem[198]     for temporary usage
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Outputs:
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 xr[ ],                reordered data
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber If short blocks are used (block_type[gr][ch]=='10'), the rescaled data
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber xr[scf_band][window][freq_line] shall be reordered in polyphase subband
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber order, xr[subband][window][freq_line], prior to the IMDCT operation.
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_dec_defs.h"
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_reorder.h"
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_tables.h"
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "mp3_mem_funcs.h"
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_reorder(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   granuleInfo *gr_info,
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   int32  *used_freq_lines,
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   mp3Header *info,
123f4ea1f92bc56a8ffceddba0dbd3979fe0219b13cAndreas Huber                   int32  Scratch_mem[198])
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sfreq =  info->version_x + (info->version_x << 1);
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    sfreq += info->sampling_frequency;
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (gr_info->window_switching_flag && (gr_info->block_type == 2))
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32   sfb_lines;
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32   freq;
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32   src_line;
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32   sfb;
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (gr_info->mixed_block_flag)
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            /* REORDERING FOR REST SWITCHED SHORT */
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sfb = 3;  /* no reorder for low 2 subbands */
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            src_line = 36;
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {  /* pure short */
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sfb = 0;
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            src_line = 0;
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int16 ct = src_line;
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (; sfb < 13; sfb++)
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (*used_freq_lines > 3*mp3_sfBandIndex[sfreq].s[sfb+1])
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                sfb_lines = mp3_sfBandIndex[sfreq].s[sfb+1]  - mp3_sfBandIndex[sfreq].s[sfb];
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                for (freq = 0; freq < 3*sfb_lines; freq += 3)
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 tmp1 = xr[src_line];
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 tmp2 = xr[src_line+(sfb_lines)];
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 tmp3 = xr[src_line+(sfb_lines<<1)];
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    src_line++;
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[freq  ] = tmp1;
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[freq+1] = tmp2;
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[freq+2] = tmp3;
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                src_line += (sfb_lines << 1);
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pv_memcpy(&xr[ct], Scratch_mem, sfb_lines*3*sizeof(int32));
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                ct += sfb_lines + (sfb_lines << 1);
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            else
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                sfb_lines = mp3_sfBandIndex[sfreq].s[sfb+1]  - mp3_sfBandIndex[sfreq].s[sfb];
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                for (freq = 0; freq < 3*sfb_lines; freq += 3)
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 tmp1 = xr[src_line];
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 tmp2 = xr[src_line+(sfb_lines)];
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 tmp3 = xr[src_line+(sfb_lines<<1)];
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    src_line++;
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[freq  ] = tmp1;
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[freq+1] = tmp2;
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[freq+2] = tmp3;
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pv_memcpy(&xr[ct], Scratch_mem, sfb_lines*3*sizeof(int32));
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                *used_freq_lines = mp3_sfBandIndex[sfreq].s[sfb+1] * 3;
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                sfb = 13;   /* force out of the for-loop */
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
198