static std::string JP2K_S_PACKAGE_LABEL = "File Package: SMPTE 429-10 frame wrapping of stereoscopic JPEG 2000 codestreams";
static std::string PICT_DEF_LABEL = "Picture Track";
-
-//22
-
-// 7f18 7f00 7f00 7ebc 76ea 76ea 76bc 6f4c 6f4c 6f64 5803 5803 5845 5fd2 5fd2 5f61
-
-
int s_exp_lookup[16] = { 0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,2048, 4096, 8192, 16384, 32768 };
//
~lh__Writer(){}
- Result_t OpenWrite(const char*, ui32_t HeaderSize);
+ Result_t OpenWrite(const char*, EssenceType_t type, ui32_t HeaderSize);
Result_t SetSourceStream(const PictureDescriptor&, const std::string& label,
ASDCP::Rational LocalEditRate = ASDCP::Rational(0,0));
Result_t WriteFrame(const JP2K::FrameBuffer&, bool add_index, AESEncContext*, HMACContext*);
// Open the file for writing. The file must not exist. Returns error if
// the operation cannot be completed.
ASDCP::Result_t
-lh__Writer::OpenWrite(const char* filename, ui32_t HeaderSize)
+lh__Writer::OpenWrite(const char* filename, EssenceType_t type, ui32_t HeaderSize)
{
if ( ! m_State.Test_BEGIN() )
return RESULT_STATE;
m_EssenceDescriptor = tmp_rgba;
m_EssenceSubDescriptor = new JPEG2000PictureSubDescriptor;
- m_EssenceSubDescriptorList.push_back((FileDescriptor*)m_EssenceSubDescriptor);
+ m_EssenceSubDescriptorList.push_back((InterchangeObject*)m_EssenceSubDescriptor);
GenRandomValue(m_EssenceSubDescriptor->InstanceUID);
m_EssenceDescriptor->SubDescriptors.push_back(m_EssenceSubDescriptor->InstanceUID);
+ if ( type == ASDCP::ESS_JPEG_2000_S )
+ {
+ InterchangeObject* StereoSubDesc = new StereoscopicPictureSubDescriptor;
+ m_EssenceSubDescriptorList.push_back(StereoSubDesc);
+ GenRandomValue(StereoSubDesc->InstanceUID);
+ m_EssenceDescriptor->SubDescriptors.push_back(StereoSubDesc->InstanceUID);
+ }
+
result = m_State.Goto_INIT();
}
{
m_Writer = new h__Writer;
- Result_t result = m_Writer->OpenWrite(filename, HeaderSize);
+ Result_t result = m_Writer->OpenWrite(filename, ASDCP::ESS_JPEG_2000, HeaderSize);
if ( ASDCP_SUCCESS(result) )
{
return RESULT_FORMAT;
}
- Result_t result = m_Writer->OpenWrite(filename, HeaderSize);
+ Result_t result = m_Writer->OpenWrite(filename, ASDCP::ESS_JPEG_2000_S, HeaderSize);
if ( ASDCP_SUCCESS(result) )
{
TDesc.EditRate = TDescObj->SampleRate;
TDesc.ContainerDuration = TDescObj->ContainerDuration;
- memcpy(TDesc.AssetID, TDescObj->AssetID.Value(), UUIDlen);
+ memcpy(TDesc.AssetID, TDescObj->ResourceID.Value(), UUIDlen);
TDesc.NamespaceName = TDescObj->RootNamespaceName;
TDesc.EncodingName = TDescObj->UTFEncoding;
TDescObj->SampleRate = TDesc.EditRate;
TDescObj->ContainerDuration = TDesc.ContainerDuration;
- TDescObj->AssetID.Set(TDesc.AssetID);
+ TDescObj->ResourceID.Set(TDesc.AssetID);
TDescObj->RootNamespaceName = TDesc.NamespaceName;
TDescObj->UTFEncoding = TDesc.EncodingName;
SourcePackage* m_FilePackage;
FileDescriptor* m_EssenceDescriptor;
- std::list<FileDescriptor*> m_EssenceSubDescriptorList;
+ std::list<InterchangeObject*> m_EssenceSubDescriptorList;
ui32_t m_FramesWritten;
ui64_t m_StreamOffset;
{0}, false, "DCTimedTextDescriptor" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x00, 0x01, 0x01, 0x01, // 258
0x0d, 0x01, 0x03, 0x01, 0xfa, 0xce, 0x00, 0x03 },
- {0}, false, "DCTimedTextDescriptor_AssetID" },
+ {0}, false, "DCTimedTextDescriptor_ResourceID" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x00, 0x01, 0x01, 0x01, // 259
0x0d, 0x01, 0x03, 0x01, 0xfa, 0xce, 0x00, 0x04 },
{0}, false, "DCTimedTextDescriptor_UTFEncoding" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 268
0x01, 0x07, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00 },
{0x61, 0x02}, false, "DMSegment_TrackIDList" },
- { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 269
- 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00 },
- {0x61, 0x02}, false, "StereoscopicPictureSubDescriptor" },
+ { { 0x06, 0x0e, 0x2b, 0x34, 0x00, 0x01, 0x01, 0x01, // 269
+ 0x0d, 0x01, 0x03, 0x01, 0xfa, 0xce, 0x00, 0xf6 },
+ {0}, false, "StereoscopicPictureSubDescriptor" },
{ {0}, {0}, false, 0 }
};
MDD_DCTimedTextWrapping, // 255
MDD_DCTimedTextEssence, // 256
MDD_DCTimedTextDescriptor, // 257
- MDD_DCTimedTextDescriptor_AssetID, // 258
+ MDD_DCTimedTextDescriptor_ResourceID, // 258
MDD_DCTimedTextDescriptor_UTFEncoding, // 259
MDD_DCTimedTextDescriptor_RootNamespaceName, // 260
MDD_DCTimedTextResourceDescriptor, // 261
MDD_DCTimedTextResourceDescriptor_ResourceID, // 262
MDD_DCTimedTextResourceDescriptor_ResourceMIMEType, // 263
- MDD_DCTimedTextResourceDescriptor_ResourceSID, //264
+ MDD_DCTimedTextResourceDescriptor_ResourceSID, // 264
MDD_GenericStreamPartition, // 265
MDD_DMSegment_DataDefinition, // 266
MDD_DMSegment_Duration, // 267
static InterchangeObject* GenericDataEssenceDescriptor_Factory() { return new GenericDataEssenceDescriptor; }
static InterchangeObject* DCTimedTextDescriptor_Factory() { return new DCTimedTextDescriptor; }
static InterchangeObject* DCTimedTextResourceDescriptor_Factory() { return new DCTimedTextResourceDescriptor; }
+static InterchangeObject* StereoscopicPictureSubDescriptor_Factory() { return new StereoscopicPictureSubDescriptor; }
+
void
ASDCP::MXF::Metadata_InitTypes()
SetObjectFactory(Dict::ul(MDD_GenericDataEssenceDescriptor), GenericDataEssenceDescriptor_Factory);
SetObjectFactory(Dict::ul(MDD_DCTimedTextDescriptor), DCTimedTextDescriptor_Factory);
SetObjectFactory(Dict::ul(MDD_DCTimedTextResourceDescriptor), DCTimedTextResourceDescriptor_Factory);
+ SetObjectFactory(Dict::ul(MDD_StereoscopicPictureSubDescriptor), StereoscopicPictureSubDescriptor_Factory);
}
//------------------------------------------------------------------------------------------
DCTimedTextDescriptor::InitFromTLVSet(TLVReader& TLVSet)
{
Result_t result = GenericDataEssenceDescriptor::InitFromTLVSet(TLVSet);
- if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(DCTimedTextDescriptor, AssetID));
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(DCTimedTextDescriptor, ResourceID));
if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(DCTimedTextDescriptor, UTFEncoding));
if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(DCTimedTextDescriptor, RootNamespaceName));
return result;
DCTimedTextDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
{
Result_t result = GenericDataEssenceDescriptor::WriteToTLVSet(TLVSet);
- if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(DCTimedTextDescriptor, AssetID));
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(DCTimedTextDescriptor, ResourceID));
if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(DCTimedTextDescriptor, UTFEncoding));
if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(DCTimedTextDescriptor, RootNamespaceName));
return result;
stream = stderr;
GenericDataEssenceDescriptor::Dump(stream);
- fprintf(stream, " %22s = %s\n", "AssetID", AssetID.EncodeString(identbuf, IdentBufferLen));
+ fprintf(stream, " %22s = %s\n", "ResourceID", ResourceID.EncodeString(identbuf, IdentBufferLen));
fprintf(stream, " %22s = %s\n", "UTFEncoding", UTFEncoding.EncodeString(identbuf, IdentBufferLen));
fprintf(stream, " %22s = %s\n", "RootNamespaceName", RootNamespaceName.EncodeString(identbuf, IdentBufferLen));
}
return InterchangeObject::WriteToBuffer(Buffer);
}
+//------------------------------------------------------------------------------------------
+// StereoscopicPictureSubDescriptor
+
+//
+ASDCP::Result_t
+StereoscopicPictureSubDescriptor::InitFromTLVSet(TLVReader& TLVSet)
+{
+ Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
+ return result;
+}
+
+//
+ASDCP::Result_t
+StereoscopicPictureSubDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
+{
+ Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
+ return result;
+}
+
+//
+void
+StereoscopicPictureSubDescriptor::Dump(FILE* stream)
+{
+ char identbuf[IdentBufferLen];
+ *identbuf = 0;
+
+ if ( stream == 0 )
+ stream = stderr;
+
+ InterchangeObject::Dump(stream);
+}
+
+//
+ASDCP::Result_t
+StereoscopicPictureSubDescriptor::InitFromBuffer(const byte_t* p, ui32_t l)
+{
+ m_Typeinfo = &Dict::Type(MDD_StereoscopicPictureSubDescriptor);
+ return InterchangeObject::InitFromBuffer(p, l);
+}
+
+//
+ASDCP::Result_t
+StereoscopicPictureSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
+{
+ m_Typeinfo = &Dict::Type(MDD_StereoscopicPictureSubDescriptor);
+ return InterchangeObject::WriteToBuffer(Buffer);
+}
//
// end Metadata.cpp
ASDCP_NO_COPY_CONSTRUCT(DCTimedTextDescriptor);
public:
- UUID AssetID;
+ UUID ResourceID;
UTF16String UTFEncoding;
UTF16String RootNamespaceName;
virtual Result_t InitFromBuffer(const byte_t* p, ui32_t l);
virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
};
+
+ //
+ class StereoscopicPictureSubDescriptor : public InterchangeObject
+ {
+ ASDCP_NO_COPY_CONSTRUCT(StereoscopicPictureSubDescriptor);
+
+ public:
+
+ StereoscopicPictureSubDescriptor() {}
+ virtual ~StereoscopicPictureSubDescriptor() {}
+ virtual const char* HasName() { return "StereoscopicPictureSubDescriptor"; }
+ virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
+ virtual Result_t WriteToTLVSet(TLVWriter& TLVSet);
+ virtual void Dump(FILE* = 0);
+ virtual Result_t InitFromBuffer(const byte_t* p, ui32_t l);
+ virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
+ };
+
} // namespace MXF
} // namespace ASDCP
class FileInfoWrapper
{
public:
- static void
+ static Result_t
file_info(CommandOptions& Options, const char* type_string, FILE* stream = 0)
{
assert(type_string);
if ( stream == 0 )
stream = stdout;
+ Result_t result = RESULT_OK;
+
if ( Options.verbose_flag || Options.showheader_flag )
{
ReaderT Reader;
- Result_t result = Reader.OpenRead(Options.filenames[0]);
+ result = Reader.OpenRead(Options.filenames[0]);
if ( ASDCP_SUCCESS(result) )
{
Reader.DumpHeaderMetadata(stream);
}
}
+
+ return result;
}
};
return result;
if ( EssenceType == ESS_MPEG2_VES )
- FileInfoWrapper<ASDCP::MPEG2::MXFReader, MyVideoDescriptor>::file_info(Options, "MPEG2 video");
+ result = FileInfoWrapper<ASDCP::MPEG2::MXFReader, MyVideoDescriptor>::file_info(Options, "MPEG2 video");
else if ( EssenceType == ESS_PCM_24b_48k )
- FileInfoWrapper<ASDCP::PCM::MXFReader, MyAudioDescriptor>::file_info(Options, "PCM audio");
+ result = FileInfoWrapper<ASDCP::PCM::MXFReader, MyAudioDescriptor>::file_info(Options, "PCM audio");
else if ( EssenceType == ESS_JPEG_2000 )
{
if ( Options.stereo_image_flag )
- FileInfoWrapper<ASDCP::JP2K::MXFSReader,
+ result = FileInfoWrapper<ASDCP::JP2K::MXFSReader,
MyStereoPictureDescriptor>::file_info(Options, "JPEG 2000 stereoscopic pictures");
else
- FileInfoWrapper<ASDCP::JP2K::MXFReader,
+ result = FileInfoWrapper<ASDCP::JP2K::MXFReader,
MyPictureDescriptor>::file_info(Options, "JPEG 2000 pictures");
}
else if ( EssenceType == ESS_JPEG_2000_S )
- FileInfoWrapper<ASDCP::JP2K::MXFSReader,
+ result = FileInfoWrapper<ASDCP::JP2K::MXFSReader,
MyStereoPictureDescriptor>::file_info(Options, "JPEG 2000 stereoscopic pictures");
else if ( EssenceType == ESS_TIMED_TEXT )
- FileInfoWrapper<ASDCP::TimedText::MXFReader, MyTextDescriptor>::file_info(Options, "Timed Text");
+ result = FileInfoWrapper<ASDCP::TimedText::MXFReader, MyTextDescriptor>::file_info(Options, "Timed Text");
else
{
{
fputs("Program stopped on error.\n", stderr);
- if ( result != RESULT_FAIL )
+ if ( result == RESULT_SFORMAT )
+ {
+ fputs("Use option '-3' to force stereoscopic mode.\n", stderr);
+ }
+ else if ( result != RESULT_FAIL )
{
fputs(result, stderr);
fputc('\n', stderr);
m_HeaderPart.m_Preface->EssenceContainers = m_HeaderPart.EssenceContainers;
m_HeaderPart.AddChildObject(m_EssenceDescriptor);
- std::list<FileDescriptor*>::iterator sdli = m_EssenceSubDescriptorList.begin();
+ std::list<InterchangeObject*>::iterator sdli = m_EssenceSubDescriptorList.begin();
for ( ; sdli != m_EssenceSubDescriptorList.end(); sdli++ )
m_HeaderPart.AddChildObject(*sdli);