diff options
| author | mikey <mikey@cinecert.com> | 2014-06-05 16:33:46 +0000 |
|---|---|---|
| committer | mikey <> | 2014-06-05 16:33:46 +0000 |
| commit | 1f52a9a7e5a8895389e0daa098dabb960735ed13 (patch) | |
| tree | 4b3454b4b117faab9d1f9c54640b86b7fa33bab3 /src | |
| parent | 6de07d0a33aec56c8a650054b1b747768d696416 (diff) | |
version
Diffstat (limited to 'src')
| -rwxr-xr-x | src/AS_DCP_internal.h | 26 | ||||
| -rwxr-xr-x | src/JP2K.cpp | 47 | ||||
| -rwxr-xr-x | src/JP2K.h | 87 | ||||
| -rwxr-xr-x | src/KLV.h | 6 | ||||
| -rw-r--r-- | src/Makefile.am | 8 | ||||
| -rwxr-xr-x | src/asdcp-info.cpp | 8 | ||||
| -rwxr-xr-x | src/j2c-test.cpp | 49 |
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 { @@ -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 @@ -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; + } } + */ } } |
