}
st->id = buf->id;
st->average = 30.*90.;
- st->last = buf->renderOffset - st->average;
+ if ( r->saw_video )
+ st->last = buf->renderOffset - st->average;
+ else
+ st->last = -st->average;
if ( ( st->is_audio = is_audio( r, buf->id ) ) != 0 )
{
r->saw_audio = 1;
hb_list_rem( list, buf );
fifos = GetFifoForId( r->job, buf->id );
- if ( ! r->saw_video )
+ if ( fifos && ! r->saw_video )
{
- /* The first video packet defines 'time zero' so discard
- data until we get a video packet with a PTS & DTS */
- if ( buf->id == r->title->video_id && buf->start != -1 &&
- buf->renderOffset != -1 )
+ // The first data packet with a PTS from an audio or video stream
+ // that we're decoding defines 'time zero'. Discard packets until
+ // we get one.
+ if ( buf->start != -1 && buf->renderOffset != -1 &&
+ ( buf->id == r->title->video_id || is_audio( r, buf->id ) ) )
{
// force a new scr offset computation
r->scr_changes = r->demux.scr_changes - 1;
+ // create a stream state if we don't have one so the
+ // offset will get computed correctly.
+ id_to_st( r, buf );
r->saw_video = 1;
- hb_log( "reader: first SCR %lld", r->demux.last_scr );
+ hb_log( "reader: first SCR %"PRId64" id %d DTS %"PRId64,
+ r->demux.last_scr, buf->id, buf->renderOffset );
}
else
{
// packet of a stream we've never seen before. We
// have no idea what the timing should be so toss
// this buffer & wait for a stream we've already seen.
+ // add stream to list of streams we have seen
+ id_to_st( r, buf );
hb_buffer_close( &buf );
continue;
}
hb_title_t * title = job->title;
hb_audio_t * audio;
hb_subtitle_t * subtitle;
- int i, n;
- static hb_fifo_t * fifos[8];
+ int i, n, count;
+ static hb_fifo_t * fifos[100];
memset(fifos, 0, sizeof(fifos));
}
}
- for( i=0; i < hb_list_count( title->list_subtitle ); i++ ) {
+ n = 0;
+ count = hb_list_count( title->list_subtitle );
+ count = count > 99 ? 99 : count;
+ for( i=0; i < count; i++ ) {
subtitle = hb_list_item( title->list_subtitle, i );
if (id == subtitle->id) {
subtitle->hits++;
- if( !job->indepth_scan || subtitle->config.force )
+ if( !job->indepth_scan || job->select_subtitle_config.force )
{
/*
* Pass the subtitles to be processed if we are not scanning, or if
* we are scanning and looking for forced subs, then pass them up
* to decode whether the sub is a forced one.
*/
- fifos[0] = subtitle->fifo_in;
- return fifos;
+ fifos[n++] = subtitle->fifo_in;
}
- break;
}
}
+ if ( n != 0 )
+ {
+ return fifos;
+ }
if( !job->indepth_scan )
{