static int bethsoftvid_decode_frame(AVCodecContext *avctx,

                              void *data, int *data_size,

                              AVPacket *avpkt)

{

    BethsoftvidContext * vid = avctx->priv_data;

    char block_type;

    uint8_t * dst;

    uint8_t * frame_end;

    int remaining = avctx->width;          // number of bytes remaining on a line

    const int wrap_to_next_line = vid->frame.linesize[0] - avctx->width;

    int code;

    int yoffset;



    if (avctx->reget_buffer(avctx, &vid->frame)) {

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

        return -1;

    }



    bytestream2_init(&vid->g, avpkt->data, avpkt->size);

    dst = vid->frame.data[0];

    frame_end = vid->frame.data[0] + vid->frame.linesize[0] * avctx->height;



    switch(block_type = bytestream2_get_byte(&vid->g)){

        case PALETTE_BLOCK: {

            int ret;

            *data_size = 0;

            if ((ret = set_palette(vid)) < 0) {

                av_log(avctx, AV_LOG_ERROR, "error reading palette\n");

                return ret;

            }

            return bytestream2_tell(&vid->g);

        }

        case VIDEO_YOFF_P_FRAME:

            yoffset = bytestream2_get_le16(&vid->g);

            if(yoffset >= avctx->height)

                return -1;

            dst += vid->frame.linesize[0] * yoffset;

    }



    // main code

    while((code = bytestream2_get_byte(&vid->g))){

        int length = code & 0x7f;



        // copy any bytes starting at the current position, and ending at the frame width

        while(length > remaining){

            if(code < 0x80)

                bytestream2_get_buffer(&vid->g, dst, remaining);

            else if(block_type == VIDEO_I_FRAME)

                memset(dst, bytestream2_peek_byte(&vid->g), remaining);

            length -= remaining;      // decrement the number of bytes to be copied

            dst += remaining + wrap_to_next_line;    // skip over extra bytes at end of frame

            remaining = avctx->width;

            if(dst == frame_end)

                goto end;

        }



        // copy any remaining bytes after / if line overflows

        if(code < 0x80)

            bytestream2_get_buffer(&vid->g, dst, length);

        else if(block_type == VIDEO_I_FRAME)

            memset(dst, bytestream2_get_byte(&vid->g), length);

        remaining -= length;

        dst += length;

    }

    end:



    *data_size = sizeof(AVFrame);

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



    return avpkt->size;

}

static int bethsoftvid_decode_frame(AVCodecContext *avctx,

                              void *data, int *data_size,

                              AVPacket *avpkt)

{

    BethsoftvidContext * vid = avctx->priv_data;

    char block_type;

    uint8_t * dst;

    uint8_t * frame_end;

    int remaining = avctx->width;          

    const int wrap_to_next_line = vid->frame.linesize[0] - avctx->width;

    int code;

    int yoffset;



    if (avctx->reget_buffer(avctx, &vid->frame)) {

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

        return -1;

    }



    bytestream2_init(&vid->g, avpkt->data, avpkt->size);

    dst = vid->frame.data[0];

    frame_end = vid->frame.data[0] + vid->frame.linesize[0] * avctx->height;



    switch(block_type = bytestream2_get_byte(&vid->g)){

        case PALETTE_BLOCK: {

            int ret;

            *data_size = 0;

            if ((ret = set_palette(vid)) < 0) {

                av_log(avctx, AV_LOG_ERROR, "error reading palette\n");

                return ret;

            }

            return bytestream2_tell(&vid->g);

        }

        case VIDEO_YOFF_P_FRAME:

            yoffset = bytestream2_get_le16(&vid->g);

            if(yoffset >= avctx->height)

                return -1;

            dst += vid->frame.linesize[0] * yoffset;

    }



    

    while((code = bytestream2_get_byte(&vid->g))){

        int length = code & 0x7f;



        

        while(length > remaining){

            if(code < 0x80)

                bytestream2_get_buffer(&vid->g, dst, remaining);

            else if(block_type == VIDEO_I_FRAME)

                memset(dst, bytestream2_peek_byte(&vid->g), remaining);

            length -= remaining;      

            dst += remaining + wrap_to_next_line;    

            remaining = avctx->width;

            if(dst == frame_end)

                goto end;

        }



        

        if(code < 0x80)

            bytestream2_get_buffer(&vid->g, dst, length);

        else if(block_type == VIDEO_I_FRAME)

            memset(dst, bytestream2_get_byte(&vid->g), length);

        remaining -= length;

        dst += length;

    }

    end:



    *data_size = sizeof(AVFrame);

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



    return avpkt->size;

}

static int FUNC_0(AVCodecContext *VAR_0,

                              void *VAR_1, int *VAR_2,

                              AVPacket *VAR_3)

{

    BethsoftvidContext * vid = VAR_0->priv_data;

    char VAR_4;

    uint8_t * dst;

    uint8_t * frame_end;

    int VAR_5 = VAR_0->width;          

    const int VAR_6 = vid->frame.linesize[0] - VAR_0->width;

    int VAR_7;

    int VAR_8;



    if (VAR_0->reget_buffer(VAR_0, &vid->frame)) {

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

        return -1;

    }



    bytestream2_init(&vid->g, VAR_3->VAR_1, VAR_3->size);

    dst = vid->frame.VAR_1[0];

    frame_end = vid->frame.VAR_1[0] + vid->frame.linesize[0] * VAR_0->height;



    switch(VAR_4 = bytestream2_get_byte(&vid->g)){

        case PALETTE_BLOCK: {

            int VAR_9;

            *VAR_2 = 0;

            if ((VAR_9 = set_palette(vid)) < 0) {

                av_log(VAR_0, AV_LOG_ERROR, "error reading palette\n");

                return VAR_9;

            }

            return bytestream2_tell(&vid->g);

        }

        case VIDEO_YOFF_P_FRAME:

            VAR_8 = bytestream2_get_le16(&vid->g);

            if(VAR_8 >= VAR_0->height)

                return -1;

            dst += vid->frame.linesize[0] * VAR_8;

    }



    

    while((VAR_7 = bytestream2_get_byte(&vid->g))){

        int VAR_10 = VAR_7 & 0x7f;



        

        while(VAR_10 > VAR_5){

            if(VAR_7 < 0x80)

                bytestream2_get_buffer(&vid->g, dst, VAR_5);

            else if(VAR_4 == VIDEO_I_FRAME)

                memset(dst, bytestream2_peek_byte(&vid->g), VAR_5);

            VAR_10 -= VAR_5;      

            dst += VAR_5 + VAR_6;    

            VAR_5 = VAR_0->width;

            if(dst == frame_end)

                goto end;

        }



        

        if(VAR_7 < 0x80)

            bytestream2_get_buffer(&vid->g, dst, VAR_10);

        else if(VAR_4 == VIDEO_I_FRAME)

            memset(dst, bytestream2_get_byte(&vid->g), VAR_10);

        VAR_5 -= VAR_10;

        dst += VAR_10;

    }

    end:



    *VAR_2 = sizeof(AVFrame);

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



    return VAR_3->size;

}

static int FUNC_0(AVCodecContext *VAR_0,
void *VAR_1, int *VAR_2,
AVPacket *VAR_3)
{ BethsoftvidContext * vid = VAR_0->priv_data; char VAR_4; uint8_t * dst; uint8_t * frame_end; int VAR_5 = VAR_0->width; const int VAR_6 = vid->frame.linesize[0] - VAR_0->width; int VAR_7; int VAR_8; if (VAR_0->reget_buffer(VAR_0, &vid->frame)) { av_log(VAR_0, AV_LOG_ERROR, "reget_buffer() failed\n"); return -1; } bytestream2_init(&vid->g, VAR_3->VAR_1, VAR_3->size); dst = vid->frame.VAR_1[0]; frame_end = vid->frame.VAR_1[0] + vid->frame.linesize[0] * VAR_0->height; switch(VAR_4 = bytestream2_get_byte(&vid->g)){ case PALETTE_BLOCK: { int VAR_9; *VAR_2 = 0; if ((VAR_9 = set_palette(vid)) < 0) { av_log(VAR_0, AV_LOG_ERROR, "error reading palette\n"); return VAR_9; } return bytestream2_tell(&vid->g); } case VIDEO_YOFF_P_FRAME:
VAR_8 = bytestream2_get_le16(&vid->g); if(VAR_8 >= VAR_0->height)
return -1; dst += vid->frame.linesize[0] * VAR_8; } while((VAR_7 = bytestream2_get_byte(&vid->g))){ int VAR_10 = VAR_7 & 0x7f; while(VAR_10 > VAR_5){ if(VAR_7 < 0x80)
bytestream2_get_buffer(&vid->g, dst, VAR_5); else if(VAR_4 == VIDEO_I_FRAME)
memset(dst, bytestream2_peek_byte(&vid->g), VAR_5); VAR_10 -= VAR_5; dst += VAR_5 + VAR_6; VAR_5 = VAR_0->width; if(dst == frame_end)
goto end; } if(VAR_7 < 0x80)
bytestream2_get_buffer(&vid->g, dst, VAR_10); else if(VAR_4 == VIDEO_I_FRAME)
memset(dst, bytestream2_get_byte(&vid->g), VAR_10); VAR_5 -= VAR_10; dst += VAR_10; } end:
*VAR_2 = sizeof(AVFrame); *(AVFrame*)VAR_1 = vid->frame; return VAR_3->size; }