Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Mein <mein@cs.umn.edu>2006-06-06 22:55:55 +0400
committerKent Mein <mein@cs.umn.edu>2006-06-06 22:55:55 +0400
commit2222e4cbc14405a9e0e82c0d94c528a48de43eae (patch)
tree4777762059915e4ab6cd03d169c99eebdd226195 /source/blender/avi
parent8bc669797839796f5282c0373c371144fb7dc7bd (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.c34
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;
}