vector<DCPContentType const *> DCPContentType::_dcp_content_types;
-DCPContentType::DCPContentType (string p, libdcp::ContentKind k)
+DCPContentType::DCPContentType (string p, libdcp::ContentKind k, string d)
: _pretty_name (p)
, _libdcp_kind (k)
+ , _dci_name (d)
{
}
void
DCPContentType::setup_dcp_content_types ()
{
- _dcp_content_types.push_back (new DCPContentType ("Feature", libdcp::FEATURE));
- _dcp_content_types.push_back (new DCPContentType ("Short", libdcp::SHORT));
- _dcp_content_types.push_back (new DCPContentType ("Trailer", libdcp::TRAILER));
- _dcp_content_types.push_back (new DCPContentType ("Test", libdcp::TEST));
- _dcp_content_types.push_back (new DCPContentType ("Transitional", libdcp::TRANSITIONAL));
- _dcp_content_types.push_back (new DCPContentType ("Rating", libdcp::RATING));
- _dcp_content_types.push_back (new DCPContentType ("Teaser", libdcp::TEASER));
- _dcp_content_types.push_back (new DCPContentType ("Policy", libdcp::POLICY));
- _dcp_content_types.push_back (new DCPContentType ("Public Service Announcement", libdcp::PUBLIC_SERVICE_ANNOUNCEMENT));
- _dcp_content_types.push_back (new DCPContentType ("Advertisement", libdcp::ADVERTISEMENT));
+ _dcp_content_types.push_back (new DCPContentType ("Feature", libdcp::FEATURE, "FTR"));
+ _dcp_content_types.push_back (new DCPContentType ("Short", libdcp::SHORT, "SHR"));
+ _dcp_content_types.push_back (new DCPContentType ("Trailer", libdcp::TRAILER, "TLR"));
+ _dcp_content_types.push_back (new DCPContentType ("Test", libdcp::TEST, "TST"));
+ _dcp_content_types.push_back (new DCPContentType ("Transitional", libdcp::TRANSITIONAL, "XSN"));
+ _dcp_content_types.push_back (new DCPContentType ("Rating", libdcp::RATING, "RTG"));
+ _dcp_content_types.push_back (new DCPContentType ("Teaser", libdcp::TEASER, "TSR"));
+ _dcp_content_types.push_back (new DCPContentType ("Policy", libdcp::POLICY, "POL"));
+ _dcp_content_types.push_back (new DCPContentType ("Public Service Announcement", libdcp::PUBLIC_SERVICE_ANNOUNCEMENT, "PSA"));
+ _dcp_content_types.push_back (new DCPContentType ("Advertisement", libdcp::ADVERTISEMENT, "ADV"));
}
DCPContentType const *
class DCPContentType
{
public:
- DCPContentType (std::string, libdcp::ContentKind);
+ DCPContentType (std::string, libdcp::ContentKind, std::string);
/** @return user-visible `pretty' name */
std::string pretty_name () const {
return _libdcp_kind;
}
+ std::string dci_name () const {
+ return _dci_name;
+ }
+
static DCPContentType const * from_pretty_name (std::string);
static DCPContentType const * from_index (int);
static int as_index (DCPContentType const *);
private:
std::string _pretty_name;
libdcp::ContentKind _libdcp_kind;
+ std::string _dci_name;
/** All available DCP content types */
static std::vector<DCPContentType const *> _dcp_content_types;
#include <iomanip>
#include <sstream>
#include <boost/filesystem.hpp>
+#include <boost/date_time.hpp>
#include "film_state.h"
#include "scaler.h"
#include "filter.h"
return length;
}
-
+string
+FilmState::dci_name () const
+{
+ stringstream d;
+ d << dci_name_prefix << "_";
+
+ if (dcp_content_type) {
+ d << dcp_content_type->dci_name() << "_";
+ }
+
+ if (format) {
+ d << format->dci_name() << "_";
+ }
+
+ if (!audio_language.empty ()) {
+ d << audio_language;
+ if (!subtitle_language.empty ()) {
+ d << "-" << subtitle_language;
+ }
+ d << "_";
+ }
+
+ if (!territory.empty ()) {
+ d << territory;
+ if (!rating.empty ()) {
+ d << "-" << rating;
+ }
+ d << "_";
+ }
+
+ switch (audio_channels) {
+ case 1:
+ d << "1_";
+ break;
+ case 2:
+ d << "2_";
+ break;
+ case 6:
+ d << "51_";
+ break;
+ }
+
+ d << "2K_";
+
+ if (!studio.empty ()) {
+ d << studio << "_";
+ }
+
+ gregorian::date today = gregorian::day_clock::local_day ();
+ d << gregorian::to_iso_extended_string (today) << "_";
+
+ if (!facility.empty ()) {
+ d << facility << "_";
+ }
+
+ if (!package_type.empty ()) {
+ d << package_type;
+ }
+
+ return d.str ();
+}
void read_metadata (std::string, std::string);
Size cropped_size (Size) const;
-
int dcp_length () const;
+ std::string dci_name () const;
/** Complete path to directory containing the film metadata;
must not be relative.
int subtitle_offset;
float subtitle_scale;
+ /* DCI naming stuff */
+ std::string dci_name_prefix;
+ std::string audio_language;
+ std::string subtitle_language;
+ std::string territory;
+ std::string rating;
+ std::string studio;
+ std::string facility;
+ std::string package_type;
+
/* Data which is cached to speed things up */
/** Vector of frame indices for each of our `thumbnails' */
void
Format::setup_formats ()
{
- _formats.push_back (new FixedFormat (119, Size (1285, 1080), "119", "1.19"));
- _formats.push_back (new FixedFormat (133, Size (1436, 1080), "133", "1.33"));
- _formats.push_back (new FixedFormat (138, Size (1485, 1080), "138", "1.375"));
- _formats.push_back (new FixedFormat (133, Size (1998, 1080), "133-in-flat", "4:3 within Flat"));
- _formats.push_back (new FixedFormat (137, Size (1480, 1080), "137", "Academy"));
- _formats.push_back (new FixedFormat (166, Size (1793, 1080), "166", "1.66"));
- _formats.push_back (new FixedFormat (166, Size (1998, 1080), "166-in-flat", "1.66 within Flat"));
- _formats.push_back (new FixedFormat (178, Size (1998, 1080), "178-in-flat", "16:9 within Flat"));
- _formats.push_back (new FixedFormat (185, Size (1998, 1080), "185", "Flat"));
- _formats.push_back (new FixedFormat (239, Size (2048, 858), "239", "Scope"));
- _formats.push_back (new VariableFormat (Size (1998, 1080), "var-185", "Flat"));
- _formats.push_back (new VariableFormat (Size (2048, 858), "var-239", "Scope"));
+ _formats.push_back (new FixedFormat (119, Size (1285, 1080), "119", "1.19", "F"));
+ _formats.push_back (new FixedFormat (133, Size (1436, 1080), "133", "1.33", "F"));
+ _formats.push_back (new FixedFormat (138, Size (1485, 1080), "138", "1.375", "F"));
+ _formats.push_back (new FixedFormat (133, Size (1998, 1080), "133-in-flat", "4:3 within Flat", "F"));
+ _formats.push_back (new FixedFormat (137, Size (1480, 1080), "137", "Academy", "F"));
+ _formats.push_back (new FixedFormat (166, Size (1793, 1080), "166", "1.66", "F"));
+ _formats.push_back (new FixedFormat (166, Size (1998, 1080), "166-in-flat", "1.66 within Flat", "F"));
+ _formats.push_back (new FixedFormat (178, Size (1998, 1080), "178-in-flat", "16:9 within Flat", "F"));
+ _formats.push_back (new FixedFormat (185, Size (1998, 1080), "185", "Flat", "F"));
+ _formats.push_back (new FixedFormat (239, Size (2048, 858), "239", "Scope", "S"));
+ _formats.push_back (new VariableFormat (Size (1998, 1080), "var-185", "Flat", "F"));
+ _formats.push_back (new VariableFormat (Size (2048, 858), "var-239", "Scope", "S"));
}
/** @param n Nickname.
* @param id ID (e.g. 185)
* @param n Nick name (e.g. Flat)
*/
-FixedFormat::FixedFormat (int r, Size dcp, string id, string n)
- : Format (dcp, id, n)
+FixedFormat::FixedFormat (int r, Size dcp, string id, string n, string d)
+ : Format (dcp, id, n, d)
, _ratio (r)
{
return p;
}
-VariableFormat::VariableFormat (Size dcp, string id, string n)
- : Format (dcp, id, n)
+VariableFormat::VariableFormat (Size dcp, string id, string n, string d)
+ : Format (dcp, id, n, d)
{
}
class Format
{
public:
- Format (Size dcp, std::string id, std::string n)
+ Format (Size dcp, std::string id, std::string n, std::string d)
: _dcp_size (dcp)
, _id (id)
, _nickname (n)
+ , _dci_name (d)
{}
/** @return the aspect ratio multiplied by 100
return _nickname;
}
+ std::string dci_name () const {
+ return _dci_name;
+ }
+
std::string as_metadata () const;
static Format const * from_nickname (std::string n);
std::string _id;
/** nickname (e.g. Flat, Scope) */
std::string _nickname;
+ std::string _dci_name;
private:
/** all available formats */
class FixedFormat : public Format
{
public:
- FixedFormat (int, Size, std::string, std::string);
+ FixedFormat (int, Size, std::string, std::string, std::string);
int ratio_as_integer (Film const *) const {
return _ratio;
class VariableFormat : public Format
{
public:
- VariableFormat (Size, std::string, std::string);
+ VariableFormat (Size, std::string, std::string, std::string);
int ratio_as_integer (Film const * f) const;
float ratio_as_float (Film const * f) const;
#include <iostream>
#include <sys/time.h>
#include <boost/algorithm/string.hpp>
+#include <boost/bind.hpp>
#include <openjpeg.h>
extern "C" {
#include <libavcodec/avcodec.h>
{
assert (scaler);
- shared_ptr<Image> scaled (new SimpleImage (pixel_format(), out_size));
+ shared_ptr<Image> scaled (new AlignedImage (pixel_format(), out_size));
struct SwsContext* scale_context = sws_getContext (
size().width, size().height, pixel_format(),
Size content_size = out_size;
content_size.width -= (padding * 2);
- shared_ptr<Image> rgb (new SimpleImage (PIX_FMT_RGB24, content_size));
+ shared_ptr<Image> rgb (new AlignedImage (PIX_FMT_RGB24, content_size));
struct SwsContext* scale_context = sws_getContext (
size().width, size().height, pixel_format(),
scheme of things.
*/
if (padding > 0) {
- shared_ptr<Image> padded_rgb (new SimpleImage (PIX_FMT_RGB24, out_size));
+ shared_ptr<Image> padded_rgb (new AlignedImage (PIX_FMT_RGB24, out_size));
padded_rgb->make_black ();
/* XXX: we are cheating a bit here; we know the frame is RGB so we can
shared_ptr<Image>
Image::post_process (string pp) const
{
- shared_ptr<Image> out (new SimpleImage (PIX_FMT_YUV420P, size ()));
+ shared_ptr<Image> out (new AlignedImage (PIX_FMT_YUV420P, size ()));
pp_mode* mode = pp_get_mode_by_name_and_quality (pp.c_str (), PP_QUALITY_MAX);
pp_context* context = pp_get_context (size().width, size().height, PP_FORMAT_420 | PP_CPU_CAPS_MMX2);
* @param p Pixel format.
* @param s Size in pixels.
*/
-SimpleImage::SimpleImage (PixelFormat p, Size s)
+SimpleImage::SimpleImage (PixelFormat p, Size s, function<int (int)> rounder)
: Image (p)
, _size (s)
{
_data = (uint8_t **) av_malloc (4 * sizeof (uint8_t *));
_data[0] = _data[1] = _data[2] = _data[3] = 0;
+
_line_size = (int *) av_malloc (4);
_line_size[0] = _line_size[1] = _line_size[2] = _line_size[3] = 0;
+
_stride = (int *) av_malloc (4);
_stride[0] = _stride[1] = _stride[2] = _stride[3] = 0;
}
for (int i = 0; i < components(); ++i) {
- _stride[i] = round_up (_line_size[i], 32);
+ _stride[i] = rounder (_line_size[i]);
_data[i] = (uint8_t *) av_malloc (_stride[i] * lines (i));
}
}
return _size;
}
+AlignedImage::AlignedImage (PixelFormat f, Size s)
+ : SimpleImage (f, s, boost::bind (round_up, _1, 32))
+{
+
+}
+
+CompactImage::CompactImage (PixelFormat f, Size s)
+ : SimpleImage (f, s, boost::bind (round_up, _1, 1))
+{
+
+}
+
+CompactImage::CompactImage (shared_ptr<Image> im)
+ : SimpleImage (im->pixel_format(), im->size(), boost::bind (round_up, _1, 1))
+{
+ assert (components() == im->components());
+
+ for (int c = 0; c < components(); ++c) {
+
+ assert (line_size()[c] == im->line_size()[c]);
+
+ uint8_t* t = data()[c];
+ uint8_t* o = im->data()[c];
+
+ for (int y = 0; y < lines(c); ++y) {
+ memcpy (t, o, line_size()[c]);
+ t += stride()[c];
+ o += im->stride()[c];
+ }
+ }
+}
FilterBufferImage::FilterBufferImage (PixelFormat p, AVFilterBufferRef* b)
: Image (p)
#include <string>
#include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavfilter/avfilter.h>
class SimpleImage : public Image
{
public:
- SimpleImage (PixelFormat, Size);
+ SimpleImage (PixelFormat, Size, boost::function<int (int)> rounder);
~SimpleImage ();
uint8_t ** data () const;
Size size () const;
private:
+
Size _size; ///< size in pixels
uint8_t** _data; ///< array of pointers to components
int* _line_size; ///< array of sizes of the data in each line, in pixels (without any alignment padding bytes)
int* _stride; ///< array of strides for each line (including any alignment padding bytes)
+};
+
+class AlignedImage : public SimpleImage
+{
+public:
+ AlignedImage (PixelFormat, Size);
+};
+class CompactImage : public SimpleImage
+{
+public:
+ CompactImage (PixelFormat, Size);
+ CompactImage (boost::shared_ptr<Image>);
};
/** @class RGBFrameImage
ImageMagickEncoder::process_video (shared_ptr<Image> image, int frame, shared_ptr<Subtitle> sub)
{
shared_ptr<Image> scaled = image->scale_and_convert_to_rgb (_opt->out_size, _opt->padding, _fs->scaler);
+ shared_ptr<Image> compact (new CompactImage (scaled));
string tmp_file = _opt->frame_out_path (frame, true);
- Magick::Image thumb (_opt->out_size.width, _opt->out_size.height, "RGB", MagickCore::CharPixel, scaled->data()[0]);
+ Magick::Image thumb (compact->size().width, compact->size().height, "RGB", MagickCore::CharPixel, compact->data()[0]);
thumb.magick ("PNG");
thumb.write (tmp_file);
filesystem::rename (tmp_file, _opt->frame_out_path (frame, false));
new_size.width *= x_scale;
new_size.height *= y_scale;
shared_ptr<Image> scaled = (*i)->image()->scale (new_size, _fs->scaler);
+ shared_ptr<Image> compact (new CompactImage (scaled));
string tmp_sub_file = _opt->frame_out_path (frame, true, ext.str ());
- Magick::Image sub_thumb (scaled->size().width, scaled->size().height, "RGBA", MagickCore::CharPixel, scaled->data()[0]);
+ Magick::Image sub_thumb (compact->size().width, compact->size().height, "RGBA", MagickCore::CharPixel, compact->data()[0]);
sub_thumb.magick ("PNG");
sub_thumb.write (tmp_sub_file);
filesystem::rename (tmp_sub_file, _opt->frame_out_path (frame, false, ext.str ()));
post_process = "";
}
- shared_ptr<Image> image (new SimpleImage (pixel_format, in_size));
+ shared_ptr<Image> image (new AlignedImage (pixel_format, in_size));
for (int i = 0; i < image->components(); ++i) {
socket->read_definite_and_consume (image->data()[i], image->stride()[i] * image->lines(i), 30);
SubtitleImage::SubtitleImage (AVSubtitleRect const * rect)
: _position (rect->x, rect->y)
- , _image (new SimpleImage (PIX_FMT_RGBA, Size (rect->w, rect->h)))
+ , _image (new AlignedImage (PIX_FMT_RGBA, Size (rect->w, rect->h)))
{
if (rect->type != SUBTITLE_BITMAP) {
throw DecodeError ("non-bitmap subtitles not yet supported");
for (int y = 0; y < rect->h; ++y) {
uint8_t* sub_line_p = sub_p;
+ uint32_t* out_line_p = out_p;
for (int x = 0; x < rect->w; ++x) {
- *out_p++ = palette[*sub_line_p++];
+ *out_line_p++ = palette[*sub_line_p++];
}
sub_p += rect->pict.linesize[0];
+ out_p += _image->stride()[0] / sizeof (uint32_t);
}
}
a += (t - 1);
return a - (a % t);
}
+
obj = bld(features = 'cxx cxxshlib')
obj.name = 'libdvdomatic'
obj.export_includes = ['.']
- obj.uselib = 'AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE SWRESAMPLE SNDFILE BOOST_FILESYSTEM BOOST_THREAD OPENJPEG POSTPROC TIFF SIGC++ MAGICK SSH DCP GLIB'
+ obj.uselib = 'AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE SWRESAMPLE SNDFILE BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME OPENJPEG POSTPROC TIFF SIGC++ MAGICK SSH DCP GLIB'
if bld.env.TARGET_WINDOWS:
obj.uselib += ' WINSOCK2'
obj.source = """
_name = new wxTextCtrl (this, wxID_ANY);
_sizer->Add (_name, 1, wxEXPAND);
+ _use_dci_name = new wxCheckBox (this, wxID_ANY, wxT ("Use DCI name"));
+ _sizer->Add (_use_dci_name, 1, wxEXPAND);
+ _edit_dci_button = new wxButton (this, wxID_ANY, wxT ("Edit..."));
+ _sizer->Add (_edit_dci_button, 0);
+
add_label_to_sizer (_sizer, this, "Content");
_content = new wxFilePickerCtrl (this, wxID_ANY, wxT (""), wxT ("Select Content File"), wxT("*.*"));
_sizer->Add (_content, 1, wxEXPAND);
#include <wx/wx.h>
#include <wx/spinctrl.h>
#include <wx/filepicker.h>
+#include <wx/collpane.h>
#include "lib/trim_action.h"
#include "lib/film.h"
Film* _film;
/** The Film's name */
wxTextCtrl* _name;
+ wxCheckBox* _use_dci_name;
+ wxButton* _edit_dci_button;
/** The Film's format */
wxComboBox* _format;
/** The Film's content file */
BOOST_AUTO_TEST_CASE (client_server_test)
{
- shared_ptr<Image> image (new SimpleImage (PIX_FMT_RGB24, Size (1998, 1080)));
+ shared_ptr<Image> image (new CompactImage (PIX_FMT_RGB24, Size (1998, 1080)));
uint8_t* p = image->data()[0];
lib = ['boost_filesystem%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
uselib_store = 'BOOST_FILESYSTEM')
+ conf.check_cxx(fragment = """
+ #include <boost/date_time.hpp>\n
+ int main() { boost::gregorian::day_clock::local_day(); }\n
+ """, msg = 'Checking for boost datetime library',
+ libpath = '/usr/local/lib',
+ lib = ['boost_date_time%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
+ uselib_store = 'BOOST_DATETIME')
+
conf.check_cc(fragment = """
#include <glib.h>
int main() { g_format_size (1); }