X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fbethsoftvid.c;h=47a9a693303442bdef4009ca26bd0616a02928d4;hb=1004a92cd44404ad55a75509cd289a70fa03d333;hp=f516806d91c0494a7753b44219c5667e8d831068;hpb=1f1ec958f6c68a5ceafea206a99c895f62d0f3ec;p=ffmpeg diff --git a/libavformat/bethsoftvid.c b/libavformat/bethsoftvid.c index f516806d91c..47a9a693303 100644 --- a/libavformat/bethsoftvid.c +++ b/libavformat/bethsoftvid.c @@ -49,13 +49,14 @@ 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; } BVID_DemuxContext; -static int vid_probe(AVProbeData *p) +static int vid_probe(const AVProbeData *p) { // little-endian VID tag, file starts with "VID\0" if (AV_RL32(p->buf) != MKTAG('V', 'I', 'D', 0)) @@ -146,9 +147,13 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt, } do{ - vidbuf_start = av_fast_realloc(vidbuf_start, &vidbuf_capacity, vidbuf_nbytes + BUFFER_PADDING_SIZE); - if(!vidbuf_start) - return AVERROR(ENOMEM); + uint8_t *tmp = av_fast_realloc(vidbuf_start, &vidbuf_capacity, + vidbuf_nbytes + BUFFER_PADDING_SIZE); + if (!tmp) { + ret = AVERROR(ENOMEM); + goto fail; + } + vidbuf_start = tmp; code = avio_r8(pb); vidbuf_start[vidbuf_nbytes++] = code; @@ -188,7 +193,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 +202,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 +226,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 +285,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 +292,4 @@ AVInputFormat ff_bethsoftvid_demuxer = { .read_probe = vid_probe, .read_header = vid_read_header, .read_packet = vid_read_packet, - .read_close = vid_read_close, };