Commit 78ebd7d6 authored by Christophe Massiot's avatar Christophe Massiot

* Passage de NeedBits(), DumpBits(), etc. dans decoder_fifo.h ;

* Suppression de warnings ;

--Meuuh
parent 3b40f7cd
......@@ -26,55 +26,6 @@
* directement sur le flux PES ?
*/
/******************************************************************************
* bit_fifo_t : bit fifo descriptor
******************************************************************************
* This type describes a bit fifo used to store bits while working with the
* input stream at the bit level.
******************************************************************************/
typedef struct bit_fifo_s
{
/* This unsigned integer allows us to work at the bit level. This buffer
* can contain 32 bits, and the used space can be found on the MSb's side
* and the available space on the LSb's side. */
u32 buffer;
/* Number of bits available in the bit buffer */
int i_available;
} bit_fifo_t;
/******************************************************************************
* bit_stream_t : bit stream descriptor
******************************************************************************
* This type, based on a PES stream, includes all the structures needed to
* handle the input stream like a bit stream.
******************************************************************************/
typedef struct bit_stream_s
{
/*
* Input structures
*/
/* The input thread feeds the stream with fresh PES packets */
input_thread_t * p_input;
/* The decoder fifo contains the data of the PES stream */
decoder_fifo_t * p_decoder_fifo;
/*
* Byte structures
*/
/* Current TS packet (in the current PES packet of the PES stream) */
ts_packet_t * p_ts;
/* Index of the next byte that is to be read (in the current TS packet) */
unsigned int i_byte;
/*
* Bit structures
*/
bit_fifo_t fifo;
} bit_stream_t;
/******************************************************************************
* adec_bank_t
******************************************************************************/
......
......@@ -40,3 +40,140 @@ typedef struct
int i_end;
} decoder_fifo_t;
/****************************************************************************** * bit_fifo_t : bit fifo descriptor
****************************************************************************** * This type describes a bit fifo used to store bits while working with the
* input stream at the bit level.
******************************************************************************/
typedef struct bit_fifo_s
{
/* This unsigned integer allows us to work at the bit level. This buffer
* can contain 32 bits, and the used space can be found on the MSb's side
* and the available space on the LSb's side. */
u32 buffer;
/* Number of bits available in the bit buffer */
int i_available;
} bit_fifo_t;
/****************************************************************************** * bit_stream_t : bit stream descriptor
****************************************************************************** * This type, based on a PES stream, includes all the structures needed to
* handle the input stream like a bit stream.
******************************************************************************/
typedef struct bit_stream_s
{
/*
* Input structures
*/
/* The input thread feeds the stream with fresh PES packets */
input_thread_t * p_input;
/* The decoder fifo contains the data of the PES stream */
decoder_fifo_t * p_decoder_fifo;
/*
* Byte structures
*/
/* Current TS packet (in the current PES packet of the PES stream) */
ts_packet_t * p_ts;
/* Index of the next byte that is to be read (in the current TS packet) */
unsigned int i_byte;
/*
* Bit structures
*/
bit_fifo_t fifo;
} bit_stream_t;
/*****************************************************************************
* GetByte : reads the next byte in the input stream
*****************************************************************************/
static __inline__ byte_t GetByte( bit_stream_t * p_bit_stream )
{
/* Are there some bytes left in the current TS packet ? */
if ( p_bit_stream->i_byte < p_bit_stream->p_ts->i_payload_end )
{
return( p_bit_stream->p_ts->buffer[ p_bit_stream->i_byte++ ] );
}
else
{
/* We are looking for the next TS packet that contains real data,
* and not just a PES header */
do
{
/* We were reading the last TS packet of this PES packet... It's
* time to jump to the next PES packet */
if ( p_bit_stream->p_ts->p_next_ts == NULL )
{
/* We are going to read/write the start and end indexes of the
* decoder fifo and to use the fifo's conditional variable,
* that's why we need to take the lock before */
pthread_mutex_lock( &p_bit_stream->p_decoder_fifo->data_lock );
/* We should increase the start index of the decoder fifo, but
* if we do this now, the input thread could overwrite the
* pointer to the current PES packet, and we weren't able to
* give it back to the netlist. That's why we free the PES
* packet first. */
input_NetlistFreePES( p_bit_stream->p_input, DECODER_FIFO_START(*p_bit_stream->p_decoder_fifo) );
DECODER_FIFO_INCSTART( *p_bit_stream->p_decoder_fifo );
/* !! b_die !! */
while ( DECODER_FIFO_ISEMPTY(*p_bit_stream->p_decoder_fifo) )
{
pthread_cond_wait( &p_bit_stream->p_decoder_fifo->data_wait,
&p_bit_stream->p_decoder_fifo->data_lock );
}
/* The next byte could be found in the next PES packet */
p_bit_stream->p_ts = DECODER_FIFO_START( *p_bit_stream->p_decoder_fifo )->p_first_ts;
/* We can release the fifo's data lock */
pthread_mutex_unlock( &p_bit_stream->p_decoder_fifo->data_lock );
}
/* Perhaps the next TS packet of the current PES packet contains
* real data (ie its payload's size is greater than 0) */
else
{
p_bit_stream->p_ts = p_bit_stream->p_ts->p_next_ts;
}
} while ( p_bit_stream->p_ts->i_payload_start == p_bit_stream->p_ts->i_payload_end );
/* We've found a TS packet which contains interesting data... As we
* return the payload's first byte, we set i_byte to the following
* one */
p_bit_stream->i_byte = p_bit_stream->p_ts->i_payload_start;
return( p_bit_stream->p_ts->buffer[ p_bit_stream->i_byte++ ] );
}
}
/****************************************************************************** * NeedBits : reads i_bits new bits in the bit stream and stores them in the
* bit buffer
****************************************************************************** * - i_bits must be less or equal 32 !
* - There is something important to notice with that function : if the number
* of bits available in the bit buffer when calling NeedBits() is greater than
* 24 (i_available > 24) but less than the number of needed bits
* (i_available < i_bits), the byte returned by GetByte() will be shifted with
* a negative value and the number of bits available in the bit buffer will be
* set to more than 32 !
******************************************************************************/
static __inline__ void NeedBits( bit_stream_t * p_bit_stream, int i_bits )
{
while ( p_bit_stream->fifo.i_available < i_bits )
{
p_bit_stream->fifo.buffer |= ((u32)GetByte( p_bit_stream )) << (24 - p_bit_stream->fifo.i_available);
p_bit_stream->fifo.i_available += 8;
}
}
/****************************************************************************** * DumpBits : removes i_bits bits from the bit buffer
****************************************************************************** * - i_bits <= i_available
* - i_bits < 32 (because (u32 << 32) <=> (u32 = u32))
******************************************************************************/
static __inline__ void DumpBits( bit_stream_t * p_bit_stream, int i_bits )
{
p_bit_stream->fifo.buffer <<= i_bits;
p_bit_stream->fifo.i_available -= i_bits;
}
......@@ -143,107 +143,6 @@ void adec_DestroyThread( adec_thread_t * p_adec )
/* Following functions are local */
/******************************************************************************
* GetByte : reads the next byte in the input stream
******************************************************************************/
static __inline__ byte_t GetByte( bit_stream_t * p_bit_stream )
{
/* Are there some bytes left in the current TS packet ? */
if ( p_bit_stream->i_byte < p_bit_stream->p_ts->i_payload_end )
{
return( p_bit_stream->p_ts->buffer[ p_bit_stream->i_byte++ ] );
}
else
{
/* We are looking for the next TS packet that contains real data,
* and not just a PES header */
do
{
/* We were reading the last TS packet of this PES packet... It's
* time to jump to the next PES packet */
if ( p_bit_stream->p_ts->p_next_ts == NULL )
{
/* We are going to read/write the start and end indexes of the
* decoder fifo and to use the fifo's conditional variable,
* that's why we need to take the lock before */
pthread_mutex_lock( &p_bit_stream->p_decoder_fifo->data_lock );
/* We should increase the start index of the decoder fifo, but
* if we do this now, the input thread could overwrite the
* pointer to the current PES packet, and we weren't able to
* give it back to the netlist. That's why we free the PES
* packet first. */
input_NetlistFreePES( p_bit_stream->p_input, DECODER_FIFO_START(*p_bit_stream->p_decoder_fifo) );
DECODER_FIFO_INCSTART( *p_bit_stream->p_decoder_fifo );
/* !! b_die !! */
while ( DECODER_FIFO_ISEMPTY(*p_bit_stream->p_decoder_fifo) )
{
pthread_cond_wait( &p_bit_stream->p_decoder_fifo->data_wait,
&p_bit_stream->p_decoder_fifo->data_lock );
}
/* The next byte could be found in the next PES packet */
#ifdef DEBUG
// fprintf(stderr, "*");
#endif
p_bit_stream->p_ts = DECODER_FIFO_START( *p_bit_stream->p_decoder_fifo )->p_first_ts;
/* We can release the fifo's data lock */
pthread_mutex_unlock( &p_bit_stream->p_decoder_fifo->data_lock );
}
/* Perhaps the next TS packet of the current PES packet contains
* real data (ie its payload's size is greater than 0) */
else
{
#ifdef DEBUG
// fprintf(stderr, ".");
#endif
p_bit_stream->p_ts = p_bit_stream->p_ts->p_next_ts;
}
} while ( p_bit_stream->p_ts->i_payload_start == p_bit_stream->p_ts->i_payload_end );
/* We've found a TS packet which contains interesting data... As we
* return the payload's first byte, we set i_byte to the following
* one */
p_bit_stream->i_byte = p_bit_stream->p_ts->i_payload_start;
return( p_bit_stream->p_ts->buffer[ p_bit_stream->i_byte++ ] );
}
}
/******************************************************************************
* NeedBits : reads i_bits new bits in the bit stream and stores them in the
* bit buffer
******************************************************************************
* - i_bits must be less or equal 32 !
* - There is something important to notice with that function : if the number
* of bits available in the bit buffer when calling NeedBits() is greater than
* 24 (i_available > 24) but less than the number of needed bits
* (i_available < i_bits), the byte returned by GetByte() will be shifted with
* a negative value and the number of bits available in the bit buffer will be
* set to more than 32 !
******************************************************************************/
static __inline__ void NeedBits( bit_stream_t * p_bit_stream, int i_bits )
{
while ( p_bit_stream->fifo.i_available < i_bits )
{
p_bit_stream->fifo.buffer |= ((u32)GetByte( p_bit_stream )) << (24 - p_bit_stream->fifo.i_available);
p_bit_stream->fifo.i_available += 8;
}
}
/******************************************************************************
* DumpBits : removes i_bits bits from the bit buffer
******************************************************************************
* - i_bits <= i_available
* - i_bits < 32 (because (u32 << 32) <=> (u32 = u32))
******************************************************************************/
static __inline__ void DumpBits( bit_stream_t * p_bit_stream, int i_bits )
{
p_bit_stream->fifo.buffer <<= i_bits;
p_bit_stream->fifo.i_available -= i_bits;
}
/******************************************************************************
* FindHeader : parses an input stream until an audio frame header could be
* found
......
......@@ -26,8 +26,12 @@
#include "common.h"
#include "mtime.h"
#include "thread.h"
#include "debug.h"
#include "intf_msg.h"
#include "input.h"
#include "input_netlist.h"
#include "input_vlan.h"
#include "decoder_fifo.h"
......@@ -40,7 +44,6 @@
#include "xconsole.h"
#include "interface.h"
#include "intf_msg.h"
#include "intf_cmd.h"
#include "pgm_data.h"
......
......@@ -41,11 +41,15 @@
#include "config.h"
#include "common.h"
#include "mtime.h"
#include "debug.h"
#include "intf_msg.h"
#include "input.h"
#include "input_ctrl.h"
#include "input_vlan.h"
#include "input_psi.h"
#include "input_netlist.h"
#include "decoder_fifo.h"
#include "audio_output.h"
......@@ -58,7 +62,6 @@
#include "xconsole.h"
#include "interface.h"
#include "intf_msg.h"
#include "intf_cmd.h"
#include "control.h"
#include "intf_ctrl.h"
......
......@@ -26,9 +26,13 @@
#include "common.h"
#include "mtime.h"
#include "netutils.h"
#include "debug.h"
#include "intf_msg.h"
#include "input.h"
#include "input_vlan.h"
#include "input_netlist.h"
#include "decoder_fifo.h"
#include "audio_output.h"
......@@ -40,7 +44,6 @@
#include "xconsole.h"
#include "interface.h"
#include "intf_msg.h"
#include "pgm_data.h"
......
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