* Add subtitle view.
+2014-05-10 Carl Hetherington <cth@carlh.net>
+
+ * Version 1.69.2 released.
+
+2014-05-10 Carl Hetherington <cth@carlh.net>
+
+ * Fix setup of the libswresample context to work with high channel counts.
+
+2014-05-09 Carl Hetherington <cth@carlh.net>
+
+ * Version 1.69.1 released.
+
+2014-05-09 Carl Hetherington <cth@carlh.net>
+
+ * Fix crash on using content with more than 12 audio channels.
+
+ * Re-introduce ffprobe call when adding content.
+
2014-05-05 Carl Hetherington <cth@carlh.net>
* Version 1.69.0 released.
* Another attempt to fix colour conversion dialog strange behaviour
on OS X.
->>>>>>> master
2014-03-18 Carl Hetherington <cth@carlh.net>
-dcpomatic (1.69.0-1) UNRELEASED; urgency=low
+dcpomatic (1.69.2-1) UNRELEASED; urgency=low
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
+ * New upstream release.
+ * New upstream release.
- -- Carl Hetherington <carl@d1stkfactory> Mon, 05 May 2014 16:41:46 +0100
+ -- Carl Hetherington <carl@d1stkfactory> Sat, 10 May 2014 13:40:32 +0100
dcpomatic (0.87-1) UNRELEASED; urgency=low
using std::make_pair;
using std::pair;
using std::string;
+using std::min;
using boost::shared_ptr;
using boost::lexical_cast;
using boost::dynamic_pointer_cast;
_gain.resize (_content_channels);
for (int i = 0; i < _content_channels; ++i) {
- _gain[i].resize (MAX_AUDIO_CHANNELS);
+ _gain[i].resize (MAX_DCP_AUDIO_CHANNELS);
}
}
AudioMapping::make_default ()
{
for (int i = 0; i < _content_channels; ++i) {
- for (int j = 0; j < MAX_AUDIO_CHANNELS; ++j) {
+ for (int j = 0; j < MAX_DCP_AUDIO_CHANNELS; ++j) {
_gain[i][j] = 0;
}
}
set (0, dcp::CENTRE, 1);
} else {
/* 1:1 mapping */
- for (int i = 0; i < _content_channels; ++i) {
+ for (int i = 0; i < min (_content_channels, MAX_DCP_AUDIO_CHANNELS); ++i) {
set (i, static_cast<dcp::Channel> (i), 1);
}
}
node->add_child ("ContentChannels")->add_child_text (lexical_cast<string> (_content_channels));
for (int c = 0; c < _content_channels; ++c) {
- for (int d = 0; d < MAX_AUDIO_CHANNELS; ++d) {
+ for (int d = 0; d < MAX_DCP_AUDIO_CHANNELS; ++d) {
xmlpp::Element* t = node->add_child ("Gain");
t->set_attribute ("Content", lexical_cast<string> (c));
t->set_attribute ("DCP", lexical_cast<string> (d));
void
Film::examine_and_add_content (shared_ptr<Content> c)
{
+ if (dynamic_pointer_cast<FFmpegContent> (c)) {
+ run_ffprobe (c->path(0), file ("ffprobe.log"), _log);
+ }
+
shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
j->Finished.connect (bind (&Film::maybe_add_content, this, boost::weak_ptr<Job> (j), boost::weak_ptr<Content> (c)));
JobManager::instance()->add (j);
/*
- Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
extern "C" {
#include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
}
#include "resampler.h"
#include "audio_buffers.h"
, _out_rate (out)
, _channels (channels)
{
- /* We will be using planar float data when we call the
- resampler. As far as I can see, the audio channel
- layout is not necessary for our purposes; it seems
- only to be used get the number of channels and
- decide if rematrixing is needed. It won't be, since
- input and output layouts are the same.
- */
-
- _swr_context = swr_alloc_set_opts (
- 0,
- av_get_default_channel_layout (_channels),
- AV_SAMPLE_FMT_FLTP,
- _out_rate,
- av_get_default_channel_layout (_channels),
- AV_SAMPLE_FMT_FLTP,
- _in_rate,
- 0, 0
- );
+ _swr_context = swr_alloc ();
+
+ /* Sample formats */
+ av_opt_set_int (_swr_context, "isf", AV_SAMPLE_FMT_FLTP, 0);
+ av_opt_set_int (_swr_context, "osf", AV_SAMPLE_FMT_FLTP, 0);
+
+ /* Channel counts */
+ av_opt_set_int (_swr_context, "ich", _channels, 0);
+ av_opt_set_int (_swr_context, "och", _channels, 0);
+
+ /* Sample rates */
+ av_opt_set_int (_swr_context, "isr", _in_rate, 0);
+ av_opt_set_int (_swr_context, "osr", _out_rate, 0);
swr_init (_swr_context);
}
string
audio_channel_name (int c)
{
- assert (MAX_AUDIO_CHANNELS == 12);
+ assert (MAX_DCP_AUDIO_CHANNELS == 12);
/* TRANSLATORS: these are the names of audio channels; Lfe (sub) is the low-frequency
enhancement channel (sub-woofer). HI is the hearing-impaired audio track and
#undef check
-/** The maximum number of audio channels that we can cope with */
-#define MAX_AUDIO_CHANNELS 12
+/** The maximum number of audio channels that we can have in a DCP */
+#define MAX_DCP_AUDIO_CHANNELS 12
#define DCPOMATIC_HELLO "Boys, you gotta learn not to talk to nuns that way"
side->Add (m, 1, wxALIGN_CENTER_VERTICAL | wxTOP, 16);
}
- for (int i = 0; i < MAX_AUDIO_CHANNELS; ++i) {
+ for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
_channel_checkbox[i] = new wxCheckBox (this, wxID_ANY, std_to_wx (audio_channel_name (i)));
side->Add (_channel_checkbox[i], 1, wxEXPAND | wxALL, 3);
_channel_checkbox[i]->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AudioDialog::channel_clicked, this, _1));
AudioDialog::channel_clicked (wxCommandEvent& ev)
{
int c = 0;
- while (c < MAX_AUDIO_CHANNELS && ev.GetEventObject() != _channel_checkbox[c]) {
+ while (c < MAX_DCP_AUDIO_CHANNELS && ev.GetEventObject() != _channel_checkbox[c]) {
++c;
}
- assert (c < MAX_AUDIO_CHANNELS);
+ assert (c < MAX_DCP_AUDIO_CHANNELS);
_plot->set_channel_visible (c, _channel_checkbox[c]->GetValue ());
}
boost::shared_ptr<AudioContent> _content;
AudioPlot* _plot;
- wxCheckBox* _channel_checkbox[MAX_AUDIO_CHANNELS];
+ wxCheckBox* _channel_checkbox[MAX_DCP_AUDIO_CHANNELS];
wxCheckBox* _type_checkbox[AudioPoint::COUNT];
wxSlider* _smoothing;
boost::signals2::scoped_connection _content_changed_connection;
{
_grid = new wxGrid (this, wxID_ANY);
- _grid->CreateGrid (0, MAX_AUDIO_CHANNELS + 1);
+ _grid->CreateGrid (0, MAX_DCP_AUDIO_CHANNELS + 1);
_grid->HideRowLabels ();
_grid->DisableDragRowSize ();
_grid->DisableDragColSize ();
_grid->InsertRows (0, _map.content_channels ());
for (int i = 0; i < _map.content_channels(); ++i) {
- for (int j = 0; j < MAX_AUDIO_CHANNELS; ++j) {
+ for (int j = 0; j < MAX_DCP_AUDIO_CHANNELS; ++j) {
_grid->SetCellRenderer (i, j + 1, new ValueRenderer);
}
}
_grid->SetColLabelValue (0, _("Content"));
-#if MAX_AUDIO_CHANNELS != 12
-#warning AudioMappingView::set_column_labels() is expecting the wrong MAX_AUDIO_CHANNELS
+#if MAX_DCP_AUDIO_CHANNELS != 12
+#warning AudioMappingView::set_column_labels() is expecting the wrong MAX_DCP_AUDIO_CHANNELS
#endif
if (c > 0) {
SetDoubleBuffered (true);
#endif
- for (int i = 0; i < MAX_AUDIO_CHANNELS; ++i) {
+ for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
_channel_visible[i] = false;
}
_colours.push_back (wxColour (255, 0, 139));
_colours.push_back (wxColour (139, 0, 255));
-#if MAX_AUDIO_CHANNELS != 12
-#warning AudioPlot::AudioPlot is expecting the wrong MAX_AUDIO_CHANNELS
+#if MAX_DCP_AUDIO_CHANNELS != 12
+#warning AudioPlot::AudioPlot is expecting the wrong MAX_DCP_AUDIO_CHANNELS
#endif
Bind (wxEVT_PAINT, boost::bind (&AudioPlot::paint, this));
{
_analysis = a;
- for (int i = 0; i < MAX_AUDIO_CHANNELS; ++i) {
+ for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
_channel_visible[i] = false;
}
gc->DrawText (_("Time"), data_width, metrics.height - metrics.y_origin + db_label_height / 2);
if (_type_visible[AudioPoint::PEAK]) {
- for (int c = 0; c < MAX_AUDIO_CHANNELS; ++c) {
+ for (int c = 0; c < MAX_DCP_AUDIO_CHANNELS; ++c) {
wxGraphicsPath p = gc->CreatePath ();
if (_channel_visible[c] && c < _analysis->channels()) {
plot_peak (p, c, metrics);
}
if (_type_visible[AudioPoint::RMS]) {
- for (int c = 0; c < MAX_AUDIO_CHANNELS; ++c) {
+ for (int c = 0; c < MAX_DCP_AUDIO_CHANNELS; ++c) {
wxGraphicsPath p = gc->CreatePath ();
if (_channel_visible[c] && c < _analysis->channels()) {
plot_rms (p, c, metrics);
float y_for_linear (float, Metrics const &) const;
boost::shared_ptr<AudioAnalysis> _analysis;
- bool _channel_visible[MAX_AUDIO_CHANNELS];
+ bool _channel_visible[MAX_DCP_AUDIO_CHANNELS];
bool _type_visible[AudioPoint::COUNT];
/** gain to apply in dB */
float _gain;
_frame_rate->Append (std_to_wx (boost::lexical_cast<string> (*i)));
}
- _audio_channels->SetRange (0, MAX_AUDIO_CHANNELS);
+ _audio_channels->SetRange (0, MAX_DCP_AUDIO_CHANNELS);
_j2k_bandwidth->SetRange (1, Config::instance()->maximum_j2k_bandwidth() / 1000000);
_resolution->Append (_("2K"));
four.make_default ();
for (int i = 0; i < 4; ++i) {
- for (int j = 0; j < MAX_AUDIO_CHANNELS; ++j) {
+ for (int j = 0; j < MAX_DCP_AUDIO_CHANNELS; ++j) {
BOOST_CHECK_EQUAL (four.get (i, static_cast<dcp::Channel> (j)), i == j ? 1 : 0);
}
}
BOOST_AUTO_TEST_CASE (silence_padding_test)
{
- for (int i = 1; i < MAX_AUDIO_CHANNELS; ++i) {
+ for (int i = 1; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
test_silence_padding (i);
}
}