summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2010-11-15 17:04:13 +0000
committerjhurst <>2010-11-15 17:04:13 +0000
commit87d8df7af62597f68645cbb7b07cb130ab2a1adb (patch)
tree497d70ef10e1f222537eecf9a7c36794dc4a5724 /src
parentb6fd53ca44570ef077932b468402dc6797e71f95 (diff)
release!
Diffstat (limited to 'src')
-rwxr-xr-xsrc/AS_DCP_JP2K.cpp6
-rwxr-xr-xsrc/AS_DCP_MPEG2.cpp6
-rwxr-xr-xsrc/AS_DCP_PCM.cpp5
-rwxr-xr-xsrc/KLV.cpp6
-rwxr-xr-xsrc/KLV.h11
-rw-r--r--src/KM_xml.cpp12
-rw-r--r--src/MDD.cpp2
-rw-r--r--src/Makefile.am18
-rwxr-xr-xsrc/Metadata.cpp57
-rwxr-xr-xsrc/Metadata.h20
-rw-r--r--src/TimedText_Parser.cpp19
-rwxr-xr-xsrc/asdcp-test.cpp5
-rwxr-xr-xsrc/h__Writer.cpp3
-rwxr-xr-xsrc/klvwalk.cpp5
14 files changed, 156 insertions, 19 deletions
diff --git a/src/AS_DCP_JP2K.cpp b/src/AS_DCP_JP2K.cpp
index 58bc0c9..811ece6 100755
--- a/src/AS_DCP_JP2K.cpp
+++ b/src/AS_DCP_JP2K.cpp
@@ -842,9 +842,13 @@ lh__Writer::SetSourceStream(const PictureDescriptor& PDesc, const std::string& l
}
if ( ASDCP_SUCCESS(result) )
+ {
+ ui32_t TCFrameRate = ( m_PDesc.EditRate == EditRate_23_98 ) ? 24 : m_PDesc.EditRate.Numerator;
+
result = WriteMXFHeader(label, UL(m_Dict->ul(MDD_JPEG_2000Wrapping)),
PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
- LocalEditRate, 24 /* TCFrameRate */);
+ LocalEditRate, TCFrameRate);
+ }
return result;
}
diff --git a/src/AS_DCP_MPEG2.cpp b/src/AS_DCP_MPEG2.cpp
index 5801349..5bd998c 100755
--- a/src/AS_DCP_MPEG2.cpp
+++ b/src/AS_DCP_MPEG2.cpp
@@ -469,9 +469,13 @@ ASDCP::MPEG2::MXFWriter::h__Writer::SetSourceStream(const VideoDescriptor& VDesc
}
if ( ASDCP_SUCCESS(result) )
+ {
+ ui32_t TCFrameRate = ( m_VDesc.EditRate == EditRate_23_98 ) ? 24 : m_VDesc.EditRate.Numerator;
+
result = WriteMXFHeader(MPEG_PACKAGE_LABEL, UL(m_Dict->ul(MDD_MPEG2_VESWrapping)),
PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
- m_VDesc.EditRate, 24 /* TCFrameRate */);
+ m_VDesc.EditRate, TCFrameRate);
+ }
return result;
}
diff --git a/src/AS_DCP_PCM.cpp b/src/AS_DCP_PCM.cpp
index 4639c93..635c176 100755
--- a/src/AS_DCP_PCM.cpp
+++ b/src/AS_DCP_PCM.cpp
@@ -450,7 +450,6 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
assert(m_Dict);
m_ADesc = ADesc;
- ui32_t TCFrameRate = ( ADesc.EditRate == EditRate_23_98 ) ? 24 : m_ADesc.EditRate.Numerator;
Result_t result = PCM_ADesc_to_MD(m_ADesc, (WaveAudioDescriptor*)m_EssenceDescriptor);
@@ -462,9 +461,13 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
}
if ( ASDCP_SUCCESS(result) )
+ {
+ ui32_t TCFrameRate = ( m_ADesc.EditRate == EditRate_23_98 ) ? 24 : m_ADesc.EditRate.Numerator;
+
result = WriteMXFHeader(PCM_PACKAGE_LABEL, UL(m_Dict->ul(MDD_WAVWrapping)),
SOUND_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_SoundDataDef)),
m_ADesc.EditRate, TCFrameRate, calc_CBR_frame_size(m_Info, m_ADesc));
+ }
return result;
}
diff --git a/src/KLV.cpp b/src/KLV.cpp
index a91d32b..40fb442 100755
--- a/src/KLV.cpp
+++ b/src/KLV.cpp
@@ -56,6 +56,12 @@ ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len, const UL& la
}
//
+ASDCP::UL
+ASDCP::KLVPacket::GetUL() {
+ return UL(m_KeyStart);
+}
+
+//
ASDCP::Result_t
ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len)
{
diff --git a/src/KLV.h b/src/KLV.h
index 68d5a3c..a79ea91 100755
--- a/src/KLV.h
+++ b/src/KLV.h
@@ -150,7 +150,7 @@ inline const char* ui64sz(ui64_t i, char* buf)
Dictionary();
~Dictionary();
- bool operator==(const Dictionary& rhs) const { return this == &rhs; }
+ // bool operator==(const Dictionary& rhs) const { return this == &rhs; }
void Init();
bool AddEntry(const MDDEntry& Entry, ui32_t index);
@@ -201,6 +201,15 @@ inline const char* ui64sz(ui64_t i, char* buf)
return m_KLLength + m_ValueLength;
}
+ ui32_t ValueLength() {
+ return m_ValueLength;
+ }
+
+ ui32_t KLLength() {
+ return m_KLLength;
+ }
+
+ virtual UL GetUL();
virtual bool HasUL(const byte_t*);
virtual Result_t InitFromBuffer(const byte_t*, ui32_t);
virtual Result_t InitFromBuffer(const byte_t*, ui32_t, const UL& label);
diff --git a/src/KM_xml.cpp b/src/KM_xml.cpp
index a33d45c..44442d2 100644
--- a/src/KM_xml.cpp
+++ b/src/KM_xml.cpp
@@ -660,7 +660,11 @@ Kumu::XercesString_to_UTF_8(const XMLCh* in_str, std::string& out_str)
{
while ( str_len > 0 )
{
- ui32_t read_count = 0;
+#if XERCES_VERSION_MAJOR < 3
+ ui32_t read_count = 0;
+#else
+ XMLSize_t read_count = 0;
+#endif
ui32_t write_count = sg_coder->transcodeTo(in_str + read_total, str_len,
(XMLByte*)sg_coder_buf, sg_coder_buf_len,
read_count, XMLTranscoder::UnRep_Throw);
@@ -699,7 +703,11 @@ Kumu::UTF_8_to_XercesString(const char* in_str, Kumu::XercesString& out_str)
{
while ( str_len > 0 )
{
- ui32_t read_count = 0;
+#if XERCES_VERSION_MAJOR < 3
+ ui32_t read_count = 0;
+#else
+ XMLSize_t read_count = 0;
+#endif
ui32_t write_count = sg_coder->transcodeFrom((const XMLByte*)(in_str + read_total), str_len,
(XMLCh*)sg_coder_buf, sg_coder_buf_len / sizeof(XMLCh),
read_count, sg_coder_counts);
diff --git a/src/MDD.cpp b/src/MDD.cpp
index aabd4c9..aa53e35 100644
--- a/src/MDD.cpp
+++ b/src/MDD.cpp
@@ -98,7 +98,7 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
{ { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x07, // 20
0x02, 0x09, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00 },
{0}, false, "MICAlgorithm_HMAC_SHA1" },
- { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, // 21
+ { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 21
0x03, 0x01, 0x02, 0x10, 0x01, 0x00, 0x00, 0x00 },
{0}, false, "KLVFill" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, // 22
diff --git a/src/Makefile.am b/src/Makefile.am
index 85cb2a6..72ff916 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -83,7 +83,7 @@ libasdcp_la_CPPFLAGS = -DASDCP_PLATFORM=\"@host@\"
# Python extension
if PYTHON_USE
-lib_LTLIBRARIES += libpyasdcp.la
+lib_LTLIBRARIES += libpyasdcp.la libnapali.la
nodist_libpyasdcp_la_SOURCES = \
kumu_python.cpp kumu_python.h \
@@ -92,16 +92,21 @@ nodist_libpyasdcp_la_SOURCES = \
asdcp_python_misc.cpp asdcp_python_writerinfo.h \
asdcp_wrappers.h asdcp_python_mxf.cpp asdcp_python_mxf_text.cpp
-# asdcp_python_reader.cpp asdcp_python_writer.cpp
+nodist_libnapali_la_SOURCES = \
+ napali_python.cpp napali_python.h
libpyasdcp_la_CPPFLAGS = @PYTHON_CPPFLAGS@
libpyasdcp_la_LDFLAGS = @PYTHON_LSPEC@ -release @VERSION@
libpyasdcp_la_LIBADD = libkumu.la libasdcp.la
+libnapali_la_CPPFLAGS = @PYTHON_CPPFLAGS@
+libnapali_la_LDFLAGS = @PYTHON_LSPEC@ -release @VERSION@
+libnapali_la_LIBADD = libkumu.la libasdcp.la
+
pyexecdir = @PYTHON_EXECDIR@
pyexec_includedir = $(PYTHON_PREFIX)/include/python$(PYTHON_SHORTVERSION)
-nodist_pyexec_include_HEADERS = kumu_python.h asdcp_python.h asdcp_wrappers.h
-pyexec_LTLIBRARIES = kumu.la asdcp.la
+nodist_pyexec_include_HEADERS = kumu_python.h asdcp_python.h napali_python.h asdcp_wrappers.h
+pyexec_LTLIBRARIES = kumu.la asdcp.la napali.la
nodist_kumu_la_SOURCES = pykumu.cpp kumu_python.h
kumu_la_CPPFLAGS = @PYTHON_CPPFLAGS@
@@ -112,6 +117,11 @@ nodist_asdcp_la_SOURCES = pyasdcp.cpp kumu_python.h asdcp_python.h asdcp_wrapper
asdcp_la_CPPFLAGS = @PYTHON_CPPFLAGS@
asdcp_la_LDFLAGS = @PYTHON_LSPEC@ -avoid-version -module
asdcp_la_LIBADD = libpyasdcp.la
+
+nodist_napali_la_SOURCES = pynapali.cpp kumu_python.h napali_python.h
+napali_la_CPPFLAGS = @PYTHON_CPPFLAGS@
+napali_la_LDFLAGS = @PYTHON_LSPEC@ -avoid-version -module
+napali_la_LIBADD = libnapali.la libpyasdcp.la
endif
# list of programs to be built and installed
diff --git a/src/Metadata.cpp b/src/Metadata.cpp
index fccf5a6..aeedbde 100755
--- a/src/Metadata.cpp
+++ b/src/Metadata.cpp
@@ -68,6 +68,7 @@ static InterchangeObject* GenericDataEssenceDescriptor_Factory(const Dictionary*
static InterchangeObject* TimedTextDescriptor_Factory(const Dictionary*& Dict) { return new TimedTextDescriptor(Dict); }
static InterchangeObject* TimedTextResourceSubDescriptor_Factory(const Dictionary*& Dict) { return new TimedTextResourceSubDescriptor(Dict); }
static InterchangeObject* StereoscopicPictureSubDescriptor_Factory(const Dictionary*& Dict) { return new StereoscopicPictureSubDescriptor(Dict); }
+static InterchangeObject* NetworkLocator_Factory(const Dictionary*& Dict) { return new NetworkLocator(Dict); }
void
@@ -102,6 +103,7 @@ ASDCP::MXF::Metadata_InitTypes(const Dictionary*& Dict)
SetObjectFactory(Dict->ul(MDD_TimedTextDescriptor), TimedTextDescriptor_Factory);
SetObjectFactory(Dict->ul(MDD_TimedTextResourceSubDescriptor), TimedTextResourceSubDescriptor_Factory);
SetObjectFactory(Dict->ul(MDD_StereoscopicPictureSubDescriptor), StereoscopicPictureSubDescriptor_Factory);
+ SetObjectFactory(Dict->ul(MDD_NetworkLocator), NetworkLocator_Factory);
}
//------------------------------------------------------------------------------------------
@@ -1849,6 +1851,61 @@ StereoscopicPictureSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
return InterchangeObject::WriteToBuffer(Buffer);
}
+//------------------------------------------------------------------------------------------
+// NetworkLocator
+
+//
+ASDCP::Result_t
+NetworkLocator::InitFromTLVSet(TLVReader& TLVSet)
+{
+ assert(m_Dict);
+ Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(NetworkLocator, URLString));
+ return result;
+}
+
+//
+ASDCP::Result_t
+NetworkLocator::WriteToTLVSet(TLVWriter& TLVSet)
+{
+ assert(m_Dict);
+ Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(NetworkLocator, URLString));
+ return result;
+}
+
+//
+void
+NetworkLocator::Dump(FILE* stream)
+{
+ char identbuf[IdentBufferLen];
+ *identbuf = 0;
+
+ if ( stream == 0 )
+ stream = stderr;
+
+ InterchangeObject::Dump(stream);
+ fprintf(stream, " %22s = %s\n", "URLString", URLString.EncodeString(identbuf, IdentBufferLen));
+}
+
+//
+ASDCP::Result_t
+NetworkLocator::InitFromBuffer(const byte_t* p, ui32_t l)
+{
+ assert(m_Dict);
+ m_Typeinfo = &(m_Dict->Type(MDD_NetworkLocator));
+ return InterchangeObject::InitFromBuffer(p, l);
+}
+
+//
+ASDCP::Result_t
+NetworkLocator::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
+{
+ assert(m_Dict);
+ m_Typeinfo = &(m_Dict->Type(MDD_NetworkLocator));
+ return InterchangeObject::WriteToBuffer(Buffer);
+}
+
//
// end Metadata.cpp
//
diff --git a/src/Metadata.h b/src/Metadata.h
index 4c83034..891d155 100755
--- a/src/Metadata.h
+++ b/src/Metadata.h
@@ -683,6 +683,26 @@ namespace ASDCP
virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
};
+ //
+ class NetworkLocator : public InterchangeObject
+ {
+ ASDCP_NO_COPY_CONSTRUCT(NetworkLocator);
+ NetworkLocator();
+
+ public:
+ const Dictionary*& m_Dict;
+ UTF16String URLString;
+
+ NetworkLocator(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
+ virtual ~NetworkLocator() {}
+ virtual const char* HasName() { return "NetworkLocator"; }
+ virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
+ virtual Result_t WriteToTLVSet(TLVWriter& TLVSet);
+ virtual void Dump(FILE* = 0);
+ virtual Result_t InitFromBuffer(const byte_t* p, ui32_t l);
+ virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
+ };
+
} // namespace MXF
} // namespace ASDCP
diff --git a/src/TimedText_Parser.cpp b/src/TimedText_Parser.cpp
index 397fd51..191a353 100644
--- a/src/TimedText_Parser.cpp
+++ b/src/TimedText_Parser.cpp
@@ -233,9 +233,16 @@ ASDCP::TimedText::DCSubtitleParser::h__SubtitleParser::OpenRead()
m_TDesc.EditRate = decode_rational(EditRate->GetBody().c_str());
- if ( m_TDesc.EditRate != EditRate_24 && m_TDesc.EditRate != EditRate_48 )
+ if ( m_TDesc.EditRate != EditRate_23_98
+ && m_TDesc.EditRate != EditRate_24
+ && m_TDesc.EditRate != EditRate_25
+ && m_TDesc.EditRate != EditRate_30
+ && m_TDesc.EditRate != EditRate_48
+ && m_TDesc.EditRate != EditRate_50
+ && m_TDesc.EditRate != EditRate_60 )
{
- DefaultLogSink(). Error("EditRate must be 24/1 or 48/1\n");
+ DefaultLogSink(). Error("Unexpected EditRate: %d/%d\n",
+ m_TDesc.EditRate.Numerator, m_TDesc.EditRate.Denominator);
return RESULT_FORMAT;
}
@@ -296,11 +303,11 @@ ASDCP::TimedText::DCSubtitleParser::h__SubtitleParser::OpenRead()
return RESULT_FORMAT;
}
- // assumes 24/1 or 48/1 as constrained above
- assert(m_TDesc.EditRate.Denominator == 1);
+ // assumes edit rate is constrained above
+ ui32_t TCFrameRate = ( m_TDesc.EditRate == EditRate_23_98 ) ? 24 : m_TDesc.EditRate.Numerator;
S12MTimecode beginTC;
- beginTC.SetFPS(m_TDesc.EditRate.Numerator);
+ beginTC.SetFPS(TCFrameRate);
XMLElement* StartTime = m_Root.GetChildWithName("StartTime");
if ( StartTime != 0 )
@@ -308,7 +315,7 @@ ASDCP::TimedText::DCSubtitleParser::h__SubtitleParser::OpenRead()
for ( ei = InstanceList.begin(); ei != InstanceList.end(); ei++ )
{
- S12MTimecode tmpTC((*ei)->GetAttrWithName("TimeOut"), m_TDesc.EditRate.Numerator);
+ S12MTimecode tmpTC((*ei)->GetAttrWithName("TimeOut"), TCFrameRate);
if ( end_count < tmpTC.GetFrames() )
end_count = tmpTC.GetFrames();
}
diff --git a/src/asdcp-test.cpp b/src/asdcp-test.cpp
index 8b72ebc..d571922 100755
--- a/src/asdcp-test.cpp
+++ b/src/asdcp-test.cpp
@@ -176,7 +176,7 @@ Read/Write Options:\n\
is no label (valid for Interop only).\n\
-L - Write SMPTE UL values instead of MXF Interop\n\
-p <rate> - fps of picture when wrapping PCM or JP2K:\n\
- Use one of [23|24|48], 24 is default\n\
+ Use one of [23|24|25|30|48|50|60], 24 is default\n\
-R - Repeat the first frame over the entire file (picture\n\
essence only, requires -c, -d)\n\
-S - Split Wave essence to stereo WAV files during extract.\n\
@@ -286,6 +286,7 @@ public:
Rational PictureRate()
{
if ( picture_rate == 23 ) return EditRate_23_98;
+ if ( picture_rate == 24 ) return EditRate_24;
if ( picture_rate == 25 ) return EditRate_25;
if ( picture_rate == 30 ) return EditRate_30;
if ( picture_rate == 48 ) return EditRate_48;
@@ -298,6 +299,7 @@ public:
const char* szPictureRate()
{
if ( picture_rate == 23 ) return "23.976";
+ if ( picture_rate == 24 ) return "24";
if ( picture_rate == 25 ) return "25";
if ( picture_rate == 30 ) return "30";
if ( picture_rate == 48 ) return "48";
@@ -1356,6 +1358,7 @@ read_PCM_file(CommandOptions& Options)
if ( ADesc.EditRate != EditRate_23_98
&& ADesc.EditRate != EditRate_24
&& ADesc.EditRate != EditRate_25
+ && ADesc.EditRate != EditRate_30
&& ADesc.EditRate != EditRate_48
&& ADesc.EditRate != EditRate_50
&& ADesc.EditRate != EditRate_60 )
diff --git a/src/h__Writer.cpp b/src/h__Writer.cpp
index 2882e33..db263bb 100755
--- a/src/h__Writer.cpp
+++ b/src/h__Writer.cpp
@@ -548,6 +548,9 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte
{
BER_length = Kumu::get_BER_length_for_value(ETLength);
+ // the packet is longer by the difference in expected vs. actual BER length
+ ETLength += BER_length - MXF_BER_LENGTH;
+
if ( BER_length == 0 )
result = RESULT_KLV_CODING;
}
diff --git a/src/klvwalk.cpp b/src/klvwalk.cpp
index 6715060..92e7a3f 100755
--- a/src/klvwalk.cpp
+++ b/src/klvwalk.cpp
@@ -245,7 +245,8 @@ main(int argc, const char** argv)
{
Kumu::FileReader Reader;
KLVFilePacket KP;
-
+ ui64_t pos = 0;
+
result = Reader.OpenRead((*fi).c_str());
if ( ASDCP_SUCCESS(result) )
@@ -253,7 +254,9 @@ main(int argc, const char** argv)
while ( ASDCP_SUCCESS(result) )
{
+ fprintf(stdout, "@0x%08qx: ", pos);
KP.Dump(stdout, DefaultCompositeDict(), true);
+ pos = Reader.Tell();
result = KP.InitFromFile(Reader);
}