Commit 01d140d8 authored by Sam Hocevar's avatar Sam Hocevar

  * Win32 network support by Boris Dor�s <babal@via.ecp.fr>.
parent ec728f13
...@@ -21,7 +21,8 @@ D: directory browsing code in modules.c ...@@ -21,7 +21,8 @@ D: directory browsing code in modules.c
N: Gildas Bazin N: Gildas Bazin
E: gbazin@netcourrier.com E: gbazin@netcourrier.com
D: mingw32 port D: mingw32 port, various win32 fixes
D: DirectX audio and video output
N: Stphane Borel N: Stphane Borel
E: stef@via.ecp.fr E: stef@via.ecp.fr
...@@ -58,6 +59,11 @@ E: colin@zoy.org ...@@ -58,6 +59,11 @@ E: colin@zoy.org
C: colin C: colin
D: MacOS X sound support D: MacOS X sound support
N: Boris Dors
E: babal@via.ecp.fr
C: babal
D: Win32 network input
N: Jean-Marc Dressler N: Jean-Marc Dressler
E: polux@via.ecp.fr E: polux@via.ecp.fr
C: polux C: polux
...@@ -115,7 +121,7 @@ D: Bug fixes ...@@ -115,7 +121,7 @@ D: Bug fixes
N: Jon Lech Johansen N: Jon Lech Johansen
E: jon-vl@nanocrew.net E: jon-vl@nanocrew.net
D: PS input fixes D: PS input fixes
D: Win32 port D: Win32 DVD input port
N: Michel Kaempf N: Michel Kaempf
E: maxx@via.ecp.fr E: maxx@via.ecp.fr
......
/***************************************************************************** /*****************************************************************************
* input_iovec.h: iovec structure and readv() replacement * input_iovec.h: iovec structure
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* *
...@@ -30,58 +30,3 @@ struct iovec ...@@ -30,58 +30,3 @@ struct iovec
size_t iov_len; /* Length of data. */ size_t iov_len; /* Length of data. */
}; };
/*****************************************************************************
* readv: readv() replacement for iovec-impaired C libraries
*****************************************************************************/
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-- )
{
register signed int i_bytes;
i_len = p_iovec->iov_len;
p_base = p_iovec->iov_base;
/* Loop is unrolled one time to spare the (i_bytes < 0) test */
if( i_len > 0 )
{
i_bytes = read( i_fd, p_base, i_len );
if( ( i_total == 0 ) && ( i_bytes < 0 ) )
{
return -1;
}
if( i_bytes <= 0 )
{
return i_total;
}
i_len -= i_bytes;
i_total += i_bytes;
p_base += i_bytes;
while( i_len > 0 )
{
i_bytes = read( i_fd, p_base, i_len );
if( i_bytes <= 0 )
{
return i_total;
}
i_len -= i_bytes;
i_total += i_bytes;
p_base += i_bytes;
}
}
p_iovec++;
}
return i_total;
}
...@@ -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.26 2001/06/03 12:47:21 sam Exp $ * $Id: input_ts.c,v 1.27 2001/06/21 07:22:03 sam Exp $
* *
* Authors: Henri Fallon <henri@videolan.org> * Authors: Henri Fallon <henri@videolan.org>
* *
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#if defined( WIN32 ) #if defined( WIN32 )
# include <io.h> # include <io.h>
# include <winsock2.h>
# include "input_iovec.h" # include "input_iovec.h"
#else #else
# include <sys/uio.h> /* struct iovec */ # include <sys/uio.h> /* struct iovec */
...@@ -74,12 +75,12 @@ ...@@ -74,12 +75,12 @@
#include "input_ext-intf.h" #include "input_ext-intf.h"
#include "input_ext-dec.h" #include "input_ext-dec.h"
#include "input.h"
#include "input_ts.h"
#include "mpeg_system.h" #include "mpeg_system.h"
#include "input_netlist.h" #include "input_netlist.h"
#include "input.h"
#include "input_ts.h"
#include "modules.h" #include "modules.h"
#include "modules_export.h" #include "modules_export.h"
...@@ -182,6 +183,11 @@ static void TSInit( input_thread_t * p_input ) ...@@ -182,6 +183,11 @@ static void TSInit( input_thread_t * p_input )
return; return;
} }
#if defined( WIN32 )
p_method->i_length = 0;
p_method->i_offset = 0;
#endif
p_input->p_plugin_data = (void *)p_method; p_input->p_plugin_data = (void *)p_method;
p_input->p_method_data = NULL; p_input->p_method_data = NULL;
...@@ -268,10 +274,9 @@ static int TSRead( input_thread_t * p_input, ...@@ -268,10 +274,9 @@ static int TSRead( input_thread_t * p_input,
{ {
thread_ts_data_t * p_method; thread_ts_data_t * p_method;
unsigned int i_read, i_loop; unsigned int i_read, i_loop;
int i_data; int i_data = 0;
struct iovec * p_iovec; struct iovec * p_iovec;
struct timeval s_wait; struct timeval timeout;
/* Get iovecs */ /* Get iovecs */
p_iovec = input_NetlistGetiovec( p_input->p_method_data ); p_iovec = input_NetlistGetiovec( p_input->p_method_data );
...@@ -289,15 +294,20 @@ static int TSRead( input_thread_t * p_input, ...@@ -289,15 +294,20 @@ static int TSRead( input_thread_t * p_input,
FD_SET( p_input->i_handle, &(p_method->fds) ); FD_SET( p_input->i_handle, &(p_method->fds) );
/* We'll wait 0.5 second if nothing happens */ /* We'll wait 0.5 second if nothing happens */
s_wait.tv_sec = 0; timeout.tv_sec = 0;
s_wait.tv_usec = 500000; timeout.tv_usec = 500000;
/* Reset pointer table */ /* Reset pointer table */
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->fds), NULL, NULL, #if defined( WIN32 )
&s_wait); if ( ! p_input->stream.b_pace_control )
#endif
{
i_data = select( p_input->i_handle + 1, &p_method->fds,
NULL, NULL, &timeout );
}
if( i_data == -1 ) if( i_data == -1 )
{ {
...@@ -307,8 +317,19 @@ static int TSRead( input_thread_t * p_input, ...@@ -307,8 +317,19 @@ static int TSRead( input_thread_t * p_input,
if( i_data ) if( i_data )
{ {
#if defined( WIN32 )
if( p_input->stream.b_pace_control )
{
i_read = readv_file( p_input->i_handle, p_iovec, INPUT_READ_ONCE );
}
else
{
i_read = readv_network( p_input->i_handle, p_iovec,
INPUT_READ_ONCE, p_method );
}
#else
i_read = readv( p_input->i_handle, p_iovec, INPUT_READ_ONCE ); i_read = readv( p_input->i_handle, p_iovec, INPUT_READ_ONCE );
#endif
if( i_read == -1 ) if( i_read == -1 )
{ {
intf_ErrMsg( "input error: TS readv error" ); intf_ErrMsg( "input error: TS readv error" );
......
...@@ -2,9 +2,10 @@ ...@@ -2,9 +2,10 @@
* 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.8 2001/06/20 07:43:48 sam Exp $ * $Id: input_ts.h,v 1.9 2001/06/21 07:22:03 sam Exp $
* *
* Authors: Henri Fallon <henri@via.ecp.fr> * Authors: Henri Fallon <henri@via.ecp.fr>
* Boris Dors <babal@via.ecp.fr>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -21,15 +22,158 @@ ...@@ -21,15 +22,158 @@
* 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 16384 #define NB_DATA 16384
#define NB_PES 8192 #define NB_PES 8192
/* Will be used whne NetworkOpen is ready */ #define BUFFER_SIZE (7 * TS_PACKET_SIZE)
typedef struct thread_ts_data_s {
/*****************************************************************************
// FILE * stream; * thread_ts_data_t: private input data
*****************************************************************************/
typedef struct thread_ts_data_s
{
/* The file descriptor we select() on */
fd_set fds; fd_set fds;
#if defined( WIN32 )
char p_buffer[ BUFFER_SIZE ]; /* temporary buffer for readv_network */
int i_length; /* length of the UDP packet */
int i_offset; /* number of bytes already read from the buffer */
#endif
} thread_ts_data_t; } thread_ts_data_t;
/*****************************************************************************
* readv_*: readv() replacements for iovec-impaired C libraries
*****************************************************************************/
#if defined( WIN32 )
static __inline__ int readv_file( int i_fd, struct iovec *p_iovec, int i_count )
{
int i_index, i_len, i_total = 0;
u8 *p_base;
for( i_index = i_count; i_index; i_index-- )
{
register signed int i_bytes;
i_len = p_iovec->iov_len;
p_base = p_iovec->iov_base;
/* Loop is unrolled one time to spare the (i_bytes <= 0) test */
if( i_len > 0 )
{
i_bytes = read( i_fd, p_base, i_len );
if( ( i_total == 0 ) && ( i_bytes < 0 ) )
{
return -1;
}
if( i_bytes <= 0 )
{
return i_total;
}
i_len -= i_bytes; i_total += i_bytes; p_base += i_bytes;
while( i_len > 0 )
{
i_bytes = read( i_fd, p_base, i_len );
if( i_bytes <= 0 )
{
return i_total;
}
i_len -= i_bytes; i_total += i_bytes; p_base += i_bytes;
}
}
p_iovec++;
}
return i_total;
}
static __inline__ int read_network( int i_fd, char * p_base,
thread_ts_data_t *p_sys, int i_len )
{
int i_bytes;
if( p_sys->i_offset >= p_sys->i_length )
{
p_sys->i_length = recv( i_fd, p_sys->p_buffer, BUFFER_SIZE, 0 );
if ( p_sys->i_length == SOCKET_ERROR )
{
return -1;
}
p_sys->i_offset = 0;
}
if( i_len <= p_sys->i_length - p_sys->i_offset )
{
i_bytes = i_len;
}
else
{
i_bytes = p_sys->i_length - p_sys->i_offset;
}
memcpy( p_base, p_sys->p_buffer + p_sys->i_offset, i_bytes );
p_sys->i_offset += i_bytes;
return i_bytes;
}
static __inline__ int readv_network( int i_fd, struct iovec *p_iovec,
int i_count, thread_ts_data_t *p_sys )
{
int i_index, i_len, i_total = 0;
u8 *p_base;
for( i_index = i_count; i_index; i_index-- )
{
register signed int i_bytes;
i_len = p_iovec->iov_len;
p_base = p_iovec->iov_base;
/* Loop is unrolled one time to spare the (i_bytes <= 0) test */
if( i_len > 0 )
{
i_bytes = read_network( i_fd, p_base, p_sys, i_len );
if( ( i_total == 0 ) && ( i_bytes < 0 ) )
{
return -1;
}
if( i_bytes <= 0 )
{
return i_total;
}
i_len -= i_bytes; i_total += i_bytes; p_base += i_bytes;
while( i_len > 0 )
{
i_bytes = read_network( i_fd, p_base, p_sys, i_len );
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.123 2001/06/15 05:12:30 sam Exp $ * $Id: input.c,v 1.124 2001/06/21 07:22:03 sam Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -623,11 +623,14 @@ static void NetworkOpen( input_thread_t * p_input ) ...@@ -623,11 +623,14 @@ static void NetworkOpen( input_thread_t * p_input )
int i_port = 0; int i_port = 0;
int i_opt; int i_opt;
struct sockaddr_in sock; struct sockaddr_in sock;
#ifdef WIN32 #ifdef WIN32
/* WinSock Library Init. */
WSADATA Data; WSADATA Data;
int i_err = WSAStartup( MAKEWORD( 1, 1 ), &Data ); int i_err;
#endif
#ifdef WIN32
/* WinSock Library Init. */
i_err = WSAStartup( MAKEWORD( 1, 1 ), &Data );
if( i_err ) if( i_err )
{ {
...@@ -778,6 +781,13 @@ static void NetworkOpen( input_thread_t * p_input ) ...@@ -778,6 +781,13 @@ static void NetworkOpen( input_thread_t * p_input )
p_input->b_error = 1; p_input->b_error = 1;
return; return;
} }
#if defined( WIN32 )
if ( psz_broadcast != NULL )
{
sock.sin_addr.s_addr = INADDR_ANY;
}
#endif
/* Bind it */ /* Bind it */
if( bind( p_input->i_handle, (struct sockaddr *)&sock, if( bind( p_input->i_handle, (struct sockaddr *)&sock,
......
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