From 13878a9ff227d66729f185a5bac5985f14d6cac7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 9 Jul 2015 10:42:18 +0100 Subject: [PATCH] Make BitsPerPixel tag optional; fix some confusions with colour range reporting in properties. --- src/lib/ffmpeg_content.cc | 56 ++++++++++++++++++++++++++------------- src/lib/ffmpeg_content.h | 2 +- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index f8a1a142a..071f98612 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -109,7 +109,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"); } @@ -170,7 +170,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 @@ -366,21 +368,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[] = { @@ -438,5 +456,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 ()))); + } } diff --git a/src/lib/ffmpeg_content.h b/src/lib/ffmpeg_content.h index b2a492e68..09f8ed558 100644 --- a/src/lib/ffmpeg_content.h +++ b/src/lib/ffmpeg_content.h @@ -122,7 +122,7 @@ private: AVColorPrimaries _color_primaries; AVColorTransferCharacteristic _color_trc; AVColorSpace _colorspace; - int _bits_per_pixel; + boost::optional _bits_per_pixel; }; #endif -- 2.30.2