Error processing SSI file
LEADTOOLS Multimedia (Leadtools.Multimedia assembly)

Show in webframe

GetSampleBuffer Method (SampleSource)






Maximum time to wait for a free sample buffer, in milliseconds.
Gets an unused sample buffer.
Syntax
public MediaSample GetSampleBuffer( 
   int TimeOut
)
'Declaration
 
Public Function GetSampleBuffer( _
   ByVal TimeOut As Integer _
) As MediaSample
'Usage
 
Dim instance As SampleSource
Dim TimeOut As Integer
Dim value As MediaSample
 
value = instance.GetSampleBuffer(TimeOut)
public:
MediaSample^ GetSampleBuffer( 
   int TimeOut
) 

Parameters

TimeOut
Maximum time to wait for a free sample buffer, in milliseconds.

Return Value

A MediaSample object
Remarks
Gets an unused sample buffer. The buffer retrieved by this method comes from a pool of buffers. There should be no assumptions made on the number of available buffers. If you get a buffer, fill it with data and then deliver it downstream, you should release the buffer (by setting the reference to Nothing) before getting another. This is because there may only be one buffer available at a time. If the method fails, an error is raised. For more information, refer to the Error Codes. If the method does not retrieve a buffer within the allotted time it will return E_FAIL. If this happens, you may have specified a small timeout and all of the available buffers are currently being sent downstream. If you get the sample in .NET, call System.Runtime.InteropServices.Marshal.ReleaseComObject to release the sample before getting another sample.
Example
Copy Code  
Imports Leadtools
Imports Leadtools.Multimedia
Imports LeadtoolsMultimediaExamples.Fixtures

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 19\Media"
End Class
using Leadtools;
using Leadtools.Multimedia;
using LeadtoolsMultimediaExamples.Fixtures;

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 19\Media";
}
Requirements

Target Platforms

See Also

Reference

SampleSource Class
SampleSource Members

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