Allow reading of growing avi files (currently being written)
authorJoakim Plate <elupus@ecce.se>
Fri, 5 Dec 2014 03:06:50 +0000 (03:06 +0000)
committerVittorio Giovara <vittorio.giovara@gmail.com>
Mon, 8 Dec 2014 13:29:33 +0000 (13:29 +0000)
This uses the RIFF header stored size to figure out the expected AVI
file size, instead of the actual file. To work fully it requires handling
failed avio_seek() instead of assuming they always succeed.

Some fate file has been cut off and contains half a frame at the end which
previously was not output during demuxing. This frame is now output to
encoder, thus the fate diff update.

Bug-Id: 261
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
libavformat/avidec.c
tests/ref/fate/aasc
tests/ref/fate/cllc-argb
tests/ref/fate/cllc-rgb
tests/ref/fate/cllc-yuy2-noblock
tests/ref/fate/cvid-partial
tests/ref/fate/fic-avi
tests/ref/fate/truemotion1-24
tests/ref/fate/vp5
tests/ref/fate/zmbv-8bit

index c24a6c4..e7202de 100644 (file)
@@ -151,7 +151,7 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num)
     AVIStream *ast;
     int i;
     int64_t last_pos = -1;
-    int64_t filesize = avio_size(s->pb);
+    int64_t filesize = avi->fsize;
 
     av_dlog(s,
             "longs_pre_entry:%d index_type:%d entries_in_use:%d "
@@ -374,7 +374,7 @@ static int avi_read_header(AVFormatContext *s)
         return ret;
 
     avi->fsize = avio_size(pb);
-    if (avi->fsize <= 0)
+    if (avi->fsize <= 0 || avi->fsize < avi->riff_end)
         avi->fsize = avi->riff_end == 8 ? INT64_MAX : avi->riff_end;
 
     /* first list tag */
@@ -402,7 +402,7 @@ static int avi_read_header(AVFormatContext *s)
                 if (size)
                     avi->movi_end = avi->movi_list + size + (size & 1);
                 else
-                    avi->movi_end = avio_size(pb);
+                    avi->movi_end = avi->fsize;
                 av_dlog(NULL, "movi end=%"PRIx64"\n", avi->movi_end);
                 goto end_of_header;
             } else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
@@ -774,7 +774,7 @@ static int avi_read_header(AVFormatContext *s)
                 if (s->error_recognition & AV_EF_EXPLODE)
                     goto fail;
                 avi->movi_list = avio_tell(pb) - 4;
-                avi->movi_end  = avio_size(pb);
+                avi->movi_end  = avi->fsize;
                 goto end_of_header;
             }
             /* skip tag */
index 57d59a9..83f83b9 100644 (file)
@@ -22,3 +22,4 @@
 0,         20,         20,        1,   168000, 0x7a2b1006
 0,         21,         21,        1,   168000, 0xc7ca1345
 0,         22,         22,        1,   168000, 0x8841c413
+0,         23,         23,        1,   168000, 0xbaed0290
index 0283863..4a5dce5 100644 (file)
@@ -3,3 +3,4 @@
 0,          1,          1,        1,  3686400, 0x66a45032
 0,          2,          2,        1,  3686400, 0xdf0c861f
 0,          3,          3,        1,  3686400, 0xa4a68cdb
+0,          4,          4,        1,  3686400, 0xb5f9526e
index 06d54da..b4ca055 100644 (file)
@@ -13,3 +13,4 @@
 0,         11,         11,        1,   921600, 0x4d7488fa
 0,         12,         12,        1,   921600, 0x16b9c9c9
 0,         13,         13,        1,   921600, 0xa0a4f77f
+0,         14,         14,        1,   921600, 0xf61a5501
index 2cb9e78..6ad59d5 100644 (file)
@@ -14,3 +14,4 @@
 0,         12,         12,        1,   614400, 0x2d8fd7cc
 0,         13,         13,        1,   614400, 0xd9dfc2ef
 0,         14,         14,        1,   614400, 0xaf95cef0
+0,         15,         15,        1,   614400, 0x6dcf5ed6
index 71596b4..907ef4a 100644 (file)
@@ -77,3 +77,4 @@
 0,         75,         75,        1,   112400, 0xe4394f1f
 0,         76,         76,        1,   112400, 0x8ca8649f
 0,         77,         77,        1,   112400, 0x804d44eb
+0,         78,         78,        1,   112400, 0x3864488b
index e2b26a3..cc4ea5d 100644 (file)
 0,        117,        117,        1,  1566720, 0xfe83b964
 0,        118,        118,        1,  1566720, 0x25dc30a6
 0,        119,        119,        1,  1566720, 0x25dc30a6
+0,        120,        120,        1,  1566720, 0x25dc30a6
index f097ed0..73bb9e7 100644 (file)
@@ -14,3 +14,4 @@
 0,         12,         12,        1,    69120, 0xf55d74c7
 0,         13,         13,        1,    69120, 0xb5082ca7
 0,         14,         14,        1,    69120, 0x5876d758
+0,         15,         15,        1,    69120, 0x45e7dd5c
index 791fe60..0e601ba 100644 (file)
 0,        243,        243,        1,   233472, 0x6f530ac6
 0,        244,        244,        1,   233472, 0x94f7466c
 0,        245,        245,        1,   233472, 0xa8c1d365
+0,        246,        246,        1,   233472, 0xedcff050
index 64dacae..9f02ae3 100644 (file)
 0,        272,        272,        1,   192000, 0xd08e49d1
 0,        273,        273,        1,   192000, 0xd08e49d1
 0,        274,        274,        1,   192000, 0xd08e49d1
+0,        275,        275,        1,   192000, 0x1f34135f