MacOS X and VDR from linuxtv.org
Michael Langer
milanger at mac.com
Wed Jan 2 10:29:04 CET 2002
Hi,
I 'fixed' a problem playing files generated with vdr. The fix (ok ok it
is not a fix, it is a work around:->) consist of tree parts against
vlc-0.9.2.
VDR or vdr means video disk recorder and records TV-Programs from a
Satellite.
The symptons are
- stop playing after a few seconds,
- no sound
- after fixing nosound an stop playing there is still a delay between
sound an video of aprox. 0.5 s.
According to the doku of vdr, these files consist of PES-Pakages (Sorry
I'm not familiar with MPEG ), holding the streams for video and audio.
- the first fix is simply stopping the input thread filling new packages.
- the second fix is a little triky. It seem that the PES-Stream holds no
'PACK_START_CODE' block, wich leads the mpeg_adec module to timestamp
the audio packages with 'LAST_MDATE ', but those packets won't be
played.
I don't understand the first error. What keeps vlc from stopping to fill
the decoder fifos (DVD works).
The second error seems simple the TV-Programs have no begin, also no
start code.
I also can't explain the third error, it seems the sound stream begins
more early then the video stream which leads to a 'Miky Mouse' sound in
the first few seconds. After that the sound is late.
These fixes are certainly not a golden solution but I hope someone can
point me in the right direction.
The fixes are at the back of these E-Mail. Which means I'm also not
familiar with diff :-).
Michael
p.s. whre can i get the mpeg doku (maybe as pdf)?
first part fixes error
>INPUT_MAX_ALLOCATION reached (125831013)
>Out of memory
(src/input/input_dec.c)
/*************************************************************************
****
* input_DecodePES
**************************************************************************
***
* Put a PES in the decoder's fifo.
**************************************************************************
***/
void input_DecodePES( decoder_fifo_t * p_decoder_fifo, pes_packet_t *
p_pes )
{
#if 1
while (p_decoder_fifo->i_depth > 250)
{
vlc_cond_signal( &p_decoder_fifo->data_wait ); // keep the
decoder online
msleep( 10000 ); // be cpu friendly
}
#endif
vlc_mutex_lock( &p_decoder_fifo->data_lock );
p_pes->p_next = NULL;
*p_decoder_fifo->pp_last = p_pes;
p_decoder_fifo->pp_last = &p_pes->p_next;
p_decoder_fifo->i_depth++;
/* Warn the decoder that it's got work to do. */
vlc_cond_signal( &p_decoder_fifo->data_wait );
vlc_mutex_unlock( &p_decoder_fifo->data_lock );
}
second part fixed 'nosound'
(src/input/input_clock.c)
/*************************************************************************
****
* input_ClockGetTS: manages a PTS or DTS
**************************************************************************
***/
mtime_t input_ClockGetTS( input_thread_t * p_input,
pgrm_descriptor_t * p_pgrm, mtime_t i_ts )
{
#if 0
if( p_pgrm->i_synchro_state == SYNCHRO_OK )
{
return( ClockToSysdate( p_input, p_pgrm, i_ts +
p_pgrm->delta_cr )
+ DEFAULT_PTS_DELAY
+ (p_main->i_desync > 0 ? p_main->i_desync : 0) );
}
else
{
return 0;
}
#else
if( p_pgrm->i_synchro_state != SYNCHRO_OK )
input_ClockManageRef( p_input, p_pgrm, i_ts + DEFAULT_PTS_DELAY+
p_pgrm->delta_cr);
return( ClockToSysdate( p_input, p_pgrm, i_ts + p_pgrm->delta_cr )
+ DEFAULT_PTS_DELAY
+ (p_main->i_desync > 0 ? p_main->i_desync : 0) );
#endif
}
third part fixes an delay between sound and video
static __inline__ int NextFrame( aout_thread_t * p_aout, aout_fifo_t *
p_fifo,
mtime_t aout_date )
{
...
#if 1
l_delta = aout_date - p_fifo->date[p_fifo->l_start_frame] + 500000;
#else
l_delta = aout_date - p_fifo->date[p_fifo->l_start_frame] ;
#endif
...
}
More information about the vlc-devel
mailing list