|
|
|
@ -69,7 +69,7 @@ typedef struct Wc3DemuxContext { |
|
|
|
|
int video_stream_index; |
|
|
|
|
int audio_stream_index; |
|
|
|
|
|
|
|
|
|
AVPacket vpkt; |
|
|
|
|
AVPacket *vpkt; |
|
|
|
|
|
|
|
|
|
} Wc3DemuxContext; |
|
|
|
|
|
|
|
|
@ -77,8 +77,7 @@ static int wc3_read_close(AVFormatContext *s) |
|
|
|
|
{ |
|
|
|
|
Wc3DemuxContext *wc3 = s->priv_data; |
|
|
|
|
|
|
|
|
|
if (wc3->vpkt.size > 0) |
|
|
|
|
av_packet_unref(&wc3->vpkt); |
|
|
|
|
av_packet_free(&wc3->vpkt); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -110,8 +109,9 @@ static int wc3_read_header(AVFormatContext *s) |
|
|
|
|
wc3->height = WC3_DEFAULT_HEIGHT; |
|
|
|
|
wc3->pts = 0; |
|
|
|
|
wc3->video_stream_index = wc3->audio_stream_index = 0; |
|
|
|
|
av_init_packet(&wc3->vpkt); |
|
|
|
|
wc3->vpkt.data = NULL; wc3->vpkt.size = 0; |
|
|
|
|
wc3->vpkt = av_packet_alloc(); |
|
|
|
|
if (!wc3->vpkt) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
|
|
/* skip the first 3 32-bit numbers */ |
|
|
|
|
avio_skip(pb, 12); |
|
|
|
@ -162,7 +162,7 @@ static int wc3_read_header(AVFormatContext *s) |
|
|
|
|
case PALT_TAG: |
|
|
|
|
/* one of several palettes */ |
|
|
|
|
avio_seek(pb, -8, SEEK_CUR); |
|
|
|
|
av_append_packet(pb, &wc3->vpkt, 8 + PALETTE_SIZE); |
|
|
|
|
av_append_packet(pb, wc3->vpkt, 8 + PALETTE_SIZE); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
@ -248,18 +248,17 @@ static int wc3_read_packet(AVFormatContext *s, |
|
|
|
|
case SHOT_TAG: |
|
|
|
|
/* load up new palette */ |
|
|
|
|
avio_seek(pb, -8, SEEK_CUR); |
|
|
|
|
av_append_packet(pb, &wc3->vpkt, 8 + 4); |
|
|
|
|
av_append_packet(pb, wc3->vpkt, 8 + 4); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case VGA__TAG: |
|
|
|
|
/* send out video chunk */ |
|
|
|
|
avio_seek(pb, -8, SEEK_CUR); |
|
|
|
|
ret= av_append_packet(pb, &wc3->vpkt, 8 + size); |
|
|
|
|
ret= av_append_packet(pb, wc3->vpkt, 8 + size); |
|
|
|
|
// ignore error if we have some data
|
|
|
|
|
if (wc3->vpkt.size > 0) |
|
|
|
|
if (wc3->vpkt->size > 0) |
|
|
|
|
ret = 0; |
|
|
|
|
*pkt = wc3->vpkt; |
|
|
|
|
wc3->vpkt.data = NULL; wc3->vpkt.size = 0; |
|
|
|
|
av_packet_move_ref(pkt, wc3->vpkt); |
|
|
|
|
pkt->stream_index = wc3->video_stream_index; |
|
|
|
|
pkt->pts = wc3->pts; |
|
|
|
|
packet_read = 1; |
|
|
|
|