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
21 PacketVideo Corp.
22 MP3 Decoder Library
23
24 Filename: pvmp3_mpeg2_stereo_proc.cpp
25
26 Functions:
27
28 pvmp3_st_intensity_ver2
29 pvmp3_mpeg2_stereo_proc
30
31 Date: 09/21/2007
32
33 ------------------------------------------------------------------------------
34 REVISION HISTORY
35
36
37 Description:
38
39
40 ------------------------------------------------------------------------------
41
42 pvmp3_st_intensity_ver2
43
44 INPUT AND OUTPUT DEFINITIONS
45
46 Input
47
48 int32 xr[], input channel
49 int32 xl[],
50 int32 m, selecting index: io = 2(1/4) (m=0), io = 2(1/8) (m=1)
51 int32 is_pos, index on table is_pos_pow_eitgh_root_of_2
52 int32 Start, Location of first element where stereo intensity is applied
53 int32 Number number of elements affected
54
55 Returns
56
57 int32 xl[], generated stereo channel
58
59
60
61
62 ------------------------------------------------------------------------------
63
64 pvmp3_mpeg2_stereo_proc
65
66 INPUT AND OUTPUT DEFINITIONS
67
68 Input
69
70 int32 xr[], input channel
71 int32 xl[],
72 mp3ScaleFactors *scalefac, scale factors structure for Right channel
73 granuleInfo *gr_info_l, granule structure for the left channel
74 granuleInfo *gr_info_r, granule structure for the rigth channel
75 uint32 *scalefac_IIP_buffer, auxiliary scale factor vector
76 mp3Header *info mp3 header info
77 Returns
78
79 int32 xl[], generated stereo channel
80
81
82 ------------------------------------------------------------------------------
83 FUNCTION DESCRIPTION
84
85 stereo processing for mpeg2 layer III LSF extension
86
87 ------------------------------------------------------------------------------
88 REQUIREMENTS
89
90
91 ------------------------------------------------------------------------------
92 REFERENCES
93
94 [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
95 ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
96
97 ------------------------------------------------------------------------------
98 PSEUDO-CODE
99
100 ------------------------------------------------------------------------------
101 */
102
103
104 /*----------------------------------------------------------------------------
105 ; INCLUDES
106 ----------------------------------------------------------------------------*/
107
108 #include "pvmp3_mpeg2_stereo_proc.h"
109 #include "pvmp3_stereo_proc.h"
110 #include "pv_mp3dec_fxd_op.h"
111 #include "pvmp3_tables.h"
112 #include "mp3_mem_funcs.h"
113
114 /*----------------------------------------------------------------------------
115 ; MACROS
116 ; Define module specific macros here
117 ----------------------------------------------------------------------------*/
118
119
120 /*----------------------------------------------------------------------------
121 ; DEFINES
122 ; Include all pre-processor statements here. Include conditional
123 ; compile variables also.
124 ----------------------------------------------------------------------------*/
125
126 #define Q31_fmt(a) (int32(double(0x7FFFFFFF)*(a)))
127
128 /*----------------------------------------------------------------------------
129 ; LOCAL FUNCTION DEFINITIONS
130 ; Function Prototype declaration
131 ----------------------------------------------------------------------------*/
132
133 /*----------------------------------------------------------------------------
134 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
135 ; Variable declaration - defined here and used outside this module
136 ----------------------------------------------------------------------------*/
137 const int32 is_pos_pow_eitgh_root_of_2[8] =
138 {
139 /* --- 2^(1/8) ----- */
140 Q31_fmt(1.00000000000000), Q31_fmt(0.91700404320467), Q31_fmt(0.84089641525371),
141 Q31_fmt(0.77110541270397), Q31_fmt(0.70710678118655), Q31_fmt(0.64841977732550),
142 Q31_fmt(0.59460355750136), Q31_fmt(0.54525386633263)
143 };
144
145 /*----------------------------------------------------------------------------
146 ; EXTERNAL FUNCTION REFERENCES
147 ; Declare functions defined elsewhere and referenced in this module
148 ----------------------------------------------------------------------------*/
149
150 /*----------------------------------------------------------------------------
151 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
152 ; Declare variables used in this module but defined elsewhere
153 ----------------------------------------------------------------------------*/
154
155 /*----------------------------------------------------------------------------
156 ; FUNCTION CODE
157 ----------------------------------------------------------------------------*/
158
pvmp3_st_intensity_ver2(int32 xr[SUBBANDS_NUMBER * FILTERBANK_BANDS],int32 xl[SUBBANDS_NUMBER * FILTERBANK_BANDS],int32 m,int32 is_pos,int32 Start,int32 Number)159 void pvmp3_st_intensity_ver2(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
160 int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
161 int32 m,
162 int32 is_pos,
163 int32 Start,
164 int32 Number)
165 {
166 int32 k[2];
167
168 /* pow(io, ((is_pos + 1)>>1)); io = 2(1/4) (m=0), io = 2(1/8) (m=1) */
169 k[0] = is_pos_pow_eitgh_root_of_2[((is_pos+1)&(3+(m<<2)))<<(1-m)] >> ((is_pos + 1) >> (2 + m));
170 /* pow(io, (is_pos>>1)); io = 2(1/4) (m=0), io = 2(1/8) (m=1) */
171 k[1] = is_pos_pow_eitgh_root_of_2[(is_pos&(3+(m<<2)))<<(1-m)] >> (is_pos >> (2 + m));
172
173
174 int32 *pt_xr = &xr[Start];
175 int32 *pt_xl = &xl[Start];
176
177 if (is_pos == 0) /* 0 < is_pos < 31 */
178 {
179 pv_memcpy(pt_xl, pt_xr, Number*sizeof(*pt_xr));
180 }
181 else if (is_pos & 1)
182 {
183 for (int32 i = Number >> 1; i != 0; i--)
184 {
185 *(pt_xl++) = (*pt_xr);
186 *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
187 pt_xr++;
188 *(pt_xl++) = (*pt_xr);
189 *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
190 pt_xr++;
191 }
192 if (Number&1)
193 {
194 *(pt_xl) = (*pt_xr);
195 *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
196 }
197 }
198 else
199 {
200 for (int32 i = Number >> 1; i != 0; i--)
201 {
202 *(pt_xl++) = fxp_mul32_Q32((*(pt_xr++)) << 1, k[1]);
203 *(pt_xl++) = fxp_mul32_Q32((*(pt_xr++)) << 1, k[1]);
204 }
205 if (Number&1)
206 {
207 *(pt_xl) = fxp_mul32_Q32((*pt_xr) << 1, k[1]);
208 }
209 }
210
211 }
212
213
214
215 /*----------------------------------------------------------------------------
216 ; FUNCTION CODE
217 ----------------------------------------------------------------------------*/
pvmp3_mpeg2_stereo_proc(int32 xr[SUBBANDS_NUMBER * FILTERBANK_BANDS],int32 xl[SUBBANDS_NUMBER * FILTERBANK_BANDS],mp3ScaleFactors * scalefac_R,granuleInfo * gr_info_l,granuleInfo * gr_info_r,uint32 * scalefac_IIP_buffer,int32 used_freq_lines,mp3Header * info)218 void pvmp3_mpeg2_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
219 int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
220 mp3ScaleFactors *scalefac_R,
221 granuleInfo *gr_info_l,
222 granuleInfo *gr_info_r,
223 uint32 *scalefac_IIP_buffer,
224 int32 used_freq_lines,
225 mp3Header *info)
226 {
227
228 int32 sfreq;
229 int32 sb;
230 int32 ss;
231 int32 sfbNo;
232 int32 sfbStart;
233 int32 sfb;
234 int32 sfbTemp;
235 int32 i;
236 int32 j;
237 int32 io;
238
239
240 int32 i_stereo = (info->mode == MPG_MD_JOINT_STEREO) &&
241 (info->mode_ext & 0x1);
242
243 int32 ms_stereo = (info->mode == MPG_MD_JOINT_STEREO) &&
244 (info->mode_ext & 0x2);
245
246
247 if (i_stereo)
248 {
249 if (gr_info_r->scalefac_compress & 1)
250 {
251 io = 0; /* 2^(-1/4) */
252 }
253 else
254 {
255 io = 1; /* 2^(-1/8) */
256 }
257
258 sfreq = info->version_x + (info->version_x << 1);
259 sfreq += info->sampling_frequency;
260
261 if (gr_info_l->window_switching_flag && (gr_info_l->block_type == 2))
262 {
263 if (gr_info_l->mixed_block_flag)
264 {
265 /*
266 * mixed blocks processing
267 */
268 i = 31;
269 ss = 17;
270 sb = -1;
271
272 while (i >= 0)
273 {
274 if (xl[(i*FILTERBANK_BANDS) + ss])
275 {
276 sb = (i << 4) + (i << 1) + ss;
277 i = -1;
278 }
279 else
280 {
281 ss--;
282 if (ss < 0)
283 {
284 i--;
285 ss = 17;
286 }
287 }
288 } /* now sb is the number of highest line with value != 0 */
289 /* can be between -1 (all lines zero) and 575 (no line zero) */
290
291 if (sb < 36) /* was (sb <= 36) */
292 {
293 /*
294 * mixed blocks processing: intensity bound inside long blocks
295 */
296 /* 1. long blocks up to intensity border: Stereo or M/S */
297 if (mp3_sfBandIndex[sfreq].l[4] <= sb)
298 {
299 i = 4;
300 }
301 else
302 {
303 i = 0;
304 }
305
306 while (mp3_sfBandIndex[sfreq].l[i] <= sb)
307 {
308 i++;
309 }
310 sfbTemp = i; /* from that (long) sfb on we have intensity stereo */
311
312 sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp]; /* number of lines to process */
313
314 /* from sfbStart up sfbNo lines do ms_stereo or normal stereo */
315 if (ms_stereo)
316 {
317 pvmp3_st_mid_side(xr, xl, 0, sfbNo);
318 }
319
320 /* 2. long blocks from intensity border up to sfb band 6: intensity */
321 /* calc. MPEG_1_2_Factor[0], MPEG_1_2_Factor[1] */
322
323 for (sfb = sfbTemp; sfb < 6; sfb++)
324 {
325 sfbStart = mp3_sfBandIndex[sfreq].l[sfb]; /* = Start in 0 ... 575 */
326 sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* No of lines to process */
327
328 if ((uint32)(scalefac_R->l[sfb]) != scalefac_IIP_buffer[sfb])
329 {
330 pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->l[sfb], sfbStart, sfbNo);
331 }
332 else if (ms_stereo)
333 {
334 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
335 }
336 }
337
338 /* 3. now process all sfb with short blocks (3...12), all in intensity mode */
339
340 for (j = 0; j < 3; j++)
341 {
342 /* first calculate directional factors for intensity stereo,
343 * for all sfb in intensity mode, but only
344 * if they do not have "illegal" position:
345 */
346 /* to do this for all sfb we have to get information for last scale factor band:
347 * here we clearly have more than one sfb in intensity mode,
348 * so copy factors and legal/illegal information from sfb11 to sfb12
349 */
350 (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
351 scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j]; /* legal/illegal in sfb 12 same as in sfb 11 */
352
353 for (sfb = 3; sfb < 13; sfb++)
354 {
355 sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
356 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
357
358 if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
359 {
360 pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
361 }
362 else if (ms_stereo)
363 {
364 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
365 }
366 }
367 } /* for (j = 0; j < 3; j++) */
368 }
369 else /* else then (sb >= 36) */
370 {
371 /*
372 * mixed blocks processing: intensity bound outside long blocks
373 */
374
375 /* 2. short blocks, do for all 3 */
376 /* ------------------------------ */
377 for (j = 0; j < 3; j++)
378 {
379 int32 sfbcnt = -1;
380
381 for (sfb = 12; sfb >= 3; sfb--)
382 {
383 int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
384
385 i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
386
387 while (lines > 0)
388 {
389 if (xl[i])
390 {
391 sfbcnt = sfb;
392 sfb = -10;
393 lines = -10;
394 }
395 lines--;
396 i--;
397 }
398 }
399
400 sfbcnt += 1;
401 if (sfbcnt < 3)
402 {
403 sfbcnt = 3; /* should not be necessary */
404 }
405
406 sfbTemp = sfbcnt; /* from this (short) sfb on we have intensity mode */
407 /* can have values between 3 (all short sfb in intensity) */
408 /* and 13 (no short sfb in intensity mode) */
409
410 /* 3. from sfbTemp to last sfb calculate is_ratio values: */
411 /* first calculate directional factors for intensity stereo, */
412 /* for all sfb in intensity mode, but only */
413 /* if they do not have "illegal" position: */
414
415 /* to do this for all sfb we have to get information for last scale factor band: */
416 /* get factors for last scale factor band: */
417 /* more than one sfb in intensity mode,
418 copy factors and legal/illegal information from sfb11 to sfb12 */
419 if (sfbTemp < 12)
420 {
421 (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
422 scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j]; /* legal/illegal in sfb 12 same as in sfb 11 */
423 }
424 else if (sfbTemp == sfb)
425 /* only sfb 12 in intensity mode, use factors corresponding to is_pos[12] == 0 */
426 {
427 (scalefac_R->s[j][12]) = 0;
428 scalefac_IIP_buffer[36 + j] = 1; /* the scf value 0 in sfb12 is "legal" */
429 }
430 /* if sfbTemp > sfb (no sfb in intensity mode): do nothing */
431
432
433 /* 4. do normal stereo or MS stereo from sfb 3 to < sfbTemp: */
434 for (sfb = 3; sfb < sfbTemp; sfb++)
435 {
436 sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
437 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
438
439 if (ms_stereo)
440 {
441 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
442 }
443 }
444
445 /* 5. now intensity stereo processing of the remaining sfb's: */
446
447 for (sfb = sfbTemp; sfb < 13; sfb++)
448 {
449 sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
450 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
451 if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
452 {
453 pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
454 }
455 else if (ms_stereo)
456 {
457 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
458 }
459 }
460 /* end of correction by efs 2003-07-04 */
461 } /* for (j = 0; j < 3; j++) */
462
463
464 /* long blocks 0 up to sfb band 6: no intensity */
465
466 sfbNo = mp3_sfBandIndex[sfreq].l[6]; /* number of lines to process */
467 if (ms_stereo)
468 {
469 pvmp3_st_mid_side(xr, xl, 0, sfbNo);
470 }
471
472 } /* if intensity bound inside or outside long blocks */
473 } /* if (gr_info->mixed_block_flag) */
474 else
475 {
476 /*
477 * short block processing
478 */
479 for (j = 0; j < 3; j++)
480 {
481 int32 sfbcnt = -1;
482
483 for (sfb = 12; sfb >= 0; sfb--)
484 {
485 int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
486 i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
487
488 while (lines > 0)
489 {
490 if (xl[i])
491 {
492 sfbcnt = sfb;
493 sfb = -10;
494 lines = -10;
495 }
496 lines--;
497 i--;
498 }
499 }
500
501 sfbcnt += 1;
502
503 /* start of corrected version by efs 2003-07-04 */
504 sfbTemp = sfbcnt; /* from this (short) sfb on we have intensity mode */
505 /* can have values between 3 (all short sfb in intensity) */
506 /* and 13 (no short sfb in intensity mode) */
507
508 /* first calculate directional factors for intensity stereo,
509 for all sfb in intensity mode, but only
510 if they do not have "illegal" position: */
511
512 /* to do this for all sfb we have to get information for last scale factor band: */
513 /* get factors for last scale factor band: */
514 /* more than one sfb in intensity mode,
515 copy factors and legal/illegal information from sfb11 to sfb12 */
516 if (sfbTemp < 12)
517 {
518 (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
519 scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j]; /* legal/illegal in sfb 12 same as in sfb 11 */
520 }
521 else if (sfbTemp == 12)
522 /* only sfb 12 in intensity mode, use factors corresponding to is_pos[12] == 0 */
523 {
524 (scalefac_R->s[j][12]) = 0;
525 scalefac_IIP_buffer[36 + j] = 1; /* the scf value 0 in sfb12 is "legal" */
526 }
527 /* if sfbTemp > sfb (no sfb in intensity mode): do nothing */
528
529
530 /* Now process audio samples */
531 /* first process lower sfb's not in intensity mode */
532 for (sfb = 0; sfb < sfbTemp; sfb++)
533 {
534 sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
535 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
536
537 if (ms_stereo)
538 {
539 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
540 }
541 }
542
543 /* now intensity stereo processing of the remaining sfb's: */
544 for (sfb = sfbTemp; sfb < 13; sfb++)
545 {
546 sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
547 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
548
549 if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
550 {
551 pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
552 }
553 else if (ms_stereo)
554 {
555 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
556 }
557 }
558
559 } /* for (j = 0; j < 3; j++) */
560
561 } /* end of else ( gr_info->mixed_block_flag) */
562
563 } /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
564 else
565 {
566 /*
567 * long block processing
568 */
569 i = 31;
570 ss = 17;
571 sb = 0;
572
573 while (i >= 0)
574 {
575 if (xl[(i*FILTERBANK_BANDS) + ss])
576 {
577 sb = (i << 4) + (i << 1) + ss;
578 /* i = -1 patched RF 24-09-2002 */
579 i = -2;
580 }
581 else
582 {
583 ss--;
584 if (ss < 0)
585 {
586 i--;
587 ss = 17;
588 }
589 }
590 }
591
592 /* patched RF 24-09-2002 */
593 if (sb)
594 {
595 if (mp3_sfBandIndex[sfreq].l[14] <= sb)
596 {
597 i = 14;
598 }
599 else if (mp3_sfBandIndex[sfreq].l[7] <= sb)
600 {
601 i = 7;
602 }
603 else
604 {
605 i = 0;
606 }
607
608 while (mp3_sfBandIndex[sfreq].l[i] <= sb)
609 {
610 i++;
611 }
612 }
613
614 else
615 {
616 if (i == -1)
617 {
618 /* all xr[1][][] are 0: set IS bound sfb to 0 */
619 i = 0;
620 }
621 else
622 {
623 /* xr[1][0][0] is unequal 0 and all others are 0: set IS bound sfb to 1 */
624 i = 1;
625 }
626 }
627 /* corrected version by efs 2003-07-04 */
628 sfbTemp = i; /* from this (long) sfb on we have intensity mode */
629 /* can have values between 0 (all long sfb in intensity) */
630 /* and 22 (no long sfb in intensity mode) */
631
632 /* first calculate directional factors for intensity stereo,
633 for all sfb in intensity mode, but only if they
634 do not have "illegal" position: */
635
636 /* to do this for all sfb we have to get information for last scale factor band: */
637 if (sfbTemp < 21)
638 /* more than one sfb in intensity mode, */
639 /* copy factors and legal/illegal information from sfb20 to sfb21 */
640 {
641 (scalefac_R->l[21]) = (scalefac_R->l[20]);
642 scalefac_IIP_buffer[21] = scalefac_IIP_buffer[20]; /* legal/illegal in sfb 21 same as in sfb 20 */
643 }
644 else if (sfbTemp == 21)
645 /* only sfb 21 in intensity mode, is_pos[21] = 0 */
646 {
647 (scalefac_R->l[21]) = 0;
648 scalefac_IIP_buffer[21] = 1; /* the scf value 0 in sfb21 is "legal" */
649 }
650 /* if sfbTemp > 21 (no sfb in intensity mode): do nothing */
651
652
653 /* Now process audio samples */
654 /* first process lower sfb's not in intensity mode */
655
656 sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp] - mp3_sfBandIndex[sfreq].l[0];
657 sfbStart = mp3_sfBandIndex[sfreq].l[0];
658
659 if (ms_stereo)
660 {
661 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
662 }
663
664 /* now intensity stereo processing of the remaining sfb's: */
665 for (sfb = sfbTemp; sfb < 22; sfb++)
666 {
667 sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* number of lines to process */
668 sfbStart = mp3_sfBandIndex[sfreq].l[sfb]; /* start of sfb */
669
670 if ((uint32)(scalefac_R->l[sfb]) != scalefac_IIP_buffer[sfb]) /* "legal" position ? */
671 {
672 pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->l[sfb], sfbStart, sfbNo);
673 }
674 else if (ms_stereo)
675 {
676 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
677 }
678
679 } /* for (sfb = sfbTemp; sfb < 22; sfb++) */
680
681 } /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
682
683 } /* if (i_stereo) */
684 else
685 {
686 /*
687 * normal or ms stereo processing
688 */
689 if (ms_stereo)
690 {
691 pvmp3_st_mid_side(xr, xl, 0, used_freq_lines);
692 }
693
694 } /* if (i_stereo) */
695
696 }
697
698
699
700
701