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 0x2701: this.LinkedPackageUID = reader.ReadUMIDKey(); return(true); case 0x3F06: this.IndexSID = reader.ReadD(); return(true); case 0x3F07: this.BodySID = reader.ReadD(); 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 0x4801: this.TrackID = reader.ReadD(); return(true); case 0x4802: this.TrackName = reader.ReadS(localTag.Size); return(true); case 0x4803: this.Sequence = reader.ReadRefKey(); return(true); case 0x4804: this.TrackNumber = reader.ReadD(); return(true); } return(base.ParseLocalTag(reader, localTag)); }
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.ReadsB(); this.KeyFrameOffset = reader.ReadsB(); this.Flags = reader.ReadB(); this.StreamOffset = reader.ReadL(); if (sliceCount.HasValue && sliceCount.Value > 0) { this.SliceOffsets = new UInt32[sliceCount.Value]; for (int n = 0; n < sliceCount; n++) { this.SliceOffsets[n] = reader.ReadD(); } } 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> /// Parse this tag /// </summary> /// <param name="reader"></param> public void Parse(MXFReader reader) { if (this.Size == 1) { this.Value = reader.ReadB(); } else if (this.Size == 2) { this.Value = reader.ReadW(); } else if (this.Size == 4) { this.Value = reader.ReadD(); } else if (this.Size == 8) { this.Value = reader.ReadL(); } else { byte[] data = new byte[this.Size]; for (int n = 0; n < this.Size; n++) { data[n] = reader.ReadB(); } this.Value = data; } }
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 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> /// 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)); }
public MXFPartition(MXFReader reader, MXFKLV headerKLV) : base(headerKLV, "Partition", KeyType.Partition) { this.m_eType = MXFObjectType.Partition; // Determine the partition type switch (this.Key[13]) { case 2: this.PartitionType = PartitionType.Header; break; case 3: this.PartitionType = PartitionType.Body; break; case 4: this.PartitionType = PartitionType.Footer; break; default: this.PartitionType = PartitionType.Unknown; Log(MXFLogType.Error, "unknown partition type"); break; } this.Closed = (this.PartitionType == PartitionType.Footer) || (this.Key[14] & 0x01) == 0x00; this.Complete = (this.Key[14] > 2); // Make sure we read at the data position reader.Seek(this.DataOffset); reader.ReadD(); // Skip 4 bytes this.KagSize = reader.ReadD(); this.ThisPartition = reader.ReadL(); this.PreviousPartition = reader.ReadL(); this.FooterPartition = reader.ReadL(); this.HeaderByteCount = reader.ReadL(); this.IndexByteCount = reader.ReadL(); this.IndexSID = reader.ReadD(); this.BodyOffset = reader.ReadL(); this.BodySID = reader.ReadD(); this.OP = new MXFKey(reader, 16); MXFObject essenceContainers = reader.ReadKeyList("Essence Containers", "Essence Container"); this.AddChild(essenceContainers); }
public MXFEntryDelta(MXFReader reader, UInt32 length) : base(reader) { this.m_eType = MXFObjectType.Index; this.Length = length; this.PosTableIndex = reader.ReadsB(); this.Slice = reader.ReadB(); this.ElementDelta = reader.ReadD(); }
/// <summary> /// Read partition tag list /// </summary> /// <param name="reader"></param> /// <param name="categoryName"></param> /// <returns></returns> protected UInt32 ReadTagList(MXFReader reader, string categoryName) { UInt32 nofItems = reader.ReadD(); UInt32 objectSize = reader.ReadD(); // useless size of objects, always 16 according to specs MXFObject keylist = new MXFNamedObject(categoryName, reader.Position); if (nofItems > 0 && nofItems < UInt32.MaxValue) { m_PrimerKeys = new Dictionary <UInt16, MXFEntryPrimer>(); for (int n = 0; n < nofItems; n++) { MXFEntryPrimer entry = new MXFEntryPrimer(reader); m_PrimerKeys.Add(entry.LocalTag, entry); // Add to our own internal list keylist.AddChild(entry); // And add the entry as one of our children } } this.AddChild(keylist); return(nofItems); }
/// <summary> /// Overridden method to process local tags /// </summary> /// <param name="localTag"></param> protected override bool ParseLocalTag(MXFReader reader, MXFLocalTag localTag) { switch (localTag.Tag) { case 0x1201: this.StartPosition = reader.ReadL(); return(true); case 0x1101: this.SourcePackageID = reader.ReadUMIDKey(); return(true); case 0x1102: this.SourceTrackId = reader.ReadD(); 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 0x3D03: this.AudioSamplingRate = reader.ReadRational(); return(true); case 0x3D02: this.Locked = reader.ReadBool(); return(true); case 0x3D04: this.AudioRefLevel = reader.ReadsB(); return(true); case 0x3D05: this.ElectroSpatialFormulation = reader.ReadB(); return(true); case 0x3D07: this.ChannelCount = reader.ReadD(); return(true); case 0x3D01: this.QuantizationBits = reader.ReadD(); return(true); case 0x3D0C: this.DialNorm = reader.ReadsB(); return(true); case 0x3D06: this.SoundEssenceCoding = reader.ReadKey(); 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 0x3406: this.ComponentMaxRef = reader.ReadD(); return(true); case 0x3407: this.ComponentMinRef = reader.ReadD(); return(true); case 0x3408: this.AlphaMaxRef = reader.ReadD(); return(true); case 0x3409: this.AlphaMinRef = reader.ReadD(); return(true); case 0x3405: this.ScanningDirection = reader.ReadB(); return(true); case 0x3401: this.PixelLayout = reader.ReadW(); return(true); case 0x3403: this.Palette = reader.ReadS(localTag.Size); return(true); // TODO case 0x3404: this.PaletteLayout = reader.ReadS(localTag.Size); return(true); // TODO } 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 0x3006: this.LinkedTrackId = reader.ReadD(); return(true); case 0x3001: this.SampleRate = reader.ReadRational(); return(true); case 0x3002: this.ContainerDuration = reader.ReadL(); return(true); case 0x3004: this.EssenceContainer = reader.ReadKey(); return(true); case 0x3005: this.Codec = reader.ReadKey(); return(true); } return(base.ParseLocalTag(reader, localTag)); }
public MXFPackageMetaData(MXFReader reader, MXFKLV headerKLV) : base(headerKLV, "PackageMetadata", KeyType.PackageMetaDataSet) { this.m_eType = MXFObjectType.Essence; // I will count this as essence data if (this.Key[5] == 0x63) { nofSizeSize = 4; } switch (this.Key[14]) { case 0x02: this.Key.Name = "Package Metadata set"; break; case 0x03: this.Key.Name = "Picture Metadata set"; break; case 0x04: this.Key.Name = "Sound Metadata set"; break; case 0x05: this.Key.Name = "Data Metadata set"; break; case 0x06: this.Key.Name = "Control Metadata set"; break; } reader.Seek(this.DataOffset); // Seek to the start of the data long end = this.DataOffset + this.Length; while (reader.Position < end) { byte type = reader.ReadB(); UInt32 size = 0; if (nofSizeSize == 2) { size = reader.ReadW(); } else { size = reader.ReadD(); } long startPos = reader.Position; if (m_itemTypes.ContainsKey(type)) { this.AddChild(new MXFData(m_itemTypes[type], reader, size)); } reader.Seek(startPos + size); } }
/// <summary> /// Try to locate the RIP /// </summary> private bool ReadRIP(MXFKLVFactory klvFactory) { if (this.RIP == null) { // Read the last 4 bytes of the file m_reader.Seek(this.Filesize - 4); uint ripSize = m_reader.ReadD(); if (ripSize < this.Filesize && ripSize >= 4) // At least 4 bytes { m_reader.Seek(this.Filesize - ripSize); MXFKLV klv = klvFactory.CreateObject(m_reader, null); if (klv.Key.Type == KeyType.RIP) { // Yes, RIP found this.AddChild(klv); this.RIP = klv as MXFRIP; return(true); } } } return(false); }
/// <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.ReadW(); return(true); case 0x3B07: this.ObjectModelVersion = reader.ReadD(); return(true); case 0x3B03: this.ContentStorageUID = new MXFRefKey(reader, 16, "ContentStorageUID"); return(true); case 0x3B08: this.PrimaryPackageUID = new MXFRefKey(reader, 16, "PrimaryPackageUID"); return(true); case 0x3B09: this.OperationalPattern = new MXFKey(reader, 16); return(true); case 0x3B06: ReadKeyList(reader, "Identifications", "Identification"); return(true); case 0x3B0A: ReadKeyList(reader, "Essencecontainers", "Essencecontainer"); return(true); case 0x3B0B: ReadKeyList(reader, "Descriptive Metadata Schemes", "DM scheme"); 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 0x3F05: this.EditUnitByteCount = reader.ReadD(); return(true); case 0x3F06: this.IndexSID = reader.ReadD(); return(true); case 0x3F07: this.BodySID = reader.ReadD(); return(true); case 0x3F08: this.SliceCount = reader.ReadB(); return(true); case 0x3F0C: this.IndexStartPosition = reader.ReadL(); return(true); case 0x3F0D: this.IndexDuration = reader.ReadL(); return(true); case 0x3F0E: this.PosTableCount = reader.ReadB(); return(true); case 0x3F0F: this.ExtStartOffset = reader.ReadL(); return(true); case 0x3F10: this.VBEByteCount = reader.ReadL(); return(true); case 0x3F0B: this.IndexEditRate = reader.ReadRational(); return(true); case 0x3F0A: // Index entry array { UInt32 NbIndexEntries = reader.ReadD(); UInt32 entryLength = reader.ReadD(); if (NbIndexEntries > 0) { this.IndexEntries = new List <MXFEntryIndex>(); MXFObject indexCollection = new MXFNamedObject("IndexEntries", reader.Position, MXFObjectType.Index); for (UInt64 i = 0; i < NbIndexEntries; i++) { long next = reader.Position + entryLength; MXFEntryIndex newEntry = new MXFEntryIndex((ulong)this.IndexStartPosition + i, reader, this.SliceCount, this.PosTableCount, entryLength); this.IndexEntries.Add(newEntry); // Also add this entry to the local list // And to the child collection indexCollection.AddChild(newEntry); reader.Seek(next); } this.AddChild(indexCollection); } } return(true); case 0x3F09: // Delta entry array { UInt32 NbDeltaEntries = reader.ReadD(); UInt32 entryLength = reader.ReadD(); if (NbDeltaEntries > 0) { MXFObject deltaCollection = new MXFNamedObject("DeltaEntries", reader.Position, MXFObjectType.Index); for (int i = 0; i < NbDeltaEntries; i++) { long next = reader.Position + entryLength; deltaCollection.AddChild(new MXFEntryDelta(reader, entryLength)); reader.Seek(next); } this.AddChild(deltaCollection); } } 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 0x3215: this.SignalStandard = reader.ReadB(); return(true); case 0x320C: this.FrameLayout = reader.ReadB(); return(true); case 0x3203: this.StoredWidth = reader.ReadD(); return(true); case 0x3202: this.StoredHeight = reader.ReadD(); return(true); case 0x3216: this.StoredF2Offset = (Int32)reader.ReadD(); return(true); case 0x3205: this.SampledWidth = reader.ReadD(); return(true); case 0x3204: this.SampledHeight = reader.ReadD(); return(true); case 0x3206: this.SampledXOffset = (Int32)reader.ReadD(); return(true); case 0x3207: this.SampledYOffset = (Int32)reader.ReadD(); return(true); case 0x3208: this.DisplayHeight = reader.ReadD(); return(true); case 0x3209: this.DisplayWidth = reader.ReadD(); return(true); case 0x320A: this.DisplayXOffset = (Int32)reader.ReadD(); return(true); case 0x320B: this.DisplayYOffset = (Int32)reader.ReadD(); return(true); case 0x3217: this.DisplayF2Offset = (Int32)reader.ReadD(); return(true); case 0x320E: this.AspectRatio = reader.ReadRational(); return(true); case 0x3218: this.ActiveFormatDescriptor = reader.ReadB(); return(true); case 0x320D: this.VideoLineMap = new Int32[4]; this.VideoLineMap[0] = (Int32)reader.ReadD(); this.VideoLineMap[1] = (Int32)reader.ReadD(); this.VideoLineMap[2] = (Int32)reader.ReadD(); this.VideoLineMap[3] = (Int32)reader.ReadD(); return(true); case 0x320F: this.AlphaTransparency = reader.ReadB(); return(true); case 0x3210: this.TransferCharacteristics = reader.ReadKey(); return(true); case 0x3211: this.ImageAlignmentOffset = reader.ReadD(); return(true); case 0x3213: this.ImageStartOffset = reader.ReadD(); return(true); case 0x3214: this.ImageEndOffset = reader.ReadD(); return(true); case 0x3212: this.FieldDominance = reader.ReadB(); return(true); case 0x3201: this.PictureEssenceCoding = reader.ReadKey(); return(true); case 0x321A: this.CodingEquations = reader.ReadKey(); return(true); case 0x3219: this.ColorPrimaries = reader.ReadKey(); return(true); } //PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(MXFGenericPictureEssenceDescriptor))["StoredWidth"]; //DescriptionAttribute attr = prop.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute; //FieldInfo fi = attr.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance); //if (fi != null) // fi.SetValue(attr, "DIT IS GELUKT!!!"); return(base.ParseLocalTag(reader, localTag)); }