{
/* Create a directory to put the DCP in */
boost::filesystem::create_directory ("DCP");
-
+
/* Make a picture asset. This is a file which combines JPEG2000 files together to make
up the video of the DCP. First, create the object, specifying a frame rate of 24 frames
per second.
When creating the object we specify the sampling rate (48kHz) and the number of channels (2).
*/
boost::shared_ptr<dcp::SoundAsset> sound_asset (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 2));
- boost::shared_ptr<dcp::SoundAssetWriter> sound_writer = sound_asset->start_write ("DCP/sound.mxf", dcp::SMPTE);
+ boost::shared_ptr<dcp::SoundAssetWriter> sound_writer = sound_asset->start_write ("DCP/sound.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51);
/* Write some sine waves */
float* audio[2];
dcp::DCP dcp ("DCP");
dcp.add (cpl);
dcp.write_xml (dcp::SMPTE);
-
+
return 0;
}
uint16_t const * p = reinterpret_cast<uint16_t const *> (xyz_16 + y * stride);
for (int x = 0; x < size.width; ++x) {
/* Truncate 16-bit to 12-bit */
+ cout << *p << " ";
xyz_12->data(0)[jn] = *p++ >> 4;
+ cout << xyz_12->data(0)[jn] << "\n";
xyz_12->data(1)[jn] = *p++ >> 4;
xyz_12->data(2)[jn] = *p++ >> 4;
++jn;
}
shared_ptr<SoundAssetWriter>
-SoundAsset::start_write (boost::filesystem::path file, Standard standard)
+SoundAsset::start_write (boost::filesystem::path file, Standard standard, ChannelAssignment assign)
{
/* XXX: can't we use a shared_ptr here? */
- return shared_ptr<SoundAssetWriter> (new SoundAssetWriter (this, file, standard));
+ return shared_ptr<SoundAssetWriter> (new SoundAssetWriter (this, file, standard, assign));
}
shared_ptr<SoundAssetReader>
explicit SoundAsset (boost::filesystem::path file);
SoundAsset (Fraction edit_rate, int sampling_rate, int channels);
- boost::shared_ptr<SoundAssetWriter> start_write (boost::filesystem::path file, Standard standard);
+ boost::shared_ptr<SoundAssetWriter> start_write (boost::filesystem::path file, Standard standard, ChannelAssignment assign);
boost::shared_ptr<SoundAssetReader> start_read () const;
bool equals (
ASDCP::PCM::AudioDescriptor audio_desc;
};
-SoundAssetWriter::SoundAssetWriter (SoundAsset* asset, boost::filesystem::path file, Standard standard)
+SoundAssetWriter::SoundAssetWriter (SoundAsset* asset, boost::filesystem::path file, Standard standard, ChannelAssignment assign)
: AssetWriter (asset, file, standard)
, _state (new SoundAssetWriter::ASDCPState)
, _sound_asset (asset)
_state->audio_desc.BlockAlign = 3 * _sound_asset->channels();
_state->audio_desc.AvgBps = _sound_asset->sampling_rate() * _state->audio_desc.BlockAlign;
_state->audio_desc.LinkedTrackID = 0;
- _state->audio_desc.ChannelFormat = ASDCP::PCM::CF_NONE;
+ if (standard == INTEROP) {
+ _state->audio_desc.ChannelFormat = ASDCP::PCM::CF_NONE;
+ } else {
+ switch (assign) {
+ case CHANNEL_ASSIGNMENT_51:
+ _state->audio_desc.ChannelFormat = ASDCP::PCM::CF_CFG_1;
+ break;
+ case CHANNEL_ASSIGNMENT_61:
+ _state->audio_desc.ChannelFormat = ASDCP::PCM::CF_CFG_2;
+ break;
+ case CHANNEL_ASSIGNMENT_71:
+ _state->audio_desc.ChannelFormat = ASDCP::PCM::CF_CFG_3;
+ break;
+ case CHANNEL_ASSIGNMENT_WTF:
+ _state->audio_desc.ChannelFormat = ASDCP::PCM::CF_CFG_4;
+ break;
+ case CHANNEL_ASSIGNMENT_71_DS:
+ _state->audio_desc.ChannelFormat = ASDCP::PCM::CF_CFG_5;
+ break;
+ }
+ }
_state->frame_buffer.Capacity (ASDCP::PCM::CalcFrameBufferSize (_state->audio_desc));
_state->frame_buffer.Size (ASDCP::PCM::CalcFrameBufferSize (_state->audio_desc));
private:
friend class SoundAsset;
- SoundAssetWriter (SoundAsset *, boost::filesystem::path, Standard standard);
+ SoundAssetWriter (SoundAsset *, boost::filesystem::path, Standard standard, ChannelAssignment);
void write_current_frame ();
DCI_SPECIFIC
};
+/** Possible channel assignments for SMPTE DCP audio */
+enum ChannelAssignment {
+ /** L/R/C/Lfe/Ls/Rs/HI/VI */
+ CHANNEL_ASSIGNMENT_51,
+ /** L/R/C/Lfe/Ls/Rs/Cs/unused/HI/VI */
+ CHANNEL_ASSIGNMENT_61,
+ /** L/R/C/Lfe/Ls/Rs/Lc/Rc/HI/VI */
+ CHANNEL_ASSIGNMENT_71,
+ /** "Wild track format"; no assignment */
+ CHANNEL_ASSIGNMENT_WTF,
+ /** L/R/C/Lfe/Ls/Rs/Lrs/Rrs/HI/VI */
+ CHANNEL_ASSIGNMENT_71_DS
+};
+
/** @class Colour
* @brief An RGB colour.
*/
shared_ptr<dcp::SoundAsset> ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1));
ms->set_metadata (mxf_meta);
- shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test1/audio.mxf", dcp::SMPTE);
+ shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test1/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51);
SF_INFO info;
info.format = 0;
shared_ptr<dcp::SoundAsset> ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1));
ms->set_metadata (mxf_meta);
- shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test2/audio.mxf", dcp::SMPTE);
+ shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test2/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51);
SF_INFO info;
info.format = 0;
shared_ptr<dcp::SoundAsset> ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1));
ms->set_metadata (mxf_meta);
- shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test5/audio.mxf", dcp::SMPTE);
+ shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test5/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51);
SF_INFO info;
info.format = 0;
shared_ptr<dcp::SoundAsset> ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1));
ms->set_metadata (mxf_metadata);
ms->set_key (key);
- shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/encryption_test/audio.mxf", dcp::SMPTE);
+ shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/encryption_test/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51);
SF_INFO info;
info.format = 0;