Fix subtitle scaling when writing PNG subs.
[dcpomatic.git] / src / lib / player.cc
index 5dfc4e66dee46483a578d6a620144af1b24efd9f..12c03e3066ad4c47ed311ee454f2c482c0eabe5e 100644 (file)
@@ -199,7 +199,7 @@ Player::setup_pieces_unlocked ()
                                bind(&Player::plain_text_start, this, weak_ptr<Piece>(piece), weak_ptr<const TextContent>((*j)->content()), _1)
                                );
                        (*j)->Stop.connect (
-                               bind(&Player::subtitle_stop, this, weak_ptr<Piece>(piece), weak_ptr<const TextContent>((*j)->content()), _1, _2)
+                               bind(&Player::subtitle_stop, this, weak_ptr<Piece>(piece), weak_ptr<const TextContent>((*j)->content()), _1)
                                );
 
                        ++j;
@@ -237,6 +237,8 @@ Player::playlist_content_change (ChangeType type, int property, bool frequent)
        } else if (type == CHANGE_TYPE_DONE) {
                /* A change in our content has gone through.  Re-build our pieces. */
                setup_pieces ();
+       } else if (type == CHANGE_TYPE_CANCELLED) {
+               _suspended = false;
        }
 
        Change (type, property, frequent);
@@ -914,10 +916,13 @@ Player::bitmap_text_start (weak_ptr<Piece> wp, weak_ptr<const TextContent> wc, C
        subtitle.sub.rectangle.height *= text->y_scale ();
 
        PlayerText ps;
-       ps.bitmap.push_back (subtitle.sub);
+       shared_ptr<Image> image = subtitle.sub.image;
+       /* We will scale the subtitle up to fit _video_container_size */
+       dcp::Size scaled_size (subtitle.sub.rectangle.width * _video_container_size.width, subtitle.sub.rectangle.height * _video_container_size.height);
+       ps.bitmap.push_back (BitmapText(image->scale(scaled_size, dcp::YUV_TO_RGB_REC601, image->pixel_format(), true, _fast), subtitle.sub.rectangle));
        DCPTime from (content_time_to_dcp (piece, subtitle.from()));
 
-       _active_texts[subtitle.type()].add_from (wc, ps, from);
+       _active_texts[text->type()].add_from (wc, ps, from);
 }
 
 void
@@ -961,19 +966,23 @@ Player::plain_text_start (weak_ptr<Piece> wp, weak_ptr<const TextContent> wc, Co
                ps.add_fonts (text->fonts ());
        }
 
-       _active_texts[subtitle.type()].add_from (wc, ps, from);
+       _active_texts[text->type()].add_from (wc, ps, from);
 }
 
 void
-Player::subtitle_stop (weak_ptr<Piece> wp, weak_ptr<const TextContent> wc, ContentTime to, TextType type)
+Player::subtitle_stop (weak_ptr<Piece> wp, weak_ptr<const TextContent> wc, ContentTime to)
 {
-       if (!_active_texts[type].have (wc)) {
+       shared_ptr<const TextContent> text = wc.lock ();
+       if (!text) {
+               return;
+       }
+
+       if (!_active_texts[text->type()].have(wc)) {
                return;
        }
 
        shared_ptr<Piece> piece = wp.lock ();
-       shared_ptr<const TextContent> text = wc.lock ();
-       if (!piece || !text) {
+       if (!piece) {
                return;
        }
 
@@ -983,11 +992,11 @@ Player::subtitle_stop (weak_ptr<Piece> wp, weak_ptr<const TextContent> wc, Conte
                return;
        }
 
-       pair<PlayerText, DCPTime> from = _active_texts[type].add_to (wc, dcp_to);
+       pair<PlayerText, DCPTime> from = _active_texts[text->type()].add_to (wc, dcp_to);
 
-       bool const always = (type == TEXT_OPEN_SUBTITLE && _always_burn_open_subtitles);
+       bool const always = (text->type() == TEXT_OPEN_SUBTITLE && _always_burn_open_subtitles);
        if (text->use() && !always && !text->burn()) {
-               Text (from.first, type, DCPTimePeriod (from.second, dcp_to));
+               Text (from.first, text->type(), text->dcp_track().get_value_or(DCPTextTrack()), DCPTimePeriod (from.second, dcp_to));
        }
 }