#include "log.h"
#include "exceptions.h"
#include "frame_rate_change.h"
-#include "safe_stringstream.h"
#include "raw_convert.h"
#include "subtitle_content.h"
+#include <locked_sstream.h>
#include <libcxml/cxml.h>
extern "C" {
#include <libavformat/avformat.h>
}
#include <libxml++/libxml++.h>
#include <boost/foreach.hpp>
-#include <boost/make_shared.hpp>
#include <iostream>
#include "i18n.h"
using std::make_pair;
using std::max;
using boost::shared_ptr;
-using boost::make_shared;
using boost::dynamic_pointer_cast;
using boost::optional;
list<cxml::NodePtr> c = node->node_children ("SubtitleStream");
for (list<cxml::NodePtr>::const_iterator i = c.begin(); i != c.end(); ++i) {
- _subtitle_streams.push_back (make_shared<FFmpegSubtitleStream> (*i, version));
+ _subtitle_streams.push_back (shared_ptr<FFmpegSubtitleStream> (new FFmpegSubtitleStream (*i, version)));
if ((*i)->optional_number_child<int> ("Selected")) {
_subtitle_stream = _subtitle_streams.back ();
}
c = node->node_children ("AudioStream");
for (list<cxml::NodePtr>::const_iterator i = c.begin(); i != c.end(); ++i) {
- shared_ptr<FFmpegAudioStream> as = make_shared<FFmpegAudioStream> (*i, version);
+ shared_ptr<FFmpegAudioStream> as (new FFmpegAudioStream (*i, version));
audio->add_stream (as);
if (version < 11 && !(*i)->optional_node_child ("Selected")) {
/* This is an old file and this stream is not selected, so un-map it */
}
-FFmpegContent::FFmpegContent (shared_ptr<const Film> film, vector<boost::shared_ptr<Content> > c)
+FFmpegContent::FFmpegContent (shared_ptr<const Film> film, vector<shared_ptr<Content> > c)
: Content (film, c)
{
- /* XXX: this should look at c to decide which of video/audio/subtitle
- get created.
- */
- video.reset (new VideoContent (this, c));
- audio.reset (new AudioContent (this, c));
- subtitle.reset (new SubtitleContent (this, c));
+ vector<shared_ptr<Content> >::const_iterator i = c.begin ();
+
+ bool need_video = false;
+ bool need_audio = false;
+ bool need_subtitle = false;
+
+ if (i != c.end ()) {
+ need_video = static_cast<bool> ((*i)->video);
+ need_audio = static_cast<bool> ((*i)->audio);
+ need_subtitle = static_cast<bool> ((*i)->subtitle);
+ }
+
+ while (i != c.end ()) {
+ if (need_video != static_cast<bool> ((*i)->video)) {
+ throw JoinError (_("Content to be joined must all have or not have video"));
+ }
+ if (need_audio != static_cast<bool> ((*i)->audio)) {
+ throw JoinError (_("Content to be joined must all have or not have audio"));
+ }
+ if (need_subtitle != static_cast<bool> ((*i)->subtitle)) {
+ throw JoinError (_("Content to be joined must all have or not have subtitles"));
+ }
+ ++i;
+ }
+
+ if (need_video) {
+ video.reset (new VideoContent (this, c));
+ }
+ if (need_audio) {
+ audio.reset (new AudioContent (this, c));
+ }
+ if (need_subtitle) {
+ subtitle.reset (new SubtitleContent (this, c));
+ }
shared_ptr<FFmpegContent> ref = dynamic_pointer_cast<FFmpegContent> (c[0]);
DCPOMATIC_ASSERT (ref);
for (size_t i = 0; i < c.size(); ++i) {
shared_ptr<FFmpegContent> fc = dynamic_pointer_cast<FFmpegContent> (c[i]);
- if (fc->subtitle->use() && *(fc->_subtitle_stream.get()) != *(ref->_subtitle_stream.get())) {
+ if (fc->subtitle && fc->subtitle->use() && *(fc->_subtitle_stream.get()) != *(ref->_subtitle_stream.get())) {
throw JoinError (_("Content to be joined must use the same subtitle stream."));
}
}
Content::examine (job);
- shared_ptr<FFmpegExaminer> examiner = make_shared<FFmpegExaminer> (shared_from_this (), job);
+ shared_ptr<FFmpegExaminer> examiner (new FFmpegExaminer (shared_from_this (), job));
if (examiner->has_video ()) {
video.reset (new VideoContent (this));
string
FFmpegContent::identifier () const
{
- SafeStringStream s;
+ locked_stringstream s;
s << Content::identifier();
_("BT2020 for a 10-bit system"),
_("BT2020 for a 12-bit system"),
_("SMPTE ST 2084 for 10, 12, 14 and 16 bit systems"),
- _("SMPTE ST 428-1")
+ _("SMPTE ST 428-1"),
+ _("ARIB STD-B67 ('Hybrid log-gamma')")
};
- DCPOMATIC_ASSERT (AVCOL_TRC_NB <= 18);
+ DCPOMATIC_ASSERT (AVCOL_TRC_NB <= 19);
p.push_back (UserProperty (UserProperty::VIDEO, _("Colour transfer characteristic"), transfers[_color_trc]));
char const * spaces[] = {