/// <summary> /// Named Reference key /// </summary> /// <param name="reader"></param> public MXFRefKey(MXFReader reader, UInt32 size, string name) : base(reader.Position) { this.Name = name; this.Key = new MXFKey(reader, size); this.Length = this.Key.Length; }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x3D0D: this.Emphasis = reader.ReadB(); return(true); case 0x3D0F: this.BlockStartOffset = reader.ReadW(); return(true); case 0x3D08: this.AuxiliaryBitsMode = reader.ReadB(); return(true); case 0x3D10: this.ChannelStatusMode = new byte[localTag.Size]; reader.Read(this.ChannelStatusMode, localTag.Size); return(true); case 0x3D11: this.FixedChannelStatusData = new byte[localTag.Size]; reader.Read(this.FixedChannelStatusData, localTag.Size); return(true); case 0x3D12: this.UserDataMode = new byte[localTag.Size]; reader.Read(this.UserDataMode, localTag.Size); return(true); case 0x3D13: this.FixedUserData = new byte[localTag.Size]; reader.Read(this.FixedUserData, localTag.Size); return(true); } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x3D0D: this.Emphasis = (MXFEmphasis)reader.ReadByte(); return(true); case 0x3D0F: this.BlockStartOffset = reader.ReadUInt16(); return(true); case 0x3D08: this.AuxiliaryBitsMode = (MXFAuxBitsMode)reader.ReadByte(); return(true); case 0x3D10: this.ChannelStatusMode = reader.ReadArray(reader.ReadChannelstatusMode, 8); return(true); case 0x3D11: this.FixedChannelStatusData = reader.ReadArray(reader.ReadByte, localTag.Size); return(true); case 0x3D12: this.UserDataMode = reader.ReadArray(reader.ReadUserDataMode, 2); return(true); case 0x3D13: this.FixedUserData = reader.ReadArray(reader.ReadByte, localTag.Size); return(true); } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { if (localTag.Key != null) { switch (localTag.Key) { case var _ when localTag.Key == bitRate_Key: this.BitRate = reader.ReadUInt32(); return(true); case var _ when localTag.Key == identicalGOPIndicator_Key: this.IdenticalGOPIndicator = reader.ReadBool(); return(true); case var _ when localTag.Key == maxGOPSize_Key: this.MaximumGOPSize = reader.ReadUInt16(); return(true); case var _ when localTag.Key == maxBPictureCount_Key: this.MaximumBPictureCount = reader.ReadUInt16(); return(true); case var _ when localTag.Key == constantBPictureFlag_Key: this.ConstantBPictureFlag = reader.ReadBool(); return(true); case var _ when localTag.Key == codedContentScanningKind_Key: this.CodedContentScanningKind = (MXFCodedContentScanning)reader.ReadByte(); return(true); case var _ when localTag.Key == profileAndLevel_Key: this.ProfileAndLevel = reader.ReadByte(); return(true); case var _ when localTag.Key == singleSequenceFlag_Key: this.SingleSequenceFlag = reader.ReadBool(); return(true); case var _ when localTag.Key == closedGOP_Key: this.ClosedGOPIndicator = reader.ReadBool(); return(true); case var _ when localTag.Key == lowDelay_Key: this.LowDelayIndicator = reader.ReadBool(); return(true); } } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x3301: this.ComponentDepth = reader.ReadD(); return(true); case 0x3302: this.HorizontalSubsampling = reader.ReadD(); return(true); case 0x3308: this.VerticalSubsampling = reader.ReadD(); return(true); case 0x3303: this.ColorSiting = reader.ReadB(); return(true); case 0x330B: this.ReversedByteOrder = reader.ReadBool(); return(true); case 0x3307: this.PaddingBits = (Int16)reader.ReadW(); return(true); case 0x3309: this.AlphaSampleDepth = reader.ReadD(); return(true); case 0x3304: this.BlackRefLevel = reader.ReadD(); return(true); case 0x3305: this.WhiteRefLevel = reader.ReadD(); return(true); case 0x3306: this.ColorRange = reader.ReadD(); return(true); } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Parse this tag /// </summary> /// <param name="reader"></param> public void Parse(MXFReader reader) { if (this.Size == 1) { this.Value = reader.ReadByte(); } else if (this.Size == 2) { this.Value = reader.ReadUInt16(); } else if (this.Size == 4) { this.Value = reader.ReadUInt32(); } else if (this.Size == 8) { this.Value = reader.ReadUInt64(); } else { byte[] data = new byte[this.Size]; for (int n = 0; n < this.Size; n++) { data[n] = reader.ReadByte(); } this.Value = data; } }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { if (localTag.Key != null) { switch (localTag.Key) { case var _ when localTag.Key == initMetadata_Key: this.VC1InitializationMetadata = reader.ReadArray(reader.ReadByte, localTag.Size); return(true); case var _ when localTag.Key == singleSequence_Key: this.VC1SingleSequence = reader.ReadBool(); return(true); case var _ when localTag.Key == codedContent_Key: this.VC1CodedContentType = (MXFCodedContentScanning)reader.ReadByte(); return(true); case var _ when localTag.Key == identicalGOP_Key: this.VC1IdenticalGOP = reader.ReadBool(); return(true); case var _ when localTag.Key == maxGOP_Key: this.VC1MaxGOP = reader.ReadUInt16(); return(true); case var _ when localTag.Key == pictureCount_Key: this.VC1BPictureCount = reader.ReadUInt16(); return(true); case var _ when localTag.Key == avgBitRate_Key: this.VC1AverageBitRate = reader.ReadUInt32(); return(true); case var _ when localTag.Key == maxBitRate_Key: this.VC1MaximumBitRate = reader.ReadUInt32(); return(true); case var _ when localTag.Key == profile_Key: this.VC1Profile = reader.ReadByte(); return(true); case var _ when localTag.Key == level_Key: this.VC1Level = reader.ReadByte(); return(true); } } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x3D0A: this.BlockAlign = reader.ReadW(); return(true); case 0x3D0B: this.SequenceOffset = reader.ReadB(); return(true); case 0x3D09: this.AveragesBytesPerSecond = reader.ReadD(); return(true); case 0x3D32: this.ChannelAssignment = reader.ReadKey(); return(true); case 0x3D29: this.PeakEnvelopeVersion = reader.ReadD(); return(true); case 0x3D2A: this.PeakEnvelopeFormat = reader.ReadD(); return(true); case 0x3D2B: this.PointsPerPeakValue = reader.ReadD(); return(true); case 0x3D2C: this.PeakEnvelopeBlockSize = reader.ReadD(); return(true); case 0x3D2D: this.PeakChannels = reader.ReadD(); return(true); case 0x3D2E: this.PeakFrames = reader.ReadD(); return(true); case 0x3D2F: this.PeakOfPeaksPosition = reader.ReadL(); return(true); case 0x3D30: this.PeakEnvelopeTimestamp = reader.ReadTimestamp(); return(true); case 0x3D31: this.PeakEnvelopeData = new byte[localTag.Size]; reader.Read(this.PeakEnvelopeData, localTag.Size); return(true); } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Create the KLV key /// </summary> /// <param name="reader"></param> public MXFKLV(MXFReader reader, MXFKey key) : base(reader) { this.Key = CreateAndValidateKey(reader); this.Length = DecodeBerLength(reader); this.DataOffset = reader.Position; }
/// <summary> /// Read a list of keys /// </summary> /// <param name="reader"></param> /// <param name="categoryName"></param> /// <returns></returns> protected UInt32 ReadKeyList(MXFReader reader, string categoryName, string singleItem) { MXFObject keylist = reader.ReadKeyList(categoryName, singleItem); this.AddChild(keylist); return((UInt32)keylist.ChildCount); }
/// <summary> /// Validate if the current position is a valid SMPTE key /// </summary> private MXFKey CreateAndValidateKey(MXFReader reader) { byte iso = reader.ReadB(); byte len = reader.ReadB(); byte smp = 0, te = 0; bool valid = false; if (iso == 0x06) // Do not check length when not iso { smp = reader.ReadB(); te = reader.ReadB(); valid = (smp == 0x2B && te == 0x34); // SMPTE define } if (!valid) { //throw new ApplicationException(string.Format("Invalid SMPTE Key found at offset {0}! Incorrect MXF file!", reader.Position - 4)); MXFKey key = new MXFKey(iso, len, smp, te, reader); LogError("Invalid SMPTE Key found at offset {0}! Key: {1}", reader.Position - 4, key.Name); return(key); } else { return(new MXFKey(iso, len, smp, te, reader)); } }
public MXFCDPFuture(MXFReader reader, byte sectionID) : base(reader) { this.SectionID = sectionID; this.Length = reader.ReadByte(); this.Data = reader.ReadArray(reader.ReadByte, (int)this.Length); }
public MXFEntryIndex(UInt64 index, MXFReader reader, byte?sliceCount, byte?posTableCount, UInt32 length) : base(reader) { this.m_eType = MXFObjectType.Index; this.Length = length; this.Index = index; this.TemporalOffset = reader.ReadSignedByte(); this.KeyFrameOffset = reader.ReadSignedByte(); this.Flags = new IndexEntryFlags(reader.ReadByte()); this.StreamOffset = reader.ReadUInt64(); if (sliceCount.HasValue && sliceCount.Value > 0) { this.SliceOffsets = new UInt32[sliceCount.Value]; for (int n = 0; n < sliceCount; n++) { this.SliceOffsets[n] = reader.ReadUInt32(); } } if (posTableCount.HasValue && posTableCount.Value > 0) { this.PosTable = new MXFRational[posTableCount.Value]; for (int n = 0; n < posTableCount; n++) { this.PosTable[n] = reader.ReadRational(); } } }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x3D03: this.AudioSamplingRate = reader.ReadRational(); return(true); case 0x3D02: this.Locked = reader.ReadBool(); return(true); case 0x3D04: this.AudioRefLevel = reader.ReadSignedByte(); return(true); case 0x3D05: this.ElectroSpatialFormulation = (MXFElectroSpatialFormulation)reader.ReadByte(); return(true); case 0x3D07: this.ChannelCount = reader.ReadUInt32(); return(true); case 0x3D01: this.QuantizationBits = reader.ReadUInt32(); return(true); case 0x3D0C: this.DialNorm = reader.ReadSignedByte(); return(true); case 0x3D06: this.SoundEssenceCoding = reader.ReadULKey(); return(true); case var _ when localTag.Key == refImageEditRate_Key: this.ReferenceImageEditRate = reader.ReadRational(); return(true); case var _ when localTag.Key == refAudioAlignmentLevel: this.ReferenceAudioAlignmentLevel = reader.ReadByte(); return(true); } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Decode the length /// </summary> /// <param name="reader"></param> private MXFBER DecodeBerLength(MXFReader reader) { long size = reader.ReadByte(); if (size <= 0x7F) { // short form, size = length return(new MXFBER(0, size)); } else if (size > 0x80) { // long form: size is number of octets following, 1 + x octets int additionalOctets = (int)size - 0x80; // SMPTE 379M 5.3.4 guarantee that additional octets must not exceed 8 bytes if (additionalOctets > 8) { LogWarning("KLV length has more than 8 octets (not valid according to SMPTE 379M 5.3.4) found at offset {0}!", reader.Position); } size = 0; for (int i = 0; i < additionalOctets; i++) { size = size << 8 | reader.ReadByte(); } return(new MXFBER(additionalOctets, size)); } else { // size is 0x80, which means indefinite LogWarning("KLV length having value 0x80 (=indefinite, not valid according to SMPTE 379M 5.3.4) found at offset {0}!", reader.Position); return(new MXFBER(-1, -1)); } }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x8007: this.LensAttributes = reader.ReadUTF8String(localTag.Size); return(true); case 0x8000: this.IrisFNumber = reader.ReadUInt16(); return(true); case 0x8001: this.FocusPositionFromImagePlane = reader.ReadUInt16(); return(true); case 0x8002: this.FocusPositionFromFrontLensVertex = reader.ReadUInt16(); return(true); case 0x8003: this.MacroSetting = reader.ReadBool(); return(true); case 0x8004: this.LensZoom35mmStillCameraEquivalent = reader.ReadUInt16(); return(true); case 0x8005: this.LensZoomActualFocalLength = reader.ReadUInt16(); return(true); case 0x8006: this.OpticalExtenderMagnification = reader.ReadUInt16(); return(true); case 0x8008: this.IrisTNumber = reader.ReadUInt16(); return(true); case 0x8009: this.IrisRingPosition = reader.ReadUInt16(); return(true); case 0x800a: this.FocusRingPosition = reader.ReadUInt16(); return(true); case 0x800b: this.ZoomRingPosition = reader.ReadUInt16(); return(true); } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Load the entire partition from disk (when not yet loaded) /// </summary> public void Load() { if (!this.IsLoaded) { MXFKLVFactory klvFactory = new MXFKLVFactory(); using (MXFReader reader = new MXFReader(this.File.Filename)) { // Seek just after this partition reader.Seek(this.DataOffset + this.Length); while (!reader.EOF) { MXFKLV klv = klvFactory.CreateObject(reader, this); if (klv.Key.Type == KeyType.Partition || klv.Key.Type == KeyType.RIP || klv.Key.Type == KeyType.PrimerPack) { break; // Next partition or other segment, quit reading } if (!this.Children.Any(a => a.Offset == klv.Offset)) { // Normal, just add the new child this.AddChild(klv); } // Next KLV please reader.Seek(klv.DataOffset + klv.Length); } } this.IsLoaded = true; } }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { if (localTag.Key != null) { switch (localTag.Key) { case var _ when localTag.Key == pictureFormatObject_Key: this.AddChild(reader.ReadReference <MXFDescriptiveObject>("PictureFormatObject")); return(true); case var _ when localTag.Key == projectObject_Key: this.AddChild(reader.ReadReference <MXFDescriptiveObject>("ProjectObject")); return(true); case var _ when localTag.Key == captionsDescriptionObjects_Key: this.AddChild(reader.ReadReferenceSet <MXFDescriptiveObject>("CaptionsDescriptionObjects", "CaptionsDescriptionObject")); return(true); case var _ when localTag.Key == contractObjects_Key: this.AddChild(reader.ReadReferenceSet <MXFDescriptiveObject>("ContractObjects", "ContractObject")); return(true); } } return(base.ParseLocalTag(reader, localTag)); }
public MXFANCPacket(MXFReader reader) : base(reader) { this.LineNumber = reader.ReadW(); this.WrappingType = (MXFANCWrappingType)reader.ReadB(); this.PayloadSamplingCoding = (MXFANCPayloadCoding)reader.ReadB(); this.PayloadSampleCount = reader.ReadW(); this.Length = this.PayloadSampleCount; if (this.PayloadSamplingCoding == MXFANCPayloadCoding.Coding_10_bit_luma_samples || this.PayloadSamplingCoding == MXFANCPayloadCoding.Coding_10_bit_color_difference_samples || this.PayloadSamplingCoding == MXFANCPayloadCoding.Coding_10_bit_luma_and_color_difference_samples) { this.Length = 4 * (this.PayloadSampleCount / 3); // 3 samples are stored in 4 bytes } // Skip 8 bytes (seems to be data but cannot find any meaning in the spec!) UInt32 unknownData1 = reader.ReadD(); UInt32 unknownData2 = reader.ReadD(); // Length Alignment this.Length = 4 * ((this.Length + 3) / 4); if (this.Length > 3) { // Read the DID this.DID = reader.ReadB(); this.SDID = reader.ReadB(); this.Size = reader.ReadB(); UInt16 combinedID = (UInt16)((((UInt16)this.DID) << 8) | this.SDID); if (m_DIDDescription.ContainsKey(combinedID)) { this.ContentDescription = m_DIDDescription[combinedID]; } else { this.ContentDescription = "<unknown content>"; } switch (combinedID) { case 0x6101: // CDP this.AddChild(new MXFCDPPacket(reader)); break; case 0x4105: // AFD break; case 0x4302: // OP47 break; default: // Read the real payload without the did/sdid/size this.Payload = new byte[this.Length - 3]; reader.Read(this.Payload, this.Length - 3); break; } } }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x3B02: this.LastModificationDate = reader.ReadTimestamp(); return(true); case 0x3B05: this.Version = reader.ReadVersion(); return(true); case 0x3B07: this.ObjectModelVersion = reader.ReadUInt32(); return(true); case 0x3B03: this.AddChild(reader.ReadReference <MXFContentStorage>("ContentStorage")); return(true); case 0x3B08: this.AddChild(reader.ReadReference <MXFGenericPackage>("PrimaryPackage")); return(true); case 0x3B09: this.OperationalPattern = reader.ReadULKey(); return(true); case 0x3B06: this.AddChild(reader.ReadReferenceSet <MXFIdentification>("Identifications", "Identification")); return(true); case 0x3B0A: this.AddChild(reader.ReadAUIDSet("EssenceContainers", "EssenceContainer")); return(true); // TODO review how the metadataschemes are read (especially if there are no schemes present) case 0x3B0B: this.AddChild(reader.ReadAUIDSet("Descriptive Metadata Schemes", "DM scheme")); return(true); case var _ when localTag.Key == isRIPPresent_Key: this.IsRIPPresent = reader.ReadBool(); return(true); } return(base.ParseLocalTag(reader, localTag)); }
public MXFAUID(MXFReader reader, string name) : base(reader.Position) { this.Name = name; this.Key = reader.ReadULKey(); this.Length = this.Key.Length; }
/// <summary> /// /// </summary> /// <param name="reader"></param> private void Initialize(MXFReader reader) { // Make sure we read at the data position reader.Seek(this.DataOffset); // Read all local tags long klvEnd = this.DataOffset + this.Length; while (reader.Position + 4 < klvEnd) { MXFLocalTag tag = new MXFLocalTag(reader); long next = tag.DataOffset + tag.Size; AddRefKeyFromPrimerPack(tag); // Allow derived classes to handle the data if (!ParseLocalTag(reader, tag)) { // Not processed, use default tag.Parse(reader); // Add to the collection AddChild(tag); } reader.Seek(next); } // Allow derived classes to do some final work PostInitialize(); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { } return(base.ParseLocalTag(reader, localTag)); }
public MXFMetadataBaseclass(MXFReader reader, MXFKLV headerKLV) : base(headerKLV, "MetaData", KeyType.MetaData) { this.m_eType = MXFObjectType.Meta; this.MetaDataName = "<unknown>"; Initialize(reader); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x3101: this.AIFCSummary = reader.ReadArray(reader.ReadByte, localTag.Size); return(true); } return(base.ParseLocalTag(reader, localTag)); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x4001: LocatorName = reader.ReadS(localTag.Size); return(true); } return(base.ParseLocalTag(reader, localTag)); }
public MXFEntryRIP(MXFReader reader) : base(reader) { this.m_eType = MXFObjectType.RIP; this.BodySID = reader.ReadD(); this.PartitionOffset = reader.ReadL(); this.Length = 12; // Fixed length }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x4701: this.AddChild(reader.ReadReference <MXFGenericDescriptor>("EssenceDescription")); return(true); } return(base.ParseLocalTag(reader, localTag)); }
public MXFMetadataBaseclass(MXFReader reader, MXFKLV headerKLV, string metaDataName) : base(headerKLV, "MetaData", KeyType.MetaData) { this.m_eType = MXFObjectType.Meta; this.MetaDataName = metaDataName; this.Key.Name = metaDataName; // TODO Correct?? Initialize(reader); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x4101: LocationName = reader.ReadUTF16String(localTag.Size); return(true); } return(base.ParseLocalTag(reader, localTag)); }