#include "lib/config.h"
#include "lib/compose.hpp"
#include "lib/dcpomatic_log.h"
+#include "lib/text_content.h"
extern "C" {
#include <libavutil/pixfmt.h>
}
, _playing (false)
, _latency_history_count (0)
, _dropped (0)
- , _closed_captions_dialog (new ClosedCaptionsDialog(p))
+ , _closed_captions_dialog (new ClosedCaptionsDialog(p, this))
, _outline_content (false)
, _eyes (EYES_LEFT)
, _pad_black (false)
_player->set_play_referenced ();
_film->Change.connect (boost::bind (&FilmViewer::film_change, this, _1, _2));
+ _film->ContentChange.connect (boost::bind(&FilmViewer::content_change, this, _1, _3));
_player->Change.connect (boost::bind (&FilmViewer::player_change, this, _1, _2, _3));
/* Keep about 1 second's worth of history samples */
_latency_history_count = _film->audio_frame_rate() / _audio_block_size;
+ _closed_captions_dialog->update_tracks (_film);
+
recreate_butler ();
calculate_sizes ();
Map so that Lt = L(-3dB) + Ls(-3dB) + C(-6dB) + Lfe(-10dB)
Rt = R(-3dB) + Rs(-3dB) + C(-6dB) + Lfe(-10dB)
*/
- map.set (dcp::LEFT, 0, 1 / sqrt(2)); // L -> Lt
- map.set (dcp::RIGHT, 1, 1 / sqrt(2)); // R -> Rt
- map.set (dcp::CENTRE, 0, 1 / 2.0); // C -> Lt
- map.set (dcp::CENTRE, 1, 1 / 2.0); // C -> Rt
- map.set (dcp::LFE, 0, 1 / sqrt(10)); // Lfe -> Lt
- map.set (dcp::LFE, 1, 1 / sqrt(10)); // Lfe -> Rt
- map.set (dcp::LS, 0, 1 / sqrt(2)); // Ls -> Lt
- map.set (dcp::RS, 1, 1 / sqrt(2)); // Rs -> Rt
+ if (_film->audio_channels() > 0) {
+ map.set (dcp::LEFT, 0, 1 / sqrt(2)); // L -> Lt
+ }
+ if (_film->audio_channels() > 1) {
+ map.set (dcp::RIGHT, 1, 1 / sqrt(2)); // R -> Rt
+ }
+ if (_film->audio_channels() > 2) {
+ map.set (dcp::CENTRE, 0, 1 / 2.0); // C -> Lt
+ map.set (dcp::CENTRE, 1, 1 / 2.0); // C -> Rt
+ }
+ if (_film->audio_channels() > 3) {
+ map.set (dcp::LFE, 0, 1 / sqrt(10)); // Lfe -> Lt
+ map.set (dcp::LFE, 1, 1 / sqrt(10)); // Lfe -> Rt
+ }
+ if (_film->audio_channels() > 4) {
+ map.set (dcp::LS, 0, 1 / sqrt(2)); // Ls -> Lt
+ }
+ if (_film->audio_channels() > 5) {
+ map.set (dcp::RS, 1, 1 / sqrt(2)); // Rs -> Rt
+ }
}
_butler.reset (new Butler(_player, map, _audio_channels, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true));
do {
Butler::Error e;
_player_video = _butler->get_video (&e);
- if (!_player_video.first && e == Butler::AGAIN) {
+ if (e.code == Butler::Error::DIED) {
+ LOG_ERROR ("Butler died with %1", e.message);
+ }
+ if (!_player_video.first && e.code == Butler::Error::Code::AGAIN) {
signal_manager->when_idle (boost::bind(&FilmViewer::get, this));
return;
}
_player_video.first->eyes() != EYES_BOTH
);
- _butler->rethrow ();
+ try {
+ _butler->rethrow ();
+ } catch (DecodeError& e) {
+ error_dialog (_panel, e.what());
+ }
display_player_video ();
}
dc.SetBrush (b);
int const gap = (_panel_size.height - _out_size.height) / 2;
dc.DrawRectangle (0, 0, _panel_size.width, gap);
- dc.DrawRectangle (0, gap + _out_size.height + 1, _panel_size.width, gap);
+ dc.DrawRectangle (0, gap + _out_size.height + 1, _panel_size.width, gap + 1);
}
if (_outline_content) {
{
if (type == CHANGE_TYPE_DONE && p == Film::AUDIO_CHANNELS) {
recreate_butler ();
+ } else if (p == Film::CONTENT) {
+ _closed_captions_dialog->update_tracks (_film);
}
}
{
_pad_black = p;
}
+
+void
+FilmViewer::content_change (ChangeType type, int property)
+{
+ if (type != CHANGE_TYPE_DONE) {
+ return;
+ }
+
+ if (property == TextContentProperty::USE || property == TextContentProperty::TYPE || property == TextContentProperty::DCP_TRACK) {
+ _closed_captions_dialog->update_tracks (_film);
+ }
+}