Set encoder quality for existing ExportFormatSpecs
authorRobin Gareus <robin@gareus.org>
Wed, 21 Nov 2018 20:19:01 +0000 (21:19 +0100)
committerRobin Gareus <robin@gareus.org>
Wed, 21 Nov 2018 20:19:01 +0000 (21:19 +0100)
libs/ardour/ardour/export_format_specification.h
libs/ardour/export_format_specification.cc

index ecbb8421ca7724b8942a21f33cb4e9be809d43c8..4df0884750d36fba8c493b8869891be6a0a49615 100644 (file)
@@ -199,6 +199,7 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
        std::string  _format_name;
        bool            has_sample_format;
        bool            supports_tagging;
+       bool           _has_codec_quality;
        bool           _has_broadcast_info;
        uint32_t       _channel_limit;
 
index ec0b6de1e766f740db9f4aa388bed9be8311e3dd..437cc3a0596e2c92d19152bc1efe3d49b99b686b 100644 (file)
@@ -131,9 +131,9 @@ ExportFormatSpecification::Time::set_state (const XMLNode & node)
 
 ExportFormatSpecification::ExportFormatSpecification (Session & s)
        : session (s)
-
        , has_sample_format (false)
        , supports_tagging (false)
+       , _has_codec_quality (false)
        , _has_broadcast_info (false)
        , _channel_limit (0)
        , _dither_type (D_None)
@@ -156,7 +156,7 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
        , _soundcloud_upload (false)
        , _command ("")
        , _analyse (true)
-       , _codec_quality (-2)
+       , _codec_quality (0)
 {
        format_ids.insert (F_None);
        endiannesses.insert (E_FileDefault);
@@ -167,9 +167,9 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
 
 ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const & state)
        : session (s)
-
        , has_sample_format (false)
        , supports_tagging (false)
+       , _has_codec_quality (false)
        , _has_broadcast_info (false)
        , _channel_limit (0)
        , _dither_type (D_None)
@@ -192,7 +192,7 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const
        , _soundcloud_upload (false)
        , _command ("")
        , _analyse (true)
-       , _codec_quality (-2)
+       , _codec_quality (0)
 {
        _silence_beginning.type = Time::Timecode;
        _silence_end.type = Time::Timecode;
@@ -217,8 +217,8 @@ ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification
 
        _format_name = other._format_name;
        has_sample_format = other.has_sample_format;
-
        supports_tagging = other.supports_tagging;
+       _has_codec_quality = other._has_codec_quality;
        _has_broadcast_info = other._has_broadcast_info;
        _channel_limit = other._channel_limit;
 
@@ -280,8 +280,10 @@ ExportFormatSpecification::get_state ()
        node = root->add_child ("SRCQuality");
        node->set_property ("quality", src_quality());
 
-       node = root->add_child ("CodecQuality");
-       node->set_property ("quality", codec_quality());
+       if (_has_codec_quality) {
+               node = root->add_child ("CodecQuality");
+               node->set_property ("quality", codec_quality());
+       }
 
        XMLNode * enc_opts = root->add_child ("EncodingOptions");
 
@@ -392,6 +394,24 @@ ExportFormatSpecification::set_state (const XMLNode & root)
 
        if ((child = root.child ("CodecQuality"))) {
                child->get_property ("quality", _codec_quality);
+               _has_codec_quality = true;
+       } else {
+               _has_codec_quality = false;
+       }
+
+       /* fixup codec quality for old states */
+       if (!_has_codec_quality) {
+               /* We'd need an instance of ExportFormatManager to look up
+                * defaults for a given type -- in the future there may even be
+                * difference qualities depending on sub-type, so we just
+                * hardcode them here for the time being.
+                */
+               if (format_id() == F_FFMPEG) {
+                       _codec_quality = -2; // ExportFormatOggVorbis::default_codec_quality();
+               }
+               else if (format_id() == F_Ogg) {
+                       _codec_quality = 40; // ExportFormatFFMPEG::default_codec_quality();
+               }
        }
 
        /* Encoding options */
@@ -518,7 +538,10 @@ void
 ExportFormatSpecification::set_format (boost::shared_ptr<ExportFormat> format)
 {
        if (format) {
-               set_format_id (format->get_format_id ());
+               FormatId new_fmt = format->get_format_id ();
+               bool fmt_changed = format_id() != new_fmt;
+               set_format_id (new_fmt);
+
                set_type (format->get_type());
                set_extension (format->extension());
 
@@ -534,6 +557,13 @@ ExportFormatSpecification::set_format (boost::shared_ptr<ExportFormat> format)
                        _has_broadcast_info = true;
                }
 
+               _has_codec_quality = format->has_codec_quality();
+               if (!_has_codec_quality) {
+                       _codec_quality = 0;
+               } else if (fmt_changed) {
+                       _codec_quality = boost::dynamic_pointer_cast<HasCodecQuality> (format)->default_codec_quality();
+               }
+
                supports_tagging = format->supports_tagging ();
                _channel_limit = format->get_channel_limit();
 
@@ -546,6 +576,7 @@ ExportFormatSpecification::set_format (boost::shared_ptr<ExportFormat> format)
                has_sample_format = false;
                supports_tagging = false;
                _channel_limit = 0;
+               _codec_quality = 0;
                _format_name = "";
        }
 }