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

                             int *got_frame, AVPacket *avpkt)

{

    VCR1Context *const a      = avctx->priv_data;

    AVFrame *const p          = data;

    const uint8_t *bytestream = avpkt->data;

    const uint8_t *bytestream_end = bytestream + avpkt->size;

    int i, x, y, ret;



    if(avpkt->size < 16 + avctx->height + avctx->width*avctx->height*5/8){

        av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n");

        return AVERROR(EINVAL);

    }



    if ((ret = ff_get_buffer(avctx, p, 0)) < 0)

        return ret;

    p->pict_type = AV_PICTURE_TYPE_I;

    p->key_frame = 1;



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

        a->delta[i] = *bytestream++;

        bytestream++;

    }



    for (y = 0; y < avctx->height; y++) {

        int offset;

        uint8_t *luma = &p->data[0][y * p->linesize[0]];



        if ((y & 3) == 0) {

            uint8_t *cb = &p->data[1][(y >> 2) * p->linesize[1]];

            uint8_t *cr = &p->data[2][(y >> 2) * p->linesize[2]];



            av_assert0 (bytestream_end - bytestream >= 4 + avctx->width);



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

                a->offset[i] = *bytestream++;



            offset = a->offset[0] - a->delta[bytestream[2] & 0xF];

            for (x = 0; x < avctx->width; x += 4) {

                luma[0]     = offset += a->delta[bytestream[2] & 0xF];

                luma[1]     = offset += a->delta[bytestream[2] >>  4];

                luma[2]     = offset += a->delta[bytestream[0] & 0xF];

                luma[3]     = offset += a->delta[bytestream[0] >>  4];

                luma       += 4;



                *cb++       = bytestream[3];

                *cr++       = bytestream[1];



                bytestream += 4;

            }

        } else {

            av_assert0 (bytestream_end - bytestream >= avctx->width / 2);



            offset = a->offset[y & 3] - a->delta[bytestream[2] & 0xF];



            for (x = 0; x < avctx->width; x += 8) {

                luma[0]     = offset += a->delta[bytestream[2] & 0xF];

                luma[1]     = offset += a->delta[bytestream[2] >>  4];

                luma[2]     = offset += a->delta[bytestream[3] & 0xF];

                luma[3]     = offset += a->delta[bytestream[3] >>  4];

                luma[4]     = offset += a->delta[bytestream[0] & 0xF];

                luma[5]     = offset += a->delta[bytestream[0] >>  4];

                luma[6]     = offset += a->delta[bytestream[1] & 0xF];

                luma[7]     = offset += a->delta[bytestream[1] >>  4];

                luma       += 8;

                bytestream += 4;

            }

        }

    }



    *got_frame = 1;



    return bytestream - avpkt->data;

}

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

                             int *got_frame, AVPacket *avpkt)

{

    VCR1Context *const a      = avctx->priv_data;

    AVFrame *const p          = data;

    const uint8_t *bytestream = avpkt->data;

    const uint8_t *bytestream_end = bytestream + avpkt->size;

    int i, x, y, ret;



    if(avpkt->size < 16 + avctx->height + avctx->width*avctx->height*5/8){

        av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n");

        return AVERROR(EINVAL);

    }



    if ((ret = ff_get_buffer(avctx, p, 0)) < 0)

        return ret;

    p->pict_type = AV_PICTURE_TYPE_I;

    p->key_frame = 1;



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

        a->delta[i] = *bytestream++;

        bytestream++;

    }



    for (y = 0; y < avctx->height; y++) {

        int offset;

        uint8_t *luma = &p->data[0][y * p->linesize[0]];



        if ((y & 3) == 0) {

            uint8_t *cb = &p->data[1][(y >> 2) * p->linesize[1]];

            uint8_t *cr = &p->data[2][(y >> 2) * p->linesize[2]];



            av_assert0 (bytestream_end - bytestream >= 4 + avctx->width);



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

                a->offset[i] = *bytestream++;



            offset = a->offset[0] - a->delta[bytestream[2] & 0xF];

            for (x = 0; x < avctx->width; x += 4) {

                luma[0]     = offset += a->delta[bytestream[2] & 0xF];

                luma[1]     = offset += a->delta[bytestream[2] >>  4];

                luma[2]     = offset += a->delta[bytestream[0] & 0xF];

                luma[3]     = offset += a->delta[bytestream[0] >>  4];

                luma       += 4;



                *cb++       = bytestream[3];

                *cr++       = bytestream[1];



                bytestream += 4;

            }

        } else {

            av_assert0 (bytestream_end - bytestream >= avctx->width / 2);



            offset = a->offset[y & 3] - a->delta[bytestream[2] & 0xF];



            for (x = 0; x < avctx->width; x += 8) {

                luma[0]     = offset += a->delta[bytestream[2] & 0xF];

                luma[1]     = offset += a->delta[bytestream[2] >>  4];

                luma[2]     = offset += a->delta[bytestream[3] & 0xF];

                luma[3]     = offset += a->delta[bytestream[3] >>  4];

                luma[4]     = offset += a->delta[bytestream[0] & 0xF];

                luma[5]     = offset += a->delta[bytestream[0] >>  4];

                luma[6]     = offset += a->delta[bytestream[1] & 0xF];

                luma[7]     = offset += a->delta[bytestream[1] >>  4];

                luma       += 8;

                bytestream += 4;

            }

        }

    }



    *got_frame = 1;



    return bytestream - avpkt->data;

}

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

                             int *VAR_2, AVPacket *VAR_3)

{

    VCR1Context *const a      = VAR_0->priv_data;

    AVFrame *const p          = VAR_1;

    const uint8_t *VAR_4 = VAR_3->VAR_1;

    const uint8_t *VAR_5 = VAR_4 + VAR_3->size;

    int VAR_6, VAR_7, VAR_8, VAR_9;



    if(VAR_3->size < 16 + VAR_0->height + VAR_0->width*VAR_0->height*5/8){

        av_log(VAR_0, AV_LOG_ERROR, "Insufficient input VAR_1.\n");

        return AVERROR(EINVAL);

    }



    if ((VAR_9 = ff_get_buffer(VAR_0, p, 0)) < 0)

        return VAR_9;

    p->pict_type = AV_PICTURE_TYPE_I;

    p->key_frame = 1;



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

        a->delta[VAR_6] = *VAR_4++;

        VAR_4++;

    }



    for (VAR_8 = 0; VAR_8 < VAR_0->height; VAR_8++) {

        int offset;

        uint8_t *luma = &p->VAR_1[0][VAR_8 * p->linesize[0]];



        if ((VAR_8 & 3) == 0) {

            uint8_t *cb = &p->VAR_1[1][(VAR_8 >> 2) * p->linesize[1]];

            uint8_t *cr = &p->VAR_1[2][(VAR_8 >> 2) * p->linesize[2]];



            av_assert0 (VAR_5 - VAR_4 >= 4 + VAR_0->width);



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

                a->offset[VAR_6] = *VAR_4++;



            offset = a->offset[0] - a->delta[VAR_4[2] & 0xF];

            for (VAR_7 = 0; VAR_7 < VAR_0->width; VAR_7 += 4) {

                luma[0]     = offset += a->delta[VAR_4[2] & 0xF];

                luma[1]     = offset += a->delta[VAR_4[2] >>  4];

                luma[2]     = offset += a->delta[VAR_4[0] & 0xF];

                luma[3]     = offset += a->delta[VAR_4[0] >>  4];

                luma       += 4;



                *cb++       = VAR_4[3];

                *cr++       = VAR_4[1];



                VAR_4 += 4;

            }

        } else {

            av_assert0 (VAR_5 - VAR_4 >= VAR_0->width / 2);



            offset = a->offset[VAR_8 & 3] - a->delta[VAR_4[2] & 0xF];



            for (VAR_7 = 0; VAR_7 < VAR_0->width; VAR_7 += 8) {

                luma[0]     = offset += a->delta[VAR_4[2] & 0xF];

                luma[1]     = offset += a->delta[VAR_4[2] >>  4];

                luma[2]     = offset += a->delta[VAR_4[3] & 0xF];

                luma[3]     = offset += a->delta[VAR_4[3] >>  4];

                luma[4]     = offset += a->delta[VAR_4[0] & 0xF];

                luma[5]     = offset += a->delta[VAR_4[0] >>  4];

                luma[6]     = offset += a->delta[VAR_4[1] & 0xF];

                luma[7]     = offset += a->delta[VAR_4[1] >>  4];

                luma       += 8;

                VAR_4 += 4;

            }

        }

    }



    *VAR_2 = 1;



    return VAR_4 - VAR_3->VAR_1;

}

static int FUNC_0(AVCodecContext *VAR_0, void *VAR_1,
int *VAR_2, AVPacket *VAR_3)
{ VCR1Context *const a      = VAR_0->priv_data; AVFrame *const p          = VAR_1; const uint8_t *VAR_4 = VAR_3->VAR_1; const uint8_t *VAR_5 = VAR_4 + VAR_3->size; int VAR_6, VAR_7, VAR_8, VAR_9; if(VAR_3->size < 16 + VAR_0->height + VAR_0->width*VAR_0->height*5/8){ av_log(VAR_0, AV_LOG_ERROR, "Insufficient input VAR_1.\n"); return AVERROR(EINVAL); } if ((VAR_9 = ff_get_buffer(VAR_0, p, 0)) < 0)
return VAR_9; p->pict_type = AV_PICTURE_TYPE_I; p->key_frame = 1; for (VAR_6 = 0; VAR_6 < 16; VAR_6++) { a->delta[VAR_6] = *VAR_4++; VAR_4++; } for (VAR_8 = 0; VAR_8 < VAR_0->height; VAR_8++) { int offset; uint8_t *luma = &p->VAR_1[0][VAR_8 * p->linesize[0]]; if ((VAR_8 & 3) == 0) { uint8_t *cb = &p->VAR_1[1][(VAR_8 >> 2) * p->linesize[1]]; uint8_t *cr = &p->VAR_1[2][(VAR_8 >> 2) * p->linesize[2]]; av_assert0 (VAR_5 - VAR_4 >= 4 + VAR_0->width); for (VAR_6 = 0; VAR_6 < 4; VAR_6++) a->offset[VAR_6] = *VAR_4++; offset = a->offset[0] - a->delta[VAR_4[2] & 0xF]; for (VAR_7 = 0; VAR_7 < VAR_0->width; VAR_7 += 4) { luma[0]     = offset += a->delta[VAR_4[2] & 0xF]; luma[1]     = offset += a->delta[VAR_4[2] >>  4]; luma[2]     = offset += a->delta[VAR_4[0] & 0xF]; luma[3]     = offset += a->delta[VAR_4[0] >>  4]; luma       += 4; *cb++       = VAR_4[3]; *cr++       = VAR_4[1]; VAR_4 += 4; } } else { av_assert0 (VAR_5 - VAR_4 >= VAR_0->width / 2); offset = a->offset[VAR_8 & 3] - a->delta[VAR_4[2] & 0xF]; for (VAR_7 = 0; VAR_7 < VAR_0->width; VAR_7 += 8) { luma[0]     = offset += a->delta[VAR_4[2] & 0xF]; luma[1]     = offset += a->delta[VAR_4[2] >>  4]; luma[2]     = offset += a->delta[VAR_4[3] & 0xF]; luma[3]     = offset += a->delta[VAR_4[3] >>  4]; luma[4]     = offset += a->delta[VAR_4[0] & 0xF]; luma[5]     = offset += a->delta[VAR_4[0] >>  4]; luma[6]     = offset += a->delta[VAR_4[1] & 0xF]; luma[7]     = offset += a->delta[VAR_4[1] >>  4]; luma       += 8; VAR_4 += 4; } } } *VAR_2 = 1; return VAR_4 - VAR_3->VAR_1; }