Most of the hard work is done by a (slightly patched) version of asdcplib (http://www.cinecert.com/asdcplib/)
which is included in the source distribution for libdcp.
-See libdcp::DCP for an example of libdcp's use.
-
libdcp is distributed under the GNU GPL.
+Typical use might be:
+@code
+#include <libdcp/dcp.h>
+using namespace std;
+
+libdcp::DCP dcp ("My Film DCP", "My Film", libdcp::DCP::FEATURE, 24, 50000);
+
+vector<string> j2k_files;
+j2k_files.push_back ("1.j2c");
+...
+j2k_files.push_back ("50000.j2c");
+
+// These images are 1998x1080 pixels (DCI Flat)
+dcp.add_picture_asset (j2k_files, 1998, 1080);
+
+vector<string> wav_files;
+wav_files.push_back ("L.wav");
+wav_files.push_back ("R.wav");
+wav_files.push_back ("C.wav");
+wav_files.push_back ("Lfe.wav");
+wav_files.push_back ("Ls.wav");
+wav_files.push_back ("Rs.wav");
+dcp.add_sound_asset (wav_files);
+
+dcp.write_xml ();
+
+@endcode
+
+This will create a DCP at 24 frames per second with 50000 frames, writing
+data to a directory "My Film DCP", naming the DCP "My Film" and marking
+as a Feature. We then add the picture and sound files (which creates
+MXF files inside the DCP directory) and then write the required XML files.
+
+If you want to report progress for long jobs (add_picture_asset() can
+take a long time, in particular, as it must do a lot of disk I/O for
+large DCPs), connect to the libdcp::DCP::Progress signal and report its parameter
+to the user (it will range between 0 for 0% and 1 for 100%).
+
+If you can generate content paths algorithmically, you may prefer to do something
+like this:
+
+@code
+
+string
+j2k_path (int frame)
+{
+ stringstream s;
+ s << "my_j2ks/" << frame << ".j2c"
+ return s.str ();
+}
+
+string
+wav_path (libdcp::Channel channel)
+{
+ switch (channel) {
+ case LEFT:
+ return "left.wav";
+ case RIGHT:
+ return "right.wav";
+ }
+
+ return "";
+}
+
+...
+
+// Our images are 1998x1080 (DCI Flat)
+dcp.add_picture_asset (sigc::ptr_fun (&j2k_path), 1998, 1080);
+// We have two sound channels
+dcp.add_sound_asset (sigc::ptr_fun (&wav_path), 2);
+
+...
+
+@endcode
+
*/
*/
+/** @file src/dcp.cc
+ * @brief A class to create a DCP.
+ */
+
#include <sstream>
#include <fstream>
#include <iomanip>
*/
+/** @file src/dcp.h
+ * @brief A class to create a DCP.
+ */
+
#ifndef LIBDCP_DCP_H
#define LIBDCP_DCP_H
/** @class DCP dcp.h libdcp/dcp.h
* @brief A class to create a DCP.
- *
- * Typical use might be:
- * @code
- * #include <libdcp/dcp.h>
- * using namespace std;
- *
- * libdcp::DCP dcp ("My Film DCP", "My Film", libdcp::DCP::FEATURE, 24, 50000);
- *
- * vector<string> j2k_files;
- * j2k_files.push_back ("1.j2c");
- * ...
- * j2k_files.push_back ("50000.j2c");
- *
- * // These images are 1998x1080 pixels (DCI Flat)
- * dcp.add_picture_asset (j2k_files, 1998, 1080);
- *
- * vector<string> wav_files;
- * wav_files.push_back ("L.wav");
- * wav_files.push_back ("R.wav");
- * wav_files.push_back ("C.wav");
- * wav_files.push_back ("Lfe.wav");
- * wav_files.push_back ("Ls.wav");
- * wav_files.push_back ("Rs.wav");
- * dcp.add_sound_asset (wav_files);
- *
- * dcp.write_xml ();
- *
- * @endcode
- *
- * This will create a DCP at 24 frames per second with 50000 frames, writing
- * data to a directory "My Film DCP", naming the DCP "My Film" and marking
- * as a Feature. We then add the picture and sound files (which creates
- * MXF files inside the DCP directory) and then write the required XML files.
- *
- * If you want to report progress for long jobs (add_picture_asset() can
- * take a long time, in particular, as it must do a lot of disk I/O for
- * large DCPs), connect to the libdcp::DCP::Progress signal and report its parameter
- * to the user (it will range between 0 for 0% and 1 for 100%).
*/
-
+
class DCP
{
public:
namespace libdcp
{
+/** @brief An exception related to a file */
class FileError : public std::exception
{
public:
~FileError () throw () {}
+ /** @return error message */
char const * what () const throw () {
return _message.c_str ();
}
+ /** @return filename of file that was involved */
std::string filename () const {
return _filename;
}
private:
+ /** error message */
std::string _message;
+ /** filename of file that was involved */
std::string _filename;
};
+
+/** @brief A miscellaneous exception */
class MiscError : public std::exception
{
public:
MiscError (std::string const & message) : _message (message) {}
~MiscError () throw () {}
+ /** @return error message */
char const * what () const throw () {
return _message.c_str ();
}
private:
+ /** error message */
std::string _message;
};
*/
+/** @file src/metadata.cc
+ * @brief Metadata for writing to the DCP.
+ */
+
#include "metadata.h"
using namespace std;
*/
+/** @file src/metadata.h
+ * @brief Metadata for writing to the DCP.
+ */
+
#include <string>
namespace libdcp
{
-/** A class to hold various metadata that will be written
- * to the DCP. The values are initialised, and can be modified
- * if desired.
+/** @brief A class to hold various metadata that will be written
+ * to the DCP.
+ *
+ * The values are initialised, and can be modified if desired.
*/
class Metadata
{
*/
-#ifndef LIBDCP_CHANNEL_H
-#define LIBDCP_CHANNEL_H
+/** @file src/types.h
+ * @brief Miscellaneous types.
+ */
+
+#ifndef LIBDCP_TYPES_H
+#define LIBDCP_TYPES_H
namespace libdcp
{
*/
+/** @file src/util.h
+ * @brief Utility methods.
+ */
+
#include <string>
#include <sigc++/sigc++.h>