Fix crash if quick_refresh() fails.
[dcpomatic.git] / src / lib / player_video.cc
index 2e53a6aa6be0e67a45e58ae3ffb403d597bfe676..8eb39efedca6484e47b50d7fe679cef8d317197e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -19,6 +19,8 @@
 */
 
 #include "player_video.h"
+#include "content.h"
+#include "video_content.h"
 #include "image.h"
 #include "image_proxy.h"
 #include "j2k_image_proxy.h"
@@ -33,6 +35,7 @@ extern "C" {
 using std::string;
 using std::cout;
 using boost::shared_ptr;
+using boost::weak_ptr;
 using boost::dynamic_pointer_cast;
 using boost::optional;
 using boost::function;
@@ -47,7 +50,9 @@ PlayerVideo::PlayerVideo (
        dcp::Size out_size,
        Eyes eyes,
        Part part,
-       optional<ColourConversion> colour_conversion
+       optional<ColourConversion> colour_conversion,
+       weak_ptr<Content> content,
+       optional<Frame> video_frame
        )
        : _in (in)
        , _crop (crop)
@@ -57,6 +62,8 @@ PlayerVideo::PlayerVideo (
        , _eyes (eyes)
        , _part (part)
        , _colour_conversion (colour_conversion)
+       , _content (content)
+       , _video_frame (video_frame)
 {
 
 }
@@ -79,7 +86,7 @@ PlayerVideo::PlayerVideo (shared_ptr<cxml::Node> node, shared_ptr<Socket> socket
        if (node->optional_number_child<int> ("SubtitleX")) {
 
                shared_ptr<Image> image (
-                       new Image (AV_PIX_FMT_RGBA, dcp::Size (node->number_child<int> ("SubtitleWidth"), node->number_child<int> ("SubtitleHeight")), true)
+                       new Image (AV_PIX_FMT_BGRA, dcp::Size (node->number_child<int> ("SubtitleWidth"), node->number_child<int> ("SubtitleHeight")), true)
                        );
 
                image->read_from_socket (socket);
@@ -135,7 +142,7 @@ PlayerVideo::image (dcp::NoteHandler note, function<AVPixelFormat (AVPixelFormat
                );
 
        if (_subtitle) {
-               out->alpha_blend (_subtitle->image, _subtitle->position);
+               out->alpha_blend (Image::ensure_aligned (_subtitle->image), _subtitle->position);
        }
 
        if (_fade) {
@@ -246,3 +253,55 @@ PlayerVideo::keep_xyz_or_rgb (AVPixelFormat p)
 {
        return p == AV_PIX_FMT_XYZ12LE ? AV_PIX_FMT_XYZ12LE : AV_PIX_FMT_RGB48LE;
 }
+
+void
+PlayerVideo::prepare ()
+{
+       _in->prepare (_inter_size);
+}
+
+size_t
+PlayerVideo::memory_used () const
+{
+       return _in->memory_used();
+}
+
+/** @return Shallow copy of this; _in and _subtitle are shared between the original and the copy */
+shared_ptr<PlayerVideo>
+PlayerVideo::shallow_copy () const
+{
+       return shared_ptr<PlayerVideo>(
+               new PlayerVideo(
+                       _in,
+                       _crop,
+                       _fade,
+                       _inter_size,
+                       _out_size,
+                       _eyes,
+                       _part,
+                       _colour_conversion,
+                       _content,
+                       _video_frame
+                       )
+               );
+}
+
+/** Re-read crop, fade, inter/out size and colour conversion from our content.
+ *  @return true if this was possible, false if not.
+ */
+bool
+PlayerVideo::reset_metadata (dcp::Size video_container_size, dcp::Size film_frame_size)
+{
+       shared_ptr<Content> content = _content.lock();
+       if (!content || !_video_frame) {
+               return false;
+       }
+
+       _crop = content->video->crop();
+       _fade = content->video->fade(_video_frame.get());
+       _inter_size = content->video->scale().size(content->video, video_container_size, film_frame_size);
+       _out_size = video_container_size;
+       _colour_conversion = content->video->colour_conversion();
+
+       return true;
+}