summaryrefslogtreecommitdiff
path: root/doc/mainpage.txt
blob: b4cb21d57cefc6c4b346c4fc85ee246587161e1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*!

@mainpage libdcp

libdcp is a library to create Digital Cinema Packages (DCPs) from JPEG2000 and WAV files, and also to
read and process existing DCPs.

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.

libdcp is distributed under the GNU GPL.

Creating DCPs
--

An example of DCP creation is given in examples/make_dcp.cc.

Reading existing DCPs
--

libdcp can be used to read existing DCPs and examine their content.  You might do

@code
#include <libdcp/dcp.h>
using namespace std;

libdcp::DCP dcp ("some-DCP-directory");
@endcode

libdcp will look at the XML files that make up the DCP and find its assets.  You can then
do things like

@code
boost::shared_ptr<Reel> reel = dcp.reels.front ();
boost::shared_ptr<libdcp::PictureAsset> p = reel->main_picture ();
boost::shared_ptr<libdcp::MonoPictureAsset> mp = boost::dynamic_pointer_cast<libdcp::MonoPictureAsset> (p);
boost::shared_ptr<libdcp::ARGBFrame> f = mp->get_frame(42)->argb_frame ();
uint8_t* data = f->data ();
int size = f->size ();
@endcode

This will extract the image of frame 42 from the first reel of the DCP and make its ARGB data available
for examination.  We have to do a <code>dynamic_pointer_cast</code> from <code>libdcp::PictureAsset</code>
to <code>libdcp::MonoPictureAsset</code>, as the picture asset may be either 2D (monoscopic) or 3D (stereoscopic).

Audio data is accessed in chunks equal in length to the duration of a video frame.  To
get the audio that accompanies frame 66, you can do

@code
boost::shared_ptr<libdcp::SoundAsset> s = reel->main_sound ();
cout << "Sound has " << s->channels() << " channels at " << s->sampling_rate() << "Hz\n";
boost::shared_ptr<libdcp::SoundFrame> f = s->get_frame(66);
uint8_t* data = f->data ();
int size = f->size ();
@endcode

The returned data are interleaved 24-bit samples, so that

@code
int left = data[0] | (data[1] << 8) | (data[2] << 16);
data += 3;
int right = data[0] | (data[1] << 8) | (data[2] << 16);
data += 3;
int centre = data[0] | (data[1] << 8) | (data[2] << 16);
data += 3;
int lfe = data[0] | (data[1] << 8) | (data[2] << 16);
data += 3;
int ls = data[0] | (data[1] << 8) | (data[2] << 16);
data += 3;
int rs = data[0] | (data[1] << 8) | (data[2] << 16);
data += 3;
@endcode

would obtain the first sample from each of the 6 channels for that frame.

Subtitles can be read using code like

@code
boost::shared_ptr<SubtitleAsset> s = dcp.subtitle_asset ();
list<boost::shared_ptr<libdcp::Text> > texts = s->subtitles_at (libdcp::Time (0, 3, 2, 5));
@endcode

This returns the subtitles that should be shown at 3 minutes, 2
seconds, 5 ticks (where 1 tick is 4ms) into the DCP.

*/