diff options
| author | Pierre-Anthony Lemieux <pal@palemieux.com> | 2019-11-30 14:32:56 -0800 |
|---|---|---|
| committer | Pierre-Anthony Lemieux <pal@palemieux.com> | 2019-11-30 14:32:56 -0800 |
| commit | dd3acfff947ca52e1a3260243cb38f7035626282 (patch) | |
| tree | 08f85ed8b94dc9b6fae738bda0dc5ae0ad71f757 /src | |
| parent | fb0d1d9e580641c2d7832dcb94661dcd1ebe3374 (diff) | |
Implemented J2K desc to/from MD
Diffstat (limited to 'src')
| -rwxr-xr-x | src/AS_DCP.h | 2 | ||||
| -rwxr-xr-x | src/AS_DCP_JP2K.cpp | 108 | ||||
| -rwxr-xr-x | src/KM_util.h | 2 | ||||
| -rwxr-xr-x | src/MXFTypes.cpp | 6 | ||||
| -rwxr-xr-x | src/MXFTypes.h | 2 |
5 files changed, 115 insertions, 5 deletions
diff --git a/src/AS_DCP.h b/src/AS_DCP.h index b28f114..0948cbf 100755 --- a/src/AS_DCP.h +++ b/src/AS_DCP.h @@ -1092,7 +1092,7 @@ namespace ASDCP { struct ExtendedCapabilities_t // ISO 15444-1 Annex A.5.2 { ui32_t Pcap; // Pcap = 0 means that no extended capabilities are required - ui16_t Ccap[MaxCapabilities]; // Ccap^i in ISO/IEC 15444-1 corresponds to Ccap[i -1] + ui16_t Ccap[MaxCapabilities]; // Ccap^i in ISO/IEC 15444-1 corresponds to Ccap[i - 1] }; struct Profile_t // ISO 15444-1 diff --git a/src/AS_DCP_JP2K.cpp b/src/AS_DCP_JP2K.cpp index ccb6b09..a980e0f 100755 --- a/src/AS_DCP_JP2K.cpp +++ b/src/AS_DCP_JP2K.cpp @@ -32,6 +32,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "AS_DCP_internal.h" #include <iostream> #include <iomanip> +#include <algorithm> using namespace ASDCP::JP2K; using Kumu::GenRandomValue; @@ -327,6 +328,54 @@ ASDCP::JP2K_PDesc_to_MD(const JP2K::PictureDescriptor& PDesc, EssenceSubDescriptor.QuantizationDefault.get().Length(qdflt_size); EssenceSubDescriptor.QuantizationDefault.set_has_value(); + // Profile + + if (PDesc.Profile.N == 0) { + EssenceSubDescriptor.J2KProfile.set_has_value(false); + } else { + EssenceSubDescriptor.J2KProfile.get().resize(PDesc.Profile.N); + + std::copy(PDesc.Profile.Pprf, + PDesc.Profile.Pprf + PDesc.Profile.N, + EssenceSubDescriptor.J2KProfile.get().begin()); + + EssenceSubDescriptor.J2KProfile.set_has_value(); + } + + // Corresponding profile + + if (PDesc.CorrespondingProfile.N == 0) { + + EssenceSubDescriptor.J2KCorrespondingProfile.set_has_value(false); + + } else { + EssenceSubDescriptor.J2KCorrespondingProfile.get().resize(PDesc.CorrespondingProfile.N); + + std::copy(PDesc.CorrespondingProfile.Pcpf, + PDesc.CorrespondingProfile.Pcpf + PDesc.CorrespondingProfile.N, + EssenceSubDescriptor.J2KCorrespondingProfile.get().begin()); + + EssenceSubDescriptor.J2KCorrespondingProfile.set_has_value(); + } + + // Extended capabilities + + if (PDesc.ExtendedCapabilities.Pcap == 0) { + + EssenceSubDescriptor.J2KExtendedCapabilities.set_has_value(false); + + } else { + + EssenceSubDescriptor.J2KExtendedCapabilities.get().Pcap = PDesc.ExtendedCapabilities.Pcap; + + std::copy(PDesc.ExtendedCapabilities.Ccap, + PDesc.ExtendedCapabilities.Ccap + JP2K::MaxCapabilities, + EssenceSubDescriptor.J2KExtendedCapabilities.get().Ccap); + + EssenceSubDescriptor.J2KExtendedCapabilities.set_has_value(true); + + } + return RESULT_OK; } @@ -384,6 +433,65 @@ ASDCP::MD_to_JP2K_PDesc(const ASDCP::MXF::GenericPictureEssenceDescriptor& Esse EssenceSubDescriptor.QuantizationDefault.const_get().Length()); PDesc.QuantizationDefault.SPqcdLength = EssenceSubDescriptor.QuantizationDefault.const_get().Length() - 1; + + // Profile + + std::fill(PDesc.Profile.Pprf, PDesc.Profile.Pprf + JP2K::MaxPRFN, 0); + + if (EssenceSubDescriptor.J2KProfile.empty() || + EssenceSubDescriptor.J2KProfile.const_get().size() == 0) { + + PDesc.Profile.N = 0; + + } else { + + PDesc.Profile.N = EssenceSubDescriptor.J2KProfile.const_get().size(); + + std::copy(EssenceSubDescriptor.J2KProfile.const_get().begin(), + EssenceSubDescriptor.J2KProfile.const_get().end(), + PDesc.Profile.Pprf); + + } + + // Corresponding profile + + std::fill(PDesc.CorrespondingProfile.Pcpf, PDesc.CorrespondingProfile.Pcpf + JP2K::MaxCPFN, 0); + + if (EssenceSubDescriptor.J2KCorrespondingProfile.empty() || + EssenceSubDescriptor.J2KCorrespondingProfile.const_get().size() == 0) { + + PDesc.CorrespondingProfile.N = 0; + + } + else { + + PDesc.CorrespondingProfile.N = EssenceSubDescriptor.J2KCorrespondingProfile.const_get().size(); + + std::copy(EssenceSubDescriptor.J2KCorrespondingProfile.const_get().begin(), + EssenceSubDescriptor.J2KCorrespondingProfile.const_get().end(), + PDesc.CorrespondingProfile.Pcpf); + + } + + // Extended capabilities + + std::fill(PDesc.ExtendedCapabilities.Ccap, PDesc.ExtendedCapabilities.Ccap + JP2K::MaxCapabilities, 0); + + if (EssenceSubDescriptor.J2KExtendedCapabilities.empty()) { + + PDesc.ExtendedCapabilities.Pcap = 0; + + } + else { + + PDesc.ExtendedCapabilities.Pcap = EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Pcap; + + std::copy(EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Ccap, + EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Ccap + JP2K::MaxCapabilities, + PDesc.ExtendedCapabilities.Ccap); + + } + return RESULT_OK; } diff --git a/src/KM_util.h b/src/KM_util.h index ab5a837..8a71ef7 100755 --- a/src/KM_util.h +++ b/src/KM_util.h @@ -269,6 +269,8 @@ namespace Kumu bool HasValue() const { return true; } ui32_t ArchiveLength() const { return sizeof(ui16_t); } + operator ui16_t() const { return value; } + bool Archive(MemIOWriter* Writer) const { if ( Writer == 0 ) return false; return Writer->WriteUi16BE(value); diff --git a/src/MXFTypes.cpp b/src/MXFTypes.cpp index ec55f87..7346b6c 100755 --- a/src/MXFTypes.cpp +++ b/src/MXFTypes.cpp @@ -785,7 +785,7 @@ ASDCP::MXF::J2KExtendedCapabilities::Archive(Kumu::MemIOWriter* Writer) const { for ( int i = 0; i < JP2K::MaxCapabilities; ++i ) { - if ( ! Writer->WriteUi16BE(Ccapi[i]) ) + if ( ! Writer->WriteUi16BE(Ccap[i]) ) { return false; } @@ -804,7 +804,7 @@ ASDCP::MXF::J2KExtendedCapabilities::Unarchive(Kumu::MemIOReader* Reader) { for ( int i = 0; i < JP2K::MaxCapabilities; ++i ) { - if ( ! Reader->ReadUi16BE(&Ccapi[i]) ) + if ( ! Reader->ReadUi16BE(&Ccap[i]) ) { return false; } @@ -823,7 +823,7 @@ ASDCP::MXF::J2KExtendedCapabilities::EncodeString(char* str_buf, ui32_t buf_len) { for ( int i = 0; i < JP2K::MaxCapabilities; ++i ) { - snprintf(str_buf+(i*3), 4, "%02hx.", Ccapi[i]); + snprintf(str_buf+(i*3), 4, "%02hx.", Ccap[i]); } str_buf[str_len-1] = 0; diff --git a/src/MXFTypes.h b/src/MXFTypes.h index a39c967..39f75d5 100755 --- a/src/MXFTypes.h +++ b/src/MXFTypes.h @@ -694,7 +694,7 @@ namespace ASDCP { public: ui32_t Pcap; - ui16_t Ccapi[JP2K::MaxCapabilities]; + ui16_t Ccap[JP2K::MaxCapabilities]; bool HasValue() const { return true; } ui32_t ArchiveLength() const { return 0; } |
