mirror of https://code.videolan.org/videolan/vlc
* src/input/input_clock.c: Fixed two long-standing (> 2 years) bugs
- there should be fewer resampling, particularly on DVD chapter changes - when you unpause a DVD, VLC will wait for the drive to spin up, so you won't lose several seconds of movies * modules/gui/macosx/controls.m: Seeking in paused mode resumes the play mode, make the interface take that into account.
This commit is contained in:
parent
788c882a5d
commit
b1bd5cc0bd
7
NEWS
7
NEWS
|
@ -1,8 +1,13 @@
|
|||
$Id: NEWS,v 1.57 2003/07/19 15:25:47 sigmunau Exp $
|
||||
$Id: NEWS,v 1.58 2003/07/27 14:10:02 massiot Exp $
|
||||
|
||||
Changes between 0.6.0 and 0.6.1:
|
||||
---------------------------------
|
||||
|
||||
Core support:
|
||||
* There should be less bogus resampling, particularly on DVDs.
|
||||
* VLC will now wait for the medium to wake up before starting its clock
|
||||
after a pause.
|
||||
|
||||
Stream output:
|
||||
* Added vorbis audio support in Ogg streaming.
|
||||
* Added vorbis audio transcoding support.
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* control the pace of reading.
|
||||
*****************************************************************************
|
||||
* Copyright (C) 1999, 2000 VideoLAN
|
||||
* $Id: input_ext-intf.h,v 1.91 2003/05/31 12:24:39 titer Exp $
|
||||
* $Id: input_ext-intf.h,v 1.92 2003/07/27 14:10:02 massiot Exp $
|
||||
*
|
||||
* Authors: Christophe Massiot <massiot@via.ecp.fr>
|
||||
*
|
||||
|
@ -112,7 +112,7 @@ struct pgrm_descriptor_t
|
|||
mtime_t cr_ref, sysdate_ref;
|
||||
mtime_t last_cr; /* reference to detect unexpected stream
|
||||
* discontinuities */
|
||||
mtime_t last_syscr;
|
||||
mtime_t last_pts;
|
||||
count_t c_average_count;
|
||||
/* counter used to compute dynamic average values */
|
||||
int i_synchro_state;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* controls.m: MacOS X interface plugin
|
||||
*****************************************************************************
|
||||
* Copyright (C) 2002-2003 VideoLAN
|
||||
* $Id: controls.m,v 1.45 2003/07/09 01:31:25 hartman Exp $
|
||||
* $Id: controls.m,v 1.46 2003/07/27 14:10:02 massiot Exp $
|
||||
*
|
||||
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
|
||||
* Christophe Massiot <massiot@via.ecp.fr>
|
||||
|
@ -254,6 +254,7 @@
|
|||
return;
|
||||
}
|
||||
|
||||
playlist_Play( p_playlist );
|
||||
input_Seek( p_playlist->p_input, 5, INPUT_SEEK_SECONDS | INPUT_SEEK_CUR );
|
||||
vlc_object_release( p_playlist );
|
||||
}
|
||||
|
@ -269,6 +270,7 @@
|
|||
return;
|
||||
}
|
||||
|
||||
playlist_Play( p_playlist );
|
||||
input_Seek( p_playlist->p_input, -5, INPUT_SEEK_SECONDS | INPUT_SEEK_CUR );
|
||||
vlc_object_release( p_playlist );
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* intf.m: MacOS X interface plugin
|
||||
*****************************************************************************
|
||||
* Copyright (C) 2002-2003 VideoLAN
|
||||
* $Id: intf.m,v 1.91 2003/06/30 01:51:10 hartman Exp $
|
||||
* $Id: intf.m,v 1.92 2003/07/27 14:10:02 massiot Exp $
|
||||
*
|
||||
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
|
||||
* Christophe Massiot <massiot@via.ecp.fr>
|
||||
|
@ -733,7 +733,10 @@ int PlaylistChanged( vlc_object_t *p_this, const char *psz_variable,
|
|||
|
||||
/* release the lock to be able to seek */
|
||||
vlc_mutex_unlock( &p_input->stream.stream_lock );
|
||||
vlc_mutex_unlock( &p_playlist->object_lock );
|
||||
playlist_Play( p_playlist );
|
||||
input_Seek( p_input, i_seek, INPUT_SEEK_SET );
|
||||
vlc_mutex_lock( &p_playlist->object_lock );
|
||||
vlc_mutex_lock( &p_input->stream.stream_lock );
|
||||
|
||||
/* update the old value */
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* input_clock.c: Clock/System date convertions, stream management
|
||||
*****************************************************************************
|
||||
* Copyright (C) 1999-2001 VideoLAN
|
||||
* $Id: input_clock.c,v 1.37 2003/05/22 16:01:02 gbazin Exp $
|
||||
* $Id: input_clock.c,v 1.38 2003/07/27 14:10:02 massiot Exp $
|
||||
*
|
||||
* Authors: Christophe Massiot <massiot@via.ecp.fr>
|
||||
*
|
||||
|
@ -61,6 +61,9 @@
|
|||
* in all the FIFOs, but it may be not enough.
|
||||
*/
|
||||
|
||||
static void ClockNewRef( pgrm_descriptor_t * p_pgrm,
|
||||
mtime_t i_clock, mtime_t i_sysdate );
|
||||
|
||||
/*****************************************************************************
|
||||
* Constants
|
||||
*****************************************************************************/
|
||||
|
@ -74,6 +77,10 @@
|
|||
/* Maximum gap allowed between two CRs. */
|
||||
#define CR_MAX_GAP 1000000
|
||||
|
||||
/* Latency introduced on DVDs with CR == 0 on chapter change - this is from
|
||||
* my dice --Meuuh */
|
||||
#define CR_MEAN_PTS_GAP 300000
|
||||
|
||||
/*****************************************************************************
|
||||
* ClockToSysdate: converts a movie clock to system date
|
||||
*****************************************************************************/
|
||||
|
@ -90,6 +97,12 @@ static mtime_t ClockToSysdate( input_thread_t * p_input,
|
|||
i_sysdate /= 27;
|
||||
i_sysdate /= 1000;
|
||||
i_sysdate += (mtime_t)p_pgrm->sysdate_ref;
|
||||
|
||||
if ( i_sysdate < mdate() - CR_MAX_GAP )
|
||||
{
|
||||
msg_Warn( p_input, "Bogus clock encountered, resetting" );
|
||||
ClockNewRef( p_pgrm, i_clock, i_sysdate = mdate() );
|
||||
}
|
||||
}
|
||||
|
||||
return( i_sysdate );
|
||||
|
@ -115,12 +128,7 @@ static void ClockNewRef( pgrm_descriptor_t * p_pgrm,
|
|||
mtime_t i_clock, mtime_t i_sysdate )
|
||||
{
|
||||
p_pgrm->cr_ref = i_clock;
|
||||
/* this is actually a kludge, but it gives better results when scr
|
||||
* is zero in DVDs: we are 3-4 ms in advance instead of sometimes
|
||||
* 100ms late */
|
||||
p_pgrm->sysdate_ref = ( p_pgrm->last_syscr && !i_clock )
|
||||
? p_pgrm->last_syscr
|
||||
: i_sysdate ;
|
||||
p_pgrm->sysdate_ref = i_sysdate ;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -130,7 +138,7 @@ static void ClockNewRef( pgrm_descriptor_t * p_pgrm,
|
|||
void input_ClockInit( pgrm_descriptor_t * p_pgrm )
|
||||
{
|
||||
p_pgrm->last_cr = 0;
|
||||
p_pgrm->last_syscr = 0;
|
||||
p_pgrm->last_pts = 0;
|
||||
p_pgrm->cr_ref = 0;
|
||||
p_pgrm->sysdate_ref = 0;
|
||||
p_pgrm->delta_cr = 0;
|
||||
|
@ -160,8 +168,8 @@ int input_ClockManageControl( input_thread_t * p_input,
|
|||
|
||||
vlc_cond_wait( &p_input->stream.stream_wait,
|
||||
&p_input->stream.stream_lock );
|
||||
p_pgrm->last_syscr = 0;
|
||||
ClockNewRef( p_pgrm, i_clock, mdate() );
|
||||
ClockNewRef( p_pgrm, i_clock, p_pgrm->last_pts > mdate() ?
|
||||
p_pgrm->last_pts : mdate() );
|
||||
|
||||
if( p_input->stream.i_new_status == PAUSE_S )
|
||||
{
|
||||
|
@ -229,7 +237,9 @@ void input_ClockManageRef( input_thread_t * p_input,
|
|||
if( ( p_pgrm->i_synchro_state != SYNCHRO_OK ) || ( i_clock == 0 ) )
|
||||
{
|
||||
/* Feed synchro with a new reference point. */
|
||||
ClockNewRef( p_pgrm, i_clock, mdate() );
|
||||
ClockNewRef( p_pgrm, i_clock,
|
||||
p_pgrm->last_pts + CR_MEAN_PTS_GAP > mdate() ?
|
||||
p_pgrm->last_pts + CR_MEAN_PTS_GAP : mdate() );
|
||||
p_pgrm->i_synchro_state = SYNCHRO_OK;
|
||||
|
||||
if( p_input->stream.b_pace_control
|
||||
|
@ -241,7 +251,6 @@ void input_ClockManageRef( input_thread_t * p_input,
|
|||
else
|
||||
{
|
||||
p_pgrm->last_cr = 0;
|
||||
p_pgrm->last_syscr = 0;
|
||||
p_pgrm->delta_cr = 0;
|
||||
p_pgrm->c_average_count = 0;
|
||||
}
|
||||
|
@ -266,15 +275,10 @@ void input_ClockManageRef( input_thread_t * p_input,
|
|||
if( p_input->stream.b_pace_control
|
||||
&& p_input->stream.p_selected_program == p_pgrm )
|
||||
{
|
||||
/* We remember the last system date to be able to restart
|
||||
* the synchro we statistically better continuity, after
|
||||
* a zero scr */
|
||||
p_pgrm->last_syscr = ClockToSysdate( p_input, p_pgrm, i_clock );
|
||||
|
||||
/* Wait a while before delivering the packets to the decoder.
|
||||
* In case of multiple programs, we arbitrarily follow the
|
||||
* clock of the first program. */
|
||||
mwait( p_pgrm->last_syscr );
|
||||
mwait( ClockToSysdate( p_input, p_pgrm, i_clock ) );
|
||||
|
||||
/* Now take into account interface changes. */
|
||||
input_ClockManageControl( p_input, p_pgrm, i_clock );
|
||||
|
@ -318,8 +322,9 @@ mtime_t input_ClockGetTS( input_thread_t * p_input,
|
|||
|
||||
if( p_pgrm->i_synchro_state == SYNCHRO_OK )
|
||||
{
|
||||
return( ClockToSysdate( p_input, p_pgrm, i_ts + p_pgrm->delta_cr )
|
||||
+ p_input->i_pts_delay );
|
||||
p_pgrm->last_pts = ClockToSysdate( p_input, p_pgrm,
|
||||
i_ts + p_pgrm->delta_cr );
|
||||
return( p_pgrm->last_pts + p_input->i_pts_delay );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue