summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/AS_02_JXS.cpp38
-rwxr-xr-xsrc/AS_DCP_MXF.cpp4
-rw-r--r--src/as-02-info.cpp98
3 files changed, 125 insertions, 15 deletions
diff --git a/src/AS_02_JXS.cpp b/src/AS_02_JXS.cpp
index f8af21f..dd20c29 100644
--- a/src/AS_02_JXS.cpp
+++ b/src/AS_02_JXS.cpp
@@ -44,7 +44,7 @@ using Kumu::GenRandomValue;
//------------------------------------------------------------------------------------------
-static std::string JXS_PACKAGE_LABEL = "File Package: SMPTE ST 422 / ST 2124 frame wrapping of JPEG XS codestreams";
+static std::string JXS_PACKAGE_LABEL = "File Package: SMPTE ST 2124 frame wrapping of JPEG XS codestreams";
static std::string PICT_DEF_LABEL = "Image Track";
//------------------------------------------------------------------------------------------
@@ -351,18 +351,24 @@ AS_02::JXS::MXFWriter::h__Writer::OpenWrite(const std::string& filename,
m_IndexStrategy = IndexStrategy;
m_PartitionSpace = PartitionSpace_sec; // later converted to edit units by SetSourceStream()
m_HeaderSize = HeaderSize;
-
- if ( picture_descriptor.GetUL() != UL(m_Dict->ul(MDD_RGBAEssenceDescriptor))
- && picture_descriptor.GetUL() != UL(m_Dict->ul(MDD_CDCIEssenceDescriptor)) )
- {
- DefaultLogSink().Error("Essence descriptor is not a RGBAEssenceDescriptor or CDCIEssenceDescriptor.\n");
- picture_descriptor.Dump();
- return RESULT_AS02_FORMAT;
- }
-
- m_EssenceDescriptor = new ASDCP::MXF::GenericPictureEssenceDescriptor(m_Dict);
- m_EssenceDescriptor->Copy(picture_descriptor);
-
+
+ if ( picture_descriptor.GetUL() == UL(m_Dict->ul(MDD_RGBAEssenceDescriptor))) {
+ ASDCP::MXF::RGBAEssenceDescriptor *essence = new ASDCP::MXF::RGBAEssenceDescriptor(m_Dict);
+ ASDCP::MXF::RGBAEssenceDescriptor *mine = dynamic_cast<ASDCP::MXF::RGBAEssenceDescriptor *>(&picture_descriptor);
+ essence->Copy(*mine);
+ m_EssenceDescriptor = essence;
+ } else if ( picture_descriptor.GetUL() == UL(m_Dict->ul(MDD_CDCIEssenceDescriptor)) ) {
+ ASDCP::MXF::CDCIEssenceDescriptor *essence = new ASDCP::MXF::CDCIEssenceDescriptor(m_Dict);
+ ASDCP::MXF::CDCIEssenceDescriptor *mine = dynamic_cast<ASDCP::MXF::CDCIEssenceDescriptor *>(&picture_descriptor);
+ essence->Copy(*mine);
+ m_EssenceDescriptor = essence;
+ } else {
+ DefaultLogSink().Error("Essence descriptor is not a RGBAEssenceDescriptor or CDCIEssenceDescriptor.\n");
+ picture_descriptor.Dump();
+ return RESULT_AS02_FORMAT;
+ }
+
+
ASDCP::MXF::JPEGXSPictureSubDescriptor *jxs_subdesc = new ASDCP::MXF::JPEGXSPictureSubDescriptor(m_Dict);
jxs_subdesc->Copy(jxs_sub_descriptor);
@@ -393,14 +399,16 @@ AS_02::JXS::MXFWriter::h__Writer::SetSourceStream(const std::string& label, cons
if ( KM_SUCCESS(result) )
{
- UL wrapping_label = UL(m_Dict->ul(MDD_MXFGCP1FrameWrappedPictureElement));
+ UL wrapping_label = UL(m_Dict->ul(MDD_MXFGCFrameWrappedProgressiveJPEGXSPictures
+ /*MDD_MXFGCP1FrameWrappedPictureElement*/));
CDCIEssenceDescriptor *cdci_descriptor = dynamic_cast<CDCIEssenceDescriptor*>(m_EssenceDescriptor);
if ( cdci_descriptor )
{
if ( cdci_descriptor->FrameLayout ) // 0 == progressive, 1 == interlace
{
- wrapping_label = UL(m_Dict->ul(MDD_MXFGCI1FrameWrappedPictureElement));
+ wrapping_label = UL(m_Dict->ul(MDD_MXFGCFrameWrappedInterlacedJPEGXSPictures
+ /*MDD_MXFGCI1FrameWrappedPictureElement*/));
}
}
diff --git a/src/AS_DCP_MXF.cpp b/src/AS_DCP_MXF.cpp
index 129edf1..643e274 100755
--- a/src/AS_DCP_MXF.cpp
+++ b/src/AS_DCP_MXF.cpp
@@ -248,6 +248,10 @@ ASDCP::EssenceType(const std::string& filename, EssenceType_t& type, const Kumu:
{
type = ESS_AS02_JPEG_2000;
}
+ else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(JPEGXSPictureSubDescriptor))) )
+ {
+ type = ESS_AS02_JPEG_XS;
+ }
else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor), &md_object)) )
{
assert(md_object);
diff --git a/src/as-02-info.cpp b/src/as-02-info.cpp
index b9b281c..a1235ac 100644
--- a/src/as-02-info.cpp
+++ b/src/as-02-info.cpp
@@ -40,6 +40,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <AS_DCP.h>
#include <AS_02.h>
#include <AS_02_IAB.h>
+#include <AS_02_JXS.h>
#include <JP2K.h>
#include <AS_02_ACES.h>
#include <ACES.h>
@@ -592,6 +593,98 @@ class MyTextDescriptor : public TimedText::TimedTextDescriptor
}
};
+class MyJXSDescriptor
+{
+ RGBAEssenceDescriptor *m_RGBADescriptor;
+ CDCIEssenceDescriptor *m_CDCIDescriptor;
+ JPEGXSPictureSubDescriptor *m_JPEGXSSubDescriptor;
+public:
+ ui64_t ContainerDuration;
+ ASDCP::MXF::Rational m_SampleRate;
+ ASDCP::MXF::Rational m_EditRate;
+
+ public:
+ MyJXSDescriptor() :
+ m_RGBADescriptor(0),
+ m_CDCIDescriptor(0),
+ m_JPEGXSSubDescriptor(0),
+ ContainerDuration(0)
+ {}
+
+ void FillDescriptor(AS_02::JXS::MXFReader& Reader)
+ {
+ m_CDCIDescriptor = get_descriptor_by_type<AS_02::JXS::MXFReader, CDCIEssenceDescriptor>
+ (Reader, DefaultCompositeDict().ul(MDD_CDCIEssenceDescriptor));
+
+ m_RGBADescriptor = get_descriptor_by_type<AS_02::JXS::MXFReader, RGBAEssenceDescriptor>
+ (Reader, DefaultCompositeDict().ul(MDD_RGBAEssenceDescriptor));
+
+ if ( m_RGBADescriptor != 0 )
+ {
+ m_SampleRate = m_RGBADescriptor->SampleRate;
+ if ( ! m_RGBADescriptor->ContainerDuration.empty() )
+ {
+ ContainerDuration = m_RGBADescriptor->ContainerDuration;
+ }
+ }
+ else if ( m_CDCIDescriptor != 0 )
+ {
+ m_SampleRate = m_CDCIDescriptor->SampleRate;
+ if ( ! m_CDCIDescriptor->ContainerDuration.empty() )
+ {
+ ContainerDuration = m_CDCIDescriptor->ContainerDuration;
+ }
+ }
+ else
+ {
+ DefaultLogSink().Error("Picture descriptor not found.\n");
+ }
+
+ m_JPEGXSSubDescriptor = get_descriptor_by_type<AS_02::JXS::MXFReader, JPEGXSPictureSubDescriptor>
+ (Reader, DefaultCompositeDict().ul(MDD_JPEGXSPictureSubDescriptor));
+
+ if ( m_JPEGXSSubDescriptor == 0 )
+ {
+ DefaultLogSink().Error("JPEGXSPictureSubDescriptor not found.\n");
+ }
+
+ std::list<InterchangeObject*> ObjectList;
+ Reader.OP1aHeader().GetMDObjectsByType(DefaultCompositeDict().ul(MDD_Track), ObjectList);
+
+ if ( ObjectList.empty() )
+ {
+ DefaultLogSink().Error("MXF Metadata contains no Track Sets.\n");
+ }
+
+ m_EditRate = ((Track*)ObjectList.front())->EditRate;
+ }
+
+ void MyDump(FILE* stream) {
+ if ( stream == 0 )
+ {
+ stream = stderr;
+ }
+
+ if ( m_CDCIDescriptor != 0 )
+ {
+ m_CDCIDescriptor->Dump(stream);
+ }
+ else if ( m_RGBADescriptor != 0 )
+ {
+ m_RGBADescriptor->Dump(stream);
+ }
+ else
+ {
+ return;
+ }
+
+ if ( m_JPEGXSSubDescriptor != 0 )
+ {
+ m_JPEGXSSubDescriptor->Dump(stream);
+ }
+ }
+};
+
struct RateInfo
{
UL ul;
@@ -954,6 +1047,11 @@ show_file_info(CommandOptions& Options, const Kumu::IFileReaderFactory& fileRead
if ( ASDCP_SUCCESS(result) && Options.showcoding_flag )
wrapper.dump_WaveAudioDescriptor(stdout);
}
+ else if ( EssenceType == ESS_AS02_JPEG_XS )
+ {
+ FileInfoWrapper<AS_02::JXS::MXFReader, MyJXSDescriptor> wrapper(fileReaderFactory);
+ result = wrapper.file_info(Options, "JPEG XS");
+ }
else if ( EssenceType == ESS_AS02_IAB )
{
FileInfoWrapper<AS_02::IAB::MXFReader, MyIabDescriptor> wrapper(fileReaderFactory);