aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-03-21 04:30:27 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2020-03-22 13:00:19 +0100
commit6e14ddd1567e215957b754c2863ec715f74607b9 (patch)
treefa83b079a5d652d4d8e459292d8f99d858542d54 /libavformat
parentea46b45e9c5475a62d37c9d79fe0ae038a04bdef (diff)
downloadffmpeg-6e14ddd1567e215957b754c2863ec715f74607b9.tar.gz
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: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/bethsoftvid.c25
1 files changed, 7 insertions, 18 deletions
diff --git a/libavformat/bethsoftvid.c b/libavformat/bethsoftvid.c
index 4aefb04f14..2d5171a01c 100644
--- a/libavformat/bethsoftvid.c
+++ b/libavformat/bethsoftvid.c
@@ -49,7 +49,8 @@ typedef struct BVID_DemuxContext
int bethsoft_global_delay;
int video_index; /**< video stream index */
int audio_index; /**< audio stream index */
- uint8_t *palette;
+ int has_palette;
+ uint8_t palette[BVID_PALETTE_SIZE];
int is_finished;
@@ -188,7 +189,7 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
pkt->flags |= AV_PKT_FLAG_KEY;
/* 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,
BVID_PALETTE_SIZE);
if (!pdata) {
@@ -197,8 +198,7 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
goto fail;
}
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
@@ -222,17 +222,14 @@ static int vid_read_packet(AVFormatContext *s,
block_type = avio_r8(pb);
switch(block_type){
case PALETTE_BLOCK:
- if (vid->palette) {
+ if (vid->has_palette) {
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) {
- av_freep(&vid->palette);
return AVERROR(EIO);
}
+ vid->has_palette = 1;
return vid_read_packet(s, pkt);
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 = {
.name = "bethsoftvid",
.long_name = NULL_IF_CONFIG_SMALL("Bethesda Softworks VID"),
@@ -298,5 +288,4 @@ AVInputFormat ff_bethsoftvid_demuxer = {
.read_probe = vid_probe,
.read_header = vid_read_header,
.read_packet = vid_read_packet,
- .read_close = vid_read_close,
};