'##############################################################################################################################################################
'##############################################################################################################################################################
'### ViCut - V1.00.0 R0 - Beta
'##############################################################################################################################################################
'##############################################################################################################################################################
'### (c) Copyright 2011 By.: Martin Wiemann
'##############################################################################################################################################################
'### Date of Idea: 2011.03.25 - 20:53:49
'### Autor: DeltaLab's Germany [Experimental Computing]
'### Martin Wiemann
'### Contact: Admin@MLN.ath.cx / IRC://MLN.ath.cx/#mln
'##############################################################################################################################################################
'##############################################################################################################################################################
'##############################################################################################################################################################
Dim Shared G_TranscodeMovie_Progress As EWH_Control_Type Ptr
'##############################################################################################################################################################
Dim Shared ViCut_FFConv_ThreadMutex As Any Ptr
Dim Shared ViCut_FFConv_ThreadFFDone As Ubyte
Dim Shared ViCut_FFConv_Count As Uinteger
Dim Shared ViCut_FFConv_DatSize As Uinteger
Dim Shared ViCut_FFConv_Source As String
Dim Shared ViCut_FFConv_TargetName As String
Dim Shared ViCut_FFConv_TargetPath As String
Dim Shared ViCut_FFConv_ResizeW As Uinteger
Dim Shared ViCut_FFConv_ResizeH As Uinteger
'###############################################################################################################################################
Sub ViCut_FFConv_Thread_Decode_FF()
If (ViCut_FFConv_ResizeW <> 0) And (ViCut_FFConv_ResizeH <> 0) Then
Shell "ffmpeg -i " & ViCut_FFConv_Source & " -an -vcodec mjpeg -qmin 1 -qscale 1 -s " & Str(ViCut_FFConv_ResizeW) & "x" & Str(ViCut_FFConv_ResizeH) & " temp/img/img_%10d.jpg &> /dev/null"
Else
Shell "ffmpeg -i " & ViCut_FFConv_Source & " -an -vcodec mjpeg -qmin 1 -qscale 1 temp/img/img_%10d.jpg &> /dev/null"
End If
Mutexlock(ViCut_FFConv_ThreadMutex)
ViCut_FFConv_ThreadFFDone = 1
Mutexunlock(ViCut_FFConv_ThreadMutex)
End Sub
'###############################################################################################################################################
Sub ViCut_FFConv_Thread_Pack()
Mutexlock(ViCut_FFConv_ThreadMutex)
Mutexlock(G_FileIOMutex)
Kill ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vcl"
Kill ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vcv"
Kill ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vca"
Kill ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vci"
Dim XFN As Integer = Freefile
Open ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vcl" For Binary As #XFN
Dim XIXFN As Integer = Freefile
Open ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vcv" For Binary As #XIXFN
Mutexunlock(G_FileIOMutex)
Mutexunlock(ViCut_FFConv_ThreadMutex)
Dim N As String
Dim C As Uinteger
Dim Z As Uinteger = 1
Dim T As String
Dim TFN As Integer
Dim TFN1 As Integer
Dim XMax As Uinteger
Dim D As String
Dim T1 As String
Dim TSize As Uinteger
Do
C = 0
Mutexlock(G_FileIOMutex)
N = Dir("temp/img/*", -1)
Do Until N = ""
If (N <> ".") And (N <> "..") Then C += 1
N = Dir("", -1)
Loop
Mutexunlock(G_FileIOMutex)
Do
' If C <= 1 Then
If Dir("temp/img/img_" & String(10 - Len(Str(Z + 1)), 48) & Str(Z + 1) & ".jpg") = "" Then
Mutexlock(ViCut_FFConv_ThreadMutex)
If ViCut_FFConv_ThreadFFDone = 0 Then Mutexunlock(ViCut_FFConv_ThreadMutex): Exit Do
Mutexunlock(ViCut_FFConv_ThreadMutex)
End If
T = "img_" & String(10 - Len(Str(Z)), 48) & Str(Z) & ".jpg"
If Dir("temp/img/" & T) = "" Then Exit Do
Mutexlock(G_FileIOMutex)
TFN = Freefile
Open "temp/img/" & T For Binary As #TFN
Mutexunlock(G_FileIOMutex)
XMax = Lof(TFN)
D = Space(8092)
For X As Uinteger = 1 To XMax Step 8092
If (XMax - X) < 8092 Then D = Space(XMax - X + 1)
Get #TFN, X, D
Print #XIXFN, D;
Next
If Z = 1 Then
Mutexlock(G_FileIOMutex)
TFN1 = Freefile
Open ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vci" For Binary As #TFN1
Mutexunlock(G_FileIOMutex)
D = Space(8092)
For X As Uinteger = 1 To XMax Step 8092
If (XMax - X) < XMax Then D = Space(XMax - X + 1)
Get #TFN, X, D
Print #TFN1, D;
Next
Close #TFN1
End If
Close #TFN
T1 = Space(4)
*Cast(Uinteger Ptr, Strptr(T1)) = TSize
Print #XFN, T1;
*Cast(Uinteger Ptr, Strptr(T1)) = XMax
Print #XFN, T1;
' Print Str(Z) & " " & Str(TSize) & " " & Str(XMax)
TSize += XMax
Mutexlock(ViCut_FFConv_ThreadMutex)
ViCut_FFConv_DatSize = TSize
Mutexunlock(ViCut_FFConv_ThreadMutex)
Mutexlock(G_FileIOMutex)
Kill "temp/img/" & T
Mutexunlock(G_FileIOMutex)
Z += 1
Sleep 1, 1
Loop
Mutexlock(ViCut_FFConv_ThreadMutex)
ViCut_FFConv_Count = Z
Mutexunlock(ViCut_FFConv_ThreadMutex)
If C = 0 Then
Mutexlock(ViCut_FFConv_ThreadMutex)
If ViCut_FFConv_ThreadFFDone = 1 Then Exit Do
Mutexunlock(ViCut_FFConv_ThreadMutex)
End If
Sleep 1, 1
Loop
If ViCut_FFConv_Count > 0 Then ViCut_FFConv_Count -= 1
Mutexunlock(ViCut_FFConv_ThreadMutex)
Close #XIXFN
Close #XFN
Mutexlock(G_FileIOMutex)
XFN = Freefile
Open ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vch" For Append As #XFN
Mutexunlock(G_FileIOMutex)
Mutexlock(ViCut_FFConv_ThreadMutex)
Print #XFN, "FrameCount=" & ViCut_FFConv_Count
Print #XFN, "DatSize=" & ViCut_FFConv_DatSize
ViCut_FFConv_ThreadFFDone = 2
Mutexunlock(ViCut_FFConv_ThreadMutex)
Close #XFN
End Sub
'##############################################################################################################################################################
Sub ViCut_TranscodeMovie_DoTranscode(V_SourcePathFileName As String, V_ResizeW As Uinteger, V_ResizeH As Uinteger, V_TargetPath As String, Byref R_IndexName As String, Byref R_FrameCount As Uinteger, Byref R_FrameRate As Uinteger)
Mutexlock(G_FileIOMutex)
Mkdir "temp"
Mkdir "temp/img"
Mutexunlock(G_FileIOMutex)
ViCut_FFConv_Source = V_SourcePathFileName
ViCut_FFConv_TargetPath = V_TargetPath
ViCut_FFConv_ResizeW = V_ResizeW
ViCut_FFConv_ResizeH = V_ResizeH
Dim DD() As String
Dim DC As Uinteger
Dim DX As Uinteger
Mutexlock(G_FileIOMutex)
Dim N As String = Dir("temp/img/*", -1)
Do Until N = ""
If (N <> ".") And (N <> "..") Then
DC += 1
If DC > DX Then DX += 10: Redim Preserve DD(DX) As String
DD(DC) = N
End If
N = Dir("", -1)
Loop
For X As Uinteger = 1 To DC
Kill "temp/img/" & DD(X)
Next
Mutexunlock(G_FileIOMutex)
Dim XPos As Uinteger
Dim T As String
Dim T1 As String
Dim T2 As String
Dim TFrames As Uinteger
Dim TFrameRate As Uinteger = 0
Mutexlock(G_FileIOMutex)
Kill "temp/ffconvout.tmp"
Mutexunlock(G_FileIOMutex)
Shell("ffmpeg -i " & ViCut_FFConv_Source & " &> temp/ffconvout.tmp")
Mutexlock(G_FileIOMutex)
Dim XFN As Integer = Freefile
Open "temp/ffconvout.tmp" For Binary As #XFN
Mutexunlock(G_FileIOMutex)
Do Until Eof(XFN)
Line Input #XFN, T
If Left(T, 11) = " Duration:" Then
T = Mid(T, 12)
XPos = Instr(1, T, ",")
If XPos > 0 Then T2 = Trim(Left(T, XPos - 1))
Else
If Left(T, 11) = " Stream " Then
T = Mid(T, 12)
XPos = Instr(1, T, ":")
If XPos > 0 Then
T = Trim(Mid(T, XPos + 1))
XPos = Instr(1, T, ":")
If XPos > 0 Then
If Trim(Left(T, XPos - 1)) = "Video" Then
T1 = Trim(Mid(T, XPos + 1))
End If
End If
End If
End If
End If
Loop
Close #XFN
Mutexlock(G_FileIOMutex)
Kill "temp/ffconvout.tmp"
Mutexunlock(G_FileIOMutex)
T = T1
XPos = Instrrev(T, "fps")
If XPos > 0 Then
T = Trim(Left(T, XPos - 1))
XPos = Instrrev(T, ",")
If XPos > 0 Then
T = Trim(Mid(T, XPos + 1))
XPos = Instr(1, T, " ")
If XPos > 0 Then T = Trim(Left(T, XPos - 1))
TFrameRate = Cuint(Cdbl(T))
End If
End If
If TFrameRate > 0 Then
T = T2
XPos = Instrrev(T, ".")
If XPos > 0 Then
TFrames = Cuint(Mid(T, XPos + 1))
T = Left(T, XPos - 1)
XPos = Instrrev(T, ":")
If XPos > 0 Then
TFrames += Cuint(Mid(T, XPos + 1)) * TFrameRate
T = Left(T, XPos - 1)
XPos = Instrrev(T, ":")
If XPos > 0 Then TFrames += Cuint(Mid(T, XPos + 1)) * 60 * TFrameRate
End If
End If
End If
T = V_SourcePathFileName
XPos = Instrrev(T, "/")
If XPos > 0 Then T = Mid(T, XPos + 1)
If TFrameRate = 0 Then TFrameRate = 25
ViCut_FFConv_TargetName = T
ViCut_FFConv_TargetName = T
R_FrameCount = TFrames
R_FrameRate = TFrameRate
R_IndexName = ViCut_FFConv_TargetName
Mutexlock(G_FileIOMutex)
Kill ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vcl"
Kill ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vch"
XFN = Freefile
Open ViCut_FFConv_TargetPath & ViCut_FFConv_TargetName & ".vch" For Append As #XFN
Mutexunlock(G_FileIOMutex)
Print #XFN, "SourceFile=" & V_SourcePathFileName
Print #XFN, "IndexName=" & ViCut_FFConv_TargetName
Print #XFN, "FrameRate=" & TFrameRate
Close #XFN
ViCut_FFConv_ThreadFFDone = 0
ViCut_FFConv_Count = 0
ViCut_FFConv_DatSize = 0
Mutexlock(ViCut_FFConv_ThreadMutex)
Dim TThreadIX As Any Ptr = Threadcreate(Cast(Any Ptr, @ViCut_FFConv_Thread_Pack))
Dim TThreadFF As Any Ptr = Threadcreate(Cast(Any Ptr, @ViCut_FFConv_Thread_Decode_FF))
Mutexunlock(ViCut_FFConv_ThreadMutex)
End Sub
'##############################################################################################################################################################
Sub ViCut_TranscodeMovie_Run(V_SourcePathFileName As String, V_ResizeW As Uinteger, V_ResizeH As Uinteger, Byref R_IndexName As String, Byref R_FrameCount As Uinteger, Byref R_FrameRate As Uinteger, Byref R_DatFilesize As Uinteger)
With *G_TranscodeMovie_Progress
.Text = "Preparing transcode..."
.Max = 0
.Value = 0
End With
G_TranscodeMovie_Window->Show(EWH_YN_Yes)
EWH_Window_ThreadSleep(250)
Mkdir "transcode/"
G_TranscodeMovie_Progress->Text = "Begin transcode..."
ViCut_TranscodeMovie_DoTranscode(V_SourcePathFileName, V_ResizeW, V_ResizeH, "transcode/", R_IndexName, R_FrameCount, R_FrameRate)
Dim TPrep As Ubyte
Dim TLFrame As Uinteger
Dim TTimeS As Double = Timer()
Dim TTimeR As Uinteger
Dim TTot As Double
Dim TT As String
Do Until EWH_Window_CheckEvents(@EWH_Term) = 0
Mutexlock(ViCut_FFConv_ThreadMutex)
If ViCut_FFConv_ThreadFFDone = 2 Then Mutexunlock(ViCut_FFConv_ThreadMutex): Exit Do
If TPrep = 0 Then
If R_FrameCount > 0 Then
G_TranscodeMovie_Progress->Max = R_FrameCount
TPrep = 1
Elseif ViCut_FFConv_Count > 0 Then
G_TranscodeMovie_Progress->Max = R_FrameCount
TPrep = 2
End If
Elseif TPrep = 1 Then
If TLFrame <> ViCut_FFConv_Count Then
If TTot < Timer() Then
TTimeR = Fix(R_FrameCount / (ViCut_FFConv_Count / (Timer() - TTimeS)) - (Timer() - TTimeS))
TT = Format(Int(TTimeR / 3600), "00")
TTimeR Mod= 3600
TT += ":" & Format(Int(TTimeR / 60), "00")
TTimeR Mod= 60
TT += ":" & Format(TTimeR, "00")
TTot = Timer() + 1
End If
G_TranscodeMovie_Progress->Value = ViCut_FFConv_Count
G_TranscodeMovie_Progress->Text = Str(R_FrameCount) & " / " & Space(Len(Str(R_FrameCount)) - Len(Str(ViCut_FFConv_Count))) & Str(ViCut_FFConv_Count) & " Frame's [" & Str(ViCut_FFConv_DatSize \ 1000) & " KByte] [T-" & Str(TT) & "]"
End If
Elseif TPrep = 2 Then
If TLFrame <> ViCut_FFConv_Count Then
If TTot < Timer() Then
TTimeR = Fix(Timer() - TTimeS)
TT = Format(Int(TTimeR / 3600), "00")
TTimeR Mod= 3600
TT += ":" & Format(Int(TTimeR / 60), "00")
TTimeR Mod= 60
TT += ":" & Format(TTimeR, "00")
TTot = Timer() + 1
End If
G_TranscodeMovie_Progress->Value = ViCut_FFConv_Count
G_TranscodeMovie_Progress->Text = "? / " & Str(ViCut_FFConv_Count) & " Frame's [" & Str(ViCut_FFConv_DatSize \ 1000) & " KByte] [T+" & Str(TT) & "]"
End If
End If
Mutexunlock(ViCut_FFConv_ThreadMutex)
Sleep 10, 1
Loop
Mutexlock(ViCut_FFConv_ThreadMutex)
R_FrameCount = ViCut_FFConv_Count
R_DatFilesize = ViCut_FFConv_DatSize
Mutexunlock(ViCut_FFConv_ThreadMutex)
With *G_TranscodeMovie_Progress
.Text = "Success!"
.Max = 1
.Value = 1
End With
EWH_Window_ThreadSleep(2000)
G_TranscodeMovie_Window->Hide()
End Sub
'##############################################################################################################################################################
Sub ViCut_TranscodeMovie_Init()
ViCut_FFConv_ThreadMutex = Mutexcreate()
G_TranscodeMovie_Window = EWH_Window_Create("ViCut - Transcoding! Please wait...", , , 450, 50)
With *G_TranscodeMovie_Window
G_TranscodeMovie_Progress = .Control_Add(EWH_CTL_Progress, 430, 25, 10, 10)
With *G_TranscodeMovie_Progress
.Text = ""
.Max = 0
.Value = 0
End With
End With
End Sub
'##############################################################################################################################################################
Function ViCut_TranscodeMovie_GetThumbnailFromFile(V_PathFileName As String, V_Width As Uinteger, V_Height As Uinteger, Byref R_MovieWidth As Uinteger, Byref R_MovieHeight As Uinteger, Byref R_MovieSize As Uinteger) As EWH_Image_Type Ptr
Mutexlock(G_FileIOMutex)
Dim XFN As Integer = Freefile
If Open(V_PathFileName For Binary As #XFN) <> 0 Then Mutexunlock(G_FileIOMutex): Return 0
R_MovieSize = Lof(XFN)
Close #XFN
Kill "temp/thumb.jpg"
Mutexunlock(G_FileIOMutex)
Shell "ffmpeg -itsoffset -4 -i " & V_PathFileName & " -an -vcodec mjpeg -vframes 1 -f rawvideo temp/thumb.jpg &> /dev/null"
Dim TImg As EWH_Image_Type Ptr = EWH_LoadImageFromFile("temp/thumb.jpg")
If TImg = 0 Then Return 0
R_MovieWidth = TImg->V_Width
R_MovieHeight = TImg->V_Height
Dim TImgS As EWH_Image_Type Ptr
Dim TOutRatioW As Uinteger = 16
Dim TOutRatioH As Uinteger = 9
Dim PW As Uinteger
Dim PH As Uinteger
If (V_Width / V_Height) <= TOutRatioW / TOutRatioH Then
PW = V_Width
PH = V_Width / TOutRatioW * TOutRatioH
Else
PW = V_Height / TOutRatioH * TOutRatioW
PH = V_Height
End If
TImgS = EWH_ImageScale(TImg, PW, PH)
EWH_ImageDestroy(TImg)
Mutexlock(G_FileIOMutex)
'Kill "temp/thumb."jpg
Mutexunlock(G_FileIOMutex)
Return TImgS
End Function