I am getting different results depending on whether ResizeMovie() is called. When I give it MovieWidth() and MovieHeight(), I get a partial image. If I give it my own values, I get nothing but black pixels.
Code: Select all
InitSprite()
;CAPTURE MODULE
;------------------
;by Mijikai
;Windows only!
;------------------
DeclareModule CAPTURE
Declare.i Target(Handle.i,*Area.RECT)
Declare.i Frame(*Capture)
Declare.l Pixel(*Capture,X.i,Y.i)
Declare.i Height(*Capture)
Declare.i Width(*Capture)
Declare.i Free(*Capture)
EndDeclareModule
Module CAPTURE
Structure CAPTURE_STRUCT
Handle.i
SDC.i
TDC.i
DIB.i
Bits.i
BMI.BITMAPINFO
Area.RECT
EndStructure
#CAPTUREBLT = $40000000
Procedure.i Target(Handle.i,*Area.RECT)
Protected *Capture.CAPTURE_STRUCT
If *Area
*Capture = AllocateMemory(SizeOf(CAPTURE_STRUCT))
If *Capture
With *Capture
\Handle = Handle
\SDC = GetDC_(\Handle)
If \SDC
\TDC = CreateCompatibleDC_(\SDC)
If \TDC
CopyMemory(*Area,@\Area,SizeOf(RECT))
\BMI\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
\BMI\bmiHeader\biWidth = \Area\right
\BMI\bmiHeader\biHeight = - \Area\bottom
\BMI\bmiHeader\biPlanes = 1
\BMI\bmiHeader\biBitCount = 32
\BMI\bmiHeader\biCompression = #BI_RGB
\DIB = CreateDIBSection_(\TDC,@\BMI,#DIB_RGB_COLORS,@\Bits,#Null,#Null)
If \DIB
If SelectObject_(\TDC,\DIB)
ProcedureReturn *Capture
EndIf
DeleteObject_(\DIB)
EndIf
DeleteDC_(\TDC)
EndIf
ReleaseDC_(\Handle,\SDC)
EndIf
EndWith
FreeMemory(*Capture)
EndIf
EndIf
EndProcedure
Procedure.i Frame(*Capture.CAPTURE_STRUCT)
With *Capture
ProcedureReturn BitBlt_(\TDC,#Null,#Null,\Area\right,\Area\bottom,\SDC,\Area\left,\Area\top,#SRCCOPY|#CAPTUREBLT)
EndWith
EndProcedure
Procedure.i Width(*Capture.CAPTURE_STRUCT)
ProcedureReturn *Capture\Area\right - 1
EndProcedure
Procedure.i Height(*Capture.CAPTURE_STRUCT)
ProcedureReturn *Capture\Area\bottom - 1
EndProcedure
Procedure.l Pixel(*Capture.CAPTURE_STRUCT,X.i,Y.i)
Protected *Pixel.Long
*Pixel = *Capture\Bits + ((Y * *Capture\Area\right + X) << 2)
ProcedureReturn *Pixel\l
EndProcedure
Procedure.i Free(*Capture.CAPTURE_STRUCT)
DeleteObject_(*Capture\DIB)
DeleteDC_(*Capture\TDC)
ReleaseDC_(*Capture\Handle,*Capture\SDC)
FreeMemory(*Capture)
EndProcedure
EndModule
;START OF DEMO
InitMovie()
LoadMovie(1,"handsfree big load.mp4")
MovieAudio(1,0,0)
OpenWindow(1,0,0,640,400,"");LEFT
OpenWindowedScreen(WindowID(1),0,0,640,400);LEFT
;ResizeMovie(1,0,0,640,360)
ResizeMovie(1,0,0,MovieWidth(1),MovieHeight(1))
;Debug MovieWidth(1): Debug MovieHeight(1)
OpenWindow(2,640,0,640,400,"");RIGHT
OpenWindowedScreen(WindowID(2),0,0,640,400);RIGHT
PlayMovie(1,WindowID(1)) ;: Delay(duration * 1000)
Delay(500)
;ResizeMovie(1,0,0,640,360)
PauseMovie(1)
TestRect.RECT
TestRect\left = 0
TestRect\right = 640
TestRect\top = 0
TestRect\bottom = 400
Task = CAPTURE::Target(WindowID(1),@TestRect)
Repeat
If Task
If CAPTURE::Frame(Task)
StartDrawing(WindowOutput(2))
For x = 0 To CAPTURE::Width(Task)
For y = 0 To CAPTURE::Height(Task)
Plot(x,y,CAPTURE::Pixel(Task,x,y));Swap Red & Blue for RGB if needed!
; Plot(x,y,$00ff00);Swap Red & Blue for RGB if needed!
Next
Next
StopDrawing()
EndIf
EndIf
Until WaitWindowEvent(50) = #PB_Event_CloseWindow
CloseWindow(2):CloseWindow(1)
End