Commit 6e14ddd1 authored by Andreas Rheinhardt's avatar Andreas Rheinhardt Committed by Michael Niedermayer

avformat/bethsoftvid: Avoid allocations and frees for palettes

by putting the palette in the demuxer's context. This also allows to
remove this demuxer's read_close-function.
Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Reviewed-by: 's avatarPaul B Mahol <onemda@gmail.com>
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent ea46b45e
...@@ -49,7 +49,8 @@ typedef struct BVID_DemuxContext ...@@ -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, ...@@ -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, ...@@ -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);
vid->has_palette = 0;
av_freep(&vid->palette);
} }
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, ...@@ -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, ...@@ -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 = { ...@@ -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,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment