summaryrefslogtreecommitdiff
path: root/src/lib/player_video_frame.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-05-14 19:27:04 +0100
committerCarl Hetherington <cth@carlh.net>2014-05-14 19:27:04 +0100
commit21e8238484af35ac207b01defe406e73445632be (patch)
tree8985d03f7b5641fd4e160d5ca4cac253976d51ff /src/lib/player_video_frame.cc
parent5c09a82e483593fb37da0cad20679be735887613 (diff)
Make DCPVideoFrame use PlayerVideoFrame to store its image.
Diffstat (limited to 'src/lib/player_video_frame.cc')
-rw-r--r--src/lib/player_video_frame.cc64
1 files changed, 63 insertions, 1 deletions
diff --git a/src/lib/player_video_frame.cc b/src/lib/player_video_frame.cc
index 571c18b6e..cbe879d10 100644
--- a/src/lib/player_video_frame.cc
+++ b/src/lib/player_video_frame.cc
@@ -17,10 +17,15 @@
*/
+#include <libdcp/raw_convert.h>
#include "player_video_frame.h"
#include "image.h"
+#include "scaler.h"
+using std::string;
+using std::cout;
using boost::shared_ptr;
+using libdcp::raw_convert;
PlayerVideoFrame::PlayerVideoFrame (
shared_ptr<const Image> in,
@@ -42,6 +47,33 @@ PlayerVideoFrame::PlayerVideoFrame (
}
+PlayerVideoFrame::PlayerVideoFrame (shared_ptr<cxml::Node> node, shared_ptr<Socket> socket)
+{
+ _crop = Crop (node);
+
+ _inter_size = libdcp::Size (node->number_child<int> ("InterWidth"), node->number_child<int> ("InterHeight"));
+ _out_size = libdcp::Size (node->number_child<int> ("OutWidth"), node->number_child<int> ("OutHeight"));
+ _scaler = Scaler::from_id (node->string_child ("Scaler"));
+ _eyes = (Eyes) node->number_child<int> ("Eyes");
+ _colour_conversion = ColourConversion (node);
+
+ shared_ptr<Image> image (new Image (PIX_FMT_RGB24, libdcp::Size (node->number_child<int> ("InWidth"), node->number_child<int> ("InHeight")), true));
+ image->read_from_socket (socket);
+ _in = image;
+
+ if (node->optional_number_child<int> ("SubtitleX")) {
+
+ _subtitle_position = Position<int> (node->number_child<int> ("SubtitleX"), node->number_child<int> ("SubtitleY"));
+
+ shared_ptr<Image> image (
+ new Image (PIX_FMT_RGBA, libdcp::Size (node->number_child<int> ("SubtitleWidth"), node->number_child<int> ("SubtitleHeight")), true)
+ );
+
+ image->read_from_socket (socket);
+ _subtitle_image = image;
+ }
+}
+
void
PlayerVideoFrame::set_subtitle (shared_ptr<const Image> image, Position<int> pos)
{
@@ -50,7 +82,7 @@ PlayerVideoFrame::set_subtitle (shared_ptr<const Image> image, Position<int> pos
}
shared_ptr<Image>
-PlayerVideoFrame::image ()
+PlayerVideoFrame::image () const
{
shared_ptr<Image> out = _in->crop_scale_window (_crop, _inter_size, _out_size, _scaler, PIX_FMT_RGB24, false);
@@ -62,3 +94,33 @@ PlayerVideoFrame::image ()
return out;
}
+
+void
+PlayerVideoFrame::add_metadata (xmlpp::Element* node) const
+{
+ _crop.as_xml (node);
+ node->add_child("InWidth")->add_child_text (raw_convert<string> (_in->size().width));
+ node->add_child("InHeight")->add_child_text (raw_convert<string> (_in->size().height));
+ node->add_child("InterWidth")->add_child_text (raw_convert<string> (_inter_size.width));
+ node->add_child("InterHeight")->add_child_text (raw_convert<string> (_inter_size.height));
+ node->add_child("OutWidth")->add_child_text (raw_convert<string> (_out_size.width));
+ node->add_child("OutHeight")->add_child_text (raw_convert<string> (_out_size.height));
+ node->add_child("Scaler")->add_child_text (_scaler->id ());
+ node->add_child("Eyes")->add_child_text (raw_convert<string> (_eyes));
+ _colour_conversion.as_xml (node);
+ if (_subtitle_image) {
+ node->add_child ("SubtitleWidth")->add_child_text (raw_convert<string> (_subtitle_image->size().width));
+ node->add_child ("SubtitleHeight")->add_child_text (raw_convert<string> (_subtitle_image->size().height));
+ node->add_child ("SubtitleX")->add_child_text (raw_convert<string> (_subtitle_position.x));
+ node->add_child ("SubtitleY")->add_child_text (raw_convert<string> (_subtitle_position.y));
+ }
+}
+
+void
+PlayerVideoFrame::send_binary (shared_ptr<Socket> socket) const
+{
+ _in->write_to_socket (socket);
+ if (_subtitle_image) {
+ _subtitle_image->write_to_socket (socket);
+ }
+}