Leadtools.Multimedia Namespace > MediaType Class : SetFormatData Method |
Public _result As Boolean = False Public _form As ConvertCtrlForm = New ConvertCtrlForm() Public Sub GetFormatDataExample() ' reference the convert control Dim convertctrl As ConvertCtrl = _form.ConvertCtrl ' input file and output files Dim inFile As String = Path.Combine(LEAD_VARS.MediaDir, "MediaType_ShortSource.avi") Dim outFilePfx As String = Path.Combine(LEAD_VARS.MediaDir, "MediaType_GetFormatDataExample") Dim sampleFileName As String ' This example demonstrates how to use SampleTarget and MediaSample ' objects to directly access sample frames from a conversion graph. Try ' set the source and target files convertctrl.SourceFile = inFile ' set the preview convertctrl.Preview = True ' create a new sample target Dim st As SampleTarget = New SampleTarget() ' set the target media type for the video stream Dim mtTarget As MediaType = New MediaType() mtTarget.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Video mtTarget.SubType = Leadtools.Multimedia.Constants.MEDIASUBTYPE_RGB24 ' set the sample target's accepted media type st.SetAcceptedMediaType(mtTarget) ' assign the sample target to the capture control convertctrl.TargetObject = st convertctrl.TargetFormat = TargetFormatType.StillImage ' run the convert convertctrl.StartConvert() Dim msFrame As MediaSample = st.GetSample(1000) Dim sampleStart, sampleStop As Long Do While Not msFrame Is Nothing ' get the sample target's connected media type Dim mtSample As MediaType = st.GetConnectedMediaType() ' demonstrate media type properties copy Dim mtCopy As MediaType = New MediaType() CopyMediaTypeAttributes(mtSample, mtCopy) ' get the sample times msFrame.GetTime(sampleStart, sampleStop) ' create the file name for this frame bitmap sampleFileName = String.Format("{0}_{1}-{2}.bmp", outFilePfx, sampleStart, sampleStop) ' create the bitmap for this frame WriteSampleBitmap(sampleFileName, msFrame, mtSample) ' mtCopy); Try ' create a media sample using the captured sample from above msFrame = st.GetSample(1000) Catch cex As COMException ' if we have reached the end of stream we are finished If cex.ErrorCode = CInt(ErrorCode.VFW_E_SAMPLE_REJECTED_EOS) _ OrElse cex.ErrorCode = CInt(ErrorCode.VFW_E_WRONG_STATE) Then Exit Do ElseIf cex.ErrorCode = CInt(ErrorCode.VFW_E_TIMEOUT) Then Continue Do Else Throw cex End If End Try ' set the result _result = True ' 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. If convertctrl.State = ConvertState.Running Then Application.DoEvents() End If Loop Catch e1 As Exception _result = False End Try End Sub Private Function CopyMediaTypeAttributes(ByVal pSource As MediaType, ByVal pDest As MediaType) As Boolean Dim fmtDataSize As Integer ' return error if either source or dest is null If pSource Is Nothing OrElse pDest Is Nothing Then Return False End If ' get the format data size fmtDataSize = pSource.FormatSize ' any format data If fmtDataSize > 0 Then pDest.SetFormatData(fmtDataSize, pSource.GetFormatData(fmtDataSize)) ' yes, then copy it Else pDest.FormatSize = 0 ' no, just set the dest size to zero End If ' copy type, subtype, formattype pDest.Type = pSource.Type pDest.SubType = pSource.SubType pDest.FormatType = pSource.FormatType ' set dest fixed size samples and temporal compression pDest.FixedSizeSamples = pSource.FixedSizeSamples pDest.TemporalCompression = pSource.TemporalCompression ' copy samplesize pDest.SampleSize = pSource.SampleSize Return True End Function Private Function WriteSampleBitmap(ByVal outFile As String, ByVal ms As MediaSample, ByVal mt As MediaType) As Bitmap ' get the video information Dim vih As VideoInfoHeader = mt.GetVideoFormatData() ' create a bitmap to hold the sample and copy it Dim bmp As Bitmap = New Bitmap(vih.bmiHeader.biWidth, vih.bmiHeader.biHeight, FormatFromBitCount(vih.bmiHeader.biBitCount)) Dim bmpData As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat) Marshal.Copy(ms.Buffer, 0, bmpData.Scan0, GetBitmapSize(bmp, vih.bmiHeader.biBitCount)) bmp.UnlockBits(bmpData) ' flip the upside down buffer bmp.RotateFlip(RotateFlipType.Rotate180FlipX) ' save the image bmp.Save(outFile, ImageFormat.Bmp) Return bmp End Function Private Function FormatFromBitCount(ByVal bitCount As Integer) As PixelFormat Select Case bitCount Case 8 Return PixelFormat.Format8bppIndexed Case 16 Return PixelFormat.Format16bppRgb555 Case 32 Return PixelFormat.Format32bppRgb Case 48 Return PixelFormat.Format48bppRgb Case 24 Return PixelFormat.Format24bppRgb End Select Throw New Exception("Unrecognized bit count") End Function Private Function GetBitmapSize(ByVal bmp As Bitmap, ByVal bitCount As Integer) As Integer Dim pixelSize As Integer = CInt(Math.Log(CDbl(bitCount))) Return (bmp.Width * pixelSize + pixelSize And (Not 3)) * bmp.Height End Function Private Function GetBitmapScanRowSize(ByVal bmpSize As Integer, ByVal stride As Integer, ByVal width As Integer) As Integer Return CInt(bmpSize / (stride / width)) End Function 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 void GetFormatDataExample() { // reference the convert control ConvertCtrl convertctrl = _form.ConvertCtrl; // input file and output files string inFile = Path.Combine(LEAD_VARS.MediaDir,"MediaType_ShortSource.avi"); string outFilePfx = Path.Combine(LEAD_VARS.MediaDir,"MediaType_GetFormatDataExample"); string sampleFileName; // This example demonstrates how to use SampleTarget and MediaSample // objects to directly access sample frames from a conversion graph. try { // set the source and target files convertctrl.SourceFile = inFile; // set the preview convertctrl.Preview = true; // create a new sample target SampleTarget st = new SampleTarget(); // set the target media type for the video stream MediaType mtTarget = new MediaType(); mtTarget.Type = Constants.MEDIATYPE_Video; mtTarget.SubType = Constants.MEDIASUBTYPE_RGB24; // set the sample target's accepted media type st.SetAcceptedMediaType(mtTarget); // assign the sample target to the capture control convertctrl.TargetObject = st; convertctrl.TargetFormat = TargetFormatType.StillImage; // run the convert convertctrl.StartConvert(); MediaSample msFrame = st.GetSample(1000); long sampleStart, sampleStop; while (msFrame != null) { // get the sample target's connected media type MediaType mtSample = st.GetConnectedMediaType(); // demonstrate media type properties copy MediaType mtCopy = new MediaType(); CopyMediaTypeAttributes(mtSample, mtCopy); // get the sample times msFrame.GetTime(out sampleStart, out sampleStop); // create the file name for this frame bitmap sampleFileName = string.Format("{0}_{1}-{2}.bmp", outFilePfx, sampleStart, sampleStop); // create the bitmap for this frame WriteSampleBitmap(sampleFileName, msFrame, mtSample); // mtCopy); try { // create a media sample using the captured sample from above msFrame = st.GetSample(1000); } catch (COMException cex) { // if we have reached the end of stream we are finished if (cex.ErrorCode == (int)ErrorCode.VFW_E_SAMPLE_REJECTED_EOS || cex.ErrorCode == (int)ErrorCode.VFW_E_WRONG_STATE) break; else if (cex.ErrorCode == (int)ErrorCode.VFW_E_TIMEOUT) continue; else throw cex; } // set the result _result = true; // 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. if (convertctrl.State == ConvertState.Running) Application.DoEvents(); } } catch (Exception) { _result = false; } } private bool CopyMediaTypeAttributes(MediaType pSource, MediaType pDest) { int fmtDataSize; // return error if either source or dest is null if (pSource == null || pDest == null) return false; // get the format data size fmtDataSize = pSource.FormatSize; // any format data if (fmtDataSize > 0) pDest.SetFormatData(fmtDataSize, pSource.GetFormatData(fmtDataSize)); // yes, then copy it else pDest.FormatSize = 0; // no, just set the dest size to zero // copy type, subtype, formattype pDest.Type = pSource.Type; pDest.SubType = pSource.SubType; pDest.FormatType = pSource.FormatType; // set dest fixed size samples and temporal compression pDest.FixedSizeSamples = pSource.FixedSizeSamples; pDest.TemporalCompression = pSource.TemporalCompression; // copy samplesize pDest.SampleSize = pSource.SampleSize; return true; } private Bitmap WriteSampleBitmap(string outFile, MediaSample ms, MediaType mt) { // get the video information VideoInfoHeader vih = mt.GetVideoFormatData(); // create a bitmap to hold the sample and copy it Bitmap bmp = new Bitmap(vih.bmiHeader.biWidth, vih.bmiHeader.biHeight, FormatFromBitCount(vih.bmiHeader.biBitCount)); BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); Marshal.Copy(ms.Buffer, 0, bmpData.Scan0, GetBitmapSize(bmp, vih.bmiHeader.biBitCount)); bmp.UnlockBits(bmpData); // flip the upside down buffer bmp.RotateFlip(RotateFlipType.Rotate180FlipX); // save the image bmp.Save(outFile, ImageFormat.Bmp); return bmp; } private PixelFormat FormatFromBitCount(int bitCount) { switch (bitCount) { case 8: return PixelFormat.Format8bppIndexed; case 16: return PixelFormat.Format16bppRgb555; case 32: return PixelFormat.Format32bppRgb; case 48: return PixelFormat.Format48bppRgb; case 24: return PixelFormat.Format24bppRgb; } throw new Exception("Unrecognized bit count"); } private int GetBitmapSize(Bitmap bmp, int bitCount) { int pixelSize = (int)Math.Log((double)bitCount); return (bmp.Width * pixelSize + pixelSize & ~3) * bmp.Height; } private int GetBitmapScanRowSize(int bmpSize, int stride, int width) { return bmpSize / (stride / width); } static class LEAD_VARS { public const string MediaDir = @"C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 175\Media"; }
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