#include <libavformat/avformat.h>
#include <libavutil/pixdesc.h>
}
+#include <libxml++/libxml++.h>
#include <boost/foreach.hpp>
+#include <iostream>
#include "i18n.h"
-#define LOG_GENERAL(...) film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
+#define LOG_GENERAL(...) film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL);
using std::string;
using std::vector;
using std::make_pair;
using boost::shared_ptr;
using boost::dynamic_pointer_cast;
+using boost::optional;
int const FFmpegContentProperty::SUBTITLE_STREAMS = 100;
int const FFmpegContentProperty::SUBTITLE_STREAM = 101;
{
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 (shared_ptr<FFmpegSubtitleStream> (new FFmpegSubtitleStream (*i)));
+ _subtitle_streams.push_back (shared_ptr<FFmpegSubtitleStream> (new FFmpegSubtitleStream (*i, version)));
if ((*i)->optional_number_child<int> ("Selected")) {
_subtitle_stream = _subtitle_streams.back ();
}
}
}
- _first_video = node->optional_number_child<double> ("FirstVideo");
-
+ optional<ContentTime::Type> const f = node->optional_number_child<ContentTime::Type> ("FirstVideo");
+ if (f) {
+ _first_video = ContentTime (f.get ());
+ }
_color_range = static_cast<AVColorRange> (node->optional_number_child<int>("ColorRange").get_value_or (AVCOL_RANGE_UNSPECIFIED));
_color_primaries = static_cast<AVColorPrimaries> (node->optional_number_child<int>("ColorPrimaries").get_value_or (AVCOL_PRI_UNSPECIFIED));
node->optional_number_child<int>("ColorTransferCharacteristic").get_value_or (AVCOL_TRC_UNSPECIFIED)
);
_colorspace = static_cast<AVColorSpace> (node->optional_number_child<int>("Colorspace").get_value_or (AVCOL_SPC_UNSPECIFIED));
+ _bits_per_pixel = node->optional_number_child<int> ("BitsPerPixel");
}
node->add_child("ColorPrimaries")->add_child_text (raw_convert<string> (_color_primaries));
node->add_child("ColorTransferCharacteristic")->add_child_text (raw_convert<string> (_color_trc));
node->add_child("Colorspace")->add_child_text (raw_convert<string> (_colorspace));
+ if (_bits_per_pixel) {
+ node->add_child("BitsPerPixel")->add_child_text (raw_convert<string> (_bits_per_pixel.get ()));
+ }
}
void
shared_ptr<FFmpegExaminer> examiner (new FFmpegExaminer (shared_from_this (), job));
take_from_video_examiner (examiner);
- shared_ptr<const Film> film = _film.lock ();
- DCPOMATIC_ASSERT (film);
-
{
boost::mutex::scoped_lock lm (_mutex);
if (!_audio_streams.empty ()) {
AudioMapping m = _audio_streams.front()->mapping ();
- film->make_audio_mapping_default (m);
+ film()->make_audio_mapping_default (m);
_audio_streams.front()->set_mapping (m);
}
_color_primaries = examiner->color_primaries ();
_color_trc = examiner->color_trc ();
_colorspace = examiner->colorspace ();
+ _bits_per_pixel = examiner->bits_per_pixel ();
}
signal_changed (FFmpegContentProperty::SUBTITLE_STREAMS);
DCPTime
FFmpegContent::full_length () const
{
- shared_ptr<const Film> film = _film.lock ();
- DCPOMATIC_ASSERT (film);
- FrameRateChange const frc (video_frame_rate (), film->video_frame_rate ());
- return DCPTime::from_frames (rint (video_length_after_3d_combine() * frc.factor()), film->video_frame_rate());
+ FrameRateChange const frc (video_frame_rate (), film()->video_frame_rate ());
+ return DCPTime::from_frames (llrint (video_length_after_3d_combine() * frc.factor()), film()->video_frame_rate());
}
void
{
VideoContent::add_properties (p);
- /* I tried av_*_name for these but they are not the most
- nicely formatted.
- */
-
- char const * ranges[] = {
- _("Unspecified"),
- _("MPEG (0-219 or equivalent)"),
- _("JPEG (0-255 or equivalent)")
- };
-
- DCPOMATIC_ASSERT (AVCOL_RANGE_NB == 3);
- p.push_back (make_pair (_("Colour range"), ranges[_color_range]));
+ if (_bits_per_pixel) {
+ int const sub = 219 * pow (2, _bits_per_pixel.get() - 8);
+ int const total = pow (2, _bits_per_pixel.get());
+
+ switch (_color_range) {
+ case AVCOL_RANGE_UNSPECIFIED:
+ /// TRANSLATORS: this means that the range of pixel values used in this
+ /// file is unknown (not specified in the file).
+ p.push_back (make_pair (_("Colour range"), _("Unspecified")));
+ break;
+ case AVCOL_RANGE_MPEG:
+ /// TRANSLATORS: this means that the range of pixel values used in this
+ /// file is limited, so that not all possible values are valid.
+ p.push_back (make_pair (_("Colour range"), String::compose (_("Limited (%1-%2)"), (total - sub) / 2, (total + sub) / 2)));
+ break;
+ case AVCOL_RANGE_JPEG:
+ /// TRANSLATORS: this means that the range of pixel values used in this
+ /// file is full, so that all possible pixel values are valid.
+ p.push_back (make_pair (_("Colour range"), String::compose (_("Full (0-%1)"), total)));
+ break;
+ default:
+ DCPOMATIC_ASSERT (false);
+ }
+ } else {
+ switch (_color_range) {
+ case AVCOL_RANGE_UNSPECIFIED:
+ /// TRANSLATORS: this means that the range of pixel values used in this
+ /// file is unknown (not specified in the file).
+ p.push_back (make_pair (_("Colour range"), _("Unspecified")));
+ break;
+ case AVCOL_RANGE_MPEG:
+ /// TRANSLATORS: this means that the range of pixel values used in this
+ /// file is limited, so that not all possible values are valid.
+ p.push_back (make_pair (_("Colour range"), _("Limited")));
+ break;
+ case AVCOL_RANGE_JPEG:
+ /// TRANSLATORS: this means that the range of pixel values used in this
+ /// file is full, so that all possible pixel values are valid.
+ p.push_back (make_pair (_("Colour range"), _("Full")));
+ break;
+ default:
+ DCPOMATIC_ASSERT (false);
+ }
+ }
char const * primaries[] = {
_("Unspecified"),
};
DCPOMATIC_ASSERT (AVCOL_PRI_NB == 10);
- p.push_back (make_pair (_("Color primaries"), primaries[_color_primaries]));
+ p.push_back (make_pair (_("Colour primaries"), primaries[_color_primaries]));
char const * transfers[] = {
_("Unspecified"),
DCPOMATIC_ASSERT (AVCOL_SPC_NB == 11);
p.push_back (make_pair (_("Colourspace"), spaces[_colorspace]));
+
+ if (_bits_per_pixel) {
+ p.push_back (make_pair (_("Bits per pixel"), raw_convert<string> (_bits_per_pixel.get ())));
+ }
}