X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=ba799be72f0aad6f84c852481da897a7c1104a76;hb=22873931f874a87fcf6a0077eddbec0f97eb3423;hp=9d3a79e81e5e40f434cdb6a9fbd08955caccb0df;hpb=a3e6ab3c2c1397ba5bbd5a35ce41aa791501a2f9;p=dcpomatic.git diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index 9d3a79e81..ba799be72 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -36,11 +36,13 @@ extern "C" { #include #include } +#include #include +#include #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; @@ -50,6 +52,7 @@ using std::pair; 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; @@ -72,7 +75,7 @@ FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr no { list c = node->node_children ("SubtitleStream"); for (list::const_iterator i = c.begin(); i != c.end(); ++i) { - _subtitle_streams.push_back (shared_ptr (new FFmpegSubtitleStream (*i))); + _subtitle_streams.push_back (shared_ptr (new FFmpegSubtitleStream (*i, version))); if ((*i)->optional_number_child ("Selected")) { _subtitle_stream = _subtitle_streams.back (); } @@ -97,8 +100,10 @@ FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr no } } - _first_video = node->optional_number_child ("FirstVideo"); - + optional const f = node->optional_number_child ("FirstVideo"); + if (f) { + _first_video = ContentTime (f.get ()); + } _color_range = static_cast (node->optional_number_child("ColorRange").get_value_or (AVCOL_RANGE_UNSPECIFIED)); _color_primaries = static_cast (node->optional_number_child("ColorPrimaries").get_value_or (AVCOL_PRI_UNSPECIFIED)); @@ -106,6 +111,7 @@ FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr no node->optional_number_child("ColorTransferCharacteristic").get_value_or (AVCOL_TRC_UNSPECIFIED) ); _colorspace = static_cast (node->optional_number_child("Colorspace").get_value_or (AVCOL_SPC_UNSPECIFIED)); + _bits_per_pixel = node->optional_number_child ("BitsPerPixel"); } @@ -166,6 +172,9 @@ FFmpegContent::as_xml (xmlpp::Node* node) const node->add_child("ColorPrimaries")->add_child_text (raw_convert (_color_primaries)); node->add_child("ColorTransferCharacteristic")->add_child_text (raw_convert (_color_trc)); node->add_child("Colorspace")->add_child_text (raw_convert (_colorspace)); + if (_bits_per_pixel) { + node->add_child("BitsPerPixel")->add_child_text (raw_convert (_bits_per_pixel.get ())); + } } void @@ -178,9 +187,6 @@ FFmpegContent::examine (shared_ptr job) shared_ptr examiner (new FFmpegExaminer (shared_from_this (), job)); take_from_video_examiner (examiner); - shared_ptr film = _film.lock (); - DCPOMATIC_ASSERT (film); - { boost::mutex::scoped_lock lm (_mutex); @@ -193,7 +199,7 @@ FFmpegContent::examine (shared_ptr job) 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); } @@ -203,6 +209,7 @@ FFmpegContent::examine (shared_ptr job) _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); @@ -270,10 +277,8 @@ operator!= (FFmpegStream const & a, FFmpegStream const & b) DCPTime FFmpegContent::full_length () const { - shared_ptr 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 @@ -360,18 +365,50 @@ FFmpegContent::add_properties (list >& p) const { 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"), @@ -387,7 +424,7 @@ FFmpegContent::add_properties (list >& p) const }; 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"), @@ -427,4 +464,8 @@ FFmpegContent::add_properties (list >& p) const 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 (_bits_per_pixel.get ()))); + } }