* input_ext-dec.h: structures exported to the VideoLAN decoders
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_ext-dec.h,v 1.69 2002/08/12 22:12:50 massiot Exp $
+ * $Id: input_ext-dec.h,v 1.70 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Michel Kaempf <maxx@via.ecp.fr>
VLC_EXPORT( void, UnalignedRemoveBits, ( bit_stream_t * ) );
VLC_EXPORT( u32, UnalignedGetBits, ( bit_stream_t *, unsigned int ) );
VLC_EXPORT( void, CurrentPTS, ( bit_stream_t *, mtime_t *, mtime_t * ) );
+VLC_EXPORT( void, NextPTS, ( bit_stream_t *, mtime_t *, mtime_t * ) );
/*****************************************************************************
* AlignWord : fill in the bit buffer so that the byte pointer be aligned
void (* CurrentPTS_inner) ( bit_stream_t *, mtime_t *, mtime_t * ) ;
void (* DecoderError_inner) ( decoder_fifo_t * p_fifo ) ;
void (* InitBitstream_inner) ( bit_stream_t *, decoder_fifo_t *, void ( * )( bit_stream_t *, vlc_bool_t ), void * p_callback_arg ) ;
+ void (* NextPTS_inner) ( bit_stream_t *, mtime_t *, mtime_t * ) ;
void (* UnalignedRemoveBits_inner) ( bit_stream_t * ) ;
void (* __config_PutFloat_inner) (vlc_object_t *, const char *, float) ;
void (* __config_PutInt_inner) (vlc_object_t *, const char *, int) ;
# define GetLang_2T p_symbols->GetLang_2T_inner
# define InitBitstream p_symbols->InitBitstream_inner
# define NextDataPacket p_symbols->NextDataPacket_inner
+# define NextPTS p_symbols->NextPTS_inner
# define UnalignedGetBits p_symbols->UnalignedGetBits_inner
# define UnalignedRemoveBits p_symbols->UnalignedRemoveBits_inner
# define UnalignedShowBits p_symbols->UnalignedShowBits_inner
* a52tospdif.c : encapsulates A/52 frames into S/PDIF packets
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: a52tospdif.c,v 1.9 2002/08/21 22:41:59 massiot Exp $
+ * $Id: a52tospdif.c,v 1.10 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Stéphane Borel <stef@via.ecp.fr>
/* Copy the S/PDIF headers. */
memcpy( p_out, p_sync, 6 );
pi_length = (u16 *)(p_out + 6);
- *pi_length = i_length;
+ *pi_length = i_length * 8;
/* FIXME : if i_length is odd, the following code sucks. What should
* we do ? --Meuuh */
#ifndef WORDS_BIGENDIAN
# ifdef HAVE_SWAB
- swab( p_out + 8, p_in, i_length );
+ swab( p_in, p_out + 8, i_length );
# else
p_out += 8;
for ( i = i_length / 2 ; i-- ; )
* (http://liba52.sf.net/).
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: a52.c,v 1.6 2002/08/21 22:41:59 massiot Exp $
+ * $Id: a52.c,v 1.7 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
* Christophe Massiot <massiot@via.ecp.fr>
RemoveBits( &p_dec->bit_stream, 8 );
}
+ /* Set the Presentation Time Stamp */
+ NextPTS( &p_dec->bit_stream, &pts, NULL );
+ if ( pts != 0 && pts != aout_DateGet( &p_dec->end_date ) )
+ {
+ aout_DateSet( &p_dec->end_date, pts );
+ }
+
/* Get A/52 frame header */
GetChunk( &p_dec->bit_stream, p_frame_buffer, 7 );
if( p_dec->p_fifo->b_die ) break;
}
}
- /* Set the Presentation Time Stamp */
- CurrentPTS( &p_dec->bit_stream, &pts, NULL );
- if ( pts != 0 && pts != aout_DateGet( &p_dec->end_date ) )
- {
- aout_DateSet( &p_dec->end_date, pts );
- }
-
/* Get the complete frame */
GetChunk( &p_dec->bit_stream, p_frame_buffer + 7,
i_frame_size - 7 );
* a52old.c: A52 decoder module main file
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: a52old.c,v 1.4 2002/08/23 14:05:22 sam Exp $
+ * $Id: a52old.c,v 1.5 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Michel Lespinasse <walken@zoy.org>
*
continue;
}
- CurrentPTS( &p_a52dec->bit_stream, &i_pts, NULL );
+ NextPTS( &p_a52dec->bit_stream, &i_pts, NULL );
if( i_pts != 0 && i_pts != aout_DateGet( &end_date ) )
{
aout_DateSet( &end_date, i_pts );
* decoder.c: MPEG audio decoder thread
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: decoder.c,v 1.2 2002/08/17 15:35:10 fenrir Exp $
+ * $Id: decoder.c,v 1.3 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Michel Lespinasse <walken@via.ecp.fr>
#include "generic.h"
#include "decoder.h"
-#define ADEC_FRAME_SIZE 1152 /* XXX Frame size for only one channel */
+#define ADEC_FRAME_NB 1152
/*****************************************************************************
* Local Prototypes
*****************************************************************************/
static int RunDecoder( decoder_fifo_t *p_fifo )
{
- adec_thread_t * p_adec;
+ adec_thread_t * p_dec;
/* Allocate the memory needed to store the thread's structure */
- if ( (p_adec = (adec_thread_t *)malloc (sizeof(adec_thread_t))) == NULL )
+ if ( (p_dec = (adec_thread_t *)malloc (sizeof(adec_thread_t))) == NULL )
{
msg_Err( p_fifo, "out of memory" );
DecoderError( p_fifo );
/*
* Initialize the thread properties
*/
- p_adec->p_fifo = p_fifo;
+ p_dec->p_fifo = p_fifo;
/*
* Initilize the banks
*/
- p_adec->bank_0.actual = p_adec->bank_0.v1;
- p_adec->bank_0.pos = 0;
- p_adec->bank_1.actual = p_adec->bank_1.v1;
- p_adec->bank_1.pos = 0;
+ p_dec->bank_0.actual = p_dec->bank_0.v1;
+ p_dec->bank_0.pos = 0;
+ p_dec->bank_1.actual = p_dec->bank_1.v1;
+ p_dec->bank_1.pos = 0;
/*
* Initialize bit stream
*/
- InitBitstream( &p_adec->bit_stream, p_adec->p_fifo, NULL, NULL );
+ InitBitstream( &p_dec->bit_stream, p_dec->p_fifo, NULL, NULL );
/* We do not create the audio output fifo now, but
it will be created when the first frame is received */
- p_adec->p_aout = NULL;
- p_adec->p_aout_input = NULL;
- p_adec->i_pts = 0;
-
- p_adec->i_sync = 0;
+ p_dec->p_aout = NULL;
+ p_dec->p_aout_input = NULL;
/* Audio decoder thread's main loop */
- while( (!p_adec->p_fifo->b_die) && (!p_adec->p_fifo->b_error) )
+ while( (!p_dec->p_fifo->b_die) && (!p_dec->p_fifo->b_error) )
{
- DecodeThread( p_adec );
+ DecodeThread( p_dec );
}
/* If b_error is set, the audio decoder thread enters the error loop */
- if( p_adec->p_fifo->b_error )
+ if( p_dec->p_fifo->b_error )
{
- DecoderError( p_adec->p_fifo );
+ DecoderError( p_dec->p_fifo );
}
/* End of the audio decoder thread */
- EndThread( p_adec );
+ EndThread( p_dec );
return( 0 );
}
/*****************************************************************************
* DecodeThread: decodes a mpeg frame
*****************************************************************************/
-static void DecodeThread( adec_thread_t * p_adec )
+static void DecodeThread( adec_thread_t * p_dec )
{
- mtime_t i_pts;
- aout_buffer_t *p_aout_buffer;
+ mtime_t pts;
+ aout_buffer_t * p_aout_buffer;
adec_sync_info_t sync_info;
- if( ! adec_SyncFrame (p_adec, &sync_info) )
+ /* Look for sync word - should be 0x0b77 */
+ RealignBits( &p_dec->bit_stream );
+ while( (ShowBits( &p_dec->bit_stream, 16 ) & 0xfff0) != 0xfff0 &&
+ (!p_dec->p_fifo->b_die) && (!p_dec->p_fifo->b_error))
+ {
+ RemoveBits( &p_dec->bit_stream, 8 );
+ }
+
+ /* Set the Presentation Time Stamp */
+ NextPTS( &p_dec->bit_stream, &pts, NULL );
+ if ( pts != 0 && pts != aout_DateGet( &p_dec->end_date ) )
+ {
+ aout_DateSet( &p_dec->end_date, pts );
+ }
+
+ if( !adec_SyncFrame( p_dec, &sync_info ) )
{
-
/* Create the output fifo if it doesn't exist yet */
- if( ( p_adec->p_aout_input == NULL )||
- ( p_adec->output_format.i_channels != ( sync_info.b_stereo ? 2 : 1 ) )||
- ( p_adec->output_format.i_rate != sync_info.sample_rate ) )
+ if( ( p_dec->p_aout_input == NULL )||
+ ( p_dec->output_format.i_channels != ( sync_info.b_stereo ? 2 : 1 ) )||
+ ( p_dec->output_format.i_rate != sync_info.sample_rate ) )
{
- if( p_adec->p_aout_input )
+ if( p_dec->p_aout_input )
{
/* Delete old output */
- msg_Warn( p_adec->p_fifo, "opening a new aout" );
- aout_InputDelete( p_adec->p_aout, p_adec->p_aout_input );
+ msg_Warn( p_dec->p_fifo, "opening a new aout" );
+ aout_InputDelete( p_dec->p_aout, p_dec->p_aout_input );
}
/* Set output configuration */
- p_adec->output_format.i_format = AOUT_FMT_FLOAT32;
- p_adec->output_format.i_channels = ( sync_info.b_stereo ? 2 : 1 );
- p_adec->output_format.i_rate = sync_info.sample_rate;
- p_adec->p_aout_input = aout_InputNew( p_adec->p_fifo,
- &p_adec->p_aout,
- &p_adec->output_format );
+ p_dec->output_format.i_format = AOUT_FMT_FLOAT32;
+ p_dec->output_format.i_channels = ( sync_info.b_stereo ? 2 : 1 );
+ p_dec->output_format.i_rate = sync_info.sample_rate;
+ aout_DateInit( &p_dec->end_date, sync_info.sample_rate );
+ p_dec->p_aout_input = aout_InputNew( p_dec->p_fifo,
+ &p_dec->p_aout,
+ &p_dec->output_format );
}
- if( p_adec->p_aout_input == NULL )
+ if( p_dec->p_aout_input == NULL )
{
- msg_Err( p_adec->p_fifo, "failed to create aout fifo" );
- p_adec->p_fifo->b_error = 1;
+ msg_Err( p_dec->p_fifo, "failed to create aout fifo" );
+ p_dec->p_fifo->b_error = 1;
return;
}
- p_aout_buffer = aout_BufferNew( p_adec->p_aout,
- p_adec->p_aout_input,
- ADEC_FRAME_SIZE );
- if( !p_aout_buffer )
+ if( !aout_DateGet( &p_dec->end_date ) )
{
- msg_Err( p_adec->p_fifo, "cannot get aout buffer" );
- p_adec->p_fifo->b_error = 1;
+ /* We've just started the stream, wait for the first PTS. */
return;
}
- p_adec->i_sync = 1;
-
-
- CurrentPTS( &p_adec->bit_stream, &i_pts, NULL );
- if( i_pts > 0 )
+ p_aout_buffer = aout_BufferNew( p_dec->p_aout,
+ p_dec->p_aout_input,
+ ADEC_FRAME_NB );
+ if( !p_aout_buffer )
{
- p_adec->i_pts = i_pts;
+ msg_Err( p_dec->p_fifo, "cannot get aout buffer" );
+ p_dec->p_fifo->b_error = 1;
+ return;
}
- p_aout_buffer->start_date = p_adec->i_pts;
- p_adec->i_pts += (mtime_t)1000000 * (mtime_t)ADEC_FRAME_SIZE /
- (mtime_t)p_adec->output_format.i_rate;
- p_aout_buffer->end_date = p_adec->i_pts;
+ p_aout_buffer->start_date = aout_DateGet( &p_dec->end_date );
+ p_aout_buffer->end_date = aout_DateIncrement( &p_dec->end_date,
+ ADEC_FRAME_NB );
- if( adec_DecodeFrame (p_adec, (float*)p_aout_buffer->p_buffer ) )
+ if( adec_DecodeFrame (p_dec, (float*)p_aout_buffer->p_buffer ) )
{
/* Ouch, failed decoding... We'll have to resync */
- p_adec->i_sync = 0;
- aout_BufferDelete( p_adec->p_aout, p_adec->p_aout_input, p_aout_buffer );
+ aout_BufferDelete( p_dec->p_aout, p_dec->p_aout_input, p_aout_buffer );
}
else
{
- aout_BufferPlay( p_adec->p_aout, p_adec->p_aout_input, p_aout_buffer );
+ aout_BufferPlay( p_dec->p_aout, p_dec->p_aout_input, p_aout_buffer );
}
}
}
* This function is called when the thread ends after a sucessful
* initialization.
*****************************************************************************/
-static void EndThread ( adec_thread_t *p_adec )
+static void EndThread ( adec_thread_t *p_dec )
{
/* If the audio output fifo was created, we destroy it */
- if( p_adec->p_aout_input )
+ if( p_dec->p_aout_input )
{
- aout_InputDelete( p_adec->p_aout, p_adec->p_aout_input );
+ aout_InputDelete( p_dec->p_aout, p_dec->p_aout_input );
}
/* Destroy descriptor */
- free( p_adec );
+ free( p_dec );
}
* mpeg_adec.h : audio decoder thread interface
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: decoder.h,v 1.2 2002/08/17 15:35:10 fenrir Exp $
+ * $Id: decoder.h,v 1.3 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
*
aout_instance_t *p_aout; /* opaque */
aout_input_t *p_aout_input; /* opaque */
audio_sample_format_t output_format;
- mtime_t i_pts;
-
+ audio_date_t end_date;
} adec_thread_t;
/*****************************************************************************
* generic.c: MPEG audio decoder
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: generic.c,v 1.2 2002/08/17 15:35:10 fenrir Exp $
+ * $Id: generic.c,v 1.3 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Michel Lespinasse <walken@via.ecp.fr>
int adec_SyncFrame( adec_thread_t * p_adec, adec_sync_info_t * p_sync_info )
{
- static int mpeg1_sample_rate[3] = {44100, 48000, 32000};
- static int mpeg1_layer1_bit_rate[15] =
+ static const int mpeg1_sample_rate[3] = {44100, 48000, 32000};
+ static const int mpeg1_layer1_bit_rate[15] =
{
0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448
};
- static int mpeg1_layer2_bit_rate[15] =
+ static const int mpeg1_layer2_bit_rate[15] =
{
0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384
};
- static int mpeg2_layer1_bit_rate[15] =
+ static const int mpeg2_layer1_bit_rate[15] =
{
0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256
};
- static int mpeg2_layer2_bit_rate[15] =
+ static const int mpeg2_layer2_bit_rate[15] =
{
0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
};
- static int * bit_rate_table[8] =
+ static const int * bit_rate_table[8] =
{
NULL, NULL, mpeg2_layer2_bit_rate, mpeg2_layer1_bit_rate,
NULL, NULL, mpeg1_layer2_bit_rate, mpeg1_layer1_bit_rate
* layer2.c: MPEG Layer II audio decoder
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: layer2.c,v 1.3 2002/08/17 15:35:10 fenrir Exp $
+ * $Id: layer2.c,v 1.4 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Michel Lespinasse <walken@via.ecp.fr>
for (s = 0; s < 3; s++)
{
DCT32( &p_adec->bank_0, sample[s] );
- PCM( &p_adec->bank_0, buffer, 2 );
-
- /* FIXME: one shouldn't have to do it twice ! */
- DCT32( &p_adec->bank_1, sample[s] );
- PCM( &p_adec->bank_1, buffer + 1, 2 );
+ PCM( &p_adec->bank_0, buffer, 1 );
- buffer += 64;
+ buffer += 32;
}
}
}
/*****************************************************************************
- * spdif.c: A52 pass-through to external decoder with enabled soundcard
+ * spdif.c: A/52 pass-through to external decoder with enabled soundcard
*****************************************************************************
* Copyright (C) 2001-2002 VideoLAN
- * $Id: spdif.c,v 1.6 2002/08/19 21:31:11 massiot Exp $
+ * $Id: spdif.c,v 1.7 2002/08/26 23:00:22 massiot Exp $
*
* Authors: Stéphane Borel <stef@via.ecp.fr>
* Juha Yrjola <jyrjola@cc.hut.fi>
static int RunDecoder( decoder_fifo_t *p_fifo )
{
spdif_thread_t * p_dec;
- mtime_t last_date = 0;
+ audio_date_t end_date;
/* Allocate the memory needed to store the thread's structure */
p_dec = malloc( sizeof(spdif_thread_t) );
RemoveBits( &p_dec->bit_stream, 8 );
}
+ /* Set the Presentation Time Stamp */
+ NextPTS( &p_dec->bit_stream, &pts, NULL );
+ if ( pts != 0 && pts != aout_DateGet( &end_date ) )
+ {
+ aout_DateSet( &end_date, pts );
+ }
+
/* Get A/52 frame header */
GetChunk( &p_dec->bit_stream, p_header, 7 );
if( p_dec->p_fifo->b_die ) break;
p_dec->output_format.i_rate = i_rate;
p_dec->output_format.i_bytes_per_frame = i_frame_size;
p_dec->output_format.i_frame_length = A52_FRAME_NB;
- /* p_dec->output_format.i_channels = i_channels; */
+ aout_DateInit( &end_date, i_rate );
p_dec->p_aout_input = aout_InputNew( p_dec->p_fifo,
&p_dec->p_aout,
&p_dec->output_format );
}
}
- /* Set the Presentation Time Stamp */
- CurrentPTS( &p_dec->bit_stream, &pts, NULL );
- if ( pts != 0 )
- {
- last_date = pts;
- }
-
- if ( !last_date )
+ if ( !aout_DateGet( &end_date ) )
{
byte_t p_junk[3840];
p_buffer = aout_BufferNew( p_dec->p_aout, p_dec->p_aout_input,
A52_FRAME_NB );
if ( p_buffer == NULL ) return -1;
- p_buffer->start_date = last_date;
- last_date += (mtime_t)(A52_FRAME_NB * 1000000)
- / p_dec->output_format.i_rate;
- p_buffer->end_date = last_date;
+ p_buffer->start_date = aout_DateGet( &end_date );
+ p_buffer->end_date = aout_DateIncrement( &end_date,
+ A52_FRAME_NB );
/* Get the whole frame. */
memcpy( p_buffer->p_buffer, p_header, 7 );
* input.c : internal management of input streams for the audio output
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: input.c,v 1.8 2002/08/24 10:19:43 sam Exp $
+ * $Id: input.c,v 1.9 2002/08/26 23:00:23 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
#include <vlc/vlc.h>
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#endif
+
#include "audio_output.h"
#include "aout_internal.h"
* mixer.c : audio output mixing operations
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: mixer.c,v 1.9 2002/08/21 22:41:59 massiot Exp $
+ * $Id: mixer.c,v 1.10 2002/08/26 23:00:23 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
vlc_mutex_unlock( &p_aout->mixer_lock );
return -1;
}
- p_output_buffer->i_nb_samples = p_aout->output.i_nb_samples;
- p_output_buffer->i_nb_bytes = p_aout->output.i_nb_samples
+ /* This is again a bit kludgy - for the S/PDIF mixer. */
+ if ( p_aout->mixer.output_alloc.i_alloc_type != AOUT_ALLOC_NONE )
+ {
+ p_output_buffer->i_nb_samples = p_aout->output.i_nb_samples;
+ p_output_buffer->i_nb_bytes = p_aout->output.i_nb_samples
* p_aout->mixer.mixer.i_bytes_per_frame
/ p_aout->mixer.mixer.i_frame_length;
+ }
p_output_buffer->start_date = start_date;
p_output_buffer->end_date = end_date;
* input_ext-dec.c: services to the decoders
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: input_ext-dec.c,v 1.33 2002/07/24 15:21:47 sam Exp $
+ * $Id: input_ext-dec.c,v 1.34 2002/08/26 23:00:23 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
{
/* Check if the current PTS is already valid (ie. if the first byte
* of the packet has already been used in the decoder). */
- ptrdiff_t p_diff = p_bit_stream->p_byte - p_bit_stream->p_pts_validity;
+ ptrdiff_t p_diff = p_bit_stream->p_pts_validity - p_bit_stream->p_byte;
+ if( p_diff < 0 || p_diff > 4 /* We are far away so it is valid */
+ || (p_diff * 8) >= p_bit_stream->fifo.i_available
+ /* We have buffered less bytes than actually read */ )
+ {
+ *pi_pts = p_bit_stream->i_pts;
+ if( pi_dts != NULL ) *pi_dts = p_bit_stream->i_dts;
+ p_bit_stream->i_pts = 0;
+ p_bit_stream->i_dts = 0;
+ }
+ else
+ {
+ *pi_pts = 0;
+ if( pi_dts != NULL) *pi_dts = 0;
+ }
+}
+
+/*****************************************************************************
+ * NextPTS: returns the PTS and DTS for the next starting byte
+ *****************************************************************************/
+void NextPTS( bit_stream_t * p_bit_stream, mtime_t * pi_pts,
+ mtime_t * pi_dts )
+{
+ /* Check if the current PTS is already valid (ie. if the first byte
+ * of the packet has already been used in the decoder). */
+ ptrdiff_t p_diff = p_bit_stream->p_pts_validity - p_bit_stream->p_byte - 1;
if( p_diff < 0 || p_diff > 4 /* We are far away so it is valid */
|| (p_diff * 8) >= p_bit_stream->fifo.i_available
/* We have buffered less bytes than actually read */ )
(p_symbols)->UnalignedRemoveBits_inner = UnalignedRemoveBits; \
(p_symbols)->UnalignedGetBits_inner = UnalignedGetBits; \
(p_symbols)->CurrentPTS_inner = CurrentPTS; \
+ (p_symbols)->NextPTS_inner = NextPTS; \
(p_symbols)->DecoderError_inner = DecoderError; \
(p_symbols)->__input_SetStatus_inner = __input_SetStatus; \
(p_symbols)->__input_Seek_inner = __input_Seek; \