- list<shared_ptr<Image> > images = graph->process (frame);
-
- for (list<shared_ptr<Image> >::iterator i = images.begin(); i != images.end(); ++i) {
- shared_ptr<Subtitle> sub;
- if (_timed_subtitle && _timed_subtitle->displayed_at (double (video_frame()) / _film->frames_per_second())) {
- sub = _timed_subtitle->subtitle ();
+ /* Only decide position based on subtitle sources if there is nothing else
+ to go on. Otherwise we can have problems with muxed sources which have
+ (for example) video, audio and a subtitle. If the subtitle data runs out
+ before the video/audio the position() call will return the position of the
+ end of the subs. This causes this file to be pass()ed in favour of others,
+ which can cause bugs like #1581.
+ */
+ if (!pos) {
+ for (auto i: text) {
+ if (!i->ignore() && (!pos || i->position(f) < *pos)) {
+ pos = i->position(f);
+ }