I wrote a program using PB and ESCAPI 3.0 which processes the lift, gamma and gain of the video and renders it to the screen. It also has a scope.
Is there any way to do anything with the output of my program besides render it to the screen, like record it (with audio)?
It is intended to be used with a test chart.
Code: Select all
;WORKS WITH ESCAPI ;REQUIRES 32-BIT PUREBASIC
;LAST MODIFIED 3/28/2023
std$ = "SDR"
;"HLG" OR "SDR" OR "HDR"
result = ExamineDesktops()
Global V_RES = DesktopHeight(0):Global H_RES = DesktopWidth(0)
Enumeration
#GAINGAD = 1;GAIN GADGET
#GAMMA;GAMMA GADGET
#PEDESTAL;PEDESTAL GADGET
#GAINTEXT
#PEDTEXT
#GAMMATEXT
EndEnumeration
#UNITY = 0.5
#KR = 0.2126:#KG = 0.7152:#KB = 0.0722 ;REC.709
;SDR SETTINGS
;Global gamma.d = 2.4: factor.d = 255/Pow(255,gamma) ;1.85
;Global pedestal.d = 16;8
;Global gain.d = 0.80;0.98
;CAM ALIGN CHART
gamma.d = 2.10: factor.d = 255/Pow(255,gamma)
pedestal.d = 16
gain.d = 0.94
;gamma.d = 1: factor.d = 255/Pow(255,gamma)
;pedestal.d = 1
;gain.d = 1
IncludeFile "escapi.pbi"
#HEIGHT = 360
#WIDTH = #height * 16/9
#WIDTHM1 = #WIDTH - 1
#HEIGHTM1 = #HEIGHT - 1
Procedure Graticule(std$)
DrawingMode(#PB_2DDrawing_Default)
;BLACK
lum = 16: LineXY(68,(255 - lum) + 52, #WIDTH-45,(255 - lum) + 52,$00ffff);BLACK
LineXY(36,(255 - lum) + 52, #WIDTH-45,(255 - lum) + 52,$00ffff)
lum = 16
DrawText(600,(255 - lum) + 44, "0", $ffffff)
DrawText(6,(255 - lum) + 44, " 0%", $ffffff)
;If std$ = "HLG" Or std$ = "HDR"
;DrawText(2,(255 - lum) + 44,"64", $ffffff)
;ElseIf std$ = "SDR":;DrawText(2,(255 - lum) + 44,"16", $ffffff)
;EndIf
;GAMMA
If std$ = "HLG" Or std$ = "HDR"
lum = 397 / 4 ;HLG
LineXY(36,(255 - lum) + 52, #WIDTH-45,(255 - lum) + 52,$00ffff)
DrawText(600,(255 - lum) + 42,"38", $ffffff)
;DrawText(2,(255 - lum) + 44,"397", $ffffff)
DrawText(6,(255 - lum) + 42, "18%", $ffffff)
ElseIf std$ = "SDR"
lum = 105
LineXY(36,(255 - lum) + 52, #WIDTH-45,(255 - lum) + 52,$00ffff)
DrawText(600,(255 - lum) + 44, "40", $ffffff)
DrawText(6,(255 - lum) + 44, "18%", $ffffff)
EndIf
;PEAK WHITE
;HLG 90% REFLECTANCE
If std$ = "HLG" Or std$ = "HDR"
lum = 235
LineXY(36,(255 - lum) + 52, #WIDTH-45,(255 - lum) + 52,$00ffff)
DrawText(600,(255 - lum) + 42, "100", $ffffff)
DrawText(6,(255 - lum) + 42,"90%", $ffffff)
ElseIf std$ = "SDR"
lum = 235 ;90% REFLECTANCE
LineXY(36,(255 - lum) + 52, #WIDTH-45,(255 - lum) + 52,$00ffff)
DrawText(600,(255 - lum) + 42, "100", $ffffff)
DrawText(6,(255 - lum) + 42, "90%", $ffffff)
EndIf
;DrawText(2, 13, "DIG.", $ffffff)
DrawText(6, 13, "REFL.", $ffffff)
DrawText(600, 13, "IRE", $ffffff)
EndProcedure
LoadFont(1,"arial",10,#PB_Font_Bold);FOR SCOPE GRATICULE
LoadFont(2,"arial",24);FOR GADGETS
device = 0
count = setupESCAPI()
If count = 0
MessageRequester("Error", "Unable to initialize ESCAPI. Use 32-bit version")
End
EndIf
name$ = Space(255)
getCaptureDeviceName(device, @name$, 255)
bufSize = #WIDTH * #HEIGHT * 4
scp.SimpleCapParams
scp\mWidth = #WIDTH
scp\mHeight = #HEIGHT
scp\mTargetBuf = AllocateMemory(bufSize)
;*buf = scp\mTargetBuf
If initCapture(device, @scp) = #False
MessageRequester("Error", "Unable to initialize webcam.")
End
EndIf
image = CreateImage(1, #WIDTH, #HEIGHT * 2, 24) ;CAMERA
;MAIN WINDOW
OpenWindow(1,0, 0, #WIDTH*2, #HEIGHT * 2 - 40, name$, #PB_Window_SystemMenu)
SpinGadget(#GAINGAD, #WIDTH * 1.5, 50,200,48,0,100)
SpinGadget(#GAMMA,#WIDTH * 1.5, 250,200,48,0,100)
SpinGadget(#PEDESTAL,#WIDTH * 1.5, 150,200,48,0,100)
SetGadgetFont(#GAINGAD,FontID(2))
SetGadgetFont(#PEDESTAL,FontID(2))
SetGadgetFont(#GAMMA,FontID(2))
SetGadgetText(#GAINGAD,StrD(gain,2))
SetGadgetText(#GAMMA,StrD(gamma,2))
SetGadgetText(#PEDESTAL,StrD(pedestal,2))
TextGadget(#GAINTEXT,#WIDTH * 1.1,50,200,48,"GAIN")
TextGadget(#PEDTEXT,#WIDTH * 1.1,250,200,48,"GAMMA")
TextGadget(#GAMMATEXT,#WIDTH * 1.1,150,200,48,"PEDESTAL")
TextGadget(11,#WIDTH * 1.1,350,600,48,"WHITE: 100 IRE")
TextGadget(12,#WIDTH * 1.1,400,600,48,"18% GRAY: 40 IRE")
TextGadget(13,#WIDTH * 1.1,450,600,48,"BLACK: 0 IRE")
SetGadgetFont(#GAINTEXT,FontID(2))
SetGadgetFont(#PEDTEXT,FontID(2))
SetGadgetFont(#GAMMATEXT,FontID(2))
SetGadgetFont(11,FontID(2))
SetGadgetFont(12,FontID(2))
SetGadgetFont(13,FontID(2))
setCaptureProperty(DEVICE,#CAPTURE_ZOOM,0,#VideoProcAmp_Flags_Manual)
setCaptureProperty(DEVICE,#CAPTURE_BRIGHTNESS,0.5,#VideoProcAmp_Flags_Manual); INITIALIZE TO UNITY
Quit = #False
Repeat
doCapture(device)
Delay(50) ;Delay(200)
event = WindowEvent()
If event = #PB_Event_CloseWindow
Quit = #True
Break
ElseIf event = #PB_Event_Gadget
If EventGadget() = #GAINGAD
If EventType() = #PB_EventType_Up:gain + 0.01
ElseIf EventType() = #PB_EventType_Down:gain - 0.01
EndIf
SetGadgetText(#GAINGAD,StrD(gain,2))
ElseIf EventGadget() = #GAMMA
If EventType() = #PB_EventType_Up:gamma - 0.05
ElseIf EventType() = #PB_EventType_Down:gamma + 0.05
EndIf
factor.d = 255/Pow(255,gamma)
SetGadgetText(#GAMMA,StrD(gamma,2))
ElseIf EventGadget() = #PEDESTAL
If EventType() = #PB_EventType_Up:pedestal + 1
ElseIf EventType() = #PB_EventType_Down:pedestal - 1
EndIf
SetGadgetText(#PEDESTAL,StrD(pedestal,2))
EndIf
EndIf
Repeat:Until isCaptureDone(device) <> #False
StartDrawing(ImageOutput(1))
DrawingFont(FontID(1))
*writeBuffer = DrawingBuffer()
pitch = DrawingBufferPitch()
Box(0,0,#WIDTH, #HEIGHT,0) ;BLANK SCOPE
;PIXEL-BY-PIXEL READING AND WRITING
factor.d = 255/Pow(255,gamma)
hm1 = *writebuffer + (#HEIGHTM1 * pitch)
*bufr = scp\mTargetBuf
For y = 0 To #HEIGHTM1: For x = 0 To #WIDTHM1
r = (PeekA(*bufr+2))
g = (PeekA(*bufr+1))
b = (PeekA(*bufr))
rf.d = r * gain
gf.d = g * gain
bf.d = b * gain
r=(Pow(rf,gamma) * factor) + PEDESTAL
If r > 255:r=255:EndIf;clip
g=(Pow(gf,gamma) * factor) + PEDESTAL
If g > 255:g=255:EndIf;clip
b=(Pow(bf,gamma) * factor) + PEDESTAL
If b > 255:b=255:EndIf;clip
If r < 0:r = 0:EndIf;clip
If g < 0:g = 0:EndIf;clip
If b < 0:b = 0:EndIf;clip
PokeA(hm1 + x*3,b)
PokeA(hm1 + x*3+1,g)
PokeA(hm1 + x*3+2,r)
;DRAW SCOPE
lum.f = (r*#KR) + (g*#KG) + (b*#KB)
;lum = 170;TEST
If (255 - lum) + 52 >= 0 ;And (255 - lum) + 52 <= 255
Plot(x, (255 - lum) + 52, $00cc00)
EndIf
*bufr + 4
Next
hm1 - pitch
Next
Graticule(std$)
StopDrawing()
StartDrawing(WindowOutput(1))
DrawImage(ImageID(1),0,0);DRAW TO SCREEN
StopDrawing()
Until quit <> #False
StopDrawing()
FreeImage(1)
deinitCapture(device)
FreeMemory(scp\mTargetBuf)
CloseWindow(1)
End