const ui8_t MaxCapabilities = 32;
const ui16_t MaxPRFN = 4;
const ui16_t MaxCPFN = 4;
+ const i8_t NoExtendedCapabilitiesSignaled = -1;
+ const ui16_t NoPRFSignaled = 0;
+ const ui16_t NoCPFSignaled = 0;
#pragma pack(1)
struct ImageComponent_t // ISO 15444-1 Annex A.5.1
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]
+ i8_t N; // Number of Ccap elements, or NoExtendedCapabilitiesSignaled if no Extended Capabilities are signaled
+ ui16_t Ccap[MaxCapabilities];
};
struct Profile_t // ISO 15444-1
{
- ui16_t N; // N = 0 means that the profile is signaled through Rsiz exclusively
+ ui16_t N; // N = NoPRFSignaled means that Profile is signaled through Rsiz exclusively
ui16_t Pprf[MaxPRFN]; // Pprf^i in ISO/IEC 15444-1 corresponds to Pprf[i -1]
};
struct CorrespondingProfile_t // ISO 15444-1
{
- ui16_t N; // N = 0 means that no corresponding profile is signaled
+ ui16_t N; // N = NoCPFSignaled means that no corresponding profile is signaled
ui16_t Pcpf[MaxCPFN]; // Pcpf^i in ISO/IEC 15444-1 corresponds to Pcpf[i -1]
};
}
}
- if (PDesc.ExtendedCapabilities.Pcap != 0) {
+ if (PDesc.ExtendedCapabilities.N != JP2K::NoExtendedCapabilitiesSignaled && PDesc.ExtendedCapabilities.Pcap != 0) {
strm << "Extended Capabilities:" << std::endl;
strm << " Pcap:" << PDesc.ExtendedCapabilities.Pcap << std::endl;
- for (i32_t b = 0; b < JP2K::MaxCapabilities; b++) {
+ for (i32_t b = 0, i = 0; b < JP2K::MaxCapabilities; b++) {
if ((PDesc.ExtendedCapabilities.Pcap >> b) & 0x1) {
strm << " Ccap(" << (JP2K::MaxCapabilities - b) << "): " <<
- std::hex << std::showbase << PDesc.ExtendedCapabilities.Ccap[JP2K::MaxCapabilities - b - 1] << std::dec << std::noshowbase
+ std::hex << std::showbase << PDesc.ExtendedCapabilities.Ccap[i++] << std::dec << std::noshowbase
<< std::endl;
}
}
}
- fprintf(stream, "Extended Capabilities: %x\n", PDesc.ExtendedCapabilities.Pcap);
+ if (PDesc.ExtendedCapabilities.N != JP2K::NoExtendedCapabilitiesSignaled) {
- for (i32_t b = 0; b < JP2K::MaxCapabilities; b++) {
+ fprintf(stream, "Extended Capabilities: %x\n", PDesc.ExtendedCapabilities.Pcap);
- if ((PDesc.ExtendedCapabilities.Pcap >> b) & 0x1) {
+ for (i32_t b = 0, i = 0; b < JP2K::MaxCapabilities && i < PDesc.ExtendedCapabilities.N; b++) {
- fprintf(stream, " Ccap(%d): %hx\n", JP2K::MaxCapabilities - b, PDesc.ExtendedCapabilities.Ccap[JP2K::MaxCapabilities - b - 1]);
+ if ((PDesc.ExtendedCapabilities.Pcap >> (JP2K::MaxCapabilities - b - 1)) & 0x1) {
- }
- }
+ fprintf(stream, " Ccap(%d): %hx\n", b + 1, PDesc.ExtendedCapabilities.Ccap[i++]);
+
+ }
+ }
+
+ }
}
// Extended capabilities
- if (PDesc.ExtendedCapabilities.Pcap == 0) {
+ if (PDesc.ExtendedCapabilities.N == JP2K::NoExtendedCapabilitiesSignaled) {
+
+ /* No extended capabilities are signaled */
EssenceSubDescriptor.J2KExtendedCapabilities.set_has_value(false);
EssenceSubDescriptor.J2KExtendedCapabilities.get().Pcap = PDesc.ExtendedCapabilities.Pcap;
+ EssenceSubDescriptor.J2KExtendedCapabilities.get().Ccap.resize(PDesc.ExtendedCapabilities.N);
+
std::copy(PDesc.ExtendedCapabilities.Ccap,
- PDesc.ExtendedCapabilities.Ccap + JP2K::MaxCapabilities,
- EssenceSubDescriptor.J2KExtendedCapabilities.get().Ccap);
+ PDesc.ExtendedCapabilities.Ccap + PDesc.ExtendedCapabilities.N,
+ EssenceSubDescriptor.J2KExtendedCapabilities.get().Ccap.begin());
EssenceSubDescriptor.J2KExtendedCapabilities.set_has_value(true);
if (EssenceSubDescriptor.J2KExtendedCapabilities.empty()) {
PDesc.ExtendedCapabilities.Pcap = 0;
+ PDesc.ExtendedCapabilities.N = JP2K::NoExtendedCapabilitiesSignaled;
}
else {
PDesc.ExtendedCapabilities.Pcap = EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Pcap;
+ PDesc.ExtendedCapabilities.N = EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Ccap.size();
- std::copy(EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Ccap,
- EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Ccap + JP2K::MaxCapabilities,
+ std::copy(EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Ccap.begin(),
+ EssenceSubDescriptor.J2KExtendedCapabilities.const_get().Ccap.end(),
PDesc.ExtendedCapabilities.Ccap);
}
public:
PRF(const Marker& M) {
- assert(M.m_Type == MRK_CPF);
+ assert(M.m_Type == MRK_PRF);
m_Data = (ui16_t*) M.m_Data;
m_N = M.m_DataSize >> 1;
ui32_t m_Pcap;
+ i8_t m_N;
+
KM_NO_COPY_CONSTRUCT(CAP);
CAP();
m_Data = (ui16_t *) (M.m_Data + 4);
m_Pcap = KM_i32_BE(*(ui32_t*)(M.m_Data));
+ m_N = (M.m_DataSize - 4) >> 1;
}
~CAP() {}
inline ui32_t pcap() const { return m_Pcap; }
+ inline i8_t N() const { return m_N; }
+
inline ui16_t ccap(ui16_t i) const { return KM_i16_BE(m_Data[2 * (i - 1)]); }
void Dump(FILE* stream = 0) const;
const byte_t* p = FB.RoData();
const byte_t* end_p = p + FB.Size();
+ /* initialize optional items */
+
+ PDesc.ExtendedCapabilities.N = JP2K::NoExtendedCapabilitiesSignaled;
+ PDesc.Profile.N = 0;
+ PDesc.CorrespondingProfile.N = 0;
+
while ( p < end_p && ASDCP_SUCCESS(result) )
{
result = GetNextMarker(&p, NextMarker);
PDesc.ExtendedCapabilities.Pcap = CAP_.pcap();
- for(i32_t b = 32, i = 1; b > 0; b--) {
-
- if ( (PDesc.ExtendedCapabilities.Pcap >> (b - 1)) & 0x1 ) {
+ PDesc.ExtendedCapabilities.N = CAP_.N();
- PDesc.ExtendedCapabilities.Ccap[32 - b] = CAP_.ccap(i++);
+ for (i32_t i = 0; i < CAP_.N(); i++) {
- } else {
-
- PDesc.ExtendedCapabilities.Ccap[32 - b] = 0;
-
- }
+ PDesc.ExtendedCapabilities.Ccap[i] = CAP_.ccap(i);
}
+
}
break;
{
if (lhs.Pcap != rhs.Pcap) return false;
- for (ui32_t i = 0; i < JP2K::MaxCapabilities; i++)
+ if (lhs.N != rhs.N) return false;
+
+ for (ui32_t i = 0; i < lhs.N; i++)
{
if (lhs.Ccap[i] != rhs.Ccap[i])
return false;
return false;
}
- for ( int i = 0; i < JP2K::MaxCapabilities; ++i )
+ if ( ! Ccap.Archive(Writer) )
{
- if ( ! Writer->WriteUi16BE(Ccap[i]) )
- {
- return false;
- }
+ return false;
}
return true;
return false;
}
- for ( int i = 0; i < JP2K::MaxCapabilities; ++i )
+ if ( ! Ccap.Unarchive(Reader) )
{
- if ( ! Reader->ReadUi16BE(&Ccap[i]) )
- {
- return false;
- }
+ return false;
}
return true;
if ( Pcap != 0 && buf_len > str_len )
{
- for ( int i = 0; i < JP2K::MaxCapabilities; ++i )
+ for ( int i = 0; i < Ccap.size(); ++i )
{
snprintf(str_buf+(i*3), 4, "%02hx.", Ccap[i]);
}
{
public:
ui32_t Pcap;
- ui16_t Ccap[JP2K::MaxCapabilities];
+ Array<Kumu::ArchivableUi16> Ccap;
bool HasValue() const { return true; }
ui32_t ArchiveLength() const { return 0; }