Change History
+2010.11.15 - bug fixes, enhancements x1.7.40
+ o Fixed bug in long KLV packet support (Thanks to Jim R.).
+ o Fixed AvgBps in PCM files, *again*. Sorry for the crazy.
+ o More fixes and changes in support of 25, 30, 50, 60 fps.
+ (Thanks to Hans K. for the TC rate bug).
+ o Updated KLVFill UL version element to 0x02.
+ o Type change to support Xerces-C 3.x. (Thanks to Matt S.).
+ o Some internal API changes to KLV types. Does not affect
+ operation.
+ o Added NetworkLocator type to MXF metadata types.
+ o Added file offset display to klvwalk.
2010.09.09 - bug fixes, enhancements, v1.7.39
# 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], [1.7.39], [asdcplib@cinecert.com])
+AC_INIT([asdcplib], [1.7.40], [asdcplib@cinecert.com])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_SRCDIR([src/KM_error.h])
}
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;
}
}
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;
}
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);
}
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;
}
return result;
}
+//
+ASDCP::UL
+ASDCP::KLVPacket::GetUL() {
+ return UL(m_KeyStart);
+}
+
//
ASDCP::Result_t
ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len)
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);
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);
{
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);
{
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);
{ { 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
# 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 \
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@
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
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
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);
}
//------------------------------------------------------------------------------------------
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
//
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
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;
}
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 )
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();
}
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\
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;
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";
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 )
{
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;
}
{
Kumu::FileReader Reader;
KLVFilePacket KP;
-
+ ui64_t pos = 0;
+
result = Reader.OpenRead((*fi).c_str());
if ( ASDCP_SUCCESS(result) )
while ( ASDCP_SUCCESS(result) )
{
+ fprintf(stdout, "@0x%08qx: ", pos);
KP.Dump(stdout, DefaultCompositeDict(), true);
+ pos = Reader.Tell();
result = KP.InitFromFile(Reader);
}