X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=2c2d36a986c6eb3b725b40c9222e38d5f9e043d6;hp=cb887b3bb342b37922534899d38ab73d0000af3a;hb=aeb835a18c8df347e0ed68fb24631b320abeb611;hpb=43877eccbedc0950ab253e76dd0cea691fd7a4b0 diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index cb887b3bb..2c2d36a98 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; @@ -97,7 +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)); @@ -105,7 +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 = static_cast (node->number_child ("BitsPerPixel")); + _bits_per_pixel = node->optional_number_child ("BitsPerPixel"); } @@ -166,7 +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)); - node->add_child("BitsPerPixel")->add_child_text (raw_convert (_bits_per_pixel)); + if (_bits_per_pixel) { + node->add_child("BitsPerPixel")->add_child_text (raw_convert (_bits_per_pixel.get ())); + } } void @@ -275,7 +283,7 @@ 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()); + return DCPTime::from_frames (llrint (video_length_after_3d_combine() * frc.factor()), film->video_frame_rate()); } void @@ -362,21 +370,37 @@ FFmpegContent::add_properties (list >& p) const { VideoContent::add_properties (p); - int const sub = 219 * pow (2, _bits_per_pixel - 8); - int const total = pow (2, _bits_per_pixel); - - switch (_color_range) { - case AVCOL_RANGE_UNSPECIFIED: - p.push_back (make_pair (_("Colour range"), _("Unspecified"))); - break; - case AVCOL_RANGE_MPEG: - p.push_back (make_pair (_("Colour range"), String::compose ("Limited (%1-%2)", (total - sub) / 2, (total + sub) / 2))); - break; - case AVCOL_RANGE_JPEG: - p.push_back (make_pair (_("Colour range"), String::compose ("Full (0-total)", (total - sub) / 2, (total + sub) / 2))); - break; - default: - DCPOMATIC_ASSERT (false); + 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: + p.push_back (make_pair (_("Colour range"), _("Unspecified"))); + break; + case AVCOL_RANGE_MPEG: + p.push_back (make_pair (_("Colour range"), String::compose (_("Limited (%1-%2)"), (total - sub) / 2, (total + sub) / 2))); + break; + case AVCOL_RANGE_JPEG: + 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: + p.push_back (make_pair (_("Colour range"), _("Unspecified"))); + break; + case AVCOL_RANGE_MPEG: + p.push_back (make_pair (_("Colour range"), _("Limited"))); + break; + case AVCOL_RANGE_JPEG: + p.push_back (make_pair (_("Colour range"), _("Full"))); + break; + default: + DCPOMATIC_ASSERT (false); + } } char const * primaries[] = { @@ -434,5 +458,7 @@ FFmpegContent::add_properties (list >& p) const DCPOMATIC_ASSERT (AVCOL_SPC_NB == 11); p.push_back (make_pair (_("Colourspace"), spaces[_colorspace])); - p.push_back (make_pair (_("Bits per pixel"), raw_convert (_bits_per_pixel))); + if (_bits_per_pixel) { + p.push_back (make_pair (_("Bits per pixel"), raw_convert (_bits_per_pixel.get ()))); + } }