Merge master.
[dcpomatic.git] / src / lib / player.cc
index e46d539f872c90fb1e130cdcd45049f77ddc169b..db99cd2ad81626bbe10180bc3e28ea9ea878cf43 100644 (file)
@@ -17,8 +17,6 @@
 
 */
 
-#include <stdint.h>
-#include <algorithm>
 #include "player.h"
 #include "film.h"
 #include "ffmpeg_decoder.h"
@@ -48,6 +46,9 @@
 #include "dcp_decoder.h"
 #include "dcp_subtitle_content.h"
 #include "dcp_subtitle_decoder.h"
+#include <boost/foreach.hpp>
+#include <stdint.h>
+#include <algorithm>
 
 #define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
 
@@ -201,7 +202,8 @@ Player::content_changed (weak_ptr<Content> w, int property, bool frequent)
                property == SubtitleContentProperty::USE_SUBTITLES ||
                property == SubtitleContentProperty::SUBTITLE_X_OFFSET ||
                property == SubtitleContentProperty::SUBTITLE_Y_OFFSET ||
-               property == SubtitleContentProperty::SUBTITLE_SCALE ||
+               property == SubtitleContentProperty::SUBTITLE_X_SCALE ||
+               property == SubtitleContentProperty::SUBTITLE_Y_SCALE ||
                property == VideoContentProperty::VIDEO_CROP ||
                property == VideoContentProperty::VIDEO_SCALE ||
                property == VideoContentProperty::VIDEO_FRAME_RATE
@@ -260,8 +262,8 @@ Player::transform_image_subtitles (list<ImageSubtitle> subs) const
                 *     rect.x * _video_container_size.width and rect.y * _video_container_size.height.
                 *
                 * 2.  that to shift the origin of the scale by subtitle_scale to the centre of the subtitle; this will be
-                *     (width_before_subtitle_scale * (1 - subtitle_scale) / 2) and
-                *     (height_before_subtitle_scale * (1 - subtitle_scale) / 2).
+                *     (width_before_subtitle_scale * (1 - subtitle_x_scale) / 2) and
+                *     (height_before_subtitle_scale * (1 - subtitle_y_scale) / 2).
                 *
                 * Combining these two translations gives these expressions.
                 */
@@ -299,6 +301,7 @@ Player::black_player_video_frame (DCPTime time) const
                        shared_ptr<const ImageProxy> (new RawImageProxy (_black_image, _film->log ())),
                        time,
                        Crop (),
+                       optional<float> (),
                        _video_container_size,
                        _video_container_size,
                        Scaler::from_id ("bicubic"),
@@ -355,6 +358,7 @@ Player::get_video (DCPTime time, bool accurate)
                                                i->image,
                                                content_video_to_dcp (piece, i->frame),
                                                content->crop (),
+                                               content->fade (i->frame),
                                                image_size,
                                                _video_container_size,
                                                _film->scaler(),
@@ -558,19 +562,23 @@ Player::get_subtitles (DCPTime time, DCPTime length, bool starting)
                        i->sub.rectangle.y += subtitle_content->subtitle_y_offset ();
 
                        /* Apply content's subtitle scale */
-                       i->sub.rectangle.width *= subtitle_content->subtitle_scale ();
-                       i->sub.rectangle.height *= subtitle_content->subtitle_scale ();
+                       i->sub.rectangle.width *= subtitle_content->subtitle_x_scale ();
+                       i->sub.rectangle.height *= subtitle_content->subtitle_y_scale ();
 
                        /* Apply a corrective translation to keep the subtitle centred after that scale */
-                       i->sub.rectangle.x -= i->sub.rectangle.width * (subtitle_content->subtitle_scale() - 1);
-                       i->sub.rectangle.y -= i->sub.rectangle.height * (subtitle_content->subtitle_scale() - 1);
+                       i->sub.rectangle.x -= i->sub.rectangle.width * (subtitle_content->subtitle_x_scale() - 1);
+                       i->sub.rectangle.y -= i->sub.rectangle.height * (subtitle_content->subtitle_y_scale() - 1);
                        
                        ps.image.push_back (i->sub);
                }
 
                list<ContentTextSubtitle> text = subtitle_decoder->get_text_subtitles (ContentTimePeriod (from, to), starting);
-               for (list<ContentTextSubtitle>::const_iterator i = text.begin(); i != text.end(); ++i) {
-                       copy (i->subs.begin(), i->subs.end(), back_inserter (ps.text));
+               BOOST_FOREACH (ContentTextSubtitle& ts, text) {
+                       BOOST_FOREACH (dcp::SubtitleString& s, ts.subs) {
+                               s.set_v_position (s.v_position() + subtitle_content->subtitle_y_offset ());
+                               s.set_size (s.size() * max (subtitle_content->subtitle_x_scale(), subtitle_content->subtitle_y_scale()));
+                               ps.text.push_back (s);
+                       }
                }
        }