Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

While no one who is in any way involved with a bug found right after a release takes pleasure in it, I have to say that I find it an HONOR to have been the one to find this one.  You guys are great.  Thank you for developing this stuff.  It's so fun to see videos "come alive" in ways never expected.  GameDrop, though imperfect, makes a "lost" video worth saving, and InterFrame (also imperfect) is SLICK!

I'll await the results of your (already) diligent expertise(s).

102 (edited by TCmullet 25-04-2015 12:54:20)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

I've installed Chain's new svpflow1.dll and svpflow2.dll (even though one of them has date 1/27/2015 which is earlier than date of last one 1/28/2015), and it does not blow up on SVConvert.  But I'm back to "I don't know what 'fix_clip' means (ScriptClip line 2)".  I've undeleted lines that James told me to remove and here is my entire script as it currently stands:

#SetMemoryMax(1024)
global svp_scheduler=true
global threads=2
global svp_cache_fwd=threads+10

#LoadPlugin("C:\Program Files (x86)\SVP\plugins\svpflow1.dll")
#LoadPlugin("C:\Program Files (x86)\SVP\plugins\svpflow2.dll")

SetMTMode(3,threads)
AviSource("D:\Video-Work\MyVideoNeedingGameDrop.avi").ConvertToYV12()
SetMTMode(2)

src=last
super_params_mini="{scale:{up:2},gpu:0}"
analyse_params_mini="{block:{w:8,h:8}}"
miniW = int(width/64)*32
miniW = (miniW<320) ? 320 : miniW
miniH = int(height/64)*32
miniH = (miniH<160) ? 160 : miniH
mini=BicubicResize(miniW,miniH).TemporalSoften(1, 1, 0, scenechange=1, mode=2)
super_mini=mini.SVSuper(super_params_mini)
vectors_mini=SVAnalyse(super_mini, analyse_params_mini)
vectors_Forward=SVConvert(vectors_mini, false)
HorizontalSpeed_luma=mini.MMask(vectors_Forward, kind=3).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)
VerticalSpeed_luma=mini.MMask(vectors_Forward, kind=4).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)

size=16
luma_lft=HorizontalSpeed_luma.crop(0,0,miniW/16,0).BicubicResize(size,size)
luma_rgh=HorizontalSpeed_luma.crop(miniW/16+miniW/8,0,0,0).BicubicResize(size,size)
luma_top=VerticalSpeed_luma.crop(0,0,0,miniH/16).BicubicResize(size,size)
luma_btm=VerticalSpeed_luma.crop(0,miniH/16+miniH/8,0,0).BicubicResize(size,size)
luma_drop=luma_lft.mt_lut(y=-1, u=128, v=128)

move_idx=5
y_idx=3
min_move=0.2
max_stop=0.5
drop_clip=luma_drop.ScriptClip("
    AvgLuma_lft=128-luma_lft.AverageLuma
    AvgLuma_rgh=128-luma_rgh.AverageLuma
    AvgLuma_lft_prev=128-(luma_lft.trim(1,1)+luma_lft).AverageLuma
    AvgLuma_rgh_prev=128-(luma_rgh.trim(1,1)+luma_rgh).AverageLuma
    AvgLuma_lft_next=128-luma_lft.trim(1,0).AverageLuma
    AvgLuma_rgh_next=128-luma_rgh.trim(1,0).AverageLuma

    AvgLuma_top=128-luma_top.AverageLuma
    AvgLuma_btm=128-luma_btm.AverageLuma
    AvgLuma_top_prev=128-(luma_top.trim(1,1)+luma_top).AverageLuma
    AvgLuma_btm_prev=128-(luma_btm.trim(1,1)+luma_btm).AverageLuma
    AvgLuma_top_next=128-luma_top.trim(1,0).AverageLuma
    AvgLuma_btm_next=128-luma_btm.trim(1,0).AverageLuma

    Max_lft=max(abs(AvgLuma_lft_prev),abs(AvgLuma_lft),abs(AvgLuma_lft_next))
    Max_rgh=max(abs(AvgLuma_rgh_prev),abs(AvgLuma_rgh),abs(AvgLuma_rgh_next))
    Max_top=max(abs(AvgLuma_top_prev),abs(AvgLuma_top),abs(AvgLuma_top_next))
    Max_btm=max(abs(AvgLuma_btm_prev),abs(AvgLuma_btm),abs(AvgLuma_btm_next))
    Max_all=max(Max_lft,Max_rgh,Max_top,Max_btm)
    
    MaxLuma=max(abs(AvgLuma_lft),abs(AvgLuma_rgh),abs(AvgLuma_top),abs(AvgLuma_btm))
    MaxLuma_prev=max(abs(AvgLuma_lft_prev),abs(AvgLuma_rgh_prev),abs(AvgLuma_top_prev),abs(AvgLuma_btm_prev))
    MaxLuma_next=max(abs(AvgLuma_lft_next),abs(AvgLuma_rgh_next),abs(AvgLuma_top_next),abs(AvgLuma_btm_next))
    dif=mini.YDifferenceFromPrevious
    dif_next=mini.trim(1,0).YDifferenceFromPrevious
    dif_prev=(mini.trim(1,1)+mini).YDifferenceFromPrevious
    
    GoodContrast = (max(mini.YPlaneMinMaxDifference,mini.trim(1,0).YPlaneMinMaxDifference)>20) ? 1 : 0

    drop = (MaxLuma<0.1 && MaxLuma*2<Max(MaxLuma_prev,MaxLuma_next) && dif*y_idx<max(dif_prev,dif_next)) ? 1 : 0

    drop_lft = (AvgLuma_lft_prev*AvgLuma_lft_next>0 && abs(AvgLuma_lft*move_idx)<Max_lft && abs(AvgLuma_lft)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 2 : 0
    drop_rgh = (AvgLuma_rgh_prev*AvgLuma_rgh_next>0 && abs(AvgLuma_rgh*move_idx)<Max_rgh && abs(AvgLuma_rgh)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 3 : 0
    drop_top = (AvgLuma_top_prev*AvgLuma_top_next>0 && abs(AvgLuma_top*move_idx)<Max_top && abs(AvgLuma_top)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 4 : 0
    drop_btm = (AvgLuma_btm_prev*AvgLuma_btm_next>0 && abs(AvgLuma_btm*move_idx)<Max_btm && abs(AvgLuma_btm)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 5 : 0
   
    drop = (drop==0 && MaxLuma<Max_stop && Max_lft==Max_all) ? drop_lft : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_rgh==Max_all) ? drop_rgh : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_top==Max_all) ? drop_top : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_btm==Max_all) ? drop_btm : drop
    drop_dif = (dif<0.4 && MaxLuma<min_move) ? 6 : 0
    drop = (drop==0 && drop_dif>0) ? drop_dif : drop
    drop = (drop>0 && Max_all<0.1) ? 0 : drop
    drop = (drop>0 && GoodContrast==0) ? 0 : drop

    luma=mini.AverageLuma
    luma_next=mini.trim(1,0).AverageLuma
    max_luma=max(luma,luma_next)

    drop = (drop>0 && max_luma<16.5) ? 0 : drop

    (drop>0) ? luma_drop : \
     (Max_lft==Max_all) ? luma_lft : \
      (Max_rgh==Max_all) ? luma_rgh : \
       (Max_top==Max_all) ? luma_top : luma_btm
")

fix_r50=luma_lft.mt_lut(y=-1, u=128, v=128)
fix_lr33=luma_lft.mt_lut(y=-2, u=128, v=128)
fix_l50=luma_lft.mt_lut(y=-3, u=128, v=128)
fix_r133=luma_lft.mt_lut(y=-4, u=128, v=128)
fix_r66=luma_lft.mt_lut(y=-5, u=128, v=128)

AvgDrop=127
MaxMulty=10
dblMulti=1.3
fix_clip=luma_drop.ScriptClip("
    drop=drop_clip.AverageLuma
    AvgLuma=abs(128-drop_clip.AverageLuma)
    AvgLuma_prev=abs(128-(drop_clip.trim(1,1)+drop_clip).AverageLuma)
    AvgLuma_prev_= (AvgLuma_prev==AvgDrop) ? 0 : AvgLuma_prev
    AvgLuma_prev2=abs(128-(drop_clip.trim(1,2)+drop_clip).AverageLuma)
    AvgLuma_next=abs(128-drop_clip.trim(1,0).AverageLuma)
    AvgLuma_next_= (AvgLuma_next==AvgDrop) ? 0 : AvgLuma_next
    AvgLuma_next2=abs(128-drop_clip.trim(2,0).AverageLuma)

    RightZero = (AvgLuma_prev_*MaxMulty<AvgLuma_next_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0
    LeftZero = (AvgLuma_next_*MaxMulty<AvgLuma_prev_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0

    drop = (AvgLuma==AvgDrop && AvgLuma_next==AvgDrop) ? -50 : 0
    drop = (AvgLuma==AvgDrop && AvgLuma_prev==AvgDrop) ? 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && RightZero==0) ? \
     AvgLuma_prev_>AvgLuma_next_*dblMulti ? -50 : \
      AvgLuma_prev_*dblMulti>=AvgLuma_next_ ? AvgLuma_next2==AvgDrop ? 50 : 33 : 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && RightZero==0 && AvgLuma_next2==AvgDrop) ? -50 : drop
    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && AvgLuma_prev2==AvgDrop) ? 66 : drop

    (drop==50) ? fix_r50 : \
     (drop==33) ? fix_lr33 : \
      (drop==-50) ? fix_l50 : \
       (drop==133) ? fix_r133 : \
        (drop==66) ? fix_r66 : drop_clip
")

r50=1
lr33=2
l50=3
r133=4
r66=5

super_params="{scale:{up:2},gpu:0}"
analyse_params="{main:{search:{coarse:{distance:4,bad:{sad:2000}},type:2,distance:4},penalty:{lambda:1,pglobal:10000}},refine:[{thsad:65000}]}"
smoothfps_params="{rate:{num:12,den:1},algo:13,scene:{blend:true}}"

super=SVSuper(super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(super, vectors, smoothfps_params, mt=threads, url="www.svp-team.com")
#----------------
#These are for visual debugging (the "Subtitle" clauses)
fix50 = fix_all.SelectEvery(12,6).Subtitle("fix50", align=3, size=120)
fix33 = fix_all.SelectEvery(12,4).Subtitle("fix33", align=3, size=120)
fix66 = fix_all.SelectEvery(12,8).Subtitle("-fix33", align=3, size=120)
fix66p = fix_all.SelectEvery(12,8).Subtitle("fix66", align=3, size=120)
fix75 = fix_all.SelectEvery(12,9).Subtitle("-fix25", align=3, size=120)
fix50n = fix_all.SelectEvery(12,6).Subtitle("-fix50", align=3, size=120)
fix133 = fix_all.SelectEvery(12,4).Subtitle("fix133", align=3, size=120)
fix125 = fix_all.SelectEvery(12,3).Subtitle("fix125", align=3, size=120)
#-----------------
#fix50 = fix_all.SelectEvery(12,6)
#fix33 = fix_all.SelectEvery(12,4)
#fix66 = fix_all.SelectEvery(12,8)
#fix66p = fix_all.SelectEvery(12,8)
#fix75 = fix_all.SelectEvery(12,9)
#fix50n = fix_all.SelectEvery(12,6)
#fix133 = fix_all.SelectEvery(12,4)
#fix125 = fix_all.SelectEvery(12,3)

SetMTMode(5)
ScriptClip("
    AvgFix=fix_clip.AverageLuma
    AvgFix_next=fix_clip.trim(1,0).AverageLuma
    AvgFix_next2=fix_clip.trim(2,0).AverageLuma
    AvgFix_next3=fix_clip.trim(3,0).AverageLuma
    AvgFix_prev=(fix_clip.trim(1,1)+fix_clip).AverageLuma

    (AvgFix==r50) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix33 : fix50 : \
    (AvgFix==lr33) ? fix33 : \
    (AvgFix_next==lr33) \
     ? (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix66.trim(1,1)+fix66 : \
    (AvgFix_next==l50) \
      ? (AvgFix_prev==lr33 || AvgFix_prev==r50) ? fix66.trim(1,1)+fix66 \
      : (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix50n.trim(1,1)+fix50n : \
    (AvgFix==r66) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix50 : fix66p : \
    (AvgFix_next==r66) \
      ? (AvgFix_next3==lr33 || AvgFix_next3==l50) ? fix125.trim(1,0) : fix133.trim(1,0) : \
    last
")

#trim(0,framecount-10)

Distributor()

What is wrong that this error is happening?

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

I just upgraded my two svpflow dlls to the current 1.1.14.  This GameDrop script is still bombing.  It's been 6+ weeks and no one has replied.  Won't someone please take a look and help me proceed to get it to work?  I don't know if it's a bug in svp or if I've somehow damaged my GameDropv4 script here.

I need this to work, both for a number of videos I have now, and also for future ones that I'll be creating that will need it.

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Distributor function is a part of MT. You should delete it too if you delete MT functions like setmemorymax ans setmtode.

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

James D
setmemorymax is not a "MT function" and it should exist in every script.

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

James D wrote:

Distributor function is a part of MT. You should delete it too if you delete MT functions like setmemorymax ans setmtode.

James, that appears to have done it!  (That is, it no longer says "I don't know what 'fixclip' means".)  However, I DO still two "SetMTMode" commands in there, even though setmemorymax is gone.  (Not that *I* put them there, but it was there when all was given to me.

Thoughts?

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Chainik wrote:

James D
setmemorymax is not a "MT function" and it should exist in every script.

It's working with my setmemorymax commented out.  I commented it out weeks ago on the advice of I don't remember who.

But are you saying should exist in every Avisynth script or every Avisynth script that involves SVP?

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Chainik
setmemorymax is not a "MT function" and it should exist in every script.
OK, but is it really needed with Dropfix script being SingleThreading? I don't think that such script really needs it because it will not overtake too much RAM.

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

SetMemoryMax() is a almost-mandatory part of AVS memory management subsystem.
I really don't get why someone would remove this call?

110 (edited by TCmullet 26-04-2015 01:00:03)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Chainik wrote:

SetMemoryMax() is a almost-mandatory part of AVS memory management subsystem.
I really don't get why someone would remove this call?

I've written dozens of scripts over several years, and never heard of it or it's alleged mandatoriness until getting into SVP things.

Let me add that in the current documentation that comes with Avisynth, there's no "set" anything under "S".

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

http://avisynth.nl/index.php/Internal_f … tMemoryMax

http://forum.doom9.org/showthread.php?p … ost1611064

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Chainik
In your first link is clearly written that its for rare scenarios with MT builds but when script acts as ST, Avisynth should work the same, no? And default for 2.58 ST is 512. And it didn't help for that poster.

Some of the 32bit MT-builds do not impose the standard framecache limitations, (consider it a bug)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

What exactly are you arguing with?
There's at least one scenario when SetMemoryMax is mandatory.
There're no scenarios where SetMemoryMax can break something (unless it defines some inappropriate value).
So what?  hmm

114 (edited by James D 26-04-2015 14:18:49)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Except for every other man it is needed to go deep into knowledge about memory requirements for every type of script where i heard many times "why did you put so big value", "well, try to put bigger value now" etc.
It's much easier to use 2 scenarios instead: 1 - just do not write anything about memory if you use single thread and save your time; and 2 - Write SetMemoryMax(1024) if you use multiple threads.
Much safer for anyone who doesn't consider himself as Pro in AVS scriptbuilding and you let AVS to do its own memory allocating job in Single Tread scenarious.

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

James D wrote:

Except for every other man it is needed to go deep into knowledge about memory requirements for every type of script where i heard many times "why did you put so big value", "well, try to put bigger value now" etc.
It's much easier to use 2 scenarios instead: 1 - just do not write anything about memory if you use single thread and save your time; and 2 - Write SetMemoryMax(1024) if you use multiple threads.
Much safer for anyone who doesn't consider himself as Pro in AVS scriptbuilding and you let AVS to do its own memory allocating job in Single Tread scenarious.

Well said, James.  It rather echoes my sentiments.  Another way to say might be, basic usage no need to use or worry about; advanced usage, learn it and tweak it.

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Thanks for these, Chainik.  It appears the docs built in to Avisynth distributions are very non-current.  But there was no evidence (that I noticed) in the built in docs that we must seek out more current docs online.  At least now I know.

117 (edited by TCmullet 01-05-2015 21:02:13)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Now that GameDrop4 is working again AND now that I have a working graphics card (with GPU resources available), I'm eager to use it on a pile-up of files.  (And I'll be getting more such files needing GameDrop badly in the future.)  But there's defects I'd like to see if they can be solved first.  Here's where I've come:

Sometimes the generated frames, whether 1 or 2, are not nearly as good as I'd expect.  This reminds me of the problem I dealt with in depth with SubJunk here:
http://forum.doom9.org/showthread.php?t … mp;page=37

He explained (and demonstrated) that the GPU usage in InterFrame wasn't merely to speed up some calculations, but was to DO some calcs that couldn't at present be done (or at least are not being done).  So to get the best effect, one HAS to use the GPU, no matter how patient one might be.

Now that I can do GPU on my main video PC, I looked around in InterFrame code for GPU related stuff and found these:

    GPU == true ? Eval("""
        SuperString = SuperString + "scale:{up:0,down:4},gpu:1,rc:false}"
    """) : Eval("""
        SuperString = SuperString + "scale:{up:2,down:4},gpu:0,rc:false}"
    """)

aHAAA, this "scale" thing, whatever it is, is being told to use or not use the gpu.  So in GameDrop4, I find 2 lines with a similar scale clause:  (I add both gpu true and false in my code.)

#
# Pick line for appropriate gpu setting, 0 or 1
# (1st of 2 locations)
#
super_params_mini="{scale:{up:0},gpu:1}"
#super_params_mini="{scale:{up:2},gpu:0}"
#
# Pick line for appropriate gpu setting, 0 or 1
# (2nd of 2 locations)
#
super_params="{scale:{up:0},gpu:1}"
#super_params="{scale:{up:2},gpu:0}"

So when I pick the lines with gpu:1, it DOES use my GPU.  But after reviewing several problem segments involving both single frame generation and 2-frames generated, it doesn't appear to be improving anything (except probably speed of render).

THEN I realized that the artifact was not exactly what I had observed in the problem I reported to SubJunk (the difference between gpu and no gpu).  It was a problem I observed earlier when I was experimenting with the various "Tuning" settings in InterFrame.  (Sorry I never bothered to report this.)  It seems that every time I tried something other than "Film", the items in motion were NOT placed halfway between the item in prior frame and same item in next frame.  No, the generated frame had it VERY close to it's position in the prior frame.  Why anyone wanted to call this "smooth", I couldn't figure.  To me it seemed like duplicating each frame and doubling the frame rate; i.e., useless.  So I've used "Film" for everything I do.  (Which so far is a sport, much of it fast-moving.)

But I have now sifted as best I can (which isn't very deep I admit) into the InterFrame code again, and I cannot find anything with regard to "Film" that would help me tweak GameDrop4 to solve this.  GameDrop is working well in many cases, and certainly even in the bad cases, it works great on the panning background.

Can this be tweaked more with someone's kind help??  I'd really like to make the interpolated motion look interpolated physically, rather than merely echoing the prior frame.

118 (edited by TCmullet 10-07-2015 23:16:59)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

I decided it was appropriate to proceed to ignore the issue I raised in my last post.  I've gone forward with using GameDropFix.
(I'm putting together an altogether different problem report, and I'll be including source code.)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

I've enjoyed GameDropFixV4 several times.  Thank you whoever developed it.  I have been wanting to enhance it to allow more flexible usage.  Parameters to control GPU, debug text and debug text size are helpful.  I've been able to implement *pseudo* parameters, as long as all of the GameDropFixV4 logic stays "in-line" in my script.  But this means I have to copy/paste the whole thing into every script.  Why not make it into a function and store it in a file with extension .avsi so that I can insert a simply one-line function call into each script?  Here are my efforts so far.

This script, with the logic in-line, works perfectly:

SetMemoryMax(1024)
global svp_scheduler=true
global threads=2
global svp_cache_fwd=threads+10

SetMTMode(3,threads)
video = LWLibavVideoSource("2014-09.Double-Agent-Nutrients-for-Longevity.(original).mp4")
audio = LWLibavAudioSource("2014-09.Double-Agent-Nutrients-for-Longevity.(original).mp4")
AudioDub(video, audio)

SetMTMode(2)


#GameDropFixV4 logic

# Set pseudo arguments
myGPU=true
myDebug=true
myErrSize=150

super_params_mini = (myGPU==true) ? "{scale:{up:0},gpu:1}" : "{scale:{up:2},gpu:0}"
#super_params_mini="{scale:{up:0},gpu:1}"
#super_params_mini="{scale:{up:2},gpu:0}"

analyse_params_mini="{block:{w:8,h:8}}"

miniW = int(width/64)*32
miniW = (miniW<320) ? 320 : miniW
miniH = int(height/64)*32
miniH = (miniH<160) ? 160 : miniH
mini=BicubicResize(miniW,miniH).TemporalSoften(1, 1, 0, scenechange=1, mode=2)
super_mini=mini.SVSuper(super_params_mini)
vectors_mini=SVAnalyse(super_mini, analyse_params_mini)
vectors_Forward=SVConvert(vectors_mini, false)
HorizontalSpeed_luma=mini.MMask(vectors_Forward, kind=3).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)
VerticalSpeed_luma=mini.MMask(vectors_Forward, kind=4).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)

size=16
luma_lft=HorizontalSpeed_luma.crop(0,0,miniW/16,0).BicubicResize(size,size)
luma_rgh=HorizontalSpeed_luma.crop(miniW/16+miniW/8,0,0,0).BicubicResize(size,size)
luma_top=VerticalSpeed_luma.crop(0,0,0,miniH/16).BicubicResize(size,size)
luma_btm=VerticalSpeed_luma.crop(0,miniH/16+miniH/8,0,0).BicubicResize(size,size)
luma_drop=luma_lft.mt_lut(y=-1, u=128, v=128)

move_idx=5
y_idx=3
min_move=0.2
max_stop=0.5
drop_clip=luma_drop.ScriptClip("
    AvgLuma_lft=128-luma_lft.AverageLuma
    AvgLuma_rgh=128-luma_rgh.AverageLuma
    AvgLuma_lft_prev=128-(luma_lft.trim(1,1)+luma_lft).AverageLuma
    AvgLuma_rgh_prev=128-(luma_rgh.trim(1,1)+luma_rgh).AverageLuma
    AvgLuma_lft_next=128-luma_lft.trim(1,0).AverageLuma
    AvgLuma_rgh_next=128-luma_rgh.trim(1,0).AverageLuma

    AvgLuma_top=128-luma_top.AverageLuma
    AvgLuma_btm=128-luma_btm.AverageLuma
    AvgLuma_top_prev=128-(luma_top.trim(1,1)+luma_top).AverageLuma
    AvgLuma_btm_prev=128-(luma_btm.trim(1,1)+luma_btm).AverageLuma
    AvgLuma_top_next=128-luma_top.trim(1,0).AverageLuma
    AvgLuma_btm_next=128-luma_btm.trim(1,0).AverageLuma

    Max_lft=max(abs(AvgLuma_lft_prev),abs(AvgLuma_lft),abs(AvgLuma_lft_next))
    Max_rgh=max(abs(AvgLuma_rgh_prev),abs(AvgLuma_rgh),abs(AvgLuma_rgh_next))
    Max_top=max(abs(AvgLuma_top_prev),abs(AvgLuma_top),abs(AvgLuma_top_next))
    Max_btm=max(abs(AvgLuma_btm_prev),abs(AvgLuma_btm),abs(AvgLuma_btm_next))
    Max_all=max(Max_lft,Max_rgh,Max_top,Max_btm)
    
    MaxLuma=max(abs(AvgLuma_lft),abs(AvgLuma_rgh),abs(AvgLuma_top),abs(AvgLuma_btm))
    MaxLuma_prev=max(abs(AvgLuma_lft_prev),abs(AvgLuma_rgh_prev),abs(AvgLuma_top_prev),abs(AvgLuma_btm_prev))
    MaxLuma_next=max(abs(AvgLuma_lft_next),abs(AvgLuma_rgh_next),abs(AvgLuma_top_next),abs(AvgLuma_btm_next))
    dif=mini.YDifferenceFromPrevious
    dif_next=mini.trim(1,0).YDifferenceFromPrevious
    dif_prev=(mini.trim(1,1)+mini).YDifferenceFromPrevious
    
    GoodContrast = (max(mini.YPlaneMinMaxDifference,mini.trim(1,0).YPlaneMinMaxDifference)>20) ? 1 : 0

    drop = (MaxLuma<0.1 && MaxLuma*2<Max(MaxLuma_prev,MaxLuma_next) && dif*y_idx<max(dif_prev,dif_next)) ? 1 : 0

    drop_lft = (AvgLuma_lft_prev*AvgLuma_lft_next>0 && abs(AvgLuma_lft*move_idx)<Max_lft && abs(AvgLuma_lft)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 2 : 0
    drop_rgh = (AvgLuma_rgh_prev*AvgLuma_rgh_next>0 && abs(AvgLuma_rgh*move_idx)<Max_rgh && abs(AvgLuma_rgh)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 3 : 0
    drop_top = (AvgLuma_top_prev*AvgLuma_top_next>0 && abs(AvgLuma_top*move_idx)<Max_top && abs(AvgLuma_top)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 4 : 0
    drop_btm = (AvgLuma_btm_prev*AvgLuma_btm_next>0 && abs(AvgLuma_btm*move_idx)<Max_btm && abs(AvgLuma_btm)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 5 : 0
   
    drop = (drop==0 && MaxLuma<Max_stop && Max_lft==Max_all) ? drop_lft : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_rgh==Max_all) ? drop_rgh : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_top==Max_all) ? drop_top : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_btm==Max_all) ? drop_btm : drop
    drop_dif = (dif<0.4 && MaxLuma<min_move) ? 6 : 0
    drop = (drop==0 && drop_dif>0) ? drop_dif : drop
    drop = (drop>0 && Max_all<0.1) ? 0 : drop
    drop = (drop>0 && GoodContrast==0) ? 0 : drop

    luma=mini.AverageLuma
    luma_next=mini.trim(1,0).AverageLuma
    max_luma=max(luma,luma_next)

    drop = (drop>0 && max_luma<16.5) ? 0 : drop

    (drop>0) ? luma_drop : \
     (Max_lft==Max_all) ? luma_lft : \
      (Max_rgh==Max_all) ? luma_rgh : \
       (Max_top==Max_all) ? luma_top : luma_btm
")

fix_r50=luma_lft.mt_lut(y=-1, u=128, v=128)
fix_lr33=luma_lft.mt_lut(y=-2, u=128, v=128)
fix_l50=luma_lft.mt_lut(y=-3, u=128, v=128)
fix_r133=luma_lft.mt_lut(y=-4, u=128, v=128)
fix_r66=luma_lft.mt_lut(y=-5, u=128, v=128)

AvgDrop=127
MaxMulty=10
dblMulti=1.3
fix_clip=luma_drop.ScriptClip("
    drop=drop_clip.AverageLuma
    AvgLuma=abs(128-drop_clip.AverageLuma)
    AvgLuma_prev=abs(128-(drop_clip.trim(1,1)+drop_clip).AverageLuma)
    AvgLuma_prev_= (AvgLuma_prev==AvgDrop) ? 0 : AvgLuma_prev
    AvgLuma_prev2=abs(128-(drop_clip.trim(1,2)+drop_clip).AverageLuma)
    AvgLuma_next=abs(128-drop_clip.trim(1,0).AverageLuma)
    AvgLuma_next_= (AvgLuma_next==AvgDrop) ? 0 : AvgLuma_next
    AvgLuma_next2=abs(128-drop_clip.trim(2,0).AverageLuma)

    RightZero = (AvgLuma_prev_*MaxMulty<AvgLuma_next_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0
    LeftZero = (AvgLuma_next_*MaxMulty<AvgLuma_prev_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0

    drop = (AvgLuma==AvgDrop && AvgLuma_next==AvgDrop) ? -50 : 0
    drop = (AvgLuma==AvgDrop && AvgLuma_prev==AvgDrop) ? 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && RightZero==0) ? \
     AvgLuma_prev_>AvgLuma_next_*dblMulti ? -50 : \
      AvgLuma_prev_*dblMulti>=AvgLuma_next_ ? AvgLuma_next2==AvgDrop ? 50 : 33 : 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && RightZero==0 && AvgLuma_next2==AvgDrop) ? -50 : drop
    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && AvgLuma_prev2==AvgDrop) ? 66 : drop

    (drop==50) ? fix_r50 : \
     (drop==33) ? fix_lr33 : \
      (drop==-50) ? fix_l50 : \
       (drop==133) ? fix_r133 : \
        (drop==66) ? fix_r66 : drop_clip
")

r50=1
lr33=2
l50=3
r133=4
r66=5

super_params = (myGPU==true) ? "{scale:{up:0},gpu:1}" : "{scale:{up:2},gpu:0}"
#super_params="{scale:{up:0},gpu:1}"
#super_params="{scale:{up:2},gpu:0}"

analyse_params="{main:{search:{coarse:{distance:4,bad:{sad:2000}},type:2,distance:4},penalty:{lambda:1,pglobal:10000}},refine:[{thsad:65000}]}"
smoothfps_params="{rate:{num:12,den:1},algo:13,scene:{blend:true}}"

super=SVSuper(super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(super, vectors, smoothfps_params, mt=threads, url="www.svp-team.com")

dummy = myDebug ? Eval("""
# These are for visual debugging (the "Subtitle" clauses)
fix50 = fix_all.SelectEvery(12,6).Subtitle("fix50", align=3, size=myErrSize)
fix33 = fix_all.SelectEvery(12,4).Subtitle("fix33", align=3, size=myErrSize)
fix66 = fix_all.SelectEvery(12,8).Subtitle("-fix33", align=3, size=myErrSize)
fix66p = fix_all.SelectEvery(12,8).Subtitle("fix66", align=3, size=myErrSize)
fix75 = fix_all.SelectEvery(12,9).Subtitle("-fix25", align=3, size=myErrSize)
fix50n = fix_all.SelectEvery(12,6).Subtitle("-fix50", align=3, size=myErrSize)
fix133 = fix_all.SelectEvery(12,4).Subtitle("fix133", align=3, size=myErrSize)
fix125 = fix_all.SelectEvery(12,3).Subtitle("fix125", align=3, size=myErrSize)
""") : Eval("""
fix50 = fix_all.SelectEvery(12,6)
fix33 = fix_all.SelectEvery(12,4)
fix66 = fix_all.SelectEvery(12,8)
fix66p = fix_all.SelectEvery(12,8)
fix75 = fix_all.SelectEvery(12,9)
fix50n = fix_all.SelectEvery(12,6)
fix133 = fix_all.SelectEvery(12,4)
fix125 = fix_all.SelectEvery(12,3)
""")

SetMTMode(5)
ScriptClip("
    AvgFix=fix_clip.AverageLuma
    AvgFix_next=fix_clip.trim(1,0).AverageLuma
    AvgFix_next2=fix_clip.trim(2,0).AverageLuma
    AvgFix_next3=fix_clip.trim(3,0).AverageLuma
    AvgFix_prev=(fix_clip.trim(1,1)+fix_clip).AverageLuma

    (AvgFix==r50) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix33 : fix50 : \
    (AvgFix==lr33) ? fix33 : \
    (AvgFix_next==lr33) \
     ? (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix66.trim(1,1)+fix66 : \
    (AvgFix_next==l50) \
      ? (AvgFix_prev==lr33 || AvgFix_prev==r50) ? fix66.trim(1,1)+fix66 \
      : (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix50n.trim(1,1)+fix50n : \
    (AvgFix==r66) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix50 : fix66p : \
    (AvgFix_next==r66) \
      ? (AvgFix_next3==lr33 || AvgFix_next3==l50) ? fix125.trim(1,0) : fix133.trim(1,0) : \
    last
")
#trim(0,framecount-10)
#Distributor()
#
# end of GameDropFix (clip is returned)

__END__

# do 60fps generation
ConvertToYV12()
SetMTMode(2)
#InterFrame(Cores=4,Tuning="Film",NewNum=60000,NewDen=1001,GPU=true)
#SR(1920,1080,4)
#Normalize()

main=last
MyBlank=BlankClip(main,120)
main ++ MyBlank

#Encode to x264, q=20, pcm audio.
#Then extract audio for Audacity improvements.

I'll put the function-ized version in next post.

120 (edited by TCmullet 10-07-2015 23:31:56)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Here's the .avsi I built to include a GameDropFixV4 function.

GameDropFixFuncs.avsi

# GameDropFixFuncs.avsi

function GameDropFixV4(clip c, bool "myGPU", bool "myDebug", int "myErrSize")
{

#myGPU=true
#myDebug=true
#myErrSize=150

super_params_mini = (myGPU==true) ? "{scale:{up:0},gpu:1}" : "{scale:{up:2},gpu:0}"
#super_params_mini="{scale:{up:0},gpu:1}"
#super_params_mini="{scale:{up:2},gpu:0}"

analyse_params_mini="{block:{w:8,h:8}}"

miniW = int(width/64)*32
miniW = (miniW<320) ? 320 : miniW
miniH = int(height/64)*32
miniH = (miniH<160) ? 160 : miniH
mini=BicubicResize(miniW,miniH).TemporalSoften(1, 1, 0, scenechange=1, mode=2)
super_mini=mini.SVSuper(super_params_mini)
vectors_mini=SVAnalyse(super_mini, analyse_params_mini)
vectors_Forward=SVConvert(vectors_mini, false)
HorizontalSpeed_luma=mini.MMask(vectors_Forward, kind=3).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)
VerticalSpeed_luma=mini.MMask(vectors_Forward, kind=4).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)

size=16
luma_lft=HorizontalSpeed_luma.crop(0,0,miniW/16,0).BicubicResize(size,size)
luma_rgh=HorizontalSpeed_luma.crop(miniW/16+miniW/8,0,0,0).BicubicResize(size,size)
luma_top=VerticalSpeed_luma.crop(0,0,0,miniH/16).BicubicResize(size,size)
luma_btm=VerticalSpeed_luma.crop(0,miniH/16+miniH/8,0,0).BicubicResize(size,size)
luma_drop=luma_lft.mt_lut(y=-1, u=128, v=128)

move_idx=5
y_idx=3
min_move=0.2
max_stop=0.5
drop_clip=luma_drop.ScriptClip("
    AvgLuma_lft=128-luma_lft.AverageLuma
    AvgLuma_rgh=128-luma_rgh.AverageLuma
    AvgLuma_lft_prev=128-(luma_lft.trim(1,1)+luma_lft).AverageLuma
    AvgLuma_rgh_prev=128-(luma_rgh.trim(1,1)+luma_rgh).AverageLuma
    AvgLuma_lft_next=128-luma_lft.trim(1,0).AverageLuma
    AvgLuma_rgh_next=128-luma_rgh.trim(1,0).AverageLuma

    AvgLuma_top=128-luma_top.AverageLuma
    AvgLuma_btm=128-luma_btm.AverageLuma
    AvgLuma_top_prev=128-(luma_top.trim(1,1)+luma_top).AverageLuma
    AvgLuma_btm_prev=128-(luma_btm.trim(1,1)+luma_btm).AverageLuma
    AvgLuma_top_next=128-luma_top.trim(1,0).AverageLuma
    AvgLuma_btm_next=128-luma_btm.trim(1,0).AverageLuma

    Max_lft=max(abs(AvgLuma_lft_prev),abs(AvgLuma_lft),abs(AvgLuma_lft_next))
    Max_rgh=max(abs(AvgLuma_rgh_prev),abs(AvgLuma_rgh),abs(AvgLuma_rgh_next))
    Max_top=max(abs(AvgLuma_top_prev),abs(AvgLuma_top),abs(AvgLuma_top_next))
    Max_btm=max(abs(AvgLuma_btm_prev),abs(AvgLuma_btm),abs(AvgLuma_btm_next))
    Max_all=max(Max_lft,Max_rgh,Max_top,Max_btm)
    
    MaxLuma=max(abs(AvgLuma_lft),abs(AvgLuma_rgh),abs(AvgLuma_top),abs(AvgLuma_btm))
    MaxLuma_prev=max(abs(AvgLuma_lft_prev),abs(AvgLuma_rgh_prev),abs(AvgLuma_top_prev),abs(AvgLuma_btm_prev))
    MaxLuma_next=max(abs(AvgLuma_lft_next),abs(AvgLuma_rgh_next),abs(AvgLuma_top_next),abs(AvgLuma_btm_next))
    dif=mini.YDifferenceFromPrevious
    dif_next=mini.trim(1,0).YDifferenceFromPrevious
    dif_prev=(mini.trim(1,1)+mini).YDifferenceFromPrevious
    
    GoodContrast = (max(mini.YPlaneMinMaxDifference,mini.trim(1,0).YPlaneMinMaxDifference)>20) ? 1 : 0

    drop = (MaxLuma<0.1 && MaxLuma*2<Max(MaxLuma_prev,MaxLuma_next) && dif*y_idx<max(dif_prev,dif_next)) ? 1 : 0

    drop_lft = (AvgLuma_lft_prev*AvgLuma_lft_next>0 && abs(AvgLuma_lft*move_idx)<Max_lft && abs(AvgLuma_lft)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 2 : 0
    drop_rgh = (AvgLuma_rgh_prev*AvgLuma_rgh_next>0 && abs(AvgLuma_rgh*move_idx)<Max_rgh && abs(AvgLuma_rgh)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 3 : 0
    drop_top = (AvgLuma_top_prev*AvgLuma_top_next>0 && abs(AvgLuma_top*move_idx)<Max_top && abs(AvgLuma_top)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 4 : 0
    drop_btm = (AvgLuma_btm_prev*AvgLuma_btm_next>0 && abs(AvgLuma_btm*move_idx)<Max_btm && abs(AvgLuma_btm)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 5 : 0
   
    drop = (drop==0 && MaxLuma<Max_stop && Max_lft==Max_all) ? drop_lft : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_rgh==Max_all) ? drop_rgh : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_top==Max_all) ? drop_top : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_btm==Max_all) ? drop_btm : drop
    drop_dif = (dif<0.4 && MaxLuma<min_move) ? 6 : 0
    drop = (drop==0 && drop_dif>0) ? drop_dif : drop
    drop = (drop>0 && Max_all<0.1) ? 0 : drop
    drop = (drop>0 && GoodContrast==0) ? 0 : drop

    luma=mini.AverageLuma
    luma_next=mini.trim(1,0).AverageLuma
    max_luma=max(luma,luma_next)

    drop = (drop>0 && max_luma<16.5) ? 0 : drop

    (drop>0) ? luma_drop : \
     (Max_lft==Max_all) ? luma_lft : \
      (Max_rgh==Max_all) ? luma_rgh : \
       (Max_top==Max_all) ? luma_top : luma_btm
")

fix_r50=luma_lft.mt_lut(y=-1, u=128, v=128)
fix_lr33=luma_lft.mt_lut(y=-2, u=128, v=128)
fix_l50=luma_lft.mt_lut(y=-3, u=128, v=128)
fix_r133=luma_lft.mt_lut(y=-4, u=128, v=128)
fix_r66=luma_lft.mt_lut(y=-5, u=128, v=128)

AvgDrop=127
MaxMulty=10
dblMulti=1.3
fix_clip=luma_drop.ScriptClip("
    drop=drop_clip.AverageLuma
    AvgLuma=abs(128-drop_clip.AverageLuma)
    AvgLuma_prev=abs(128-(drop_clip.trim(1,1)+drop_clip).AverageLuma)
    AvgLuma_prev_= (AvgLuma_prev==AvgDrop) ? 0 : AvgLuma_prev
    AvgLuma_prev2=abs(128-(drop_clip.trim(1,2)+drop_clip).AverageLuma)
    AvgLuma_next=abs(128-drop_clip.trim(1,0).AverageLuma)
    AvgLuma_next_= (AvgLuma_next==AvgDrop) ? 0 : AvgLuma_next
    AvgLuma_next2=abs(128-drop_clip.trim(2,0).AverageLuma)

    RightZero = (AvgLuma_prev_*MaxMulty<AvgLuma_next_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0
    LeftZero = (AvgLuma_next_*MaxMulty<AvgLuma_prev_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0

    drop = (AvgLuma==AvgDrop && AvgLuma_next==AvgDrop) ? -50 : 0
    drop = (AvgLuma==AvgDrop && AvgLuma_prev==AvgDrop) ? 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && RightZero==0) ? \
     AvgLuma_prev_>AvgLuma_next_*dblMulti ? -50 : \
      AvgLuma_prev_*dblMulti>=AvgLuma_next_ ? AvgLuma_next2==AvgDrop ? 50 : 33 : 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && RightZero==0 && AvgLuma_next2==AvgDrop) ? -50 : drop
    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && AvgLuma_prev2==AvgDrop) ? 66 : drop

    (drop==50) ? fix_r50 : \
     (drop==33) ? fix_lr33 : \
      (drop==-50) ? fix_l50 : \
       (drop==133) ? fix_r133 : \
        (drop==66) ? fix_r66 : drop_clip
")

r50=1
lr33=2
l50=3
r133=4
r66=5

super_params = (myGPU==true) ? "{scale:{up:0},gpu:1}" : "{scale:{up:2},gpu:0}"
#super_params="{scale:{up:0},gpu:1}"
#super_params="{scale:{up:2},gpu:0}"

analyse_params="{main:{search:{coarse:{distance:4,bad:{sad:2000}},type:2,distance:4},penalty:{lambda:1,pglobal:10000}},refine:[{thsad:65000}]}"
smoothfps_params="{rate:{num:12,den:1},algo:13,scene:{blend:true}}"

super=SVSuper(super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(super, vectors, smoothfps_params, mt=threads, url="www.svp-team.com")

dummy = myDebug ? Eval("""
# These are for visual debugging (the "Subtitle" clauses)
fix50 = fix_all.SelectEvery(12,6).Subtitle("fix50", align=3, size=myErrSize)
fix33 = fix_all.SelectEvery(12,4).Subtitle("fix33", align=3, size=myErrSize)
fix66 = fix_all.SelectEvery(12,8).Subtitle("-fix33", align=3, size=myErrSize)
fix66p = fix_all.SelectEvery(12,8).Subtitle("fix66", align=3, size=myErrSize)
fix75 = fix_all.SelectEvery(12,9).Subtitle("-fix25", align=3, size=myErrSize)
fix50n = fix_all.SelectEvery(12,6).Subtitle("-fix50", align=3, size=myErrSize)
fix133 = fix_all.SelectEvery(12,4).Subtitle("fix133", align=3, size=myErrSize)
fix125 = fix_all.SelectEvery(12,3).Subtitle("fix125", align=3, size=myErrSize)
""") : Eval("""
fix50 = fix_all.SelectEvery(12,6)
fix33 = fix_all.SelectEvery(12,4)
fix66 = fix_all.SelectEvery(12,8)
fix66p = fix_all.SelectEvery(12,8)
fix75 = fix_all.SelectEvery(12,9)
fix50n = fix_all.SelectEvery(12,6)
fix133 = fix_all.SelectEvery(12,4)
fix125 = fix_all.SelectEvery(12,3)
""")

SetMTMode(5)
ScriptClip("
    AvgFix=fix_clip.AverageLuma
    AvgFix_next=fix_clip.trim(1,0).AverageLuma
    AvgFix_next2=fix_clip.trim(2,0).AverageLuma
    AvgFix_next3=fix_clip.trim(3,0).AverageLuma
    AvgFix_prev=(fix_clip.trim(1,1)+fix_clip).AverageLuma

    (AvgFix==r50) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix33 : fix50 : \
    (AvgFix==lr33) ? fix33 : \
    (AvgFix_next==lr33) \
     ? (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix66.trim(1,1)+fix66 : \
    (AvgFix_next==l50) \
      ? (AvgFix_prev==lr33 || AvgFix_prev==r50) ? fix66.trim(1,1)+fix66 \
      : (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix50n.trim(1,1)+fix50n : \
    (AvgFix==r66) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix50 : fix66p : \
    (AvgFix_next==r66) \
      ? (AvgFix_next3==lr33 || AvgFix_next3==l50) ? fix125.trim(1,0) : fix133.trim(1,0) : \
    last
")
#trim(0,framecount-10)
#Distributor()
#
# end of GameDropFix (clip is returned)
}

And then here is the top level script which CALLS GameDropFixV4.

SetMemoryMax(1024)
global svp_scheduler=true
global threads=2
global svp_cache_fwd=threads+10

SetMTMode(3,threads)
video = LWLibavVideoSource("2014-09.Double-Agent-Nutrients-for-Longevity.(original).mp4")
audio = LWLibavAudioSource("2014-09.Double-Agent-Nutrients-for-Longevity.(original).mp4")
AudioDub(video, audio)

SetMTMode(2)


GameDropFixV4(myGPU=true,myDebug=true,myErrSize=150)


__END__

# do 60fps generation
ConvertToYV12()
SetMTMode(2)
#InterFrame(Cores=4,Tuning="Film",NewNum=60000,NewDen=1001,GPU=true)
#SR(1920,1080,4)
#Normalize()

main=last
MyBlank=BlankClip(main,120)
main ++ MyBlank

#Encode to x264, q=20, pcm audio.
#Then extract audio for Audacity improvements.

I get this crazy error message which makes no sense:

Avisynth open failure:
I don't know what "width" means
(GampeDropFixFuncs.avsi, line 26)
(C:\....(filename).avs, line 14)

The width-of-clip function presumes that there is a current clip.  There IS a current clip.  What the heck's wrong, please???

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

To whoever kind soul reaches out to help me and the above problem, you can try it on the real video in question.  If you have Youtube downloading software, pick this one:
https://www.youtube.com/watch?v=WB5wsZVFpvU
and pick the highest res. one, 720p.

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Replace 'width' with 'c.width'?

123 (edited by TCmullet 23-07-2015 01:50:44)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Chainik wrote:

Replace 'width' with 'c.width'?

Thanks, Chainik.  I have further info.

I made a source code mistake in that I deleted some comments in the function .avsi before I left it here, but when I reported the error line number, I gave it exactly as appearing at my end.  I've now deleted those comments at home and the error line is 16 instead of 26.

When I added "c." to line 16 (where the "width" was), the script proceeded, but then bombed at line 18 on the "height" reference.

I don't understand how these two errors can happen.  It's acting like there was no current clip.  My desired input clip WAS the current clip at the point in time where I called my GameDropFix function (as a result of the AudioDub function call).  Why isn't the clip seen so that width and height attributes are easily available without "c."?

When I added "c." to the height, it proceeded to blow up on line 20 with "Invalid arguments to function 'BicubicResize'".

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

So why is this cascade of failures happening?????   (Why does it seem to be acting like there's no "current clip" and blowing up as a result?)

Re: Fixing dropped frames in action cam footage? (for stereoscopic 3D)

Obviously because there's no current clip inside the function. You should either add the context "c" explicitely or add "last=c" as the first line.