jv: detect partial packets in the demuxer
authorJanne Grunau <janne-libav@jannau.net>
Wed, 12 Feb 2014 19:08:52 +0000 (20:08 +0100)
committerJanne Grunau <janne-libav@jannau.net>
Wed, 12 Feb 2014 19:12:18 +0000 (20:12 +0100)
Fixes fate-jv under valgrind which reports a different CRC for the last
frame from a partial read.

libavformat/jvdec.c

index 006acec..84d55da 100644 (file)
@@ -184,16 +184,22 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
         case JV_VIDEO:
             jv->state++;
             if (jvf->video_size || jvf->palette_size) {
+                int ret;
                 int size = jvf->video_size + jvf->palette_size;
                 if (av_new_packet(pkt, size + JV_PREAMBLE_SIZE))
                     return AVERROR(ENOMEM);
 
                 AV_WL32(pkt->data, jvf->video_size);
                 pkt->data[4] = jvf->video_type;
-                if (avio_read(pb, pkt->data + JV_PREAMBLE_SIZE, size) < 0)
-                    return AVERROR(EIO);
-
-                pkt->size         = size + JV_PREAMBLE_SIZE;
+                ret = avio_read(pb, pkt->data + JV_PREAMBLE_SIZE, size);
+                if (ret < 0)
+                    return ret;
+                if (ret < size) {
+                    memset(pkt->data + JV_PREAMBLE_SIZE + ret, 0,
+                           FF_INPUT_BUFFER_PADDING_SIZE);
+                    pkt->flags |= AV_PKT_FLAG_CORRUPT;
+                }
+                pkt->size         = ret + JV_PREAMBLE_SIZE;
                 pkt->stream_index = 1;
                 pkt->pts          = jv->pts;
                 if (jvf->video_type != 1)