]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/bethsoftvid.c
avformat/tls_schannel: always decrypt all received data
[ffmpeg] / libavformat / bethsoftvid.c
index f516806d91c0494a7753b44219c5667e8d831068..47a9a693303442bdef4009ca26bd0616a02928d4 100644 (file)
@@ -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,
 };