+/*****************************************************************************
+ * SeekIndex: goto to i_date or i_percent
+ *****************************************************************************/
+static int SeekPercent( demux_t *p_demux, int i_query, va_list args )
+{
+ demux_sys_t *p_sys = p_demux->p_sys;
+ return demux_vaControlHelper( p_demux->s, p_sys->i_data_begin,
+ p_sys->i_data_end, p_sys->i_bitrate,
+ p_sys->p_fp->i_min_data_packet_size,
+ i_query, args );
+}
+
+static int SeekIndex( demux_t *p_demux, mtime_t i_date, float f_pos )
+{
+ demux_sys_t *p_sys = p_demux->p_sys;
+ asf_object_index_t *p_index;
+
+ msg_Dbg( p_demux, "seek with index: %i seconds, position %f",
+ i_date >= 0 ? (int)(i_date/1000000) : -1, f_pos );
+
+ if( i_date < 0 )
+ i_date = p_sys->i_length * f_pos;
+
+ p_index = ASF_FindObject( p_sys->p_root, &asf_object_index_guid, 0 );
+
+ uint64_t i_entry = i_date * 10 / p_index->i_index_entry_time_interval;
+ if( i_entry >= p_index->i_index_entry_count )
+ {
+ msg_Warn( p_demux, "Incomplete index" );
+ return VLC_EGENERIC;
+ }
+
+ uint64_t i_offset = (uint64_t)p_index->index_entry[i_entry].i_packet_number *
+ p_sys->p_fp->i_min_data_packet_size;
+ return stream_Seek( p_demux->s, p_sys->i_data_begin + i_offset );
+}
+
+static void SeekPrepare( demux_t *p_demux )
+{
+ demux_sys_t *p_sys = p_demux->p_sys;
+
+ p_sys->i_time = -1;
+ for( int i = 0; i < 128 ; i++ )
+ {
+ asf_track_t *tk = p_sys->track[i];
+ if( !tk )
+ continue;
+
+ tk->i_time = 1;
+ if( tk->p_frame )
+ block_ChainRelease( tk->p_frame );
+ tk->p_frame = NULL;
+ }
+}
+