WIP: partially restore PlayerVideo transfer over network. faster-subtitle-moving
authorCarl Hetherington <cth@carlh.net>
Sun, 12 Jan 2020 23:19:41 +0000 (00:19 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 12 Jan 2020 23:19:41 +0000 (00:19 +0100)
src/lib/bitmap_text.cc
src/lib/bitmap_text.h
src/lib/font.cc
src/lib/font.h
src/lib/player_text.cc
src/lib/player_text.h
src/lib/player_video.cc
src/lib/string_text.cc
src/lib/string_text.h

index 6e690b31318a3a4eb4bf6950f70facbf87fd1034..21f733983b1f0213eab34cb1de2209c95d8fa181 100644 (file)
 
 #include "bitmap_text.h"
 #include "image.h"
+#include "dcpomatic_socket.h"
+#include <dcp/raw_convert.h>
+
+using boost::shared_ptr;
+using dcp::raw_convert;
 
 bool
 operator== (BitmapText const & a, BitmapText const & b)
@@ -37,4 +42,20 @@ operator!= (BitmapText const & a, BitmapText const & b)
        return !(a == b);
 }
 
+void
+BitmapText::transfer_xml (xmlpp::Node* node) const
+{
+       node->add_child("Width")->add_child_text(raw_convert<std::string>(image->size().width));
+       node->add_child("Height")->add_child_text(raw_convert<std::string>(image->size().height));
+       node->add_child("RectX")->add_child_text(raw_convert<std::string>(rectangle.x));
+       node->add_child("RectY")->add_child_text(raw_convert<std::string>(rectangle.y));
+       node->add_child("RectWidth")->add_child_text(raw_convert<std::string>(rectangle.width));
+       node->add_child("RectHeight")->add_child_text(raw_convert<std::string>(rectangle.height));
+}
+
+void
+BitmapText::transfer_binary (shared_ptr<Socket> socket) const
+{
+       image->write_to_socket (socket);
+}
 
index e9d7c3b796211a367d5ac9bb1ade3890c48f5025..6fa8ecd60c1bdfa8e323f1105c33eb8196a9feb8 100644 (file)
 #define DCPOMATIC_BITMAP_CAPTION_H
 
 #include "rect.h"
+#include <libxml++/libxml++.h>
 #include <boost/shared_ptr.hpp>
 
 class Image;
+class Socket;
 
 class BitmapText
 {
@@ -34,6 +36,9 @@ public:
                , rectangle (r)
        {}
 
+       void transfer_xml (xmlpp::Node* node) const;
+       void transfer_binary (boost::shared_ptr<Socket> socket) const;
+
        boost::shared_ptr<Image> image;
        /** Area that the subtitle covers on its corresponding video, expressed in
         *  proportions of the image size; e.g. rectangle.x = 0.5 would mean that
index 019c9ab076fe8f83e362c8030f2542b4beceb1df..c817d361018ce9c9bfc51068a4846e4ce06c284e 100644 (file)
 
 #include "font.h"
 #include "dcpomatic_assert.h"
+#include "dcpomatic_socket.h"
+#include <dcp/data.h>
+#include <dcp/raw_convert.h>
 #include <libxml++/libxml++.h>
 #include <boost/foreach.hpp>
 
 using std::string;
+using boost::shared_ptr;
+using dcp::raw_convert;
 using namespace dcpomatic;
 
 Font::Font (cxml::NodePtr node)
@@ -38,7 +43,7 @@ Font::Font (cxml::NodePtr node)
 }
 
 void
-Font::as_xml (xmlpp::Node* node)
+Font::as_xml (xmlpp::Node* node) const
 {
        node->add_child("Id")->add_child_text (_id);
        if (_file) {
@@ -46,6 +51,27 @@ Font::as_xml (xmlpp::Node* node)
        }
 }
 
+/** Add things to an XML node to describe this font for transfer across
+ *  a network to another machine.  The companion method send_binary() will be called
+ *  to send binary parts.
+ */
+void
+Font::transfer_xml (xmlpp::Node* node) const
+{
+       node->add_child("Id")->add_child_text (_id);
+       if (_file) {
+               node->add_child("FileLength")->add_child_text(raw_convert<string>(boost::filesystem::file_size(*_file)));
+       }
+}
+
+void
+Font::transfer_binary (shared_ptr<Socket> socket) const
+{
+       if (_file) {
+               dcp::Data data (*_file);
+               socket->write (data.data().get(), data.size());
+       }
+}
 
 bool
 dcpomatic::operator== (Font const & a, Font const & b)
index 5876bf8a46052cbbbd75ad2adb941a581b2c7029..f6949e419c1b29cf6988c7f9bd57ec5021f6cc64 100644 (file)
@@ -27,6 +27,8 @@
 #include <boost/filesystem.hpp>
 #include <string>
 
+class Socket;
+
 namespace dcpomatic {
 
 class Font
@@ -37,7 +39,10 @@ public:
 
        explicit Font (cxml::NodePtr node);
 
-       void as_xml (xmlpp::Node* node);
+       void as_xml (xmlpp::Node* node) const;
+
+       void transfer_xml (xmlpp::Node* node) const;
+       void transfer_binary (boost::shared_ptr<Socket> socket) const;
 
        std::string id () const {
                return _id;
index d9c153416cd25cfd6f797de9bf611df3bf7faab0..736421705b0c7bbc49f31acfa1c44c000ab10837 100644 (file)
 #include "player_text.h"
 #include "font.h"
 #include "util.h"
+#include "dcpomatic_socket.h"
+#include "image.h"
+#include <dcp/raw_convert.h>
+#include <libxml++/libxml++.h>
 #include <boost/foreach.hpp>
 
 using std::list;
 using boost::shared_ptr;
+using dcp::raw_convert;
 using namespace dcpomatic;
 
+void
+PlayerText::add_metadata (xmlpp::Node* node) const
+{
+       BOOST_FOREACH (shared_ptr<Font> i, fonts) {
+               /* XXX: transferring a font file for every frame that needs it seems a bit wasteful,
+                  but probably not so bad in the great scheme of things.
+               */
+               i->transfer_xml (node->add_child("Font"));
+       }
+
+       BOOST_FOREACH (BitmapText i, bitmap) {
+               i.transfer_xml (node->add_child("Bitmap"));
+       }
+
+       BOOST_FOREACH (StringText i, string) {
+               i.transfer_xml (node->add_child("String"));
+       }
+}
+
+void
+PlayerText::send_binary (shared_ptr<Socket> socket) const
+{
+       BOOST_FOREACH (shared_ptr<Font> i, fonts) {
+               i->transfer_binary (socket);
+       }
+
+       BOOST_FOREACH (BitmapText i, bitmap) {
+               i.transfer_binary (socket);
+       }
+}
+
 void
 PlayerText::add_fonts (list<shared_ptr<Font> > fonts_)
 {
index 3c571b324aa40861eb6a73a7fc9b3de185f0b466..51b49095d80d039cd9764a705e22abf8cb5ea743 100644 (file)
@@ -29,10 +29,15 @@ namespace dcpomatic {
        class Font;
 }
 
+class Socket;
+
 /** A set of text (subtitle/CCAP) which span the same time period */
 class PlayerText
 {
 public:
+       void add_metadata (xmlpp::Node* node) const;
+       void send_binary (boost::shared_ptr<Socket> socket) const;
+
        void add_fonts (std::list<boost::shared_ptr<dcpomatic::Font> > fonts_);
        std::list<boost::shared_ptr<dcpomatic::Font> > fonts;
 
index 31038db03c5e445e854a8dda724739ab42dfbf91..431bc783bd1c21e8754e33b2289ecaa3ab983d19 100644 (file)
@@ -234,25 +234,18 @@ PlayerVideo::add_metadata (xmlpp::Node* node) const
        if (_colour_conversion) {
                _colour_conversion.get().as_xml (node);
        }
-       /* XXX_c
-       if (_text) {
-               node->add_child ("SubtitleWidth")->add_child_text (raw_convert<string> (_text->image->size().width));
-               node->add_child ("SubtitleHeight")->add_child_text (raw_convert<string> (_text->image->size().height));
-               node->add_child ("SubtitleX")->add_child_text (raw_convert<string> (_text->position.x));
-               node->add_child ("SubtitleY")->add_child_text (raw_convert<string> (_text->position.y));
+       BOOST_FOREACH (PlayerText i, _text) {
+               i.add_metadata(node->add_child("Text"));
        }
-       */
 }
 
 void
 PlayerVideo::send_binary (shared_ptr<Socket> socket) const
 {
        _in->send_binary (socket);
-       /* XXX_c
-       if (_text) {
-               _text->image->write_to_socket (socket);
+       BOOST_FOREACH (PlayerText i, _text) {
+               i.send_binary (socket);
        }
-       */
 }
 
 bool
index 54ff3257840cfe52dddebb0c1cc170993035e17e..bf017caf890bde654529e7ce53afc761c2312a5d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2016-2019 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2016-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 */
 
 #include "string_text.h"
+#include <dcp/raw_convert.h>
+#include <libxml++/libxml++.h>
+
+using std::string;
+using dcp::raw_convert;
 
 bool
 operator== (StringText const & a, StringText const & b)
@@ -26,3 +31,24 @@ operator== (StringText const & a, StringText const & b)
        return static_cast<dcp::SubtitleString const &>(a) == static_cast<dcp::SubtitleString const &>(b) && a.outline_width == b.outline_width;
 }
 
+void
+StringText::transfer_xml (xmlpp::Node* node) const
+{
+       if (font()) {
+               node->add_child("Font")->add_child_text(*font());
+       }
+       node->add_child("Italic")->add_child_text(italic() ? "1" : "0");
+       node->add_child("Bold")->add_child_text(bold() ? "1" : "0");
+       node->add_child("Underline")->add_child_text(underline() ? "1" : "0");
+       node->add_child("Colour")->add_child_text(colour().to_argb_string());
+       node->add_child("Size")->add_child_text(raw_convert<string>(size()));
+       node->add_child("AspectAdjust")->add_child_text(raw_convert<string>(aspect_adjust()));
+       node->add_child("Direction")->add_child_text(dcp::direction_to_string(direction()));
+       node->add_child("Text")->add_child_text(text());
+       node->add_child("Effect")->add_child_text(dcp::effect_to_string(effect()));
+       node->add_child("EffectColour")->add_child_text(effect_colour().to_argb_string());
+
+       node->add_child("OutlineWidth")->add_child_text(raw_convert<string>(outline_width));
+}
+
+
index 4063a688d96669ead8628b88f0a6d459c0c3fc4f..ef965d129059467858c5bd3f0900c6911ff6849b 100644 (file)
@@ -35,6 +35,8 @@ public:
                , outline_width (outline_width_)
        {}
 
+       void transfer_xml (xmlpp::Node* node) const;
+
        int outline_width;
 };