ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.out().as_seconds())
),
strings,
- _dcp_content->standard()
+ asset->subtitle_standard()
);
strings.clear ();
}
ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.out().as_seconds())
),
strings,
- _dcp_content->standard()
+ asset->subtitle_standard()
);
strings.clear ();
}
_subtitles = asset->subtitles ();
_next = _subtitles.begin ();
- if (dynamic_pointer_cast<dcp::InteropSubtitleAsset>(asset)) {
- _standard = dcp::Standard::INTEROP;
- } else {
- _standard = dcp::Standard::SMPTE;
- }
+ _subtitle_standard = asset->subtitle_standard();
text.push_back (make_shared<TextDecoder>(this, content->only_text()));
update_position();
}
}
- only_text()->emit_plain(p, s, _standard);
+ only_text()->emit_plain(p, s, _subtitle_standard);
update_position();
std::vector<std::shared_ptr<const dcp::Subtitle>> _subtitles;
std::vector<std::shared_ptr<const dcp::Subtitle>>::const_iterator _next;
- dcp::Standard _standard;
+ dcp::SubtitleStandard _subtitle_standard;
};
float
-ReelWriter::convert_vertical_position(StringText const& subtitle, dcp::Standard to) const
+ReelWriter::convert_vertical_position(StringText const& subtitle, dcp::SubtitleStandard to) const
{
- if (subtitle.valign_standard == to) {
+ if (dcp::uses_baseline(subtitle.valign_standard) == dcp::uses_baseline(to)) {
+ /* The from and to standards use the same alignment reference */
return subtitle.v_position();
}
break;
}
- return subtitle.v_position() + ((subtitle.valign_standard == dcp::Standard::SMPTE) ? correction : -correction);
+ return subtitle.v_position() + (dcp::uses_bounding_box(subtitle.valign_standard) ? correction : -correction);
}
for (auto i: subs.string) {
i.set_in (dcp::Time(period.from.seconds() - _period.from.seconds(), tcr));
i.set_out (dcp::Time(period.to.seconds() - _period.from.seconds(), tcr));
- i.set_v_position(convert_vertical_position(i, film()->interop() ? dcp::Standard::INTEROP : dcp::Standard::SMPTE));
+ i.set_v_position(convert_vertical_position(i, film()->interop() ? dcp::SubtitleStandard::INTEROP : dcp::SubtitleStandard::SMPTE_2014));
auto sub = make_shared<dcp::SubtitleString>(i);
if (type == TextType::OPEN_SUBTITLE) {
sub->set_font(fonts.get(i.font));
std::set<DCPTextTrack> ensure_closed_captions
) const;
void create_reel_markers (std::shared_ptr<dcp::Reel> reel) const;
- float convert_vertical_position(StringText const& subtitle, dcp::Standard to) const;
+ float convert_vertical_position(StringText const& subtitle, dcp::SubtitleStandard to) const;
dcpomatic::DCPTimePeriod _period;
/** the first picture frame index that does not already exist in our MXF */
{
int y = 0;
switch (first.valign_standard) {
- case dcp::Standard::INTEROP:
+ case dcp::SubtitleStandard::INTEROP:
+ case dcp::SubtitleStandard::SMPTE_2014:
switch (first.v_align()) {
case dcp::VAlign::TOP:
/* v_position is distance from top of frame to subtitle baseline */
break;
}
break;
- case dcp::Standard::SMPTE:
+ case dcp::SubtitleStandard::SMPTE_2007:
+ case dcp::SubtitleStandard::SMPTE_2010:
switch (first.v_align()) {
case dcp::VAlign::TOP:
/* v_position is distance from top of frame to top of subtitle */
#include "font.h"
+#include <dcp/subtitle_standard.h>
#include <dcp/subtitle_string.h>
class StringText : public dcp::SubtitleString
{
public:
- StringText(dcp::SubtitleString dcp_, int outline_width_, std::shared_ptr<dcpomatic::Font> font_, dcp::Standard valign_standard_)
+ StringText(dcp::SubtitleString dcp_, int outline_width_, std::shared_ptr<dcpomatic::Font> font_, dcp::SubtitleStandard valign_standard_)
: dcp::SubtitleString (dcp_)
, outline_width (outline_width_)
, font (font_)
int outline_width;
std::shared_ptr<dcpomatic::Font> font;
+
/** Interop and SMPTE use the same VAlign choices (top, center, bottom) but give them different
- * meanings. This is the standard which should be used to interpret v_align() in this subtitle;
- * valign_standard == SMPTE means:
+ * meanings. To add some extra confusion, it seems that SMPTE changed their minds on this topic
+ * between the 2010 and 2014 versions of standard 428-7, so there isn't even one answer for SMPTE.
+ *
+ * This is the standard which should be used to interpret v_align() in this subtitle.
+ *
+ * valign_standard == SMPTE_{2007,2010} means:
* top - top of screen to top of subtitle
* center - centre of screen to center of subtitle
* bottom - bottom of screen to bottom of subtitle
- * valign_standard == Interop means:
+ *
+ * valign_standard == {INTEROP,SMPTE_2014} means:
* top - top of screen to baseline of subtitle
* center - centre of screen to baseline of subtitle
* bottom - bottom of screen to baseline of subtitle
*/
- dcp::Standard valign_standard;
+ dcp::SubtitleStandard valign_standard;
};
void
-TextDecoder::emit_plain_start (ContentTime from, vector<dcp::SubtitleString> subtitles, dcp::Standard valign_standard)
+TextDecoder::emit_plain_start(ContentTime from, vector<dcp::SubtitleString> subtitles, dcp::SubtitleStandard valign_standard)
{
vector<StringText> string_texts;
dcp_subtitle,
content()->outline_width(),
content()->get_font(block.font.get_value_or("")),
- dcp::Standard::SMPTE
+ dcp::SubtitleStandard::SMPTE_2014
);
set_forced_appearance(content(), string_text);
string_texts.push_back(string_text);
void
-TextDecoder::emit_plain (ContentTimePeriod period, vector<dcp::SubtitleString> subtitles, dcp::Standard valign_standard)
+TextDecoder::emit_plain(ContentTimePeriod period, vector<dcp::SubtitleString> subtitles, dcp::SubtitleStandard valign_standard)
{
emit_plain_start (period.from, subtitles, valign_standard);
emit_stop (period.to);
#define DCPOMATIC_CAPTION_DECODER_H
+#include "content_text.h"
#include "decoder.h"
+#include "decoder_part.h"
#include "rect.h"
#include "content_text.h"
-#include "decoder_part.h"
+#include "types.h"
+#include <dcp/subtitle_standard.h>
#include <dcp/subtitle_string.h>
#include <boost/signals2.hpp>
void emit_bitmap_start (ContentBitmapText const& bitmap);
void emit_bitmap (dcpomatic::ContentTimePeriod period, std::shared_ptr<const Image> image, dcpomatic::Rect<double> rect);
- void emit_plain_start (dcpomatic::ContentTime from, std::vector<dcp::SubtitleString> s, dcp::Standard valign_standard);
+ void emit_plain_start(dcpomatic::ContentTime from, std::vector<dcp::SubtitleString> s, dcp::SubtitleStandard valign_standard);
void emit_plain_start (dcpomatic::ContentTime from, sub::Subtitle const & subtitle);
- void emit_plain (dcpomatic::ContentTimePeriod period, std::vector<dcp::SubtitleString> s, dcp::Standard valign_standard);
+ void emit_plain(dcpomatic::ContentTimePeriod period, std::vector<dcp::SubtitleString> s, dcp::SubtitleStandard valign_standard);
void emit_plain (dcpomatic::ContentTimePeriod period, sub::Subtitle const & subtitle);
void emit_stop (dcpomatic::ContentTime to);
optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0, dcp::Direction::LTR,
"Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0
);
- subs.push_back (StringText(ss, 0, {}, dcp::Standard::SMPTE));
+ subs.push_back(StringText(ss, 0, {}, dcp::SubtitleStandard::SMPTE_2014));
render_text (subs, dcp::Size(640, 480), DCPTime(), 24);
#endif
),
2,
std::shared_ptr<dcpomatic::Font>(),
- dcp::Standard::SMPTE
+ dcp::SubtitleStandard::SMPTE_2014
)
);
}