Commit 18188c24 authored by Christophe Massiot's avatar Christophe Massiot

* 32-bit aligned bitstream (not that fast).

parent 647cca0e
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Collection of useful common types and macros definitions * Collection of useful common types and macros definitions
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: common.h,v 1.25 2001/01/18 05:13:22 sam Exp $ * $Id: common.h,v 1.26 2001/01/18 17:40:06 massiot Exp $
* *
* Authors: Samuel Hocevar <sam@via.ecp.fr> * Authors: Samuel Hocevar <sam@via.ecp.fr>
* Vincent Seguin <seguin@via.ecp.fr> * Vincent Seguin <seguin@via.ecp.fr>
...@@ -155,31 +155,6 @@ struct macroblock_s; ...@@ -155,31 +155,6 @@ struct macroblock_s;
#define MIN(a, b) ( ((a) < (b)) ? (a) : (b) ) #define MIN(a, b) ( ((a) < (b)) ? (a) : (b) )
#endif #endif
/*
* This is stolen from the livid source who stole it from the kernel
*/
#if defined(SYS_BEOS)
# define swab32(x) B_BENDIAN_TO_HOST_INT32(x)
#else
# ifdef WORDS_BIG_ENDIAN
# define swab32(x) (x)
# else
# if defined (HAVE_X86_BSWAP)
static __inline__ const u32 __i386_swab32( u32 x )
{
__asm__("bswap %0" : "=r" (x) : "0" (x));
return x;
}
# define swab32(x) __i386_swab32(x)
# else
# define swab32(x) \
( ( (u32)(((u8*)&x)[0]) << 24 ) | ( (u32)(((u8*)&x)[1]) << 16 ) |\
( (u32)(((u8*)&x)[2]) << 8 ) | ( (u32)(((u8*)&x)[3])) )
# endif
# endif
#endif
/* MSB (big endian)/LSB (little endian) conversions - network order is always /* MSB (big endian)/LSB (little endian) conversions - network order is always
* MSB, and should be used for both network communications and files. Note that * MSB, and should be used for both network communications and files. Note that
* byte orders other than little and big endians are not supported, but only * byte orders other than little and big endians are not supported, but only
...@@ -204,6 +179,7 @@ static __inline__ const u32 __i386_swab32( u32 x ) ...@@ -204,6 +179,7 @@ static __inline__ const u32 __i386_swab32( u32 x )
#endif #endif
/* Macros with automatic casts */ /* Macros with automatic casts */
#define U32_AT(p) ( swab32 ( *( (u32 *)(p) ) ) ) #define U64_AT(p) ( ntoh64 ( *( (u64 *)(p) ) ) )
#define U16_AT(p) ( ntohs ( *( (u16 *)(p) ) ) ) #define U32_AT(p) ( ntoh32 ( *( (u32 *)(p) ) ) )
#define U16_AT(p) ( ntoh16 ( *( (u16 *)(p) ) ) )
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input.h: structures of the input not exported to other modules * input.h: structures of the input not exported to other modules
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: input.h,v 1.10 2001/01/15 08:07:31 sam Exp $ * $Id: input.h,v 1.11 2001/01/18 17:40:06 massiot Exp $
* *
* Authors: * Authors:
* *
...@@ -118,10 +118,6 @@ static __inline__ void input_NullPacket( input_thread_t * p_input, ...@@ -118,10 +118,6 @@ static __inline__ void input_NullPacket( input_thread_t * p_input,
return; return;
} }
/* XXX FIXME SARASS TODO: remove the following one-liner kludge when
* we have bitstream IV, we won't need it anymore */
((WORD_TYPE *)p_pad_data->p_payload_start)++;
memset( p_pad_data->p_buffer, 0, PADDING_PACKET_SIZE ); memset( p_pad_data->p_buffer, 0, PADDING_PACKET_SIZE );
p_pad_data->b_discard_payload = 1; p_pad_data->b_discard_payload = 1;
p_pes = p_es->p_pes; p_pes = p_es->p_pes;
......
...@@ -72,16 +72,9 @@ void InitBitstream( bit_stream_t * p_bit_stream, decoder_fifo_t * p_fifo ) ...@@ -72,16 +72,9 @@ void InitBitstream( bit_stream_t * p_bit_stream, decoder_fifo_t * p_fifo )
*****************************************************************************/ *****************************************************************************/
void NextDataPacket( bit_stream_t * p_bit_stream ) void NextDataPacket( bit_stream_t * p_bit_stream )
{ {
WORD_TYPE buffer_left;
ptrdiff_t i_bytes_left;
decoder_fifo_t * p_fifo = p_bit_stream->p_decoder_fifo; decoder_fifo_t * p_fifo = p_bit_stream->p_decoder_fifo;
boolean_t b_new_pes; boolean_t b_new_pes;
/* Put the remaining bytes (not aligned on a word boundary) in a
* temporary buffer. */
i_bytes_left = p_bit_stream->p_end - p_bit_stream->p_byte;
buffer_left = *((WORD_TYPE *)p_bit_stream->p_end - 1);
/* We are looking for the next data packet that contains real data, /* We are looking for the next data packet that contains real data,
* and not just a PES header */ * and not just a PES header */
do do
...@@ -133,8 +126,176 @@ void NextDataPacket( bit_stream_t * p_bit_stream ) ...@@ -133,8 +126,176 @@ void NextDataPacket( bit_stream_t * p_bit_stream )
{ {
p_bit_stream->pf_bitstream_callback( p_bit_stream, b_new_pes ); p_bit_stream->pf_bitstream_callback( p_bit_stream, b_new_pes );
} }
}
void OldKludge( bit_stream_t * p_bit_stream )
{
WORD_TYPE buffer_left;
ptrdiff_t i_bytes_left;
/* Put the remaining bytes (not aligned on a word boundary) in a
* temporary buffer. */
i_bytes_left = p_bit_stream->p_end - p_bit_stream->p_byte;
buffer_left = *((WORD_TYPE *)p_bit_stream->p_end - 1);
p_bit_stream->pf_next_data_packet( p_bit_stream );
/* Copy remaining bits of the previous packet */ /* Copy remaining bits of the previous packet */
*((WORD_TYPE *)p_bit_stream->p_byte - 1) = buffer_left; *((WORD_TYPE *)p_bit_stream->p_byte - 1) = buffer_left;
p_bit_stream->p_byte -= i_bytes_left; p_bit_stream->p_byte -= i_bytes_left;
} }
/*****************************************************************************
* UnalignedShowBits : return i_bits bits from the bit stream, even when
* not aligned on a word boundary
*****************************************************************************/
u32 UnalignedShowBits( bit_stream_t * p_bit_stream, unsigned int i_bits )
{
/* We just fill in the bit buffer. */
while( p_bit_stream->fifo.i_available < i_bits )
{
if( p_bit_stream->p_byte < p_bit_stream->p_end )
{
p_bit_stream->fifo.buffer |= *(p_bit_stream->p_byte++)
<< (8 * sizeof(WORD_TYPE) - 8
- p_bit_stream->fifo.i_available);
p_bit_stream->fifo.i_available += 8;
}
else
{
p_bit_stream->pf_next_data_packet( p_bit_stream );
p_bit_stream->fifo.buffer |= *(p_bit_stream->p_byte++)
<< (8 * sizeof(WORD_TYPE) - 8
- p_bit_stream->fifo.i_available);
p_bit_stream->fifo.i_available += 8;
}
}
return( p_bit_stream->fifo.buffer >> (8 * sizeof(WORD_TYPE) - i_bits) );
}
/*****************************************************************************
* UnalignedGetBits : returns i_bits bits from the bit stream and removes
* them from the buffer, even when the bit stream is not aligned on a word
* boundary
*****************************************************************************/
u32 UnalignedGetBits( bit_stream_t * p_bit_stream, unsigned int i_bits )
{
u32 i_result;
i_result = p_bit_stream->fifo.buffer
>> (8 * sizeof(WORD_TYPE) - i_bits);
i_bits -= p_bit_stream->fifo.i_available;
/* Gather missing bytes. */
while( i_bits >= 8 )
{
if( p_bit_stream->p_byte < p_bit_stream->p_end )
{
i_result |= *(p_bit_stream->p_byte++) << (i_bits - 8);
i_bits -= 8;
}
else
{
p_bit_stream->pf_next_data_packet( p_bit_stream );
i_result |= *(p_bit_stream->p_byte++) << (i_bits - 8);
i_bits -= 8;
}
}
/* Gather missing bits. */
if( i_bits > 0 )
{
unsigned int i_tmp = 8 - i_bits;
if( p_bit_stream->p_byte < p_bit_stream->p_end )
{
i_result |= *p_bit_stream->p_byte >> i_tmp;
p_bit_stream->fifo.buffer = *(p_bit_stream->p_byte++)
<< ( sizeof(WORD_TYPE) * 8 - i_tmp );
p_bit_stream->fifo.i_available = i_tmp;
}
else
{
p_bit_stream->pf_next_data_packet( p_bit_stream );
i_result |= *p_bit_stream->p_byte >> i_tmp;
p_bit_stream->fifo.buffer = *(p_bit_stream->p_byte++)
<< ( sizeof(WORD_TYPE) * 8 - i_tmp );
p_bit_stream->fifo.i_available = i_tmp;
}
}
else
{
p_bit_stream->fifo.i_available = 0;
p_bit_stream->fifo.buffer = 0;
}
if( p_bit_stream->p_byte <= p_bit_stream->p_end - sizeof(WORD_TYPE) )
{
/* Get aligned on a word boundary. Otherwise it is safer
* to do it the next time.
* NB : we _will_ get aligned, because we have at most
* sizeof(WORD_TYPE) - 1 bytes to store, and at least
* sizeof(WORD_TYPE) - 1 empty bytes in the bit buffer. */
AlignWord( p_bit_stream );
}
return( i_result );
}
/*****************************************************************************
* UnalignedRemoveBits : removes i_bits (== -i_available) from the bit
* buffer, even when the bit stream is not aligned on a word boundary
*****************************************************************************/
void UnalignedRemoveBits( bit_stream_t * p_bit_stream )
{
/* First remove all unnecessary bytes. */
while( p_bit_stream->fifo.i_available <= -8 )
{
if( p_bit_stream->p_byte < p_bit_stream->p_end )
{
p_bit_stream->p_byte++;
p_bit_stream->fifo.i_available += 8;
}
else
{
p_bit_stream->pf_next_data_packet( p_bit_stream );
p_bit_stream->p_byte++;
p_bit_stream->fifo.i_available += 8;
}
}
/* Remove unnecessary bits. */
if( p_bit_stream->fifo.i_available < 0 )
{
if( p_bit_stream->p_byte < p_bit_stream->p_end )
{
p_bit_stream->fifo.buffer = *(p_bit_stream->p_byte++)
<< ( sizeof(WORD_TYPE) * 8 - 8
- p_bit_stream->fifo.i_available );
p_bit_stream->fifo.i_available += 8;
}
else
{
p_bit_stream->pf_next_data_packet( p_bit_stream );
p_bit_stream->fifo.buffer = *(p_bit_stream->p_byte++)
<< ( sizeof(WORD_TYPE) * 8 - 8
- p_bit_stream->fifo.i_available );
p_bit_stream->fifo.i_available += 8;
}
}
else
{
p_bit_stream->fifo.buffer = 0;
}
if( p_bit_stream->p_byte <= p_bit_stream->p_end - sizeof(WORD_TYPE) )
{
/* Get aligned on a word boundary. Otherwise it is safer
* to do it the next time.
* NB : we _will_ get aligned, because we have at most
* sizeof(WORD_TYPE) - 1 bytes to store, and at least
* sizeof(WORD_TYPE) - 1 empty bytes in the bit buffer. */
AlignWord( p_bit_stream );
}
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vpar_synchro.c : frame dropping routines * vpar_synchro.c : frame dropping routines
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: vpar_synchro.c,v 1.78 2001/01/18 05:13:23 sam Exp $ * $Id: vpar_synchro.c,v 1.79 2001/01/18 17:40:06 massiot Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* Samuel Hocevar <sam@via.ecp.fr> * Samuel Hocevar <sam@via.ecp.fr>
...@@ -222,7 +222,8 @@ boolean_t vpar_SynchroChoose( vpar_thread_t * p_vpar, int i_coding_type, ...@@ -222,7 +222,8 @@ boolean_t vpar_SynchroChoose( vpar_thread_t * p_vpar, int i_coding_type,
+ tau_yuv) + tau_yuv)
#define S p_vpar->synchro #define S p_vpar->synchro
/* VPAR_SYNCHRO_DEFAULT */ /* VPAR_SYNCHRO_DEFAULT */
mtime_t now, pts, period, tau_yuv; mtime_t now, period, tau_yuv;
mtime_t pts = 0;
boolean_t b_decode = 0; boolean_t b_decode = 0;
#ifdef DEBUG_VPAR #ifdef DEBUG_VPAR
char p_date[MSTRTIME_MAX_SIZE]; char p_date[MSTRTIME_MAX_SIZE];
......
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