# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
#include <vlc_input.h>
#include <vlc_codec.h>
#include <vlc_codec_synchro.h>
/* */
int i_frame_rate;
- int i_current_rate;
- bool b_no_skip;
- bool b_quiet;
+ bool b_no_skip;
+ bool b_quiet;
/* date of the beginning of the decoding of the current picture */
mtime_t decoding_start;
unsigned int pi_meaningful[4]; /* number of durations read */
/* render_time filled by SynchroChoose() */
- int i_render_time;
+ int i_render_time;
/* stream context */
int i_nb_ref; /* Number of reference pictures */
*****************************************************************************/
decoder_synchro_t * decoder_SynchroInit( decoder_t *p_dec, int i_frame_rate )
{
- decoder_synchro_t * p_synchro = malloc( sizeof(*p_synchro) );
- if ( p_synchro == NULL )
- {
- msg_Err( p_dec, "out of memory" );
+ decoder_synchro_t * p_synchro = calloc( 1, sizeof(*p_synchro) );
+ if( !p_synchro )
return NULL;
- }
- memset( p_synchro, 0, sizeof(*p_synchro) );
p_synchro->p_dec = p_dec;
- p_synchro->b_no_skip = !config_GetInt( p_dec, "skip-frames" );
- p_synchro->b_quiet = config_GetInt( p_dec, "quiet-synchro" );
+ p_synchro->b_no_skip = !var_InheritBool( p_dec, "skip-frames" );
+ p_synchro->b_quiet = var_InheritBool( p_dec, "quiet-synchro" );
/* We use a fake stream pattern, which is often right. */
p_synchro->i_n_p = p_synchro->i_eta_p = DEFAULT_NB_P;
memset( p_synchro->pi_meaningful, 0, 4 * sizeof(unsigned int) );
p_synchro->i_nb_ref = 0;
p_synchro->i_trash_nb_ref = p_synchro->i_dec_nb_ref = 0;
- p_synchro->current_pts = mdate() + DEFAULT_PTS_DELAY;
+ p_synchro->current_pts = 1,
p_synchro->backward_pts = 0;
p_synchro->i_current_period = p_synchro->i_backward_period = 0;
p_synchro->i_trashed_pic = p_synchro->i_not_chosen_pic =
+ p_synchro->i_render_time)
#define S (*p_synchro)
mtime_t now, period;
- mtime_t pts = 0;
+ mtime_t pts;
bool b_decode = 0;
+ int i_current_rate;
if ( p_synchro->b_no_skip )
return 1;
+ i_current_rate = decoder_GetDisplayRate( p_synchro->p_dec );
+
now = mdate();
period = 1000000 * 1001 / p_synchro->i_frame_rate
- * p_synchro->i_current_rate / INPUT_RATE_DEFAULT;
+ * i_current_rate / INPUT_RATE_DEFAULT;
p_synchro->i_render_time = i_render_time;
case I_CODING_TYPE:
if( b_low_delay )
{
- pts = S.current_pts;
+ pts = decoder_GetDisplayDate( p_synchro->p_dec, S.current_pts );
}
else if( S.backward_pts )
{
- pts = S.backward_pts;
+ pts = decoder_GetDisplayDate( p_synchro->p_dec, S.backward_pts );
}
else
{
* | +- current picture
* +- current PTS
*/
- pts = S.current_pts + period * (S.i_n_b + 2);
+ pts = decoder_GetDisplayDate( p_synchro->p_dec, S.current_pts ) + period * (S.i_n_b + 2);
}
- if( (1 + S.i_n_p * (S.i_n_b + 1)) * period >
- S.p_tau[I_CODING_TYPE] )
+ if( (1 + S.i_n_p * (S.i_n_b + 1)) * period > S.p_tau[I_CODING_TYPE] )
{
b_decode = 1;
}
{
b_decode = (pts - now) > (TAU_PRIME(I_CODING_TYPE) + DELTA);
}
+ if( pts <= VLC_TS_INVALID )
+ b_decode = 1;
+
if( !b_decode && !p_synchro->b_quiet )
{
msg_Warn( p_synchro->p_dec,
- "synchro trashing I ("I64Fd")", pts - now );
+ "synchro trashing I (%"PRId64")", pts - now );
}
break;
case P_CODING_TYPE:
if( b_low_delay )
{
- pts = S.current_pts;
+ pts = decoder_GetDisplayDate( p_synchro->p_dec, S.current_pts );
}
else if( S.backward_pts )
{
- pts = S.backward_pts;
+ pts = decoder_GetDisplayDate( p_synchro->p_dec, S.backward_pts );
}
else
{
- pts = S.current_pts + period * (S.i_n_b + 1);
+ pts = decoder_GetDisplayDate( p_synchro->p_dec, S.current_pts + period * (S.i_n_b + 1) );
}
if( p_synchro->i_nb_ref < 1 )
{
b_decode = 0;
}
+ if( p_synchro->i_nb_ref >= 1 && pts <= VLC_TS_INVALID )
+ b_decode = 1;
break;
case B_CODING_TYPE:
- pts = S.current_pts;
+ pts = decoder_GetDisplayDate( p_synchro->p_dec, S.current_pts );
if( p_synchro->i_nb_ref < 2 )
{
{
b_decode = 0;
}
+ if( p_synchro->i_nb_ref >= 2 && pts <= VLC_TS_INVALID )
+ b_decode = 1;
+ break;
}
if( !b_decode )
* decoder_SynchroNewPicture: Update stream structure and PTS
*****************************************************************************/
void decoder_SynchroNewPicture( decoder_synchro_t * p_synchro, int i_coding_type,
- int i_repeat_field, mtime_t next_pts,
- mtime_t next_dts, int i_current_rate,
- bool b_low_delay )
+ int i_repeat_field, mtime_t next_pts,
+ mtime_t next_dts, bool b_low_delay )
{
- mtime_t period = 1000000 * 1001 / p_synchro->i_frame_rate
- * i_current_rate / INPUT_RATE_DEFAULT;
+ mtime_t period = 1000000 * 1001 / p_synchro->i_frame_rate;
#if 0
mtime_t now = mdate();
#endif
- p_synchro->i_current_rate = i_current_rate;
switch( i_coding_type )
{
#if 0
if( !p_synchro->b_quiet )
- msg_Dbg( p_synchro->p_dec, "I("I64Fd") P("I64Fd")[%d] B("I64Fd")"
- "[%d] YUV("I64Fd") : trashed %d:%d/%d",
+ msg_Dbg( p_synchro->p_dec, "I(%"PRId64") P(%"PRId64")[%d] B(%"PRId64")"
+ "[%d] YUV(%"PRId64") : trashed %d:%d/%d",
p_synchro->p_tau[I_CODING_TYPE],
p_synchro->p_tau[P_CODING_TYPE],
p_synchro->i_n_p,
> PTS_THRESHOLD) && !p_synchro->b_quiet )
{
msg_Warn( p_synchro->p_dec, "decoder synchro warning: pts != "
- "current_date ("I64Fd")",
+ "current_date (%"PRId64")",
p_synchro->current_pts
- next_pts );
}
|| p_synchro->backward_pts - next_dts
> PTS_THRESHOLD) && !p_synchro->b_quiet )
{
- msg_Warn( p_synchro->p_dec, "backward_pts != dts ("I64Fd")",
+ msg_Warn( p_synchro->p_dec, "backward_pts != dts (%"PRId64")",
next_dts
- p_synchro->backward_pts );
}
> PTS_THRESHOLD) && !p_synchro->b_quiet )
{
msg_Warn( p_synchro->p_dec,
- "backward_pts != current_pts ("I64Fd")",
+ "backward_pts != current_pts (%"PRId64")",
p_synchro->current_pts
- p_synchro->backward_pts );
}
|| p_synchro->current_pts - next_dts
> PTS_THRESHOLD) && !p_synchro->b_quiet )
{
- msg_Warn( p_synchro->p_dec, "dts != current_pts ("I64Fd")",
+ msg_Warn( p_synchro->p_dec, "dts != current_pts (%"PRId64")",
p_synchro->current_pts
- next_dts );
}
/* We cannot be _that_ late, something must have happened, reinit
* the dates. */
if( !p_synchro->b_quiet )
- msg_Warn( p_synchro->p_dec, "PTS << now ("I64Fd"), resetting",
+ msg_Warn( p_synchro->p_dec, "PTS << now (%"PRId64"), resetting",
now - p_synchro->current_pts - DEFAULT_PTS_DELAY );
p_synchro->current_pts = now + DEFAULT_PTS_DELAY;
}