N: Gildas Bazin
E: gbazin@netcourrier.com
-D: mingw32 port
+D: mingw32 port, various win32 fixes
+D: DirectX audio and video output
N: Stéphane Borel
E: stef@via.ecp.fr
C: colin
D: MacOS X sound support
+N: Boris Dorès
+E: babal@via.ecp.fr
+C: babal
+D: Win32 network input
+
N: Jean-Marc Dressler
E: polux@via.ecp.fr
C: polux
N: Jon Lech Johansen
E: jon-vl@nanocrew.net
D: PS input fixes
-D: Win32 port
+D: Win32 DVD input port
N: Michel Kaempf
E: maxx@via.ecp.fr
/*****************************************************************************
- * input_iovec.h: iovec structure and readv() replacement
+ * input_iovec.h: iovec structure
*****************************************************************************
* Copyright (C) 2001 VideoLAN
*
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;
-}
-
* input_ts.c: TS demux and netlist management
*****************************************************************************
* 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>
*
#if defined( WIN32 )
# include <io.h>
+# include <winsock2.h>
# include "input_iovec.h"
#else
# include <sys/uio.h> /* struct iovec */
#include "input_ext-intf.h"
#include "input_ext-dec.h"
-#include "input.h"
-#include "input_ts.h"
-
#include "mpeg_system.h"
#include "input_netlist.h"
+#include "input.h"
+#include "input_ts.h"
+
#include "modules.h"
#include "modules_export.h"
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_method_data = NULL;
{
thread_ts_data_t * p_method;
unsigned int i_read, i_loop;
- int i_data;
+ int i_data = 0;
struct iovec * p_iovec;
- struct timeval s_wait;
-
+ struct timeval timeout;
/* Get iovecs */
p_iovec = input_NetlistGetiovec( p_input->p_method_data );
FD_SET( p_input->i_handle, &(p_method->fds) );
/* We'll wait 0.5 second if nothing happens */
- s_wait.tv_sec = 0;
- s_wait.tv_usec = 500000;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 500000;
/* Reset pointer table */
memset( pp_packets, 0, INPUT_READ_ONCE * sizeof(data_packet_t *) );
/* Fill if some data is available */
- i_data = select( p_input->i_handle + 1, &(p_method->fds), NULL, NULL,
- &s_wait);
+#if defined( WIN32 )
+ 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 )
{
+#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 );
-
+#endif
if( i_read == -1 )
{
intf_ErrMsg( "input error: TS readv error" );
* input_ts.h: structures of the input not exported to other modules
*****************************************************************************
* 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>
+ * Boris Dorès <babal@via.ecp.fr>
*
* 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
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
-
#define NB_DATA 16384
#define NB_PES 8192
-/* Will be used whne NetworkOpen is ready */
-typedef struct thread_ts_data_s {
-
- // FILE * stream;
+#define BUFFER_SIZE (7 * TS_PACKET_SIZE)
+
+/*****************************************************************************
+ * thread_ts_data_t: private input data
+ *****************************************************************************/
+typedef struct thread_ts_data_s
+{
+ /* The file descriptor we select() on */
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;
+/*****************************************************************************
+ * 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
+
* decoders.
*****************************************************************************
* 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>
*
int i_port = 0;
int i_opt;
struct sockaddr_in sock;
-
#ifdef WIN32
- /* WinSock Library Init. */
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 )
{
p_input->b_error = 1;
return;
}
+
+#if defined( WIN32 )
+ if ( psz_broadcast != NULL )
+ {
+ sock.sin_addr.s_addr = INADDR_ANY;
+ }
+#endif
/* Bind it */
if( bind( p_input->i_handle, (struct sockaddr *)&sock,