Example #1
0
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 );
}