static void tt_bsearch_Insert( tt_time_t **pp_times, size_t *pi_times, tt_time_t time ) { bool b_exists; size_t i_index = tt_timings_FindLowerIndex( *pp_times, *pi_times, time, &b_exists ); if( b_exists ) return; if( SIZE_MAX / sizeof(tt_time_t) < (*pi_times + 1) ) return; tt_time_t *p_array = realloc( *pp_times, (*pi_times + 1) * sizeof(tt_time_t) ); if( !p_array ) return; *pp_times = p_array; if( *pi_times > 0 ) { memmove( &p_array[i_index + 1], &p_array[i_index], (*pi_times - i_index) * sizeof(tt_time_t) ); } p_array[i_index] = time; *pi_times += 1; }
static int Control( demux_t* p_demux, int i_query, va_list args ) { demux_sys_t *p_sys = p_demux->p_sys; int64_t *pi64, i64; double *pf, f; bool b; switch( i_query ) { case DEMUX_CAN_SEEK: *va_arg( args, bool * ) = true; return VLC_SUCCESS; case DEMUX_GET_TIME: pi64 = va_arg( args, int64_t * ); *pi64 = p_sys->i_next_demux_time; return VLC_SUCCESS; case DEMUX_SET_TIME: i64 = va_arg( args, int64_t ); if( p_sys->times.i_count ) { tt_time_t t = tt_time_Create( i64 - VLC_TS_0 ); size_t i_index = tt_timings_FindLowerIndex( p_sys->times.p_array, p_sys->times.i_count, t, &b ); p_sys->times.i_current = i_index; p_sys->b_first_time = true; return VLC_SUCCESS; } break; case DEMUX_SET_NEXT_DEMUX_TIME: i64 = va_arg( args, int64_t ); p_sys->i_next_demux_time = i64; p_sys->b_slave = true; return VLC_SUCCESS; case DEMUX_GET_LENGTH: pi64 = va_arg( args, int64_t * ); if( p_sys->times.i_count ) { tt_time_t t = tt_time_Sub( p_sys->times.p_array[p_sys->times.i_count - 1], p_sys->temporal_extent.begin ); *pi64 = tt_time_Convert( &t ); return VLC_SUCCESS; } break; case DEMUX_GET_POSITION: pf = va_arg( args, double * ); if( p_sys->times.i_current >= p_sys->times.i_count ) { *pf = 1.0; } else if( p_sys->times.i_count > 0 ) { i64 = tt_time_Convert( &p_sys->times.p_array[p_sys->times.i_count - 1] ); *pf = (double) p_sys->i_next_demux_time / (i64 + 0.5); } else { *pf = 0.0; } return VLC_SUCCESS; case DEMUX_SET_POSITION: f = va_arg( args, double ); if( p_sys->times.i_count ) { i64 = f * tt_time_Convert( &p_sys->times.p_array[p_sys->times.i_count - 1] ); tt_time_t t = tt_time_Create( i64 ); size_t i_index = tt_timings_FindLowerIndex( p_sys->times.p_array, p_sys->times.i_count, t, &b ); p_sys->times.i_current = i_index; p_sys->b_first_time = true; return VLC_SUCCESS; } break; case DEMUX_GET_PTS_DELAY: case DEMUX_GET_FPS: case DEMUX_GET_META: case DEMUX_GET_ATTACHMENTS: case DEMUX_GET_TITLE_INFO: case DEMUX_HAS_UNSUPPORTED_META: case DEMUX_CAN_RECORD: default: break; } return VLC_EGENERIC; }