diff options
author | Kent Mein <mein@cs.umn.edu> | 2006-06-06 22:55:55 +0400 |
---|---|---|
committer | Kent Mein <mein@cs.umn.edu> | 2006-06-06 22:55:55 +0400 |
commit | 2222e4cbc14405a9e0e82c0d94c528a48de43eae (patch) | |
tree | 4777762059915e4ab6cd03d169c99eebdd226195 /source/blender/avi | |
parent | 8bc669797839796f5282c0373c371144fb7dc7bd (diff) |
Made it so avi code handles "dropped frames"
some avi's have 0 sized chunks that we were not handling properly.
(Need to basically rewind the avi to previous frame in this case)
http://www.cs.umn.edu/~mein/blender/avi/examp.avi has 25 frames,
4,7 and 9 are "dropped frames"
blender use to crash on these now it displays the frame before it assuming
there is one.
Kent
Diffstat (limited to 'source/blender/avi')
-rw-r--r-- | source/blender/avi/intern/avi.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index a02308dde27..f9995a222c7 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -448,30 +448,40 @@ AviError AVI_open_movie (char *name, AviMovie *movie) { } void *AVI_read_frame (AviMovie *movie, AviFormat format, int frame, int stream) { - int cur_frame=-1, i=0, temp; + int cur_frame, temp, i, rewind=1; void *buffer; - /* Retrieve the record number of the desired frame in the index */ - - while (cur_frame < frame && i < movie->index_entries) { - if (fcc_is_data (movie->entries[i].ChunkId) && - fcc_get_stream (movie->entries[i].ChunkId) == stream) - cur_frame++; - - i++; + /* Retrieve the record number of the desired frame in the index + If a chunk has Size 0 we need to rewind to previous frame */ + while(rewind && frame > -1) { + i=0; + cur_frame=-1; + rewind = 0; + + while (cur_frame < frame && i < movie->index_entries) { + if (fcc_is_data (movie->entries[i].ChunkId) && + fcc_get_stream (movie->entries[i].ChunkId) == stream) { + if ((cur_frame == frame -1) && (movie->entries[i].Size == 0)) { + rewind = 1; + frame = frame -1; + } else { + cur_frame++; + } + } + i++; + } } if (cur_frame != frame) return NULL; - + + fseek (movie->fp, movie->read_offset + movie->entries[i-1].Offset, SEEK_SET); temp = GET_FCC(movie->fp); buffer = MEM_mallocN (temp,"readbuffer"); -/* buffer = malloc(temp); */ if (fread (buffer, 1, temp, movie->fp) != temp) { MEM_freeN(buffer); -/* free(buffer); */ return NULL; } |