@ -1420,7 +1420,8 @@ static void matroska_clear_queue(MatroskaDemuxContext *matroska)
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(MatroskaDemuxContext *matroska, uint8_t *data,
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(MatroskaDemuxContext *matroska)
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(MatroskaDemuxContext *matroska)
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 ;