void pvmp3_mpeg2_get_scale_factors(mp3ScaleFactors *scalefac,
                                   mp3SideInfo     *si,
                                   int32           gr,
                                   int32           ch,
                                   mp3Header       *info,
                                   uint32          *scalefac_IIP_buffer,
                                   tmp3Bits        *pMainData)
{

    int32 sfb;
    int32 k = 0;
    int32 window;
    uint32 *scalefac_buffer     = &scalefac_IIP_buffer[56];

    granuleInfo *gr_info = &(si->ch[ch].gran[gr]);

    pvmp3_mpeg2_get_scale_data(si,
                               gr,
                               ch,
                               info,
                               (uint32 *)scalefac_buffer,
                               (uint32 *)scalefac_IIP_buffer,
                               pMainData);


    if (gr_info->window_switching_flag && (gr_info->block_type == 2))
    {
        if (gr_info->mixed_block_flag)
        {
            for (sfb = 0; sfb < 6; sfb++)
            {
                scalefac->l[sfb] = scalefac_buffer[sfb];
            }


            k = 6;
            for (sfb = 3; sfb < 12; sfb++)
            {
                for (window = 0; window < 3; window++)
                {
                    scalefac->s[window][sfb] = scalefac_buffer[k];
                    k++;
                }
            }


            /* adjust position of "illegal position" information in scalefac_IIP_buffer[] */
            /* in mixed blocks mode for short sfb, move them 3 places up. efs 3002-07-04  */
            for (sfb = 11; sfb >= 3; sfb--)
            {
                scalefac_IIP_buffer[3*sfb + 2] = scalefac_IIP_buffer[3*sfb - 1];
                scalefac_IIP_buffer[3*sfb + 1] = scalefac_IIP_buffer[3*sfb - 2];
                scalefac_IIP_buffer[3*sfb    ] = scalefac_IIP_buffer[3*sfb - 3];

            }
        }
        else
        {  /* SHORT*/
            for (sfb = 0; sfb < 12; sfb++)
            {
                for (window = 0; window < 3; window++)
                {
                    scalefac->s[window][sfb] = scalefac_buffer[k];
                    k++;
                }
            }
        }

        scalefac->s[0][12] = 0;
        scalefac->s[1][12] = 0;
        scalefac->s[2][12] = 0;

    }
    else
    {   /* LONG types 0,1,3 */
        for (sfb = 0; sfb < 21; sfb++)
        {
            scalefac->l[sfb] = scalefac_buffer[sfb];
        }
        scalefac->l[21] = 0;
        scalefac->l[22] = 0;

    }
}
//====================================================================================================
//函数功能:获得"scale factor"
//函数参数:"si"表示旁信息,"gr"表示granule,"ch"表示声道,"info"表示头信息,"pMainData"表示输入流,
//		  "scalefac_IIP_buffer"表示辅助数组,均为输入参数
//		  "scalefac"表示量化因子,为输出参数
//====================================================================================================
void pvmp3_mpeg2_get_scale_factors(mp3ScaleFactors *scalefac,
                                   mp3SideInfo     *si,
                                   int32           gr,
                                   int32           ch,
                                   mp3Header       *info,
                                   uint32          *scalefac_IIP_buffer,
                                   tmp3Bits        *pMainData)
{
	//定义变量
    int32 sfb;
    int32 k = 0;
    int32 window;
    uint32 *scalefac_buffer     = &scalefac_IIP_buffer[56];

    granuleInfo *gr_info = &(si->ch[ch].gran[gr]);

	//获得"scalefac_buffer"和"scalefac_IIP_buffer"信息
    pvmp3_mpeg2_get_scale_data(si,
                               gr,
                               ch,
                               info,
                               (uint32 *)scalefac_buffer,
                               (uint32 *)scalefac_IIP_buffer,
                               pMainData);

	//若"window_switching_flag"为1并且"block_type"为2
    if (gr_info->window_switching_flag && (gr_info->block_type == 2))
    {
    	//若"mixed_block_flag"为1,即为混合型
        if (gr_info->mixed_block_flag)
        {
        	//对"l[sfb]"赋值,其中"sfb"属于0-5
            for (sfb = 0; sfb < 6; sfb++)
            {
                scalefac->l[sfb] = scalefac_buffer[sfb];
            }

			//对"s[window][sfb]"赋值,其中"window"属于0-2,"sfb"属于3-11
            k = 6;
            for (sfb = 3; sfb < 12; sfb++)
            {
                for (window = 0; window < 3; window++)
                {
                    scalefac->s[window][sfb] = scalefac_buffer[k];
                    k++;
                }
            }

			//调整非法位置
            /* adjust position of "illegal position" information in scalefac_IIP_buffer[] */
            /* in mixed blocks mode for short sfb, move them 3 places up. efs 3002-07-04  */
            for (sfb = 11; sfb >= 3; sfb--)
            {
                scalefac_IIP_buffer[3*sfb + 2] = scalefac_IIP_buffer[3*sfb - 1];
                scalefac_IIP_buffer[3*sfb + 1] = scalefac_IIP_buffer[3*sfb - 2];
                scalefac_IIP_buffer[3*sfb    ] = scalefac_IIP_buffer[3*sfb - 3];

            }
        }
		//若为短窗框型
        else
        {
        	//对"s[window][sfb]"赋值,其中"window"属于0-2,"sfb"属于0-11
            for (sfb = 0; sfb < 12; sfb++)
            {
                for (window = 0; window < 3; window++)
                {
                    scalefac->s[window][sfb] = scalefac_buffer[k];
                    k++;
                }
            }
        }

		//为"s[window][12]"赋值为0,其中"window"属于0-2
        scalefac->s[0][12] = 0;
        scalefac->s[1][12] = 0;
        scalefac->s[2][12] = 0;

    }
	//若为长窗框型的
    else
    {   
    	//为"l[sfb]"赋值,其中"sfb"属于0-20
    	/* LONG types 0,1,3 */
        for (sfb = 0; sfb < 21; sfb++)
        {
            scalefac->l[sfb] = scalefac_buffer[sfb];
        }
		
		//为"l[21]"和"l[22]"赋值为0
        scalefac->l[21] = 0;
        scalefac->l[22] = 0;

    }
}