Mercurial > libavformat.hg
changeset 3897:5aa1cbbd79e0 libavformat
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.
author | aurel |
---|---|
date | Sat, 06 Sep 2008 23:39:59 +0000 |
parents | c472578fa54d |
children | da23c86d54ec |
files | matroskadec.c |
diffstat | 1 files changed, 10 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/matroskadec.c Fri Sep 05 02:30:27 2008 +0000 +++ b/matroskadec.c Sat Sep 06 23:39:59 2008 +0000 @@ -1420,7 +1420,8 @@ 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 @@ 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 @@ 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 @@ 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;