]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/imx.c
avfilter/vf_identity: fix typo
[ffmpeg] / libavformat / imx.c
index 1c7f5be0a4f00b681b3fd5da459c4c6e8d0d8944..e26f3728ff2a9d212bcbd54f63e3836c65515a12 100644 (file)
@@ -31,6 +31,7 @@
 typedef struct SimbiosisIMXDemuxContext {
     uint8_t pal[AVPALETTE_SIZE];
     int pal_changed;
+    int64_t first_video_packet_pos;
 } SimbiosisIMXDemuxContext;
 
 static int simbiosis_imx_probe(const AVProbeData *p)
@@ -65,6 +66,7 @@ static int simbiosis_imx_read_header(AVFormatContext *s)
     vst->codecpar->format     = AV_PIX_FMT_PAL8;
     vst->codecpar->codec_id   = AV_CODEC_ID_SIMBIOSIS_IMX;
     vst->start_time = 0;
+    vst->duration =
     vst->nb_frames = avio_rl32(pb);
     rate = avio_rl16(pb);
     avio_skip(pb, 12);
@@ -107,8 +109,12 @@ retry:
         break;
     case 0xAA97:
         idx = 0;
+        if (!imx->first_video_packet_pos)
+            imx->first_video_packet_pos = pos;
         break;
     case 0xAA98:
+        if (chunk_size > 256 * 3)
+            return AVERROR_INVALIDDATA;
         for (int i = 0; i < chunk_size / 3; i++) {
             unsigned r = avio_r8(pb) << 18;
             unsigned g = avio_r8(pb) << 10;
@@ -137,6 +143,9 @@ retry:
             return AVERROR(ENOMEM);
         memcpy(pal, imx->pal, AVPALETTE_SIZE);
         imx->pal_changed = 0;
+        if (pos <= imx->first_video_packet_pos)
+            pkt->flags |= AV_PKT_FLAG_KEY;
+    } else if (idx == 1) {
         pkt->flags |= AV_PKT_FLAG_KEY;
     }
 
@@ -147,7 +156,7 @@ retry:
     return ret;
 }
 
-AVInputFormat ff_simbiosis_imx_demuxer = {
+const AVInputFormat ff_simbiosis_imx_demuxer = {
     .name           = "simbiosis_imx",
     .long_name      = NULL_IF_CONFIG_SMALL("Simbiosis Interactive IMX"),
     .priv_data_size = sizeof(SimbiosisIMXDemuxContext),