*/
-#include "ffmpeg_content.h"
-#include "video_content.h"
#include "audio_content.h"
-#include "ffmpeg_examiner.h"
-#include "ffmpeg_subtitle_stream.h"
-#include "ffmpeg_audio_stream.h"
#include "compose.hpp"
-#include "job.h"
-#include "util.h"
-#include "filter.h"
-#include "film.h"
-#include "log.h"
#include "config.h"
+#include "constants.h"
#include "exceptions.h"
+#include "ffmpeg_audio_stream.h"
+#include "ffmpeg_content.h"
+#include "ffmpeg_examiner.h"
+#include "ffmpeg_subtitle_stream.h"
+#include "film.h"
+#include "filter.h"
#include "frame_rate_change.h"
+#include "job.h"
+#include "log.h"
#include "text_content.h"
+#include "video_content.h"
#include <dcp/raw_convert.h>
#include <libcxml/cxml.h>
extern "C" {
}
for (auto i: node->node_children("Filter")) {
- Filter const * f = Filter::from_id(i->content());
- if (f) {
- _filters.push_back (f);
+ if (auto filter = Filter::from_id(i->content())) {
+ _filters.push_back(*filter);
} else {
notes.push_back (String::compose (_("DCP-o-matic no longer supports the `%1' filter, so it has been turned off."), i->content()));
}
}
for (auto i: _filters) {
- node->add_child("Filter")->add_child_text(i->id());
+ node->add_child("Filter")->add_child_text(i.id());
}
if (_first_video) {
if (examiner->has_video ()) {
video.reset (new VideoContent (this));
- video->take_from_examiner (examiner);
+ video->take_from_examiner(film, examiner);
}
auto first_path = path (0);
if (examiner->rotation()) {
auto rot = *examiner->rotation ();
if (fabs (rot - 180) < 1.0) {
- _filters.push_back (Filter::from_id ("vflip"));
- _filters.push_back (Filter::from_id ("hflip"));
+ _filters.push_back(*Filter::from_id("vflip"));
+ _filters.push_back(*Filter::from_id("hflip"));
} else if (fabs (rot - 90) < 1.0) {
- _filters.push_back (Filter::from_id ("90clock"));
+ _filters.push_back(*Filter::from_id("90clock"));
+ video->rotate_size();
} else if (fabs (rot - 270) < 1.0) {
- _filters.push_back (Filter::from_id ("90anticlock"));
+ _filters.push_back(*Filter::from_id("90anticlock"));
+ video->rotate_size();
}
}
+ if (examiner->has_alpha()) {
+ _filters.push_back(*Filter::from_id("premultiply"));
+ }
}
if (!examiner->audio_streams().empty()) {
text.clear ();
text.push_back (make_shared<TextContent>(this, TextType::OPEN_SUBTITLE, TextType::UNKNOWN));
_subtitle_stream = _subtitle_streams.front ();
+ text.front()->add_font(make_shared<dcpomatic::Font>(""));
}
}
/* FFmpeg has detected this file as 29.97 and the examiner thinks it is using "soft" 2:3 pulldown (telecine).
* This means we can treat it as a 23.976fps file.
*/
- set_video_frame_rate (24000.0 / 1001);
+ set_video_frame_rate(film, 24000.0 / 1001);
video->set_length (video->length() * 24.0 / 30);
}
}
void
-FFmpegContent::set_filters (vector<Filter const *> const & filters)
+FFmpegContent::set_filters(vector<Filter> const& filters)
{
ContentChangeSignaller cc (this, FFmpegContentProperty::FILTERS);
}
for (auto i: _filters) {
- s += "_" + i->id();
+ s += "_" + i.id();
}
return s;
video->set_colour_conversion (PresetColourConversion::from_id ("rec2020").conversion);
break;
default:
- if (s.width < 1080) {
+ if (s && s->width < 1080) {
video->set_colour_conversion (PresetColourConversion::from_id ("rec601").conversion);
} else {
video->set_colour_conversion (PresetColourConversion::from_id ("rec709").conversion);
video->add_properties (p);
if (_bits_per_pixel) {
- /* Assuming there's three components, so bits per pixel component is _bits_per_pixel / 3 */
- int const lim_start = pow(2, _bits_per_pixel.get() / 3 - 4);
- int const lim_end = 235 * pow(2, _bits_per_pixel.get() / 3 - 8);
- int const total = pow(2, _bits_per_pixel.get() / 3);
+ auto pixel_quanta_product = video->pixel_quanta().x * video->pixel_quanta().y;
+ auto bits_per_main_pixel = pixel_quanta_product * _bits_per_pixel.get() / (pixel_quanta_product + 2);
+
+ int const lim_start = pow(2, bits_per_main_pixel - 4);
+ int const lim_end = 235 * pow(2, bits_per_main_pixel - 8);
+ int const total = pow(2, bits_per_main_pixel);
switch (_color_range.get_value_or(AVCOL_RANGE_UNSPECIFIED)) {
case AVCOL_RANGE_UNSPECIFIED:
/// file is limited, so that not all possible values are valid.
p.push_back (
UserProperty (
- UserProperty::VIDEO, _("Colour range"), String::compose(_("Limited (%1-%2)"), lim_start, lim_end)
+ UserProperty::VIDEO, _("Colour range"), String::compose(_("Limited / video (%1-%2)"), lim_start, lim_end)
)
);
break;
case AVCOL_RANGE_JPEG:
/// TRANSLATORS: this means that the range of pixel values used in this
/// file is full, so that all possible pixel values are valid.
- p.push_back (UserProperty (UserProperty::VIDEO, _("Colour range"), String::compose (_("Full (0-%1)"), total)));
+ p.push_back(UserProperty(UserProperty::VIDEO, _("Colour range"), String::compose(_("Full (0-%1)"), total - 1)));
break;
default:
DCPOMATIC_ASSERT (false);