# For example, if asdcplib version 1.0.0 were modified to accomodate changes
# in file format, and if no changes were made to AS_DCP.h, the new version would be
# 1.0.1. If changes were also required in AS_DCP.h, the new version would be 1.1.1.
-AC_INIT([asdcplib], [2.1.1], [asdcplib@cinecert.com])
+AC_INIT([asdcplib], [2.1.2], [asdcplib@cinecert.com])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_SRCDIR([src/KM_error.h])
namespace ASDCP
{
- void default_md_object_init();
//
static std::vector<int>
TrackSet<TimecodeComponent> MPTCTrack =
CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
tc_edit_rate, TCFrameRate, 0, m_Dict);
+
+ MPTCTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration.get()));
+ MPTCTrack.Clip->Duration.set_has_value();
m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration.get()));
TrackSet<SourceClip> MPTrack =
CreateTrackAndSequence<MaterialPackage, SourceClip>(m_HeaderPart, *m_MaterialPackage,
TrackName, clip_edit_rate, DataDefinition,
2, m_Dict);
+ MPTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration.get()));
MPTrack.Clip = new SourceClip(m_Dict);
MPTrack.Clip->DataDefinition = DataDefinition;
MPTrack.Clip->SourcePackageID = SourcePackageUMID;
MPTrack.Clip->SourceTrackID = 2;
+
+ MPTrack.Clip->Duration.set_has_value();
m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration.get()));
CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
tc_edit_rate, TCFrameRate,
ui64_C(3600) * TCFrameRate, m_Dict);
+
+ FPTCTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration.get()));
+ FPTCTrack.Clip->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration.get()));
+
TrackSet<SourceClip> FPTrack =
CreateTrackAndSequence<SourcePackage, SourceClip>(m_HeaderPart, *m_FilePackage,
TrackName, clip_edit_rate, DataDefinition,
2, m_Dict);
+
+ FPTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration.get()));
// Consult ST 379:2004 Sec. 6.3, "Element to track relationship" to see where "12" comes from.
// for now we do not allow setting this value, so all files will be 'original'
FPTrack.Clip->SourceTrackID = 0;
FPTrack.Clip->SourcePackageID = NilUMID;
+
+ FPTrack.Clip->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration.get()));
m_EssenceDescriptor->LinkedTrackID = FPTrack.Track->TrackID;
TrackSet<TimecodeComponent> MPTCTrack =
CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
tc_edit_rate, tc_frame_rate, 0, m_Dict);
+
+ MPTCTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration.get()));
+ MPTCTrack.Clip->Duration.set_has_value();
m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration.get()));
TrackSet<DMSegment> MPTrack =
CreateTrackAndSequence<MaterialPackage, DMSegment>(m_HeaderPart, *m_MaterialPackage,
TrackName, clip_edit_rate, DataDefinition,
2, m_Dict);
+ MPTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration.get()));
MPTrack.Clip = new DMSegment(m_Dict);
MPTrack.Clip->DataDefinition = DataDefinition;
// MPTrack.Clip->SourcePackageID = SourcePackageUMID;
// MPTrack.Clip->SourceTrackID = 2;
+
m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration));
CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
clip_edit_rate, tc_frame_rate,
ui64_C(3600) * tc_frame_rate, m_Dict);
+
+ FPTCTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration.get()));
+ FPTCTrack.Clip->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration.get()));
TrackSet<DMSegment> FPTrack =
CreateTrackAndSequence<SourcePackage, DMSegment>(m_HeaderPart, *m_FilePackage,
TrackName, clip_edit_rate, DataDefinition,
2, m_Dict);
+
+ FPTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration.get()));
FPTrack.Clip = new DMSegment(m_Dict);
FPTrack.Clip->EventComment = "ST 429-5 Timed Text";
m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration));
+
m_EssenceDescriptor->LinkedTrackID = FPTrack.Track->TrackID;
}
/*
-Copyright (c) 2005-2009, John Hurst
+Copyright (c) 2005-2014, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
//
void
-ASDCP::JP2K::Accessor::SIZ::ReadComponent(ui32_t index, ASDCP::JP2K::ImageComponent_t& IC)
+ASDCP::JP2K::Accessor::SIZ::ReadComponent(const ui32_t index, ASDCP::JP2K::ImageComponent_t& IC) const
{
assert ( index < Csize() );
const byte_t* p = m_MarkerData + 36 + (index * 3);
//
void
-ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream) const
{
if ( stream == 0 )
stream = stderr;
//
void
-ASDCP::JP2K::Accessor::COD::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::COD::Dump(FILE* stream) const
{
if ( stream == 0 )
stream = stderr;
fprintf(stream, " Transformation: %s\n", transformations_str);
}
+//
+const char*
+ASDCP::JP2K::Accessor::GetQuantizationTypeString(const Accessor::QuantizationType_t t)
+{
+ switch ( t )
+ {
+ case QT_NONE: return "none";
+ case QT_DERIVED: return "scalar derived";
+ case QT_EXP: return "scalar expounded";
+ }
+
+ return "**UNKNOWN**";
+}
+
+//
+void
+ASDCP::JP2K::Accessor::QCD::Dump(FILE* stream) const
+{
+ if ( stream == 0 )
+ stream = stderr;
+
+ fprintf(stream, "QCD: \n");
+ fprintf(stream, "QuantizationType: %s\n", GetQuantizationTypeString(QuantizationType()));
+ fprintf(stream, " GuardBits: %d\n", GuardBits());
+ fprintf(stream, " SPqcd:\n", GuardBits());
+ Kumu::hexdump(m_MarkerData, m_DataSize, stream);
+}
+
//
void
-ASDCP::JP2K::Accessor::COM::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::COM::Dump(FILE* stream) const
{
if ( stream == 0 )
stream = stderr;
if ( IsText() )
{
- char* t_str = (char*)malloc(CommentSize() + 1);
- assert( t_str != 0 );
- ui32_t cs = CommentSize();
- memcpy(t_str, CommentData(), cs);
- t_str[cs] = 0;
- fprintf(stream, "COM:%s\n", t_str);
+ std::string tmp_str;
+ tmp_str.assign((char*)CommentData(), CommentSize());
+ fprintf(stream, "COM:%s\n", tmp_str.c_str());
}
else
{
/*
-Copyright (c) 2005-2009, John Hurst
+Copyright (c) 2005-2014, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
~SIZ() {}
- inline ui16_t Rsize() { return KM_i16_BE(*(ui16_t*)m_MarkerData); }
- inline ui32_t Xsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 2)); }
- inline ui32_t Ysize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 6)); }
- inline ui32_t XOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 10)); }
- inline ui32_t YOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 14)); }
- inline ui32_t XTsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 18)); }
- inline ui32_t YTsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 22)); }
- inline ui32_t XTOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 26)); }
- inline ui32_t YTOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 30)); }
- inline ui16_t Csize() { return KM_i16_BE(*(ui16_t*)(m_MarkerData + 34)); }
- void ReadComponent(ui32_t index, ImageComponent_t& IC);
- void Dump(FILE* stream = 0);
+ inline ui16_t Rsize() const { return KM_i16_BE(*(ui16_t*)m_MarkerData); }
+ inline ui32_t Xsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 2)); }
+ inline ui32_t Ysize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 6)); }
+ inline ui32_t XOsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 10)); }
+ inline ui32_t YOsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 14)); }
+ inline ui32_t XTsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 18)); }
+ inline ui32_t YTsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 22)); }
+ inline ui32_t XTOsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 26)); }
+ inline ui32_t YTOsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 30)); }
+ inline ui16_t Csize() const { return KM_i16_BE(*(ui16_t*)(m_MarkerData + 34)); }
+ void ReadComponent(const ui32_t index, ImageComponent_t& IC) const;
+ void Dump(FILE* stream = 0) const;
};
const int SGcodOFST = 1;
~COD() {}
- inline ui8_t ProgOrder() { return *(m_MarkerData + SGcodOFST ); }
- inline ui16_t Layers() { return KM_i16_BE(*(ui16_t*)(m_MarkerData + SGcodOFST + 1));}
- inline ui8_t DecompLevels() { return *(m_MarkerData + SPcodOFST); }
- inline ui8_t CodeBlockWidth() { return *(m_MarkerData + SPcodOFST + 1) + 2; }
- inline ui8_t CodeBlockHeight() { return *(m_MarkerData + SPcodOFST + 2) + 2; }
- inline ui8_t CodeBlockStyle() { return *(m_MarkerData + SPcodOFST + 3); }
- inline ui8_t Transformation() { return *(m_MarkerData + SPcodOFST + 4); }
-
- void Dump(FILE* stream = 0);
+ inline ui8_t ProgOrder() const { return *(m_MarkerData + SGcodOFST ); }
+ inline ui16_t Layers() const { return KM_i16_BE(*(ui16_t*)(m_MarkerData + SGcodOFST + 1));}
+ inline ui8_t DecompLevels() const { return *(m_MarkerData + SPcodOFST); }
+ inline ui8_t CodeBlockWidth() const { return *(m_MarkerData + SPcodOFST + 1) + 2; }
+ inline ui8_t CodeBlockHeight() const { return *(m_MarkerData + SPcodOFST + 2) + 2; }
+ inline ui8_t CodeBlockStyle() const { return *(m_MarkerData + SPcodOFST + 3); }
+ inline ui8_t Transformation() const { return *(m_MarkerData + SPcodOFST + 4); }
+
+ void Dump(FILE* stream = 0) const;
+ };
+
+ const int SqcdOFST = 1;
+ const int SPqcdOFST = 2;
+
+ enum QuantizationType_t
+ {
+ QT_NONE,
+ QT_DERIVED,
+ QT_EXP
+ };
+
+ const char* GetQuantizationTypeString(const QuantizationType_t m);
+
+ // Quantization default
+ class QCD
+ {
+ const byte_t* m_MarkerData;
+ ui32_t m_DataSize;
+
+ KM_NO_COPY_CONSTRUCT(QCD);
+ QCD();
+
+ public:
+ QCD(const Marker& M)
+ {
+ assert(M.m_Type == MRK_QCD);
+ m_MarkerData = M.m_Data + 2;
+ m_DataSize = M.m_DataSize - 2;
+ }
+
+ ~QCD() {}
+ inline QuantizationType_t QuantizationType() const { return static_cast<QuantizationType_t>(*(m_MarkerData + SqcdOFST) & 0x03); }
+ inline ui8_t GuardBits() const { return (*(m_MarkerData + SqcdOFST) & 0xe0) >> 5; }
+ void Dump(FILE* stream = 0) const;
};
// a comment
~COM() {}
- inline bool IsText() { return m_IsText; }
- inline const byte_t* CommentData() { return m_MarkerData; }
- inline ui32_t CommentSize() { return m_DataSize; }
- void Dump(FILE* stream = 0);
+ inline bool IsText() const { return m_IsText; }
+ inline const byte_t* CommentData() const { return m_MarkerData; }
+ inline ui32_t CommentSize() const { return m_DataSize; }
+ void Dump(FILE* stream = 0) const;
};
} // namespace Accessor
} // namespace JP2K
std::map<ASDCP::UL, ui32_t> m_md_lookup;
std::map<std::string, ui32_t> m_md_sym_lookup;
std::map<ui32_t, ASDCP::UL> m_md_rev_lookup;
- MDDEntry m_MDD_Table[(ui32_t)ASDCP::MDD_Max];
ASDCP_NO_COPY_CONSTRUCT(Dictionary);
public:
+ MDDEntry m_MDD_Table[(ui32_t)ASDCP::MDD_Max];
+
Dictionary();
~Dictionary();
- // bool operator==(const Dictionary& rhs) const { return this == &rhs; }
-
void Init();
bool AddEntry(const MDDEntry& Entry, ui32_t index);
bool DeleteEntry(ui32_t index);
const Dictionary& DefaultInteropDict();
const Dictionary& DefaultCompositeDict();
+ void default_md_object_init();
//
class IPrimerLookup
AM_CPPFLAGS += -DCONFIG_RANDOM_UUID
endif
+AM_CPPFLAGS += -g
+
# list of all the header files that should be installed
include_HEADERS = \
KM_error.h \
SyncEncoder.h \
UUIDInformation.h
-
-nodist_include_HEADERS = TimedText_Transform.h
endif
if USE_AS_02
UUIDInformation.c UUIDInformation.h
-if DEV_HEADERS
-nodist_libasdcp_la_SOURCES += TimedText_Transform.h TimedText_Transform.cpp
-endif
-
libasdcp_la_LDFLAGS = -release @VERSION@
# additional libraries to link against for a library
libasdcp_la_LIBADD = libkumu.la
#include <KM_fileio.h>
#include <AS_DCP.h>
+#include <AS_02.h>
#include <MXF.h>
#include <Metadata.h>
FileInfoWrapper<ASDCP::ATMOS::MXFReader, MyAtmosDescriptor> wrapper;
result = wrapper.file_info(Options, "Dolby ATMOS");
}
+ else if ( EssenceType == ESS_AS02_PCM_24b_48k
+ || EssenceType == ESS_AS02_PCM_24b_96k
+ || EssenceType == ESS_AS02_JPEG_2000
+ || EssenceType == ESS_AS02_TIMED_TEXT )
+ {
+ fprintf(stderr, "File is AS-02. Inspection in not supported by this command.\n");
+ }
else
{
fprintf(stderr, "File is not AS-DCP: %s\n", Options.filenames.front().c_str());
/*
-Copyright (c) 2005-2010, John Hurst
+Copyright (c) 2005-2014, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
Marker MyMarker;
CodestreamParser Parser;
std::list<std::string>::iterator i;
+ bool has_soc = false;
Result_t result = FB.Capacity(1024*1024*4);
while ( p < end_p && ASDCP_SUCCESS(GetNextMarker(&p, MyMarker)) )
{
+ if ( MyMarker.m_Type == MRK_SOC )
+ {
+ if ( has_soc )
+ {
+ fprintf(stderr, "Duplicate SOC detected.\n");
+ result = RESULT_FAIL;
+ break;
+ }
+ else
+ {
+ has_soc = true;
+ continue;
+ }
+
+ if ( ! has_soc )
+ {
+ fprintf(stderr, "Markers detected before SOC.\n");
+ result = RESULT_FAIL;
+ break;
+ }
+ }
+
if ( Options.verbose_flag )
{
MyMarker.Dump(stdout);
Accessor::COM COM_(MyMarker);
COM_.Dump(stdout);
}
+ else if ( MyMarker.m_Type == MRK_QCD )
+ {
+ Accessor::QCD QCD_(MyMarker);
+ QCD_.Dump(stdout);
+ }
+ else
+ {
+ fprintf(stderr, "Unprocessed marker - %s\n", GetMarkerString(MyMarker.m_Type));
+ }
+ }
+
+ /*
+ while ( p < end_p )
+ {
+ if ( *p == 0xff )
+ {
+ fprintf(stdout, "0x%02x 0x%02x 0x%02x\n", *(p+1), *(p+2), *(p+3));
+ p += 4;
+ }
+ else
+ {
+ ++p;
+ }
}
+ */
}
}