[FFmpeg-cvslog] r15229 - trunk/libavformat/matroskadec.c

aurel subversion
Sun Sep 7 01:39:59 CEST 2008


Author: aurel
Date: Sun Sep  7 01:39:59 2008
New Revision: 15229

Log:
matroskadec: ensure that the timecode added to the index are is the one
of the actual keyframe block, and not the one of the start of the cluster
containing this block.


Modified:
   trunk/libavformat/matroskadec.c

Modified: trunk/libavformat/matroskadec.c
==============================================================================
--- trunk/libavformat/matroskadec.c	(original)
+++ trunk/libavformat/matroskadec.c	Sun Sep  7 01:39:59 2008
@@ -1420,7 +1420,8 @@ static void matroska_clear_queue(Matrosk
 
 static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
                                 int size, int64_t pos, uint64_t cluster_time,
-                                uint64_t duration, int is_keyframe)
+                                uint64_t duration, int is_keyframe,
+                                int64_t cluster_pos)
 {
     MatroskaTrack *track;
     int is_video_key_frame = is_keyframe, res = 0;
@@ -1545,8 +1546,12 @@ static int matroska_parse_block(Matroska
         uint64_t timecode = AV_NOPTS_VALUE;
 
         if (cluster_time != (uint64_t)-1
-            && (block_time >= 0 || cluster_time >= -block_time))
+            && (block_time >= 0 || cluster_time >= -block_time)) {
             timecode = cluster_time + block_time;
+            if (is_keyframe)
+                av_add_index_entry(st, cluster_pos, timecode,
+                                   0, 0, AVINDEX_KEYFRAME);
+        }
 
         for (n = 0; n < laces; n++) {
             if (st->codec->codec_id == CODEC_ID_RA_288 ||
@@ -1641,7 +1646,7 @@ static int matroska_parse_cluster(Matros
     MatroskaCluster cluster = { 0 };
     EbmlList *blocks_list;
     MatroskaBlock *blocks;
-    int i, res, key_frame = 0;
+    int i, res;
     offset_t pos = url_ftell(matroska->ctx->pb);
     if (matroska->has_cluster_id){
         /* For the first cluster we parse, its ID was already read as
@@ -1659,12 +1664,9 @@ static int matroska_parse_cluster(Matros
             res=matroska_parse_block(matroska,
                                      blocks[i].bin.data, blocks[i].bin.size,
                                      blocks[i].bin.pos,  cluster.timecode,
-                                     blocks[i].duration, !blocks[i].reference);
-            key_frame |= res > 0;
+                                     blocks[i].duration, !blocks[i].reference,
+                                     pos);
         }
-    if (key_frame)
-        av_add_index_entry(matroska->vstream, pos,
-                           cluster.timecode, 0, 0, AVINDEX_KEYFRAME);
     ebml_free(matroska_cluster, &cluster);
     if (res < 0)  matroska->done = 1;
     return res;




More information about the ffmpeg-cvslog mailing list