typedef struct
{
- int64_t last; // last timestamp seen on this stream
double average; // average time between packets
+ int64_t last; // last timestamp seen on this stream
int id; // stream id
} stream_timing_t;
{
stream_timing_t *st = id_to_st( r, buf );
double dt = buf->renderOffset - st->last;
- st->average += ( dt - st->average ) * (1./16.);
+ st->average += ( dt - st->average ) * (1./32.);
st->last = buf->renderOffset;
}
list = hb_list_init();
hb_buffer_t *ps = hb_buffer_init( HB_DVD_READ_BUFFER_SIZE );
+ r->demux.flaky_clock = r->title->flaky_clock;
while( !*r->die && !r->job->done )
{
if ( buf->id == r->title->video_id && buf->start != -1 &&
buf->renderOffset != -1 )
{
+ // force a new scr offset computation
+ r->scr_changes = r->demux.scr_changes - 1;
r->saw_video = 1;
hb_log( "reader: first SCR %lld", r->demux.last_scr );
}
// change. Compute a new scr offset that would make this
// packet follow the last of this stream with the correct
// average spacing.
- if ( find_st( r, buf ) )
+ stream_timing_t *st = find_st( r, buf );
+
+ if ( st )
{
- new_scr_offset( r, buf );
+ // if this isn't the video stream or we don't
+ // have audio yet then generate a new scr
+ if ( st != r->stream_timing ||
+ r->stream_timing[1].id == -1 )
+ {
+ new_scr_offset( r, buf );
+ }
+ else
+ {
+ // defer the scr change until we get some
+ // audio since audio has a timestamp per
+ // frame but video doesn't. Clear the timestamps
+ // so the decoder will regenerate them from
+ // the frame durations.
+ buf->start = -1;
+ buf->renderOffset = -1;
+ }
}
else
{
}
hb_log( "reader: done. %d scr changes", r->demux.scr_changes );
+ if ( r->demux.dts_drops )
+ {
+ hb_log( "reader: %d drops because DTS out of range", r->demux.dts_drops );
+ }
free( r );
_r = NULL;