static int mp3_header_decompress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,

                     uint8_t **poutbuf, int *poutbuf_size,

                     const uint8_t *buf, int buf_size, int keyframe){

    uint32_t header;

    int sample_rate= avctx->sample_rate;

    int sample_rate_index=0;

    int lsf, mpeg25, bitrate_index, frame_size;



    header = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];

    if(ff_mpa_check_header(header) >= 0){

        *poutbuf= (uint8_t *) buf;

        *poutbuf_size= buf_size;



        return 0;

    }



    header= 0xFFE00000 | ((4-3)<<17) | (1<<16); //FIXME simplify



    lsf     = sample_rate < (24000+32000)/2;

    mpeg25  = sample_rate < (12000+16000)/2;

    header |= (!mpeg25)<<20;

    header |= (!lsf   )<<19;

    if(sample_rate<<(lsf+mpeg25) < (44100+32000)/2)

        sample_rate_index |= 2;

    else if(sample_rate<<(lsf+mpeg25) > (44100+48000)/2)

        sample_rate_index |= 1;



    header |= sample_rate_index<<10;

    sample_rate= mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25); //in case sample rate is a little off



    for(bitrate_index=2; bitrate_index<30; bitrate_index++){

        frame_size = mpa_bitrate_tab[lsf][2][bitrate_index>>1];

        frame_size = (frame_size * 144000) / (sample_rate << lsf) + (bitrate_index&1);

        if(frame_size == buf_size + 4)

            break;

    }

    if(bitrate_index == 30){

        av_log(avctx, AV_LOG_ERROR, "couldnt find bitrate_index\n");

        return -1;

    }



    header |= (bitrate_index&1)<<9;

    header |= (bitrate_index>>1)<<12;

    header |= (avctx->channels==1 ? MPA_MONO : MPA_JSTEREO)<<6;



    *poutbuf_size= buf_size + 4;

    *poutbuf= av_malloc(buf_size + 4 + FF_INPUT_BUFFER_PADDING_SIZE);

    memcpy(*poutbuf + 4, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);



    if(avctx->channels==2){

        if(lsf){

            FFSWAP(int, (*poutbuf)[5], (*poutbuf)[6]);

            header |= ((*poutbuf)[5] & 0xC0)>>2;

        }else{

            header |= (*poutbuf)[5] & 0x30;

        }

    }



    (*poutbuf)[0]= header>>24;

    (*poutbuf)[1]= header>>16;

    (*poutbuf)[2]= header>> 8;

    (*poutbuf)[3]= header    ;



    return 1;

}

static int mp3_header_decompress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,

                     uint8_t **poutbuf, int *poutbuf_size,

                     const uint8_t *buf, int buf_size, int keyframe){

    uint32_t header;

    int sample_rate= avctx->sample_rate;

    int sample_rate_index=0;

    int lsf, mpeg25, bitrate_index, frame_size;



    header = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];

    if(ff_mpa_check_header(header) >= 0){

        *poutbuf= (uint8_t *) buf;

        *poutbuf_size= buf_size;



        return 0;

    }



    header= 0xFFE00000 | ((4-3)<<17) | (1<<16); 



    lsf     = sample_rate < (24000+32000)/2;

    mpeg25  = sample_rate < (12000+16000)/2;

    header |= (!mpeg25)<<20;

    header |= (!lsf   )<<19;

    if(sample_rate<<(lsf+mpeg25) < (44100+32000)/2)

        sample_rate_index |= 2;

    else if(sample_rate<<(lsf+mpeg25) > (44100+48000)/2)

        sample_rate_index |= 1;



    header |= sample_rate_index<<10;

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



    for(bitrate_index=2; bitrate_index<30; bitrate_index++){

        frame_size = mpa_bitrate_tab[lsf][2][bitrate_index>>1];

        frame_size = (frame_size * 144000) / (sample_rate << lsf) + (bitrate_index&1);

        if(frame_size == buf_size + 4)

            break;

    }

    if(bitrate_index == 30){

        av_log(avctx, AV_LOG_ERROR, "couldnt find bitrate_index\n");

        return -1;

    }



    header |= (bitrate_index&1)<<9;

    header |= (bitrate_index>>1)<<12;

    header |= (avctx->channels==1 ? MPA_MONO : MPA_JSTEREO)<<6;



    *poutbuf_size= buf_size + 4;

    *poutbuf= av_malloc(buf_size + 4 + FF_INPUT_BUFFER_PADDING_SIZE);

    memcpy(*poutbuf + 4, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);



    if(avctx->channels==2){

        if(lsf){

            FFSWAP(int, (*poutbuf)[5], (*poutbuf)[6]);

            header |= ((*poutbuf)[5] & 0xC0)>>2;

        }else{

            header |= (*poutbuf)[5] & 0x30;

        }

    }



    (*poutbuf)[0]= header>>24;

    (*poutbuf)[1]= header>>16;

    (*poutbuf)[2]= header>> 8;

    (*poutbuf)[3]= header    ;



    return 1;

}

static int FUNC_0(AVBitStreamFilterContext *VAR_0, AVCodecContext *VAR_1, const char *VAR_2,

                     uint8_t **VAR_3, int *VAR_4,

                     const uint8_t *VAR_5, int VAR_6, int VAR_7){

    uint32_t header;

    int VAR_8= VAR_1->VAR_8;

    int VAR_9=0;

    int VAR_10, VAR_11, VAR_12, VAR_13;



    header = (VAR_5[0] << 24) | (VAR_5[1] << 16) | (VAR_5[2] << 8) | VAR_5[3];

    if(ff_mpa_check_header(header) >= 0){

        *VAR_3= (uint8_t *) VAR_5;

        *VAR_4= VAR_6;



        return 0;

    }



    header= 0xFFE00000 | ((4-3)<<17) | (1<<16); 



    VAR_10     = VAR_8 < (24000+32000)/2;

    VAR_11  = VAR_8 < (12000+16000)/2;

    header |= (!VAR_11)<<20;

    header |= (!VAR_10   )<<19;

    if(VAR_8<<(VAR_10+VAR_11) < (44100+32000)/2)

        VAR_9 |= 2;

    else if(VAR_8<<(VAR_10+VAR_11) > (44100+48000)/2)

        VAR_9 |= 1;



    header |= VAR_9<<10;

    VAR_8= mpa_freq_tab[VAR_9] >> (VAR_10 + VAR_11); 



    for(VAR_12=2; VAR_12<30; VAR_12++){

        VAR_13 = mpa_bitrate_tab[VAR_10][2][VAR_12>>1];

        VAR_13 = (VAR_13 * 144000) / (VAR_8 << VAR_10) + (VAR_12&1);

        if(VAR_13 == VAR_6 + 4)

            break;

    }

    if(VAR_12 == 30){

        av_log(VAR_1, AV_LOG_ERROR, "couldnt find VAR_12\n");

        return -1;

    }



    header |= (VAR_12&1)<<9;

    header |= (VAR_12>>1)<<12;

    header |= (VAR_1->channels==1 ? MPA_MONO : MPA_JSTEREO)<<6;



    *VAR_4= VAR_6 + 4;

    *VAR_3= av_malloc(VAR_6 + 4 + FF_INPUT_BUFFER_PADDING_SIZE);

    memcpy(*VAR_3 + 4, VAR_5, VAR_6 + FF_INPUT_BUFFER_PADDING_SIZE);



    if(VAR_1->channels==2){

        if(VAR_10){

            FFSWAP(int, (*VAR_3)[5], (*VAR_3)[6]);

            header |= ((*VAR_3)[5] & 0xC0)>>2;

        }else{

            header |= (*VAR_3)[5] & 0x30;

        }

    }



    (*VAR_3)[0]= header>>24;

    (*VAR_3)[1]= header>>16;

    (*VAR_3)[2]= header>> 8;

    (*VAR_3)[3]= header    ;



    return 1;

}

static int FUNC_0(AVBitStreamFilterContext *VAR_0, AVCodecContext *VAR_1, const char *VAR_2,
uint8_t **VAR_3, int *VAR_4,
const uint8_t *VAR_5, int VAR_6, int VAR_7){ uint32_t header; int VAR_8= VAR_1->VAR_8; int VAR_9=0; int VAR_10, VAR_11, VAR_12, VAR_13; header = (VAR_5[0] << 24) | (VAR_5[1] << 16) | (VAR_5[2] << 8) | VAR_5[3]; if(ff_mpa_check_header(header) >= 0){ *VAR_3= (uint8_t *) VAR_5; *VAR_4= VAR_6; return 0; } header= 0xFFE00000 | ((4-3)<<17) | (1<<16); VAR_10     = VAR_8 < (24000+32000)/2; VAR_11  = VAR_8 < (12000+16000)/2; header |= (!VAR_11)<<20; header |= (!VAR_10   )<<19; if(VAR_8<<(VAR_10+VAR_11) < (44100+32000)/2)
VAR_9 |= 2; else if(VAR_8<<(VAR_10+VAR_11) > (44100+48000)/2)
VAR_9 |= 1; header |= VAR_9<<10; VAR_8= mpa_freq_tab[VAR_9] >> (VAR_10 + VAR_11); for(VAR_12=2; VAR_12<30; VAR_12++){ VAR_13 = mpa_bitrate_tab[VAR_10][2][VAR_12>>1]; VAR_13 = (VAR_13 * 144000) / (VAR_8 << VAR_10) + (VAR_12&1); if(VAR_13 == VAR_6 + 4)
break; } if(VAR_12 == 30){ av_log(VAR_1, AV_LOG_ERROR, "couldnt find VAR_12\n"); return -1; } header |= (VAR_12&1)<<9; header |= (VAR_12>>1)<<12; header |= (VAR_1->channels==1 ? MPA_MONO : MPA_JSTEREO)<<6; *VAR_4= VAR_6 + 4; *VAR_3= av_malloc(VAR_6 + 4 + FF_INPUT_BUFFER_PADDING_SIZE); memcpy(*VAR_3 + 4, VAR_5, VAR_6 + FF_INPUT_BUFFER_PADDING_SIZE); if(VAR_1->channels==2){ if(VAR_10){ FFSWAP(int, (*VAR_3)[5], (*VAR_3)[6]); header |= ((*VAR_3)[5] & 0xC0)>>2; }else{ header |= (*VAR_3)[5] & 0x30; } } (*VAR_3)[0]= header>>24; (*VAR_3)[1]= header>>16; (*VAR_3)[2]= header>> 8; (*VAR_3)[3]= header    ; return 1; }