static int decode_header(MPADecodeContext *s, UINT32 header)

{

    int sample_rate, frame_size, mpeg25, padding;

    int sample_rate_index, bitrate_index;

    if (header & (1<<20)) {

        s->lsf = (header & (1<<19)) ? 0 : 1;

        mpeg25 = 0;

    } else {

        s->lsf = 1;

        mpeg25 = 1;

    }

    

    s->layer = 4 - ((header >> 17) & 3);

    /* extract frequency */

    sample_rate_index = (header >> 10) & 3;

    sample_rate = mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);

    if (sample_rate == 0)

        return 1;

    sample_rate_index += 3 * (s->lsf + mpeg25);

    s->sample_rate_index = sample_rate_index;

    s->error_protection = ((header >> 16) & 1) ^ 1;



    bitrate_index = (header >> 12) & 0xf;

    padding = (header >> 9) & 1;

    //extension = (header >> 8) & 1;

    s->mode = (header >> 6) & 3;

    s->mode_ext = (header >> 4) & 3;

    //copyright = (header >> 3) & 1;

    //original = (header >> 2) & 1;

    //emphasis = header & 3;



    if (s->mode == MPA_MONO)

        s->nb_channels = 1;

    else

        s->nb_channels = 2;

    

    if (bitrate_index != 0) {

        frame_size = mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];

        s->bit_rate = frame_size * 1000;

        switch(s->layer) {

        case 1:

            frame_size = (frame_size * 12000) / sample_rate;

            frame_size = (frame_size + padding) * 4;

            break;

        case 2:

            frame_size = (frame_size * 144000) / sample_rate;

            frame_size += padding;

            break;

        default:

        case 3:

            frame_size = (frame_size * 144000) / (sample_rate << s->lsf);

            frame_size += padding;

            break;

        }

        s->frame_size = frame_size;

    } else {

        /* if no frame size computed, signal it */

        if (!s->free_format_frame_size)

            return 1;

        /* free format: compute bitrate and real frame size from the

           frame size we extracted by reading the bitstream */

        s->frame_size = s->free_format_frame_size;

        switch(s->layer) {

        case 1:

            s->frame_size += padding  * 4;

            s->bit_rate = (s->frame_size * sample_rate) / 48000;

            break;

        case 2:

            s->frame_size += padding;

            s->bit_rate = (s->frame_size * sample_rate) / 144000;

            break;

        default:

        case 3:

            s->frame_size += padding;

            s->bit_rate = (s->frame_size * (sample_rate << s->lsf)) / 144000;

            break;

        }

    }

    s->sample_rate = sample_rate;

    

#ifdef DEBUG

    printf("layer%d, %d Hz, %d kbits/s, ",

           s->layer, s->sample_rate, s->bit_rate);

    if (s->nb_channels == 2) {

        if (s->layer == 3) {

            if (s->mode_ext & MODE_EXT_MS_STEREO)

                printf("ms-");

            if (s->mode_ext & MODE_EXT_I_STEREO)

                printf("i-");

        }

        printf("stereo");

    } else {

        printf("mono");

    }

    printf("\n");

#endif

    return 0;

}

static int decode_header(MPADecodeContext *s, UINT32 header)

{

    int sample_rate, frame_size, mpeg25, padding;

    int sample_rate_index, bitrate_index;

    if (header & (1<<20)) {

        s->lsf = (header & (1<<19)) ? 0 : 1;

        mpeg25 = 0;

    } else {

        s->lsf = 1;

        mpeg25 = 1;

    }

    

    s->layer = 4 - ((header >> 17) & 3);

    

    sample_rate_index = (header >> 10) & 3;

    sample_rate = mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);

    if (sample_rate == 0)

        return 1;

    sample_rate_index += 3 * (s->lsf + mpeg25);

    s->sample_rate_index = sample_rate_index;

    s->error_protection = ((header >> 16) & 1) ^ 1;



    bitrate_index = (header >> 12) & 0xf;

    padding = (header >> 9) & 1;

    

    s->mode = (header >> 6) & 3;

    s->mode_ext = (header >> 4) & 3;

    

    

    



    if (s->mode == MPA_MONO)

        s->nb_channels = 1;

    else

        s->nb_channels = 2;

    

    if (bitrate_index != 0) {

        frame_size = mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];

        s->bit_rate = frame_size * 1000;

        switch(s->layer) {

        case 1:

            frame_size = (frame_size * 12000) / sample_rate;

            frame_size = (frame_size + padding) * 4;

            break;

        case 2:

            frame_size = (frame_size * 144000) / sample_rate;

            frame_size += padding;

            break;

        default:

        case 3:

            frame_size = (frame_size * 144000) / (sample_rate << s->lsf);

            frame_size += padding;

            break;

        }

        s->frame_size = frame_size;

    } else {

        

        if (!s->free_format_frame_size)

            return 1;

        



        s->frame_size = s->free_format_frame_size;

        switch(s->layer) {

        case 1:

            s->frame_size += padding  * 4;

            s->bit_rate = (s->frame_size * sample_rate) / 48000;

            break;

        case 2:

            s->frame_size += padding;

            s->bit_rate = (s->frame_size * sample_rate) / 144000;

            break;

        default:

        case 3:

            s->frame_size += padding;

            s->bit_rate = (s->frame_size * (sample_rate << s->lsf)) / 144000;

            break;

        }

    }

    s->sample_rate = sample_rate;

    

#ifdef DEBUG

    printf("layer%d, %d Hz, %d kbits/s, ",

           s->layer, s->sample_rate, s->bit_rate);

    if (s->nb_channels == 2) {

        if (s->layer == 3) {

            if (s->mode_ext & MODE_EXT_MS_STEREO)

                printf("ms-");

            if (s->mode_ext & MODE_EXT_I_STEREO)

                printf("i-");

        }

        printf("stereo");

    } else {

        printf("mono");

    }

    printf("\n");

#endif

    return 0;

}

static int FUNC_0(MPADecodeContext *VAR_0, UINT32 VAR_1)

{

    int VAR_2, VAR_3, VAR_4, VAR_5;

    int VAR_6, VAR_7;

    if (VAR_1 & (1<<20)) {

        VAR_0->lsf = (VAR_1 & (1<<19)) ? 0 : 1;

        VAR_4 = 0;

    } else {

        VAR_0->lsf = 1;

        VAR_4 = 1;

    }

    

    VAR_0->layer = 4 - ((VAR_1 >> 17) & 3);

    

    VAR_6 = (VAR_1 >> 10) & 3;

    VAR_2 = mpa_freq_tab[VAR_6] >> (VAR_0->lsf + VAR_4);

    if (VAR_2 == 0)

        return 1;

    VAR_6 += 3 * (VAR_0->lsf + VAR_4);

    VAR_0->VAR_6 = VAR_6;

    VAR_0->error_protection = ((VAR_1 >> 16) & 1) ^ 1;



    VAR_7 = (VAR_1 >> 12) & 0xf;

    VAR_5 = (VAR_1 >> 9) & 1;

    

    VAR_0->mode = (VAR_1 >> 6) & 3;

    VAR_0->mode_ext = (VAR_1 >> 4) & 3;

    

    

    



    if (VAR_0->mode == MPA_MONO)

        VAR_0->nb_channels = 1;

    else

        VAR_0->nb_channels = 2;

    

    if (VAR_7 != 0) {

        VAR_3 = mpa_bitrate_tab[VAR_0->lsf][VAR_0->layer - 1][VAR_7];

        VAR_0->bit_rate = VAR_3 * 1000;

        switch(VAR_0->layer) {

        case 1:

            VAR_3 = (VAR_3 * 12000) / VAR_2;

            VAR_3 = (VAR_3 + VAR_5) * 4;

            break;

        case 2:

            VAR_3 = (VAR_3 * 144000) / VAR_2;

            VAR_3 += VAR_5;

            break;

        default:

        case 3:

            VAR_3 = (VAR_3 * 144000) / (VAR_2 << VAR_0->lsf);

            VAR_3 += VAR_5;

            break;

        }

        VAR_0->VAR_3 = VAR_3;

    } else {

        

        if (!VAR_0->free_format_frame_size)

            return 1;

        



        VAR_0->VAR_3 = VAR_0->free_format_frame_size;

        switch(VAR_0->layer) {

        case 1:

            VAR_0->VAR_3 += VAR_5  * 4;

            VAR_0->bit_rate = (VAR_0->VAR_3 * VAR_2) / 48000;

            break;

        case 2:

            VAR_0->VAR_3 += VAR_5;

            VAR_0->bit_rate = (VAR_0->VAR_3 * VAR_2) / 144000;

            break;

        default:

        case 3:

            VAR_0->VAR_3 += VAR_5;

            VAR_0->bit_rate = (VAR_0->VAR_3 * (VAR_2 << VAR_0->lsf)) / 144000;

            break;

        }

    }

    VAR_0->VAR_2 = VAR_2;

    

#ifdef DEBUG

    printf("layer%d, %d Hz, %d kbits/VAR_0, ",

           VAR_0->layer, VAR_0->VAR_2, VAR_0->bit_rate);

    if (VAR_0->nb_channels == 2) {

        if (VAR_0->layer == 3) {

            if (VAR_0->mode_ext & MODE_EXT_MS_STEREO)

                printf("ms-");

            if (VAR_0->mode_ext & MODE_EXT_I_STEREO)

                printf("i-");

        }

        printf("stereo");

    } else {

        printf("mono");

    }

    printf("\n");

#endif

    return 0;

}

static int FUNC_0(MPADecodeContext *VAR_0, UINT32 VAR_1)
{ int VAR_2, VAR_3, VAR_4, VAR_5; int VAR_6, VAR_7; if (VAR_1 & (1<<20)) { VAR_0->lsf = (VAR_1 & (1<<19)) ? 0 : 1; VAR_4 = 0; } else { VAR_0->lsf = 1; VAR_4 = 1; } VAR_0->layer = 4 - ((VAR_1 >> 17) & 3); VAR_6 = (VAR_1 >> 10) & 3; VAR_2 = mpa_freq_tab[VAR_6] >> (VAR_0->lsf + VAR_4); if (VAR_2 == 0)
return 1; VAR_6 += 3 * (VAR_0->lsf + VAR_4); VAR_0->VAR_6 = VAR_6; VAR_0->error_protection = ((VAR_1 >> 16) & 1) ^ 1; VAR_7 = (VAR_1 >> 12) & 0xf; VAR_5 = (VAR_1 >> 9) & 1; VAR_0->mode = (VAR_1 >> 6) & 3; VAR_0->mode_ext = (VAR_1 >> 4) & 3; if (VAR_0->mode == MPA_MONO)
VAR_0->nb_channels = 1; else
VAR_0->nb_channels = 2; if (VAR_7 != 0) { VAR_3 = mpa_bitrate_tab[VAR_0->lsf][VAR_0->layer - 1][VAR_7]; VAR_0->bit_rate = VAR_3 * 1000; switch(VAR_0->layer) { case 1:
VAR_3 = (VAR_3 * 12000) / VAR_2; VAR_3 = (VAR_3 + VAR_5) * 4; break; case 2:
VAR_3 = (VAR_3 * 144000) / VAR_2; VAR_3 += VAR_5; break; default:
case 3:
VAR_3 = (VAR_3 * 144000) / (VAR_2 << VAR_0->lsf); VAR_3 += VAR_5; break; } VAR_0->VAR_3 = VAR_3; } else { if (!VAR_0->free_format_frame_size)
return 1; VAR_0->VAR_3 = VAR_0->free_format_frame_size; switch(VAR_0->layer) { case 1:
VAR_0->VAR_3 += VAR_5  * 4; VAR_0->bit_rate = (VAR_0->VAR_3 * VAR_2) / 48000; break; case 2:
VAR_0->VAR_3 += VAR_5; VAR_0->bit_rate = (VAR_0->VAR_3 * VAR_2) / 144000; break; default:
case 3:
VAR_0->VAR_3 += VAR_5; VAR_0->bit_rate = (VAR_0->VAR_3 * (VAR_2 << VAR_0->lsf)) / 144000; break; } } VAR_0->VAR_2 = VAR_2; #ifdef DEBUG
printf("layer%d, %d Hz, %d kbits/VAR_0, ",
VAR_0->layer, VAR_0->VAR_2, VAR_0->bit_rate); if (VAR_0->nb_channels == 2) { if (VAR_0->layer == 3) { if (VAR_0->mode_ext & MODE_EXT_MS_STEREO)
printf("ms-"); if (VAR_0->mode_ext & MODE_EXT_I_STEREO)
printf("i-"); } printf("stereo"); } else { printf("mono"); } printf("\n"); #endif
return 0; }