FIPS 186-2 fixes
[asdcplib.git] / src / Metadata.h
index 035dfd3ef793d7420f4a26c24523698cf7c1ff23..4c83034c1a68275407ce2c95d4c998407c8df90f 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2007, John Hurst
+Copyright (c) 2005-2009, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -38,7 +38,7 @@ namespace ASDCP
 {
   namespace MXF
     {
-      void Metadata_InitTypes();
+      void Metadata_InitTypes(const Dictionary*& Dict);
 
       //
 
@@ -46,8 +46,10 @@ namespace ASDCP
       class Identification : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(Identification);
+         Identification();
 
        public:
+         const Dictionary*& m_Dict;
           UUID ThisGenerationUID;
           UTF16String CompanyName;
           UTF16String ProductName;
@@ -58,7 +60,7 @@ namespace ASDCP
           VersionType ToolkitVersion;
           UTF16String Platform;
 
-         Identification() {}
+  Identification(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
          virtual ~Identification() {}
           virtual const char* HasName() { return "Identification"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -72,12 +74,14 @@ namespace ASDCP
       class ContentStorage : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(ContentStorage);
+         ContentStorage();
 
        public:
+         const Dictionary*& m_Dict;
           Batch<UUID> Packages;
           Batch<UUID> EssenceContainerData;
 
-         ContentStorage() {}
+  ContentStorage(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
          virtual ~ContentStorage() {}
           virtual const char* HasName() { return "ContentStorage"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -91,13 +95,15 @@ namespace ASDCP
       class EssenceContainerData : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(EssenceContainerData);
+         EssenceContainerData();
 
        public:
+         const Dictionary*& m_Dict;
           UMID LinkedPackageUID;
           ui32_t IndexSID;
           ui32_t BodySID;
 
-         EssenceContainerData() : IndexSID(0), BodySID(0) {}
+  EssenceContainerData(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), IndexSID(0), BodySID(0) {}
          virtual ~EssenceContainerData() {}
           virtual const char* HasName() { return "EssenceContainerData"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -111,15 +117,17 @@ namespace ASDCP
       class GenericPackage : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(GenericPackage);
+         GenericPackage();
 
        public:
+         const Dictionary*& m_Dict;
           UMID PackageUID;
           UTF16String Name;
           Timestamp PackageCreationDate;
           Timestamp PackageModifiedDate;
           Batch<UUID> Tracks;
 
-         GenericPackage() {}
+  GenericPackage(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
          virtual ~GenericPackage() {}
           virtual const char* HasName() { return "GenericPackage"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -131,10 +139,12 @@ namespace ASDCP
       class MaterialPackage : public GenericPackage
        {
          ASDCP_NO_COPY_CONSTRUCT(MaterialPackage);
+         MaterialPackage();
 
        public:
+         const Dictionary*& m_Dict;
 
-         MaterialPackage() {}
+  MaterialPackage(const Dictionary*& d) : GenericPackage(d), m_Dict(d) {}
          virtual ~MaterialPackage() {}
           virtual const char* HasName() { return "MaterialPackage"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -148,11 +158,13 @@ namespace ASDCP
       class SourcePackage : public GenericPackage
        {
          ASDCP_NO_COPY_CONSTRUCT(SourcePackage);
+         SourcePackage();
 
        public:
+         const Dictionary*& m_Dict;
           UUID Descriptor;
 
-         SourcePackage() {}
+  SourcePackage(const Dictionary*& d) : GenericPackage(d), m_Dict(d) {}
          virtual ~SourcePackage() {}
           virtual const char* HasName() { return "SourcePackage"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -166,14 +178,16 @@ namespace ASDCP
       class GenericTrack : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(GenericTrack);
+         GenericTrack();
 
        public:
+         const Dictionary*& m_Dict;
           ui32_t TrackID;
           ui32_t TrackNumber;
           UTF16String TrackName;
           UUID Sequence;
 
-         GenericTrack() : TrackID(0), TrackNumber(0) {}
+  GenericTrack(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), TrackID(0), TrackNumber(0) {}
          virtual ~GenericTrack() {}
           virtual const char* HasName() { return "GenericTrack"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -185,10 +199,12 @@ namespace ASDCP
       class StaticTrack : public GenericTrack
        {
          ASDCP_NO_COPY_CONSTRUCT(StaticTrack);
+         StaticTrack();
 
        public:
+         const Dictionary*& m_Dict;
 
-         StaticTrack() {}
+  StaticTrack(const Dictionary*& d) : GenericTrack(d), m_Dict(d) {}
          virtual ~StaticTrack() {}
           virtual const char* HasName() { return "StaticTrack"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -202,12 +218,14 @@ namespace ASDCP
       class Track : public GenericTrack
        {
          ASDCP_NO_COPY_CONSTRUCT(Track);
+         Track();
 
        public:
+         const Dictionary*& m_Dict;
           Rational EditRate;
           ui64_t Origin;
 
-         Track() : Origin(0) {}
+  Track(const Dictionary*& d) : GenericTrack(d), m_Dict(d), Origin(0) {}
          virtual ~Track() {}
           virtual const char* HasName() { return "Track"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -221,12 +239,14 @@ namespace ASDCP
       class StructuralComponent : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(StructuralComponent);
+         StructuralComponent();
 
        public:
+         const Dictionary*& m_Dict;
           UL DataDefinition;
           ui64_t Duration;
 
-         StructuralComponent() : Duration(0) {}
+  StructuralComponent(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), Duration(0) {}
          virtual ~StructuralComponent() {}
           virtual const char* HasName() { return "StructuralComponent"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -238,11 +258,13 @@ namespace ASDCP
       class Sequence : public StructuralComponent
        {
          ASDCP_NO_COPY_CONSTRUCT(Sequence);
+         Sequence();
 
        public:
+         const Dictionary*& m_Dict;
           Batch<UUID> StructuralComponents;
 
-         Sequence() {}
+  Sequence(const Dictionary*& d) : StructuralComponent(d), m_Dict(d) {}
          virtual ~Sequence() {}
           virtual const char* HasName() { return "Sequence"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -256,13 +278,15 @@ namespace ASDCP
       class SourceClip : public StructuralComponent
        {
          ASDCP_NO_COPY_CONSTRUCT(SourceClip);
+         SourceClip();
 
        public:
+         const Dictionary*& m_Dict;
           ui64_t StartPosition;
           UMID SourcePackageID;
           ui32_t SourceTrackID;
 
-         SourceClip() : StartPosition(0), SourceTrackID(0) {}
+  SourceClip(const Dictionary*& d) : StructuralComponent(d), m_Dict(d), StartPosition(0), SourceTrackID(0) {}
          virtual ~SourceClip() {}
           virtual const char* HasName() { return "SourceClip"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -276,13 +300,15 @@ namespace ASDCP
       class TimecodeComponent : public StructuralComponent
        {
          ASDCP_NO_COPY_CONSTRUCT(TimecodeComponent);
+         TimecodeComponent();
 
        public:
+         const Dictionary*& m_Dict;
           ui16_t RoundedTimecodeBase;
           ui64_t StartTimecode;
           ui8_t DropFrame;
 
-         TimecodeComponent() : RoundedTimecodeBase(0), StartTimecode(0), DropFrame(0) {}
+  TimecodeComponent(const Dictionary*& d) : StructuralComponent(d), m_Dict(d), RoundedTimecodeBase(0), StartTimecode(0), DropFrame(0) {}
          virtual ~TimecodeComponent() {}
           virtual const char* HasName() { return "TimecodeComponent"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -296,12 +322,14 @@ namespace ASDCP
       class GenericDescriptor : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(GenericDescriptor);
+         GenericDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           Batch<UUID> Locators;
           Batch<UUID> SubDescriptors;
 
-         GenericDescriptor() {}
+  GenericDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
          virtual ~GenericDescriptor() {}
           virtual const char* HasName() { return "GenericDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -313,15 +341,17 @@ namespace ASDCP
       class FileDescriptor : public GenericDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(FileDescriptor);
+         FileDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           ui32_t LinkedTrackID;
           Rational SampleRate;
           ui64_t ContainerDuration;
           UL EssenceContainer;
           UL Codec;
 
-         FileDescriptor() : LinkedTrackID(0), ContainerDuration(0) {}
+  FileDescriptor(const Dictionary*& d) : GenericDescriptor(d), m_Dict(d), LinkedTrackID(0), ContainerDuration(0) {}
          virtual ~FileDescriptor() {}
           virtual const char* HasName() { return "FileDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -335,8 +365,10 @@ namespace ASDCP
       class GenericSoundEssenceDescriptor : public FileDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(GenericSoundEssenceDescriptor);
+         GenericSoundEssenceDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           Rational AudioSamplingRate;
           ui8_t Locked;
           ui8_t AudioRefLevel;
@@ -344,7 +376,7 @@ namespace ASDCP
           ui32_t QuantizationBits;
           ui8_t DialNorm;
 
-         GenericSoundEssenceDescriptor() : Locked(0), AudioRefLevel(0), ChannelCount(0), QuantizationBits(0), DialNorm(0) {}
+  GenericSoundEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), Locked(0), AudioRefLevel(0), ChannelCount(0), QuantizationBits(0), DialNorm(0) {}
          virtual ~GenericSoundEssenceDescriptor() {}
           virtual const char* HasName() { return "GenericSoundEssenceDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -358,13 +390,16 @@ namespace ASDCP
       class WaveAudioDescriptor : public GenericSoundEssenceDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(WaveAudioDescriptor);
+         WaveAudioDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           ui16_t BlockAlign;
           ui8_t SequenceOffset;
           ui32_t AvgBps;
+          UL ChannelAssignment;
 
-         WaveAudioDescriptor() : BlockAlign(0), SequenceOffset(0), AvgBps(0) {}
+  WaveAudioDescriptor(const Dictionary*& d) : GenericSoundEssenceDescriptor(d), m_Dict(d), BlockAlign(0), SequenceOffset(0), AvgBps(0) {}
          virtual ~WaveAudioDescriptor() {}
           virtual const char* HasName() { return "WaveAudioDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -378,14 +413,17 @@ namespace ASDCP
       class GenericPictureEssenceDescriptor : public FileDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(GenericPictureEssenceDescriptor);
+         GenericPictureEssenceDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           ui8_t FrameLayout;
           ui32_t StoredWidth;
           ui32_t StoredHeight;
           Rational AspectRatio;
+          UL PictureEssenceCoding;
 
-         GenericPictureEssenceDescriptor() : FrameLayout(0), StoredWidth(0), StoredHeight(0) {}
+  GenericPictureEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), FrameLayout(0), StoredWidth(0), StoredHeight(0) {}
          virtual ~GenericPictureEssenceDescriptor() {}
           virtual const char* HasName() { return "GenericPictureEssenceDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -399,12 +437,14 @@ namespace ASDCP
       class RGBAEssenceDescriptor : public GenericPictureEssenceDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(RGBAEssenceDescriptor);
+         RGBAEssenceDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           ui32_t ComponentMaxRef;
           ui32_t ComponentMinRef;
 
-         RGBAEssenceDescriptor() : ComponentMaxRef(0), ComponentMinRef(0) {}
+  RGBAEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentMaxRef(0), ComponentMinRef(0) {}
          virtual ~RGBAEssenceDescriptor() {}
           virtual const char* HasName() { return "RGBAEssenceDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -418,8 +458,10 @@ namespace ASDCP
       class JPEG2000PictureSubDescriptor : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(JPEG2000PictureSubDescriptor);
+         JPEG2000PictureSubDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           ui16_t Rsize;
           ui32_t Xsize;
           ui32_t Ysize;
@@ -434,7 +476,7 @@ namespace ASDCP
           Raw CodingStyleDefault;
           Raw QuantizationDefault;
 
-         JPEG2000PictureSubDescriptor() : Rsize(0), Xsize(0), Ysize(0), XOsize(0), YOsize(0), XTsize(0), YTsize(0), XTOsize(0), YTOsize(0), Csize(0) {}
+  JPEG2000PictureSubDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), Rsize(0), Xsize(0), Ysize(0), XOsize(0), YOsize(0), XTsize(0), YTsize(0), XTOsize(0), YTOsize(0), Csize(0) {}
          virtual ~JPEG2000PictureSubDescriptor() {}
           virtual const char* HasName() { return "JPEG2000PictureSubDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -448,14 +490,16 @@ namespace ASDCP
       class CDCIEssenceDescriptor : public GenericPictureEssenceDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(CDCIEssenceDescriptor);
+         CDCIEssenceDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           ui32_t ComponentDepth;
           ui32_t HorizontalSubsampling;
           ui32_t VerticalSubsampling;
           ui8_t ColorSiting;
 
-         CDCIEssenceDescriptor() : ComponentDepth(0), HorizontalSubsampling(0), VerticalSubsampling(0), ColorSiting(0) {}
+  CDCIEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentDepth(0), HorizontalSubsampling(0), VerticalSubsampling(0), ColorSiting(0) {}
          virtual ~CDCIEssenceDescriptor() {}
           virtual const char* HasName() { return "CDCIEssenceDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -469,14 +513,16 @@ namespace ASDCP
       class MPEG2VideoDescriptor : public CDCIEssenceDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(MPEG2VideoDescriptor);
+         MPEG2VideoDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           ui8_t CodedContentType;
           ui8_t LowDelay;
           ui32_t BitRate;
           ui8_t ProfileAndLevel;
 
-         MPEG2VideoDescriptor() : CodedContentType(0), LowDelay(0), BitRate(0), ProfileAndLevel(0) {}
+  MPEG2VideoDescriptor(const Dictionary*& d) : CDCIEssenceDescriptor(d), m_Dict(d), CodedContentType(0), LowDelay(0), BitRate(0), ProfileAndLevel(0) {}
          virtual ~MPEG2VideoDescriptor() {}
           virtual const char* HasName() { return "MPEG2VideoDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -490,15 +536,17 @@ namespace ASDCP
       class DMSegment : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(DMSegment);
+         DMSegment();
 
        public:
+         const Dictionary*& m_Dict;
           UL DataDefinition;
           ui64_t EventStartPosition;
           ui64_t Duration;
           UTF16String EventComment;
           UUID DMFramework;
 
-         DMSegment() : EventStartPosition(0), Duration(0) {}
+  DMSegment(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), EventStartPosition(0), Duration(0) {}
          virtual ~DMSegment() {}
           virtual const char* HasName() { return "DMSegment"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -512,11 +560,13 @@ namespace ASDCP
       class CryptographicFramework : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(CryptographicFramework);
+         CryptographicFramework();
 
        public:
+         const Dictionary*& m_Dict;
           UUID ContextSR;
 
-         CryptographicFramework() {}
+  CryptographicFramework(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
          virtual ~CryptographicFramework() {}
           virtual const char* HasName() { return "CryptographicFramework"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -530,15 +580,17 @@ namespace ASDCP
       class CryptographicContext : public InterchangeObject
        {
          ASDCP_NO_COPY_CONSTRUCT(CryptographicContext);
+         CryptographicContext();
 
        public:
+         const Dictionary*& m_Dict;
           UUID ContextID;
           UL SourceEssenceContainer;
           UL CipherAlgorithm;
           UL MICAlgorithm;
           UUID CryptographicKeyID;
 
-         CryptographicContext() {}
+  CryptographicContext(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
          virtual ~CryptographicContext() {}
           virtual const char* HasName() { return "CryptographicContext"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -552,11 +604,13 @@ namespace ASDCP
       class GenericDataEssenceDescriptor : public FileDescriptor
        {
          ASDCP_NO_COPY_CONSTRUCT(GenericDataEssenceDescriptor);
+         GenericDataEssenceDescriptor();
 
        public:
+         const Dictionary*& m_Dict;
           UL DataEssenceCoding;
 
-         GenericDataEssenceDescriptor() {}
+  GenericDataEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d) {}
          virtual ~GenericDataEssenceDescriptor() {}
           virtual const char* HasName() { return "GenericDataEssenceDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
@@ -567,18 +621,20 @@ namespace ASDCP
        };
 
       //
-      class DCTimedTextDescriptor : public GenericDataEssenceDescriptor
+      class TimedTextDescriptor : public GenericDataEssenceDescriptor
        {
-         ASDCP_NO_COPY_CONSTRUCT(DCTimedTextDescriptor);
+         ASDCP_NO_COPY_CONSTRUCT(TimedTextDescriptor);
+         TimedTextDescriptor();
 
        public:
-         UUID AssetID;
-          UTF16String UTFEncoding;
-          UTF16String RootNamespaceName;
+         const Dictionary*& m_Dict;
+          UUID ResourceID;
+          UTF16String UCSEncoding;
+          UTF16String NamespaceURI;
 
-         DCTimedTextDescriptor() {}
-         virtual ~DCTimedTextDescriptor() {}
-          virtual const char* HasName() { return "DCTimedTextDescriptor"; }
+  TimedTextDescriptor(const Dictionary*& d) : GenericDataEssenceDescriptor(d), m_Dict(d) {}
+         virtual ~TimedTextDescriptor() {}
+          virtual const char* HasName() { return "TimedTextDescriptor"; }
           virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
           virtual Result_t WriteToTLVSet(TLVWriter& TLVSet);
          virtual void     Dump(FILE* = 0);
@@ -587,24 +643,46 @@ namespace ASDCP
        };
 
       //
-      class DCTimedTextResourceDescriptor : public InterchangeObject
+      class TimedTextResourceSubDescriptor : public InterchangeObject
        {
-         ASDCP_NO_COPY_CONSTRUCT(DCTimedTextResourceDescriptor);
+         ASDCP_NO_COPY_CONSTRUCT(TimedTextResourceSubDescriptor);
+         TimedTextResourceSubDescriptor();
 
        public:
-          UUID ResourceID;
-          UTF16String ResourceMIMEType;
-          ui32_t ResourceSID;
+         const Dictionary*& m_Dict;
+          UUID AncillaryResourceID;
+          UTF16String MIMEMediaType;
+          ui32_t EssenceStreamID;
+
+  TimedTextResourceSubDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), EssenceStreamID(0) {}
+         virtual ~TimedTextResourceSubDescriptor() {}
+          virtual const char* HasName() { return "TimedTextResourceSubDescriptor"; }
+          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&);
+       };
+
+      //
+      class StereoscopicPictureSubDescriptor : public InterchangeObject
+       {
+         ASDCP_NO_COPY_CONSTRUCT(StereoscopicPictureSubDescriptor);
+         StereoscopicPictureSubDescriptor();
 
-         DCTimedTextResourceDescriptor() : ResourceSID(0) {}
-         virtual ~DCTimedTextResourceDescriptor() {}
-          virtual const char* HasName() { return "DCTimedTextResourceDescriptor"; }
+       public:
+         const Dictionary*& m_Dict;
+
+  StereoscopicPictureSubDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
+         virtual ~StereoscopicPictureSubDescriptor() {}
+          virtual const char* HasName() { return "StereoscopicPictureSubDescriptor"; }
           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