void SegmentSeeker::index_unsearched_range( matroska_segment_c& ms, Range search_area, mtime_t max_pts ) { mkv_jump_to( ms, search_area.start ); search_area.start = ms.es.I_O().getFilePointer(); fptr_t block_pos = search_area.start; mtime_t block_pts = std::numeric_limits<mtime_t>::max(); while( block_pos < search_area.end ) { KaxBlock * block; KaxSimpleBlock * simpleblock; bool b_key_picture; bool b_discardable_picture; int64_t i_block_duration; matroska_segment_c::tracks_map_t::iterator i_track = ms.tracks.end(); if( ms.BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) ) { throw std::runtime_error( "Unable to BlockGet in SegmentSeeker::index_unsearched_range, EOF?" ); } if( simpleblock ) { block_pos = simpleblock->GetElementPosition(); block_pts = simpleblock->GlobalTimecode() / 1000; } else { block_pos = block->GetElementPosition(); block_pts = block->GlobalTimecode() / 1000; } if( ! ms.FindTrackByBlock( &i_track, block, simpleblock ) ) { if( b_key_picture ) { add_seekpoint( i_track->first, Seekpoint::TRUSTED, block_pos, block_pts ); } if( max_pts < block_pts ) break; } delete block; } search_area.end = ms.es.I_O().getFilePointer(); mark_range_as_searched( search_area ); }