|
@@ -49,7 +49,8 @@ typedef struct BVID_DemuxContext |
|
|
int bethsoft_global_delay; |
|
|
int bethsoft_global_delay; |
|
|
int video_index; /**< video stream index */ |
|
|
int video_index; /**< video stream index */ |
|
|
int audio_index; /**< audio stream index */ |
|
|
int audio_index; /**< audio stream index */ |
|
|
uint8_t *palette; |
|
|
|
|
|
|
|
|
int has_palette; |
|
|
|
|
|
uint8_t palette[BVID_PALETTE_SIZE]; |
|
|
|
|
|
|
|
|
int is_finished; |
|
|
int is_finished; |
|
|
|
|
|
|
|
@@ -188,7 +189,7 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt, |
|
|
pkt->flags |= AV_PKT_FLAG_KEY; |
|
|
pkt->flags |= AV_PKT_FLAG_KEY; |
|
|
|
|
|
|
|
|
/* if there is a new palette available, add it to packet side data */ |
|
|
/* if there is a new palette available, add it to packet side data */ |
|
|
if (vid->palette) { |
|
|
|
|
|
|
|
|
if (vid->has_palette) { |
|
|
uint8_t *pdata = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, |
|
|
uint8_t *pdata = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, |
|
|
BVID_PALETTE_SIZE); |
|
|
BVID_PALETTE_SIZE); |
|
|
if (!pdata) { |
|
|
if (!pdata) { |
|
@@ -197,8 +198,7 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt, |
|
|
goto fail; |
|
|
goto fail; |
|
|
} |
|
|
} |
|
|
memcpy(pdata, vid->palette, BVID_PALETTE_SIZE); |
|
|
memcpy(pdata, vid->palette, BVID_PALETTE_SIZE); |
|
|
|
|
|
|
|
|
av_freep(&vid->palette); |
|
|
|
|
|
|
|
|
vid->has_palette = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
vid->nframes--; // used to check if all the frames were read |
|
|
vid->nframes--; // used to check if all the frames were read |
|
@@ -222,17 +222,14 @@ static int vid_read_packet(AVFormatContext *s, |
|
|
block_type = avio_r8(pb); |
|
|
block_type = avio_r8(pb); |
|
|
switch(block_type){ |
|
|
switch(block_type){ |
|
|
case PALETTE_BLOCK: |
|
|
case PALETTE_BLOCK: |
|
|
if (vid->palette) { |
|
|
|
|
|
|
|
|
if (vid->has_palette) { |
|
|
av_log(s, AV_LOG_WARNING, "discarding unused palette\n"); |
|
|
av_log(s, AV_LOG_WARNING, "discarding unused palette\n"); |
|
|
av_freep(&vid->palette); |
|
|
|
|
|
|
|
|
vid->has_palette = 0; |
|
|
} |
|
|
} |
|
|
vid->palette = av_malloc(BVID_PALETTE_SIZE); |
|
|
|
|
|
if (!vid->palette) |
|
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
if (avio_read(pb, vid->palette, BVID_PALETTE_SIZE) != BVID_PALETTE_SIZE) { |
|
|
if (avio_read(pb, vid->palette, BVID_PALETTE_SIZE) != BVID_PALETTE_SIZE) { |
|
|
av_freep(&vid->palette); |
|
|
|
|
|
return AVERROR(EIO); |
|
|
return AVERROR(EIO); |
|
|
} |
|
|
} |
|
|
|
|
|
vid->has_palette = 1; |
|
|
return vid_read_packet(s, pkt); |
|
|
return vid_read_packet(s, pkt); |
|
|
|
|
|
|
|
|
case FIRST_AUDIO_BLOCK: |
|
|
case FIRST_AUDIO_BLOCK: |
|
@@ -284,13 +281,6 @@ static int vid_read_packet(AVFormatContext *s, |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int vid_read_close(AVFormatContext *s) |
|
|
|
|
|
{ |
|
|
|
|
|
BVID_DemuxContext *vid = s->priv_data; |
|
|
|
|
|
av_freep(&vid->palette); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
AVInputFormat ff_bethsoftvid_demuxer = { |
|
|
AVInputFormat ff_bethsoftvid_demuxer = { |
|
|
.name = "bethsoftvid", |
|
|
.name = "bethsoftvid", |
|
|
.long_name = NULL_IF_CONFIG_SMALL("Bethesda Softworks VID"), |
|
|
.long_name = NULL_IF_CONFIG_SMALL("Bethesda Softworks VID"), |
|
@@ -298,5 +288,4 @@ AVInputFormat ff_bethsoftvid_demuxer = { |
|
|
.read_probe = vid_probe, |
|
|
.read_probe = vid_probe, |
|
|
.read_header = vid_read_header, |
|
|
.read_header = vid_read_header, |
|
|
.read_packet = vid_read_packet, |
|
|
.read_packet = vid_read_packet, |
|
|
.read_close = vid_read_close, |
|
|
|
|
|
}; |
|
|
}; |