@Frank: Vielen Dank für den Tipp, das wäre echt genial wenn das so funktionieren würde.
Leider bekomme ich die DeCompression nicht hin. Das Handle zum Decompressor holen geht.
Aber wenn ich den DeCompressor aufrufe gibts nen IMA.
Nachfolgend ein so nicht lauffähiges Code-Fragement. *dibSav ist bereits allokiert.
Was mache ich falsch? Kannst Du mir helfen?
Code: Alles auswählen
Structure VIDEOHDR
lpData.l ; address of video buffer
dwBufferLength.l ; size, in bytes, of the Data buffer
dwBytesUsed.l ; Bytes used
dwTimeCaptured.l ; time in ms since start
dwUser.l
dwFlags.l
dwReserved.l[4]
EndStructure
#ICERR_OK = 0
#ICMODE_COMPRESS = 1
#ICMODE_DECOMPRESS = 2
#ICMODE_FASTDECOMPRESS = 3
#ICMODE_QUERY = 4
#ICMODE_FASTCOMPRESS = 5
#ICMODE_DRAW = 8
#ICDECOMPRESS_HURRYUP = 0
#ICM_COMPRESS_GET_FORMAT = $4004
#ICM_COMPRESS_GET_SIZE = $4005
#ICM_COMPRESS_QUERY = $4006
#ICM_COMPRESS_BEGIN = $4007
#ICM_COMPRESS = $4008
#ICM_COMPRESS_END = $4009
#ICM_DECOMPRESS_GET_FORMAT = $400A
#ICM_DECOMPRESS_QUERY = $400B
#ICM_DECOMPRESS_BEGIN = $400C
#ICM_DECOMPRESS = $400D
#ICM_DECOMPRESS_END = $400E
Macro MAKEFOURCC(ch0, ch1, ch2, ch3)
(ch0 | (ch1 << 8)) | (ch2 << 16) | (ch3 << 24)
EndMacro
VfWLib = OpenLibrary(#PB_Any,"msvfw32.dll")
If VfWLib
Global *IcOpen = GetFunction(VfWLib, "ICOpen")
Global *IcDeCmpr = GetFunction(VfWLib, "ICDecompress" )
EndIf
Procedure CameraFrameCallback(hwnd.l, *lpVHdr.VIDEOHDR)
Protected bmiOrig.BITMAPINFO, bmiDest.BITMAPINFO
; Infos über das Bild/Videoformat holen um zu überprüfen ob die DIB
; Section komprimiert ist
SendMessage_ (hwnd, #WM_CAP_GET_VIDEOFORMAT, SizeOf(BITMAPINFO), @bmiOrig)
If bmiOrig\bmiHeader\biCompression
; Handle zum Decompressor to use
hCI = CallFunctionFast(*IcOpen, MAKEFOURCC('V','I','D','C'), bmiOrig\bmiHeader\biCompression, #ICMODE_DECOMPRESS)
If hCI
bmiDest\bmiHeader\biSize = SizeOf(bmiDest\bmiHeader)
bmiDest\bmiHeader\biWidth = bmiOrig\bmiHeader\biWidth
bmiDest\bmiHeader\biHeight = bmiOrig\bmiHeader\biHeight
bmiDest\bmiHeader\biCompression = 0
bmiDest\bmiHeader\biBitCount = 24
bmiDest\bmiHeader\biPlanes = 1
bmiDest\bmiHeader\biSizeImage = bmiOrig\bmiHeader\biWidth * bmiOrig\bmiHeader\biHeight * 3
; HIC HIC, DWORD dwFlags, LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, LPBITMAPINFOHEADER lpbi, LPVOID lpBits);
; Debug SendMessage_ (hwnd, #ICM_DECOMPRESS_BEGIN, @bmiOrig\bmiHeader, @bmiDest\bmiHeader)
hr = CallFunctionFast(*IcDeCmpr, hCI, #ICDECOMPRESS_HURRYUP, @bmiOrig\bmiHeader, *lpVHdr\lpData, @bmiDest\bmiHeader, *dibSav)
EndIf
Else
; DIB Sektion sichern
CopyMemory(*lpVHdr\lpData, *dibSav, *lpVHdr\dwBufferLength )
EndIf
EndProcedure