#include-once

; #INDEX# =======================================================================================================================
; Title .........: GDIPlusVideo
; AutoIt Version : 3.3.6+
; Language ......: Deutsch
; Description ...: Funktionen um Videodateien in einer GUI abzuspielen. Es kann immer nur eine Datei zur selben Zeit laufen!
;				   Diese UDF nutzt die Funktionen des Kommandozeilenprogrammes FFMPEG.exe (=>http://www.ffmpeg.org)
; Author ........: name22 (www.autoit.de)
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
;_GDIPlusVideo_Startup
;_GDIPlusVideo_Shutdown
;_GDIPlusVideo_Load
;_GDIPlusVideo_Dispose
;_GDIPlusVideo_Register
;_GDIPlusVideo_UnRegister
;_GDIPlusVideo_Play
;_GDIPlusVideo_Stop
; ===============================================================================================================================

; #INTERNAL_USE_ONLY# ===========================================================================================================
;__GDIPlusVideo_DrawFrame
; ===============================================================================================================================

#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

Global $aFrames, $iVideoWidth, $iVideoHeight, $hWnd_Video, $hDC_Video, $hDC_Buffer, $hGraphics_Video, $hBitmap_Buffer, $iStatus_Video = 0, $iPlayMode, $iCurFrame = 1, $nT_RunningTime, $iVideoLength, $sTmpFolder

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlusVideo_Startup
; Description ...: Initialisiert die benötigten Ressourcen für die übrigen Funktionen.
; Syntax.........: _GDIPlusVideo_Startup()
; Parameters ....: -
; Return values .: -
; Author ........: name22 (autoit.de)
; Remarks .......: -
; ===============================================================================================================================
Func _GDIPlusVideo_Startup()
	_GDIPlus_Startup()
EndFunc   ;==>_GDIPlusVideo_Startup

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlusVideo_Load
; Description ...: Lädt eine Videodatei in den Speicher um sie später abspielen zu können und erzeugt ein dazugehöriges Childfenster.
; Syntax.........: _GDIPlusVideo_Load($hWnd_GUI, $iX, $iY, $sPath_Video, $iLength, [$sPath_FFMPEG = 'FFMPEG.exe'])
; Parameters ....: $hWnd_GUI        - Handle zum Fenster in dem das Video abgespielt werden soll.
;				   $iX              - X-Koordinate der Position des Videos (relativ zu $hWnd_GUI).
;				   $iY              - Y-Koordinate der Position des Videos (relativ zu $hWnd_GUI).
;                  $sPath_Video     - Pfad zur Videodatei.
;                  $iLength         - Länge des Videos in Millisekunden.
;                  $sPath_FFMPEG    - [optional] Pfad zur FFMPEG.exe.
; Return values .: -
; Author ........: name22 (www.autoit.de)
; Remarks .......: Das Video darf auf keinen Fall zu groß sein, da die gesamten Daten in den Arbeitsspeicher geladen werden.
;				   Außerdem erhöht sich die Funktionsdauer mit der Größe der Datei.
; ===============================================================================================================================
Func _GDIPlusVideo_Load($hWnd_GUI, $iX, $iY, $sPath_Video, $iLength, $sPath_FFMPEG = 'FFMPEG.exe')
	$iVideoLength = $iLength

	$iRandom = Random(100000, 999999, 1)
	While Not DirGetSize(@TempDir & "\" & $iRandom) = -1
		$iRandom = Random(100000, 999999, 1)
	WEnd
	$sTmpFolder = @TempDir & "\" & $iRandom
	DirCreate($sTmpFolder)

	RunWait($sPath_FFMPEG & ' -sameq -i "' & $sPath_Video & '" "' & $sTmpFolder & '\Frame %d.png"', @ScriptDir, @SW_HIDE)

	$oFSO = ObjCreate("Scripting.FileSystemObject")
	$iFileCount = $oFSO.GetFolder($sTmpFolder).Files.Count

	Dim $aFrames[$iFileCount + 1] = [$iFileCount]

	For $i = 1 To $aFrames[0]
		$aFrames[$i] = _GDIPlus_ImageLoadFromFile($sTmpFolder & "\Frame " & $i & ".png")
;~ 		$hGraphicsTmp = _GDIPlus_ImageGetGraphicsContext($aFrames[$i])
		;Hier könnte noch ein Wasserzeichen o.Ä. eingefügt werden.
;~ 		_GDIPlus_GraphicsDispose($hGraphicsTmp)
	Next
	$iVideoWidth = _GDIPlus_ImageGetWidth($aFrames[1])
	$iVideoHeight = _GDIPlus_ImageGetHeight($aFrames[1])

	$hWnd_Video = GUICreate("", $iVideoWidth, $iVideoHeight, $iX, $iY, $WS_POPUP, $WS_EX_MDICHILD, $hWnd_GUI)

	$hDC_Video = _WinAPI_GetDC($hWnd_Video)
	$hDC_Buffer = _WinAPI_CreateCompatibleDC($hDC_Video)
	$hBitmap_Buffer = _WinAPI_CreateCompatibleBitmap($hDC_Video, $iVideoWidth, $iVideoHeight)
	_WinAPI_SelectObject($hDC_Buffer, $hBitmap_Buffer)

	$hGraphics_Video = _GDIPlus_GraphicsCreateFromHDC($hDC_Buffer)
	_GDIPlus_GraphicsSetSmoothingMode($hGraphics_Video, 2)
EndFunc   ;==>_GDIPlusVideo_Load

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlusVideo_Dispose
; Description ...: Entfernt die mit _GDIPlusVideo_Load geladenen Videodaten aus dem Arbeitsspeicher.
; Syntax.........: _GDIPlusVideo_Dispose()
; Parameters ....: -
; Return values .: -
; Author ........: name22 (www.autoit.de)
; Remarks .......: Diese Funktion sollte aufgerufen werden, wenn das Video nicht mehr gebraucht wird.
; ===============================================================================================================================
Func _GDIPlusVideo_Dispose()
	For $i = 1 To $aFrames[0]
		_GDIPlus_ImageDispose($aFrames[$i])
	Next
	DirRemove($sTmpFolder, 1)

	GUIDelete($hWnd_Video)

	_WinAPI_ReleaseDC($hWnd_Video, $hDC_Video)
	_WinAPI_DeleteDC($hDC_Buffer)
	_WinAPI_DeleteObject($hBitmap_Buffer)

	_GDIPlus_GraphicsDispose($hGraphics_Video)
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlusVideo_Shutdown
; Description ...: Entfernt die mit _GDIPlusVideo_Startup initialisieten Daten aus dem Speicher.
; Syntax.........: _GDIPlusVideo_Shutdown()
; Parameters ....: -
; Return values .: -
; Author ........: name22 (www.autoit.de)
; Remarks .......: Diese Funtion sollte aufgerufen werden, wenn die Funktionen der UDF nicht mehr gebraucht werden.
; ===============================================================================================================================
Func _GDIPlusVideo_Shutdown()
	_GDIPlus_Shutdown()
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlusVideo_Play
; Description ...: Spielt das geladene Video ab.
; Syntax.........: _GDIPlusVideo_Play($iMode = 1)
; Parameters ....: $iMode        - [optional] Abspielmodus für das Video. 1 = Stetiges Wiederholen.
;																		  2 = Einmaliges Abspielen.
; Return values .: -
; Author ........: name22 (www.autoit.de)
; Remarks .......: -
; ===============================================================================================================================
Func _GDIPlusVideo_Play($iMode = 1)
	$iStatus_Video = 1
	$iPlayMode = $iMode

	$iCurFrame = 1
	GUISetState(@SW_SHOW, $hWnd_Video)
	$nT_RunningTime = TimerInit()
	AdlibRegister("__GDIPlusVideo_DrawFrame", 20)
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlusVideo_Stop
; Description ...: Stoppt das laufende Video.
; Syntax.........: _GDIPlusVideo_Stop()
; Parameters ....: -
; Return values .: -
; Author ........: name22 (www.autoit.de)
; Remarks .......: -
; ===============================================================================================================================
Func _GDIPlusVideo_Stop()
	$iStatus_Video = 0

	GUISetState(@SW_HIDE, $hWnd_Video)
	AdlibUnRegister("__GDIPlusVideo_DrawFrame")
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: __GDIPlusVideo_DrawFrame
; Description ...: Zeichnet das entsprechende Einzelbild des Videos.
; Syntax.........: __GDIPlusVideo_DrawFrame()
; Parameters ....: -
; Return values .: -
; Author ........: name22 (www.autoit.de)
; Remarks .......: Intern genutzte Funktion.
; ===============================================================================================================================
Func __GDIPlusVideo_DrawFrame()
	_GDIPlus_GraphicsClear($hGraphics_Video, 0)
	$iCurFrame = Ceiling(TimerDiff($nT_RunningTime) / $iVideoLength * $aFrames[0])
	If $iCurFrame > $aFrames[0] Then
		Switch $iPlayMode
			Case 1
				$iCurFrame = 1
		        $nT_RunningTime = TimerInit()
			Case 2
				_GDIPlusVideo_Stop()
		EndSwitch
	EndIf
	_GDIPlus_GraphicsDrawImageRect($hGraphics_Video, $aFrames[$iCurFrame], 0, 0, $iVideoWidth, $iVideoHeight)
	_WinAPI_BitBlt($hDC_Video, 0, 0, $iVideoWidth, $iVideoHeight, $hDC_Buffer, 0, 0, $SRCCOPY)
EndFunc



;Copyright name22 (@http://www.autoit.de/) Tuesday, 24th May 2011