+ stream_timing_t *st = find_st( r, buf );
+
+ if ( st )
+ {
+ // if this is the video stream and we don't have
+ // audio yet or this is an audio stream
+ // generate a new scr
+ if ( st->is_audio ||
+ ( st == r->stream_timing && !r->saw_audio ) )
+ {
+ new_scr_offset( r, buf );
+ }
+ else
+ {
+ // defer the scr change until we get some
+ // audio since audio has a timestamp per
+ // frame but video & subtitles don't. Clear
+ // the timestamps so the decoder will generate
+ // them from the frame durations.
+ if ( st != r->stream_timing )
+ {
+ // not a video stream so it's probably
+ // subtitles - the best we can do is to
+ // line it up with the last video packet.
+ buf->start = r->stream_timing->last;
+ }
+ else
+ {
+ buf->start = -1;
+ buf->renderOffset = -1;
+ }
+ }
+ }
+ else
+ {
+ // we got a new scr at the same time as the first
+ // 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;
+ }
+ }
+ }
+ if ( buf->start != -1 )
+ {
+ int64_t start = buf->start - r->scr_offset;
+ if ( !r->start_found )
+ UpdateState( r, start );
+
+ if ( !r->start_found &&
+ r->job->pts_to_start &&
+ buf->renderOffset != -1 &&
+ start >= r->job->pts_to_start )
+ {
+ // pts_to_start point found
+ // force a new scr offset computation
+ stream_timing_t *st = find_st( r, buf );
+ if ( st &&
+ (st->is_audio ||
+ ( st == r->stream_timing && !r->saw_audio ) ) )
+ {
+ // Re-zero our timestamps
+ st->last = -st->average;
+ new_scr_offset( r, buf );
+ r->start_found = 1;
+ r->job->pts_to_start = 0;
+ }