/*! @mainpage libdcp libdcp is a small library to create and read Digital Cinema Packages (DCPs) from JPEG2000 and WAV files. 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 -- Alternatively libdcp can be used to read existing DCPs and examine their content. You might do @code #include 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 = dcp.reels.front (); boost::shared_ptr p = reel->main_picture (); boost::shared_ptr mp = boost::dynamic_pointer_cast (p); boost::shared_ptr 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 dynamic_pointer_cast from libdcp::PictureAsset to libdcp::MonoPictureAsset, 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 s = reel->main_sound (); cout << "Sound has " << s->channels() << " channels at " << s->sampling_rate() << "Hz\n"; boost::shared_ptr 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 s = dcp.subtitle_asset (); list > 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. */