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



Index
The index of the stream for which to retrieve the stream number.
Index
The index of the stream for which to retrieve the stream number.
Gets the number of the stream at the specified index in the stream's list.

Syntax

Visual Basic (Declaration) 
Public Function GetStream( _
   ByVal Index As Integer _
) As Integer
Visual Basic (Usage)Copy Code
Dim instance As WMMutualExclusion
Dim Index As Integer
Dim value As Integer
 
value = instance.GetStream(Index)
C# 
public int GetStream( 
   int Index
)
C++/CLI 
public:
int GetStream( 
   int Index
) 

Parameters

Index
The index of the stream for which to retrieve the stream number.

Example

Visual BasicCopy Code
Public _result As Boolean = False
      Public _form As ConvertCtrlForm = New ConvertCtrlForm()
      Private Const CODEC_AUDIO_MSAUDIO As Integer = 353 ' Microsoft WMAudio
      Private Const CODEC_VIDEO_WMV1 As Integer = 827739479 ' FOURCC( "W"c, "M"c, "V"c, "1"c )

      Public Sub AddStreamExample()
         Dim convertctrl As ConvertCtrl = _form.ConvertCtrl
         Dim inFile As String = Path.Combine(LEAD_VARS.MediaDir, "ConvertCtrl_Source.avi")
         Dim outFile As String = Path.Combine(LEAD_VARS.MediaDir, "WMProfile_RemoveStreamExample.avi")

         Try
            Dim manager As WMProfileManager = New WMProfileManager()

            ' create a WMProfile
            convertctrl.WMProfile = CreateCustomProfile(manager)

            ' get the video stream and remove it from the config
            Dim strm As WMStreamConfig = convertctrl.WMProfile.GetStream(0)
            convertctrl.WMProfile.RemoveStream(strm)

            ' dispose of the manager
            manager.Dispose()
         Catch e1 As Exception
            _result = False
         End Try

         ' we'll loop on the state and pump messages for this example.
         ' but you should not need to if running from a Windows Forms application.
         Do While convertctrl.State = ConvertState.Running
            Application.DoEvents()
         Loop
      End Sub

      Private Function CreateCustomProfile(ByVal manager As WMProfileManager) As WMProfile
         Dim profile As WMProfile = manager.CreateEmptyProfile(WMT_Version.V8)
         profile.Name = "Custom Profile"
         profile.Description = "Custom Profile Description"

         Dim added As Boolean = AddAudioStream(manager, profile, 1, CODEC_AUDIO_MSAUDIO, 8000, 8000, 1, True)

         Dim i As Integer = 0
         Do While (i <= 4)
            AddVideoStream(manager, profile, (2 + i), CODEC_VIDEO_WMV1, (1024 * 20) + i * 1024, 320, 240, 5 * (i + 1), 0, 8)
            i += 1
         Loop

         '  mark all the video streams for mutual exclusion
         AddMutexObject(profile, 2, 5)
         Return profile
      End Function

      Private Function AddVideoStream(ByVal manager As WMProfileManager, ByVal profile As WMProfile, ByVal streamnum As Integer, ByVal fourcc As Long, ByVal bitrate As Integer, ByVal width As Integer, ByVal height As Integer, ByVal fps As Integer, ByVal quality As Integer, ByVal secperkey As Integer) As Boolean
         Dim codecformat As WMStreamConfig
         Dim mediatype As MediaType
         Dim vih As VideoInfoHeader
         Dim candidate As Boolean
         Dim candidatevih As VideoInfoHeader = New VideoInfoHeader()
         Dim candidatemt As MediaType = Nothing
         Dim mt As MediaType = Nothing
         Dim candidatestream As WMStreamConfig = Nothing

         Dim added As Boolean = False
         Dim viharr As Byte() = New Byte(87) {}
         candidate = False
         Dim codecs As Integer = manager.GetCodecInfoCount(Leadtools.Multimedia.Constants.MEDIATYPE_Video)

         Dim sinfo As String = String.Empty
         '  search for matching codec
         Dim codecindex As Integer = 0
         Do While codecindex < codecs
            sinfo &= manager.GetCodecName(Leadtools.Multimedia.Constants.MEDIATYPE_Video, codecindex)
            Dim formats As Integer = manager.GetCodecFormatCount(Leadtools.Multimedia.Constants.MEDIATYPE_Video, codecindex)

            Dim formatindex As Integer = 0
            Do While formatindex < formats
               sinfo &= manager.GetCodecFormatDesc(Leadtools.Multimedia.Constants.MEDIATYPE_Video, codecindex, formatindex)
               codecformat = manager.GetCodecFormat(Leadtools.Multimedia.Constants.MEDIATYPE_Video, codecindex, formatindex)
               mediatype = codecformat.GetMediaType()

               If mediatype.FormatType = Leadtools.Multimedia.Constants.FORMAT_VideoInfo Then
                  vih = mediatype.GetVideoFormatData()
                  If vih.bmiHeader.biCompression = fourcc Then
                     candidate = True
                     candidatevih = vih
                     candidatemt = mediatype
                     candidatestream = codecformat
                  End If
               End If
               formatindex += 1
            Loop
            codecindex += 1
         Loop
         If candidate Then
            '  modify the selected codec to support this bitrate and size
            candidatevih.dwBitRate = bitrate
            candidatevih.rcSource.Right = width
            candidatevih.rcSource.Bottom = height
            candidatevih.rcTarget.Right = width
            candidatevih.rcTarget.Bottom = height
            candidatevih.bmiHeader.biWidth = width
            candidatevih.bmiHeader.biHeight = height
            candidatevih.AvgTimePerFrame.lowpart = CInt((10000000 / fps) Mod 65536)
            candidatevih.AvgTimePerFrame.highpart = CInt((10000000 / fps) / 65536)

            StructToByteArray(candidatevih, viharr)

            candidatestream.Quality = quality
            candidatestream.MaxKeyFrameSpacing = secperkey
            candidatestream.StreamNumber = streamnum
            candidatestream.StreamName = "Video Stream"
            candidatestream.ConnectionName = "Video"
            candidatestream.Bitrate = bitrate
            candidatestream.SetMediaType(candidatemt)
            profile.AddStream(candidatestream)
            added = True
         End If
         Return added
      End Function

      Private Function AddAudioStream(ByVal manager As WMProfileManager, ByVal profile As WMProfile, ByVal streamnum As Integer, ByVal formattag As Integer, ByVal prefbitrate As Integer, ByVal samplespersec As Integer, ByVal channels As Integer, ByVal withvideo As Boolean) As Boolean
         Dim codecformat As WMStreamConfig
         Dim mediatype As MediaType
         Dim wfex As WaveFormatEx = New WaveFormatEx()
         Dim added As Boolean = False
         Dim candidate As Boolean
         Dim candidatewfex As WaveFormatEx = New WaveFormatEx()
         Dim candidatemt As MediaType = Nothing
         Dim mt As MediaType
         Dim stream As WMStreamConfig
         candidate = False
         Dim codecs As Integer = manager.GetCodecInfoCount(Leadtools.Multimedia.Constants.MEDIATYPE_Audio)

         '  search for matching codec
         Dim codecindex As Integer = 0
         Do While codecindex < codecs
            Dim formats As Integer = manager.GetCodecFormatCount(Leadtools.Multimedia.Constants.MEDIATYPE_Audio, codecindex)
            Dim formatindex As Integer = 0
            Do While formatindex < formats
               codecformat = manager.GetCodecFormat(Leadtools.Multimedia.Constants.MEDIATYPE_Audio, codecindex, formatindex)
               mediatype = codecformat.GetMediaType()
               If mediatype.FormatType = Leadtools.Multimedia.Constants.FORMAT_WaveFormatEx Then
                  ByteArrayToStruct(mediatype.Format, wfex)

                  Dim diff As Integer = ((wfex.nAvgBytesPerSec * 8) - prefbitrate)
                  If diff < 250 AndAlso diff > -250 AndAlso wfex.nSamplesPerSec = samplespersec AndAlso wfex.nChannels = channels AndAlso wfex.wFormatTag = formattag Then
                     If candidate Then
                        If withvideo Then
                           ' 
                           '  For audio/video configurations, we want to
                           '  find the smaller blockalign. In this case, 
                           '  the blockalign is larger, so we want to
                           '  use the old format. 
                           If wfex.nBlockAlign <= candidatewfex.nBlockAlign Then
                              candidatewfex = wfex
                              candidatemt = mediatype
                           End If
                        ElseIf wfex.nBlockAlign >= candidatewfex.nBlockAlign Then
                           candidatewfex = wfex
                           candidatemt = mediatype
                        End If
                     Else
                        candidate = True
                        candidatewfex = wfex
                        candidatemt = mediatype
                     End If
                  End If
               End If
               formatindex += 1
            Loop
            codecindex += 1
         Loop

         If candidate Then
            '  modify the selected codec to support this bitrate and format
            mt = New MediaType()
            mt.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Audio
            mt.SubType = "{" & String.Format("{08:X}", formattag) & "-0000-0010-8000-00AA00389B71}"
            mt.FixedSizeSamples = True
            mt.TemporalCompression = False
            mt.SampleSize = candidatewfex.nBlockAlign
            mt.FormatType = Leadtools.Multimedia.Constants.FORMAT_WaveFormatEx
            mt.SetFormatData(-1, candidatemt.Format)
            stream = profile.CreateNewStream(Leadtools.Multimedia.Constants.MEDIATYPE_Audio)
            stream.StreamNumber = streamnum
            stream.StreamName = "Audio Stream"
            stream.ConnectionName = "Audio"
            stream.Bitrate = (candidatewfex.nAvgBytesPerSec * 8)
            stream.SetMediaType(mt)
            profile.AddStream(stream)
            profile.ReconfigStream(stream)
            added = True
         End If

         Return added
      End Function

      Private Sub StructToByteArray(ByVal o As Object, ByRef dest As Byte())
         Try
            'convert the structure to a byte array
            Dim rawSize As Integer = Marshal.SizeOf(o)
            Dim handle As GCHandle = New GCHandle()
            Dim buffer As IntPtr

            handle = GCHandle.Alloc(dest, GCHandleType.Pinned)
            buffer = handle.AddrOfPinnedObject()
            Marshal.StructureToPtr(o, buffer, False)
            handle.Free()
         Catch ex As Exception
            Throw ex
         End Try
      End Sub

      Private Sub ByteArrayToStruct(ByVal buffer As Object, ByRef vih As WaveFormatEx)
         Try
            Dim handle As GCHandle = New GCHandle()

            'convert the structure to a byte array
            handle = GCHandle.Alloc(buffer, GCHandleType.Pinned)
            Dim ptr As IntPtr = handle.AddrOfPinnedObject()
            vih = CType(Marshal.PtrToStructure(ptr, GetType(WaveFormatEx)), WaveFormatEx)
            handle.Free()
         Catch ex As Exception
            Throw ex
         End Try
      End Sub

      Private Function AddMutexObject(ByVal profile As WMProfile, ByVal basestream As Integer, ByVal streamcount As Integer) As Boolean
         Dim excl As WMMutualExclusion = profile.CreateNewMutualExclusion()

         '  indicate that the streams differ by bit rate
         excl.Type = "{D6E22A01-35DA-11D1-9034-00A0C90349BE}"
         Dim i As Integer = 0
         Do While i < streamcount
            excl.AddStream(basestream + i)
            i += 1
         Loop

         '  assign the exclusion object to the profile
         profile.AddMutualExclusion(excl)
         Return True
      End Function

      Private Function RemoveMutexObject(ByVal profile As WMProfile, ByVal excl As WMMutualExclusion, ByVal basestream As Integer, ByVal streamcount As Integer) As Boolean
         '  indicate that the streams differ by bit rate
         excl.Type = "{D6E22A01-35DA-11D1-9034-00A0C90349BE}"
         Dim i As Integer = 0
         Do While i < streamcount
            excl.RemoveStream(basestream + i)
            i += 1
         Loop

         '  remove the exclusion object from the profile
         profile.RemoveMutualExclusion(excl)
         Return True
      End Function

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();
      const int CODEC_AUDIO_MSAUDIO = 353;       //  Microsoft WMAudio
      const int CODEC_VIDEO_WMV1 = 827739479;    //  FOURCC( 'W', 'M', 'V', '1' ) 

      public void AddStreamExample()
      {
         ConvertCtrl convertctrl = _form.ConvertCtrl;
         string inFile = Path.Combine(LEAD_VARS.MediaDir,"ConvertCtrl_Source.avi");
         string outFile = Path.Combine(LEAD_VARS.MediaDir,"WMProfile_RemoveStreamExample.avi");

         try
         {
            WMProfileManager manager = new WMProfileManager();

            // create a WMProfile
            convertctrl.WMProfile = CreateCustomProfile(manager);

            // get the video stream and remove it from the config
            WMStreamConfig strm = convertctrl.WMProfile.GetStream(0);
            convertctrl.WMProfile.RemoveStream(strm);

            // dispose of the manager
            manager.Dispose();
         }
         catch (Exception)
         {
            _result = false;
         }

         // we'll loop on the state and pump messages for this example.
         // but you should not need to if running from a Windows Forms application.
         while (convertctrl.State == ConvertState.Running)
            Application.DoEvents();
      }

      private WMProfile CreateCustomProfile(WMProfileManager manager)
      {
         WMProfile profile = manager.CreateEmptyProfile(WMT_Version.V8);
         profile.Name = "Custom Profile";
         profile.Description = "Custom Profile Description";

         bool added = AddAudioStream(manager, profile, 1, CODEC_AUDIO_MSAUDIO, 8000, 8000, 1, true);

         for (int i = 0; (i <= 4); i++)
            AddVideoStream(manager, profile, (2 + i), CODEC_VIDEO_WMV1, (1024 * 20) + i * 1024, 320, 240, 5 * (i + 1), 0, 8);

         //  mark all the video streams for mutual exclusion
         AddMutexObject(profile, 2, 5);
         return profile;
      }

      private bool AddVideoStream(WMProfileManager manager, WMProfile profile, int streamnum, long fourcc, int bitrate, int width, int height, int fps, int quality, int secperkey)
      {
         WMStreamConfig codecformat;
         MediaType mediatype;
         VideoInfoHeader vih;
         bool candidate;
         VideoInfoHeader candidatevih = new VideoInfoHeader();
         MediaType candidatemt = null;
         MediaType mt = null;
         WMStreamConfig candidatestream = null;

         bool added = false;
         byte[] viharr = new byte[88];
         candidate = false;
         int codecs = manager.GetCodecInfoCount(Constants.MEDIATYPE_Video);

         string sinfo = string.Empty;
         //  search for matching codec
         for (int codecindex = 0; codecindex < codecs; codecindex++)
         {
            sinfo += manager.GetCodecName(Constants.MEDIATYPE_Video, codecindex);
            int formats = manager.GetCodecFormatCount(Constants.MEDIATYPE_Video, codecindex);

            for (int formatindex = 0; formatindex < formats; formatindex++)
            {
               sinfo += manager.GetCodecFormatDesc(Constants.MEDIATYPE_Video, codecindex, formatindex);
               codecformat = manager.GetCodecFormat(Constants.MEDIATYPE_Video, codecindex, formatindex);
               mediatype = codecformat.GetMediaType();

               if (mediatype.FormatType == Constants.FORMAT_VideoInfo)
               {
                  vih = mediatype.GetVideoFormatData();
                  if (vih.bmiHeader.biCompression == fourcc)
                  {
                     candidate = true;
                     candidatevih = vih;
                     candidatemt = mediatype;
                     candidatestream = codecformat;
                  }
               }
            }
         }
         if (candidate)
         {
            //  modify the selected codec to support this bitrate and size
            candidatevih.dwBitRate = bitrate;
            candidatevih.rcSource.Right = width;
            candidatevih.rcSource.Bottom = height;
            candidatevih.rcTarget.Right = width;
            candidatevih.rcTarget.Bottom = height;
            candidatevih.bmiHeader.biWidth = width;
            candidatevih.bmiHeader.biHeight = height;
            candidatevih.AvgTimePerFrame.lowpart = (int)((10000000 / fps) % 65536);
            candidatevih.AvgTimePerFrame.highpart = (int)((10000000 / fps) / 65536);

            StructToByteArray(candidatevih, ref viharr);

            candidatestream.Quality = quality;
            candidatestream.MaxKeyFrameSpacing = secperkey;
            candidatestream.StreamNumber = streamnum;
            candidatestream.StreamName = "Video Stream";
            candidatestream.ConnectionName = "Video";
            candidatestream.Bitrate = bitrate;
            candidatestream.SetMediaType(candidatemt);
            profile.AddStream(candidatestream);
            added = true;
         }
         return added;
      }

      private bool AddAudioStream(WMProfileManager manager, WMProfile profile, int streamnum, int formattag, int prefbitrate, int samplespersec, int channels, bool withvideo)
      {
         WMStreamConfig codecformat;
         MediaType mediatype;
         WaveFormatEx wfex = new WaveFormatEx();
         bool added = false;
         bool candidate;
         WaveFormatEx candidatewfex = new WaveFormatEx();
         MediaType candidatemt = null;
         MediaType mt;
         WMStreamConfig stream;
         candidate = false;
         int codecs = manager.GetCodecInfoCount(Constants.MEDIATYPE_Audio);

         //  search for matching codec
         for (int codecindex = 0; codecindex < codecs; codecindex++)
         {
            int formats = manager.GetCodecFormatCount(Constants.MEDIATYPE_Audio, codecindex);
            for (int formatindex = 0; formatindex < formats; formatindex++)
            {
               codecformat = manager.GetCodecFormat(Constants.MEDIATYPE_Audio, codecindex, formatindex);
               mediatype = codecformat.GetMediaType();
               if (mediatype.FormatType == Constants.FORMAT_WaveFormatEx)
               {
                  ByteArrayToStruct(mediatype.Format, ref wfex);

                  int diff = ((wfex.nAvgBytesPerSec * 8) - prefbitrate);
                  if (diff < 250 && diff > -250
                      && wfex.nSamplesPerSec == samplespersec
                      && wfex.nChannels == channels
                      && wfex.wFormatTag == formattag)
                  {
                     if (candidate)
                     {
                        if (withvideo)
                        {
                           // 
                           //  For audio/video configurations, we want to
                           //  find the smaller blockalign. In this case, 
                           //  the blockalign is larger, so we want to
                           //  use the old format. 
                           if (wfex.nBlockAlign <= candidatewfex.nBlockAlign)
                           {
                              candidatewfex = wfex;
                              candidatemt = mediatype;
                           }
                        }
                        else if (wfex.nBlockAlign >= candidatewfex.nBlockAlign)
                        {
                           candidatewfex = wfex;
                           candidatemt = mediatype;
                        }
                     }
                     else
                     {
                        candidate = true;
                        candidatewfex = wfex;
                        candidatemt = mediatype;
                     }
                  }
               }
            }
         }

         if (candidate)
         {
            //  modify the selected codec to support this bitrate and format
            mt = new MediaType();
            mt.Type = Constants.MEDIATYPE_Audio;
            mt.SubType = "{" + String.Format("{08:X}", formattag) + "-0000-0010-8000-00AA00389B71}";
            mt.FixedSizeSamples = true;
            mt.TemporalCompression = false;
            mt.SampleSize = candidatewfex.nBlockAlign;
            mt.FormatType = Constants.FORMAT_WaveFormatEx;
            mt.SetFormatData(-1, candidatemt.Format);
            stream = profile.CreateNewStream(Constants.MEDIATYPE_Audio);
            stream.StreamNumber = streamnum;
            stream.StreamName = "Audio Stream";
            stream.ConnectionName = "Audio";
            stream.Bitrate = (candidatewfex.nAvgBytesPerSec * 8);
            stream.SetMediaType(mt);
            profile.AddStream(stream);
            profile.ReconfigStream(stream);
            added = true;
         }

         return added;
      }

      private void StructToByteArray(object o, ref byte[] dest)
      {
         try
         {
            //convert the structure to a byte array
            int rawSize = Marshal.SizeOf(o);
            GCHandle handle = new GCHandle();
            IntPtr buffer;

            handle = GCHandle.Alloc(dest, GCHandleType.Pinned);
            buffer = handle.AddrOfPinnedObject();
            Marshal.StructureToPtr(o, buffer, false);
            handle.Free();
         }
         catch (Exception ex)
         {
            throw ex;
         }
      }

      private void ByteArrayToStruct(object buffer, ref WaveFormatEx vih)
      {
         try
         {
            GCHandle handle = new GCHandle();

            //convert the structure to a byte array
            handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
            IntPtr ptr = handle.AddrOfPinnedObject();
            vih = (WaveFormatEx)Marshal.PtrToStructure(ptr, typeof(WaveFormatEx));
            handle.Free();
         }
         catch (Exception ex)
         {
            throw ex;
         }
      }

      private bool AddMutexObject(WMProfile profile, int basestream, int streamcount)
      {
         WMMutualExclusion excl = profile.CreateNewMutualExclusion();

         //  indicate that the streams differ by bit rate
         excl.Type = "{D6E22A01-35DA-11D1-9034-00A0C90349BE}";
         for (int i = 0; i < streamcount; i++)
            excl.AddStream(basestream + i);

         //  assign the exclusion object to the profile
         profile.AddMutualExclusion(excl);
         return true;
      }

      private bool RemoveMutexObject(WMProfile profile, WMMutualExclusion excl, int basestream, int streamcount)
      {
         //  indicate that the streams differ by bit rate
         excl.Type = "{D6E22A01-35DA-11D1-9034-00A0C90349BE}";
         for (int i = 0; i < streamcount; i++)
            excl.RemoveStream(basestream + i);

         //  remove the exclusion object from the profile
         profile.RemoveMutualExclusion(excl);
         return true;
      }

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

Remarks

Gets the number of the stream at the specified index in the stream's list. The indexes are zero-based and range from 0 to StreamCount - 1. Stream numbers are in the range of 1 to 63. For more information, refer to the Microsoft documentation for IWMMutualExclusion.GetStreams.

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