summaryrefslogtreecommitdiff
path: root/src/AS_DCP_JP2K.cpp
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2013-12-15 23:34:13 +0000
committerjhurst <>2013-12-15 23:34:13 +0000
commit7f373b689817ee70fbe5d6a14cb0512b5260f77c (patch)
tree0b182f46691f1420e18be08ea1952a818c546f94 /src/AS_DCP_JP2K.cpp
parent1f41555bcf96369227cda526e36196fe512f464e (diff)
o Added preliminary support for timed-text wrapping for AS-02. This
work will require changes in SMPTE ST 429-5 and perhaps other standards work, so files created with this implementation are "speculative". Publication of the revised ST 429-5 may not occur until early 2015. o Moved LocalFilenameResolver into the AS_DCP public API so that it can be used by other modules including AS-02. o Fixed wave wrapping UL in clip-wrapped AS-02 files. Renamed some UL constants to reflect "clip" or "frame" wrapping. o Re-factored JP2K_PDesc_to_MD() and MD_to_JP2K_PDesc() to work with GenericPictureEssenceDescriptor objects. o Fixed a bug that was suppressing PictureComponentSizing, CodingStyleDefault and QuantizationDefault when writing the essence descriptor in a JP2K file (AS-DCP and AS-02). o Fixed the version byte on the following UL values: StereoscopicPictureSubDescriptor GenericPictureEssenceDescriptor_ColorPrimaries GenericPictureEssenceDescriptor_ActiveHeight GenericPictureEssenceDescriptor_ActiveWidth GenericPictureEssenceDescriptor_ActiveXOffset GenericPictureEssenceDescriptor_ActiveYOffset o Added some essence descriptor options to as-02-wrap. o Added TTML timed-text wrapping option to as-02-wrap. o Changed bit rate display in asdcp-info from mebi-bits/s to mega-bits/s. o Added "SMPTE" / "Interop" format type display to asdcp-info. o Modified asdcp-wrap to assume -L when wrapping timed-text (since there is no MXF text wrapping for Interop.) o Fixed missing-index-partion bugs for AS-02 files.
Diffstat (limited to 'src/AS_DCP_JP2K.cpp')
-rwxr-xr-xsrc/AS_DCP_JP2K.cpp232
1 files changed, 49 insertions, 183 deletions
diff --git a/src/AS_DCP_JP2K.cpp b/src/AS_DCP_JP2K.cpp
index b2f2eaf..1b3bc54 100755
--- a/src/AS_DCP_JP2K.cpp
+++ b/src/AS_DCP_JP2K.cpp
@@ -208,39 +208,26 @@ static const byte_t s_PixelLayoutXYZ[PixelLayoutSize] = { 0xd8, 0x0c, 0xd9, 0x0c
ASDCP::Result_t
ASDCP::JP2K_PDesc_to_MD(const JP2K::PictureDescriptor& PDesc,
const ASDCP::Dictionary& dict,
- ASDCP::MXF::RGBAEssenceDescriptor *EssenceDescriptor,
- ASDCP::MXF::JPEG2000PictureSubDescriptor *EssenceSubDescriptor)
-{
- if ( EssenceDescriptor == 0 || EssenceSubDescriptor == 0 )
- return RESULT_PTR;
-
- EssenceDescriptor->ContainerDuration = PDesc.ContainerDuration;
- EssenceDescriptor->SampleRate = PDesc.EditRate;
- EssenceDescriptor->FrameLayout = 0;
- EssenceDescriptor->StoredWidth = PDesc.StoredWidth;
- EssenceDescriptor->StoredHeight = PDesc.StoredHeight;
- EssenceDescriptor->AspectRatio = PDesc.AspectRatio;
-
- if ( PDesc.StoredWidth < 2049 )
- {
- EssenceDescriptor->PictureEssenceCoding.Set(dict.ul(MDD_JP2KEssenceCompression_2K));
- EssenceSubDescriptor->Rsize = 3;
- }
- else
- {
- EssenceDescriptor->PictureEssenceCoding.Set(dict.ul(MDD_JP2KEssenceCompression_4K));
- EssenceSubDescriptor->Rsize = 4;
- }
-
- EssenceSubDescriptor->Xsize = PDesc.Xsize;
- EssenceSubDescriptor->Ysize = PDesc.Ysize;
- EssenceSubDescriptor->XOsize = PDesc.XOsize;
- EssenceSubDescriptor->YOsize = PDesc.YOsize;
- EssenceSubDescriptor->XTsize = PDesc.XTsize;
- EssenceSubDescriptor->YTsize = PDesc.YTsize;
- EssenceSubDescriptor->XTOsize = PDesc.XTOsize;
- EssenceSubDescriptor->YTOsize = PDesc.YTOsize;
- EssenceSubDescriptor->Csize = PDesc.Csize;
+ ASDCP::MXF::GenericPictureEssenceDescriptor& EssenceDescriptor,
+ ASDCP::MXF::JPEG2000PictureSubDescriptor& EssenceSubDescriptor)
+{
+ EssenceDescriptor.ContainerDuration = PDesc.ContainerDuration;
+ EssenceDescriptor.SampleRate = PDesc.EditRate;
+ EssenceDescriptor.FrameLayout = 0;
+ EssenceDescriptor.StoredWidth = PDesc.StoredWidth;
+ EssenceDescriptor.StoredHeight = PDesc.StoredHeight;
+ EssenceDescriptor.AspectRatio = PDesc.AspectRatio;
+
+ EssenceSubDescriptor.Rsize = PDesc.Rsize;
+ EssenceSubDescriptor.Xsize = PDesc.Xsize;
+ EssenceSubDescriptor.Ysize = PDesc.Ysize;
+ EssenceSubDescriptor.XOsize = PDesc.XOsize;
+ EssenceSubDescriptor.YOsize = PDesc.YOsize;
+ EssenceSubDescriptor.XTsize = PDesc.XTsize;
+ EssenceSubDescriptor.YTsize = PDesc.YTsize;
+ EssenceSubDescriptor.XTOsize = PDesc.XTOsize;
+ EssenceSubDescriptor.YTOsize = PDesc.YTOsize;
+ EssenceSubDescriptor.Csize = PDesc.Csize;
const ui32_t tmp_buffer_len = 1024;
byte_t tmp_buffer[tmp_buffer_len];
@@ -249,142 +236,24 @@ ASDCP::JP2K_PDesc_to_MD(const JP2K::PictureDescriptor& PDesc,
*(ui32_t*)(tmp_buffer+4) = KM_i32_BE(sizeof(ASDCP::JP2K::ImageComponent_t));
memcpy(tmp_buffer + 8, &PDesc.ImageComponents, sizeof(ASDCP::JP2K::ImageComponent_t) * MaxComponents);
- const ui32_t pcomp_size = (sizeof(int) * 2) + (sizeof(ASDCP::JP2K::ImageComponent_t) * MaxComponents);
- memcpy(EssenceSubDescriptor->PictureComponentSizing.get().Data(), tmp_buffer, pcomp_size);
- EssenceSubDescriptor->PictureComponentSizing.get().Length(pcomp_size);
-
- ui32_t precinct_set_size = 0, i;
- for ( i = 0; PDesc.CodingStyleDefault.SPcod.PrecinctSize[i] != 0 && i < MaxPrecincts; i++ )
- precinct_set_size++;
-
- ui32_t csd_size = sizeof(CodingStyleDefault_t) - MaxPrecincts + precinct_set_size;
- memcpy(EssenceSubDescriptor->CodingStyleDefault.get().Data(), &PDesc.CodingStyleDefault, csd_size);
- EssenceSubDescriptor->CodingStyleDefault.get().Length(csd_size);
-
- ui32_t qdflt_size = PDesc.QuantizationDefault.SPqcdLength + 1;
- memcpy(EssenceSubDescriptor->QuantizationDefault.get().Data(), &PDesc.QuantizationDefault, qdflt_size);
- EssenceSubDescriptor->QuantizationDefault.get().Length(qdflt_size);
-
- return RESULT_OK;
-}
-
-
-//
-ASDCP::Result_t
-ASDCP::MD_to_JP2K_PDesc(const ASDCP::MXF::RGBAEssenceDescriptor& EssenceDescriptor,
- const ASDCP::MXF::JPEG2000PictureSubDescriptor& EssenceSubDescriptor,
- const ASDCP::Rational& EditRate, const ASDCP::Rational& SampleRate,
- ASDCP::JP2K::PictureDescriptor& PDesc)
-{
- memset(&PDesc, 0, sizeof(PDesc));
-
- PDesc.EditRate = EditRate;
- PDesc.SampleRate = SampleRate;
- assert(EssenceDescriptor.ContainerDuration.const_get() <= 0xFFFFFFFFL);
- PDesc.ContainerDuration = static_cast<ui32_t>(EssenceDescriptor.ContainerDuration.const_get());
- PDesc.StoredWidth = EssenceDescriptor.StoredWidth;
- PDesc.StoredHeight = EssenceDescriptor.StoredHeight;
- PDesc.AspectRatio = EssenceDescriptor.AspectRatio;
-
- PDesc.Rsize = EssenceSubDescriptor.Rsize;
- PDesc.Xsize = EssenceSubDescriptor.Xsize;
- PDesc.Ysize = EssenceSubDescriptor.Ysize;
- PDesc.XOsize = EssenceSubDescriptor.XOsize;
- PDesc.YOsize = EssenceSubDescriptor.YOsize;
- PDesc.XTsize = EssenceSubDescriptor.XTsize;
- PDesc.YTsize = EssenceSubDescriptor.YTsize;
- PDesc.XTOsize = EssenceSubDescriptor.XTOsize;
- PDesc.YTOsize = EssenceSubDescriptor.YTOsize;
- PDesc.Csize = EssenceSubDescriptor.Csize;
-
- // PictureComponentSizing
- ui32_t tmp_size = EssenceSubDescriptor.PictureComponentSizing.const_get().Length();
+ const ui32_t pcomp_size = (sizeof(ui32_t) * 2) + (sizeof(ASDCP::JP2K::ImageComponent_t) * MaxComponents);
+ memcpy(EssenceSubDescriptor.PictureComponentSizing.get().Data(), tmp_buffer, pcomp_size);
+ EssenceSubDescriptor.PictureComponentSizing.get().Length(pcomp_size);
+ EssenceSubDescriptor.PictureComponentSizing.set_has_value();
- if ( tmp_size == 17 ) // ( 2 * sizeof(ui32_t) ) + 3 components * 3 byte each
- {
- memcpy(&PDesc.ImageComponents, EssenceSubDescriptor.PictureComponentSizing.const_get().RoData() + 8, tmp_size - 8);
- }
- else
- {
- DefaultLogSink().Error("Unexpected PictureComponentSizing size: %u, should be 17\n", tmp_size);
- }
-
- // CodingStyleDefault
- memset(&PDesc.CodingStyleDefault, 0, sizeof(CodingStyleDefault_t));
- memcpy(&PDesc.CodingStyleDefault,
- EssenceSubDescriptor.CodingStyleDefault.const_get().RoData(),
- EssenceSubDescriptor.CodingStyleDefault.const_get().Length());
-
- // QuantizationDefault
- memset(&PDesc.QuantizationDefault, 0, sizeof(QuantizationDefault_t));
- memcpy(&PDesc.QuantizationDefault,
- EssenceSubDescriptor.QuantizationDefault.const_get().RoData(),
- EssenceSubDescriptor.QuantizationDefault.const_get().Length());
-
- PDesc.QuantizationDefault.SPqcdLength = EssenceSubDescriptor.QuantizationDefault.const_get().Length() - 1;
- return RESULT_OK;
-}
-
-//
-ASDCP::Result_t
-ASDCP::JP2K_PDesc_to_MD(const JP2K::PictureDescriptor& PDesc,
- const ASDCP::Dictionary& dict,
- ASDCP::MXF::CDCIEssenceDescriptor *EssenceDescriptor,
- ASDCP::MXF::JPEG2000PictureSubDescriptor *EssenceSubDescriptor)
-{
- if ( EssenceDescriptor == 0 || EssenceSubDescriptor == 0 )
- return RESULT_PTR;
-
- EssenceDescriptor->ContainerDuration = PDesc.ContainerDuration;
- EssenceDescriptor->SampleRate = PDesc.EditRate;
- EssenceDescriptor->FrameLayout = 0;
- EssenceDescriptor->StoredWidth = PDesc.StoredWidth;
- EssenceDescriptor->StoredHeight = PDesc.StoredHeight;
- EssenceDescriptor->AspectRatio = PDesc.AspectRatio;
-
- if ( PDesc.StoredWidth < 2049 )
- {
- EssenceDescriptor->PictureEssenceCoding.Set(dict.ul(MDD_JP2KEssenceCompression_2K));
- EssenceSubDescriptor->Rsize = 3;
- }
- else
- {
- EssenceDescriptor->PictureEssenceCoding.Set(dict.ul(MDD_JP2KEssenceCompression_4K));
- EssenceSubDescriptor->Rsize = 4;
- }
-
- EssenceSubDescriptor->Xsize = PDesc.Xsize;
- EssenceSubDescriptor->Ysize = PDesc.Ysize;
- EssenceSubDescriptor->XOsize = PDesc.XOsize;
- EssenceSubDescriptor->YOsize = PDesc.YOsize;
- EssenceSubDescriptor->XTsize = PDesc.XTsize;
- EssenceSubDescriptor->YTsize = PDesc.YTsize;
- EssenceSubDescriptor->XTOsize = PDesc.XTOsize;
- EssenceSubDescriptor->YTOsize = PDesc.YTOsize;
- EssenceSubDescriptor->Csize = PDesc.Csize;
-
- const ui32_t tmp_buffer_len = 1024;
- byte_t tmp_buffer[tmp_buffer_len];
-
- *(ui32_t*)tmp_buffer = KM_i32_BE(MaxComponents); // three components
- *(ui32_t*)(tmp_buffer+4) = KM_i32_BE(sizeof(ASDCP::JP2K::ImageComponent_t));
- memcpy(tmp_buffer + 8, &PDesc.ImageComponents, sizeof(ASDCP::JP2K::ImageComponent_t) * MaxComponents);
-
- const ui32_t pcomp_size = (sizeof(int) * 2) + (sizeof(ASDCP::JP2K::ImageComponent_t) * MaxComponents);
- memcpy(EssenceSubDescriptor->PictureComponentSizing.get().Data(), tmp_buffer, pcomp_size);
- EssenceSubDescriptor->PictureComponentSizing.get().Length(pcomp_size);
-
- ui32_t precinct_set_size = 0, i;
- for ( i = 0; PDesc.CodingStyleDefault.SPcod.PrecinctSize[i] != 0 && i < MaxPrecincts; i++ )
+ ui32_t precinct_set_size = 0;
+ for ( ui32_t i = 0; PDesc.CodingStyleDefault.SPcod.PrecinctSize[i] != 0 && i < MaxPrecincts; ++i )
precinct_set_size++;
ui32_t csd_size = sizeof(CodingStyleDefault_t) - MaxPrecincts + precinct_set_size;
- memcpy(EssenceSubDescriptor->CodingStyleDefault.get().Data(), &PDesc.CodingStyleDefault, csd_size);
- EssenceSubDescriptor->CodingStyleDefault.get().Length(csd_size);
+ memcpy(EssenceSubDescriptor.CodingStyleDefault.get().Data(), &PDesc.CodingStyleDefault, csd_size);
+ EssenceSubDescriptor.CodingStyleDefault.get().Length(csd_size);
+ EssenceSubDescriptor.CodingStyleDefault.set_has_value();
ui32_t qdflt_size = PDesc.QuantizationDefault.SPqcdLength + 1;
- memcpy(EssenceSubDescriptor->QuantizationDefault.get().Data(), &PDesc.QuantizationDefault, qdflt_size);
- EssenceSubDescriptor->QuantizationDefault.get().Length(qdflt_size);
+ memcpy(EssenceSubDescriptor.QuantizationDefault.get().Data(), &PDesc.QuantizationDefault, qdflt_size);
+ EssenceSubDescriptor.QuantizationDefault.get().Length(qdflt_size);
+ EssenceSubDescriptor.QuantizationDefault.set_has_value();
return RESULT_OK;
}
@@ -392,7 +261,7 @@ ASDCP::JP2K_PDesc_to_MD(const JP2K::PictureDescriptor& PDesc,
//
ASDCP::Result_t
-ASDCP::MD_to_JP2K_PDesc(const ASDCP::MXF::CDCIEssenceDescriptor& EssenceDescriptor,
+ASDCP::MD_to_JP2K_PDesc(const ASDCP::MXF::GenericPictureEssenceDescriptor& EssenceDescriptor,
const ASDCP::MXF::JPEG2000PictureSubDescriptor& EssenceSubDescriptor,
const ASDCP::Rational& EditRate, const ASDCP::Rational& SampleRate,
ASDCP::JP2K::PictureDescriptor& PDesc)
@@ -446,22 +315,6 @@ ASDCP::MD_to_JP2K_PDesc(const ASDCP::MXF::CDCIEssenceDescriptor& EssenceDescrip
return RESULT_OK;
}
-// Compares the actual floating point value of the rates.
-// This allows, for example, {300000,1001} and {2997,100) to be considered equivalent.
-// to 29.97.
-bool
-epsilon_compare(const ASDCP::Rational& left, const ASDCP::Rational& right, double epsilon = 0.001)
-{
- bool result = false;
- double difference = left.Quotient() - right.Quotient();
-
- if (fabs(difference) < epsilon)
- result = true;
-
- return result;
-}
-// end DOLBY
-
//------------------------------------------------------------------------------------------
//
@@ -1134,12 +987,25 @@ lh__Writer::SetSourceStream(const PictureDescriptor& PDesc, const std::string& l
m_PDesc = PDesc;
assert(m_Dict);
+ assert(m_EssenceDescriptor);
+ assert(m_EssenceSubDescriptor);
Result_t result = JP2K_PDesc_to_MD(m_PDesc, *m_Dict,
- (ASDCP::MXF::RGBAEssenceDescriptor*)m_EssenceDescriptor,
- m_EssenceSubDescriptor);
+ *static_cast<ASDCP::MXF::GenericPictureEssenceDescriptor*>(m_EssenceDescriptor),
+ *m_EssenceSubDescriptor);
if ( ASDCP_SUCCESS(result) )
{
+ if ( PDesc.StoredWidth < 2049 )
+ {
+ static_cast<ASDCP::MXF::RGBAEssenceDescriptor*>(m_EssenceDescriptor)->PictureEssenceCoding.Set(m_Dict->ul(MDD_JP2KEssenceCompression_2K));
+ m_EssenceSubDescriptor->Rsize = 3;
+ }
+ else
+ {
+ static_cast<ASDCP::MXF::RGBAEssenceDescriptor*>(m_EssenceDescriptor)->PictureEssenceCoding.Set(m_Dict->ul(MDD_JP2KEssenceCompression_4K));
+ m_EssenceSubDescriptor->Rsize = 4;
+ }
+
memcpy(m_EssenceUL, m_Dict->ul(MDD_JPEG2000Essence), SMPTE_UL_LENGTH);
m_EssenceUL[SMPTE_UL_LENGTH-1] = 1; // first (and only) essence container
result = m_State.Goto_READY();
@@ -1147,7 +1013,7 @@ lh__Writer::SetSourceStream(const PictureDescriptor& PDesc, const std::string& l
if ( ASDCP_SUCCESS(result) )
{
- result = WriteASDCPHeader(label, UL(m_Dict->ul(MDD_JPEG_2000Wrapping)),
+ result = WriteASDCPHeader(label, UL(m_Dict->ul(MDD_JPEG_2000WrappingFrame)),
PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
LocalEditRate, derive_timecode_rate_from_edit_rate(m_PDesc.EditRate));
}