private IEnumerable <QtAtom> GetAtomsFromComponent() { QtAtom dummyAtom = new QtAtom(Enumerable.Repeat(_detector, 1)); HashSet <QtAtom> atoms = new HashSet <QtAtom>(); Assert.That(File.Exists(string.Format(Path.Combine(PathName, "QTDetector.dll"))), Is.True, "Could not find the file 'QTDetector.dll'"); // Using 'LoadFile()' instead of 'LoadFrom()' causes the // 'GetDetector()' method to fail for unknown reason. Assembly assembly = Assembly.LoadFrom("QTDetector.dll"); foreach (Type type in assembly.GetTypes()) { if (typeof(QtAtom).IsAssignableFrom(type) && !type.IsAbstract /*&& type != typeof(QtAtom)*/) { QtAtom atom = null; // Try to get constructor with previousAtom as the only argument ConstructorInfo constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new[] { typeof(QtAtom) }, null); if (constructorInfo != null) { atom = (QtAtom)constructorInfo.Invoke(BindingFlags.Default, null, new object[] { dummyAtom }, CultureInfo.CurrentCulture); } if (constructorInfo == null) { // If the above fails, try to get the constructor with // previousAtom (QtAom) and atomName (AtomName) as the arguments. constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new[] { typeof(QtAtom), typeof(AtomName) }, null); if (constructorInfo != null) { atom = (QtAtom)constructorInfo.Invoke(BindingFlags.Default, null, new object[] { dummyAtom, AtomName.Unknown }, CultureInfo.CurrentCulture); } } if (constructorInfo == null) { // If the above fails, try to get the constructor with // previousAtom (QtAom) and atomType (AtomType) as the arguments. constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new[] { typeof(QtAtom), typeof(ChunkOffset.AtomType) }, null); if (constructorInfo != null) { atom = (QtAtom)constructorInfo.Invoke(BindingFlags.Default, null, new object[] { dummyAtom, ChunkOffset.AtomType.ChunkOffset32Bit }, CultureInfo.CurrentCulture); } } Assert.IsNotNull(atom); if (!atoms.Contains(atom, new EqualityComparer())) { atoms.Add(atom); } else { Assert.Fail("atom '{0}' already added.", Enum.GetName(typeof(AtomName), atom.HeaderName)); } } } return(atoms); }
public override bool IsSuitableParent(QtAtom parent) { if (!base.IsSuitableParent(parent)) { return(false); } // It must be the last child in its parent return(!parent.IsRoot && RelativeEndOffset == parent.RelativeEndOffset); }
public void TestAtomIsCreatedByFactoryMethod() { // Create a collection containing all classes derived from QtAtom // from the QuickTime/MP4/3GPP plug-in. IEnumerable <QtAtom> atomsFromComponent = GetAtomsFromComponent(); // Call the QtAtom factory method to find out which classes are created HashSet <QtAtom> atomsCreatedByFactory = new HashSet <QtAtom>(); QtAtom dummyAtom = new QtAtom(Enumerable.Repeat(_detector, 1)); foreach (AtomName atomName in Enum.GetValues(typeof(AtomName))) { QtAtom atom = QtParser.CreateAtom(dummyAtom, atomName, 0U); Assert.IsNotNull(atom); if (!atomsCreatedByFactory.Contains(atom, new EqualityComparer())) { atomsCreatedByFactory.Add(atom); } } // Report any atom from component not created by the factory method foreach (QtAtom atom in atomsFromComponent) { if (!atomsCreatedByFactory.Contains(atom, new EqualityComparer())) { Assert.Fail("Atom not created by factory: {0}", atom.GetType().Name); } } // Atoms created by factory not in Component foreach (QtAtom atom in atomsCreatedByFactory) { if (!atomsFromComponent.Contains(atom, new EqualityComparer())) { Assert.Fail("Atom not in component: {0}", atom.GetType().Name); } } }
public Transcript(QtAtom previousHeader) : base(previousHeader, AtomName.Transcript) { }
public NonprimarySource(QtAtom previousHeader) : base(previousHeader, AtomName.NonprimarySource) { }
public PixelAspectRatio(QtAtom previousHeader) : base(previousHeader, AtomName.PixelAspectRatio) { }
public ComponentDetect(QtAtom previousHeader) : base(previousHeader, AtomName.ComponentDetect) { }
public VersionCheck(QtAtom previousHeader) : base(previousHeader, AtomName.VersionCheck) { }
public CopyrightStatement(QtAtom previousHeader) : base(previousHeader, AtomName.CopyrightStatement) { }
public DataRate(QtAtom previousHeader) : base(previousHeader, AtomName.DataRate) { }
public TimeCode(QtAtom previousHeader) : base(previousHeader, AtomName.TimeCode) { }
public KeywordsForComposerX(QtAtom previousHeader) : base(previousHeader, AtomName.KeywordsForComposerX) { }
public NameOfComposer(QtAtom previousHeader) : base(previousHeader, AtomName.NameOfComposer) { }
public KeywordsForArrangerX(QtAtom previousHeader) : base(previousHeader, AtomName.KeywordsForArrangerX) { }
public NameOfArranger(QtAtom previousHeader) : base(previousHeader, AtomName.NameOfArranger) { }
public UserDataListEntry(QtAtom previousHeader, AtomName atomName) : base(previousHeader, atomName) { }
public Hint(QtAtom previousHeader) : base(previousHeader, AtomName.Hint) { }
public MovieHeader(QtAtom previousHeader) : base(previousHeader, AtomName.MovieHeader) { }
public TrackReferenceType(QtAtom previousHeader, AtomName atomName) : base(previousHeader, atomName) { }
public AvcParameterSampleEntry(QtAtom previousHeader) : base(previousHeader, AtomName.AvcParameterSampleEntry) { }
public MediaHeader(QtAtom previousHeader) : base(previousHeader, AtomName.MediaHeader) { }
public SampleDescription(QtAtom previousHeader) : base(previousHeader, AtomName.SampleDescription) { }
public Bitrate(QtAtom previousHeader) : base(previousHeader, AtomName.Bitrate) { }
public SampleGroupDescriptionBox(QtAtom previousHeader) : base(previousHeader, AtomName.SampleGroupDescriptionBox) { }
public AmrwpSpecific(QtAtom previousHeader) : base(previousHeader, AtomName.AmrwpSpecific) { }
public Mpeg4BitRateBox(QtAtom previousHeader) : base(previousHeader, AtomName.Mpeg4BitRateBox) { }
public VideoSampleDescription(QtAtom previousHeader, AtomName atomName) : base(previousHeader, atomName) { }
public ChapterList(QtAtom previousHeader) : base(previousHeader, AtomName.ChapterList) { }
public HandlerReference(QtAtom previousHeader) : base(previousHeader, AtomName.HandlerReference) { }
public Synchronization(QtAtom previousHeader) : base(previousHeader, AtomName.Synchronization) { }