static int ipvideo_decode_frame(AVCodecContext *avctx,

                                void *data, int *got_frame,

                                AVPacket *avpkt)

{

    const uint8_t *buf = avpkt->data;

    int buf_size = avpkt->size;

    IpvideoContext *s = avctx->priv_data;

    AVFrame *frame = data;

    int ret;

    int send_buffer;

    int frame_format;

    int video_data_size;



    if (av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, NULL)) {

        av_frame_unref(s->last_frame);

        av_frame_unref(s->second_last_frame);

    }



    if (buf_size < 6)

        return AVERROR_INVALIDDATA;



    frame_format         = AV_RL8(buf);

    send_buffer          = AV_RL8(buf + 1);

    video_data_size      = AV_RL16(buf + 2);

    s->decoding_map_size = AV_RL16(buf + 4);



    if (frame_format != 0x11)

        av_log(avctx, AV_LOG_ERROR, "Frame type 0x%02X unsupported\n", frame_format);



    if (! s->decoding_map_size) {

        av_log(avctx, AV_LOG_ERROR, "Empty decoding map\n");

        return AVERROR_INVALIDDATA;

    }



    bytestream2_init(&s->stream_ptr, buf + 6, video_data_size);



    /* decoding map contains 4 bits of information per 8x8 block */

    s->decoding_map = buf + 6 + video_data_size;



    /* ensure we can't overread the packet */

    if (buf_size < 6 + s->decoding_map_size + video_data_size) {

        av_log(avctx, AV_LOG_ERROR, "Invalid IP packet size\n");

        return AVERROR_INVALIDDATA;

    }



    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)

        return ret;



    if (!s->is_16bpp) {

        int size;

        const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &size);

        if (pal && size == AVPALETTE_SIZE) {

            frame->palette_has_changed = 1;

            memcpy(s->pal, pal, AVPALETTE_SIZE);

        } else if (pal) {

            av_log(avctx, AV_LOG_ERROR, "Palette size %d is wrong\n", size);

        }

    }



    ipvideo_decode_opcodes(s, frame);



    *got_frame = send_buffer;



    /* shuffle frames */

    av_frame_unref(s->second_last_frame);

    FFSWAP(AVFrame*, s->second_last_frame, s->last_frame);

    if ((ret = av_frame_ref(s->last_frame, frame)) < 0)

        return ret;



    /* report that the buffer was completely consumed */

    return buf_size;

}

static int ipvideo_decode_frame(AVCodecContext *avctx,

                                void *data, int *got_frame,

                                AVPacket *avpkt)

{

    const uint8_t *buf = avpkt->data;

    int buf_size = avpkt->size;

    IpvideoContext *s = avctx->priv_data;

    AVFrame *frame = data;

    int ret;

    int send_buffer;

    int frame_format;

    int video_data_size;



    if (av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, NULL)) {

        av_frame_unref(s->last_frame);

        av_frame_unref(s->second_last_frame);

    }



    if (buf_size < 6)

        return AVERROR_INVALIDDATA;



    frame_format         = AV_RL8(buf);

    send_buffer          = AV_RL8(buf + 1);

    video_data_size      = AV_RL16(buf + 2);

    s->decoding_map_size = AV_RL16(buf + 4);



    if (frame_format != 0x11)

        av_log(avctx, AV_LOG_ERROR, "Frame type 0x%02X unsupported\n", frame_format);



    if (! s->decoding_map_size) {

        av_log(avctx, AV_LOG_ERROR, "Empty decoding map\n");

        return AVERROR_INVALIDDATA;

    }



    bytestream2_init(&s->stream_ptr, buf + 6, video_data_size);



    

    s->decoding_map = buf + 6 + video_data_size;



    

    if (buf_size < 6 + s->decoding_map_size + video_data_size) {

        av_log(avctx, AV_LOG_ERROR, "Invalid IP packet size\n");

        return AVERROR_INVALIDDATA;

    }



    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)

        return ret;



    if (!s->is_16bpp) {

        int size;

        const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &size);

        if (pal && size == AVPALETTE_SIZE) {

            frame->palette_has_changed = 1;

            memcpy(s->pal, pal, AVPALETTE_SIZE);

        } else if (pal) {

            av_log(avctx, AV_LOG_ERROR, "Palette size %d is wrong\n", size);

        }

    }



    ipvideo_decode_opcodes(s, frame);



    *got_frame = send_buffer;



    

    av_frame_unref(s->second_last_frame);

    FFSWAP(AVFrame*, s->second_last_frame, s->last_frame);

    if ((ret = av_frame_ref(s->last_frame, frame)) < 0)

        return ret;



    

    return buf_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 = VAR_3->VAR_10;

    IpvideoContext *s = VAR_0->priv_data;

    AVFrame *frame = VAR_1;

    int VAR_6;

    int VAR_7;

    int VAR_8;

    int VAR_9;



    if (av_packet_get_side_data(VAR_3, AV_PKT_DATA_PARAM_CHANGE, NULL)) {

        av_frame_unref(s->last_frame);

        av_frame_unref(s->second_last_frame);

    }



    if (VAR_5 < 6)

        return AVERROR_INVALIDDATA;



    VAR_8         = AV_RL8(VAR_4);

    VAR_7          = AV_RL8(VAR_4 + 1);

    VAR_9      = AV_RL16(VAR_4 + 2);

    s->decoding_map_size = AV_RL16(VAR_4 + 4);



    if (VAR_8 != 0x11)

        av_log(VAR_0, AV_LOG_ERROR, "Frame type 0x%02X unsupported\n", VAR_8);



    if (! s->decoding_map_size) {

        av_log(VAR_0, AV_LOG_ERROR, "Empty decoding map\n");

        return AVERROR_INVALIDDATA;

    }



    bytestream2_init(&s->stream_ptr, VAR_4 + 6, VAR_9);



    

    s->decoding_map = VAR_4 + 6 + VAR_9;



    

    if (VAR_5 < 6 + s->decoding_map_size + VAR_9) {

        av_log(VAR_0, AV_LOG_ERROR, "Invalid IP packet VAR_10\n");

        return AVERROR_INVALIDDATA;

    }



    if ((VAR_6 = ff_get_buffer(VAR_0, frame, AV_GET_BUFFER_FLAG_REF)) < 0)

        return VAR_6;



    if (!s->is_16bpp) {

        int VAR_10;

        const uint8_t *VAR_11 = av_packet_get_side_data(VAR_3, AV_PKT_DATA_PALETTE, &VAR_10);

        if (VAR_11 && VAR_10 == AVPALETTE_SIZE) {

            frame->palette_has_changed = 1;

            memcpy(s->VAR_11, VAR_11, AVPALETTE_SIZE);

        } else if (VAR_11) {

            av_log(VAR_0, AV_LOG_ERROR, "Palette VAR_10 %d is wrong\n", VAR_10);

        }

    }



    ipvideo_decode_opcodes(s, frame);



    *VAR_2 = VAR_7;



    

    av_frame_unref(s->second_last_frame);

    FFSWAP(AVFrame*, s->second_last_frame, s->last_frame);

    if ((VAR_6 = av_frame_ref(s->last_frame, frame)) < 0)

        return VAR_6;



    

    return VAR_5;

}

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 = VAR_3->VAR_10; IpvideoContext *s = VAR_0->priv_data; AVFrame *frame = VAR_1; int VAR_6; int VAR_7; int VAR_8; int VAR_9; if (av_packet_get_side_data(VAR_3, AV_PKT_DATA_PARAM_CHANGE, NULL)) { av_frame_unref(s->last_frame); av_frame_unref(s->second_last_frame); } if (VAR_5 < 6)
return AVERROR_INVALIDDATA; VAR_8         = AV_RL8(VAR_4); VAR_7          = AV_RL8(VAR_4 + 1); VAR_9      = AV_RL16(VAR_4 + 2); s->decoding_map_size = AV_RL16(VAR_4 + 4); if (VAR_8 != 0x11)
av_log(VAR_0, AV_LOG_ERROR, "Frame type 0x%02X unsupported\n", VAR_8); if (! s->decoding_map_size) { av_log(VAR_0, AV_LOG_ERROR, "Empty decoding map\n"); return AVERROR_INVALIDDATA; } bytestream2_init(&s->stream_ptr, VAR_4 + 6, VAR_9); s->decoding_map = VAR_4 + 6 + VAR_9; if (VAR_5 < 6 + s->decoding_map_size + VAR_9) { av_log(VAR_0, AV_LOG_ERROR, "Invalid IP packet VAR_10\n"); return AVERROR_INVALIDDATA; } if ((VAR_6 = ff_get_buffer(VAR_0, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
return VAR_6; if (!s->is_16bpp) { int VAR_10; const uint8_t *VAR_11 = av_packet_get_side_data(VAR_3, AV_PKT_DATA_PALETTE, &VAR_10); if (VAR_11 && VAR_10 == AVPALETTE_SIZE) { frame->palette_has_changed = 1; memcpy(s->VAR_11, VAR_11, AVPALETTE_SIZE); } else if (VAR_11) { av_log(VAR_0, AV_LOG_ERROR, "Palette VAR_10 %d is wrong\n", VAR_10); } } ipvideo_decode_opcodes(s, frame); *VAR_2 = VAR_7; av_frame_unref(s->second_last_frame); FFSWAP(AVFrame*, s->second_last_frame, s->last_frame); if ((VAR_6 = av_frame_ref(s->last_frame, frame)) < 0)
return VAR_6; return VAR_5; }