* input_netlist.c: netlist management
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
+ * $Id: input_netlist.c,v 1.28 2001/01/07 03:56:40 henri Exp $
*
* Authors: Henri Fallon <henri@videolan.org>
*
#include "defs.h"
#include <stdlib.h>
+#include <sys/types.h>
#include <sys/uio.h> /* struct iovec */
+#include <unistd.h>
#include "config.h"
#include "common.h"
p_input->p_method_data = malloc(sizeof(netlist_t));
if ( p_input->p_method_data == NULL )
{
- intf_ErrMsg("Unable to malloc the netlist struct\n");
+ intf_ErrMsg("Unable to malloc the netlist struct");
return (-1);
}
(byte_t *) malloc(i_buffer_size* i_nb_data );
if ( p_netlist->p_buffers == NULL )
{
- intf_ErrMsg ("Unable to malloc in netlist initialization (1)\n");
+ intf_ErrMsg ("Unable to malloc in netlist initialization (1)");
return (-1);
}
(data_packet_t *) malloc(sizeof(data_packet_t)*(i_nb_data));
if ( p_netlist->p_data == NULL )
{
- intf_ErrMsg ("Unable to malloc in netlist initialization (2)\n");
+ intf_ErrMsg ("Unable to malloc in netlist initialization (2)");
return (-1);
}
(pes_packet_t *) malloc(sizeof(pes_packet_t)*(i_nb_pes));
if ( p_netlist->p_pes == NULL )
{
- intf_ErrMsg ("Unable to malloc in netlist initialization (3)\n");
+ intf_ErrMsg ("Unable to malloc in netlist initialization (3)");
return (-1);
}
(data_packet_t **) malloc (i_nb_data * sizeof(data_packet_t *) );
if ( p_netlist->pp_free_data == NULL )
{
- intf_ErrMsg ("Unable to malloc in netlist initialization (4)\n");
+ intf_ErrMsg ("Unable to malloc in netlist initialization (4)");
}
p_netlist->pp_free_pes =
(pes_packet_t **) malloc (i_nb_pes * sizeof(pes_packet_t *) );
if ( p_netlist->pp_free_pes == NULL )
{
- intf_ErrMsg ("Unable to malloc in netlist initialization (5)\n");
+ intf_ErrMsg ("Unable to malloc in netlist initialization (5)");
}
p_netlist->p_free_iovec = ( struct iovec * )
malloc( (i_nb_data + INPUT_READ_ONCE) * sizeof(struct iovec) );
if ( p_netlist->p_free_iovec == NULL )
{
- intf_ErrMsg ("Unable to malloc in netlist initialization (6)\n");
+ intf_ErrMsg ("Unable to malloc in netlist initialization (6)");
}
/* Fill the data FIFO */
p_netlist->pp_free_data[i_loop]->p_buffer =
p_netlist->p_buffers + i_loop * i_buffer_size;
- p_netlist->pp_free_data[i_loop]->p_payload_start =
- p_netlist->pp_free_data[i_loop]->p_buffer;
-
p_netlist->pp_free_data[i_loop]->p_payload_end =
p_netlist->pp_free_data[i_loop]->p_buffer + i_buffer_size;
}
p_netlist->i_data_end = i_nb_data - 1;
p_netlist->i_pes_start = 0;
- p_netlist->i_pes_end = i_nb_pes + INPUT_READ_ONCE - 1;
+ p_netlist->i_pes_end = i_nb_pes - 1;
- p_netlist->i_iovec_start = 0;
- p_netlist->i_iovec_end = i_nb_data - 1;
-
p_netlist->i_nb_data = i_nb_data;
p_netlist->i_nb_pes = i_nb_pes;
p_netlist->i_buffer_size = i_buffer_size;
/* check */
if (
- (p_netlist->i_iovec_end - p_netlist->i_iovec_start)%p_netlist->i_nb_data
- < INPUT_READ_ONCE )
+ (p_netlist->i_data_end - p_netlist->i_data_start + p_netlist->i_nb_data)
+ %p_netlist->i_nb_data < INPUT_READ_ONCE )
{
- intf_ErrMsg("Empty iovec FIFO. Unable to allocate memory\n");
+ intf_ErrMsg("Empty iovec FIFO. Unable to allocate memory");
return (NULL);
}
- /* readv only takes contiguous buffers */
- if( p_netlist->i_nb_data - p_netlist->i_iovec_start < INPUT_READ_ONCE )
+ /* readv only takes contiguous buffers
+ * so, as a solution, we chose to have a FIFO a bit longer
+ * than i_nb_data, and copy the begining of the FIFO to its end
+ * if the readv needs to go after the end */
+ if( p_netlist->i_nb_data - p_netlist->i_data_start < INPUT_READ_ONCE )
memcpy( &p_netlist->p_free_iovec[p_netlist->i_nb_data],
p_netlist->p_free_iovec,
- INPUT_READ_ONCE-(p_netlist->i_nb_data-p_netlist->i_iovec_start)
+ INPUT_READ_ONCE-(p_netlist->i_nb_data-p_netlist->i_data_start)
+ * sizeof(struct iovec *)
);
+
+ /* Initialize payload start and end */
+ p_netlist->pp_free_data[p_netlist->i_data_start]->p_payload_start
+ = p_netlist->pp_free_data[p_netlist->i_data_start]->p_buffer;
+
+ p_netlist->pp_free_data[p_netlist->i_data_start]->p_payload_end
+ = p_netlist->pp_free_data[p_netlist->i_data_start]->p_payload_start
+ + p_netlist->i_buffer_size;
+
+ return &p_netlist->p_free_iovec[p_netlist->i_data_start];
- p_netlist->i_iovec_start += INPUT_READ_ONCE;
- p_netlist->i_iovec_start %= p_netlist->i_nb_data;
-
- return &p_netlist->p_free_iovec[p_netlist->i_iovec_start];
}
/*****************************************************************************
/* cast */
p_netlist = (netlist_t *) p_method_data;
- p_netlist->i_iovec_start += i_nb_iovec;
- p_netlist->i_iovec_start %= p_netlist->i_nb_data;
+ /* lock */
+ vlc_mutex_lock ( &p_netlist->lock );
+
+ p_netlist->i_data_start += i_nb_iovec;
+ p_netlist->i_data_start %= p_netlist->i_nb_data;
+
+ /* unlock */
+ vlc_mutex_unlock (&p_netlist->lock);
+
}
/*****************************************************************************
/* check */
if ( p_netlist->i_data_start == p_netlist->i_data_end )
{
- intf_ErrMsg("Empty Data FIFO in netlist. Unable to allocate memory\n");
+ intf_ErrMsg("Empty Data FIFO in netlist. Unable to allocate memory");
return ( NULL );
}
p_return = (p_netlist->pp_free_data[p_netlist->i_data_start]);
p_netlist->i_data_start++;
p_netlist->i_data_start %= p_netlist->i_nb_data;
-
- p_netlist->i_iovec_start++;
- p_netlist->i_iovec_start %= p_netlist->i_nb_data;
/* unlock */
vlc_mutex_unlock (&p_netlist->lock);
p_return->p_next = NULL;
p_return->b_discard_payload = 0;
+ p_return->p_payload_start = p_return->p_buffer;
+ p_return->p_payload_end = p_return->p_payload_start + i_buffer_size;
+
return ( p_return );
}
/* check */
if ( p_netlist->i_pes_start == p_netlist->i_pes_end )
{
- intf_ErrMsg("Empty PES FIFO in netlist - Unable to allocate memory\n");
+ intf_ErrMsg("Empty PES FIFO in netlist - Unable to allocate memory");
return ( NULL );
}
p_return->b_messed_up =
p_return->b_data_alignment =
p_return->b_discontinuity =
- p_return->b_has_pts = 0;
+ p_return->i_pts = p_return->i_dts = 0;
p_return->i_pes_size = 0;
p_return->p_first = NULL;
p_netlist->i_data_end %= p_netlist->i_nb_data;
p_netlist->pp_free_data[p_netlist->i_data_end] = p_data;
- /* Delete the corresponding iovec */
- p_netlist->i_iovec_end++;
- p_netlist->i_iovec_end %= p_netlist->i_nb_data;
- p_netlist->p_free_iovec[p_netlist->i_iovec_end].iov_base =
- p_data->p_buffer;
+ p_netlist->p_free_iovec[p_netlist->i_data_end].iov_base = p_data->p_buffer;
/* unlock */
- vlc_mutex_unlock (&p_netlist->lock);
+ vlc_mutex_unlock (&p_netlist->lock);
}
/*****************************************************************************
p_netlist->i_data_end %= p_netlist->i_nb_data;
p_netlist->pp_free_data[p_netlist->i_data_end] = p_current_packet;
- p_netlist->i_iovec_end++;
- p_netlist->i_iovec_end %= p_netlist->i_nb_data;
- p_netlist->p_free_iovec[p_netlist->i_iovec_end].iov_base =
- p_netlist->p_data->p_buffer;
+ p_netlist->p_free_iovec[p_netlist->i_data_end].iov_base
+ = p_netlist->p_data->p_buffer;
p_current_packet = p_current_packet->p_next;
}
/* cast */
p_netlist = ( netlist_t * ) p_input->p_method_data;
+ /* destroy the mutex lock */
+ vlc_mutex_destroy (&p_netlist->lock);
+
/* free the FIFO, the buffer, and the netlist structure */
free (p_netlist->pp_free_data);
free (p_netlist->pp_free_pes);
free (p_netlist->p_pes);
free (p_netlist->p_data);
+ free (p_netlist->p_buffers);
/* free the netlist */
free (p_netlist);