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 @@ ...@@ -2,7 +2,7 @@
* input.h: structures of the input not exported to other modules * input.h: structures of the input not exported to other modules
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -80,6 +80,8 @@ void input_EscapeAudioDiscontinuity( struct input_thread_s *, ...@@ -80,6 +80,8 @@ void input_EscapeAudioDiscontinuity( struct input_thread_s *,
* Prototypes from input_clock.c * Prototypes from input_clock.c
*****************************************************************************/ *****************************************************************************/
void input_ClockInit( struct pgrm_descriptor_s * ); 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 *, void input_ClockManageRef( struct input_thread_s *,
struct pgrm_descriptor_s *, mtime_t ); struct pgrm_descriptor_s *, mtime_t );
mtime_t input_ClockGetTS( struct input_thread_s *, mtime_t input_ClockGetTS( struct input_thread_s *,
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* control the pace of reading. * control the pace of reading.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -255,6 +255,7 @@ typedef struct i_p_config_s ...@@ -255,6 +255,7 @@ typedef struct i_p_config_s
* This structure includes all the local static variables of an input thread * This structure includes all the local static variables of an input thread
*****************************************************************************/ *****************************************************************************/
struct vout_thread_s; struct vout_thread_s;
struct bit_stream_s;
typedef struct input_thread_s typedef struct input_thread_s
{ {
...@@ -273,6 +274,11 @@ typedef struct input_thread_s ...@@ -273,6 +274,11 @@ typedef struct input_thread_s
void (* pf_open)( struct input_thread_s * ); void (* pf_open)( struct input_thread_s * );
void (* pf_close)( struct input_thread_s * ); void (* pf_close)( struct input_thread_s * );
void (* pf_end)( 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 */ /* Read & Demultiplex */
int (* pf_read)( struct input_thread_s *, int (* pf_read)( struct input_thread_s *,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* modules.h : Module management functions. * modules.h : Module management functions.
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * 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> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -78,6 +78,8 @@ struct input_area_s; ...@@ -78,6 +78,8 @@ struct input_area_s;
struct imdct_s; struct imdct_s;
struct complex_s; struct complex_s;
struct dm_par_s; struct dm_par_s;
struct bit_stream_s;
struct decoder_fifo_s;
/* FIXME: not yet used */ /* FIXME: not yet used */
typedef struct probedata_s typedef struct probedata_s
...@@ -110,6 +112,11 @@ typedef struct function_list_s ...@@ -110,6 +112,11 @@ typedef struct function_list_s
void ( * pf_open ) ( struct input_thread_s * ); void ( * pf_open ) ( struct input_thread_s * );
void ( * pf_close )( struct input_thread_s * ); void ( * pf_close )( struct input_thread_s * );
void ( * pf_end ) ( 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 *, int ( * pf_read ) ( struct input_thread_s *,
struct data_packet_s * struct data_packet_s *
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* -dvd_udf to find files * -dvd_udf to find files
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2001 VideoLAN * 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> * Author: Stphane Borel <stef@via.ecp.fr>
* *
...@@ -133,6 +133,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list ) ...@@ -133,6 +133,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list )
input.pf_open = DVDOpen; input.pf_open = DVDOpen;
input.pf_close = DVDClose; input.pf_close = DVDClose;
input.pf_end = DVDEnd; input.pf_end = DVDEnd;
input.pf_init_bit_stream = InitBitstream;
input.pf_read = DVDRead; input.pf_read = DVDRead;
input.pf_set_area = DVDSetArea; input.pf_set_area = DVDSetArea;
input.pf_demux = input_DemuxPS; input.pf_demux = input_DemuxPS;
......
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_es.h: thread structure of the ES plugin * input_es.h: thread structure of the ES plugin
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * 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: * Authors:
* *
...@@ -21,12 +21,7 @@ ...@@ -21,12 +21,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/ *****************************************************************************/
/***************************************************************************** #define NB_DATA 8192
* thread_es_data_t: extension of input_thread_t #define NB_PES 4096
*****************************************************************************/ #define ES_PACKET_SIZE 2048
typedef struct thread_es_data_s #define MAX_PACKETS_IN_FIFO 14
{
/* We're necessarily reading a file. */
FILE * stream;
} thread_es_data_t;
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_ps.c: PS demux and packet management * input_ps.c: PS demux and packet management
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* Cyril Deguet <asmax@via.ecp.fr> * Cyril Deguet <asmax@via.ecp.fr>
...@@ -99,6 +99,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list ) ...@@ -99,6 +99,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list )
input.pf_open = NULL; /* Set in PSInit */ input.pf_open = NULL; /* Set in PSInit */
input.pf_close = NULL; input.pf_close = NULL;
input.pf_end = PSEnd; input.pf_end = PSEnd;
input.pf_init_bit_stream = InitBitstream;
input.pf_set_area = NULL; input.pf_set_area = NULL;
input.pf_read = PSRead; input.pf_read = PSRead;
input.pf_demux = input_DemuxPS; input.pf_demux = input_DemuxPS;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_ts.c: TS demux and netlist management * input_ts.c: TS demux and netlist management
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Henri Fallon <henri@videolan.org>
* *
...@@ -106,6 +106,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list ) ...@@ -106,6 +106,7 @@ void _M( input_getfunctions )( function_list_t * p_function_list )
input.pf_open = TSFakeOpen; input.pf_open = TSFakeOpen;
input.pf_close = NULL; /* Will be set by pf_open */ input.pf_close = NULL; /* Will be set by pf_open */
input.pf_end = TSEnd; input.pf_end = TSEnd;
input.pf_init_bit_stream = InitBitstream;
input.pf_set_area = NULL; input.pf_set_area = NULL;
input.pf_read = TSRead; input.pf_read = TSRead;
input.pf_demux = input_DemuxTS; input.pf_demux = input_DemuxTS;
...@@ -273,7 +274,8 @@ static int TSRead( input_thread_t * p_input, ...@@ -273,7 +274,8 @@ static int TSRead( input_thread_t * p_input,
data_packet_t * pp_packets[INPUT_READ_ONCE] ) data_packet_t * pp_packets[INPUT_READ_ONCE] )
{ {
thread_ts_data_t * p_method; thread_ts_data_t * p_method;
unsigned int i_read, i_loop; unsigned int i_loop;
int i_read;
int i_data = 0; int i_data = 0;
struct iovec * p_iovec; struct iovec * p_iovec;
struct timeval timeout; struct timeval timeout;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* decoders. * decoders.
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -407,6 +407,7 @@ static int InitThread( input_thread_t * p_input ) ...@@ -407,6 +407,7 @@ static int InitThread( input_thread_t * p_input )
p_input->pf_close = f.pf_close; p_input->pf_close = f.pf_close;
} }
p_input->pf_end = f.pf_end; 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_read = f.pf_read;
p_input->pf_set_area = f.pf_set_area; p_input->pf_set_area = f.pf_set_area;
p_input->pf_demux = f.pf_demux; p_input->pf_demux = f.pf_demux;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_clock.c: Clock/System date convertions, stream management * input_clock.c: Clock/System date convertions, stream management
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -141,58 +141,15 @@ void input_ClockInit( pgrm_descriptor_t * p_pgrm ) ...@@ -141,58 +141,15 @@ void input_ClockInit( pgrm_descriptor_t * p_pgrm )
} }
/***************************************************************************** /*****************************************************************************
* input_ClockManageRef: manages a clock reference * input_ClockManageControl: handles the messages from the interface
*****************************************************************************
* Returns UNDEF_S if nothing happened, PAUSE_S if the stream was paused
*****************************************************************************/ *****************************************************************************/
void input_ClockManageRef( input_thread_t * p_input, int input_ClockManageControl( input_thread_t * p_input,
pgrm_descriptor_t * p_pgrm, mtime_t i_clock ) pgrm_descriptor_t * p_pgrm, mtime_t i_clock )
{ {
if( ( p_pgrm->i_synchro_state != SYNCHRO_OK ) || ( i_clock == 0 ) ) int i_return_value = UNDEF_S;
{
/* Feed synchro with a new reference point. */
ClockNewRef( p_input, p_pgrm, i_clock, mdate() );
p_pgrm->i_synchro_state = SYNCHRO_OK;
if( p_input->stream.b_pace_control
&& p_input->stream.pp_programs[0] == p_pgrm )
{
p_pgrm->last_cr = i_clock;
mwait( ClockToSysdate( p_input, p_pgrm, i_clock ) );
}
else
{
p_pgrm->last_cr = 0;
p_pgrm->last_syscr = 0;
p_pgrm->delta_cr = 0;
p_pgrm->c_average_count = 0;
}
}
else
{
if ( p_pgrm->last_cr != 0 &&
( (p_pgrm->last_cr - i_clock) > CR_MAX_GAP
|| (p_pgrm->last_cr - i_clock) < - CR_MAX_GAP ) )
{
/* Stream discontinuity, for which we haven't received a
* warning from the stream control facilities (dd-edited
* stream ?). */
intf_WarnMsg( 1, "Clock gap, unexpected stream discontinuity" );
input_ClockInit( p_pgrm );
p_pgrm->i_synchro_state = SYNCHRO_START;
input_EscapeDiscontinuity( p_input, p_pgrm );
}
p_pgrm->last_cr = i_clock;
if( p_input->stream.b_pace_control
&& p_input->stream.pp_programs[0] == p_pgrm )
{
/* Wait a while before delivering the packets to the decoder.
* In case of multiple programs, we arbitrarily follow the
* clock of the first program. */
p_pgrm->last_syscr = ClockToSysdate( p_input, p_pgrm, i_clock );
mwait( p_pgrm->last_syscr );
/* Now take into account interface changes. */
vlc_mutex_lock( &p_input->stream.stream_lock ); vlc_mutex_lock( &p_input->stream.stream_lock );
if( p_input->stream.i_new_status == PAUSE_S ) if( p_input->stream.i_new_status == PAUSE_S )
...@@ -216,6 +173,8 @@ void input_ClockManageRef( input_thread_t * p_input, ...@@ -216,6 +173,8 @@ void input_ClockManageRef( input_thread_t * p_input,
/* We handle i_new_status != PAUSE_S below... */ /* We handle i_new_status != PAUSE_S below... */
vlc_mutex_unlock( &p_input->stream.control.control_lock ); vlc_mutex_unlock( &p_input->stream.control.control_lock );
i_return_value = PAUSE_S;
} }
if( p_input->stream.i_new_status != UNDEF_S ) if( p_input->stream.i_new_status != UNDEF_S )
...@@ -249,6 +208,64 @@ void input_ClockManageRef( input_thread_t * p_input, ...@@ -249,6 +208,64 @@ void input_ClockManageRef( input_thread_t * p_input,
} }
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
return( i_return_value );
}
/*****************************************************************************
* input_ClockManageRef: manages a clock reference
*****************************************************************************/
void input_ClockManageRef( input_thread_t * p_input,
pgrm_descriptor_t * p_pgrm, mtime_t i_clock )
{
if( ( p_pgrm->i_synchro_state != SYNCHRO_OK ) || ( i_clock == 0 ) )
{
/* Feed synchro with a new reference point. */
ClockNewRef( p_input, p_pgrm, i_clock, mdate() );
p_pgrm->i_synchro_state = SYNCHRO_OK;
if( p_input->stream.b_pace_control
&& p_input->stream.pp_programs[0] == p_pgrm )
{
p_pgrm->last_cr = i_clock;
mwait( ClockToSysdate( p_input, p_pgrm, i_clock ) );
}
else
{
p_pgrm->last_cr = 0;
p_pgrm->last_syscr = 0;
p_pgrm->delta_cr = 0;
p_pgrm->c_average_count = 0;
}
}
else
{
if ( p_pgrm->last_cr != 0 &&
( (p_pgrm->last_cr - i_clock) > CR_MAX_GAP
|| (p_pgrm->last_cr - i_clock) < - CR_MAX_GAP ) )
{
/* Stream discontinuity, for which we haven't received a
* warning from the stream control facilities (dd-edited
* stream ?). */
intf_WarnMsg( 1, "Clock gap, unexpected stream discontinuity" );
input_ClockInit( p_pgrm );
p_pgrm->i_synchro_state = SYNCHRO_START;
input_EscapeDiscontinuity( p_input, p_pgrm );
}
p_pgrm->last_cr = i_clock;
if( p_input->stream.b_pace_control
&& p_input->stream.pp_programs[0] == p_pgrm )
{
/* Wait a while before delivering the packets to the decoder.
* In case of multiple programs, we arbitrarily follow the
* clock of the first program. */
p_pgrm->last_syscr = ClockToSysdate( p_input, p_pgrm, i_clock );
mwait( p_pgrm->last_syscr );
/* Now take into account interface changes. */
input_ClockManageControl( p_input, p_pgrm, i_clock );
} }
else else
{ {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_programs.c: es_descriptor_t, pgrm_descriptor_t management * input_programs.c: es_descriptor_t, pgrm_descriptor_t management
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -520,7 +520,7 @@ static int InitDecConfig( input_thread_t * p_input, es_descriptor_t * p_es, ...@@ -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_config->p_decoder_fifo->pf_delete_pes = p_input->pf_delete_pes;
p_es->p_decoder_fifo = p_config->p_decoder_fifo; 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++; 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