ffmpeg_options = {}
return (('ffmpeg-cdist', 'aab2fb1', ffmpeg_options),
- ('libdcp', 'f028e8a'),
+ ('libdcp', 'a641fdc'),
('libsub', '3d8c3bc'))
def configure_options(target):
#include <dcp/cpl.h>
#include <dcp/reel.h>
#include <dcp/mono_picture_asset.h>
+#include <dcp/mono_picture_asset_reader.h>
#include <dcp/stereo_picture_asset.h>
+#include <dcp/stereo_picture_asset_reader.h>
#include <dcp/reel_picture_asset.h>
#include <dcp/reel_sound_asset.h>
#include <dcp/reel_subtitle_asset.h>
#include <dcp/mono_picture_frame.h>
#include <dcp/stereo_picture_frame.h>
#include <dcp/sound_frame.h>
+#include <dcp/sound_asset_reader.h>
#include <boost/foreach.hpp>
#include <iostream>
_reel = _reels.begin ();
_offset = 0;
+ get_readers ();
}
bool
/* Frame within the (played part of the) reel that is coming up next */
int64_t const frame = _next.frames_round (vfr);
- if ((*_reel)->main_picture () && reason != PASS_REASON_SUBTITLE) {
+ if ((_mono_reader || _stereo_reader) && reason != PASS_REASON_SUBTITLE) {
shared_ptr<dcp::PictureAsset> asset = (*_reel)->main_picture()->asset ();
- shared_ptr<dcp::MonoPictureAsset> mono = dynamic_pointer_cast<dcp::MonoPictureAsset> (asset);
- shared_ptr<dcp::StereoPictureAsset> stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset);
int64_t const entry_point = (*_reel)->main_picture()->entry_point ();
- if (mono) {
- video->give (shared_ptr<ImageProxy> (new J2KImageProxy (mono->get_frame (entry_point + frame), asset->size())), _offset + frame);
+ if (_mono_reader) {
+ video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_mono_reader->get_frame (entry_point + frame), asset->size())), _offset + frame);
} else {
video->give (
- shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_LEFT)),
+ shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame (entry_point + frame), asset->size(), dcp::EYE_LEFT)),
_offset + frame
);
video->give (
- shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_RIGHT)),
+ shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame (entry_point + frame), asset->size(), dcp::EYE_RIGHT)),
_offset + frame
);
}
}
- if ((*_reel)->main_sound () && reason != PASS_REASON_SUBTITLE) {
+ if (_sound_reader && reason != PASS_REASON_SUBTITLE) {
int64_t const entry_point = (*_reel)->main_sound()->entry_point ();
- shared_ptr<const dcp::SoundFrame> sf = (*_reel)->main_sound()->asset()->get_frame (entry_point + frame);
+ shared_ptr<const dcp::SoundFrame> sf = _sound_reader->get_frame (entry_point + frame);
uint8_t const * from = sf->data ();
int const channels = _dcp_content->audio->stream()->channels ();
{
_offset += (*_reel)->main_picture()->duration();
++_reel;
+ get_readers ();
+}
+
+void
+DCPDecoder::get_readers ()
+{
+ if (_reel == _reels.end()) {
+ _mono_reader.reset ();
+ _stereo_reader.reset ();
+ _sound_reader.reset ();
+ return;
+ }
+
+ if ((*_reel)->main_picture()) {
+ shared_ptr<dcp::PictureAsset> asset = (*_reel)->main_picture()->asset ();
+ shared_ptr<dcp::MonoPictureAsset> mono = dynamic_pointer_cast<dcp::MonoPictureAsset> (asset);
+ shared_ptr<dcp::StereoPictureAsset> stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset);
+ DCPOMATIC_ASSERT (mono || stereo);
+ if (mono) {
+ _mono_reader = mono->start_read ();
+ _stereo_reader.reset ();
+ } else {
+ _stereo_reader = stereo->start_read ();
+ _mono_reader.reset ();
+ }
+ } else {
+ _mono_reader.reset ();
+ _stereo_reader.reset ();
+ }
+
+ if ((*_reel)->main_sound()) {
+ _sound_reader = (*_reel)->main_sound()->asset()->start_read ();
+ } else {
+ _sound_reader.reset ();
+ }
}
void
namespace dcp {
class Reel;
+ class MonoPictureAssetReader;
+ class StereoPictureAssetReader;
+ class SoundAssetReader;
}
class DCPContent;
bool pass (PassReason, bool accurate);
void seek (ContentTime t, bool accurate);
void next_reel ();
+ void get_readers ();
std::list<ContentTimePeriod> image_subtitles_during (ContentTimePeriod, bool starting) const;
std::list<ContentTimePeriod> text_subtitles_during (ContentTimePeriod, bool starting) const;
+ boost::shared_ptr<const DCPContent> _dcp_content;
/** Time of next thing to return from pass relative to the start of _reel */
ContentTime _next;
std::list<boost::shared_ptr<dcp::Reel> > _reels;
+
std::list<boost::shared_ptr<dcp::Reel> >::iterator _reel;
/** Offset of _reel from the start of the content in frames */
int64_t _offset;
- boost::shared_ptr<const DCPContent> _dcp_content;
+ /** Reader for current mono picture asset, if applicable */
+ boost::shared_ptr<dcp::MonoPictureAssetReader> _mono_reader;
+ /** Reader for current stereo picture asset, if applicable */
+ boost::shared_ptr<dcp::StereoPictureAssetReader> _stereo_reader;
+ /** Reader for current sound asset, if applicable */
+ boost::shared_ptr<dcp::SoundAssetReader> _sound_reader;
};
#include <dcp/reel_picture_asset.h>
#include <dcp/reel_sound_asset.h>
#include <dcp/mono_picture_asset.h>
+#include <dcp/mono_picture_asset_reader.h>
#include <dcp/mono_picture_frame.h>
#include <dcp/stereo_picture_asset.h>
+#include <dcp/stereo_picture_asset_reader.h>
#include <dcp/stereo_picture_frame.h>
#include <dcp/sound_asset.h>
#include <iostream>
shared_ptr<dcp::StereoPictureAsset> stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset);
if (mono) {
- mono->get_frame(0)->xyz_image ();
+ mono->start_read()->get_frame(0)->xyz_image ();
} else {
- stereo->get_frame(0)->xyz_image (dcp::EYE_LEFT);
+ stereo->start_read()->get_frame(0)->xyz_image (dcp::EYE_LEFT);
}
}
#include "video_mxf_content.h"
#include "j2k_image_proxy.h"
#include <dcp/mono_picture_asset.h>
+#include <dcp/mono_picture_asset_reader.h>
#include <dcp/stereo_picture_asset.h>
+#include <dcp/stereo_picture_asset_reader.h>
#include <dcp/exceptions.h>
using boost::shared_ptr;
: _content (content)
{
video.reset (new VideoDecoder (this, content, log));
-}
-
-bool
-VideoMXFDecoder::pass (PassReason, bool)
-{
- double const vfr = _content->active_video_frame_rate ();
- int64_t const frame = _next.frames_round (vfr);
-
- if (frame >= _content->video->length()) {
- return true;
- }
shared_ptr<dcp::MonoPictureAsset> mono;
try {
}
if (mono) {
- video->give (shared_ptr<ImageProxy> (new J2KImageProxy (mono->get_frame(frame), mono->size())), frame);
+ _mono_reader = mono->start_read ();
+ _size = mono->size ();
+ } else {
+ _stereo_reader = stereo->start_read ();
+ _size = stereo->size ();
+ }
+}
+
+bool
+VideoMXFDecoder::pass (PassReason, bool)
+{
+ double const vfr = _content->active_video_frame_rate ();
+ int64_t const frame = _next.frames_round (vfr);
+
+ if (frame >= _content->video->length()) {
+ return true;
+ }
+
+ if (_mono_reader) {
+ video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_mono_reader->get_frame(frame), _size)), frame);
} else {
- video->give (shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame(frame), stereo->size(), dcp::EYE_LEFT)), frame);
- video->give (shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame(frame), stereo->size(), dcp::EYE_RIGHT)), frame);
+ video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame(frame), _size, dcp::EYE_LEFT)), frame);
+ video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame(frame), _size, dcp::EYE_RIGHT)), frame);
}
_next += ContentTime::from_frames (1, vfr);
#include "decoder.h"
+namespace dcp {
+ class MonoPictureAssetReader;
+ class StereoPictureAssetReader;
+}
+
class VideoMXFContent;
class Log;
boost::shared_ptr<const VideoMXFContent> _content;
/** Time of next thing to return from pass */
ContentTime _next;
+
+ boost::shared_ptr<dcp::MonoPictureAssetReader> _mono_reader;
+ boost::shared_ptr<dcp::StereoPictureAssetReader> _stereo_reader;
+ dcp::Size _size;
};
#include <dcp/cpl.h>
#include <dcp/reel.h>
#include <dcp/sound_asset.h>
+#include <dcp/sound_asset_reader.h>
#include <dcp/reel_sound_asset.h>
#include "lib/ffmpeg_content.h"
#include "lib/dcp_content_type.h"
int const delay_in_frames = delay_in_ms * 48000 / 1000;
while (n < sound_asset->asset()->intrinsic_duration()) {
- shared_ptr<const dcp::SoundFrame> sound_frame = sound_asset->asset()->get_frame (frame++);
+ shared_ptr<const dcp::SoundFrame> sound_frame = sound_asset->asset()->start_read()->get_frame (frame++);
uint8_t const * d = sound_frame->data ();
for (int i = 0; i < sound_frame->size(); i += (3 * sound_asset->asset()->channels())) {
* @brief A simple test of reading audio from an FFmpeg file.
*/
-#include <boost/test/unit_test.hpp>
-#include <dcp/cpl.h>
-#include <dcp/dcp.h>
-#include <dcp/sound_asset.h>
-#include <dcp/sound_frame.h>
-#include <dcp/reel_sound_asset.h>
-#include <dcp/reel.h>
#include "lib/ffmpeg_content.h"
#include "lib/film.h"
#include "lib/dcp_content_type.h"
#include "lib/ratio.h"
#include "lib/ffmpeg_content.h"
#include "test.h"
+#include <dcp/cpl.h>
+#include <dcp/dcp.h>
+#include <dcp/sound_asset.h>
+#include <dcp/sound_frame.h>
+#include <dcp/reel_sound_asset.h>
+#include <dcp/sound_asset_reader.h>
+#include <dcp/reel.h>
+#include <boost/test/unit_test.hpp>
using std::string;
using boost::shared_ptr;
int frame = 0;
while (n < sound_asset->asset()->intrinsic_duration()) {
- shared_ptr<const dcp::SoundFrame> sound_frame = sound_asset->asset()->get_frame (frame++);
+ shared_ptr<const dcp::SoundFrame> sound_frame = sound_asset->asset()->start_read()->get_frame (frame++);
uint8_t const * d = sound_frame->data ();
for (int i = 0; i < sound_frame->size(); i += (3 * sound_asset->asset()->channels())) {
* @brief Test the padding (with silence) of a mono source to a 6-channel DCP.
*/
-#include <boost/test/unit_test.hpp>
+#include "lib/ffmpeg_content.h"
+#include "lib/film.h"
+#include "lib/dcp_content_type.h"
+#include "lib/ratio.h"
+#include "test.h"
#include <dcp/cpl.h>
#include <dcp/dcp.h>
#include <dcp/sound_asset.h>
#include <dcp/sound_frame.h>
#include <dcp/reel.h>
#include <dcp/reel_sound_asset.h>
-#include "lib/ffmpeg_content.h"
-#include "lib/film.h"
-#include "lib/dcp_content_type.h"
-#include "lib/ratio.h"
-#include "test.h"
+#include <dcp/sound_asset_reader.h>
+#include <boost/test/unit_test.hpp>
using std::string;
using boost::lexical_cast;
int frame = 0;
while (n < sound_asset->asset()->intrinsic_duration()) {
- shared_ptr<const dcp::SoundFrame> sound_frame = sound_asset->asset()->get_frame (frame++);
+ shared_ptr<const dcp::SoundFrame> sound_frame = sound_asset->asset()->start_read()->get_frame (frame++);
uint8_t const * d = sound_frame->data ();
for (int i = 0; i < sound_frame->size(); i += (3 * sound_asset->asset()->channels())) {