help with Escapi 3.0 DLL

BlitzMax Forums/BlitzMax Programming/help with Escapi 3.0 DLL

Fielder(Posted 2015) [#1]
this is a working example for escapi 2.1 (that is working with 2.1 dll)

Type SimpleCapParams
	Field mTargetBuf:Byte Ptr ' Must be at least mWidth * mHeight * SizeOf(Int) of size! 
	Field mWidth
	Field mHeight
End Type

Global InitCOM () "C"
Global CountCaptureDevices () "C"
Global OpenCaptureDevice (device, scp:Byte Ptr) "C"
Global CloseCaptureDevice (device) "C"
Global GetCapture (device) "C"
Global CaptureDone (device) "C"
Global CaptureDeviceName (device, name:Byte Ptr, namelen) "C"
Global ESCAPIDLLVersion () "C"

Function SetupESCAPI ()

	esc = LoadLibraryA ("escapi.dll") 'with escapi 2.1 everything works.. with escapi 3.0 ... NOT 
		
		InitCOM					= GetProcAddress (esc, "initCOM")
		CountCaptureDevices		= GetProcAddress (esc, "countCaptureDevices")
		OpenCaptureDevice 		= GetProcAddress (esc, "initCapture")
		CloseCaptureDevice		= GetProcAddress (esc, "deinitCapture")
		GetCapture				= GetProcAddress (esc, "doCapture")
		CaptureDone				= GetProcAddress (esc, "isCaptureDone")
		CaptureDeviceName		= GetProcAddress (esc, "getCaptureDeviceName")
		ESCAPIDLLVersion		= GetProcAddress (esc, "ESCAPIDLLVersion")

		If InitCOM = Null Or CountCaptureDevices = Null Or OpenCaptureDevice = Null Or..
			CloseCaptureDevice = Null Or GetCapture = Null Or CaptureDone = Null Or..
				CaptureDeviceName = Null Or ESCAPIDLLVersion = Null
					DebugLog "Function missing!"
					Return 0
		EndIf

		InitCOM ()
		
	Return 1
	
End Function

Function CaptureDevice$ (device)
	Local cam:Byte [1024]
	CaptureDeviceName (device, cam, 1024)
	Return String.FromCString (cam)
End Function

If SetupESCAPI () = 0
	Notify "Error! Make sure escapi.dll is in same folder and capture device plugged in!"
	End
EndIf

For num = 0 Until CountCaptureDevices ()
	Print "Capture device [" + num + "] name: " + CaptureDevice (num)
Next

device = 0

width = 320
height = 240

AppTitle = "Using " + CaptureDevice (device) + "..."

Graphics width, height', 32

' Data structure...

Local scp:SimpleCapParams = New SimpleCapParams

' A PixMap for captured data...

pix:TPixmap = CreatePixmap (width, height, PF_BGRA8888)

' Stick pixmap memory pointer into data structure...

scp.mTargetBuf	= PixmapPixelPtr (pix)
scp.mWidth		= width
scp.mHeight		= height

' Start capture process...

If OpenCaptureDevice (device, scp) = 0
	Print "Failed to initialise capture device!"
	End
EndIf

Repeat
	GetCapture (device)
	
	Repeat
		If KeyHit (KEY_ESCAPE) Then quit = True
		Plot Rand(320),Rand(240) 'some random noise on background to be sure that app is working
		Flip 0 'this to draw noise 
		Delay(10) 'decrease cpu usage
	Until CaptureDone (device)

	DrawPixmap pix, 0, 0 'app don't reach this points because the capturedone is NOT DONE
	Flip 'this to draw everything if there is a camera image... (but i think there is no image)

Until quit = True
	
CloseCaptureDevice (device)

End


if the dll is replaced by 3.0 version ... i can't receive the image from CAM.

any idea on how to fix this?

Escapi sources: http://sol.gfxile.net/escapi/index.html


xlsior(Posted 2015) [#2]
This works with 3.0 for me:

Type SimpleCapParams
	Field mTargetBuf:Byte Ptr ' Must be at least mWidth * mHeight * SizeOf(Int) of size! 
	Field mWidth
	Field mHeight
End Type

Global InitCOM () "C"
Global CountCaptureDevices () "C"
Global OpenCaptureDevice (device, scp:Byte Ptr) "C"
Global CloseCaptureDevice (device) "C"
Global GetCapture (device) "C"
Global CaptureDone (device) "C"
Global CaptureDeviceName (device, name:Byte Ptr, namelen) "C"
Global ESCAPIDLLVersion () "C"
Global quit:Int

Function SetupESCAPI ()

	Global esc:Int = LoadLibraryA ("escapi.dll")
	
	If esc
	
		InitCOM					= GetProcAddress (esc, "initCOM")
		CountCaptureDevices		= GetProcAddress (esc, "countCaptureDevices")
		OpenCaptureDevice 		= GetProcAddress (esc, "initCapture")
		CloseCaptureDevice		= GetProcAddress (esc, "deinitCapture")
		GetCapture				= GetProcAddress (esc, "doCapture")
		CaptureDone				= GetProcAddress (esc, "isCaptureDone")
		CaptureDeviceName		= GetProcAddress (esc, "getCaptureDeviceName")
		ESCAPIDLLVersion		= GetProcAddress (esc, "ESCAPIDLLVersion")

		If InitCOM = Null Or CountCaptureDevices = Null Or OpenCaptureDevice = Null Or..
			CloseCaptureDevice = Null Or GetCapture = Null Or CaptureDone = Null Or..
				CaptureDeviceName = Null Or ESCAPIDLLVersion = Null
					DebugLog "Function missing!"
					Return 0
		EndIf

		InitCOM ()
		
		If ESCAPIDLLVersion () < $200
			DebugLog "Old DLL (needs version 2.0+)"
			Return 0
		EndIf
		
	Else
		DebugLog "Failed to open DLL"
		Return 0
	EndIf

	Return 1
	
End Function

Function CaptureDevice$ (device)
	Local cam:Byte [1024]
	CaptureDeviceName (device, cam, 1024)
	Return String.FromCString (cam)
End Function

If SetupESCAPI () = 0
	Notify "Error! Make sure escapi.dll is in same folder and capture device plugged in!"
	End
EndIf
Global num:Int
For num = 0 Until CountCaptureDevices ()
	Print "Capture device [" + num + "] name: " + CaptureDevice (num)
Next

Global device:Int = 0

' To list/select devices...

	'Repeat
	'	device = Int (Input ("Enter capture device number: "))
	'Until device > -1 And device < CountCaptureDevices ()

' Preferred target width/height (ESCAPI scales capture data to this)...

Global width:Int = 320
Global height:Int= 240

AppTitle = "Using " + CaptureDevice (device) + "..."

Graphics width, height', 32

' Data structure...

Local scp:SimpleCapParams = New SimpleCapParams

' A PixMap for captured data...

Global pix:TPixmap = CreatePixmap (width, height, PF_BGRA8888)

' Stick pixmap memory pointer into data structure...

scp.mTargetBuf	= PixmapPixelPtr (pix)
scp.mWidth		= width
scp.mHeight		= height

' Start capture process...

If OpenCaptureDevice (device, scp) = 0
	Print "Failed to initialise capture device!"
	End
EndIf

Repeat

	Cls

	GetCapture (device)
	
	Repeat
		If KeyHit (KEY_ESCAPE) Then quit = True
	Until CaptureDone (device)

	DrawPixmap pix, 0, 0

	Flip

Until quit = True

' Stop capture process...
	
CloseCaptureDevice (device)

End



Fielder(Posted 2015) [#3]
wait.. is the same demo from Escapi sources? or you have made some changes?

EDIT:
maybe i've found my issue.. i've downloaded the Escapi3 the release day (october) and the DLL is marked by date: 28-10-2015 ....

after the use of this DLL (just 1 time) the Escapi 3 from latest download (.. that has date 15-11-2015) doesn't works (black screen) .. (i need to reboot W10-PC to make the 15-11 version working...)

OMG why the dll is not marked 3.01 or 3.1 if there are differences from 28-10 and 15-11 versions ??? (grrr)

btw, thank xlsior for your help!