예제 #1
0
        /// <summary>
        /// Kopiert oder verwendet eine DirectShow Strukturinstanz, deren
        /// Speicheradresse übergeben wird.
        /// </summary>
        /// <param name="rawMediaType">Die Speicheradresse der DirectShow Instanz.</param>
        /// <param name="copy">Ist dieser Wert gesetzt, so wird die
        /// DirectShow Instanz samt den zugehörigen Speicherstrukturen
        /// dupliziert. Ansonsten wird die Instanz verwendet und
        /// der ursprünglich dafür alloziierte Speicher freigegeben.</param>
        public MediaType(IntPtr rawMediaType, bool copy)
        {
            // Check mode
            m_HasMediaType = (rawMediaType != IntPtr.Zero);

            // Nothing to do
            if (!m_HasMediaType)
            {
                return;
            }

            // Unpack
            var mediaType = (RawMediaType)Marshal.PtrToStructure(rawMediaType, typeof(RawMediaType));

            // Check mode
            if (copy)
            {
                // Copy over
                mediaType.CopyTo(ref m_MediaType);
            }
            else
            {
                // Use as is
                m_RawMediaType = rawMediaType;
                m_MediaType    = mediaType;
            }
        }
예제 #2
0
        /// <summary>
        /// Erzeugt die Speicherstruktur für eine DirectShow Instanz.
        /// </summary>
        /// <remarks>
        /// Die optional assoziierten Speicherstrukturen werden dabei nicht
        /// dupliziert.
        /// </remarks>
        /// <param name="mediaType">Eine DirectShow Speicherstruktur.</param>
        /// <returns>Die Adresse eines Speicherbereiches mit der Instanz.</returns>
        private static IntPtr GetReference(RawMediaType mediaType)
        {
            // Allocate
            IntPtr rawMediaType = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(RawMediaType)));

            // Copy in
            Marshal.StructureToPtr(mediaType, rawMediaType, false);

            // Report
            return(rawMediaType);
        }
예제 #3
0
 /// <summary>
 /// Kopiert oder verwendet eine DirectShow Strukturinstanz.
 /// </summary>
 /// <param name="mediaType">Die DirectShow Instanz.</param>
 /// <param name="copy">Ist dieser Parameter gesetzt, so wird
 /// eine eigenständige Kopie erstellt. Ansonsten wird die
 /// DirectShow Instanz samt der damit verbundenen Speicherstrukturen
 /// übernommen. Insbesondere darf es keinen Aufruf von
 /// <see cref="Interfaces.MediaType.FreeMemory"/> auf dem ersten Parameter
 /// mehr geben.</param>
 public MediaType( RawMediaType mediaType, bool copy )
 {
     // Check mode
     if (copy)
     {
         // Make sure that secondary memory is duplicated
         mediaType.CopyTo( ref m_MediaType );
     }
     else
     {
         // Hold this
         m_MediaType = mediaType;
     }
 }
예제 #4
0
 /// <summary>
 /// Kopiert oder verwendet eine DirectShow Strukturinstanz.
 /// </summary>
 /// <param name="mediaType">Die DirectShow Instanz.</param>
 /// <param name="copy">Ist dieser Parameter gesetzt, so wird
 /// eine eigenständige Kopie erstellt. Ansonsten wird die
 /// DirectShow Instanz samt der damit verbundenen Speicherstrukturen
 /// übernommen. Insbesondere darf es keinen Aufruf von
 /// <see cref="Interfaces.MediaType.FreeMemory"/> auf dem ersten Parameter
 /// mehr geben.</param>
 public MediaType(RawMediaType mediaType, bool copy)
 {
     // Check mode
     if (copy)
     {
         // Make sure that secondary memory is duplicated
         mediaType.CopyTo(ref m_MediaType);
     }
     else
     {
         // Hold this
         m_MediaType = mediaType;
     }
 }
예제 #5
0
        /// <summary>
        /// Erstellt eine vollständige Kopie der DirectShow Instanz. Dies
        /// schließt alls Substrukturen mit ein.
        /// <seealso cref="GetReference(RawMediaType)"/>
        /// </summary>
        /// <returns>Die Speicheradress der kopierten Instanz.</returns>
        public IntPtr CreateCopy()
        {
            // None
            if (!m_HasMediaType)
            {
                return(IntPtr.Zero);
            }

            // Copy
            var mediaType = new RawMediaType();

            // Full copy
            m_MediaType.CopyTo(ref mediaType);

            // Report
            return(GetReference(mediaType));
        }
예제 #6
0
        /// <summary>
        /// Erstellt eine Kopie dieser Formatbeschreibung.
        /// </summary>
        /// <remarks>
        /// Die Kopie muß später mit <see cref="FreeMemory"/>
        /// freigegeben werden.
        /// </remarks>
        /// <param name="target">Zu füllende Kopie. Der Aufrufer hat dafür
        /// Sorge zu tragen, dass alle sekundären Speicherstrukturen
        /// bereits freigegeben sind.</param>
        public void CopyTo(ref RawMediaType target)
        {
            // Copy all
            target.TemporalCompression = TemporalCompression;
            target.FixedSizeSamples    = FixedSizeSamples;
            target.SampleSize          = SampleSize;
            target.FormatType          = FormatType;
            target.MajorType           = MajorType;
            target.SubType             = SubType;
            target.Format = Format;
            target.Holder = Holder;

            // Correct the reference
            if (target.Holder != IntPtr.Zero)
            {
                Marshal.AddRef(target.Holder);
            }
        }
예제 #7
0
        /// <summary>
        /// Erstellt eine Kopie dieser Formatbeschreibung.
        /// </summary>
        /// <remarks>
        /// Die Kopie muß später mit <see cref="FreeMemory"/>
        /// freigegeben werden.
        /// </remarks>
        /// <param name="target">Zu füllende Kopie. Der Aufrufer hat dafür
        /// Sorge zu tragen, dass alle sekundären Speicherstrukturen
        /// bereits freigegeben sind.</param>
        public void CopyTo( ref RawMediaType target )
        {
            // Copy all
            target.TemporalCompression = TemporalCompression;
            target.FixedSizeSamples = FixedSizeSamples;
            target.SampleSize = SampleSize;
            target.FormatType = FormatType;
            target.MajorType = MajorType;
            target.SubType = SubType;
            target.Format = Format;
            target.Holder = Holder;

            // Correct the reference
            if (target.Holder != IntPtr.Zero)
                Marshal.AddRef( target.Holder );
        }
예제 #8
0
 /// <summary>
 /// Kopiert eine DirectShow Strukturinstanz.
 /// </summary>
 /// <param name="mediaType">Die DirectShow Instanz.</param>
 public MediaType( RawMediaType mediaType )
     : this( mediaType, true )
 {
 }
예제 #9
0
 /// <summary>
 /// Kopiert die DriectShow Instanz mit sämtlichen Substrukturen in eine
 /// andere Instanz.
 /// </summary>
 /// <param name="target">Zu überschreibenede Instanz.</param>
 public void CopyTo( ref RawMediaType target )
 {
     // Forward
     m_MediaType.CopyTo( ref target );
 }
예제 #10
0
        /// <summary>
        /// Erstellt eine vollständige Kopie der DirectShow Instanz. Dies
        /// schließt alls Substrukturen mit ein.
        /// <seealso cref="GetReference(RawMediaType)"/>
        /// </summary>
        /// <returns>Die Speicheradress der kopierten Instanz.</returns>
        public IntPtr CreateCopy()
        {
            // None
            if (!m_HasMediaType)
                return IntPtr.Zero;

            // Copy
            var mediaType = new RawMediaType();

            // Full copy
            m_MediaType.CopyTo( ref mediaType );

            // Report
            return GetReference( mediaType );
        }
예제 #11
0
        /// <summary>
        /// Erzeugt die Speicherstruktur für eine DirectShow Instanz.
        /// </summary>
        /// <remarks>
        /// Die optional assoziierten Speicherstrukturen werden dabei nicht
        /// dupliziert.
        /// </remarks>
        /// <param name="mediaType">Eine DirectShow Speicherstruktur.</param>
        /// <returns>Die Adresse eines Speicherbereiches mit der Instanz.</returns>
        private static IntPtr GetReference( RawMediaType mediaType )
        {
            // Allocate
            IntPtr rawMediaType = Marshal.AllocCoTaskMem( Marshal.SizeOf( typeof( RawMediaType ) ) );

            // Copy in
            Marshal.StructureToPtr( mediaType, rawMediaType, false );

            // Report
            return rawMediaType;
        }
예제 #12
0
        /// <summary>
        /// Kopiert oder verwendet eine DirectShow Strukturinstanz, deren
        /// Speicheradresse übergeben wird.
        /// </summary>
        /// <param name="rawMediaType">Die Speicheradresse der DirectShow Instanz.</param>
        /// <param name="copy">Ist dieser Wert gesetzt, so wird die
        /// DirectShow Instanz samt den zugehörigen Speicherstrukturen
        /// dupliziert. Ansonsten wird die Instanz verwendet und
        /// der ursprünglich dafür alloziierte Speicher freigegeben.</param>
        public MediaType( IntPtr rawMediaType, bool copy )
        {
            // Check mode
            m_HasMediaType = (rawMediaType != IntPtr.Zero);

            // Nothing to do
            if (!m_HasMediaType)
                return;

            // Unpack
            var mediaType = (RawMediaType) Marshal.PtrToStructure( rawMediaType, typeof( RawMediaType ) );

            // Check mode
            if (copy)
            {
                // Copy over
                mediaType.CopyTo( ref m_MediaType );
            }
            else
            {
                // Use as is
                m_RawMediaType = rawMediaType;
                m_MediaType = mediaType;
            }
        }
예제 #13
0
 /// <summary>
 /// Kopiert eine DirectShow Strukturinstanz.
 /// </summary>
 /// <param name="mediaType">Die DirectShow Instanz.</param>
 public MediaType(RawMediaType mediaType)
     : this(mediaType, true)
 {
 }
예제 #14
0
 /// <summary>
 /// Kopiert die DriectShow Instanz mit sämtlichen Substrukturen in eine
 /// andere Instanz.
 /// </summary>
 /// <param name="target">Zu überschreibenede Instanz.</param>
 public void CopyTo(ref RawMediaType target)
 {
     // Forward
     m_MediaType.CopyTo(ref target);
 }