Commit edcfc7d3 authored by Sam Hocevar's avatar Sam Hocevar

  * Added a wrapper for readv() on platforms which don't support it. The
    network support now compiles under Win32, but still doesn't work, the
    select in plugins/mpeg/input_ts.c never returns any data.

    Is there anything like strace(1) under Win32 to debug this ?
parent 7f62d904
...@@ -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.19 2001/05/08 12:53:30 bozo Exp $ * $Id: input_ts.c,v 1.20 2001/05/28 04:23:52 sam Exp $
* *
* Authors: Henri Fallon <henri@videolan.org> * Authors: Henri Fallon <henri@videolan.org>
* *
...@@ -43,8 +43,14 @@ ...@@ -43,8 +43,14 @@
#include <sys/select.h> #include <sys/select.h>
#endif #endif
#ifndef WIN32 #ifndef WIN32
#include <sys/uio.h> # include <sys/uio.h> /* struct iovec */
#else
struct iovec
{
void *iov_base; /* Pointer to data. */
size_t iov_len; /* Length of data. */
};
#endif #endif
#include <sys/stat.h> #include <sys/stat.h>
...@@ -211,7 +217,7 @@ static void TSInit( input_thread_t * p_input ) ...@@ -211,7 +217,7 @@ static void TSInit( input_thread_t * p_input )
*****************************************************************************/ *****************************************************************************/
void TSFakeOpen( input_thread_t * p_input ) void TSFakeOpen( input_thread_t * p_input )
{ {
#if !defined( SYS_BEOS ) && !defined( SYS_NTO ) && !defined( WIN32 ) #if !defined( SYS_BEOS ) && !defined( SYS_NTO )
char *psz_name = p_input->p_source; char *psz_name = p_input->p_source;
if( ( strlen(psz_name) > 3 ) && !strncasecmp( psz_name, "ts:", 3 ) ) if( ( strlen(psz_name) > 3 ) && !strncasecmp( psz_name, "ts:", 3 ) )
...@@ -284,8 +290,8 @@ static int TSRead( input_thread_t * p_input, ...@@ -284,8 +290,8 @@ static int TSRead( input_thread_t * p_input,
memset( pp_packets, 0, INPUT_READ_ONCE * sizeof(data_packet_t *) ); memset( pp_packets, 0, INPUT_READ_ONCE * sizeof(data_packet_t *) );
/* Fill if some data is available */ /* Fill if some data is available */
i_data = select(p_input->i_handle + 1, &(p_method->s_fdset), NULL, NULL, i_data = select( p_input->i_handle + 1, &(p_method->s_fdset), NULL, NULL,
&s_wait); &s_wait);
if( i_data == -1 ) if( i_data == -1 )
{ {
...@@ -295,11 +301,7 @@ static int TSRead( input_thread_t * p_input, ...@@ -295,11 +301,7 @@ static int TSRead( input_thread_t * p_input,
if( i_data ) if( i_data )
{ {
#ifndef WIN32
i_read = readv( p_input->i_handle, p_iovec, INPUT_READ_ONCE ); i_read = readv( p_input->i_handle, p_iovec, INPUT_READ_ONCE );
#else
i_read = -1;
#endif
if( i_read == -1 ) if( i_read == -1 )
{ {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_ts.h: structures of the input not exported to other modules * input_ts.h: structures of the input not exported to other modules
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: input_ts.h,v 1.4 2001/03/21 13:42:34 sam Exp $ * $Id: input_ts.h,v 1.5 2001/05/28 04:23:52 sam Exp $
* *
* Authors: Henri Fallon <henri@via.ecp.fr> * Authors: Henri Fallon <henri@via.ecp.fr>
* *
...@@ -32,3 +32,46 @@ typedef struct thread_ts_data_s { ...@@ -32,3 +32,46 @@ typedef struct thread_ts_data_s {
fd_set s_fdset; fd_set s_fdset;
} thread_ts_data_t; } thread_ts_data_t;
#ifdef WIN32
static __inline__ int readv( int i_fd, struct iovec *p_iovec, int i_count )
{
int i_index, i_len, i_total = 0;
char *p_base;
for( i_index = i_count; i_index; i_index-- )
{
i_len = p_iovec->iov_len;
p_base = p_iovec->iov_base;
while( i_len > 0 )
{
register signed int i_bytes;
i_bytes = read( i_fd, p_base, i_len );
if( i_total == 0 )
{
if( i_bytes < 0 )
{
intf_ErrMsg( "input error: read failed on socket" );
return -1;
}
}
if( i_bytes <= 0 )
{
return i_total;
}
i_len -= i_bytes;
i_total += i_bytes;
p_base += i_bytes;
}
p_iovec++;
}
return i_total;
}
#endif
...@@ -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.110 2001/05/28 03:17:01 xav Exp $ * $Id: input.c,v 1.111 2001/05/28 04:23:52 sam Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -570,18 +570,17 @@ void input_NetworkOpen( input_thread_t * p_input ) ...@@ -570,18 +570,17 @@ void input_NetworkOpen( input_thread_t * p_input )
int i_opt; int i_opt;
struct sockaddr_in sock; struct sockaddr_in sock;
/* WinSock Library Init. */ #ifdef WIN32
/* WinSock Library Init. */
#ifdef WIN32 WSADATA Data;
WSADATA Data; int i_err = WSAStartup( MAKEWORD( 1, 1 ), &Data );
int Result = WSAStartup( MAKEWORD( 1,1 ),&Data );
if( i_err )
if( Result != 0 ) {
{ intf_ErrMsg( "input: can't initiate WinSocks, error %i", i_err );
intf_ErrMsg( "Can't initiate WinSocks : error %i", Result) ; return ;
return ; }
} #endif
#endif
/* Get the remote server */ /* Get the remote server */
if( p_input->p_source != NULL ) if( p_input->p_source != NULL )
...@@ -688,8 +687,8 @@ void input_NetworkOpen( input_thread_t * p_input ) ...@@ -688,8 +687,8 @@ void input_NetworkOpen( input_thread_t * p_input )
if( setsockopt( p_input->i_handle, SOL_SOCKET, SO_REUSEADDR, if( setsockopt( p_input->i_handle, SOL_SOCKET, SO_REUSEADDR,
&i_opt, sizeof( i_opt ) ) == -1 ) &i_opt, sizeof( i_opt ) ) == -1 )
{ {
intf_ErrMsg("input error: can't configure socket (SO_REUSEADDR: %s)", intf_ErrMsg( "input error: can't configure socket (SO_REUSEADDR: %s)",
strerror(errno)); strerror(errno));
close( p_input->i_handle ); close( p_input->i_handle );
p_input->b_error = 1; p_input->b_error = 1;
return; return;
...@@ -701,17 +700,17 @@ void input_NetworkOpen( input_thread_t * p_input ) ...@@ -701,17 +700,17 @@ void input_NetworkOpen( input_thread_t * p_input )
if( setsockopt( p_input->i_handle, SOL_SOCKET, SO_RCVBUF, if( setsockopt( p_input->i_handle, SOL_SOCKET, SO_RCVBUF,
&i_opt, sizeof( i_opt ) ) == -1 ) &i_opt, sizeof( i_opt ) ) == -1 )
{ {
intf_ErrMsg("input error: can't configure socket (SO_RCVBUF: %s)", intf_ErrMsg( "input error: can't configure socket (SO_RCVBUF: %s)",
strerror(errno)); strerror(errno));
close( p_input->i_handle ); close( p_input->i_handle );
p_input->b_error = 1; p_input->b_error = 1;
return; return;
} }
/* Build the local socket */ /* Build the local socket */
if ( network_BuildLocalAddr( &sock, i_port, psz_broadcast ) if ( network_BuildLocalAddr( &sock, i_port, psz_broadcast ) == -1 )
== -1 )
{ {
intf_ErrMsg( "input error: can't build local address" );
close( p_input->i_handle ); close( p_input->i_handle );
p_input->b_error = 1; p_input->b_error = 1;
return; return;
...@@ -730,6 +729,7 @@ void input_NetworkOpen( input_thread_t * p_input ) ...@@ -730,6 +729,7 @@ void input_NetworkOpen( input_thread_t * p_input )
/* Build socket for remote connection */ /* Build socket for remote connection */
if ( network_BuildRemoteAddr( &sock, psz_server ) == -1 ) if ( network_BuildRemoteAddr( &sock, psz_server ) == -1 )
{ {
intf_ErrMsg( "input error: can't build remote address" );
close( p_input->i_handle ); close( p_input->i_handle );
p_input->b_error = 1; p_input->b_error = 1;
return; return;
...@@ -739,7 +739,7 @@ void input_NetworkOpen( input_thread_t * p_input ) ...@@ -739,7 +739,7 @@ void input_NetworkOpen( input_thread_t * p_input )
if( connect( p_input->i_handle, (struct sockaddr *) &sock, if( connect( p_input->i_handle, (struct sockaddr *) &sock,
sizeof( sock ) ) == (-1) ) sizeof( sock ) ) == (-1) )
{ {
intf_ErrMsg( "NetworkOpen: can't connect socket : %s", intf_ErrMsg( "input error: can't connect socket, %s",
strerror(errno) ); strerror(errno) );
close( p_input->i_handle ); close( p_input->i_handle );
p_input->b_error = 1; p_input->b_error = 1;
...@@ -750,6 +750,8 @@ void input_NetworkOpen( input_thread_t * p_input ) ...@@ -750,6 +750,8 @@ void input_NetworkOpen( input_thread_t * p_input )
* with the server. */ * with the server. */
p_input->stream.b_pace_control = 0; p_input->stream.b_pace_control = 0;
p_input->stream.b_seekable = 0; p_input->stream.b_seekable = 0;
intf_WarnMsg( 3, "input: successfully opened network mode" );
return; return;
} }
...@@ -761,9 +763,10 @@ void input_NetworkClose( input_thread_t * p_input ) ...@@ -761,9 +763,10 @@ void input_NetworkClose( input_thread_t * p_input )
{ {
close( p_input->i_handle ); close( p_input->i_handle );
#ifdef WIN32 #ifdef WIN32
WSACleanup(); WSACleanup();
#endif #endif
} }
#endif #endif
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_netlist.c: netlist management * input_netlist.c: netlist management
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: input_netlist.c,v 1.36 2001/05/06 04:32:02 sam Exp $ * $Id: input_netlist.c,v 1.37 2001/05/28 04:23:52 sam Exp $
* *
* Authors: Henri Fallon <henri@videolan.org> * Authors: Henri Fallon <henri@videolan.org>
* *
...@@ -81,14 +81,20 @@ int input_NetlistInit( input_thread_t * p_input, int i_nb_data, int i_nb_pes, ...@@ -81,14 +81,20 @@ int input_NetlistInit( input_thread_t * p_input, int i_nb_data, int i_nb_pes,
* the netlist_t struct */ * the netlist_t struct */
/* As i_loop is unsigned int, and i_ns_data int, this shouldn't be a /* As i_loop is unsigned int, and i_ns_data int, this shouldn't be a
* problem */ * problem */
for( i_loop=1; i_loop < i_nb_data; i_loop*=2 ) for( i_loop = 1; i_loop < i_nb_data; i_loop *= 2 )
{
; ;
}
intf_DbgMsg( "Netlist : Required %i byte, got %u",i_nb_data,i_loop ); intf_DbgMsg( "Netlist : Required %i byte, got %u",i_nb_data,i_loop );
i_nb_data = i_loop; i_nb_data = i_loop;
/* Same thing for i_nb_pes */ /* Same thing for i_nb_pes */
for( i_loop=1; i_loop < i_nb_data; i_loop*=2 ) for( i_loop = 1; i_loop < i_nb_data; i_loop *= 2 )
{
; ;
}
intf_DbgMsg( "Netlist : Required %i byte, got %u",i_nb_data,i_loop ); intf_DbgMsg( "Netlist : Required %i byte, got %u",i_nb_data,i_loop );
i_nb_data = i_loop; i_nb_data = i_loop;
......
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