From 8095eaa320551b6795d0368c0ad0c227a3167caa Mon Sep 17 00:00:00 2001 From: jhurst Date: Tue, 20 Dec 2005 01:55:40 +0000 Subject: wheee! --- src/h__Writer.cpp | 458 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100755 src/h__Writer.cpp (limited to 'src/h__Writer.cpp') diff --git a/src/h__Writer.cpp b/src/h__Writer.cpp new file mode 100755 index 0000000..411f63e --- /dev/null +++ b/src/h__Writer.cpp @@ -0,0 +1,458 @@ +/* +Copyright (c) 2004-2005, John Hurst +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/*! \file h__Writer.cpp + \version $Id$ + \brief MXF file writer base class +*/ + +#include "AS_DCP_internal.h" +#include "MemIO.h" +#include "Timecode.h" +#include + +using namespace mxflib; +using namespace ASDCP; + + +ASDCP::h__Writer::h__Writer() : m_FramesWritten(0), m_StreamOffset(0) +{ + init_mxf_types(); +} + +ASDCP::h__Writer::~h__Writer() +{ +} + +// standard method of writing the header of a new MXF file +Result_t +ASDCP::h__Writer::WriteMXFHeader(EssenceType_t EssenceType, ASDCP::Rational& EditRate, + ui32_t TCFrameRate, ui32_t BytesPerEditUnit) +{ + // write the stream metadata + m_Metadata = new Metadata(); + assert(m_Metadata); + assert(m_Metadata->m_Object); + + if ( m_Info.EncryptedEssence ) + { + UL DMSUL(CryptoFrameworkUL_Data); + m_Metadata->AddDMScheme(DMSUL); + } + + // Set the OP label + // If we are writing OP-Atom we write the header as OP1a initially as another process + // may try to read the file before it is complete and then it will NOT be a valid OP-Atom file + m_Metadata->SetOP(OP1aUL); + + // Build the Material Package + // DRAGONS: We should really try and determine the UMID type rather than cop-out! + UMID PackageUMID; + PackageUMID.MakeUMID(0x0d); // mixed type + +#if ASDCP_USE_MXFLIB + mxflib::Rational EditRate_; + EditRate_.Numerator = EditRate.Numerator; + EditRate_.Denominator = EditRate.Denominator; +#else +#define EditRate_ EditRate +#endif + + m_MaterialPackage = m_Metadata->AddMaterialPackage("AS-DCP Material Package", PackageUMID); + m_Metadata->SetPrimaryPackage(m_MaterialPackage); // This will be overwritten for OP-Atom + + TrackPtr MPTimecodeTrack = m_MaterialPackage->AddTimecodeTrack(EditRate_); + m_MPTimecode = MPTimecodeTrack->AddTimecodeComponent(TCFrameRate, 0, 0); + + TrackPtr FPTimecodeTrack = 0; + mxflib::UUID assetUUID(m_Info.AssetUUID); + + UMID EssenceUMID; + + switch ( EssenceType ) + { + case ESS_MPEG2_VES: + PackageUMID.MakeUMID(0x0f, assetUUID); + m_FilePackage = m_Metadata->AddFilePackage(1, MPEG_PACKAGE_LABEL, PackageUMID); + m_MPTrack = m_MaterialPackage->AddPictureTrack(EditRate_); + m_FPTrack = m_FilePackage->AddPictureTrack(0, EditRate_); + break; + + case ESS_JPEG_2000: + PackageUMID.MakeUMID(0x0f, assetUUID); + m_FilePackage = m_Metadata->AddFilePackage(1, JP2K_PACKAGE_LABEL, PackageUMID); + m_MPTrack = m_MaterialPackage->AddPictureTrack(EditRate_); + m_FPTrack = m_FilePackage->AddPictureTrack(0, EditRate_); + break; + + case ESS_PCM_24b_48k: + PackageUMID.MakeUMID(0x0f, assetUUID); + m_FilePackage = m_Metadata->AddFilePackage(1, PCM_PACKAGE_LABEL, PackageUMID); + m_MPTrack = m_MaterialPackage->AddSoundTrack(EditRate_); + m_FPTrack = m_FilePackage->AddSoundTrack(0, EditRate_); + break; + + default: return RESULT_RAW_ESS; + } + + // Add an essence element + FPTimecodeTrack = m_FilePackage->AddTimecodeTrack(EditRate_); + m_FPTimecode = FPTimecodeTrack->AddTimecodeComponent(TCFrameRate, 0/* NDF */, + tc_to_frames(TCFrameRate, 1, 0, 0, 0) ); + + // Add a single Component to this Track of the Material Package + m_MPClip = m_MPTrack->AddSourceClip(); + + // Add a single Component to this Track of the File Package + m_FPClip = m_FPTrack->AddSourceClip(); + const byte_t* SourceEssenceContainerLabel = 0; + + // Frame wrapping + if ( m_Info.EncryptedEssence ) + { + switch ( EssenceType ) + { + case ESS_MPEG2_VES: + SourceEssenceContainerLabel = WrappingUL_Data_MPEG2_VES; + break; + + case ESS_JPEG_2000: + SourceEssenceContainerLabel = WrappingUL_Data_JPEG_2000; + break; + + case ESS_PCM_24b_48k: + SourceEssenceContainerLabel = WrappingUL_Data_PCM_24b_48k; + break; + + default: + return RESULT_RAW_ESS; + } + } + + mem_ptr