X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Fstream_demux.c;h=fe96fdf567fd5f7636a51fbf36df6dfeace4e7f3;hb=f7c9f8329d7b5aa5fb313d1a0409512db8eaa09f;hp=b2b76043784a1dfd87d4ee3e01988f93c0828eba;hpb=9f052b2bd26acc0d580e443dedb8681c287808ea;p=vlc diff --git a/src/input/stream_demux.c b/src/input/stream_demux.c index b2b7604378..fe96fdf567 100644 --- a/src/input/stream_demux.c +++ b/src/input/stream_demux.c @@ -24,6 +24,7 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include #include "demux.h" #include @@ -38,7 +39,7 @@ struct stream_sys_t block_fifo_t *p_fifo; block_t *p_block; - int64_t i_pos; + uint64_t i_pos; /* Demuxer */ char *psz_name; @@ -54,9 +55,9 @@ static void DStreamDelete ( stream_t * ); static void* DStreamThread ( vlc_object_t * ); -stream_t *__stream_DemuxNew( vlc_object_t *p_obj, const char *psz_demux, - es_out_t *out ) +stream_t *stream_DemuxNew( demux_t *p_demux, const char *psz_demux, es_out_t *out ) { + vlc_object_t *p_obj = VLC_OBJECT(p_demux); /* We create a stream reader, and launch a thread */ stream_t *s; stream_sys_t *p_sys; @@ -64,6 +65,7 @@ stream_t *__stream_DemuxNew( vlc_object_t *p_obj, const char *psz_demux, s = stream_CommonNew( p_obj ); if( s == NULL ) return NULL; + s->p_input = p_demux->p_input; s->psz_path = strdup(""); /* N/A */ s->pf_read = DStreamRead; s->pf_peek = DStreamPeek; @@ -92,6 +94,8 @@ stream_t *__stream_DemuxNew( vlc_object_t *p_obj, const char *psz_demux, return NULL; } + vlc_object_attach( s, p_obj ); + if( vlc_thread_create( s, "stream out", DStreamThread, VLC_THREAD_PRIORITY_INPUT ) ) { @@ -131,7 +135,6 @@ static void DStreamDelete( stream_t *s ) block_FifoRelease( p_sys->p_fifo ); free( p_sys->psz_name ); free( p_sys ); - stream_CommonDelete( s ); } @@ -161,6 +164,7 @@ static int DStreamRead( stream_t *s, void *p_read, unsigned int i_read ) i_copy = __MIN( i_read, p_block->i_buffer ); if( p_out && i_copy ) memcpy( p_out, p_block->p_buffer, i_copy ); i_read -= i_copy; + p_out += i_copy; i_out += i_copy; p_block->i_buffer -= i_copy; p_block->p_buffer += i_copy; @@ -218,13 +222,13 @@ static int DStreamPeek( stream_t *s, const uint8_t **pp_peek, unsigned int i_pee static int DStreamControl( stream_t *s, int i_query, va_list args ) { stream_sys_t *p_sys = s->p_sys; - int64_t *p_i64; + uint64_t *p_i64; bool *p_b; switch( i_query ) { case STREAM_GET_SIZE: - p_i64 = (int64_t*) va_arg( args, int64_t * ); + p_i64 = va_arg( args, uint64_t * ); *p_i64 = 0; return VLC_SUCCESS; @@ -239,21 +243,22 @@ static int DStreamControl( stream_t *s, int i_query, va_list args ) return VLC_SUCCESS; case STREAM_GET_POSITION: - p_i64 = (int64_t*) va_arg( args, int64_t * ); + p_i64 = va_arg( args, uint64_t * ); *p_i64 = p_sys->i_pos; return VLC_SUCCESS; case STREAM_SET_POSITION: { - int64_t i64 = (int64_t)va_arg( args, int64_t ); - int i_skip; - if( i64 < p_sys->i_pos ) return VLC_EGENERIC; - i_skip = i64 - p_sys->i_pos; + uint64_t i64 = va_arg( args, uint64_t ); + if( i64 < p_sys->i_pos ) + return VLC_EGENERIC; + uint64_t i_skip = i64 - p_sys->i_pos; while( i_skip > 0 ) { - int i_read = DStreamRead( s, NULL, (long)i_skip ); - if( i_read <= 0 ) return VLC_EGENERIC; + int i_read = DStreamRead( s, NULL, __MIN(i_skip, INT_MAX) ); + if( i_read <= 0 ) + return VLC_EGENERIC; i_skip -= i_read; } return VLC_SUCCESS; @@ -278,12 +283,15 @@ static void* DStreamThread( vlc_object_t* p_this ) int canc = vlc_savecancel(); /* Create the demuxer */ - if( !(p_demux = demux_New( s, "", p_sys->psz_name, "", s, p_sys->out, + if( !(p_demux = demux_New( s, s->p_input, "", p_sys->psz_name, "", s, p_sys->out, false )) ) { return NULL; } + /* stream_Demux cannot apply DVB filters. + * Get all programs and let the E/S output sort them out. */ + demux_Control( p_demux, DEMUX_SET_GROUP, -1, NULL ); p_sys->p_demux = p_demux; /* Main loop */