LEADTOOLS Multimedia (Leadtools.Multimedia assembly)
LEAD Technologies, Inc

GetSample Method (MultiStreamTarget)

Example 





The zero based stream index for which to get the sample.
Maximum time to wait for a sample, in milliseconds. If lTimeOut is -1, the method's time-out interval never elapses.
Gets a media sample delivered from a stream.
Syntax
public MediaSample GetSample( 
   int Stream,
   int lTimeout
)
'Declaration
 
Public Function GetSample( _
   ByVal Stream As Integer, _
   ByVal lTimeout As Integer _
) As MediaSample
'Usage
 
Dim instance As MultiStreamTarget
Dim Stream As Integer
Dim lTimeout As Integer
Dim value As MediaSample
 
value = instance.GetSample(Stream, lTimeout)
public MediaSample GetSample( 
   int Stream,
   int lTimeout
)
 function Leadtools.Multimedia.MultiStreamTarget.GetSample( 
   Stream ,
   lTimeout 
)
public:
MediaSample^ GetSample( 
   int Stream,
   int lTimeout
) 

Parameters

Stream
The zero based stream index for which to get the sample.
lTimeout
Maximum time to wait for a sample, in milliseconds. If lTimeOut is -1, the method's time-out interval never elapses.

Return Value

A MediaSample object
Remarks

If the method fails, an error is raised. For more information, refer to the Error Codes.

Common errors:

VFW_E_TIMEOUT - [0x8004022E] The interval specified in TimeOut has elapsed before a sample was ready. To resolve this error, call the function again or increase the timeout value.

VFW_E_SAMPLE_REJECTED_EOS - [0x8004022C] The end of stream has been reached. There are no more samples available for this stream.

If you get the sample in .NET, call System.Runtime.InteropServices.Marshal.ReleaseComObject to release the sample before getting another sample.

Example
Copy CodeCopy Code  
Public _result As Boolean = False
    Public _form As ConvertCtrlForm = New ConvertCtrlForm()
    Public _convertctrl As ConvertCtrl
    ' input files and output file
         Private inFile1 As String = Path.Combine(LEAD_VARS.MediaDir, "ConvertCtrl_Source1.avi")
         Private inFile2 As String = Path.Combine(LEAD_VARS.MediaDir, "ConvertCtrl_Source2.avi")
         Private outFile As String = Path.Combine(LEAD_VARS.MediaDir, "ConvertCtrl_ConcatAVIFilesExample.avi")

    Public Sub ConcatAVIFilesExample()
      Dim pConvert1 As ConvertCtrl
      Dim pConvert2 As ConvertCtrl
      Dim pMSSource As MultiStreamSource
      Dim pMSTarget As MultiStreamTarget
      Dim lStart As Int64

      Dim pmt As MediaType
      Dim pInsertedMediaType As MediaType

      pConvert1 = New ConvertCtrl(True)
      pConvert2 = New ConvertCtrl(True)

      pMSSource = New MultiStreamSource()
      pMSTarget = New MultiStreamTarget()

      ' set the start time to be 0
      lStart = 0

      ' set the input filename
      pConvert1.SourceFile = inFile1

      ' set the output sample to a target object
      pMSTarget.StreamCount = 2

      ' set the target media types for video and audio streams
      pmt = New MediaType()
         pmt.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Video
         pMSTarget.SetAcceptedMediaType(0, pmt)

         pmt.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Audio
      pMSTarget.SetAcceptedMediaType(1, pmt)

      pmt = Nothing

      ' get the inserted media type for the first stream
      pInsertedMediaType = pMSTarget.GetAcceptedMediaType(0)
      pInsertedMediaType = Nothing

      ' set convert 1 target object
      pConvert1.TargetObject = pMSTarget

      ' start the source conversion, so we can get the media sample format
      pConvert1.StartConvert()

      ' initialize convert 2
      ' get the output media sample format and put it into the source object
      pMSSource.StreamCount = 2
      pmt = pMSTarget.GetConnectedMediaType(0)
      pMSSource.SetMediaType(0, pmt)
      pmt = Nothing

      pmt = pMSTarget.GetConnectedMediaType(1)
      pMSSource.SetMediaType(1, pmt)
      pmt = Nothing

      ' get the inserted media type for the first stream
      pInsertedMediaType = pMSSource.GetMediaType(0)
      pInsertedMediaType = Nothing

      ' set the output filename
      pConvert2.TargetFile = outFile

      ' set the source for convert 2
      pConvert2.SourceObject = pMSSource

      ' start the dest conversion
      pConvert2.StartConvert()

      ' convert first file
      ConcateFile(pConvert1, pMSTarget, pMSSource, lStart)

      '
      'Restrict the output format to the media type of the source for the first file
      'That is because the two files must have the same media type for both video and audio
      'With video, you have to make sure the files have the same frame rate! Minor changes in
      'the frame rate might make the connection fail!
      'The control will tolerate differences in frame rate if you comment the next line
      '

      pmt = pMSTarget.GetConnectedMediaType(0)
      pMSTarget.SetAcceptedMediaType(0, pmt)
      pmt = Nothing

      pmt = pMSTarget.GetConnectedMediaType(1)
      pMSTarget.SetAcceptedMediaType(1, pmt)
      pmt = Nothing

      ' change the source file to second file
      pConvert1.SourceFile = inFile2

      ' start converting again
      pConvert1.StartConvert()

      ' convert second file
      ConcateFile(pConvert1, pMSTarget, pMSSource, lStart)

      ' deliver end of sample to stop the conversion
      pMSSource.DeliverEndOfStream(0, 1000)
      pMSSource.DeliverEndOfStream(1, 1000)

      If pConvert2.State = ConvertState.Running Then
         pConvert2.StopConvert()
      End If

      ' free the source and target objects
      pConvert2.ResetSource()
      pConvert1.ResetTarget()

      pConvert1.Dispose()
      pConvert2.Dispose()
      pMSSource.Dispose()
      pMSTarget.Dispose()

      _result = File.Exists(outFile)
    End Sub

         Private Sub ConcateFile(ByVal pConvert1 As ConvertCtrl, _
                                 ByVal pMSTarget As MultiStreamTarget, _
                                 ByVal pMSSource As MultiStreamSource, _
                                 ByRef lStart As Long)
             Dim pmsSrc As MediaSample = Nothing
             Dim pmsDst As MediaSample = Nothing
             Dim MediaTimeStart As Long
             Dim MediaTimeStop As Long
             Dim LastStart As Long
             Dim LastStop As Long
             Dim lSampleStream As Integer
             Dim lActualDataLength As Integer

             LastStop = 0

             Do
                 ' get the sample, allowing 10 s for the operation to complete
                 Try
                     lSampleStream = pMSTarget.WaitForSample(1000)
                 Catch cex As COMException
                     If cex.ErrorCode = CInt(ErrorCode.VFW_E_TIMEOUT) Then
                         ' end of the stream
                         Exit Do
                     End If
                     _result = False
                     Exit Do
                 End Try

                 Try
                     ' get the target sample
                     pmsSrc = pMSTarget.GetSample(lSampleStream, 0)
                     ' get the source buffer
                     pmsDst = pMSSource.GetSampleBuffer(lSampleStream, 2000)
                 Catch e1 As Exception
                     _result = False
                     Exit Do
                 End Try

                 ' get the media time
                 pmsSrc.GetMediaTime(MediaTimeStart, MediaTimeStop)

                 ' get the source sample time
                 pmsSrc.GetTime(LastStart, LastStop)

                 ' set the destination sample time
                 pmsDst.SetTime(lStart + LastStart, lStart + LastStop)

                 ' copy the data
                 lActualDataLength = pmsSrc.ActualDataLength

                 ' set the destination buffer 
                 ' we could Marshal the unmanaged buffer here, but no need since we are mearly 
                 ' setting the destination to the source buffer contents (unaltered data)
                 pmsDst.SetData(lActualDataLength, pmsSrc.GetData(lActualDataLength))

                 ' copy the other flags
                 pmsDst.Discontinuity = pmsSrc.Discontinuity
                 pmsDst.Preroll = pmsSrc.Preroll
                 pmsDst.SyncPoint = pmsSrc.SyncPoint

                 ' release the source sample
                 pmsSrc = Nothing

                 ' deliver the destination sample
                 pMSSource.DeliverSample(lSampleStream, 1000, pmsDst)

                 ' release the destination sample
                 pmsDst = Nothing
             Loop While True

             pConvert1.StopConvert()
             lStart = LastStop
         End Sub

Public NotInheritable Class LEAD_VARS
   Public Const MediaDir As String = "C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 175\Media";
End Class
public bool _result = false;
      public ConvertCtrlForm _form = new ConvertCtrlForm();
      public ConvertCtrl _convertctrl;
      // input files and output file
      string inFile1 = Path.Combine(LEAD_VARS.MediaDir,"ConvertCtrl_Source1.avi");
      string inFile2 =Path.Combine(LEAD_VARS.MediaDir,"ConvertCtrl_Source2.avi");
      string outFile =Path.Combine(LEAD_VARS.MediaDir,"ConvertCtrl_ConcatAVIFilesExample.avi");

      public void ConcatAVIFilesExample()
      {
         ConvertCtrl pConvert1;
         ConvertCtrl pConvert2;
         MultiStreamSource pMSSource;
         MultiStreamTarget pMSTarget;
         Int64 lStart;

         MediaType   pmt;
         MediaType   pInsertedMediaType;

         pConvert1 = new ConvertCtrl(true);
         pConvert2 = new ConvertCtrl(true);

         pMSSource = new MultiStreamSource();
         pMSTarget = new MultiStreamTarget();

         // set the start time to be 0
         lStart = 0;

         // set the input filename
         pConvert1.SourceFile = inFile1;

         // set the output sample to a target object
         pMSTarget.StreamCount = 2;

         // set the target media types for video and audio streams
         pmt = new MediaType();
         pmt.Type = Constants.MEDIATYPE_Video;
         pMSTarget.SetAcceptedMediaType(0, pmt);

         pmt.Type = Constants.MEDIATYPE_Audio;
         pMSTarget.SetAcceptedMediaType(1, pmt);

         pmt = null;

         // get the inserted media type for the first stream
         pInsertedMediaType = pMSTarget.GetAcceptedMediaType(0);
         pInsertedMediaType = null;

         // set convert 1 target object
         pConvert1.TargetObject = pMSTarget;

         // start the source conversion, so we can get the media sample format
         pConvert1.StartConvert();

         // initialize convert 2
         // get the output media sample format and put it into the source object
         pMSSource.StreamCount = 2;
         pmt = pMSTarget.GetConnectedMediaType(0);
         pMSSource.SetMediaType(0, pmt);
         pmt = null;

         pmt = pMSTarget.GetConnectedMediaType(1);
         pMSSource.SetMediaType(1, pmt);
         pmt = null;

         // get the inserted media type for the first stream
         pInsertedMediaType = pMSSource.GetMediaType(0);
         pInsertedMediaType = null;

         // set the output filename
         pConvert2.TargetFile = outFile;

         // set the source for convert 2
         pConvert2.SourceObject = pMSSource;

         // start the dest conversion
         pConvert2.StartConvert();

         // convert first file
         ConcateFile(pConvert1, pMSTarget, pMSSource, ref lStart);

         /*
         Restrict the output format to the media type of the source for the first file
         That is because the two files must have the same media type for both video and audio
         With video, you have to make sure the files have the same frame rate! Minor changes in
         the frame rate might make the connection fail!
         The control will tolerate differences in frame rate if you comment the next line
         */

         pmt = pMSTarget.GetConnectedMediaType(0);
         pMSTarget.SetAcceptedMediaType(0, pmt);
         pmt = null;

         pmt = pMSTarget.GetConnectedMediaType(1);
         pMSTarget.SetAcceptedMediaType(1, pmt);
         pmt = null;

         // change the source file to second file
         pConvert1.SourceFile = inFile2;

         // start converting again
         pConvert1.StartConvert();

         // convert second file
         ConcateFile(pConvert1, pMSTarget, pMSSource, ref lStart);

         // deliver end of sample to stop the conversion
         pMSSource.DeliverEndOfStream(0, 1000);
         pMSSource.DeliverEndOfStream(1, 1000);

         if (pConvert2.State == ConvertState.Running)
            pConvert2.StopConvert();

         // free the source and target objects
         pConvert2.ResetSource();
         pConvert1.ResetTarget();

         pConvert1.Dispose();
         pConvert2.Dispose();
         pMSSource.Dispose();
         pMSTarget.Dispose();

         _result = File.Exists(outFile);
      }

      void ConcateFile(ConvertCtrl pConvert1, 
                       MultiStreamTarget pMSTarget, 
                       MultiStreamSource pMSSource, 
                       ref long lStart)
      {
         MediaSample pmsSrc = null;
         MediaSample pmsDst = null;
         long MediaTimeStart;
         long MediaTimeStop;
         long LastStart;
         long LastStop;
         int lSampleStream;
         int lActualDataLength;

         LastStop = 0;

         do
         {
            // get the sample, allowing 10 s for the operation to complete
            try
            {
               lSampleStream = pMSTarget.WaitForSample(1000);
            }
            catch (COMException cex)
            {
               if (cex.ErrorCode == (int)ErrorCode.VFW_E_TIMEOUT)
               {
                  // end of the stream
                  break;
               }
               _result = false;
               break;
            }

            try
            {
               // get the target sample
               pmsSrc = pMSTarget.GetSample(lSampleStream, 0);
               // get the source buffer
               pmsDst = pMSSource.GetSampleBuffer(lSampleStream, 2000);
            }
            catch (Exception)
            {
               _result = false;
               break;
            }

            // get the media time
            pmsSrc.GetMediaTime(out MediaTimeStart, out MediaTimeStop);

            // get the source sample time
            pmsSrc.GetTime(out LastStart, out LastStop);

            // set the destination sample time
            pmsDst.SetTime(lStart + LastStart, lStart + LastStop);

            // copy the data
            lActualDataLength = pmsSrc.ActualDataLength;

            // set the destination buffer 
            // we could Marshal the unmanaged buffer here, but no need since we are mearly 
            // setting the destination to the source buffer contents (unaltered data)
            pmsDst.SetData(lActualDataLength, pmsSrc.GetData(lActualDataLength));

            // copy the other flags
            pmsDst.Discontinuity = pmsSrc.Discontinuity;
            pmsDst.Preroll = pmsSrc.Preroll;
            pmsDst.SyncPoint = pmsSrc.SyncPoint;

            // release the source sample
            pmsSrc = null;

            // deliver the destination sample
            pMSSource.DeliverSample(lSampleStream, 1000, pmsDst);

            // release the destination sample
            pmsDst = null;
         }
         while (true);

         pConvert1.StopConvert();
         lStart = LastStop;
      }

static class LEAD_VARS
{
   public const string MediaDir = @"C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 175\Media";
}
Requirements

Target Platforms: Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

See Also

Reference

MultiStreamTarget Class
MultiStreamTarget Members

 

 


Products | Support | Contact Us | Copyright Notices

© 2006-2012 All Rights Reserved. LEAD Technologies, Inc.

Leadtools.Multimedia requires a Multimedia or Multimedia Suite license and unlock key. For more information, refer to: LEADTOOLS Toolkit Features