summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-10-15 12:40:47 +0100
committerCarl Hetherington <cth@carlh.net>2012-10-15 12:40:47 +0100
commit43990add893eccf350f280e2dd3f947a94f3e9aa (patch)
tree2dc1dcec95446a323460140c5afa44c45cfca487 /src
parent82e38014d0cc17f3c73b593f3da9c9923484665b (diff)
Some work on DCI naming. Clean up compacted / aligned image handling somewhat.
Diffstat (limited to 'src')
-rw-r--r--src/lib/dcp_content_type.cc23
-rw-r--r--src/lib/dcp_content_type.h7
-rw-r--r--src/lib/film_state.cc63
-rw-r--r--src/lib/film_state.h12
-rw-r--r--src/lib/format.cc32
-rw-r--r--src/lib/format.h12
-rw-r--r--src/lib/image.cc46
-rw-r--r--src/lib/image.h16
-rw-r--r--src/lib/imagemagick_encoder.cc6
-rw-r--r--src/lib/server.cc2
-rw-r--r--src/lib/subtitle.cc6
-rw-r--r--src/lib/util.cc1
-rw-r--r--src/lib/util.h1
-rw-r--r--src/lib/wscript2
-rw-r--r--src/wx/film_editor.cc5
-rw-r--r--src/wx/film_editor.h3
16 files changed, 191 insertions, 46 deletions
diff --git a/src/lib/dcp_content_type.cc b/src/lib/dcp_content_type.cc
index 1f50c8dc4..aae805308 100644
--- a/src/lib/dcp_content_type.cc
+++ b/src/lib/dcp_content_type.cc
@@ -28,9 +28,10 @@ using namespace std;
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)
{
}
@@ -38,16 +39,16 @@ DCPContentType::DCPContentType (string p, libdcp::ContentKind k)
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 *
diff --git a/src/lib/dcp_content_type.h b/src/lib/dcp_content_type.h
index cb858cf5a..b703970a3 100644
--- a/src/lib/dcp_content_type.h
+++ b/src/lib/dcp_content_type.h
@@ -31,7 +31,7 @@
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 {
@@ -42,6 +42,10 @@ public:
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 *);
@@ -51,6 +55,7 @@ public:
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;
diff --git a/src/lib/film_state.cc b/src/lib/film_state.cc
index a4d88d0e0..fed506863 100644
--- a/src/lib/film_state.cc
+++ b/src/lib/film_state.cc
@@ -29,6 +29,7 @@
#include <iomanip>
#include <sstream>
#include <boost/filesystem.hpp>
+#include <boost/date_time.hpp>
#include "film_state.h"
#include "scaler.h"
#include "filter.h"
@@ -330,4 +331,64 @@ FilmState::dcp_length () const
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 ();
+}
diff --git a/src/lib/film_state.h b/src/lib/film_state.h
index d53c6a969..e58d46b0f 100644
--- a/src/lib/film_state.h
+++ b/src/lib/film_state.h
@@ -91,8 +91,8 @@ public:
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.
@@ -138,6 +138,16 @@ public:
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' */
diff --git a/src/lib/format.cc b/src/lib/format.cc
index aaf5211f9..2eb4990da 100644
--- a/src/lib/format.cc
+++ b/src/lib/format.cc
@@ -63,18 +63,18 @@ Format::as_metadata () const
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.
@@ -135,8 +135,8 @@ Format::all ()
* @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)
{
@@ -155,8 +155,8 @@ Format::dcp_padding (Film const * f) const
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)
{
}
diff --git a/src/lib/format.h b/src/lib/format.h
index fd6cdbece..35dd4fb85 100644
--- a/src/lib/format.h
+++ b/src/lib/format.h
@@ -31,10 +31,11 @@ class Film;
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
@@ -67,6 +68,10 @@ public:
return _nickname;
}
+ std::string dci_name () const {
+ return _dci_name;
+ }
+
std::string as_metadata () const;
static Format const * from_nickname (std::string n);
@@ -85,6 +90,7 @@ protected:
std::string _id;
/** nickname (e.g. Flat, Scope) */
std::string _nickname;
+ std::string _dci_name;
private:
/** all available formats */
@@ -98,7 +104,7 @@ private:
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;
@@ -119,7 +125,7 @@ private:
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;
diff --git a/src/lib/image.cc b/src/lib/image.cc
index 2c0338b53..f5aef8444 100644
--- a/src/lib/image.cc
+++ b/src/lib/image.cc
@@ -26,6 +26,7 @@
#include <iostream>
#include <sys/time.h>
#include <boost/algorithm/string.hpp>
+#include <boost/bind.hpp>
#include <openjpeg.h>
extern "C" {
#include <libavcodec/avcodec.h>
@@ -88,7 +89,7 @@ Image::scale (Size out_size, Scaler const * scaler) const
{
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(),
@@ -120,7 +121,7 @@ Image::scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scal
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(),
@@ -141,7 +142,7 @@ Image::scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scal
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
@@ -170,7 +171,7 @@ Image::scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scal
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);
@@ -249,14 +250,16 @@ Image::alpha_blend (shared_ptr<Image> other, Position position)
* @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;
@@ -277,7 +280,7 @@ SimpleImage::SimpleImage (PixelFormat p, Size s)
}
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));
}
}
@@ -318,6 +321,37 @@ SimpleImage::size () const
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)
diff --git a/src/lib/image.h b/src/lib/image.h
index 3e16d43bf..30c8519e7 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -26,6 +26,7 @@
#include <string>
#include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavfilter/avfilter.h>
@@ -107,7 +108,7 @@ private:
class SimpleImage : public Image
{
public:
- SimpleImage (PixelFormat, Size);
+ SimpleImage (PixelFormat, Size, boost::function<int (int)> rounder);
~SimpleImage ();
uint8_t ** data () const;
@@ -116,11 +117,24 @@ public:
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
diff --git a/src/lib/imagemagick_encoder.cc b/src/lib/imagemagick_encoder.cc
index b7b79ed0c..9bd8162f8 100644
--- a/src/lib/imagemagick_encoder.cc
+++ b/src/lib/imagemagick_encoder.cc
@@ -54,9 +54,10 @@ void
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));
@@ -78,9 +79,10 @@ ImageMagickEncoder::process_video (shared_ptr<Image> image, int frame, shared_pt
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 ()));
diff --git a/src/lib/server.cc b/src/lib/server.cc
index 659418b8f..b5eda2eb8 100644
--- a/src/lib/server.cc
+++ b/src/lib/server.cc
@@ -116,7 +116,7 @@ Server::process (shared_ptr<Socket> socket)
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);
diff --git a/src/lib/subtitle.cc b/src/lib/subtitle.cc
index f0d77c511..0eb40b14e 100644
--- a/src/lib/subtitle.cc
+++ b/src/lib/subtitle.cc
@@ -48,7 +48,7 @@ Subtitle::displayed_at (double t)
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");
@@ -63,10 +63,12 @@ SubtitleImage::SubtitleImage (AVSubtitleRect const * rect)
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);
}
}
diff --git a/src/lib/util.cc b/src/lib/util.cc
index c3dd13d7c..fbe77461e 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -620,3 +620,4 @@ round_up (int a, int t)
a += (t - 1);
return a - (a % t);
}
+
diff --git a/src/lib/util.h b/src/lib/util.h
index 244c01855..bd7675a8a 100644
--- a/src/lib/util.h
+++ b/src/lib/util.h
@@ -192,3 +192,4 @@ private:
};
#endif
+
diff --git a/src/lib/wscript b/src/lib/wscript
index 9539d57a1..63847224c 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -2,7 +2,7 @@ def build(bld):
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 = """
diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc
index 143b058b1..7fd2eb9fc 100644
--- a/src/wx/film_editor.cc
+++ b/src/wx/film_editor.cc
@@ -60,6 +60,11 @@ FilmEditor::FilmEditor (Film* f, wxWindow* parent)
_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);
diff --git a/src/wx/film_editor.h b/src/wx/film_editor.h
index 31d8ad39b..2a3be6d0c 100644
--- a/src/wx/film_editor.h
+++ b/src/wx/film_editor.h
@@ -24,6 +24,7 @@
#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"
@@ -83,6 +84,8 @@ private:
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 */