summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormikey <mikey@cinecert.com>2014-06-05 16:33:46 +0000
committermikey <>2014-06-05 16:33:46 +0000
commit1f52a9a7e5a8895389e0daa098dabb960735ed13 (patch)
tree4b3454b4b117faab9d1f9c54640b86b7fa33bab3 /src
parent6de07d0a33aec56c8a650054b1b747768d696416 (diff)
version
Diffstat (limited to 'src')
-rwxr-xr-xsrc/AS_DCP_internal.h26
-rwxr-xr-xsrc/JP2K.cpp47
-rwxr-xr-xsrc/JP2K.h87
-rwxr-xr-xsrc/KLV.h6
-rw-r--r--src/Makefile.am8
-rwxr-xr-xsrc/asdcp-info.cpp8
-rwxr-xr-xsrc/j2c-test.cpp49
7 files changed, 183 insertions, 48 deletions
diff --git a/src/AS_DCP_internal.h b/src/AS_DCP_internal.h
index 24020e5..a37c731 100755
--- a/src/AS_DCP_internal.h
+++ b/src/AS_DCP_internal.h
@@ -60,7 +60,6 @@ extern MXF::RIP *g_RIP;
namespace ASDCP
{
- void default_md_object_init();
//
static std::vector<int>
@@ -597,13 +596,17 @@ namespace ASDCP
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);
@@ -612,6 +615,8 @@ namespace ASDCP
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()));
@@ -630,12 +635,18 @@ namespace ASDCP
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.
@@ -649,6 +660,8 @@ namespace ASDCP
// 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;
@@ -688,13 +701,17 @@ namespace ASDCP
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);
@@ -703,6 +720,7 @@ namespace ASDCP
MPTrack.Clip->DataDefinition = DataDefinition;
// MPTrack.Clip->SourcePackageID = SourcePackageUMID;
// MPTrack.Clip->SourceTrackID = 2;
+
m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration));
@@ -721,13 +739,18 @@ namespace ASDCP
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);
@@ -737,6 +760,7 @@ namespace ASDCP
FPTrack.Clip->EventComment = "ST 429-5 Timed Text";
m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration));
+
m_EssenceDescriptor->LinkedTrackID = FPTrack.Track->TrackID;
}
diff --git a/src/JP2K.cpp b/src/JP2K.cpp
index 058aaa1..0066f22 100755
--- a/src/JP2K.cpp
+++ b/src/JP2K.cpp
@@ -1,5 +1,5 @@
/*
-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
@@ -102,7 +102,7 @@ ASDCP::JP2K::GetNextMarker(const byte_t** buf, JP2K::Marker& Marker)
//
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);
@@ -113,7 +113,7 @@ ASDCP::JP2K::Accessor::SIZ::ReadComponent(ui32_t index, ASDCP::JP2K::ImageCompon
//
void
-ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream) const
{
if ( stream == 0 )
stream = stderr;
@@ -146,7 +146,7 @@ ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream)
//
void
-ASDCP::JP2K::Accessor::COD::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::COD::Dump(FILE* stream) const
{
if ( stream == 0 )
stream = stderr;
@@ -180,20 +180,45 @@ ASDCP::JP2K::Accessor::COD::Dump(FILE* stream)
}
//
+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
{
diff --git a/src/JP2K.h b/src/JP2K.h
index fb10049..b043dfc 100755
--- a/src/JP2K.h
+++ b/src/JP2K.h
@@ -1,5 +1,5 @@
/*
-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
@@ -113,18 +113,18 @@ namespace JP2K
~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;
@@ -147,15 +147,50 @@ namespace JP2K
~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
@@ -179,10 +214,10 @@ namespace JP2K
~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
diff --git a/src/KLV.h b/src/KLV.h
index 15e3dbc..8783905 100755
--- a/src/KLV.h
+++ b/src/KLV.h
@@ -146,16 +146,15 @@ inline const char* ui64sz(ui64_t i, char* buf)
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);
@@ -176,6 +175,7 @@ inline const char* ui64sz(ui64_t i, char* buf)
const Dictionary& DefaultInteropDict();
const Dictionary& DefaultCompositeDict();
+ void default_md_object_init();
//
class IPrimerLookup
diff --git a/src/Makefile.am b/src/Makefile.am
index 99bf92b..c2de809 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -39,6 +39,8 @@ if ENABLE_RANDOM_UUID
AM_CPPFLAGS += -DCONFIG_RANDOM_UUID
endif
+AM_CPPFLAGS += -g
+
# list of all the header files that should be installed
include_HEADERS = \
KM_error.h \
@@ -71,8 +73,6 @@ include_HEADERS += \
SyncEncoder.h \
UUIDInformation.h
-
-nodist_include_HEADERS = TimedText_Transform.h
endif
if USE_AS_02
@@ -118,10 +118,6 @@ libasdcp_la_SOURCES = MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp \
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
diff --git a/src/asdcp-info.cpp b/src/asdcp-info.cpp
index cc8f139..448ef42 100755
--- a/src/asdcp-info.cpp
+++ b/src/asdcp-info.cpp
@@ -35,6 +35,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <KM_fileio.h>
#include <AS_DCP.h>
+#include <AS_02.h>
#include <MXF.h>
#include <Metadata.h>
@@ -630,6 +631,13 @@ show_file_info(CommandOptions& Options)
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());
diff --git a/src/j2c-test.cpp b/src/j2c-test.cpp
index 9f57c99..311ea64 100755
--- a/src/j2c-test.cpp
+++ b/src/j2c-test.cpp
@@ -1,5 +1,5 @@
/*
-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
@@ -167,6 +167,7 @@ main(int argc, const char** argv)
Marker MyMarker;
CodestreamParser Parser;
std::list<std::string>::iterator i;
+ bool has_soc = false;
Result_t result = FB.Capacity(1024*1024*4);
@@ -181,6 +182,28 @@ main(int argc, const char** argv)
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);
@@ -208,7 +231,31 @@ main(int argc, const char** argv)
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;
+ }
}
+ */
}
}