dynamic index building so forward and backward seeking in avi without an index is...
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 5 Feb 2007 23:06:08 +0000 (23:06 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 5 Feb 2007 23:06:08 +0000 (23:06 +0000)
Originally committed as revision 7842 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avidec.c

index 273c20b..90fc6b3 100644 (file)
@@ -626,9 +626,9 @@ resync:
             pkt->stream_index = avi->stream_index;
 
             if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
             pkt->stream_index = avi->stream_index;
 
             if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
-                if(st->index_entries){
                     AVIndexEntry *e;
                     int index;
                     AVIndexEntry *e;
                     int index;
+                assert(st->index_entries);
 
                     index= av_index_search_timestamp(st, pkt->dts, 0);
                     e= &st->index_entries[index];
 
                     index= av_index_search_timestamp(st, pkt->dts, 0);
                     e= &st->index_entries[index];
@@ -637,11 +637,6 @@ resync:
                         if (e->flags & AVINDEX_KEYFRAME)
                             pkt->flags |= PKT_FLAG_KEY;
                     }
                         if (e->flags & AVINDEX_KEYFRAME)
                             pkt->flags |= PKT_FLAG_KEY;
                     }
-                } else {
-                    /* if no index, better to say that all frames
-                        are key frames */
-                    pkt->flags |= PKT_FLAG_KEY;
-                }
             } else {
                 pkt->flags |= PKT_FLAG_KEY;
             }
             } else {
                 pkt->flags |= PKT_FLAG_KEY;
             }
@@ -735,6 +730,13 @@ resync:
             avi->stream_index= n;
             ast->packet_size= size + 8;
             ast->remaining= size;
             avi->stream_index= n;
             ast->packet_size= size + 8;
             ast->remaining= size;
+
+            {
+                uint64_t pos= url_ftell(pb) - 8;
+                if(!st->index_entries || !st->nb_index_entries || st->index_entries[st->nb_index_entries - 1].pos < pos){
+                    av_add_index_entry(st, pos, ast->frame_offset / FFMAX(1, ast->sample_size), size, 0, AVINDEX_KEYFRAME);
+                }
+            }
             goto resync;
           }
         }
             goto resync;
           }
         }