Speed some operations by re-using the last PlayerVideo but with
[dcpomatic.git] / src / lib / ffmpeg_decoder.cc
index 378b59901163339f2a8dbb1175f1847e87b0fb1e..a5b6af7de51497550c8c1d450d20f9d04241ad68 100644 (file)
@@ -98,7 +98,8 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log>
        }
 
        if (c->subtitle) {
-               subtitle.reset (new SubtitleDecoder (this, c->subtitle, log));
+               /* XXX: this time here should be the time of the first subtitle, not 0 */
+               subtitle.reset (new SubtitleDecoder (this, c->subtitle, log, ContentTime()));
        }
 
        _next_time.resize (_format_context->nb_streams);
@@ -128,7 +129,7 @@ FFmpegDecoder::flush ()
        if (video) {
                double const vfr = _ffmpeg_content->video_frame_rate().get();
                Frame const f = full_length.frames_round (vfr);
-               Frame v = video->position().frames_round (vfr);
+               Frame v = video->position().frames_round (vfr) + 1;
                while (v < f) {
                        video->emit (shared_ptr<const ImageProxy> (new RawImageProxy (_black_image)), v);
                        ++v;
@@ -562,6 +563,8 @@ FFmpegDecoder::decode_subtitle_packet ()
        _have_current_subtitle = true;
        if (sub_period.to) {
                _current_subtitle_to = *sub_period.to + _pts_offset;
+       } else {
+               _current_subtitle_to = optional<ContentTime>();
        }
 
        for (unsigned int i = 0; i < sub.num_rects; ++i) {
@@ -582,16 +585,20 @@ FFmpegDecoder::decode_subtitle_packet ()
                }
        }
 
+       if (_current_subtitle_to) {
+               subtitle->emit_stop (*_current_subtitle_to);
+       }
+
        avsubtitle_free (&sub);
 }
 
 void
 FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime from)
 {
-       /* Note RGBA is expressed little-endian, so the first byte in the word is R, second
-          G, third B, fourth A.
+       /* Note BGRA is expressed little-endian, so the first byte in the word is B, second
+          G, third R, fourth A.
        */
-       shared_ptr<Image> image (new Image (AV_PIX_FMT_RGBA, dcp::Size (rect->w, rect->h), true));
+       shared_ptr<Image> image (new Image (AV_PIX_FMT_BGRA, dcp::Size (rect->w, rect->h), true));
 
 #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
        /* Start of the first line in the subtitle */
@@ -635,8 +642,8 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime
                uint32_t* out_line_p = out_p;
                for (int x = 0; x < rect->w; ++x) {
                        RGBA const p = mapped_palette[*sub_line_p++];
-                       /* XXX: this seems to be wrong to me (isn't the output image RGBA?) but it looks right on screen */
-                       *out_line_p++ = (p.a << 24) | (p.r << 16) | (p.g << 8) | p.b;
+                       /* XXX: this seems to be wrong to me (isn't the output image BGRA?) but it looks right on screen */
+                       *out_line_p++ = (p.a << 24) | (p.b << 16) | (p.g << 8) | p.r;
                }
 #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
                sub_p += rect->pict.linesize[0];