mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-30 23:10:32 +00:00
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>
This commit is contained in:
parent
ea46b45e9c
commit
6e14ddd156
@ -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,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user