static int wc3_read_packet(AVFormatContext *s,

                           AVPacket *pkt)

{

    Wc3DemuxContext *wc3 = s->priv_data;

    ByteIOContext *pb = s->pb;

    unsigned int fourcc_tag;

    unsigned int size;

    int packet_read = 0;

    int ret = 0;

    unsigned char preamble[WC3_PREAMBLE_SIZE];

    unsigned char text[1024];

    unsigned int palette_number;

    int i;

    unsigned char r, g, b;

    int base_palette_index;



    while (!packet_read) {



        /* get the next chunk preamble */

        if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) !=

            WC3_PREAMBLE_SIZE)

            ret = AVERROR(EIO);



        fourcc_tag = AV_RL32(&preamble[0]);

        /* chunk sizes are 16-bit aligned */

        size = (AV_RB32(&preamble[4]) + 1) & (~1);



        switch (fourcc_tag) {



        case BRCH_TAG:

            /* no-op */

            break;



        case SHOT_TAG:

            /* load up new palette */

            if ((ret = get_buffer(pb, preamble, 4)) != 4)

                return AVERROR(EIO);

            palette_number = AV_RL32(&preamble[0]);

            if (palette_number >= wc3->palette_count)

                return AVERROR_INVALIDDATA;

            base_palette_index = palette_number * PALETTE_COUNT * 3;

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

                r = wc3->palettes[base_palette_index + i * 3 + 0];

                g = wc3->palettes[base_palette_index + i * 3 + 1];

                b = wc3->palettes[base_palette_index + i * 3 + 2];

                wc3->palette_control.palette[i] = (r << 16) | (g << 8) | (b);

            }

            wc3->palette_control.palette_changed = 1;

            break;



        case VGA__TAG:

            /* send out video chunk */

            ret= av_get_packet(pb, pkt, size);

            pkt->stream_index = wc3->video_stream_index;

            pkt->pts = wc3->pts;

            if (ret != size)

                ret = AVERROR(EIO);

            packet_read = 1;

            break;



        case TEXT_TAG:

            /* subtitle chunk */

#if 0

            url_fseek(pb, size, SEEK_CUR);

#else

            if ((unsigned)size > sizeof(text) || (ret = get_buffer(pb, text, size)) != size)

                ret = AVERROR(EIO);

            else {

                int i = 0;

                av_log (s, AV_LOG_DEBUG, "Subtitle time!\n");

                av_log (s, AV_LOG_DEBUG, "  inglish: %s\n", &text[i + 1]);

                i += text[i] + 1;

                av_log (s, AV_LOG_DEBUG, "  doytsch: %s\n", &text[i + 1]);

                i += text[i] + 1;

                av_log (s, AV_LOG_DEBUG, "  fronsay: %s\n", &text[i + 1]);

            }

#endif

            break;



        case AUDI_TAG:

            /* send out audio chunk */

            ret= av_get_packet(pb, pkt, size);

            pkt->stream_index = wc3->audio_stream_index;

            pkt->pts = wc3->pts;

            if (ret != size)

                ret = AVERROR(EIO);



            /* time to advance pts */

            wc3->pts++;



            packet_read = 1;

            break;



        default:

            av_log (s, AV_LOG_ERROR, "  unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",

                preamble[0], preamble[1], preamble[2], preamble[3],

                preamble[0], preamble[1], preamble[2], preamble[3]);

            ret = AVERROR_INVALIDDATA;

            packet_read = 1;

            break;

        }

    }



    return ret;

}

static int wc3_read_packet(AVFormatContext *s,

                           AVPacket *pkt)

{

    Wc3DemuxContext *wc3 = s->priv_data;

    ByteIOContext *pb = s->pb;

    unsigned int fourcc_tag;

    unsigned int size;

    int packet_read = 0;

    int ret = 0;

    unsigned char preamble[WC3_PREAMBLE_SIZE];

    unsigned char text[1024];

    unsigned int palette_number;

    int i;

    unsigned char r, g, b;

    int base_palette_index;



    while (!packet_read) {



        

        if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) !=

            WC3_PREAMBLE_SIZE)

            ret = AVERROR(EIO);



        fourcc_tag = AV_RL32(&preamble[0]);

        

        size = (AV_RB32(&preamble[4]) + 1) & (~1);



        switch (fourcc_tag) {



        case BRCH_TAG:

            

            break;



        case SHOT_TAG:

            

            if ((ret = get_buffer(pb, preamble, 4)) != 4)

                return AVERROR(EIO);

            palette_number = AV_RL32(&preamble[0]);

            if (palette_number >= wc3->palette_count)

                return AVERROR_INVALIDDATA;

            base_palette_index = palette_number * PALETTE_COUNT * 3;

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

                r = wc3->palettes[base_palette_index + i * 3 + 0];

                g = wc3->palettes[base_palette_index + i * 3 + 1];

                b = wc3->palettes[base_palette_index + i * 3 + 2];

                wc3->palette_control.palette[i] = (r << 16) | (g << 8) | (b);

            }

            wc3->palette_control.palette_changed = 1;

            break;



        case VGA__TAG:

            

            ret= av_get_packet(pb, pkt, size);

            pkt->stream_index = wc3->video_stream_index;

            pkt->pts = wc3->pts;

            if (ret != size)

                ret = AVERROR(EIO);

            packet_read = 1;

            break;



        case TEXT_TAG:

            

#if 0

            url_fseek(pb, size, SEEK_CUR);

#else

            if ((unsigned)size > sizeof(text) || (ret = get_buffer(pb, text, size)) != size)

                ret = AVERROR(EIO);

            else {

                int i = 0;

                av_log (s, AV_LOG_DEBUG, "Subtitle time!\n");

                av_log (s, AV_LOG_DEBUG, "  inglish: %s\n", &text[i + 1]);

                i += text[i] + 1;

                av_log (s, AV_LOG_DEBUG, "  doytsch: %s\n", &text[i + 1]);

                i += text[i] + 1;

                av_log (s, AV_LOG_DEBUG, "  fronsay: %s\n", &text[i + 1]);

            }

#endif

            break;



        case AUDI_TAG:

            

            ret= av_get_packet(pb, pkt, size);

            pkt->stream_index = wc3->audio_stream_index;

            pkt->pts = wc3->pts;

            if (ret != size)

                ret = AVERROR(EIO);



            

            wc3->pts++;



            packet_read = 1;

            break;



        default:

            av_log (s, AV_LOG_ERROR, "  unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",

                preamble[0], preamble[1], preamble[2], preamble[3],

                preamble[0], preamble[1], preamble[2], preamble[3]);

            ret = AVERROR_INVALIDDATA;

            packet_read = 1;

            break;

        }

    }



    return ret;

}

static int FUNC_0(AVFormatContext *VAR_0,

                           AVPacket *VAR_1)

{

    Wc3DemuxContext *wc3 = VAR_0->priv_data;

    ByteIOContext *pb = VAR_0->pb;

    unsigned int VAR_2;

    unsigned int VAR_3;

    int VAR_4 = 0;

    int VAR_5 = 0;

    unsigned char VAR_6[WC3_PREAMBLE_SIZE];

    unsigned char VAR_7[1024];

    unsigned int VAR_8;

    int VAR_14;

    unsigned char VAR_10, VAR_11, VAR_12;

    int VAR_13;



    while (!VAR_4) {



        

        if ((VAR_5 = get_buffer(pb, VAR_6, WC3_PREAMBLE_SIZE)) !=

            WC3_PREAMBLE_SIZE)

            VAR_5 = AVERROR(EIO);



        VAR_2 = AV_RL32(&VAR_6[0]);

        

        VAR_3 = (AV_RB32(&VAR_6[4]) + 1) & (~1);



        switch (VAR_2) {



        case BRCH_TAG:

            

            break;



        case SHOT_TAG:

            

            if ((VAR_5 = get_buffer(pb, VAR_6, 4)) != 4)

                return AVERROR(EIO);

            VAR_8 = AV_RL32(&VAR_6[0]);

            if (VAR_8 >= wc3->palette_count)

                return AVERROR_INVALIDDATA;

            VAR_13 = VAR_8 * PALETTE_COUNT * 3;

            for (VAR_14 = 0; VAR_14 < PALETTE_COUNT; VAR_14++) {

                VAR_10 = wc3->palettes[VAR_13 + VAR_14 * 3 + 0];

                VAR_11 = wc3->palettes[VAR_13 + VAR_14 * 3 + 1];

                VAR_12 = wc3->palettes[VAR_13 + VAR_14 * 3 + 2];

                wc3->palette_control.palette[VAR_14] = (VAR_10 << 16) | (VAR_11 << 8) | (VAR_12);

            }

            wc3->palette_control.palette_changed = 1;

            break;



        case VGA__TAG:

            

            VAR_5= av_get_packet(pb, VAR_1, VAR_3);

            VAR_1->stream_index = wc3->video_stream_index;

            VAR_1->pts = wc3->pts;

            if (VAR_5 != VAR_3)

                VAR_5 = AVERROR(EIO);

            VAR_4 = 1;

            break;



        case TEXT_TAG:

            

#if 0

            url_fseek(pb, VAR_3, SEEK_CUR);

#else

            if ((unsigned)VAR_3 > sizeof(VAR_7) || (VAR_5 = get_buffer(pb, VAR_7, VAR_3)) != VAR_3)

                VAR_5 = AVERROR(EIO);

            else {

                int VAR_14 = 0;

                av_log (VAR_0, AV_LOG_DEBUG, "Subtitle time!\n");

                av_log (VAR_0, AV_LOG_DEBUG, "  inglish: %VAR_0\n", &VAR_7[VAR_14 + 1]);

                VAR_14 += VAR_7[VAR_14] + 1;

                av_log (VAR_0, AV_LOG_DEBUG, "  doytsch: %VAR_0\n", &VAR_7[VAR_14 + 1]);

                VAR_14 += VAR_7[VAR_14] + 1;

                av_log (VAR_0, AV_LOG_DEBUG, "  fronsay: %VAR_0\n", &VAR_7[VAR_14 + 1]);

            }

#endif

            break;



        case AUDI_TAG:

            

            VAR_5= av_get_packet(pb, VAR_1, VAR_3);

            VAR_1->stream_index = wc3->audio_stream_index;

            VAR_1->pts = wc3->pts;

            if (VAR_5 != VAR_3)

                VAR_5 = AVERROR(EIO);



            

            wc3->pts++;



            VAR_4 = 1;

            break;



        default:

            av_log (VAR_0, AV_LOG_ERROR, "  unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",

                VAR_6[0], VAR_6[1], VAR_6[2], VAR_6[3],

                VAR_6[0], VAR_6[1], VAR_6[2], VAR_6[3]);

            VAR_5 = AVERROR_INVALIDDATA;

            VAR_4 = 1;

            break;

        }

    }



    return VAR_5;

}

static int FUNC_0(AVFormatContext *VAR_0,
AVPacket *VAR_1)
{ Wc3DemuxContext *wc3 = VAR_0->priv_data; ByteIOContext *pb = VAR_0->pb; unsigned int VAR_2; unsigned int VAR_3; int VAR_4 = 0; int VAR_5 = 0; unsigned char VAR_6[WC3_PREAMBLE_SIZE]; unsigned char VAR_7[1024]; unsigned int VAR_8; int VAR_14; unsigned char VAR_10, VAR_11, VAR_12; int VAR_13; while (!VAR_4) { if ((VAR_5 = get_buffer(pb, VAR_6, WC3_PREAMBLE_SIZE)) !=
WC3_PREAMBLE_SIZE)
VAR_5 = AVERROR(EIO); VAR_2 = AV_RL32(&VAR_6[0]); VAR_3 = (AV_RB32(&VAR_6[4]) + 1) & (~1); switch (VAR_2) { case BRCH_TAG:
break; case SHOT_TAG:
if ((VAR_5 = get_buffer(pb, VAR_6, 4)) != 4)
return AVERROR(EIO); VAR_8 = AV_RL32(&VAR_6[0]); if (VAR_8 >= wc3->palette_count)
return AVERROR_INVALIDDATA; VAR_13 = VAR_8 * PALETTE_COUNT * 3; for (VAR_14 = 0; VAR_14 < PALETTE_COUNT; VAR_14++) { VAR_10 = wc3->palettes[VAR_13 + VAR_14 * 3 + 0]; VAR_11 = wc3->palettes[VAR_13 + VAR_14 * 3 + 1]; VAR_12 = wc3->palettes[VAR_13 + VAR_14 * 3 + 2]; wc3->palette_control.palette[VAR_14] = (VAR_10 << 16) | (VAR_11 << 8) | (VAR_12); } wc3->palette_control.palette_changed = 1; break; case VGA__TAG:
VAR_5= av_get_packet(pb, VAR_1, VAR_3); VAR_1->stream_index = wc3->video_stream_index; VAR_1->pts = wc3->pts; if (VAR_5 != VAR_3)
VAR_5 = AVERROR(EIO); VAR_4 = 1; break; case TEXT_TAG:
#if 0
url_fseek(pb, VAR_3, SEEK_CUR); #else
if ((unsigned)VAR_3 > sizeof(VAR_7) || (VAR_5 = get_buffer(pb, VAR_7, VAR_3)) != VAR_3)
VAR_5 = AVERROR(EIO); else { int VAR_14 = 0; av_log (VAR_0, AV_LOG_DEBUG, "Subtitle time!\n"); av_log (VAR_0, AV_LOG_DEBUG, "  inglish: %VAR_0\n", &VAR_7[VAR_14 + 1]); VAR_14 += VAR_7[VAR_14] + 1; av_log (VAR_0, AV_LOG_DEBUG, "  doytsch: %VAR_0\n", &VAR_7[VAR_14 + 1]); VAR_14 += VAR_7[VAR_14] + 1; av_log (VAR_0, AV_LOG_DEBUG, "  fronsay: %VAR_0\n", &VAR_7[VAR_14 + 1]); } #endif
break; case AUDI_TAG:
VAR_5= av_get_packet(pb, VAR_1, VAR_3); VAR_1->stream_index = wc3->audio_stream_index; VAR_1->pts = wc3->pts; if (VAR_5 != VAR_3)
VAR_5 = AVERROR(EIO); wc3->pts++; VAR_4 = 1; break; default:
av_log (VAR_0, AV_LOG_ERROR, "  unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",
VAR_6[0], VAR_6[1], VAR_6[2], VAR_6[3],
VAR_6[0], VAR_6[1], VAR_6[2], VAR_6[3]); VAR_5 = AVERROR_INVALIDDATA; VAR_4 = 1; break; } } return VAR_5; }