#include "input.h"
/*****************************************************************************
- * input_Play: comes back to the normal pace of reading
+ * input_SetStatus: change the reading status
*****************************************************************************/
-void input_Play( input_thread_t * p_input )
+void input_SetStatus( input_thread_t * p_input, int i_mode )
{
- intf_Msg( "input: playing at normal rate" );
vlc_mutex_lock( &p_input->stream.stream_lock );
- p_input->stream.i_new_status = PLAYING_S;
+
+ switch( i_mode )
+ {
+ case INPUT_STATUS_END:
+ p_input->stream.i_new_status = PLAYING_S;
+ p_input->b_eof = 1;
+ intf_Msg( "input: end of stream" );
+ break;
+
+ case INPUT_STATUS_PLAY:
+ p_input->stream.i_new_status = PLAYING_S;
+ intf_Msg( "input: playing at normal rate" );
+ break;
+
+ case INPUT_STATUS_PAUSE:
+ /* XXX: we don't need to check i_status, because input_clock.c
+ * does it for us */
+ p_input->stream.i_new_status = PAUSE_S;
+ intf_Msg( "input: toggling pause" );
+ break;
+
+ case INPUT_STATUS_FASTER:
+ /* If we are already going too fast, go back to default rate */
+ if( p_input->stream.control.i_rate * 8 <= DEFAULT_RATE )
+ {
+ p_input->stream.i_new_status = PLAYING_S;
+ intf_Msg( "input: playing at normal rate" );
+ }
+ else
+ {
+ p_input->stream.i_new_status = FORWARD_S;
+
+ if( p_input->stream.control.i_rate < DEFAULT_RATE
+ && p_input->stream.control.i_status == FORWARD_S )
+ {
+ p_input->stream.i_new_rate =
+ p_input->stream.control.i_rate / 2;
+ }
+ else
+ {
+ p_input->stream.i_new_rate = DEFAULT_RATE / 2;
+ }
+ intf_Msg( "input: playing at %i:1 fast forward",
+ DEFAULT_RATE / p_input->stream.i_new_rate );
+ }
+ break;
+
+ case INPUT_STATUS_SLOWER:
+ /* If we are already going too slow, go back to default rate */
+ if( p_input->stream.control.i_rate >= 8 * DEFAULT_RATE )
+ {
+ p_input->stream.i_new_status = PLAYING_S;
+ intf_Msg( "input: playing at normal rate" );
+ }
+ else
+ {
+ p_input->stream.i_new_status = FORWARD_S;
+
+ if( p_input->stream.control.i_rate > DEFAULT_RATE
+ && p_input->stream.control.i_status == FORWARD_S )
+ {
+ p_input->stream.i_new_rate =
+ p_input->stream.control.i_rate * 2;
+ }
+ else
+ {
+ p_input->stream.i_new_rate = DEFAULT_RATE * 2;
+ }
+ intf_Msg( "input: playing at 1:%i slow motion",
+ p_input->stream.i_new_rate / DEFAULT_RATE );
+ }
+ break;
+
+ default:
+ }
+
+ vlc_cond_signal( &p_input->stream.stream_wait );
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
+}
+
+/*****************************************************************************
+ * input_SetRate: change the reading rate
+ *****************************************************************************/
+void input_SetRate( input_thread_t * p_input, int i_mode )
+{
+ ; /* FIXME: stub */
+}
+
+/*****************************************************************************
+ * input_Seek: changes the stream postion
+ *****************************************************************************/
+void input_Seek( input_thread_t * p_input, off_t i_position )
+{
+ char psz_time1[OFFSETTOTIME_MAX_SIZE];
+ char psz_time2[OFFSETTOTIME_MAX_SIZE];
+
+ vlc_mutex_lock( &p_input->stream.stream_lock );
+ p_input->stream.p_selected_area->i_seek = i_position;
+
+ intf_Msg( "input: seeking position %lld/%lld (%s/%s)", i_position,
+ p_input->stream.p_selected_area->i_size,
+ input_OffsetToTime( p_input, psz_time1, i_position ),
+ input_OffsetToTime( p_input, psz_time2,
+ p_input->stream.p_selected_area->i_size ) );
+
vlc_cond_signal( &p_input->stream.stream_wait );
vlc_mutex_unlock( &p_input->stream.stream_lock );
}
/*****************************************************************************
- * input_Forward: manages fast forward and slow motion
+ * input_OffsetToTime : converts an off_t value to a time indicator, using
+ * mux_rate
*****************************************************************************
- * Note that if i_rate > DEFAULT_RATE, the pace is slower.
+ * BEWARE : this function assumes that you already own the lock on
+ * p_input->stream.stream_lock
*****************************************************************************/
-void input_Forward( input_thread_t * p_input, int i_rate )
+char * input_OffsetToTime( input_thread_t * p_input, char * psz_buffer,
+ off_t i_offset )
{
- if ( i_rate > DEFAULT_RATE )
- {
- intf_Msg( "input: playing at 1:%i slow motion", i_rate / 1000 );
- }
- else if( i_rate < DEFAULT_RATE )
+ mtime_t i_seconds;
+
+ if( p_input->stream.i_mux_rate )
{
- intf_Msg( "input: playing at %i:1 fast forward", 1000 / i_rate );
+ i_seconds = i_offset / 50 / p_input->stream.i_mux_rate;
+ snprintf( psz_buffer, OFFSETTOTIME_MAX_SIZE, "%d:%02d:%02d",
+ (int) (i_seconds / (60 * 60)),
+ (int) (i_seconds / 60 % 60),
+ (int) (i_seconds % 60) );
+ return( psz_buffer );
}
else
{
- /* Not very joli, but this is going to disappear soon anyway */
- input_Play( p_input );
- return;
+ /* Divide by zero is not my friend. */
+ sprintf( psz_buffer, "-:--:--" );
+ return( psz_buffer );
}
-
- vlc_mutex_lock( &p_input->stream.stream_lock );
- p_input->stream.i_new_status = FORWARD_S;
- p_input->stream.i_new_rate = i_rate;
- vlc_cond_signal( &p_input->stream.stream_wait );
- vlc_mutex_unlock( &p_input->stream.stream_lock );
}
/*****************************************************************************
- * input_Pause: temporarily stops the reading of the stream
+ * input_DumpStream: dumps the contents of a stream descriptor
+ *****************************************************************************
+ * BEWARE : this function assumes that you already own the lock on
+ * p_input->stream.stream_lock
*****************************************************************************/
-void input_Pause( input_thread_t * p_input )
+void input_DumpStream( input_thread_t * p_input )
{
- intf_Msg( "input: paused" );
- vlc_mutex_lock( &p_input->stream.stream_lock );
- p_input->stream.i_new_status = PAUSE_S;
- vlc_cond_signal( &p_input->stream.stream_wait );
- vlc_mutex_unlock( &p_input->stream.stream_lock );
+ int i, j;
+ char psz_time1[OFFSETTOTIME_MAX_SIZE];
+ char psz_time2[OFFSETTOTIME_MAX_SIZE];
+
+#define S p_input->stream
+ intf_Msg( "input info: Dumping stream ID 0x%x", S.i_stream_id );
+ if( S.b_seekable )
+ intf_Msg( "input info: seekable stream, position: %lld/%lld (%s/%s)",
+ S.p_selected_area->i_tell, S.p_selected_area->i_size,
+ input_OffsetToTime( p_input, psz_time1,
+ S.p_selected_area->i_tell ),
+ input_OffsetToTime( p_input, psz_time2,
+ S.p_selected_area->i_size ) );
+ else
+ intf_Msg( "input info: %s", S.b_pace_control ? "pace controlled" :
+ "pace un-controlled" );
+#undef S
+ for( i = 0; i < p_input->stream.i_pgrm_number; i++ )
+ {
+#define P p_input->stream.pp_programs[i]
+ intf_Msg( "input info: Dumping program 0x%x, version %d (%s)",
+ P->i_number, P->i_version,
+ P->b_is_ok ? "complete" : "partial" );
+#undef P
+ for( j = 0; j < p_input->stream.pp_programs[i]->i_es_number; j++ )
+ {
+#define ES p_input->stream.pp_programs[i]->pp_es[j]
+ intf_Msg( "input info: ES 0x%x, stream 0x%x, type 0x%x, %s",
+ ES->i_id, ES->i_stream_id, ES->i_type,
+ ES->p_decoder_fifo != NULL ? "selected" : "not selected");
+#undef ES
+ }
+ }
}
/*****************************************************************************
- * input_Seek: changes the stream postion
+ * input_ChangeES: answers to a user request with calls to (Un)SelectES
+ * ---
+ * Useful since the interface plugins know p_es
*****************************************************************************/
-void input_Seek( input_thread_t * p_input, off_t i_position )
+int input_ChangeES( input_thread_t * p_input, es_descriptor_t * p_es,
+ int i_type )
{
- intf_Msg( "input: seeking position %lld/%lld", i_position,
- p_input->stream.i_size );
+ boolean_t b_audio;
+ boolean_t b_spu;
+ int i_index;
+ int i;
+
+ i_index = -1;
+ b_audio = ( i_type == 1 ) ? 1 : 0;
+ b_spu = ( i_type == 2 ) ? 1 : 0;
+
vlc_mutex_lock( &p_input->stream.stream_lock );
- p_input->stream.i_seek = i_position;
- vlc_cond_signal( &p_input->stream.stream_wait );
+
+ for( i = 0 ; i < p_input->stream.i_selected_es_number ; i++ )
+ {
+ if( ( b_audio && p_input->stream.pp_selected_es[i]->b_audio )
+ || ( b_spu && p_input->stream.pp_selected_es[i]->b_spu ) )
+ {
+ i_index = i;
+ break;
+ }
+ }
+
+
+ if( p_es != NULL )
+ {
+
+
+ if( i_index != -1 )
+ {
+
+ if( p_input->stream.pp_selected_es[i_index] != p_es )
+ {
+ input_UnselectES( p_input,
+ p_input->stream.pp_selected_es[i_index] );
+ input_SelectES( p_input, p_es );
+ intf_WarnMsg( 1, "input info: es selected -> %s (0x%x)",
+ p_es->psz_desc, p_es->i_id );
+ }
+ }
+ else
+ {
+ input_SelectES( p_input, p_es );
+ intf_WarnMsg( 1, "input info: es selected -> %s (0x%x)",
+ p_es->psz_desc, p_es->i_id );
+ }
+ }
+ else
+ {
+ if( i_index != -1 )
+ {
+ intf_WarnMsg( 1, "input info: es unselected -> %s (0x%x)",
+ p_input->stream.pp_selected_es[i_index]->psz_desc,
+ p_input->stream.pp_selected_es[i_index]->i_id );
+
+ input_UnselectES( p_input,
+ p_input->stream.pp_selected_es[i_index] );
+ }
+ }
+
vlc_mutex_unlock( &p_input->stream.stream_lock );
-}
+ return 0;
+}