OSDN Git Service

avidec: fix duration and bitrate of truncated files
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Mar 2013 12:06:08 +0000 (13:06 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Mar 2013 12:09:52 +0000 (13:09 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/avidec.c

index f648f4f..f6eb71e 100644 (file)
@@ -62,6 +62,7 @@ typedef struct {
     int64_t  riff_end;
     int64_t  movi_end;
     int64_t  fsize;
+    int64_t io_fsize;
     int64_t movi_list;
     int64_t last_pkt_pos;
     int index_loaded;
@@ -373,7 +374,7 @@ static int avi_read_header(AVFormatContext *s)
 
     av_log(avi, AV_LOG_DEBUG, "use odml:%d\n", avi->use_odml);
 
-    avi->fsize = avio_size(pb);
+    avi->io_fsize = avi->fsize = avio_size(pb);
     if(avi->fsize<=0 || avi->fsize < avi->riff_end)
         avi->fsize= avi->riff_end == 8 ? INT64_MAX : avi->riff_end;
 
@@ -569,8 +570,13 @@ static int avi_read_header(AVFormatContext *s)
             default:
                 av_log(s, AV_LOG_INFO, "unknown stream type %X\n", tag1);
             }
-            if(ast->sample_size == 0)
+            if(ast->sample_size == 0) {
                 st->duration = st->nb_frames;
+                if (st->duration > 0 && avi->io_fsize > 0 && avi->riff_end > avi->io_fsize) {
+                    av_log(s, AV_LOG_DEBUG, "File is truncated adjusting duration\n");
+                    st->duration = av_rescale(st->duration, avi->io_fsize, avi->riff_end);
+                }
+            }
             ast->frame_offset= ast->cum_len;
             avio_skip(pb, size - 12 * 4);
             break;