diff options
| author | jhurst <jhurst@cinecert.com> | 2013-12-15 23:34:13 +0000 |
|---|---|---|
| committer | jhurst <> | 2013-12-15 23:34:13 +0000 |
| commit | 7f373b689817ee70fbe5d6a14cb0512b5260f77c (patch) | |
| tree | 0b182f46691f1420e18be08ea1952a818c546f94 /src/AS_DCP_JP2K.cpp | |
| parent | 1f41555bcf96369227cda526e36196fe512f464e (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-x | src/AS_DCP_JP2K.cpp | 232 |
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)); } |
