static int bethsoftvid_decode_frame(AVCodecContext *avctx,

                              void *data, int *data_size,

                              AVPacket *avpkt)

{

    const uint8_t *buf = avpkt->data;

    int buf_size = avpkt->size;

    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;

    }

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

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



    switch(block_type = *buf++){

        case PALETTE_BLOCK:

            return set_palette(&vid->frame, buf, buf_size);

        case VIDEO_YOFF_P_FRAME:

            yoffset = bytestream_get_le16(&buf);

            if(yoffset >= avctx->height)

                return -1;

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

    }



    // main code

    while((code = *buf++)){

        int length = code & 0x7f;



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

        while(length > remaining){

            if(code < 0x80)

                bytestream_get_buffer(&buf, dst, remaining);

            else if(block_type == VIDEO_I_FRAME)

                memset(dst, buf[0], 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)

            bytestream_get_buffer(&buf, dst, length);

        else if(block_type == VIDEO_I_FRAME)

            memset(dst, *buf++, length);

        remaining -= length;

        dst += length;

    }

    end:



    *data_size = sizeof(AVFrame);

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



    return buf_size;

}

static int bethsoftvid_decode_frame(AVCodecContext *avctx,

                              void *data, int *data_size,

                              AVPacket *avpkt)

{

    const uint8_t *buf = avpkt->data;

    int buf_size = avpkt->size;

    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;

    }

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

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



    switch(block_type = *buf++){

        case PALETTE_BLOCK:

            return set_palette(&vid->frame, buf, buf_size);

        case VIDEO_YOFF_P_FRAME:

            yoffset = bytestream_get_le16(&buf);

            if(yoffset >= avctx->height)

                return -1;

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

    }



    

    while((code = *buf++)){

        int length = code & 0x7f;



        

        while(length > remaining){

            if(code < 0x80)

                bytestream_get_buffer(&buf, dst, remaining);

            else if(block_type == VIDEO_I_FRAME)

                memset(dst, buf[0], remaining);

            length -= remaining;      

            dst += remaining + wrap_to_next_line;    

            remaining = avctx->width;

            if(dst == frame_end)

                goto end;

        }



        

        if(code < 0x80)

            bytestream_get_buffer(&buf, dst, length);

        else if(block_type == VIDEO_I_FRAME)

            memset(dst, *buf++, length);

        remaining -= length;

        dst += length;

    }

    end:



    *data_size = sizeof(AVFrame);

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



    return buf_size;

}

    const uint8_t *buf = avpkt->data;     int buf_size = avpkt->size;     switch(block_type = *buf++){         case PALETTE_BLOCK:             return set_palette(&vid->frame, buf, buf_size);             yoffset = bytestream_get_le16(&buf);     while((code = *buf++)){                 bytestream_get_buffer(&buf, dst, remaining);                 memset(dst, buf[0], remaining);             bytestream_get_buffer(&buf, dst, length);             memset(dst, *buf++, length);     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->size;

    BethsoftvidContext * vid = VAR_0->priv_data;

    char VAR_6;

    uint8_t * dst;

    uint8_t * frame_end;

    int VAR_7 = VAR_0->width;          

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

    int VAR_9;

    int VAR_10;



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

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

        return -1;

    }

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

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



    switch(VAR_6 = *VAR_4++){

        case PALETTE_BLOCK:

            return set_palette(&vid->frame, VAR_4, VAR_5);

        case VIDEO_YOFF_P_FRAME:

            VAR_10 = bytestream_get_le16(&VAR_4);

            if(VAR_10 >= VAR_0->height)

                return -1;

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

    }



    

    while((VAR_9 = *VAR_4++)){

        int VAR_11 = VAR_9 & 0x7f;



        

        while(VAR_11 > VAR_7){

            if(VAR_9 < 0x80)

                bytestream_get_buffer(&VAR_4, dst, VAR_7);

            else if(VAR_6 == VIDEO_I_FRAME)

                memset(dst, VAR_4[0], VAR_7);

            VAR_11 -= VAR_7;      

            dst += VAR_7 + VAR_8;    

            VAR_7 = VAR_0->width;

            if(dst == frame_end)

                goto end;

        }



        

        if(VAR_9 < 0x80)

            bytestream_get_buffer(&VAR_4, dst, VAR_11);

        else if(VAR_6 == VIDEO_I_FRAME)

            memset(dst, *VAR_4++, VAR_11);

        VAR_7 -= VAR_11;

        dst += VAR_11;

    }

    end:



    *VAR_2 = sizeof(AVFrame);

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



    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->size; BethsoftvidContext * vid = VAR_0->priv_data; char VAR_6; uint8_t * dst; uint8_t * frame_end; int VAR_7 = VAR_0->width; const int VAR_8 = vid->frame.linesize[0] - VAR_0->width; int VAR_9; int VAR_10; if (VAR_0->reget_buffer(VAR_0, &vid->frame)) { av_log(VAR_0, AV_LOG_ERROR, "reget_buffer() failed\n"); return -1; } dst = vid->frame.VAR_1[0]; frame_end = vid->frame.VAR_1[0] + vid->frame.linesize[0] * VAR_0->height; switch(VAR_6 = *VAR_4++){ case PALETTE_BLOCK:
return set_palette(&vid->frame, VAR_4, VAR_5); case VIDEO_YOFF_P_FRAME:
VAR_10 = bytestream_get_le16(&VAR_4); if(VAR_10 >= VAR_0->height)
return -1; dst += vid->frame.linesize[0] * VAR_10; } while((VAR_9 = *VAR_4++)){ int VAR_11 = VAR_9 & 0x7f; while(VAR_11 > VAR_7){ if(VAR_9 < 0x80)
bytestream_get_buffer(&VAR_4, dst, VAR_7); else if(VAR_6 == VIDEO_I_FRAME)
memset(dst, VAR_4[0], VAR_7); VAR_11 -= VAR_7; dst += VAR_7 + VAR_8; VAR_7 = VAR_0->width; if(dst == frame_end)
goto end; } if(VAR_9 < 0x80)
bytestream_get_buffer(&VAR_4, dst, VAR_11); else if(VAR_6 == VIDEO_I_FRAME)
memset(dst, *VAR_4++, VAR_11); VAR_7 -= VAR_11; dst += VAR_11; } end:
*VAR_2 = sizeof(AVFrame); *(AVFrame*)VAR_1 = vid->frame; return VAR_5; }