GetSample Method

Summary

Gets a media sample delivered from a stream.

Syntax
C#
VB
C++
public MediaSample GetSample( 
   int Stream, 
   int lTimeout 
) 
Public Function GetSample( _ 
   ByVal Stream As Integer, _ 
   ByVal lTimeout As Integer _ 
) As MediaSample 
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
C#
VB
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 20\Media"; 
} 
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 20\Media" 
End Class 
Requirements

Target Platforms

Help Version 20.0.2019.11.25
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2019 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Multimedia Assembly