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

                                  int *data_size, AVPacket *avpkt)

{

    ZeroCodecContext *zc = avctx->priv_data;

    AVFrame *pic         = avctx->coded_frame;

    AVFrame *prev_pic    = &zc->previous_frame;

    z_stream *zstream    = &zc->zstream;

    uint8_t *prev, *dst;

    int i, j, zret;



    pic->reference = 3;



    if (avctx->get_buffer(avctx, pic) < 0) {

        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");

        return AVERROR(ENOMEM);

    }



    zret = inflateReset(zstream);



    if (zret != Z_OK) {

        av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d\n", zret);

        return AVERROR(EINVAL);

    }



    zstream->next_in  = avpkt->data;

    zstream->avail_in = avpkt->size;



    prev = prev_pic->data[0];

    dst  = pic->data[0];



    /**

     * ZeroCodec has very simple interframe compression. If a value

     * is the same as the previous frame, set it to 0.

     */



    if (avpkt->flags & AV_PKT_FLAG_KEY) {



        pic->key_frame = 1;

        pic->pict_type = AV_PICTURE_TYPE_I;



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



            zstream->next_out  = dst;

            zstream->avail_out = avctx->width << 1;



            zret = inflate(zstream, Z_SYNC_FLUSH);



            if (zret != Z_OK && zret != Z_STREAM_END) {

                av_log(avctx, AV_LOG_ERROR,

                       "Inflate failed with return code: %d\n", zret);

                return AVERROR(EINVAL);

            }



            dst += pic->linesize[0];

        }

    } else {



        pic->key_frame = 0;

        pic->pict_type = AV_PICTURE_TYPE_P;



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



            zstream->next_out  = dst;

            zstream->avail_out = avctx->width << 1;



            zret = inflate(zstream, Z_SYNC_FLUSH);



            if (zret != Z_OK && zret != Z_STREAM_END) {

                av_log(avctx, AV_LOG_ERROR,

                       "Inflate failed with return code: %d\n", zret);

                return AVERROR(EINVAL);

            }



            for (j = 0; j < avctx->width << 1; j++)

                dst[j] += prev[j] & -!dst[j];



            prev += prev_pic->linesize[0];

            dst  += pic->linesize[0];

        }

    }



    /* Release the previous buffer if need be */

    if (prev_pic->data[0])

        avctx->release_buffer(avctx, prev_pic);



    /* Store the previouse frame for use later */

    *prev_pic = *pic;



    *data_size       = sizeof(AVFrame);

    *(AVFrame *)data = *pic;



    return avpkt->size;

}

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

                                  int *data_size, AVPacket *avpkt)

{

    ZeroCodecContext *zc = avctx->priv_data;

    AVFrame *pic         = avctx->coded_frame;

    AVFrame *prev_pic    = &zc->previous_frame;

    z_stream *zstream    = &zc->zstream;

    uint8_t *prev, *dst;

    int i, j, zret;



    pic->reference = 3;



    if (avctx->get_buffer(avctx, pic) < 0) {

        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");

        return AVERROR(ENOMEM);

    }



    zret = inflateReset(zstream);



    if (zret != Z_OK) {

        av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d\n", zret);

        return AVERROR(EINVAL);

    }



    zstream->next_in  = avpkt->data;

    zstream->avail_in = avpkt->size;



    prev = prev_pic->data[0];

    dst  = pic->data[0];



    









    if (avpkt->flags & AV_PKT_FLAG_KEY) {



        pic->key_frame = 1;

        pic->pict_type = AV_PICTURE_TYPE_I;



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



            zstream->next_out  = dst;

            zstream->avail_out = avctx->width << 1;



            zret = inflate(zstream, Z_SYNC_FLUSH);



            if (zret != Z_OK && zret != Z_STREAM_END) {

                av_log(avctx, AV_LOG_ERROR,

                       "Inflate failed with return code: %d\n", zret);

                return AVERROR(EINVAL);

            }



            dst += pic->linesize[0];

        }

    } else {



        pic->key_frame = 0;

        pic->pict_type = AV_PICTURE_TYPE_P;



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



            zstream->next_out  = dst;

            zstream->avail_out = avctx->width << 1;



            zret = inflate(zstream, Z_SYNC_FLUSH);



            if (zret != Z_OK && zret != Z_STREAM_END) {

                av_log(avctx, AV_LOG_ERROR,

                       "Inflate failed with return code: %d\n", zret);

                return AVERROR(EINVAL);

            }



            for (j = 0; j < avctx->width << 1; j++)

                dst[j] += prev[j] & -!dst[j];



            prev += prev_pic->linesize[0];

            dst  += pic->linesize[0];

        }

    }



    

    if (prev_pic->data[0])

        avctx->release_buffer(avctx, prev_pic);



    

    *prev_pic = *pic;



    *data_size       = sizeof(AVFrame);

    *(AVFrame *)data = *pic;



    return avpkt->size;

}

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

                                  int *VAR_2, AVPacket *VAR_3)

{

    ZeroCodecContext *zc = VAR_0->priv_data;

    AVFrame *pic         = VAR_0->coded_frame;

    AVFrame *prev_pic    = &zc->previous_frame;

    z_stream *zstream    = &zc->zstream;

    uint8_t *prev, *dst;

    int VAR_4, VAR_5, VAR_6;



    pic->reference = 3;



    if (VAR_0->get_buffer(VAR_0, pic) < 0) {

        av_log(VAR_0, AV_LOG_ERROR, "Could not allocate buffer.\n");

        return AVERROR(ENOMEM);

    }



    VAR_6 = inflateReset(zstream);



    if (VAR_6 != Z_OK) {

        av_log(VAR_0, AV_LOG_ERROR, "Could not reset inflate: %d\n", VAR_6);

        return AVERROR(EINVAL);

    }



    zstream->next_in  = VAR_3->VAR_1;

    zstream->avail_in = VAR_3->size;



    prev = prev_pic->VAR_1[0];

    dst  = pic->VAR_1[0];



    









    if (VAR_3->flags & AV_PKT_FLAG_KEY) {



        pic->key_frame = 1;

        pic->pict_type = AV_PICTURE_TYPE_I;



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



            zstream->next_out  = dst;

            zstream->avail_out = VAR_0->width << 1;



            VAR_6 = inflate(zstream, Z_SYNC_FLUSH);



            if (VAR_6 != Z_OK && VAR_6 != Z_STREAM_END) {

                av_log(VAR_0, AV_LOG_ERROR,

                       "Inflate failed with return code: %d\n", VAR_6);

                return AVERROR(EINVAL);

            }



            dst += pic->linesize[0];

        }

    } else {



        pic->key_frame = 0;

        pic->pict_type = AV_PICTURE_TYPE_P;



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



            zstream->next_out  = dst;

            zstream->avail_out = VAR_0->width << 1;



            VAR_6 = inflate(zstream, Z_SYNC_FLUSH);



            if (VAR_6 != Z_OK && VAR_6 != Z_STREAM_END) {

                av_log(VAR_0, AV_LOG_ERROR,

                       "Inflate failed with return code: %d\n", VAR_6);

                return AVERROR(EINVAL);

            }



            for (VAR_5 = 0; VAR_5 < VAR_0->width << 1; VAR_5++)

                dst[VAR_5] += prev[VAR_5] & -!dst[VAR_5];



            prev += prev_pic->linesize[0];

            dst  += pic->linesize[0];

        }

    }



    

    if (prev_pic->VAR_1[0])

        VAR_0->release_buffer(VAR_0, prev_pic);



    

    *prev_pic = *pic;



    *VAR_2       = sizeof(AVFrame);

    *(AVFrame *)VAR_1 = *pic;



    return VAR_3->size;

}

static int FUNC_0(AVCodecContext *VAR_0, void *VAR_1,
int *VAR_2, AVPacket *VAR_3)
{ ZeroCodecContext *zc = VAR_0->priv_data; AVFrame *pic         = VAR_0->coded_frame; AVFrame *prev_pic    = &zc->previous_frame; z_stream *zstream    = &zc->zstream; uint8_t *prev, *dst; int VAR_4, VAR_5, VAR_6; pic->reference = 3; if (VAR_0->get_buffer(VAR_0, pic) < 0) { av_log(VAR_0, AV_LOG_ERROR, "Could not allocate buffer.\n"); return AVERROR(ENOMEM); } VAR_6 = inflateReset(zstream); if (VAR_6 != Z_OK) { av_log(VAR_0, AV_LOG_ERROR, "Could not reset inflate: %d\n", VAR_6); return AVERROR(EINVAL); } zstream->next_in  = VAR_3->VAR_1; zstream->avail_in = VAR_3->size; prev = prev_pic->VAR_1[0]; dst  = pic->VAR_1[0]; if (VAR_3->flags & AV_PKT_FLAG_KEY) { pic->key_frame = 1; pic->pict_type = AV_PICTURE_TYPE_I; for (VAR_4 = 0; VAR_4 < VAR_0->height; VAR_4++) { zstream->next_out  = dst; zstream->avail_out = VAR_0->width << 1; VAR_6 = inflate(zstream, Z_SYNC_FLUSH); if (VAR_6 != Z_OK && VAR_6 != Z_STREAM_END) { av_log(VAR_0, AV_LOG_ERROR,
"Inflate failed with return code: %d\n", VAR_6); return AVERROR(EINVAL); } dst += pic->linesize[0]; } } else { pic->key_frame = 0; pic->pict_type = AV_PICTURE_TYPE_P; for (VAR_4 = 0; VAR_4 < VAR_0->height; VAR_4++) { zstream->next_out  = dst; zstream->avail_out = VAR_0->width << 1; VAR_6 = inflate(zstream, Z_SYNC_FLUSH); if (VAR_6 != Z_OK && VAR_6 != Z_STREAM_END) { av_log(VAR_0, AV_LOG_ERROR,
"Inflate failed with return code: %d\n", VAR_6); return AVERROR(EINVAL); } for (VAR_5 = 0; VAR_5 < VAR_0->width << 1; VAR_5++) dst[VAR_5] += prev[VAR_5] & -!dst[VAR_5]; prev += prev_pic->linesize[0]; dst  += pic->linesize[0]; } } if (prev_pic->VAR_1[0])
VAR_0->release_buffer(VAR_0, prev_pic); *prev_pic = *pic; *VAR_2       = sizeof(AVFrame); *(AVFrame *)VAR_1 = *pic; return VAR_3->size; }