Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion.

Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules.

 

Go Back   Doom9's Forum > Capturing and Editing Video > Avisynth Usage

Reply
 
Thread Tools Search this Thread Display Modes
Old 19th September 2015, 21:37   #1  |  Link
Drayden
Registered User
 
Join Date: Aug 2015
Posts: 9
Video of lightning storm - cutting lightnings

Hello!

I have a video of storm with several lightnings in it. I want to
1) make a better, shorter video with all "unfun" parts cut out and only lightnings left.
2) make a gallery of lightnings. As pictures.

First part can be done manually with Virtual Dub. But its a boring task and I do not want to do it every time when I make a video like that. I made manual editing on the part of video. It is uploaded here. I want to finish editing with some configurable automated solution.

I tried script from that topic but it doesnt seem to work for me
http://forum.doom9.org/showthread.php?t=166974

Can someone help me or give some advice?
Drayden is offline   Reply With Quote
Old 19th September 2015, 22:10   #2  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Hi there.
I'm a little busy at the moment but will probably find a little time (maybe tomorrow) to have a play with your clip (have DL'ed sample).
Think I should be able to do something with it.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???
StainlessS is offline   Reply With Quote
Old 20th September 2015, 03:12   #3  |  Link
johnmeyer
Registered User
 
Join Date: Feb 2002
Location: California
Posts: 2,685
Search for "flash frames." StainlessS created some tools to detect photographer strobe flashes as well as the flash you get at the beginning of most film scenes. I have a script, if you want some code.
johnmeyer is online now   Reply With Quote
Old 20th September 2015, 03:35   #4  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
John, I'm assuming OP wants to keep some frames either side of lightning, at least that is what I'm doing now.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???
StainlessS is offline   Reply With Quote
Old 20th September 2015, 04:49   #5  |  Link
johnmeyer
Registered User
 
Join Date: Feb 2002
Location: California
Posts: 2,685
Quote:
Originally Posted by StainlessS View Post
John, I'm assuming OP wants to keep some frames either side of lightning, at least that is what I'm doing now.
You are probably right. However, having just videotaped a lightning storm a month ago, I was reminded of something that I had forgotten from the last time I did it: lightning doesn't just strike once. Most of the time the "flash" that you see is actually a series of flashes over a 200 - 1,000 millisecond interval. It is not unusual to have 3-4 flashes during that time, usually in the same location (if you can follow the stroke), but of widely varying intensity. The OP will have to decide whether to keep them all, or not.
johnmeyer is online now   Reply With Quote
Old 20th September 2015, 12:47   #6  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Have partly got it done, scans and sets DBase with TYPE (Dark/Light based on AveLuma Thresh), also extent of D/L seq (Start and End) and also
the brightest frame in seq (TYPE=L seq only).
Will then scan DBase to output frames file for eg Brightest Lightning frame in a sequence, and also another frames file to extract lightning sequence
with user selected number of partition frames either side (closely adjacent L seqs already coalesced).

EDIT:
@ Drayden, is audio required for lightning sequences ? (not a problem if so).
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 20th September 2015 at 12:59.
StainlessS is offline   Reply With Quote
Old 20th September 2015, 21:19   #7  |  Link
Drayden
Registered User
 
Join Date: Aug 2015
Posts: 9
Quote:
Originally Posted by StainlessS View Post
Have partly got it done, scans and sets DBase with TYPE (Dark/Light based on AveLuma Thresh), also extent of D/L seq (Start and End) and also
the brightest frame in seq (TYPE=L seq only).
Will then scan DBase to output frames file for eg Brightest Lightning frame in a sequence, and also another frames file to extract lightning sequence
with user selected number of partition frames either side (closely adjacent L seqs already coalesced).

EDIT:
@ Drayden, is audio required for lightning sequences ? (not a problem if so).
Hey, thats cool!
I think original audio is lost there so I will just add another music again.
Drayden is offline   Reply With Quote
Old 21st September 2015, 03:37   #8  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
OK, here is something to play with as I've gotta get some sleep.
It will only show sequences, partitions and flash frames, does not as yet extract flash frames or partitions.

A sequence is a group of adjacent frames that are either above or below the AveLuma 'THRESH', types D (below) and 'L' above.

An 'L' Partition is a group of coalesced L sequences with at most 2*'KEEPFRAMES' from any single D seq. If a D sequence is longer than
2*KEEPFRAMES, then that D sequence will become a D Partition with L partitions either side having 'KEEPFRAMES frames coalesced with them.

When done, you wil be able to extract Flash frames, L Partitions, and also the D partitions to see if anything was missed out.

Its quite fascinating to see the ShowDB output metrics preceding the flashes.

here tis:

SCRIPT REMOVED: See posts 11 and 12.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 22nd September 2015 at 19:45.
StainlessS is offline   Reply With Quote
Old 21st September 2015, 13:52   #9  |  Link
jmac698
Registered User
 
Join Date: Jan 2006
Posts: 1,867
You can also do this the other way around; if you have a Canon camera, you can load a custom firmware and then run a program that takes pictures only when it flashes. It would also be possible to take video clips starting at a flash, log flash times, etc.

http://chdk.wikia.com/wiki/UBASIC/Sc...ript_--_Fudgey
jmac698 is offline   Reply With Quote
Old 21st September 2015, 17:27   #10  |  Link
Drayden
Registered User
 
Join Date: Aug 2015
Posts: 9
Quote:
Originally Posted by StainlessS View Post
OK, here is something to play with as I've gotta get some sleep.
It will only show sequences, partitions and flash frames, does not as yet extract flash frames or partitions.

...
Wow, thank you very much!
Thats a freaking ton of code... Gonna test it a bit later, when im finally home...

jmac698
thank you for idea, but its inapplicable in my case
Drayden is offline   Reply With Quote
Old 22nd September 2015, 19:43   #11  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
OK here tis complete with frame, Seq and Part extraction.

CODE REMOVED
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 24th September 2015 at 00:59.
StainlessS is offline   Reply With Quote
Old 22nd September 2015, 19:44   #12  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
And here the client (See prev post)

EDIT: Script removed.

And script from Prune/FrameSel.

SelectRanges.avs
Code:
Function RejectRanges(clip c,String "SCmd",String "Cmd",Bool "TrimAudio",Float "FadeMS") {
    # RejectRanges() by StainlessS. Required:- FrameSel, Prune, RT_Stats
    # Wrapper to delete frames/ranges along with audio, can supply frames/ranges in SCmd string And/Or Cmd file.
    #   The wrapper makes for easier usage of Prune() which supports up to 256 input clips, but requires a clip index,
    #   eg '3, 100,200' would specify clip 3, range 100 to 200. The wrapper does away with the necessity for the clip index as we
    #   are only using a single clip here. Prune also does not have a 'reject' arg to delete specified frames rather than select them,
    #   this wrapper also converts a list of frames to delete into a list of frames to select so that we can use Prune and its audio
    #   capability.
    #
    # SCmd: Frames/Ranges specified in String (Frames/Ranges either Chr(10) or ';' separated, infix ',' specifies range, eg 'start,end').
    # Cmd:  Frames/Ranges specified in file (one frame/range per line, comments also allowed, see FrameSel for Further info).
    # TrimAudio:
    #   True(default), deletes audio belonging to deleted frames
    #   False, returns original audio, probably out of sync.
    # FadeMS: (default 1.0 millisec). Linear Audio Fade duration at splices when TrimAudio==true, 0 = dont fade (might result in audio 'clicks/cracks').
    c
    TrimAudio=Default(TrimAudio,True)   # default true trims audio, false returns original audio (audiodubbed, as Framesel returns no audio)
    FadeMS=Float(Default(FadeMS,1.0))   # 1 millisecond linear fadeout/fadein at splices
    PruneCmd = (TrimAudio) ? "~Prune_"+RT_LocalTimeString+".txt" : ""
    (!TrimAudio)
        \ ? FrameSel(scmd=SCmd,cmd=Cmd,reject=true)
        \ : FrameSel_CmdReWrite(PruneCmd,scmd=SCmd,cmd=Cmd,reject=true,Prune=True,range=true)
    (TrimAudio) ? Prune(Cmd=PruneCmd,FadeIn=True,FadeSplice=True,FadeOut=True,Fade=FadeMS) : NOP
    # If TrimAudio==true then delete Prune temp file, Else restore original Audio to the now audio-less clip
    (TrimAudio)
        \ ? RT_FileDelete(PruneCmd)
        \ : (c.HasAudio) ? AudioDub(c) : NOP
    Return Last
}

Function SelectRanges(clip c,String "SCmd",String "Cmd",Bool "TrimAudio",Float "FadeMS",Bool "Ordered") {
    # SelectRanges() by StainlessS. Required:- FrameSel, Prune, RT_Stats
    # Wrapper to Select frames/ranges along with audio, can supply frames/ranges in SCmd string And/Or Cmd file.
    #   The wrapper makes for easier usage of Prune() which supports up to 256 input clips, but requires a clip index,
    #   eg '3, 100,200' would specify clip 3, range 100 to 200. The wrapper does away with the necessity for the clip index as we
    #   are only using a single clip here.
    #
    # SCmd: Frames/Ranges specified in String (Frames/Ranges either Chr(10) or ';' separated, infix ',' specifies range, eg 'start,end').
    # Cmd:  Frames/Ranges specified in file (one frame/range per line, comments allowed, see FrameSel for Further info).
    #  *** NOTE ***, If both Cmd and SCmd supplied AND Ordered == False, then will process Cmd file and then SCmd string afterwards, ie
    #    Will select ranges in Cmd file and in order specified (rather than auto ordering ranges) and then append ranges specified in
    #    SCmd string (and in order specified).
    # TrimAudio:
    #   True(default), selects audio belonging to selected frames/ranges
    #   False, returns original audio, probably out of sync (maybe totally out of whack if Ordered == false and selected ranges out of order).
    # FadeMS: (default 1.0 millisec). Linear Audio Fade duration at splices when TrimAudio==true, 0 = dont fade (might result in audio 'clicks/cracks').
    # Ordered:
    #   True(default), all frames/ranges are returned in sequencial order. Any frame specified more than once will return only 1 instance.
    #   False, All frames/Ranges are returned in specified order, Cmd processed first and then SCmd. Frames/ranges specified more than once
    #     will return multiple instances. Allows out-of-order trimming of clip, eg re-sequencing of scenes in movie.
    #
    # Does not make much sense to select individual frames with audio, best used with ranges.
    # Will coalesce individually selected adjacent frames/ranges before any Fade, ie only audio fade where sensible to do so.
    # TrimAudio==false with non Ordered selection will result in completely out of sync audio.
    c
    TrimAudio=Default(TrimAudio,True)   # default true trims audio, false returns original audio (audiodubbed, as Framesel returns no audio)
    FadeMS=Float(Default(FadeMS,1.0))   # 1 millisecond linear fadeout/fadein at splices
    Ordered=Default(Ordered,True)       # True (default) frames/ranges will be Ordered and selected only once even if specified more than once.
                                        # False, frames/ranges returned in specified order, Cmd processed 1st and then SCmd.
    PruneCmd = (TrimAudio) ? "~Prune_"+RT_LocalTimeString+".txt" : ""
    (!TrimAudio)
        \ ? FrameSel(scmd=SCmd,cmd=Cmd,Ordered=Ordered)
        \ : FrameSel_CmdReWrite(PruneCmd,scmd=SCmd,cmd=Cmd,Ordered=Ordered,Prune=True,range=true)
    (TrimAudio) ? Prune(Cmd=PruneCmd,FadeIn=True,FadeSplice=True,FadeOut=True,Fade=FadeMS) : NOP
    # If TrimAudio==true then delete Prune temp file, Else restore original Audio to the now audio-less clip
    (TrimAudio)
        \ ? RT_FileDelete(PruneCmd)
        \ : (c.HasAudio) ? AudioDub(c) : NOP
    Return Last
}
EDIT: Dont forget to COMMENT out InitDB when done, and SequenceDB when happy with Thresh, and PartitionDB when
happy with PartFrames.
Can then call any of the other Show/extraction funcs.
NOTE, ShowDB(Last,DB).GetSeqs(DB,True) will show DARK seq frames that have been Partitioned into LIGHT Partitions,
where you might catch some lightning frames that would not be caught in LIGHT only sequencing (because they are within
PartFrames distance of LIGHT seq).
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 24th September 2015 at 01:07.
StainlessS is offline   Reply With Quote
Old 22nd September 2015, 22:10   #13  |  Link
Drayden
Registered User
 
Join Date: Aug 2015
Posts: 9
Thank you very much!

Opened a script in Vdub and its thinking hard.
Gonna wait until it shows me some feedback...
Drayden is offline   Reply With Quote
Old 23rd September 2015, 20:58   #14  |  Link
Drayden
Registered User
 
Join Date: Aug 2015
Posts: 9
Vdub is still "not responding". Is that all right?
Drayden is offline   Reply With Quote
Old 24th September 2015, 01:01   #15  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Part 1 of LightningSelectFrames.avs (Too big for post)
Code:
#LightningSelectFrames.avs      # Req:- GScript, Grunt, RT_Stats, FrameSel, Prune.

Function ShowDB(clip c,String DB) {
/*
    ShowDB(), Show DB Status, MUST at least call InitDB beforehand.
    If not sequenced then will only show AverageLuma for each frame.
    If Sequenced then shows Sequence info.
    If both Sequenced and Partitioned, then shows Sequence and Partition info.     
*/
    c           myName="ShowDB: "
    Records   = RT_DBaseRecords(DB)     Assert(Records==FrameCount,RT_String("%sFrameCount/Records mismatch",myName))
    Th        = RT_DBaseGetID(DB,0)     nSeqs     = RT_DBaseGetID(DB,1)     PartFrames= RT_DBaseGetID(DB,2)     nParts    = RT_DBaseGetID(DB,3)
    Fmt="%d] AveY=%.2f\nSEQ:%-5d} Type='%c' Start=%-6d End=%-6d FlashFrm=%d\nPART:%4d} Type='%c' Start=%-6d End=%-6d"
    Fmt2="Thresh=%.2f : nSeqs=%d : PartFrames=%d : nParts=%d"
    SSS="""
        n    = current_frame
        RT_Subtitle(Fmt,
            \ n,RT_DBaseGetField(DB,n,0),RT_DBaseGetField(DB,n,1),RT_Ord("-DL",RT_DBaseGetField(DB,n,2)+2),
            \ RT_DBaseGetField(DB,n,3),RT_DBaseGetField(DB,n,4),RT_DBaseGetField(DB,n,5),
            \ RT_DBaseGetField(DB,n,6),RT_Ord("-DL",RT_DBaseGetField(DB,n,7)+2),RT_DBaseGetField(DB,n,8),RT_DBaseGetField(DB,n,9))            
        RT_SubTitle(Fmt2,Th,nSeqs,PartFrames,nParts,align=1)
        Return Last
    """
    Last.GScriptClip(SSS,ARGS="Fmt,Fmt2,DB,Th,nSeqs,PartFrames,nParts",Local=True)
    Return Last
}

Function WriteFlashFrames(String DB,String FN) {            # Write 1 frame from each sequence with highest AveLuma
    myName="WriteFlashFrames: "         FC = RT_DBaseRecords(DB)            nSeqs = RT_DBaseGetID(DB,1)         RT_FileDelete(FN)
    Assert(nSeqs > 0, RT_String("%sDBase Not Sequenced, Call SequenceDB(Thresh)",myName))
    GSCript("""
        For(i=0,FC-1) {
            SeqType = RT_DBaseGetField(DB,i,2)              # 0 = DARK seq : 1= LIGHT seq
            SeqEnd  = RT_DBaseGetField(DB,i,4)              # Seq End        
            if(SeqType==1) {RT_WriteFile(FN,"%d",RT_DBaseGetField(DB,i,5),Append=True)} # Frame with greatest AveLuma in seq
            i=SeqEnd                                        # next iteration SeqEnd + 1 is Start of next Seq
        }
    """)
    Return 0
}

Function WriteFlashSeqs(String DB,String FN) {              # Write all L type sequences
    myName="WriteFlashseqs: "           FC = RT_DBaseRecords(DB)            nSeqs = RT_DBaseGetID(DB,1)    RT_FileDelete(FN)
    Assert(nSeqs > 0, RT_String("%sDBase Not Sequenced, Call SequenceDB(Thresh)",myName))
    GSCript("""
        For(i=0,FC-1) {
            SeqType = RT_DBaseGetField(DB,i,2)              # 0 = DARK seq : 1= LIGHT seq
            SeqEnd  = RT_DBaseGetField(DB,i,4)              # Seq End        
            if(SeqType==1) {
                SeqLen = SeqEnd - i + 1
                (SeqLen==1) ? RT_WriteFile(FN,"%d",i,Append=True) : RT_WriteFile(FN,"%d,%d",i,SeqEnd,Append=True)
            }
            i=SeqEnd                                        # next iteration SeqEnd + 1 is Start of next Seq
        }
    """)
    Return 0
}

Function WriteFlashParts(String DB,String FN) {             # Write all L type Partitions
    myName="WriteFlashParts: "          FC = RT_DBaseRecords(DB)            nParts = RT_DBaseGetID(DB,3)    RT_FileDelete(FN)
    Assert(nParts > 0, RT_String("%sDBase Not Partitioned, Call PartitionDB(PartFrames)",myName))
    GSCript("""
        For(i=0,FC-1) {
            PartType= RT_DBaseGetField(DB,i,7)              # 0 = DARK Part : 1= LIGHT Part
            PartEnd = RT_DBaseGetField(DB,i,9)              # Part End        
            if(PartType==1) {
                PartLen = PartEnd - i + 1
                (PartLen==1) ? RT_WriteFile(FN,"%d",i,Append=True) : RT_WriteFile(FN,"%d,%d",i,PartEnd,Append=True)
            }
            i=PartEnd                                       # next iteration PartEnd + 1 is Start of next Part
        }
    """)
    Return 0
}

Function GetFlashFrames(clip c,String DB) {
    FN="Flash_"+RT_LocalTimeString(File=True)+".txt"   WriteFlashFrames(DB,FN)   Flashframes=SelectRanges(c,Cmd=FN)
    RT_FileDelete(FN)           Return Flashframes.KillAudio
}

Function GetSeqs(clip c,String DB,Bool "Dark") {
    Dark = Default(Dark,False)  FN="Seqs_"+RT_LocalTimeString(File=True)+".txt"
    WriteFlashSeqs(DB,FN)       Seqs=(Dark) ? RejectRanges(c,Cmd=FN) : SelectRanges(c,Cmd=FN)
    RT_FileDelete(FN)           Return Seqs
}

Function GetParts(clip c,String DB,Bool "Dark") {
    Dark = Default(Dark,False)   FN="Parts_"+RT_LocalTimeString(File=True)+".txt"
    WriteFlashParts(DB,FN)      Parts=(Dark) ? RejectRanges(c,Cmd=FN) : SelectRanges(c,Cmd=FN) 
    RT_FileDelete(FN)           Return Parts
}
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 1st October 2015 at 17:23. Reason: Update
StainlessS is offline   Reply With Quote
Old 24th September 2015, 01:02   #16  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Part 2

Code:
Function InitDB(clip c,String DB,Float "Thresh",Int "PartFrames",Bool "Debug") {
/*
    InitDB, Writes AverageLuma to DB DBase file for each frame in clip c.
    Optionally call SequenceDB(DB,Thresh)      if Thresh>0.0
    Optionally call PartitionDB(DB,PartFrames) if Thresh>0.0  AND PartFrames>0
    
    DB FIELDS:- 
      0=AveY (Float)
      1=SeqIx (0 Rel)
      2=Seq Type        (0=Dark, 1=Light)
      3=Seq Start
      4=Seq End
      5=Seq Brightest Strike frame(only where seq TYPE==1)
      6=PartIx (0 Rel)
      7=Partition Type  (0=Dark, 1=Light)
      8=Partition Start
      9=Partition End
     DB ID's
      0=Thresh (Float)
      1=Number of Sequences
      2=PartFrames (0 == Not Partitioned)
      3=Number of Partitions    
*/
    c           myName="InitDB: "
    Thresh=Float(Default(Thresh,0.0))       PartFrames=Default(PartFrames,0)        Debug=Default(Debug,False)
    StartT=RT_TimerHP                       FC=FrameCount                           RT_DBaseAlloc(DB,FC,"fiiiiiiiii")                                    
    GSCript("""
        for(i=0,FC-1) {
            (Debug) ? RT_DebugF("%d]",i,name=myName) : NOP
            RT_DBaseSet(DB,i,RT_AverageLuma(c,n=i),-1,-1,-1,-1,-1,-1,-1,-1,-1)
        }
        T = RT_TimerHP - StartT      RT_DebugF("Completed in %.2f secs (%.2fMins) : %.2f FPS",T,T/60.0,FC/T,name=myName)
        if(Thresh > 0.0) {
            SequenceDB(DB,Thresh)
            if(PartFrames > 0) {
                PartitionDB(DB,PartFrames)
            }        
        }
    """)
    Return 0
}

Function SequenceDB(String DB,Float Thresh,Bool "Debug") {
/*
    Split DB into sequences of Dark and Light by Thresh (Call AFTER [or via] InitDB).
    Can Re-SequenceDB without repeat call to InitDB.
*/    
    myName="SequenceDB: "       Debug=Default(Debug,False)      StartT=RT_TimerHP         Records=RT_DBaseRecords(DB)
    GSCript("""
        nSeqs = 0
        if(Thresh<=0.0) {
            (DEBUG)?RT_DebugF("Removing DB Sequences and Partitions",name=myName):NOP
            for(i=0,Records-1) {
                RT_DBaseSet(DB,i,RT_DBaseGetField(DB,i,0),-1,-1,-1,-1,-1,-1,-1,-1,-1)     # Re-Init Record (copying original AveLuma)
            }
            RT_DBaseSetID(DB,0,0.0)                                        # Set Thresh = 0.0 for ShowDB
        } else {
            (DEBUG)?RT_DebugF("Sequencing DBase",name=myName):NOP
            Old_Start   = 0        
            AL          = RT_DBaseGetField(DB,Old_Start,0)
            Old_SeqT    = (AL>=Thresh) ? 1 : 0                             # 0=DARK, 1=LIGHT (preset, so no change detected on frame 0)
            Old_LMax    = AL                                               # Brightest Strike
            Old_LMax_Frm= Old_Start                                        # Brightest strike frame
            SeqT        = Old_SeqT
            for(i=0,Records) {
                if(i != Records) {                                         # NOT Last Frame + 1, (where RECORD/FRAME DOES NOT EXIST)
                    AL=RT_DBaseGetField(DB,i,0)
                    SeqT = (AL>=Thresh) ? 1 : 0                            # Sequence Type, 0=DARK, 1=LIGHT
                    RT_DBaseSet(DB,i,AL,nSeqs,SeqT,-1,-1,-1,-1,-1,-1,-1)   # Init Record
                }
                if(SeqT != Old_SeqT || i==Records) {                       # New TYPE (or Last frame + 1, ie seq/loop closure)
                    (Debug) ? RT_DebugF("%d] SeqType=%d SeqIx=%d",i,SeqT,nSeqs,name=myName) : NOP
                    for(j=Old_Start,i-1) {
                        RT_DBaseSetField(DB,j,3,Old_Start)                 # Start frame of sequence of Old Seq (ie previous sequence)
                        RT_DBaseSetField(DB,j,4,i-1)                       # End frame of sequence of Old Seq
                        if(Old_SeqT==1) {                                  # For Lightning strikes ONLY
                            RT_DBaseSetField(DB,j,5,Old_LMax_Frm)          # Brightest frame in Lightning seq
                        }
                    }
                    nSeqs        = nSeqs + 1                               # Incr Sequence count 
                    Old_Start    = i                                       # Remember new Start frame and current Seq Type for Next Time.
                    Old_SeqT     = SeqT                 
                    Old_LMax     = AL                                      # init Brightest Strike
                    Old_LMax_Frm = i                                       # init Brightest strike frame
                } else if(Old_SeqT==1 && AL>Old_LMax) {                    # Is Lightning
                    Old_LMax     = AL
                    Old_LMax_Frm = i
                }
            }
            RT_DBaseSetID(DB,0,Thresh)                                 # Set for ShowDB (Sequences are set BUT Not yet Partitioned)
        }
        RT_DBaseSetID(DB,1,nSeqs)                                      # Sequence Count
        RT_DBaseSetID(DB,2,0)                                          # PartsFrames
        RT_DBaseSetID(DB,3,0)                                          # nParts, Any previously existing partitions are invalid
        T = RT_TimerHP - StartT      RT_DebugF("Completed in %.2f secs (%.2fMins) : %.2f FPS",T,T/60.0,Records/T,name=myName)
    """)
    Return 0
}

Function PartitionDB(String DB,Int "PartFrames",bool "Debug") {      # Partition DB, (ie coalesce adjacent lightning seqs and add PartFrames either side)
    myName="PartitionDB: "    PartFrames=Default(PartFrames,0)  FC=RT_DBaseRecords(DB)    nSeqs=RT_DBaseGetID(DB,1)   Debug=Default(Debug,False)
    Assert(nSeqs > 0, RT_String("%sDBase Not Sequenced, Call SequenceDB(Thresh)",myName))        
    GSCript("""
        StartT=RT_TimerHP
        if(RT_DBaseGetID(DB,3) > 0) {                   # Already Partitioned ? (nParts)
            (DEBUG)?RT_DebugF("Resetting DB Partitions",name=myName):NOP
            for(i=0,FC-1) {                             # Reset
                RT_DBaseSetField(DB,i,6,-1)             # Reset Part Number
                RT_DBaseSetField(DB,i,7,-1)             # Reset Type of Part
                RT_DBaseSetField(DB,i,8,-1)             # Reset Start of Part
                RT_DBaseSetField(DB,i,9,-1)             # Reset End of Part
            }
            RT_DBaseSetID(DB,2,0)                       # PartFrames
            RT_DBaseSetID(DB,3,0)                       # nParts = 0               
            T = RT_TimerHP - StartT      RT_DebugF("Reset DB Partitions in %.2f secs (%.2fMins) : %.2f FPS",T,T/60.0,FC/T,name=myName)
        }
        if(PartFrames > 0) {        
            (DEBUG)?RT_DebugF("\nPartitioning DB with PartFrames=%d\n",PartFrames,name=myName):NOP
            nSeqs     = RT_DBaseGetID(DB,1)
            nParts    = 0
            P_FrmS    = 0                                                   # Partition Start Frame
            P_Type    = RT_DBaseGetField(DB,0,2)                            # SEQ type of Start Partition is same as start SEQ
            if(P_Type==0 && RT_DBaseGetField(DB,0,4)+1<=PartFrames && nSeqs>=2) {
                P_Type = 1                                                  # D type and <= PartFrames, convert to L type Start ie coalesce.
                (Debug)?RT_DebugF("First 'D' Part Convert to 'L' Part - coalescing",name=myName):NOP
            }
            False=False     # Make local (faster access)
            ERR=0                               
            for(i=0,FC-1) {
                Old_I = i
                SeqType = RT_DBaseGetField(DB,i,2)    
                SeqS    = RT_DBaseGetField(DB,i,3)    
                SeqE    = RT_DBaseGetField(DB,i,4)
                RemLen  = SeqE-i+1                                               # Length of what remains in current Seq
                if(DEBUG) {
                    (P_FrmS==i)?RT_DebugF("%6d] Opening Partition:- PartType='%c' Start=%-6d",i,RT_Ord("DL",P_Type+1),i,name=myName):NOP                    
                    RT_DebugF("%6d]    SeqType='%c' SeqRel=%-6d SeqS=%-6d SeqE=%-6d SeqLen=%-6d RemLen=%-6d",
                            \ i,RT_Ord("DL",SeqType+1),i-SeqS,SeqS,SeqE,SeqE-SeqS+1,RemLen,name=myName)
                }                        
                Close = False
                if(P_Type==0) {                                                 # DARK Part
                    if(SeqType==0) {
                        if(i==0) {                                              # 1st PART is DARK
                            if(SeqE==FC-1) {
                                i=SeqE                                         # Single DARK Part only
                            } else {                    
                                i=SeqE - PartFrames                            # Close current D PART and join end of this D seq to next L seq
                            }
                            Close=True                                                        
                        } else if(i!=SeqS) {
                            if(RemLen>PartFrames) {
                                i=SeqE - PartFrames                            # Close current D Partition and join end of this D seq to next L seq
                                Close=True                            
                            } else {
                                ERR=2
                            }
                        } else {
                            ERR=3
                        }
                    } else {
                        ERR=4
                    }                                       
                } else {                                                    # LIGHT Part (coalescing)
                    if(SeqType == 1) {
                        i=SeqE                                             # Always coalesce L seq 
                    } else if(i==SeqS) {
                        if(RemLen<=PartFrames*2) {
                            i=SeqE                                         # Coalesce entire D seq if <= PartFrames*2
                        } else {
                            i=i+PartFrames-1 Close=True                     # coalesce Start of D seq and close for next D Part
                        }
                    } else if(RemLen<=PartFrames) {
                        i=SeqE                                             # if <= PartFrames then coalesce End of D seq to next L seq
                    } else {
                        ERR=5
                    }
                }
                
                if(i < Old_I) {
                    ERR = 1
                }
                
                if(ERR != 0) {
                    ES = RT_String("%s*** Error = %d ***\ni=%d Old_I=%d P_FrmS=%d P_Type=%d SeqType=%d SeqS=%d SeqE=%d RemLen=%d",
                            \ myName,ERR,i,Old_I,P_FrmS,P_Type,SeqType,SeqS,SeqE,RemLen)                                                            
                    RT_DebugF("%s",ES,name=myName)
                    RT_WriteFile("PartitionDB_ERROR.TXT","%s",ES)
                    Assert(False,ES)                                
                }
                                                    
                if(i==FC-1) {Close=True}                                           
                if(Close || i>=FC) {
                    P_FrmE = Min(i,FC-1)
                    (Close&&DEBUG) ? RT_DebugF("%6d] Closing Partition:- PartType='%c' Start=%-6d End=%-6d PartLen=%-6d",
                            \ i,RT_Ord("DL",P_Type+1),P_FrmS,P_FrmE,P_FrmE-P_FrmS+1,name=myName) : NOP
                    (!Close)       ? RT_DebugF("*** Not Closed ***, i>=FC-1(i=%d FC-1=%d)",i,FC-1,name=myName) : NOP
                    for(j=P_FrmS,P_FrmE) {
                        RT_DBaseSetField(DB,j,6,nParts)                     # Part Number (0 Rel)
                        RT_DBaseSetField(DB,j,7,P_Type)                     # Partition Type  (0=Dark, 1=Light)
                        RT_DBaseSetField(DB,j,8,P_FrmS)                     # Partition Start
                        RT_DBaseSetField(DB,j,9,P_FrmE)                     # Partition End
                    }
                    nParts = nParts + 1
                    P_Type = (P_Type==0)?1:0                                # Toggle Partition Type
                    P_FrmS = i+1
                }
            }
            RT_DBaseSetID(DB,3,nParts)                                      # Flag Partition Count
            (DEBUG) ? RT_DebugF("DB Partitioned with PartFrames=%d",PartFrames,name=myName) : NOP
        }
        RT_DBaseSetID(DB,2,PartFrames)                                      # Flag Partition PartFrames               
        T=RT_TimerHP-StartT      RT_DebugF("Completed in %.2f secs (%.2fMins) : %.2f FPS",T,T/60.0,FC/T,name=myName)
    """)
    return 0
}
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 1st October 2015 at 17:24. Reason: Update
StainlessS is offline   Reply With Quote
Old 24th September 2015, 01:06   #17  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Client

Code:
Import("SelectRanges.avs")
Import("LightningSelectFrames.avs")

###
#LightningSelectFrames_Client.avs      # Req:- GScript, Grunt, RT_Stats, FrameSel, Prune.
###
#VideoFilename = "Lightning.avi"
VideoFilename = "Join3.avi"

####
DB = VideoFilename + ".DB"

THRESH     = 5.0             # Lightning >= THRESH 
PARTFRAMES = 10              # Frames to keep either side of lightning sequences
                             # If Dark Seq length between L seqs is <= 2*PARTFRAMES then will be coalesced into L seq.
####
####
Avisource(VideoFilename,Audio=False)

#### InitDB() Must be called to create DB, and write AverageLuma to DBase for each frame.
####    InitDB() can optionally call SequenceDB (when Thresh>0.0) and also PartitionDB (when Thresh>0.0 and PARTFRAMES>0)
#### 
#### After DB created can call SequenceDB, PartitionDB{only after SequenceDB) and ShowDB as you wish
#### SequenceDB splits DB frames into sequences of light and Dark frames based on AverageLuma Thresh, can re-sequence without repeat call to InitDB.
#### PartitionDB, coalesces 'L' sequences. Can re-partition without repeat calls the InitDB and SequenceDB. 
#### 

DEBUG=False                             # In event of problems make True (Get DebugView https://technet.microsoft.com/en-us/library/bb896647.aspx)

# Comment out below 3 options when done (or repeat run will do them all again)
InitDB(Last,DB,Debug=DEBUG)             # After InitDB, can comment out and call PartitionDB to change PARTFRAMES
SequenceDB(DB,THRESH,Debug=DEBUG)       # Sequence if not already done by InitDB.
PartitionDB(DB,PARTFRAMES,Debug=DEBUG)  # Partition if not already done by InitDB.


#### ShowDB, shows metrics, can un-comment and use together with one of the Getxxx options to show metrics with selected frames.
ShowDB(Last,DB)                          # View DB Sequence and Partition status (MUST call at least InitDB before use)

#### Select frames to return, un-comment one only (after DB initialised and sequenced, and Partitioned).
#GetFlashFrames(Last,DB)                 # Get Brightest Flash from Each Seq
#GetSeqs(Last,DB)                        # Get Light Seqs
#GetSeqs(Last,DB,True)                   # Get DARK Seqs
#GetParts(Last,DB)                       # Get Light Partitions
#GetParts(Last,DB,True)                  # Get DARK Partitions
####
return Last
UPDATED
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 1st October 2015 at 17:25. Reason: Update
StainlessS is offline   Reply With Quote
Old 24th September 2015, 18:42   #18  |  Link
Drayden
Registered User
 
Join Date: Aug 2015
Posts: 9
Oh.
I'm uploading uncut video to Google Drive now. Gonna give the link when its done.

Its ~800 mb. Is that ok?
Drayden is offline   Reply With Quote
Old 24th September 2015, 19:18   #19  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Yep OK, also provide the Thresh and PartFrames that you are using.

EDIT: Little bit of info.
InitDB, I'm getting something like 250FPS on 2.4Hhz Core Duo (IIRC).
SequenceDB and PartitionDB about 590 and 550 FPS.
With a fast machine you should get something a lot faster than that.


EDIT: OK, Got your link below, gonna DL it.

OK, got it, shall have a play, soon.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 24th September 2015 at 23:20.
StainlessS is offline   Reply With Quote
Old 24th September 2015, 21:04   #20  |  Link
Drayden
Registered User
 
Join Date: Aug 2015
Posts: 9
Link:
https://drive.google.com/file/d/0B3x...ew?usp=sharing
Drayden is offline   Reply With Quote
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 03:48.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.