Commit 2fbc01b9 authored by Christophe Massiot's avatar Christophe Massiot

Elementary Stream input plugin (use it with --input es). Only works with

video streams at the moment.
parent f406134a
......@@ -2,7 +2,7 @@
* input.h: structures of the input not exported to other modules
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
* $Id: input.h,v 1.37 2001/05/30 17:03:11 sam Exp $
* $Id: input.h,v 1.38 2001/06/27 09:53:56 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -80,6 +80,8 @@ void input_EscapeAudioDiscontinuity( struct input_thread_s *,
* Prototypes from input_clock.c
*****************************************************************************/
void input_ClockInit( struct pgrm_descriptor_s * );
int input_ClockManageControl( struct input_thread_s *,
struct pgrm_descriptor_s *, mtime_t );
void input_ClockManageRef( struct input_thread_s *,
struct pgrm_descriptor_s *, mtime_t );
mtime_t input_ClockGetTS( struct input_thread_s *,
......
......@@ -4,7 +4,7 @@
* control the pace of reading.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
* $Id: input_ext-intf.h,v 1.39 2001/06/09 17:01:21 stef Exp $
* $Id: input_ext-intf.h,v 1.40 2001/06/27 09:53:56 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -255,6 +255,7 @@ typedef struct i_p_config_s
* This structure includes all the local static variables of an input thread
*****************************************************************************/
struct vout_thread_s;
struct bit_stream_s;
typedef struct input_thread_s
{
......@@ -273,6 +274,11 @@ typedef struct input_thread_s
void (* pf_open)( struct input_thread_s * );
void (* pf_close)( struct input_thread_s * );
void (* pf_end)( struct input_thread_s * );
void (* pf_init_bit_stream)( struct bit_stream_s *,
struct decoder_fifo_s *,
void (* pf_bitstream_callback)( struct bit_stream_s *,
boolean_t ),
void * );
/* Read & Demultiplex */
int (* pf_read)( struct input_thread_s *,
......
......@@ -2,7 +2,7 @@
* modules.h : Module management functions.
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: modules.h,v 1.25 2001/05/30 17:03:11 sam Exp $
* $Id: modules.h,v 1.26 2001/06/27 09:53:56 massiot Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
......@@ -78,6 +78,8 @@ struct input_area_s;
struct imdct_s;
struct complex_s;
struct dm_par_s;
struct bit_stream_s;
struct decoder_fifo_s;
/* FIXME: not yet used */
typedef struct probedata_s
......@@ -110,6 +112,11 @@ typedef struct function_list_s
void ( * pf_open ) ( struct input_thread_s * );
void ( * pf_close )( struct input_thread_s * );
void ( * pf_end ) ( struct input_thread_s * );
void ( * pf_init_bit_stream ) ( struct bit_stream_s *,
struct decoder_fifo_s *,
void (* pf_bitstream_callback)( struct bit_stream_s *,
boolean_t ),
void * );
int ( * pf_read ) ( struct input_thread_s *,
struct data_packet_s *
......
......@@ -10,7 +10,7 @@
* -dvd_udf to find files
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
* $Id: input_dvd.c,v 1.76 2001/06/15 05:12:30 sam Exp $
* $Id: input_dvd.c,v 1.77 2001/06/27 09:53:56 massiot Exp $
*
* Author: Stphane Borel <stef@via.ecp.fr>
*
......@@ -133,6 +133,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list )
input.pf_open = DVDOpen;
input.pf_close = DVDClose;
input.pf_end = DVDEnd;
input.pf_init_bit_stream = InitBitstream;
input.pf_read = DVDRead;
input.pf_set_area = DVDSetArea;
input.pf_demux = input_DemuxPS;
......
This diff is collapsed.
......@@ -2,7 +2,7 @@
* input_es.h: thread structure of the ES plugin
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: input_es.h,v 1.1 2001/04/20 15:02:48 sam Exp $
* $Id: input_es.h,v 1.2 2001/06/27 09:53:56 massiot Exp $
*
* Authors:
*
......@@ -21,12 +21,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* thread_es_data_t: extension of input_thread_t
*****************************************************************************/
typedef struct thread_es_data_s
{
/* We're necessarily reading a file. */
FILE * stream;
} thread_es_data_t;
#define NB_DATA 8192
#define NB_PES 4096
#define ES_PACKET_SIZE 2048
#define MAX_PACKETS_IN_FIFO 14
......@@ -2,7 +2,7 @@
* input_ps.c: PS demux and packet management
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: input_ps.c,v 1.28 2001/06/03 12:47:21 sam Exp $
* $Id: input_ps.c,v 1.29 2001/06/27 09:53:56 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Cyril Deguet <asmax@via.ecp.fr>
......@@ -99,6 +99,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list )
input.pf_open = NULL; /* Set in PSInit */
input.pf_close = NULL;
input.pf_end = PSEnd;
input.pf_init_bit_stream = InitBitstream;
input.pf_set_area = NULL;
input.pf_read = PSRead;
input.pf_demux = input_DemuxPS;
......
......@@ -2,7 +2,7 @@
* input_ts.c: TS demux and netlist management
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: input_ts.c,v 1.27 2001/06/21 07:22:03 sam Exp $
* $Id: input_ts.c,v 1.28 2001/06/27 09:53:57 massiot Exp $
*
* Authors: Henri Fallon <henri@videolan.org>
*
......@@ -106,6 +106,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list )
input.pf_open = TSFakeOpen;
input.pf_close = NULL; /* Will be set by pf_open */
input.pf_end = TSEnd;
input.pf_init_bit_stream = InitBitstream;
input.pf_set_area = NULL;
input.pf_read = TSRead;
input.pf_demux = input_DemuxTS;
......@@ -273,7 +274,8 @@ static int TSRead( input_thread_t * p_input,
data_packet_t * pp_packets[INPUT_READ_ONCE] )
{
thread_ts_data_t * p_method;
unsigned int i_read, i_loop;
unsigned int i_loop;
int i_read;
int i_data = 0;
struct iovec * p_iovec;
struct timeval timeout;
......
......@@ -4,7 +4,7 @@
* decoders.
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: input.c,v 1.124 2001/06/21 07:22:03 sam Exp $
* $Id: input.c,v 1.125 2001/06/27 09:53:57 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -407,6 +407,7 @@ static int InitThread( input_thread_t * p_input )
p_input->pf_close = f.pf_close;
}
p_input->pf_end = f.pf_end;
p_input->pf_init_bit_stream= f.pf_init_bit_stream;
p_input->pf_read = f.pf_read;
p_input->pf_set_area = f.pf_set_area;
p_input->pf_demux = f.pf_demux;
......
......@@ -2,7 +2,7 @@
* input_clock.c: Clock/System date convertions, stream management
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
* $Id: input_clock.c,v 1.17 2001/06/09 17:01:22 stef Exp $
* $Id: input_clock.c,v 1.18 2001/06/27 09:53:57 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -140,6 +140,78 @@ void input_ClockInit( pgrm_descriptor_t * p_pgrm )
p_pgrm->c_average_count = 0;
}
/*****************************************************************************
* input_ClockManageControl: handles the messages from the interface
*****************************************************************************
* Returns UNDEF_S if nothing happened, PAUSE_S if the stream was paused
*****************************************************************************/
int input_ClockManageControl( input_thread_t * p_input,
pgrm_descriptor_t * p_pgrm, mtime_t i_clock )
{
int i_return_value = UNDEF_S;
vlc_mutex_lock( &p_input->stream.stream_lock );
if( p_input->stream.i_new_status == PAUSE_S )
{
int i_old_status;
vlc_mutex_lock( &p_input->stream.control.control_lock );
i_old_status = p_input->stream.control.i_status;
p_input->stream.control.i_status = PAUSE_S;
vlc_cond_wait( &p_input->stream.stream_wait,
&p_input->stream.stream_lock );
ClockNewRef( p_input, p_pgrm, i_clock, mdate() );
if( p_input->stream.i_new_status == PAUSE_S )
{
/* PAUSE_S undoes the pause state: Return to old state. */
p_input->stream.control.i_status = i_old_status;
p_input->stream.i_new_status = UNDEF_S;
p_input->stream.i_new_rate = UNDEF_S;
}
/* We handle i_new_status != PAUSE_S below... */
vlc_mutex_unlock( &p_input->stream.control.control_lock );
i_return_value = PAUSE_S;
}
if( p_input->stream.i_new_status != UNDEF_S )
{
vlc_mutex_lock( &p_input->stream.control.control_lock );
p_input->stream.control.i_status = p_input->stream.i_new_status;
ClockNewRef( p_input, p_pgrm, i_clock,
ClockToSysdate( p_input, p_pgrm, i_clock ) );
if( p_input->stream.control.i_status == PLAYING_S )
{
p_input->stream.control.i_rate = DEFAULT_RATE;
p_input->stream.control.b_mute = 0;
}
else
{
p_input->stream.control.i_rate = p_input->stream.i_new_rate;
p_input->stream.control.b_mute = 1;
/* Feed the audio decoders with a NULL packet to avoid
* discontinuities. */
input_EscapeAudioDiscontinuity( p_input, p_pgrm );
}
p_input->stream.i_new_status = UNDEF_S;
p_input->stream.i_new_rate = UNDEF_S;
vlc_mutex_unlock( &p_input->stream.control.control_lock );
}
vlc_mutex_unlock( &p_input->stream.stream_lock );
return( i_return_value );
}
/*****************************************************************************
* input_ClockManageRef: manages a clock reference
*****************************************************************************/
......@@ -193,62 +265,7 @@ void input_ClockManageRef( input_thread_t * p_input,
mwait( p_pgrm->last_syscr );
/* Now take into account interface changes. */
vlc_mutex_lock( &p_input->stream.stream_lock );
if( p_input->stream.i_new_status == PAUSE_S )
{
int i_old_status;
vlc_mutex_lock( &p_input->stream.control.control_lock );
i_old_status = p_input->stream.control.i_status;
p_input->stream.control.i_status = PAUSE_S;
vlc_cond_wait( &p_input->stream.stream_wait,
&p_input->stream.stream_lock );
ClockNewRef( p_input, p_pgrm, i_clock, mdate() );
if( p_input->stream.i_new_status == PAUSE_S )
{
/* PAUSE_S undoes the pause state: Return to old state. */
p_input->stream.control.i_status = i_old_status;
p_input->stream.i_new_status = UNDEF_S;
p_input->stream.i_new_rate = UNDEF_S;
}
/* We handle i_new_status != PAUSE_S below... */
vlc_mutex_unlock( &p_input->stream.control.control_lock );
}
if( p_input->stream.i_new_status != UNDEF_S )
{
vlc_mutex_lock( &p_input->stream.control.control_lock );
p_input->stream.control.i_status = p_input->stream.i_new_status;
ClockNewRef( p_input, p_pgrm, i_clock,
ClockToSysdate( p_input, p_pgrm, i_clock ) );
if( p_input->stream.control.i_status == PLAYING_S )
{
p_input->stream.control.i_rate = DEFAULT_RATE;
p_input->stream.control.b_mute = 0;
}
else
{
p_input->stream.control.i_rate = p_input->stream.i_new_rate;
p_input->stream.control.b_mute = 1;
/* Feed the audio decoders with a NULL packet to avoid
* discontinuities. */
input_EscapeAudioDiscontinuity( p_input, p_pgrm );
}
p_input->stream.i_new_status = UNDEF_S;
p_input->stream.i_new_rate = UNDEF_S;
vlc_mutex_unlock( &p_input->stream.control.control_lock );
}
vlc_mutex_unlock( &p_input->stream.stream_lock );
input_ClockManageControl( p_input, p_pgrm, i_clock );
}
else
{
......
......@@ -2,7 +2,7 @@
* input_programs.c: es_descriptor_t, pgrm_descriptor_t management
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
* $Id: input_programs.c,v 1.58 2001/06/12 18:16:49 stef Exp $
* $Id: input_programs.c,v 1.59 2001/06/27 09:53:57 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -520,7 +520,7 @@ static int InitDecConfig( input_thread_t * p_input, es_descriptor_t * p_es,
p_config->p_decoder_fifo->pf_delete_pes = p_input->pf_delete_pes;
p_es->p_decoder_fifo = p_config->p_decoder_fifo;
p_config->pf_init_bit_stream = InitBitstream;
p_config->pf_init_bit_stream = p_input->pf_init_bit_stream;
p_input->stream.i_selected_es_number++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment