static int mpc7_decode_frame(AVCodecContext * avctx, void *data,

                             int *got_frame_ptr, AVPacket *avpkt)

{

    const uint8_t *buf = avpkt->data;

    int buf_size;

    MPCContext *c = avctx->priv_data;

    GetBitContext gb;

    int i, ch;

    int mb = -1;

    Band *bands = c->bands;

    int off, ret, last_frame, skip;

    int bits_used, bits_avail;



    memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));



    buf_size = avpkt->size & ~3;

    if (buf_size <= 0) {

        av_log(avctx, AV_LOG_ERROR, "packet size is too small (%i bytes)\n",

               avpkt->size);

        return AVERROR_INVALIDDATA;

    }

    if (buf_size != avpkt->size) {

        av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "

               "extra bytes at the end will be skipped.\n");

    }



    skip       = buf[0];

    last_frame = buf[1];

    buf       += 4;

    buf_size  -= 4;



    /* get output buffer */

    c->frame.nb_samples = last_frame ? c->lastframelen : MPC_FRAME_SIZE;

    if ((ret = avctx->get_buffer(avctx, &c->frame)) < 0) {

        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");

        return ret;

    }



    av_fast_padded_malloc(&c->bits, &c->buf_size, buf_size);

    if (!c->bits)

        return AVERROR(ENOMEM);

    c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)buf, buf_size >> 2);

    init_get_bits(&gb, c->bits, buf_size * 8);

    skip_bits_long(&gb, skip);



    /* read subband indexes */

    for(i = 0; i <= c->maxbands; i++){

        for(ch = 0; ch < 2; ch++){

            int t = 4;

            if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5;

            if(t == 4) bands[i].res[ch] = get_bits(&gb, 4);

            else bands[i].res[ch] = bands[i-1].res[ch] + t;

        }



        if(bands[i].res[0] || bands[i].res[1]){

            mb = i;

            if(c->MSS) bands[i].msf = get_bits1(&gb);

        }

    }

    /* get scale indexes coding method */

    for(i = 0; i <= mb; i++)

        for(ch = 0; ch < 2; ch++)

            if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);

    /* get scale indexes */

    for(i = 0; i <= mb; i++){

        for(ch = 0; ch < 2; ch++){

            if(bands[i].res[ch]){

                bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i];

                bands[i].scf_idx[ch][0] = get_scale_idx(&gb, bands[i].scf_idx[ch][2]);

                switch(bands[i].scfi[ch]){

                case 0:

                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);

                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);

                    break;

                case 1:

                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);

                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1];

                    break;

                case 2:

                    bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];

                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);

                    break;

                case 3:

                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];

                    break;

                }

                c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2];

            }

        }

    }

    /* get quantizers */

    memset(c->Q, 0, sizeof(c->Q));

    off = 0;

    for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND)

        for(ch = 0; ch < 2; ch++)

            idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);



    ff_mpc_dequantize_and_synth(c, mb, c->frame.data[0], 2);



    bits_used = get_bits_count(&gb);

    bits_avail = buf_size * 8;

    if (!last_frame && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))) {

        av_log(avctx, AV_LOG_ERROR, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);

        return -1;

    }

    if(c->frames_to_skip){

        c->frames_to_skip--;

        *got_frame_ptr = 0;

        return avpkt->size;

    }



    *got_frame_ptr   = 1;

    *(AVFrame *)data = c->frame;



    return avpkt->size;

}

static int mpc7_decode_frame(AVCodecContext * avctx, void *data,

                             int *got_frame_ptr, AVPacket *avpkt)

{

    const uint8_t *buf = avpkt->data;

    int buf_size;

    MPCContext *c = avctx->priv_data;

    GetBitContext gb;

    int i, ch;

    int mb = -1;

    Band *bands = c->bands;

    int off, ret, last_frame, skip;

    int bits_used, bits_avail;



    memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));



    buf_size = avpkt->size & ~3;

    if (buf_size <= 0) {

        av_log(avctx, AV_LOG_ERROR, "packet size is too small (%i bytes)\n",

               avpkt->size);

        return AVERROR_INVALIDDATA;

    }

    if (buf_size != avpkt->size) {

        av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "

               "extra bytes at the end will be skipped.\n");

    }



    skip       = buf[0];

    last_frame = buf[1];

    buf       += 4;

    buf_size  -= 4;



    

    c->frame.nb_samples = last_frame ? c->lastframelen : MPC_FRAME_SIZE;

    if ((ret = avctx->get_buffer(avctx, &c->frame)) < 0) {

        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");

        return ret;

    }



    av_fast_padded_malloc(&c->bits, &c->buf_size, buf_size);

    if (!c->bits)

        return AVERROR(ENOMEM);

    c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)buf, buf_size >> 2);

    init_get_bits(&gb, c->bits, buf_size * 8);

    skip_bits_long(&gb, skip);



    

    for(i = 0; i <= c->maxbands; i++){

        for(ch = 0; ch < 2; ch++){

            int t = 4;

            if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5;

            if(t == 4) bands[i].res[ch] = get_bits(&gb, 4);

            else bands[i].res[ch] = bands[i-1].res[ch] + t;

        }



        if(bands[i].res[0] || bands[i].res[1]){

            mb = i;

            if(c->MSS) bands[i].msf = get_bits1(&gb);

        }

    }

    

    for(i = 0; i <= mb; i++)

        for(ch = 0; ch < 2; ch++)

            if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);

    

    for(i = 0; i <= mb; i++){

        for(ch = 0; ch < 2; ch++){

            if(bands[i].res[ch]){

                bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i];

                bands[i].scf_idx[ch][0] = get_scale_idx(&gb, bands[i].scf_idx[ch][2]);

                switch(bands[i].scfi[ch]){

                case 0:

                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);

                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);

                    break;

                case 1:

                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);

                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1];

                    break;

                case 2:

                    bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];

                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);

                    break;

                case 3:

                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];

                    break;

                }

                c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2];

            }

        }

    }

    

    memset(c->Q, 0, sizeof(c->Q));

    off = 0;

    for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND)

        for(ch = 0; ch < 2; ch++)

            idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);



    ff_mpc_dequantize_and_synth(c, mb, c->frame.data[0], 2);



    bits_used = get_bits_count(&gb);

    bits_avail = buf_size * 8;

    if (!last_frame && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))) {

        av_log(avctx, AV_LOG_ERROR, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);

        return -1;

    }

    if(c->frames_to_skip){

        c->frames_to_skip--;

        *got_frame_ptr = 0;

        return avpkt->size;

    }



    *got_frame_ptr   = 1;

    *(AVFrame *)data = c->frame;



    return avpkt->size;

}

static int FUNC_0(AVCodecContext * VAR_0, void *VAR_1,

                             int *VAR_2, AVPacket *VAR_3)

{

    const uint8_t *VAR_4 = VAR_3->VAR_1;

    int VAR_5;

    MPCContext *c = VAR_0->priv_data;

    GetBitContext gb;

    int VAR_6, VAR_7;

    int VAR_8 = -1;

    Band *bands = c->bands;

    int VAR_9, VAR_10, VAR_11, VAR_12;

    int VAR_13, VAR_14;



    memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));



    VAR_5 = VAR_3->size & ~3;

    if (VAR_5 <= 0) {

        av_log(VAR_0, AV_LOG_ERROR, "packet size is too small (%VAR_6 bytes)\n",

               VAR_3->size);

        return AVERROR_INVALIDDATA;

    }

    if (VAR_5 != VAR_3->size) {

        av_log(VAR_0, AV_LOG_WARNING, "packet size is not a multiple of 4. "

               "extra bytes at the end will be skipped.\n");

    }



    VAR_12       = VAR_4[0];

    VAR_11 = VAR_4[1];

    VAR_4       += 4;

    VAR_5  -= 4;



    

    c->frame.nb_samples = VAR_11 ? c->lastframelen : MPC_FRAME_SIZE;

    if ((VAR_10 = VAR_0->get_buffer(VAR_0, &c->frame)) < 0) {

        av_log(VAR_0, AV_LOG_ERROR, "get_buffer() failed\n");

        return VAR_10;

    }



    av_fast_padded_malloc(&c->bits, &c->VAR_5, VAR_5);

    if (!c->bits)

        return AVERROR(ENOMEM);

    c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)VAR_4, VAR_5 >> 2);

    init_get_bits(&gb, c->bits, VAR_5 * 8);

    skip_bits_long(&gb, VAR_12);



    

    for(VAR_6 = 0; VAR_6 <= c->maxbands; VAR_6++){

        for(VAR_7 = 0; VAR_7 < 2; VAR_7++){

            int t = 4;

            if(VAR_6) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5;

            if(t == 4) bands[VAR_6].res[VAR_7] = get_bits(&gb, 4);

            else bands[VAR_6].res[VAR_7] = bands[VAR_6-1].res[VAR_7] + t;

        }



        if(bands[VAR_6].res[0] || bands[VAR_6].res[1]){

            VAR_8 = VAR_6;

            if(c->MSS) bands[VAR_6].msf = get_bits1(&gb);

        }

    }

    

    for(VAR_6 = 0; VAR_6 <= VAR_8; VAR_6++)

        for(VAR_7 = 0; VAR_7 < 2; VAR_7++)

            if(bands[VAR_6].res[VAR_7]) bands[VAR_6].scfi[VAR_7] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);

    

    for(VAR_6 = 0; VAR_6 <= VAR_8; VAR_6++){

        for(VAR_7 = 0; VAR_7 < 2; VAR_7++){

            if(bands[VAR_6].res[VAR_7]){

                bands[VAR_6].scf_idx[VAR_7][2] = c->oldDSCF[VAR_7][VAR_6];

                bands[VAR_6].scf_idx[VAR_7][0] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][2]);

                switch(bands[VAR_6].scfi[VAR_7]){

                case 0:

                    bands[VAR_6].scf_idx[VAR_7][1] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][0]);

                    bands[VAR_6].scf_idx[VAR_7][2] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][1]);

                    break;

                case 1:

                    bands[VAR_6].scf_idx[VAR_7][1] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][0]);

                    bands[VAR_6].scf_idx[VAR_7][2] = bands[VAR_6].scf_idx[VAR_7][1];

                    break;

                case 2:

                    bands[VAR_6].scf_idx[VAR_7][1] = bands[VAR_6].scf_idx[VAR_7][0];

                    bands[VAR_6].scf_idx[VAR_7][2] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][1]);

                    break;

                case 3:

                    bands[VAR_6].scf_idx[VAR_7][2] = bands[VAR_6].scf_idx[VAR_7][1] = bands[VAR_6].scf_idx[VAR_7][0];

                    break;

                }

                c->oldDSCF[VAR_7][VAR_6] = bands[VAR_6].scf_idx[VAR_7][2];

            }

        }

    }

    

    memset(c->Q, 0, sizeof(c->Q));

    VAR_9 = 0;

    for(VAR_6 = 0; VAR_6 < BANDS; VAR_6++, VAR_9 += SAMPLES_PER_BAND)

        for(VAR_7 = 0; VAR_7 < 2; VAR_7++)

            idx_to_quant(c, &gb, bands[VAR_6].res[VAR_7], c->Q[VAR_7] + VAR_9);



    ff_mpc_dequantize_and_synth(c, VAR_8, c->frame.VAR_1[0], 2);



    VAR_13 = get_bits_count(&gb);

    VAR_14 = VAR_5 * 8;

    if (!VAR_11 && ((VAR_14 < VAR_13) || (VAR_13 + 32 <= VAR_14))) {

        av_log(VAR_0, AV_LOG_ERROR, "Error decoding frame: used %VAR_6 of %VAR_6 bits\n", VAR_13, VAR_14);

        return -1;

    }

    if(c->frames_to_skip){

        c->frames_to_skip--;

        *VAR_2 = 0;

        return VAR_3->size;

    }



    *VAR_2   = 1;

    *(AVFrame *)VAR_1 = c->frame;



    return VAR_3->size;

}

static int FUNC_0(AVCodecContext * VAR_0, void *VAR_1,
int *VAR_2, AVPacket *VAR_3)
{ const uint8_t *VAR_4 = VAR_3->VAR_1; int VAR_5; MPCContext *c = VAR_0->priv_data; GetBitContext gb; int VAR_6, VAR_7; int VAR_8 = -1; Band *bands = c->bands; int VAR_9, VAR_10, VAR_11, VAR_12; int VAR_13, VAR_14; memset(bands, 0, sizeof(*bands) * (c->maxbands + 1)); VAR_5 = VAR_3->size & ~3; if (VAR_5 <= 0) { av_log(VAR_0, AV_LOG_ERROR, "packet size is too small (%VAR_6 bytes)\n",
VAR_3->size); return AVERROR_INVALIDDATA; } if (VAR_5 != VAR_3->size) { av_log(VAR_0, AV_LOG_WARNING, "packet size is not a multiple of 4. "
"extra bytes at the end will be skipped.\n"); } VAR_12       = VAR_4[0]; VAR_11 = VAR_4[1]; VAR_4       += 4; VAR_5  -= 4; c->frame.nb_samples = VAR_11 ? c->lastframelen : MPC_FRAME_SIZE; if ((VAR_10 = VAR_0->get_buffer(VAR_0, &c->frame)) < 0) { av_log(VAR_0, AV_LOG_ERROR, "get_buffer() failed\n"); return VAR_10; } av_fast_padded_malloc(&c->bits, &c->VAR_5, VAR_5); if (!c->bits)
return AVERROR(ENOMEM); c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)VAR_4, VAR_5 >> 2); init_get_bits(&gb, c->bits, VAR_5 * 8); skip_bits_long(&gb, VAR_12); for(VAR_6 = 0; VAR_6 <= c->maxbands; VAR_6++){ for(VAR_7 = 0; VAR_7 < 2; VAR_7++){ int t = 4; if(VAR_6) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5; if(t == 4) bands[VAR_6].res[VAR_7] = get_bits(&gb, 4); else bands[VAR_6].res[VAR_7] = bands[VAR_6-1].res[VAR_7] + t; } if(bands[VAR_6].res[0] || bands[VAR_6].res[1]){ VAR_8 = VAR_6; if(c->MSS) bands[VAR_6].msf = get_bits1(&gb); } } for(VAR_6 = 0; VAR_6 <= VAR_8; VAR_6++) for(VAR_7 = 0; VAR_7 < 2; VAR_7++) if(bands[VAR_6].res[VAR_7]) bands[VAR_6].scfi[VAR_7] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1); for(VAR_6 = 0; VAR_6 <= VAR_8; VAR_6++){ for(VAR_7 = 0; VAR_7 < 2; VAR_7++){ if(bands[VAR_6].res[VAR_7]){ bands[VAR_6].scf_idx[VAR_7][2] = c->oldDSCF[VAR_7][VAR_6]; bands[VAR_6].scf_idx[VAR_7][0] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][2]); switch(bands[VAR_6].scfi[VAR_7]){ case 0:
bands[VAR_6].scf_idx[VAR_7][1] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][0]); bands[VAR_6].scf_idx[VAR_7][2] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][1]); break; case 1:
bands[VAR_6].scf_idx[VAR_7][1] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][0]); bands[VAR_6].scf_idx[VAR_7][2] = bands[VAR_6].scf_idx[VAR_7][1]; break; case 2:
bands[VAR_6].scf_idx[VAR_7][1] = bands[VAR_6].scf_idx[VAR_7][0]; bands[VAR_6].scf_idx[VAR_7][2] = get_scale_idx(&gb, bands[VAR_6].scf_idx[VAR_7][1]); break; case 3:
bands[VAR_6].scf_idx[VAR_7][2] = bands[VAR_6].scf_idx[VAR_7][1] = bands[VAR_6].scf_idx[VAR_7][0]; break; } c->oldDSCF[VAR_7][VAR_6] = bands[VAR_6].scf_idx[VAR_7][2]; } } } memset(c->Q, 0, sizeof(c->Q)); VAR_9 = 0; for(VAR_6 = 0; VAR_6 < BANDS; VAR_6++, VAR_9 += SAMPLES_PER_BAND) for(VAR_7 = 0; VAR_7 < 2; VAR_7++) idx_to_quant(c, &gb, bands[VAR_6].res[VAR_7], c->Q[VAR_7] + VAR_9); ff_mpc_dequantize_and_synth(c, VAR_8, c->frame.VAR_1[0], 2); VAR_13 = get_bits_count(&gb); VAR_14 = VAR_5 * 8; if (!VAR_11 && ((VAR_14 < VAR_13) || (VAR_13 + 32 <= VAR_14))) { av_log(VAR_0, AV_LOG_ERROR, "Error decoding frame: used %VAR_6 of %VAR_6 bits\n", VAR_13, VAR_14); return -1; } if(c->frames_to_skip){ c->frames_to_skip--; *VAR_2 = 0; return VAR_3->size; } *VAR_2   = 1; *(AVFrame *)VAR_1 = c->frame; return VAR_3->size; }