+ return VLC_SUCCESS;
+}
+#endif
+
+static void InitTitle( input_thread_t * p_input )
+{
+ vlc_value_t val;
+
+ if( p_input->b_preparsing ) return;
+
+ /* Create global title (from master) */
+ p_input->p->i_title = p_input->p->input.i_title;
+ p_input->p->title = p_input->p->input.title;
+ p_input->p->i_title_offset = p_input->p->input.i_title_offset;
+ p_input->p->i_seekpoint_offset = p_input->p->input.i_seekpoint_offset;
+ if( p_input->p->i_title > 0 )
+ {
+ /* Setup variables */
+ input_ControlVarNavigation( p_input );
+ input_ControlVarTitle( p_input, 0 );
+ }
+
+ /* Global flag */
+ p_input->b_can_pace_control = p_input->p->input.b_can_pace_control;
+ p_input->p->b_can_pause = p_input->p->input.b_can_pause;
+ p_input->p->b_can_rate_control = p_input->p->input.b_can_rate_control;
+
+ /* Fix pts delay */
+ if( p_input->i_pts_delay < 0 )
+ p_input->i_pts_delay = 0;
+
+ /* If the desynchronisation requested by the user is < 0, we need to
+ * cache more data. */
+ var_Get( p_input, "audio-desync", &val );
+ if( val.i_int < 0 )
+ p_input->i_pts_delay -= (val.i_int * 1000);
+
+ /* Update cr_average depending on the caching */
+ p_input->p->input.i_cr_average *= (10 * p_input->i_pts_delay / 200000);
+ p_input->p->input.i_cr_average /= 10;
+ if( p_input->p->input.i_cr_average < 10 ) p_input->p->input.i_cr_average = 10;
+}
+
+static void StartTitle( input_thread_t * p_input )
+{
+ double f_fps;
+ vlc_value_t val;
+ int i_delay;
+ char *psz;
+ char *psz_subtitle;
+ int64_t i_length;
+
+ /* Start title/chapter */
+
+ if( p_input->b_preparsing )
+ {
+ p_input->p->i_start = 0;
+ return;
+ }
+
+ val.i_int = p_input->p->input.i_title_start -
+ p_input->p->input.i_title_offset;
+ if( val.i_int > 0 && val.i_int < p_input->p->input.i_title )
+ input_ControlPush( p_input, INPUT_CONTROL_SET_TITLE, &val );
+ val.i_int = p_input->p->input.i_seekpoint_start -
+ p_input->p->input.i_seekpoint_offset;
+ if( val.i_int > 0 /* TODO: check upper boundary */ )
+ input_ControlPush( p_input, INPUT_CONTROL_SET_SEEKPOINT, &val );
+
+ /* Start time*/
+ /* Set start time */
+ p_input->p->i_start = INT64_C(1000000) * var_GetInteger( p_input, "start-time" );
+ p_input->p->i_stop = INT64_C(1000000) * var_GetInteger( p_input, "stop-time" );
+ p_input->p->i_run = INT64_C(1000000) * var_GetInteger( p_input, "run-time" );
+ i_length = var_GetTime( p_input, "length" );
+ if( p_input->p->i_run < 0 )
+ {
+ msg_Warn( p_input, "invalid run-time ignored" );
+ p_input->p->i_run = 0;
+ }
+
+ if( p_input->p->i_start > 0 )
+ {
+ if( p_input->p->i_start >= i_length )
+ {
+ msg_Warn( p_input, "invalid start-time ignored" );
+ }
+ else