LEADTOOLS Multimedia (Leadtools.Multimedia assembly) Send comments on this topic. | Back to Introduction | Help Version 17.0.3.22
DeliverSample Method
See Also 
Leadtools.Multimedia Namespace > MultiStreamSource Class : DeliverSample Method



Stream
The index of the stream for which the sample is being delivered.
TimeOut
Maximum time to allow for sample delivery, in milliseconds. If this method "times out" then E_FAIL is returned and the sample is not delivered.
MediaSample
Reference to a MediaSample Object that contains the sample to be delivered.
Stream
The index of the stream for which the sample is being delivered.
TimeOut
Maximum time to allow for sample delivery, in milliseconds. If this method "times out" then E_FAIL is returned and the sample is not delivered.
MediaSample
Reference to a MediaSample Object that contains the sample to be delivered.
Delivers a sample to a PlayCtrl or ConvertCtrl object "downstream" of the Sample Source object.

Syntax

Visual Basic (Declaration) 
Public Sub DeliverSample( _
   ByVal Stream As Integer, _
   ByVal TimeOut As Integer, _
   ByVal MediaSample As MediaSample _
) 
Visual Basic (Usage)Copy Code
Dim instance As MultiStreamSource
Dim Stream As Integer
Dim TimeOut As Integer
Dim MediaSample As MediaSample
 
instance.DeliverSample(Stream, TimeOut, MediaSample)
C# 
public void DeliverSample( 
   int Stream,
   int TimeOut,
   MediaSample MediaSample
)
C++/CLI 
public:
void DeliverSample( 
   int Stream,
   int TimeOut,
   MediaSample^ MediaSample
) 

Parameters

Stream
The index of the stream for which the sample is being delivered.
TimeOut
Maximum time to allow for sample delivery, in milliseconds. If this method "times out" then E_FAIL is returned and the sample is not delivered.
MediaSample
Reference to a MediaSample Object that contains the sample to be delivered.

Example

Visual BasicCopy 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 17\Media"
End Class
C#Copy Code
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 17\Media";
}

Remarks

Delivers a sample to a PlayCtrl or ConvertCtrl object "downstream" of the Sample Source object. Only pass in samples returned from the GetSampleBuffer method. Do not pass samples obtained by calling GetSampleBuffer from another object. Release the sample once it has been delivered, and do not attempt to make any further modifications to the sample. If the method fails, an error is raised. For more information, refer to the Error Codes.

Requirements

Target Platforms: Microsoft .NET Framework 2.0, Windows 2000, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7

See Also