static void tt_timings_MergeSequential( const tt_timings_t *p_restrict, const tt_timings_t *p_prevref, tt_timings_t *p_local ) { if( tt_time_Valid( &p_local->begin ) ) p_local->begin = tt_time_Add( p_local->begin, p_prevref->end ); else p_local->begin = p_prevref->end; if( tt_time_Valid( &p_local->end ) ) { p_local->end = tt_time_Add( p_local->end, p_prevref->end ); } else if( tt_time_Valid( &p_local->dur ) && tt_time_Valid( &p_local->begin ) ) { p_local->end = tt_time_Add( p_local->begin, p_local->dur ); } /* Enforce contained duration */ if( tt_time_Valid( &p_restrict->end ) && tt_time_Compare( &p_local->end, &p_restrict->end ) > 0 ) p_local->end = p_restrict->end; /* Just for consistency */ if( tt_time_Valid( &p_local->begin ) && tt_time_Valid( &p_local->end ) ) p_local->dur = tt_time_Sub( p_local->end, p_local->begin ); }
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; }