Thanks justin, it works.
But i have a strange problem, this code works with many videos, like mp4 videos, etc but the brightness and contrast don't work with avi videos without compression, do you have an idea ?
Code: Select all
;DShow.pb
;DirectShow video
;Justin 03/25
;Codecs
;https://github.com/Nevcairiel/LAVFilters/releases
EnableExplicit
Macro DEFINE_GUID(name, _l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
DataSection
name:
Data.l _l
Data.w w1, w2
Data.b b1, b2, b3, b4, b5, b6, b7, b8
EndDataSection
EndMacro
;- #VMR9Mode
#VMR9Mode_Windowed = $1
#VMR9Mode_Windowless = $2
#VMR9Mode_Renderless = $4
;- VMR9ProcAmpControl
Structure VMR9ProcAmpControl Align #PB_Structure_AlignC
dwSize.l
dwFlags.l
Brightness.f
Contrast.f
Hue.f
Saturation.f
EndStructure
;- #ProcAmpControl9_
#ProcAmpControl9_Brightness = $00000001
#ProcAmpControl9_Contrast = $00000002
#ProcAmpControl9_Hue = $00000004;nominal valid range from -180 to 180 degrees and a default value of 0.
#ProcAmpControl9_Saturation = $00000008
#ProcAmpControl9_Mask = $0000000F
; #ProcAmpControl9_Mask = Bitwise OR of all the previous flags. This value is used internally by the VMR-9, and is not a valid flag.
;- GUIDS
DEFINE_GUID(IID_IGraphBuilder, $56A868A9, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaControl, $56A868B1, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IBaseFilter, $56A86895, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IVMRFilterConfig9, $5A804648, $4F66, $4867, $9C, $43, $4F, $5C, $82, $2C, $F1, $B8)
DEFINE_GUID(IID_IVMRWindowlessControl9, $8F537D09, $F85E, $4414, $B2, $3B, $50, $2E, $54, $C7, $99, $27)
DEFINE_GUID(IID_IVMRMixerControl9, $1a777eaa, $47c8, $4930, $b2, $c9, $8f, $ee, $1c, $1b, $0f, $3b)
DEFINE_GUID(CLSID_FilterGraph, $E436EBB3, $524F, $11CE, $9F, $53, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(CLSID_VideoMixingRenderer9, $51B4ABF3, $748F, $4E3B, $A2, $76, $C8, $28, $33, $0E, $92, $6A)
;- _APP
Structure _APP
win.i
menu.i
pGraph.IGraphBuilder
pControl.IMediaControl
pVMRMixer.IVMRMixerControl9
pWC.IVMRWindowlessControl9
Brightness.f
Contrast.f
Width.i
Height.i
VideoW.i
VideoH.i
RatioW.i
RatioH.i
ContainerID.i
ContainerW.i
ContainerH.i
ContainerX.i
ContainerY.i
Filename.s
EndStructure
Global._APP app
;- DECLARES
Declare SetupVMR9(win.i)
Declare InitDirectShow(win.i)
Declare ReleaseDirectShow()
Declare ResizeVideo()
Procedure ResizeVideo()
Protected rc.RECT, w
;TODO aspect ratio (16/9 9/16, ...)
;Resize the video To fit the window
GetClientRect_(WindowID(app\win), @rc);:Debug rc\bottom
w = rc\right
ResizeGadget(app\ContainerID, #PB_Ignore , #PB_Ignore ,
WindowWidth(app\win) - GadgetX(app\ContainerID), rc\bottom - app\ContainerY)
GetClientRect_(app\ContainerID, @rc);:Debug rc\bottom
If app\pWC
app\pWC\SetVideoPosition(0, @rc)
EndIf
EndProcedure
Procedure GetSizeMovie()
; Protected lpWidth, lpHeight, lpARWidth, lpARHeight
app\pWC\GetNativeVideoSize(@app\VideoW, @app\VideoH, @app\RatioW, @app\RatioH)
Debug app\VideoW
Debug app\VideoH
Debug app\RatioW
Debug app\RatioH
EndProcedure
Procedure Load_Movie()
Protected.s filename
filename = OpenFileRequester("", "", "", 0)
If filename = "" : ProcedureReturn : EndIf
app\Filename = filename
;Stop current movie and release interfaces
If app\pGraph
ReleaseDirectShow()
EndIf
;Initialize interfaces
If InitDirectShow(app\win) = 0
MessageRequester("Error", "Failed To initialize DirectShow")
ProcedureReturn
EndIf
If app\pGraph\RenderFile(@filename, #Null) <> #S_OK
MessageRequester("Error", "Failed to render file, install codecs")
ProcedureReturn
EndIf
GetSizeMovie()
ResizeVideo()
app\pControl\Run()
EndProcedure
Procedure Load_Movie2(filename.s)
app\Filename = filename
;Stop current movie and release interfaces
If app\pGraph
ReleaseDirectShow()
EndIf
;Initialize interfaces
If InitDirectShow(app\win) = 0
MessageRequester("Error", "Failed To initialize DirectShow")
ProcedureReturn
EndIf
If app\pGraph\RenderFile(@filename, #Null) <> #S_OK
MessageRequester("Error", "Failed to render file, install codecs")
ProcedureReturn
EndIf
GetSizeMovie()
ResizeVideo()
app\pControl\Run()
EndProcedure
Procedure SetBrightness()
Protected.VMR9ProcAmpControl brightnessControl
brightnessControl\dwSize = SizeOf(VMR9ProcAmpControl)
brightnessControl\dwFlags = #ProcAmpControl9_Brightness
;Brightness range -99.9 to 100.0, neutral 0.0
brightnessControl\Brightness = app\Brightness
If app\pVMRMixer
app\pVMRMixer\SetProcAmpControl(0, @brightnessControl)
EndIf
EndProcedure
Procedure SetContrast()
; #ProcAmpControl9_Brightness = $00000001
; #ProcAmpControl9_Contrast = $00000002
; #ProcAmpControl9_Hue = $00000004
; #ProcAmpControl9_Saturation = $00000008
; #ProcAmpControl9_Mask = $0000000F
Protected.VMR9ProcAmpControl ContrastControl
ContrastControl\dwSize = SizeOf(VMR9ProcAmpControl)
ContrastControl\dwFlags = #ProcAmpControl9_Contrast
;Brightness range -99.9 to 100.0, neutral 0.0
ContrastControl\Contrast = app\Contrast
If app\pVMRMixer
app\pVMRMixer\SetProcAmpControl(0, @ContrastControl)
EndIf
EndProcedure
Procedure Run()
app\pControl\Run()
EndProcedure
Procedure Pause()
app\pControl\Pause()
; Debug app\pWC\RepaintVideo(WindowID(app\win),GadgetID(app\ContainerID))
EndProcedure
Procedure Stop()
app\pControl\Stop()
EndProcedure
Procedure SetupVMR9(win.i)
Protected.IBaseFilter pVMR9
Protected.IVMRFilterConfig9 pConfig
;Create the VMR9 filter
CoCreateInstance_(?CLSID_VideoMixingRenderer9, #Null, #CLSCTX_INPROC_SERVER, ?IID_IBaseFilter, @pVMR9)
;Add it To the graph
app\pGraph\AddFilter(pVMR9, @"VMR9")
pVMR9\QueryInterface(?IID_IVMRFilterConfig9, @pConfig)
If pConfig
pConfig\SetRenderingMode(#VMR9Mode_Windowless);#VMR9Mode_Windowed #VMR9Mode_Renderless
pConfig\Release()
EndIf
pVMR9\QueryInterface(?IID_IVMRWindowlessControl9, @app\pWC)
; app\pWC\SetVideoClippingWindow(WindowID(win))
app\pWC\SetVideoClippingWindow(GadgetID(app\ContainerID))
pVMR9\QueryInterface(?IID_IVMRMixerControl9, @app\pVMRMixer)
pVMR9\Release()
ProcedureReturn app\pVMRMixer
EndProcedure
Procedure InitDirectShow(win)
;Create GraphBuilder
If CoCreateInstance_(?CLSID_FilterGraph, #Null, #CLSCTX_INPROC_SERVER, ?IID_IGraphBuilder, @app\pGraph) = #S_OK
;Query MediaControl
If app\pGraph\QueryInterface(?IID_IMediaControl, @app\pControl) = #S_OK
;SetupVMR9
ProcedureReturn SetupVMR9(win)
EndIf
EndIf
ProcedureReturn 0 ;Error
EndProcedure
Procedure ReleaseDirectShow()
Protected.IEnumFilters pEnum
Protected.IBaseFilter pFilter
If app\pControl
app\pControl\Stop()
app\pControl\Release()
app\pControl = 0
EndIf
If app\pGraph
app\pGraph\EnumFilters(@pEnum)
If pEnum
While pEnum\Next(1, @pFilter, #Null) = #S_OK
app\pGraph\RemoveFilter(pFilter)
pFilter\Release()
pEnum\Reset()
Wend
pEnum\Release()
EndIf
app\pGraph\Release() : app\pGraph = 0
EndIf
If app\pVMRMixer : app\pVMRMixer\Release() : app\pVMRMixer = 0 : EndIf
If app\pWC : app\pWC\Release() : app\pWC = 0 : EndIf
EndProcedure
;- GADGET_ID_
Enumeration
#Container
#Run
#Pause
#Stop
#Track_Brightness
#Track_Contrast
EndEnumeration
;- #MENU_ID_
Enumeration
#MENU_ID_LOAD_MOVIE
#MENU_ID_SET_BRIGHTNESS
#MENU_ID_SET_CONTRAST
#MENU_ID_STOP
#MENU_ID_PAUSE
#MENU_ID_RUN
#test
EndEnumeration
Procedure Brightness()
Protected offset = 0
app\Brightness = (GetGadgetState(#Track_Brightness) - offset) / 10:Debug app\Brightness
SetBrightness()
SetWindowTitle(app\win, "Brightness: " + StrD(app\Brightness, 1) + " Contrast: " + Str(app\Contrast * 100))
EndProcedure
Procedure Contrast()
app\Contrast = GetGadgetState(#Track_Contrast) / 100:Debug app\Contrast
SetContrast()
SetWindowTitle(app\win, "Brightness: " + StrD(app\Brightness, 1) + " Contrast: " + Str(app\Contrast * 100))
EndProcedure
Procedure test()
Protected lpWidth, lpHeight, lpARWidth, lpARHeight
; Debug app\pWC\GetMaxIdealVideoSize(@lpWidth, @lpHeight)
; Debug lpWidth
; Debug lpHeight
EndProcedure
Procedure init(container, filename$)
Protected movie
Protected w, h
app\ContainerID = container
app\ContainerW = GadgetWidth(container)
app\ContainerH = GadgetHeight(container)
app\ContainerX = GadgetX(container)
app\ContainerY = GadgetY(container)
app\Filename = filename$
app\Width = app\ContainerW
app\Height = app\ContainerH
EndProcedure
Procedure main()
Protected ev, movie$
CoInitialize_(0)
app\win = OpenWindow(#PB_Any, 0, 0, DesktopUnscaledX(800), DesktopUnscaledX(400), "DirectShow", #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered )
app\menu = CreateMenu(#PB_Any, WindowID(app\win))
MenuTitle("Fichier")
MenuItem(#MENU_ID_LOAD_MOVIE, "Load movie")
MenuItem(#MENU_ID_SET_BRIGHTNESS, "Set brightness")
MenuItem(#MENU_ID_SET_CONTRAST, "Set contrast")
MenuItem(#MENU_ID_STOP, "Stop")
MenuItem(#MENU_ID_PAUSE, "Pause")
MenuItem(#MENU_ID_RUN, "Run")
MenuItem(#test, "test")
BindMenuEvent(app\menu, #MENU_ID_LOAD_MOVIE, @Load_Movie())
BindMenuEvent(app\menu, #MENU_ID_SET_BRIGHTNESS, @SetBrightness())
BindMenuEvent(app\menu, #MENU_ID_SET_CONTRAST, @SetContrast())
BindMenuEvent(app\menu, #MENU_ID_STOP, @Stop())
BindMenuEvent(app\menu, #MENU_ID_PAUSE, @Pause())
BindMenuEvent(app\menu, #MENU_ID_RUN, @Run())
BindMenuEvent(app\menu, #test, @test())
ButtonGadget(#Run, 10, 0, 30, 30, ">")
ButtonGadget(#Pause, 40, 0, 30, 30, "II")
ButtonGadget(#Stop, 70, 0, 30, 30, "O")
BindGadgetEvent(#Run, @Run())
BindGadgetEvent(#Pause, @Pause())
BindGadgetEvent(#Stop, @Stop())
TrackBarGadget(#Track_Brightness, 100, 0, 280, 30, 0, 0, #PB_TrackBar_Ticks )
SendMessage_(GadgetID(#Track_Brightness), #TBM_SETRANGEMIN, 1, - 1000)
SendMessage_(GadgetID(#Track_Brightness), #TBM_SETRANGEMAX, 1, 1000)
SetGadgetState(#Track_Brightness, 0)
BindGadgetEvent(#Track_Brightness, @Brightness())
TrackBarGadget(#Track_Contrast, 400, 0, 280, 30, 0, 100, #PB_TrackBar_Ticks )
BindGadgetEvent(#Track_Contrast, @Contrast())
ContainerGadget(#Container, 0, 35, 711, 400)
;movie$ = "f:\z.mp4"
movie$="f:\z.avi"
init(#Container, movie$)
Load_Movie2(movie$)
BindEvent(#PB_Event_SizeWindow, @ResizeVideo())
Repeat
ev = WaitWindowEvent()
Until ev = #PB_Event_CloseWindow
ReleaseDirectShow()
EndProcedure
main()
M.