From: Carl Hetherington Date: Thu, 8 Sep 2016 22:55:37 +0000 (+0100) Subject: Add channel assignment support for SMPTE DCPs. X-Git-Tag: v1.4.0~26 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=fe83eb5293fa4027856f6ee9faec7bfc8288badf;p=libdcp.git Add channel assignment support for SMPTE DCPs. --- diff --git a/examples/make_dcp.cc b/examples/make_dcp.cc index 94eef710..f0021e6b 100644 --- a/examples/make_dcp.cc +++ b/examples/make_dcp.cc @@ -48,7 +48,7 @@ main () { /* 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. @@ -72,7 +72,7 @@ main () When creating the object we specify the sampling rate (48kHz) and the number of channels (2). */ boost::shared_ptr sound_asset (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 2)); - boost::shared_ptr sound_writer = sound_asset->start_write ("DCP/sound.mxf", dcp::SMPTE); + boost::shared_ptr sound_writer = sound_asset->start_write ("DCP/sound.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51); /* Write some sine waves */ float* audio[2]; @@ -106,6 +106,6 @@ main () dcp::DCP dcp ("DCP"); dcp.add (cpl); dcp.write_xml (dcp::SMPTE); - + return 0; } diff --git a/src/rgb_xyz.cc b/src/rgb_xyz.cc index d299340e..2eccb77a 100644 --- a/src/rgb_xyz.cc +++ b/src/rgb_xyz.cc @@ -365,7 +365,9 @@ dcp::xyz_to_xyz (uint8_t const * xyz_16, dcp::Size size, int stride) uint16_t const * p = reinterpret_cast (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; diff --git a/src/sound_asset.cc b/src/sound_asset.cc index 11fd4b2f..2202311a 100644 --- a/src/sound_asset.cc +++ b/src/sound_asset.cc @@ -192,10 +192,10 @@ SoundAsset::equals (shared_ptr other, EqualityOptions opt, NoteHand } shared_ptr -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 (new SoundAssetWriter (this, file, standard)); + return shared_ptr (new SoundAssetWriter (this, file, standard, assign)); } shared_ptr diff --git a/src/sound_asset.h b/src/sound_asset.h index a29eecd0..b3e5fec3 100644 --- a/src/sound_asset.h +++ b/src/sound_asset.h @@ -58,7 +58,7 @@ public: explicit SoundAsset (boost::filesystem::path file); SoundAsset (Fraction edit_rate, int sampling_rate, int channels); - boost::shared_ptr start_write (boost::filesystem::path file, Standard standard); + boost::shared_ptr start_write (boost::filesystem::path file, Standard standard, ChannelAssignment assign); boost::shared_ptr start_read () const; bool equals ( diff --git a/src/sound_asset_writer.cc b/src/sound_asset_writer.cc index 84ed7787..f7513d91 100644 --- a/src/sound_asset_writer.cc +++ b/src/sound_asset_writer.cc @@ -51,7 +51,7 @@ struct SoundAssetWriter::ASDCPState 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) @@ -66,7 +66,27 @@ SoundAssetWriter::SoundAssetWriter (SoundAsset* asset, boost::filesystem::path f _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)); diff --git a/src/sound_asset_writer.h b/src/sound_asset_writer.h index 02639423..b13300c2 100644 --- a/src/sound_asset_writer.h +++ b/src/sound_asset_writer.h @@ -63,7 +63,7 @@ public: private: friend class SoundAsset; - SoundAssetWriter (SoundAsset *, boost::filesystem::path, Standard standard); + SoundAssetWriter (SoundAsset *, boost::filesystem::path, Standard standard, ChannelAssignment); void write_current_frame (); diff --git a/src/types.h b/src/types.h index dd2e10a6..c3aee26b 100644 --- a/src/types.h +++ b/src/types.h @@ -232,6 +232,20 @@ enum Formulation { 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. */ diff --git a/test/dcp_test.cc b/test/dcp_test.cc index ce10ee28..bbc6ff83 100644 --- a/test/dcp_test.cc +++ b/test/dcp_test.cc @@ -75,7 +75,7 @@ BOOST_AUTO_TEST_CASE (dcp_test1) shared_ptr ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1)); ms->set_metadata (mxf_meta); - shared_ptr sound_writer = ms->start_write ("build/test/DCP/dcp_test1/audio.mxf", dcp::SMPTE); + shared_ptr sound_writer = ms->start_write ("build/test/DCP/dcp_test1/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51); SF_INFO info; info.format = 0; @@ -146,7 +146,7 @@ BOOST_AUTO_TEST_CASE (dcp_test2) shared_ptr ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1)); ms->set_metadata (mxf_meta); - shared_ptr sound_writer = ms->start_write ("build/test/DCP/dcp_test2/audio.mxf", dcp::SMPTE); + shared_ptr sound_writer = ms->start_write ("build/test/DCP/dcp_test2/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51); SF_INFO info; info.format = 0; @@ -242,7 +242,7 @@ BOOST_AUTO_TEST_CASE (dcp_test5) shared_ptr ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1)); ms->set_metadata (mxf_meta); - shared_ptr sound_writer = ms->start_write ("build/test/DCP/dcp_test5/audio.mxf", dcp::SMPTE); + shared_ptr sound_writer = ms->start_write ("build/test/DCP/dcp_test5/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51); SF_INFO info; info.format = 0; diff --git a/test/encryption_test.cc b/test/encryption_test.cc index a817d246..665169d9 100644 --- a/test/encryption_test.cc +++ b/test/encryption_test.cc @@ -91,7 +91,7 @@ BOOST_AUTO_TEST_CASE (encryption_test) shared_ptr ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1)); ms->set_metadata (mxf_metadata); ms->set_key (key); - shared_ptr sound_writer = ms->start_write ("build/test/DCP/encryption_test/audio.mxf", dcp::SMPTE); + shared_ptr sound_writer = ms->start_write ("build/test/DCP/encryption_test/audio.mxf", dcp::SMPTE, dcp::CHANNEL_ASSIGNMENT_51); SF_INFO info; info.format = 0;