Commit 07bc016f authored by Christophe Massiot's avatar Christophe Massiot

* Fixed MPEG audio layer III VBR,

* Mac OS X interface thread gets a real-time priority as well to avoid
  lock-ups,
* VLAN error is now a warning.
parent 56fbe6bd
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* mpeg_audio.c: parse MPEG audio sync info and packetize the stream * mpeg_audio.c: parse MPEG audio sync info and packetize the stream
***************************************************************************** *****************************************************************************
* Copyright (C) 2001-2003 VideoLAN * Copyright (C) 2001-2003 VideoLAN
* $Id: mpeg_audio.c,v 1.3 2003/01/15 13:58:28 massiot Exp $ * $Id: mpeg_audio.c,v 1.4 2003/01/15 23:55:22 massiot Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Eric Petit <titer@videolan.org> * Eric Petit <titer@videolan.org>
...@@ -113,6 +113,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) ...@@ -113,6 +113,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
dec_thread_t * p_dec; dec_thread_t * p_dec;
audio_date_t end_date; audio_date_t end_date;
unsigned int i_layer = 0; unsigned int i_layer = 0;
byte_t p_sync[MAD_BUFFER_GUARD];
mtime_t pts;
/* Allocate the memory needed to store the thread's structure */ /* Allocate the memory needed to store the thread's structure */
p_dec = malloc( sizeof(dec_thread_t) ); p_dec = malloc( sizeof(dec_thread_t) );
...@@ -140,39 +142,73 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) ...@@ -140,39 +142,73 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
return -1; return -1;
} }
/* Init sync buffer. */
NextPTS( &p_dec->bit_stream, &pts, NULL );
GetChunk( &p_dec->bit_stream, p_sync, MAD_BUFFER_GUARD );
/* Decoder thread's main loop */ /* Decoder thread's main loop */
while ( !p_dec->p_fifo->b_die && !p_dec->p_fifo->b_error ) while ( !p_dec->p_fifo->b_die && !p_dec->p_fifo->b_error )
{ {
int i_bit_rate; int i_bit_rate;
unsigned int i_rate, i_original_channels, i_frame_size, i_frame_length; unsigned int i_rate, i_original_channels, i_frame_size, i_frame_length;
unsigned int i_new_layer, i_current_frame_size; unsigned int i_new_layer, i_current_frame_size;
mtime_t pts;
uint32_t i_header; uint32_t i_header;
aout_buffer_t * p_buffer; aout_buffer_t * p_buffer;
int i;
/* Look for sync word - should be 0xfff */ /* Look for sync word - should be 0xffe */
RealignBits( &p_dec->bit_stream ); if ( (p_sync[0] != 0xff) || ((p_sync[1] & 0xe0) != 0xe0) )
if ( ShowBits( &p_dec->bit_stream, 11 ) != 0x07ff )
{ {
msg_Warn( p_dec->p_fifo, "no sync - skipping" ); msg_Warn( p_dec->p_fifo, "no sync - skipping" );
} /* Look inside the sync buffer. */
while ( ShowBits( &p_dec->bit_stream, 11 ) != 0x07ff && for ( i = 1; i < MAD_BUFFER_GUARD - 1; i++ )
(!p_dec->p_fifo->b_die) && (!p_dec->p_fifo->b_error) ) {
{ if ( (p_sync[i] == 0xff) && ((p_sync[i + 1] & 0xe0) != 0xe0) )
RemoveBits( &p_dec->bit_stream, 8 ); break;
}
if ( i < MAD_BUFFER_GUARD - 1 )
{
/* Found it ! */
memmove( p_sync, &p_sync[i], MAD_BUFFER_GUARD - i );
GetChunk( &p_dec->bit_stream, &p_sync[MAD_BUFFER_GUARD - i],
i );
}
else
{
if ( p_sync[MAD_BUFFER_GUARD - 1] == 0xff
&& ShowBits( &p_dec->bit_stream, 3 ) == 0x3 )
{
/* Found it ! */
p_sync[0] = p_sync[MAD_BUFFER_GUARD - 1];
GetChunk( &p_dec->bit_stream,
&p_sync[1], MAD_BUFFER_GUARD - 1 );
}
else
{
/* Scan the stream. */
while ( ShowBits( &p_dec->bit_stream, 11 ) != 0x07ff &&
(!p_dec->p_fifo->b_die) &&
(!p_dec->p_fifo->b_error) )
{
RemoveBits( &p_dec->bit_stream, 8 );
}
if ( p_dec->p_fifo->b_die || p_dec->p_fifo->b_error )
break;
GetChunk( &p_dec->bit_stream,p_sync, MAD_BUFFER_GUARD );
}
}
} }
if ( p_dec->p_fifo->b_die || p_dec->p_fifo->b_error ) break; if ( p_dec->p_fifo->b_die || p_dec->p_fifo->b_error ) break;
/* Set the Presentation Time Stamp */ /* Set the Presentation Time Stamp */
NextPTS( &p_dec->bit_stream, &pts, NULL );
if ( pts != 0 && pts != aout_DateGet( &end_date ) ) if ( pts != 0 && pts != aout_DateGet( &end_date ) )
{ {
aout_DateSet( &end_date, pts ); aout_DateSet( &end_date, pts );
} }
/* Get frame header */ /* Get frame header */
i_header = ShowBits( &p_dec->bit_stream, 32 ); i_header = (p_sync[0] << 24) | (p_sync[1] << 16) | (p_sync[2] << 8)
if ( p_dec->p_fifo->b_die || p_dec->p_fifo->b_error ) break; | p_sync[3];
/* Check if frame is valid and get frame info */ /* Check if frame is valid and get frame info */
i_current_frame_size = SyncInfo( i_header, i_current_frame_size = SyncInfo( i_header,
...@@ -180,12 +216,21 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) ...@@ -180,12 +216,21 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
&i_bit_rate, &i_frame_length, &i_bit_rate, &i_frame_length,
&i_frame_size, &i_new_layer ); &i_frame_size, &i_new_layer );
if( !i_current_frame_size ) if ( !i_current_frame_size )
{ {
msg_Warn( p_dec->p_fifo, "syncinfo failed" ); msg_Warn( p_dec->p_fifo, "syncinfo failed" );
/* This is probably an emulated startcode, drop the first byte /* This is probably an emulated startcode, drop the first byte
* to force looking for the next startcode. */ * to force looking for the next startcode. */
RemoveBits( &p_dec->bit_stream, 8 ); memmove( p_sync, &p_sync[1], MAD_BUFFER_GUARD - 1 );
p_sync[MAD_BUFFER_GUARD - 1] = GetBits( &p_dec->bit_stream, 8 );
continue;
}
if ( i_current_frame_size > i_frame_size )
{
msg_Warn( p_dec->p_fifo, "frame too big %d > %d",
i_current_frame_size, i_frame_size );
memmove( p_sync, &p_sync[1], MAD_BUFFER_GUARD - 1 );
p_sync[MAD_BUFFER_GUARD - 1] = GetBits( &p_dec->bit_stream, 8 );
continue; continue;
} }
...@@ -240,6 +285,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) ...@@ -240,6 +285,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
/* We've just started the stream, wait for the first PTS. */ /* We've just started the stream, wait for the first PTS. */
GetChunk( &p_dec->bit_stream, p_junk, i_current_frame_size ); GetChunk( &p_dec->bit_stream, p_junk, i_current_frame_size );
memcpy( p_sync, &p_junk[i_current_frame_size - MAD_BUFFER_GUARD],
MAD_BUFFER_GUARD );
continue; continue;
} }
...@@ -255,14 +302,23 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) ...@@ -255,14 +302,23 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
i_frame_length ); i_frame_length );
/* Get the whole frame. */ /* Get the whole frame. */
GetChunk( &p_dec->bit_stream, p_buffer->p_buffer, memcpy( p_buffer->p_buffer, p_sync, MAD_BUFFER_GUARD );
i_current_frame_size ); GetChunk( &p_dec->bit_stream, p_buffer->p_buffer + MAD_BUFFER_GUARD,
i_current_frame_size - MAD_BUFFER_GUARD );
if( p_dec->p_fifo->b_die ) if( p_dec->p_fifo->b_die )
{ {
aout_DecDeleteBuffer( p_dec->p_aout, p_dec->p_aout_input, aout_DecDeleteBuffer( p_dec->p_aout, p_dec->p_aout_input,
p_buffer ); p_buffer );
break; break;
} }
/* Get beginning of next frame. */
NextPTS( &p_dec->bit_stream, &pts, NULL );
GetChunk( &p_dec->bit_stream, p_buffer->p_buffer + i_current_frame_size,
MAD_BUFFER_GUARD );
memcpy( p_sync, p_buffer->p_buffer + i_current_frame_size,
MAD_BUFFER_GUARD );
p_buffer->i_nb_bytes = i_current_frame_size + MAD_BUFFER_GUARD;
/* Send the buffer to the aout core. */ /* Send the buffer to the aout core. */
aout_DecPlay( p_dec->p_aout, p_dec->p_aout_input, p_buffer ); aout_DecPlay( p_dec->p_aout, p_dec->p_aout_input, p_buffer );
...@@ -337,6 +393,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels, ...@@ -337,6 +393,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
vlc_bool_t b_padding, b_mpeg_2_5; vlc_bool_t b_padding, b_mpeg_2_5;
int i_current_frame_size = 0; int i_current_frame_size = 0;
int i_bitrate_index, i_samplerate_index; int i_bitrate_index, i_samplerate_index;
int i_max_bit_rate;
b_mpeg_2_5 = 1 - ((i_header & 0x100000) >> 20); b_mpeg_2_5 = 1 - ((i_header & 0x100000) >> 20);
i_version = 1 - ((i_header & 0x80000) >> 19); i_version = 1 - ((i_header & 0x80000) >> 19);
...@@ -370,6 +427,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels, ...@@ -370,6 +427,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
break; break;
} }
*pi_bit_rate = pppi_mpegaudio_bitrate[i_version][*pi_layer-1][i_bitrate_index]; *pi_bit_rate = pppi_mpegaudio_bitrate[i_version][*pi_layer-1][i_bitrate_index];
i_max_bit_rate = pppi_mpegaudio_bitrate[i_version][*pi_layer-1][14];
*pi_sample_rate = ppi_mpegaudio_samplerate[i_version][i_samplerate_index]; *pi_sample_rate = ppi_mpegaudio_samplerate[i_version][i_samplerate_index];
if ( b_mpeg_2_5 ) if ( b_mpeg_2_5 )
...@@ -384,7 +442,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels, ...@@ -384,7 +442,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
*pi_bit_rate / *pi_sample_rate *pi_bit_rate / *pi_sample_rate
+ b_padding ) * 4; + b_padding ) * 4;
*pi_frame_size = ( ( i_version ? 6000 : 12000 ) * *pi_frame_size = ( ( i_version ? 6000 : 12000 ) *
*pi_bit_rate / *pi_sample_rate + 1 ) * 4; i_max_bit_rate / *pi_sample_rate + 1 ) * 4;
*pi_frame_length = 384; *pi_frame_length = 384;
break; break;
...@@ -393,7 +451,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels, ...@@ -393,7 +451,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
*pi_bit_rate / *pi_sample_rate *pi_bit_rate / *pi_sample_rate
+ b_padding; + b_padding;
*pi_frame_size = ( i_version ? 72000 : 144000 ) * *pi_frame_size = ( i_version ? 72000 : 144000 ) *
*pi_bit_rate / *pi_sample_rate + 1; i_max_bit_rate / *pi_sample_rate + 1;
*pi_frame_length = 1152; *pi_frame_length = 1152;
break; break;
...@@ -402,7 +460,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels, ...@@ -402,7 +460,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
*pi_bit_rate / *pi_sample_rate *pi_bit_rate / *pi_sample_rate
+ b_padding; + b_padding;
*pi_frame_size = ( i_version ? 72000 : 144000 ) * *pi_frame_size = ( i_version ? 72000 : 144000 ) *
*pi_bit_rate / *pi_sample_rate + 1; i_max_bit_rate / *pi_sample_rate + 1;
*pi_frame_length = i_version ? 576 : 1152; *pi_frame_length = i_version ? 576 : 1152;
break; break;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* intf.m: MacOS X interface plugin * intf.m: MacOS X interface plugin
***************************************************************************** *****************************************************************************
* Copyright (C) 2002-2003 VideoLAN * Copyright (C) 2002-2003 VideoLAN
* $Id: intf.m,v 1.24 2003/01/15 00:49:49 jlj Exp $ * $Id: intf.m,v 1.25 2003/01/15 23:55:22 massiot Exp $
* *
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net> * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
* Christophe Massiot <massiot@via.ecp.fr> * Christophe Massiot <massiot@via.ecp.fr>
...@@ -94,6 +94,11 @@ void E_(CloseIntf) ( vlc_object_t *p_this ) ...@@ -94,6 +94,11 @@ void E_(CloseIntf) ( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
static void Run( intf_thread_t *p_intf ) static void Run( intf_thread_t *p_intf )
{ {
/* Do it again - for some unknown reason, vlc_thread_create() often
* fails to go to real-time priority with the first launched thread
* (???) --Meuuh */
vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_LOW );
[NSApp run]; [NSApp run];
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* netutils.c: various network functions * netutils.c: various network functions
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: netutils.c,v 1.77 2002/11/13 20:51:05 sam Exp $ * $Id: netutils.c,v 1.78 2003/01/15 23:55:22 massiot Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Benoit Steiner <benny@via.ecp.fr> * Benoit Steiner <benny@via.ecp.fr>
...@@ -127,8 +127,8 @@ static int GetAdapterInfo ( int i_adapter, char *psz_string ); ...@@ -127,8 +127,8 @@ static int GetAdapterInfo ( int i_adapter, char *psz_string );
int __network_ChannelCreate( vlc_object_t *p_this ) int __network_ChannelCreate( vlc_object_t *p_this )
{ {
#if !defined( SYS_LINUX ) && !( defined( WIN32 ) && !defined( UNDER_CE ) ) #if !defined( SYS_LINUX ) && !( defined( WIN32 ) && !defined( UNDER_CE ) )
msg_Err( p_this, "VLAN-based channels are not supported " msg_Warn( p_this, "VLAN-based channels are not supported "
"on this architecture" ); "on this architecture" );
#endif #endif
/* Allocate structure */ /* Allocate structure */
......
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