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;
