summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-04-05 23:17:03 +0200
committerCarl Hetherington <cth@carlh.net>2024-04-22 13:03:04 +0200
commit21ebc2365dd7a66c05d130dc87861f7399ae834b (patch)
treeee1feebe6e0cf10dc5d4ecddbe9ea9ccb9a6b9d8 /src
parent4f0d027f1964d0c011f89b5706fbaf654955ba2d (diff)
Allow specification of video bit rate separately for J2K and MPEG2.
Diffstat (limited to 'src')
-rw-r--r--src/lib/config.cc28
-rw-r--r--src/lib/config.h22
-rw-r--r--src/lib/create_cli.cc6
-rw-r--r--src/lib/dcp_film_encoder.cc2
-rw-r--r--src/lib/film.cc27
-rw-r--r--src/lib/film.h11
-rw-r--r--src/lib/grok/context.h2
-rw-r--r--src/lib/hints.cc2
-rw-r--r--src/lib/j2k_encoder.cc2
-rw-r--r--src/lib/make_dcp.cc2
-rw-r--r--src/lib/mpeg2_encoder.cc2
-rw-r--r--src/lib/video_encoding.cc2
-rw-r--r--src/lib/video_encoding.h10
-rw-r--r--src/tools/dcpomatic_cli.cc2
-rw-r--r--src/wx/dcp_panel.cc11
-rw-r--r--src/wx/full_config_dialog.cc75
16 files changed, 138 insertions, 68 deletions
diff --git a/src/lib/config.cc b/src/lib/config.cc
index 1400b9309..33b1a8656 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -108,7 +108,8 @@ Config::set_defaults ()
_default_still_length = 10;
_default_dcp_content_type = DCPContentType::from_isdcf_name ("FTR");
_default_dcp_audio_channels = 8;
- _default_video_bit_rate = 150000000;
+ _default_video_bit_rate[VideoEncoding::JPEG2000] = 150000000;
+ _default_video_bit_rate[VideoEncoding::MPEG2] = 5000000;
_default_audio_delay = 0;
_default_interop = false;
_default_metadata.clear ();
@@ -127,7 +128,8 @@ Config::set_defaults ()
_notification_bcc = "";
_check_for_updates = false;
_check_for_test_updates = false;
- _maximum_video_bit_rate = 250000000;
+ _maximum_video_bit_rate[VideoEncoding::JPEG2000] = 250000000;
+ _maximum_video_bit_rate[VideoEncoding::MPEG2] = 50000000;
_log_types = LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR | LogEntry::TYPE_DISK;
_analyse_ebur128 = true;
_automatic_audio_analysis = false;
@@ -376,10 +378,11 @@ try
_default_still_length = f.optional_number_child<int>("DefaultStillLength").get_value_or (10);
if (auto j2k = f.optional_number_child<int>("DefaultJ2KBandwidth")) {
- _default_video_bit_rate = *j2k;
+ _default_video_bit_rate[VideoEncoding::JPEG2000] = *j2k;
} else {
- _default_video_bit_rate = f.optional_number_child<int64_t>("DefaultVideoBitRate").get_value_or(200000000);
+ _default_video_bit_rate[VideoEncoding::JPEG2000] = f.optional_number_child<int64_t>("DefaultJ2KVideoBitRate").get_value_or(200000000);
}
+ _default_video_bit_rate[VideoEncoding::MPEG2] = f.optional_number_child<int64_t>("DefaultMPEG2VideoBitRate").get_value_or(5000000);
_default_audio_delay = f.optional_number_child<int>("DefaultAudioDelay").get_value_or (0);
_default_interop = f.optional_bool_child("DefaultInterop").get_value_or (false);
@@ -455,10 +458,11 @@ try
_check_for_test_updates = f.optional_bool_child("CheckForTestUpdates").get_value_or (false);
if (auto j2k = f.optional_number_child<int>("MaximumJ2KBandwidth")) {
- _maximum_video_bit_rate = *j2k;
+ _maximum_video_bit_rate[VideoEncoding::JPEG2000] = *j2k;
} else {
- _maximum_video_bit_rate = f.optional_number_child<int64_t>("MaximumVideoBitRate").get_value_or(250000000);
+ _maximum_video_bit_rate[VideoEncoding::JPEG2000] = f.optional_number_child<int64_t>("MaximumJ2KVideoBitRate").get_value_or(250000000);
}
+ _maximum_video_bit_rate[VideoEncoding::MPEG2] = f.optional_number_child<int64_t>("MaximumMPEG2VideoBitRate").get_value_or(50000000);
_allow_any_dcp_frame_rate = f.optional_bool_child ("AllowAnyDCPFrameRate").get_value_or (false);
_allow_any_container = f.optional_bool_child ("AllowAnyContainer").get_value_or (false);
_allow_96khz_audio = f.optional_bool_child("Allow96kHzAudio").get_value_or(false);
@@ -815,8 +819,10 @@ Config::write_config () const
/* [XML] DefaultStillLength Default length (in seconds) for still images in new films. */
cxml::add_text_child(root, "DefaultStillLength", raw_convert<string>(_default_still_length));
- /* [XML] DefaultVideoBitRate Default bitrate (in bits per second) for JPEG2000 or MPEG2 data in new films. */
- cxml::add_text_child(root, "DefaultVideoBitRate", raw_convert<string>(_default_video_bit_rate));
+ /* [XML] DefaultJ2KVideoBitRate Default bitrate (in bits per second) for JPEG2000 data in new films. */
+ cxml::add_text_child(root, "DefaultJ2KVideoBitRate", raw_convert<string>(_default_video_bit_rate[VideoEncoding::JPEG2000]));
+ /* [XML] DefaultMPEG2VideoBitRate Default bitrate (in bits per second) for MPEG2 data in new films. */
+ cxml::add_text_child(root, "DefaultMPEG2VideoBitRate", raw_convert<string>(_default_video_bit_rate[VideoEncoding::MPEG2]));
/* [XML] DefaultAudioDelay Default delay to apply to audio (positive moves audio later) in milliseconds. */
cxml::add_text_child(root, "DefaultAudioDelay", raw_convert<string>(_default_audio_delay));
/* [XML] DefaultInterop 1 to default new films to Interop, 0 for SMPTE. */
@@ -896,8 +902,10 @@ Config::write_config () const
/* [XML] CheckForUpdates 1 to check dcpomatic.com for new text versions, 0 to check only on request. */
cxml::add_text_child(root, "CheckForTestUpdates", _check_for_test_updates ? "1" : "0");
- /* [XML] MaximumVideoBitRate Maximum video bit rate (in bits per second) that can be specified in the GUI. */
- cxml::add_text_child(root, "MaximumVideoBitRate", raw_convert<string>(_maximum_video_bit_rate));
+ /* [XML] MaximumJ2KVideoBitRate Maximum video bit rate (in bits per second) that can be specified in the GUI for JPEG2000 encodes. */
+ cxml::add_text_child(root, "MaximumJ2KVideoBitRate", raw_convert<string>(_maximum_video_bit_rate[VideoEncoding::JPEG2000]));
+ /* [XML] MaximumMPEG2VideoBitRate Maximum video bit rate (in bits per second) that can be specified in the GUI for MPEG2 encodes. */
+ cxml::add_text_child(root, "MaximumMPEG2VideoBitRate", raw_convert<string>(_maximum_video_bit_rate[VideoEncoding::MPEG2]));
/* [XML] AllowAnyDCPFrameRate 1 to allow users to specify any frame rate when creating DCPs, 0 to limit the GUI to standard rates. */
cxml::add_text_child(root, "AllowAnyDCPFrameRate", _allow_any_dcp_frame_rate ? "1" : "0");
/* [XML] AllowAnyContainer 1 to allow users to user any container ratio for their DCP, 0 to limit the GUI to DCI Flat/Scope */
diff --git a/src/lib/config.h b/src/lib/config.h
index ff71f8a38..a7b238c04 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -28,9 +28,11 @@
#include "audio_mapping.h"
+#include "enum_indexed_vector.h"
#include "export_config.h"
#include "rough_duration.h"
#include "state.h"
+#include "video_encoding.h"
#include <dcp/name_format.h>
#include <dcp/certificate_chain.h>
#include <dcp/encrypted_kdm.h>
@@ -233,8 +235,8 @@ public:
return _dcp_j2k_comment;
}
- int64_t default_video_bit_rate() const {
- return _default_video_bit_rate;
+ int64_t default_video_bit_rate(VideoEncoding encoding) const {
+ return _default_video_bit_rate[encoding];
}
int default_audio_delay () const {
@@ -349,8 +351,8 @@ public:
return _check_for_test_updates;
}
- int64_t maximum_video_bit_rate() const {
- return _maximum_video_bit_rate;
+ int64_t maximum_video_bit_rate(VideoEncoding encoding) const {
+ return _maximum_video_bit_rate[encoding];
}
int log_types () const {
@@ -811,8 +813,8 @@ public:
maybe_set (_dcp_j2k_comment, c);
}
- void set_default_video_bit_rate(int64_t b) {
- maybe_set(_default_video_bit_rate, b);
+ void set_default_video_bit_rate(VideoEncoding encoding, int64_t b) {
+ maybe_set(_default_video_bit_rate[encoding], b);
}
void set_default_audio_delay (int d) {
@@ -934,8 +936,8 @@ public:
maybe_set (_check_for_test_updates, c);
}
- void set_maximum_video_bit_rate(int64_t b) {
- maybe_set(_maximum_video_bit_rate, b);
+ void set_maximum_video_bit_rate(VideoEncoding encoding, int64_t b) {
+ maybe_set(_maximum_video_bit_rate[encoding], b);
}
void set_log_types (int t) {
@@ -1381,7 +1383,7 @@ private:
std::string _dcp_product_name;
std::string _dcp_product_version;
std::string _dcp_j2k_comment;
- int64_t _default_video_bit_rate;
+ EnumIndexedVector<int64_t, VideoEncoding> _default_video_bit_rate;
int _default_audio_delay;
bool _default_interop;
boost::optional<dcp::LanguageTag> _default_audio_language;
@@ -1419,7 +1421,7 @@ private:
bool _check_for_updates;
bool _check_for_test_updates;
/** maximum allowed video bit rate in bits per second */
- int64_t _maximum_video_bit_rate;
+ EnumIndexedVector<int64_t, VideoEncoding> _maximum_video_bit_rate;
int _log_types;
bool _analyse_ebur128;
bool _automatic_audio_analysis;
diff --git a/src/lib/create_cli.cc b/src/lib/create_cli.cc
index b33537974..8fe5a2a14 100644
--- a/src/lib/create_cli.cc
+++ b/src/lib/create_cli.cc
@@ -320,8 +320,8 @@ CreateCLI::CreateCLI (int argc, char* argv[])
_name = content[0].path.filename().string();
}
- if (_video_bit_rate && (*_video_bit_rate < 10000000 || *_video_bit_rate > Config::instance()->maximum_video_bit_rate())) {
- error = String::compose("%1: video-bit-rate must be between 10 and %2 Mbit/s", argv[0], (Config::instance()->maximum_video_bit_rate() / 1000000));
+ if (_video_bit_rate && (*_video_bit_rate < 10000000 || *_video_bit_rate > Config::instance()->maximum_video_bit_rate(VideoEncoding::JPEG2000))) {
+ error = String::compose("%1: video-bit-rate must be between 10 and %2 Mbit/s", argv[0], (Config::instance()->maximum_video_bit_rate(VideoEncoding::JPEG2000) / 1000000));
return;
}
}
@@ -373,7 +373,7 @@ CreateCLI::make_film() const
film->set_resolution(Resolution::FOUR_K);
}
if (_video_bit_rate) {
- film->set_video_bit_rate(*_video_bit_rate);
+ film->set_video_bit_rate(VideoEncoding::JPEG2000, *_video_bit_rate);
}
int channels = 6;
diff --git a/src/lib/dcp_film_encoder.cc b/src/lib/dcp_film_encoder.cc
index 17f531693..bdcd17f38 100644
--- a/src/lib/dcp_film_encoder.cc
+++ b/src/lib/dcp_film_encoder.cc
@@ -78,6 +78,8 @@ DCPFilmEncoder::DCPFilmEncoder(shared_ptr<const Film> film, weak_ptr<Job> job)
case VideoEncoding::MPEG2:
_encoder.reset(new MPEG2Encoder(film, _writer));
break;
+ case VideoEncoding::COUNT:
+ DCPOMATIC_ASSERT(false);
}
_player_video_connection = _player.Video.connect(bind(&DCPFilmEncoder::video, this, _1, _2));
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 6dc1b6b6c..a3e78e877 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -163,7 +163,6 @@ Film::Film (optional<boost::filesystem::path> dir)
, _resolution (Resolution::TWO_K)
, _encrypted (false)
, _context_id (dcp::make_uuid ())
- , _video_bit_rate(Config::instance()->default_video_bit_rate())
, _video_frame_rate (24)
, _audio_channels (Config::instance()->default_dcp_audio_channels ())
, _three_d (false)
@@ -203,6 +202,10 @@ Film::Film (optional<boost::filesystem::path> dir)
_studio = metadata["studio"];
}
+ for (auto encoding: {VideoEncoding::JPEG2000, VideoEncoding::MPEG2}) {
+ _video_bit_rate[encoding] = Config::instance()->default_video_bit_rate(encoding);
+ }
+
_playlist_change_connection = _playlist->Change.connect (bind (&Film::playlist_change, this, _1));
_playlist_order_changed_connection = _playlist->OrderChange.connect (bind (&Film::playlist_order_changed, this));
_playlist_content_change_connection = _playlist->ContentChange.connect (bind (&Film::playlist_content_change, this, _1, _2, _3, _4));
@@ -241,7 +244,7 @@ Film::video_identifier () const
+ "_" + resolution_to_string (_resolution)
+ "_" + _playlist->video_identifier()
+ "_" + raw_convert<string>(_video_frame_rate)
- + "_" + raw_convert<string>(video_bit_rate());
+ + "_" + raw_convert<string>(video_bit_rate(video_encoding()));
if (encrypted ()) {
/* This is insecure but hey, the key is in plaintext in metadata.xml */
@@ -401,7 +404,8 @@ Film::metadata (bool with_content_paths) const
}
cxml::add_text_child(root, "Resolution", resolution_to_string(_resolution));
- cxml::add_text_child(root, "VideoBitRate", raw_convert<string>(_video_bit_rate));
+ cxml::add_text_child(root, "J2KVideoBitRate", raw_convert<string>(_video_bit_rate[VideoEncoding::JPEG2000]));
+ cxml::add_text_child(root, "MPEG2VideoBitRate", raw_convert<string>(_video_bit_rate[VideoEncoding::MPEG2]));
cxml::add_text_child(root, "VideoFrameRate", raw_convert<string>(_video_frame_rate));
cxml::add_text_child(root, "AudioFrameRate", raw_convert<string>(_audio_frame_rate));
cxml::add_text_child(root, "ISDCFDate", boost::gregorian::to_iso_string(_isdcf_date));
@@ -575,10 +579,11 @@ Film::read_metadata (optional<boost::filesystem::path> path)
_resolution = string_to_resolution (f.string_child ("Resolution"));
if (auto j2k = f.optional_number_child<int>("J2KBandwidth")) {
- _video_bit_rate = *j2k;
+ _video_bit_rate[VideoEncoding::JPEG2000] = *j2k;
} else {
- _video_bit_rate = f.number_child<int64_t>("VideoBitRate");
+ _video_bit_rate[VideoEncoding::JPEG2000] = f.number_child<int64_t>("J2KVideoBitRate");
}
+ _video_bit_rate[VideoEncoding::MPEG2] = f.optional_number_child<int64_t>("MPEG2VideoBitRate").get_value_or(Config::instance()->default_video_bit_rate(VideoEncoding::MPEG2));
_video_frame_rate = f.number_child<int> ("VideoFrameRate");
_audio_frame_rate = f.optional_number_child<int>("AudioFrameRate").get_value_or(48000);
_encrypted = f.bool_child ("Encrypted");
@@ -1181,10 +1186,10 @@ Film::set_resolution (Resolution r, bool explicit_user)
void
-Film::set_video_bit_rate(int64_t bit_rate)
+Film::set_video_bit_rate(VideoEncoding encoding, int64_t bit_rate)
{
FilmChangeSignaller ch(this, FilmProperty::VIDEO_BIT_RATE);
- _video_bit_rate = bit_rate;
+ _video_bit_rate[encoding] = bit_rate;
}
/** @param f New frame rate.
@@ -1802,7 +1807,7 @@ Film::make_kdm(boost::filesystem::path cpl_file, dcp::LocalTime from, dcp::Local
uint64_t
Film::required_disk_space () const
{
- return _playlist->required_disk_space (shared_from_this(), video_bit_rate(), audio_channels(), audio_frame_rate());
+ return _playlist->required_disk_space (shared_from_this(), video_bit_rate(video_encoding()), audio_channels(), audio_frame_rate());
}
/** This method checks the disk that the Film is on and tries to decide whether or not
@@ -1934,7 +1939,7 @@ Film::reels () const
/* Integer-divide reel length by the size of one frame to give the number of frames per reel,
* making sure we don't go less than 1s long.
*/
- Frame const reel_in_frames = max(_reel_length / ((video_bit_rate() / video_frame_rate()) / 8), static_cast<Frame>(video_frame_rate()));
+ Frame const reel_in_frames = max(_reel_length / ((video_bit_rate(video_encoding()) / video_frame_rate()) / 8), static_cast<Frame>(video_frame_rate()));
while (current < len) {
DCPTime end = min (len, current + DCPTime::from_frames (reel_in_frames, video_frame_rate ()));
periods.emplace_back(current, end);
@@ -1978,7 +1983,9 @@ Film::use_template (string name)
_dcp_content_type = _template_film->_dcp_content_type;
_container = _template_film->_container;
_resolution = _template_film->_resolution;
- _video_bit_rate = _template_film->_video_bit_rate;
+ for (auto encoding: { VideoEncoding::JPEG2000, VideoEncoding::MPEG2 }) {
+ _video_bit_rate[encoding] = _template_film->_video_bit_rate[encoding];
+ }
_video_frame_rate = _template_film->_video_frame_rate;
_encrypted = _template_film->_encrypted;
_audio_channels = _template_film->_audio_channels;
diff --git a/src/lib/film.h b/src/lib/film.h
index ff3dee6fc..e2e88e2c9 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -32,6 +32,7 @@
#include "change_signaller.h"
#include "dcp_text_track.h"
#include "dcpomatic_time.h"
+#include "enum_indexed_vector.h"
#include "film_property.h"
#include "frame_rate_change.h"
#include "named_channel.h"
@@ -251,8 +252,8 @@ public:
return _key;
}
- int video_bit_rate() const {
- return _video_bit_rate;
+ int video_bit_rate(VideoEncoding encoding) const {
+ return _video_bit_rate[encoding];
}
/** @return The frame rate of the DCP */
@@ -406,7 +407,7 @@ public:
void set_container (Ratio const *, bool user_explicit = true);
void set_resolution (Resolution, bool user_explicit = true);
void set_encrypted (bool);
- void set_video_bit_rate(int64_t);
+ void set_video_bit_rate(VideoEncoding encoding, int64_t);
void set_video_frame_rate (int rate, bool user_explicit = false);
void set_audio_channels (int);
void set_three_d (bool);
@@ -521,8 +522,8 @@ private:
* re-start picture MXF encodes.
*/
std::string _context_id;
- /** bit rate for encoding video using J2K or MPEG2 in bits per second */
- int64_t _video_bit_rate;
+ /** bit rate for encoding video using in bits per second */
+ EnumIndexedVector<int64_t, VideoEncoding> _video_bit_rate;
/** Frames per second to run our DCP at */
int _video_frame_rate;
/** The date that we should use in a ISDCF name */
diff --git a/src/lib/grok/context.h b/src/lib/grok/context.h
index fc9b74a57..81622ad9d 100644
--- a/src/lib/grok/context.h
+++ b/src/lib/grok/context.h
@@ -226,7 +226,7 @@ public:
device,
_dcpomatic_context->film->resolution() == Resolution::FOUR_K,
_dcpomatic_context->film->video_frame_rate(),
- _dcpomatic_context->film->video_bit_rate(),
+ _dcpomatic_context->film->video_bit_rate(VideoEncoding::JPEG2000),
grok.licence_server,
grok.licence_port,
grok.licence)) {
diff --git a/src/lib/hints.cc b/src/lib/hints.cc
index fc59fa703..8e678fdf1 100644
--- a/src/lib/hints.cc
+++ b/src/lib/hints.cc
@@ -175,7 +175,7 @@ Hints::check_unusual_container ()
void
Hints::check_high_video_bit_rate()
{
- if (film()->video_bit_rate() >= 245000000) {
+ if (film()->video_encoding() == VideoEncoding::JPEG2000 && film()->video_bit_rate(VideoEncoding::JPEG2000) >= 245000000) {
hint (_("A few projectors have problems playing back very high bit-rate DCPs. It is a good idea to drop the video bit rate down to about 200Mbit/s; this is unlikely to have any visible effect on the image."));
}
}
diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc
index d5c7b3eed..094e104ef 100644
--- a/src/lib/j2k_encoder.cc
+++ b/src/lib/j2k_encoder.cc
@@ -310,7 +310,7 @@ J2KEncoder::encode (shared_ptr<PlayerVideo> pv, DCPTime time)
pv,
position,
_film->video_frame_rate(),
- _film->video_bit_rate(),
+ _film->video_bit_rate(VideoEncoding::JPEG2000),
_film->resolution()
);
_queue.push_back (dcpv);
diff --git a/src/lib/make_dcp.cc b/src/lib/make_dcp.cc
index e4707721c..b72756194 100644
--- a/src/lib/make_dcp.cc
+++ b/src/lib/make_dcp.cc
@@ -91,7 +91,7 @@ make_dcp (shared_ptr<Film> film, TranscodeJob::ChangedBehaviour behaviour)
LOG_GENERAL ("Content: %1", content->technical_summary());
}
LOG_GENERAL ("DCP video rate %1 fps", film->video_frame_rate());
- LOG_GENERAL("Video bit rate %1", film->video_bit_rate());
+ LOG_GENERAL("Video bit rate %1", film->video_bit_rate(film->video_encoding()));
auto tj = make_shared<DCPTranscodeJob>(film, behaviour);
tj->set_encoder(make_shared<DCPFilmEncoder>(film, tj));
diff --git a/src/lib/mpeg2_encoder.cc b/src/lib/mpeg2_encoder.cc
index 49bff19d4..9b9cdfd09 100644
--- a/src/lib/mpeg2_encoder.cc
+++ b/src/lib/mpeg2_encoder.cc
@@ -32,7 +32,7 @@ using std::shared_ptr;
MPEG2Encoder::MPEG2Encoder(shared_ptr<const Film> film, Writer& writer)
: VideoEncoder(film, writer)
- , _transcoder(film->frame_size(), film->video_frame_rate(), film->video_bit_rate())
+ , _transcoder(film->frame_size(), film->video_frame_rate(), film->video_bit_rate(VideoEncoding::MPEG2))
{
}
diff --git a/src/lib/video_encoding.cc b/src/lib/video_encoding.cc
index ead1a2eaf..de68c6ae9 100644
--- a/src/lib/video_encoding.cc
+++ b/src/lib/video_encoding.cc
@@ -34,6 +34,8 @@ video_encoding_to_string(VideoEncoding encoding)
return "jpeg2000";
case VideoEncoding::MPEG2:
return "mpeg2";
+ case VideoEncoding::COUNT:
+ DCPOMATIC_ASSERT(false);
}
DCPOMATIC_ASSERT(false);
diff --git a/src/lib/video_encoding.h b/src/lib/video_encoding.h
index 45ee0b21e..7c240f06f 100644
--- a/src/lib/video_encoding.h
+++ b/src/lib/video_encoding.h
@@ -19,16 +19,24 @@
*/
+#ifndef DCPOMATIC_VIDEO_ENCODING_H
+#define DCPOMATIC_VIDEO_ENCODING_H
+
+
#include <string>
enum class VideoEncoding
{
JPEG2000,
- MPEG2
+ MPEG2,
+ COUNT
};
std::string video_encoding_to_string(VideoEncoding encoding);
VideoEncoding video_encoding_from_string(std::string const& encoding);
+
+#endif
+
diff --git a/src/tools/dcpomatic_cli.cc b/src/tools/dcpomatic_cli.cc
index b59348908..49caf5cb2 100644
--- a/src/tools/dcpomatic_cli.cc
+++ b/src/tools/dcpomatic_cli.cc
@@ -94,7 +94,7 @@ print_dump (shared_ptr<Film> film)
{
cout << film->dcp_name (true) << "\n"
<< film->container()->container_nickname() << " at " << ((film->resolution() == Resolution::TWO_K) ? "2K" : "4K") << "\n"
- << (film->video_bit_rate() / 1000000) << "Mbit/s" << "\n"
+ << (film->video_bit_rate(film->video_encoding()) / 1000000) << "Mbit/s" << "\n"
<< "Duration " << (film->length().timecode(film->video_frame_rate())) << "\n"
<< "Output " << film->video_frame_rate() << "fps " << (film->three_d() ? "3D" : "2D") << " " << (film->audio_frame_rate() / 1000) << "kHz\n"
<< (film->interop() ? "Inter-Op" : "SMPTE") << " " << (film->encrypted() ? "encrypted" : "unencrypted") << "\n";
diff --git a/src/wx/dcp_panel.cc b/src/wx/dcp_panel.cc
index 8ee95df18..bc8ac859c 100644
--- a/src/wx/dcp_panel.cc
+++ b/src/wx/dcp_panel.cc
@@ -270,7 +270,7 @@ DCPPanel::video_bit_rate_changed()
return;
}
- _film->set_video_bit_rate(_video_bit_rate->GetValue() * 1000000);
+ _film->set_video_bit_rate(_film->video_encoding(), _video_bit_rate->GetValue() * 1000000);
}
@@ -397,7 +397,7 @@ DCPPanel::film_changed(FilmProperty p)
setup_dcp_name ();
break;
case FilmProperty::VIDEO_BIT_RATE:
- checked_set(_video_bit_rate, _film->video_bit_rate() / 1000000);
+ checked_set(_video_bit_rate, _film->video_bit_rate(_film->video_encoding()) / 1000000);
break;
case FilmProperty::USE_ISDCF_NAME:
{
@@ -460,6 +460,7 @@ DCPPanel::film_changed(FilmProperty p)
set_standard();
setup_container();
setup_sensitivity();
+ film_changed(FilmProperty::VIDEO_BIT_RATE);
break;
case FilmProperty::LIMIT_TO_SMPTE_BV20:
set_standard();
@@ -754,7 +755,8 @@ DCPPanel::reencode_j2k_changed ()
void
DCPPanel::config_changed (Config::Property p)
{
- _video_bit_rate->SetRange(1, Config::instance()->maximum_video_bit_rate() / 1000000);
+ VideoEncoding const encoding = _film ? _film->video_encoding() : VideoEncoding::JPEG2000;
+ _video_bit_rate->SetRange(1, Config::instance()->maximum_video_bit_rate(encoding) / 1000000);
setup_frame_rate_widget ();
if (p == Config::SHOW_EXPERIMENTAL_AUDIO_PROCESSORS) {
@@ -836,7 +838,8 @@ DCPPanel::make_video_panel ()
_frame_rate_choice->add_entry(boost::lexical_cast<string>(i));
}
- _video_bit_rate->SetRange(1, Config::instance()->maximum_video_bit_rate() / 1000000);
+ VideoEncoding const encoding = _film ? _film->video_encoding() : VideoEncoding::JPEG2000;
+ _video_bit_rate->SetRange(1, Config::instance()->maximum_video_bit_rate(encoding) / 1000000);
_frame_rate_spin->SetRange (1, 480);
_resolution->add_entry(_("2K"));
diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc
index 092c9ab26..00e5575b1 100644
--- a/src/wx/full_config_dialog.cc
+++ b/src/wx/full_config_dialog.cc
@@ -320,10 +320,19 @@ private:
table->Add (_dcp_audio_channels);
{
- add_label_to_sizer (table, _panel, _("Default JPEG2000 bandwidth"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
+ add_label_to_sizer(table, _panel, _("Default JPEG2000 bit rate"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
auto s = new wxBoxSizer (wxHORIZONTAL);
- _video_bit_rate = new wxSpinCtrl(_panel);
- s->Add(_video_bit_rate);
+ _j2k_video_bit_rate = new wxSpinCtrl(_panel);
+ s->Add(_j2k_video_bit_rate);
+ add_label_to_sizer (s, _panel, _("Mbit/s"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
+ table->Add (s, 1);
+ }
+
+ {
+ add_label_to_sizer(table, _panel, _("Default MPEG2 bit rate"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
+ auto s = new wxBoxSizer (wxHORIZONTAL);
+ _mpeg2_video_bit_rate = new wxSpinCtrl(_panel);
+ s->Add(_mpeg2_video_bit_rate);
add_label_to_sizer (s, _panel, _("Mbit/s"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
table->Add (s, 1);
}
@@ -410,8 +419,10 @@ private:
_dcp_content_type->Bind (wxEVT_CHOICE, boost::bind (&DefaultsPage::dcp_content_type_changed, this));
_dcp_audio_channels->Bind (wxEVT_CHOICE, boost::bind (&DefaultsPage::dcp_audio_channels_changed, this));
- _video_bit_rate->SetRange(50, 250);
- _video_bit_rate->Bind(wxEVT_SPINCTRL, boost::bind(&DefaultsPage::video_bit_rate_changed, this));
+ _j2k_video_bit_rate->SetRange(50, 250);
+ _j2k_video_bit_rate->Bind(wxEVT_SPINCTRL, boost::bind(&DefaultsPage::j2k_video_bit_rate_changed, this));
+ _mpeg2_video_bit_rate->SetRange(1, 50);
+ _mpeg2_video_bit_rate->Bind(wxEVT_SPINCTRL, boost::bind(&DefaultsPage::mpeg2_video_bit_rate_changed, this));
_audio_delay->SetRange (-1000, 1000);
_audio_delay->Bind (wxEVT_SPINCTRL, boost::bind (&DefaultsPage::audio_delay_changed, this));
@@ -451,8 +462,10 @@ private:
_kdm_directory->SetPath (std_to_wx (config->default_kdm_directory_or (wx_to_std (wxStandardPaths::Get().GetDocumentsDir())).string ()));
_kdm_type->set (config->default_kdm_type());
checked_set (_use_isdcf_name_by_default, config->use_isdcf_name_by_default());
- checked_set(_video_bit_rate, config->default_video_bit_rate() / 1000000);
- _video_bit_rate->SetRange(50, config->maximum_video_bit_rate() / 1000000);
+ checked_set(_j2k_video_bit_rate, config->default_video_bit_rate(VideoEncoding::JPEG2000) / 1000000);
+ _j2k_video_bit_rate->SetRange(50, config->maximum_video_bit_rate(VideoEncoding::JPEG2000) / 1000000);
+ checked_set(_mpeg2_video_bit_rate, config->default_video_bit_rate(VideoEncoding::MPEG2) / 1000000);
+ _mpeg2_video_bit_rate->SetRange(1, config->maximum_video_bit_rate(VideoEncoding::MPEG2) / 1000000);
checked_set (_dcp_audio_channels, locale_convert<string> (config->default_dcp_audio_channels()));
checked_set (_audio_delay, config->default_audio_delay ());
checked_set (_standard, config->default_interop() ? 1 : 0);
@@ -527,9 +540,14 @@ private:
config->set_default_kdm_duration (RoughDuration(duration, unit));
}
- void video_bit_rate_changed()
+ void j2k_video_bit_rate_changed()
+ {
+ Config::instance()->set_default_video_bit_rate(VideoEncoding::JPEG2000, _j2k_video_bit_rate->GetValue() * 1000000);
+ }
+
+ void mpeg2_video_bit_rate_changed()
{
- Config::instance()->set_default_video_bit_rate(_video_bit_rate->GetValue() * 1000000);
+ Config::instance()->set_default_video_bit_rate(VideoEncoding::MPEG2, _mpeg2_video_bit_rate->GetValue() * 1000000);
}
void audio_delay_changed ()
@@ -634,7 +652,8 @@ private:
}
}
- wxSpinCtrl* _video_bit_rate;
+ wxSpinCtrl* _j2k_video_bit_rate;
+ wxSpinCtrl* _mpeg2_video_bit_rate;
wxSpinCtrl* _audio_delay;
wxSpinCtrl* _still_length;
#ifdef DCPOMATIC_USE_OWN_PICKER
@@ -1541,10 +1560,19 @@ private:
_panel->GetSizer()->Add(table, 1, wxALL | wxEXPAND, _border);
{
- add_label_to_sizer(table, _panel, _("Maximum JPEG2000 bandwidth"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
+ add_label_to_sizer(table, _panel, _("Maximum JPEG2000 bit rate"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
auto s = new wxBoxSizer(wxHORIZONTAL);
- _maximum_video_bit_rate = new wxSpinCtrl(_panel);
- s->Add(_maximum_video_bit_rate, 1);
+ _maximum_j2k_video_bit_rate = new wxSpinCtrl(_panel);
+ s->Add(_maximum_j2k_video_bit_rate, 1);
+ add_label_to_sizer(s, _panel, _("Mbit/s"), false, 0, wxLEFT | wxALIGN_CENTRE_VERTICAL);
+ table->Add(s, 1);
+ }
+
+ {
+ add_label_to_sizer(table, _panel, _("Maximum MPEG2 bit rate"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
+ auto s = new wxBoxSizer(wxHORIZONTAL);
+ _maximum_mpeg2_video_bit_rate = new wxSpinCtrl(_panel);
+ s->Add(_maximum_mpeg2_video_bit_rate, 1);
add_label_to_sizer(s, _panel, _("Mbit/s"), false, 0, wxLEFT | wxALIGN_CENTRE_VERTICAL);
table->Add(s, 1);
}
@@ -1573,8 +1601,10 @@ private:
table->Add(s, 1);
}
- _maximum_video_bit_rate->SetRange(1, 1000);
- _maximum_video_bit_rate->Bind(wxEVT_SPINCTRL, boost::bind(&NonStandardPage::maximum_video_bit_rate_changed, this));
+ _maximum_j2k_video_bit_rate->SetRange(1, 1000);
+ _maximum_j2k_video_bit_rate->Bind(wxEVT_SPINCTRL, boost::bind(&NonStandardPage::maximum_j2k_video_bit_rate_changed, this));
+ _maximum_mpeg2_video_bit_rate->SetRange(1, 100);
+ _maximum_mpeg2_video_bit_rate->Bind(wxEVT_SPINCTRL, boost::bind(&NonStandardPage::maximum_mpeg2_video_bit_rate_changed, this));
_allow_any_dcp_frame_rate->bind(&NonStandardPage::allow_any_dcp_frame_rate_changed, this);
_allow_any_container->bind(&NonStandardPage::allow_any_container_changed, this);
_allow_96khz_audio->bind(&NonStandardPage::allow_96khz_audio_changed, this);
@@ -1588,7 +1618,8 @@ private:
{
auto config = Config::instance();
- checked_set(_maximum_video_bit_rate, config->maximum_video_bit_rate() / 1000000);
+ checked_set(_maximum_j2k_video_bit_rate, config->maximum_video_bit_rate(VideoEncoding::JPEG2000) / 1000000);
+ checked_set(_maximum_mpeg2_video_bit_rate, config->maximum_video_bit_rate(VideoEncoding::MPEG2) / 1000000);
checked_set(_allow_any_dcp_frame_rate, config->allow_any_dcp_frame_rate());
checked_set(_allow_any_container, config->allow_any_container());
checked_set(_allow_96khz_audio, config->allow_96khz_audio());
@@ -1597,9 +1628,14 @@ private:
checked_set(_isdcf_name_part_length, config->isdcf_name_part_length());
}
- void maximum_video_bit_rate_changed()
+ void maximum_j2k_video_bit_rate_changed()
+ {
+ Config::instance()->set_maximum_video_bit_rate(VideoEncoding::JPEG2000, _maximum_j2k_video_bit_rate->GetValue() * 1000000);
+ }
+
+ void maximum_mpeg2_video_bit_rate_changed()
{
- Config::instance()->set_maximum_video_bit_rate(_maximum_video_bit_rate->GetValue() * 1000000);
+ Config::instance()->set_maximum_video_bit_rate(VideoEncoding::MPEG2, _maximum_mpeg2_video_bit_rate->GetValue() * 1000000);
}
void allow_any_dcp_frame_rate_changed()
@@ -1632,7 +1668,8 @@ private:
Config::instance()->set_isdcf_name_part_length(_isdcf_name_part_length->GetValue());
}
- wxSpinCtrl* _maximum_video_bit_rate = nullptr;
+ wxSpinCtrl* _maximum_j2k_video_bit_rate = nullptr;
+ wxSpinCtrl* _maximum_mpeg2_video_bit_rate = nullptr;
CheckBox* _allow_any_dcp_frame_rate = nullptr;
CheckBox* _allow_any_container = nullptr;
CheckBox* _allow_96khz_audio = nullptr;