summaryrefslogtreecommitdiff
path: root/src/AS_02_JP2K.cpp
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2013-06-04 05:22:27 +0000
committerjhurst <>2013-06-04 05:22:27 +0000
commit12051ad32d54a72a1a8682e15af1a185a61f1c61 (patch)
tree952a756375d6fd0c53d36d7521d2cc4ec355ddd5 /src/AS_02_JP2K.cpp
parentde10f4a1f35fce05226b267baf6622e67e3d4c83 (diff)
working j2c as-02
Diffstat (limited to 'src/AS_02_JP2K.cpp')
-rw-r--r--src/AS_02_JP2K.cpp113
1 files changed, 41 insertions, 72 deletions
diff --git a/src/AS_02_JP2K.cpp b/src/AS_02_JP2K.cpp
index 38b2e55..aeb6dbc 100644
--- a/src/AS_02_JP2K.cpp
+++ b/src/AS_02_JP2K.cpp
@@ -50,7 +50,8 @@ static std::string PICT_DEF_LABEL = "Image Track";
class AS_02::JP2K::MXFReader::h__Reader : public AS_02::h__AS02Reader
{
- RGBAEssenceDescriptor* m_EssenceDescriptor;
+ RGBAEssenceDescriptor* m_RGBAEssenceDescriptor;
+ CDCIEssenceDescriptor* m_CDCIEssenceDescriptor;
JPEG2000PictureSubDescriptor* m_EssenceSubDescriptor;
ASDCP::Rational m_EditRate;
ASDCP::Rational m_SampleRate;
@@ -62,29 +63,49 @@ public:
PictureDescriptor m_PDesc; // codestream parameter list
h__Reader(const Dictionary& d) :
- AS_02::h__AS02Reader(d), m_EssenceDescriptor(0), m_EssenceSubDescriptor(0), m_Format(ESS_UNKNOWN) {}
+ AS_02::h__AS02Reader(d), m_RGBAEssenceDescriptor(0), m_CDCIEssenceDescriptor(0),
+ m_EssenceSubDescriptor(0), m_Format(ESS_UNKNOWN) {}
virtual ~h__Reader() {}
- Result_t OpenRead(const char*, EssenceType_t);
+ Result_t OpenRead(const char*);
Result_t ReadFrame(ui32_t, ASDCP::JP2K::FrameBuffer&, AESDecContext*, HMACContext*);
};
//
Result_t
-AS_02::JP2K::MXFReader::h__Reader::OpenRead(const char* filename, ASDCP::EssenceType_t type)
+AS_02::JP2K::MXFReader::h__Reader::OpenRead(const char* filename)
{
Result_t result = OpenMXFRead(filename);
if( ASDCP_SUCCESS(result) )
{
InterchangeObject* tmp_iobj = 0;
- m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(RGBAEssenceDescriptor), &tmp_iobj);
- m_EssenceDescriptor = static_cast<RGBAEssenceDescriptor*>(tmp_iobj);
+
+ m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(CDCIEssenceDescriptor), &tmp_iobj);
+ m_CDCIEssenceDescriptor = static_cast<CDCIEssenceDescriptor*>(tmp_iobj);
+
+ if ( m_CDCIEssenceDescriptor == 0 )
+ {
+ m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(RGBAEssenceDescriptor), &tmp_iobj);
+ m_RGBAEssenceDescriptor = static_cast<RGBAEssenceDescriptor*>(tmp_iobj);
+ }
+
+ if ( m_CDCIEssenceDescriptor == 0 && m_RGBAEssenceDescriptor == 0 )
+ {
+ DefaultLogSink().Error("RGBAEssenceDescriptor nor CDCIEssenceDescriptor found.\n");
+ return RESULT_FORMAT;
+ }
m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(JPEG2000PictureSubDescriptor), &tmp_iobj);
m_EssenceSubDescriptor = static_cast<JPEG2000PictureSubDescriptor*>(tmp_iobj);
+ if ( m_EssenceSubDescriptor == 0 )
+ {
+ DefaultLogSink().Error("JPEG2000PictureSubDescriptor not found.\n");
+ return RESULT_FORMAT;
+ }
+
std::list<InterchangeObject*> ObjectList;
m_HeaderPart.GetMDObjectsByType(OBJ_TYPE_ARGS(Track), ObjectList);
@@ -94,34 +115,23 @@ AS_02::JP2K::MXFReader::h__Reader::OpenRead(const char* filename, ASDCP::Essence
return RESULT_FORMAT;
}
- m_EditRate = ((Track*)ObjectList.front())->EditRate;
- m_SampleRate = m_EssenceDescriptor->SampleRate;
-
- if ( type == ASDCP::ESS_JPEG_2000 )
+ if ( m_CDCIEssenceDescriptor != 0 )
{
- if ( m_EditRate != m_SampleRate )
- {
- DefaultLogSink().Warn("EditRate and SampleRate do not match (%.03f, %.03f).\n",
- m_EditRate.Quotient(), m_SampleRate.Quotient());
-
- if ( m_EditRate == EditRate_24 && m_SampleRate == EditRate_48 )
- {
- DefaultLogSink().Debug("File may contain JPEG Interop stereoscopic images.\n");
- return RESULT_SFORMAT;
- }
-
- return RESULT_FORMAT;
- }
+ m_EditRate = ((Track*)ObjectList.front())->EditRate;
+ m_SampleRate = m_CDCIEssenceDescriptor->SampleRate;
+ result = MD_to_JP2K_PDesc(*m_CDCIEssenceDescriptor, *m_EssenceSubDescriptor, m_EditRate, m_SampleRate, m_PDesc);
}
- else
+ else if ( m_RGBAEssenceDescriptor != 0 )
{
- DefaultLogSink().Error("'type' argument unexpected: %x\n", type);
- return RESULT_STATE;
+ m_EditRate = ((Track*)ObjectList.front())->EditRate;
+ m_SampleRate = m_RGBAEssenceDescriptor->SampleRate;
+ result = MD_to_JP2K_PDesc(*m_RGBAEssenceDescriptor, *m_EssenceSubDescriptor, m_EditRate, m_SampleRate, m_PDesc);
}
- assert(m_EssenceDescriptor);
- assert(m_EssenceSubDescriptor);
- result = MD_to_JP2K_PDesc(*m_EssenceDescriptor, *m_EssenceSubDescriptor, m_EditRate, m_SampleRate, m_PDesc);
+ if ( m_PDesc.ContainerDuration == 0 )
+ {
+ m_PDesc.ContainerDuration = m_IndexAccess.GetDuration();
+ }
}
return result;
@@ -203,7 +213,7 @@ AS_02::JP2K::MXFReader::RIP()
Result_t
AS_02::JP2K::MXFReader::OpenRead(const char* filename) const
{
- return m_Reader->OpenRead(filename, ASDCP::ESS_JPEG_2000);
+ return m_Reader->OpenRead(filename);
}
//
@@ -359,14 +369,13 @@ AS_02::JP2K::MXFWriter::h__Writer::SetSourceStream(const PictureDescriptor& PDes
Result_t
AS_02::JP2K::MXFWriter::h__Writer::WriteFrame(const ASDCP::JP2K::FrameBuffer& FrameBuf,
AESEncContext* Ctx, HMACContext* HMAC)
-#if 1
{
Result_t result = RESULT_OK;
if ( m_State.Test_READY() )
result = m_State.Goto_RUNNING(); // first time through
- ui64_t StreamOffset = m_StreamOffset;
+ ui64_t StreamOffset = m_StreamOffset; // m_StreamOffset will be changed by the call to WriteEKLVPacket
if ( ASDCP_SUCCESS(result) )
result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
@@ -381,46 +390,6 @@ AS_02::JP2K::MXFWriter::h__Writer::WriteFrame(const ASDCP::JP2K::FrameBuffer& Fr
m_FramesWritten++;
return result;
}
-#else
-{
- Result_t result = RESULT_OK;
-
- if ( m_State.Test_READY() ){
- result = m_State.Goto_RUNNING(); // first time through
- }
- ui64_t StreamOffset = m_StreamOffset;
-
- if ( ASDCP_SUCCESS(result) )
- result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
-
- if ( ASDCP_SUCCESS(result) && add_index )
- {
- //create new Index and add it to the IndexTableSegment in the IndexPartition
- IndexTableSegment::IndexEntry Entry;
- Entry.StreamOffset = StreamOffset;
- m_CurrentIndexBodyPartition->m_FramesWritten = m_FramesWritten;
- m_CurrentIndexBodyPartition->PushIndexEntry(Entry);
-
- //here we must check if the number of frames per partition are reached
- if(m_FramesWritten!=0 &&((m_FramesWritten+1) % m_PartitionSpace) == 0){
- this->m_BodyOffset += m_StreamOffset;
- //StreamOffset - Offset in bytes from the start of the Essence
- //Container of first Essence Element in this Edit Unit of
- //stored Essence within the Essence Container Stream
- //this->m_StreamOffset = 0; ???
-
- //Complete the Index-BodyPartion
- result = CompleteIndexBodyPart();
- //Create new BodyPartions for Essence and Index
- result = CreateBodyPartPair();
- }
- //else do nothing, we must only insert the current frame
- //else{}
- }
- m_FramesWritten++;
- return result;
-}
-#endif
// Closes the MXF file, writing the index and other closing information.
//