void virtual_segment_c::Seek( demux_t & demuxer, mtime_t i_date, mtime_t i_time_offset, chapter_item_c *p_chapter, int64_t i_global_position ) { demux_sys_t *p_sys = demuxer.p_sys; size_t i; // find the actual time for an ordered edition if ( p_chapter == NULL ) { if ( CurrentEdition() && CurrentEdition()->b_ordered ) { /* 1st, we need to know in which chapter we are */ p_chapter = (*p_editions)[i_current_edition]->FindTimecode( i_date, p_current_chapter ); } } if ( p_chapter != NULL ) { p_current_chapter = p_chapter; p_sys->i_chapter_time = i_time_offset = p_chapter->i_user_start_time - p_chapter->i_start_time; if ( p_chapter->i_seekpoint_num > 0 ) { demuxer.info.i_update |= INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT; demuxer.info.i_title = p_sys->i_current_title = i_sys_title; demuxer.info.i_seekpoint = p_chapter->i_seekpoint_num - 1; } } // find the best matching segment for ( i=0; i<linked_segments.size(); i++ ) { if ( i_date < linked_segments[i]->i_start_time ) break; } if ( i > 0 ) i--; if ( i_current_segment != i ) { linked_segments[i_current_segment]->UnSelect(); linked_segments[i]->Select( i_date ); i_current_segment = i; } linked_segments[i]->Seek( i_date, i_time_offset, i_global_position ); }
virtual_chapter_c *virtual_segment_c::BrowseCodecPrivate( unsigned int codec_id, bool (*match)(const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size ), const void *p_cookie, size_t i_cookie_size ) { virtual_edition_c * p_ved = CurrentEdition(); if( p_ved ) return p_ved->BrowseCodecPrivate( codec_id, match, p_cookie, i_cookie_size ); return NULL; }