• 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 
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