3,451

(4 replies, posted in Using SVP)

mark007
They are not hangs. Menu is still working if you click it to hot areas. It just don't painting.

totalz
If you using MPC-HC then you can stay video on pause before right place and then use Ctrl-right arrow to go frame-by-frame. If you get frame needed then take a screenshot.

noskill
Меню SVP в трее - показать - дополнительную информацию.
Там ответ на Ваш вопрос.

3,454

(7 replies, posted in Using SVP)

redlid
How did you enable Yadif? As filter in ffdShow?
Did you try to tune it in ffdShow but enable it from SVP menu - settings - deinterlacing?

3,455

(10 replies, posted in Using SVP)

totalz
I don't understand you. What you want to ask?

totalz
Can you add screenshot here to tell about one thing?

dlr5668
Да, точно подмечено. Скрипт я еще не выкладывал. Здесь основную ценность представляет не видео, а скрипт, которым можно обработать тысячи подобных видео smile
Подчистил лишние строки, убрал отладочные конструкции. В таком виде уже можно использовать. Оформление скрипта все еще рабочее, для выставки не годится.

Скрипт GameDropFix_v3

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

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

SetMTMode(3,threads)
DSS2("BF4_720p60.mp4",fps=59.94).ConvertToYV12()
SetMTMode(2)

super_params_mini="{scale:{up:0},gpu:1}"
analyse_params_mini="{block:{w:8,h:8}}"
mini=BicubicResize(width/2,height/2).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(width/32, height/32).PointResize(width/8, height/8).ConvertToYV12().mt_lut(y=2, u=128, v=128)
VerticalSpeed_luma=mini.MMask(vectors_Forward, kind=4).convertToRGB32().PointResize(width/32, height/32).PointResize(width/8, height/8).ConvertToYV12().mt_lut(y=2, u=128, v=128)

size=16
luma_lft=HorizontalSpeed_luma.crop(0,0,int(width/64)*2,0).BicubicResize(size,size)
luma_rgh=HorizontalSpeed_luma.crop(int(width/64)*2+int(width/32)*2,0,0,0).BicubicResize(size,size)
luma_top=VerticalSpeed_luma.crop(0,0,0,int(height/64)*2).BicubicResize(size,size)
luma_btm=VerticalSpeed_luma.crop(0,int(height/64)*2+int(height/32)*2,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.2) ? 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)
    #AvgLuma_next3=abs(128-drop_clip.trim(3,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:0},gpu:1}"
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")
fix50 = fix_all.SelectEvery(12,6).Subtitle("fix50", align=3, size=12)
fix33 = fix_all.SelectEvery(12,4).Subtitle("fix33", align=3, size=12)
fix66 = fix_all.SelectEvery(12,8).Subtitle("-fix33", align=3, size=12)
fix66p = fix_all.SelectEvery(12,8).Subtitle("fix66", align=3, size=12)
fix75 = fix_all.SelectEvery(12,9).Subtitle("-fix25", align=3, size=12)
fix50n = fix_all.SelectEvery(12,6).Subtitle("-fix50", align=3, size=12)
fix133 = fix_all.SelectEvery(12,4).Subtitle("fix133", align=3, size=12)
fix125 = fix_all.SelectEvery(12,3).Subtitle("fix125", align=3, size=12)

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()

Немного об алгоритме:
- в кадре выделяются четыре зоны, в которых оценивается движение: слева/справа, сверху/снизу;
- все кадры, на которых наблюдается резкая приостановка движений (max_stop, пкс) признаются кандидатами к замене и помещаются в клип drop_clip;
- далее идет выделение из этих кандидатов одиночных, двойных и тройных выпавших кадров, на выходе получается клип кадров к замене fix_clip с пятью вариантами замены кадров;
- далее производится обработка конфликтных ситуаций, чтобы не происходило образование новых кадров дублей после замены и выполняется непосредственно замена кадра выбором одного из 8-ми вариантов;

Алгоритм однопроходной, но из-за сложной конвейерной структуры и необходимости буферизации промежуточных результатов в таком виде не пригоден для работы на лету, подходит только для последовательной обработки с предварительным сохранением результата для последующего просмотра.

Окончательный вариант ролика с замененными выпавшими кадрами: BF4_720p60_DropsFixed_v3.mkv (1,25 ГБ)

Отличается от двух предыдущих:
- возвращена ошибочно выставленная частота кадров с 60 fps до 59.94 fps. Это исключило появление 62 выпавших кадров на ровном месте wink
- добавлена замена парных выпавших кадров;
- добавлена замена тройных выпавших кадров;
- изменены настройки интерполяции для уменьшения волновых артефактов на интерполированных кадрах, применено смешивание кадров на сменах сцен.

Вот карта расположения выпавших кадров во всех четырех роликах с цифрами.

https://www.svp-team.com/forum/misc.php?action=pun_attachment&amp;item=2483
https://www.svp-team.com/forum/misc.php?action=pun_attachment&amp;item=2484
https://www.svp-team.com/forum/misc.php?action=pun_attachment&amp;item=2485
https://www.svp-team.com/forum/misc.php?action=pun_attachment&amp;item=2486

Самые заметные выпавшие кадры - это одиночно-расположенные, особенно, если находятся в местах с динамичным движением.
Самые безобидные - чередующиеся через один. Наблюдаются на вставках с низкой частотой кадров (30 к/сек) из других роликов.
Двойные и тройные дропы заметнее одинарных, особенно если они отдельно-расположенные, как в этом ролике.

Итого за три итерации количество отдельно стоящих выпавших кадров уменьшено с 1160 до 170. По остальным типам выпавших кадров тоже получен значительный прогресс.

Разработанный скрипт избавляет видео в первую очередь от приостановок в глобальных движениях: панорамирование, зум. Локальные движения остаются без изменений.
Теперь, при просмотре ролика на фоне плавных движений камеры уже явно бросаются в глаза недоработки игрового движка:
- низкая частота кадров, примененная в анимации персонажей (особенно неприятно смотрится перемещение персонажей и смена поз попеременно через кадр);
- низкая точность анимации персонажей, что делает их движения кукольными особенно вблизи;
- низкая точность анимации объектов, скачкообразные движения вертолета;
- двойные крылья у птиц smile

Вот такие у меня замечания. Но несмотря на вышесказанное, приятного просмотра! wink

madVR is the best renderer.

smart
Жаль что информации о них на самом деле так мало
Ветка на iXBT в трех частях - это "мало"? hmm

что, если кадры не в png а скажем bmp. Это меняет способ обработки?
Нет, скрипт остается прежний, меняется только расширение.

чтобы скрипт принимал в качестве исходных два отдельных файла, левый и правый ракурс
Тогда в скрипте надо написать две строчки открытия файла вместо одной

left=ImageSource("left.bmp",end=0)
right=ImageSource("right.bmp",end=0)
left+right
...

Надо ли что-то менять в скрипте в случае изменений в разрешении исходных кадров?
Да. Если разрешение в пределах FullHD - убрать строку BicubicResize, если больше - то проверять, хватит ли памяти и менять цифры в BicubicResize для уменьшения разрешения картинки с целью экономии используемой памяти.

totalz
Yes, single display works, or primary display in dual.  Or MadVR exclusive mode for second display in dual.
Good cool

Do you mean the "windowed overly" in MadVR for 'overlay mixer'?
No. Overlay Mixer Filter.
I do not recommend to enable "windowed overly" in MadVR. hmm

Would like to try EVR custom presenter but don't want to use MPC-HC, anyway to use it with KMP?
Select EVR in KMP. What the problem? wink

But for times, there are blurry artifacts around moving objects, how do I correct those?
It is lack of technology. You can reduce it but you can not remove it completely. We can discuss it separately. It is off-topic here.

Kanade
I'm getting error message as shown...

SVP performance is too low.
Try to lower the profile settings. (SVP Index=0.81x)

Thank you. It was error of SVP-Index calculation. It is fixed.
Just exit SVP Manager, unpack fix to "Program Files\SVP 3.1" folder and run SVP Manager again.

Inok
Ищите проблему в своей системе. Ни у кого кроме Вас видеодрайвер не слетает.
Если приведете конфигурацию Вашего компьютера полностью и перечислите специальное ПО, установленное на нем, то это повысит шансы решить проблему совместными усилиями wink

smart
на сайте с описанием MSU_FRC есть сравнение с другими алгоритмами, но вашего там нет.
Плагин MVTools уже в 2007-м году был серьезным противником MSU_FRC. У меня два варианта, почему MVTools нет в том сравнении: либо авторы про него не знали, либо специально не стали включать, т.к. на его фоне MSU_FRC смотрелся бы не так выигрышно.
Вот мой комментарий 2007 года насчет сравнения качества MVTools и MSU_FRC:

Качество при тестировании стояло на втором месте (все-таки проверялась именно производительность), но сейчас, попробовав еще и MVFlowFps из пакета MVTools, я заметил разницу не только в производительности, но и в получаемом качестве. Например, регулярные структуры (решетки на окнах) лучше выглядят у FRC (перемещаются плавнее), а вот «эффект гало» на границах движущихся объектов менее заметен у MVFlowFps.

MVTools в сравнении с MSU_FRC, CrystalPlayer'ом и TrimensionDNM показывал в 2008 году такие результаты:
http://www.svp-team.com/forum/misc.php?item=2480

У меня, к сожалению, мало опыта по использованию скриптов.
Рекомендую начать со статьи Основы использования утилиты AviSynth при обработке видео

Не могли бы вы чуть более пошагово обьяснить порядок действий для такого результата как вы привели.
1. Установить пакет SVP (оттуда потребуется avisynth и плагины SVPFlow)
2. Скопировать файлы из SVP\Plugins\ в AviSynth 2.5\plugins\
3. Установить редактор AvsP или AvsPmod (русское описание)
4. Набрать скрипт в редакторе, сохранить, положить в эту же папку файл 01.png, выполнить скрипт, посмотреть результат
5. Сохранить кадры из редактора как отдельные файлы

---
Для наглядности результата из набора картинок я создал анимированный GIF. Это делается, например, в PhotoShop'е.

Как бы выглядел скрипт для исходных двух отдельных кадров, произвольного размера?
Сильно зависит от того, какой смысл вкладывается во фразу "двух отдельных кадров".
Дайте технические данные этих двух отдельных кадров.
формат исходного файла: картинка (BMP, JPG, PNG) или видео (AVI, MKV, MP4).
стерео-формат: оба ракурса на одной картинке (стереопара) или отдельный файл для каждого ракурса.

totalz
Disable LCD from Desktop - Resolution menu. Stay one Plasma.
Try smoothness again.
For test purposes. If it works then you can do some experiments with primary/secondary displays.
Or use standard windows 7 shortcut Win-P to select plasma alone while view video.

I know only three true stutters free video modes:
- madVR exclusive fullscreen mode
- EVR custom presenter D3D fullscreen mode
- Overlay mixer wink

totalz
Your spec is good enough to smooth video play. Just you need to tune it.

How many displays connected to your PC?

3,467

(5 replies, posted in Using SVP)

totalz
Any you want.
SVP does motion interpolation.
madVR's smooth motion does frame blending.

I don't use madVR's smooth motion because I not need in frame blending. I use SVP + ReClock. This combination gives me framerate synchronized to refreshrate of my monitor. With perfect sharpness.

smart
MSU Stereo to Multiview... MSU_FRC... в чем разница?
Первый продукт публично недоступен, второй - доступен. По описанию MSU Stereo to Multiview карты глубины не используются, другие технические детали не раскрыты. Можно предположить, что это близкие по существу продукты. В любом случае нам доступен только MSU_FRC 2007-го года.

Утверждают что их алгоритм наиболее качествененн
Где они это утверждают? не нашел.

SVP можно сравнивать с их результатами?
Если разговор про MSU_FRC - то можно, уже сравнивалось ранее. Библиотека MSU_FRC перестала развиваться и безнадежно отстала от библиотеки MVTools, которая переросла в набор библиотек SVPFlow и развивается до сих пор в рамках проекта SVP.

Как с помощью SVP создать из двух кадров стереопары, некоторое количество промежуточных кадров, по возможности наилучшего качества?
Написать avs-скрипт с использованием SVPFlow и сохранить результат отдельными картинками, например, при помощи AvsP.

Пример скрипта:

ImageSource("01.png",end=0)
left=Crop(0, 0, -0, -540)
right=Crop(0, 540, -0, -0)
left+right
BicubicResize(960,540).Crop(1,1,-1,-1)ConvertToYV12
super=SVSuper("{gpu:1}")
vectors=SVAnalyse(super, "{}")
SVSmoothFps(super, vectors, "{rate:{num:10}}", url="www.svp-team.com")

Пример результата:

http://www.svp-team.com/forum/misc.php?item=2477

Использовался 6-й скриншот из этой раздачи Аватара (Вертикальная анаморфная стереопара)

gilbertroyalva

Error: File can't be deleted
C:\Users\GilbertRoyAlva\AppData\Roaming\SVP 3.1\Logs\WSFError.txt

This error can be if you have "aggressive" antivirus software installed on your system. It blocks this file. Try to add folder C:\Users\GilbertRoyAlva\AppData\Roaming\SVP 3.1\Logs\ to exception list of your AV software.

Kanade
1. via SVP only:

http://www.svp-team.com/forum/misc.php?item=2474

2. Intepolating via SVP & blending via madVR:
- in SVP select frame doubling: Double click on icon ehan playing - Target frame rate: Double source frame rate - OK;
- in madVR enable smooth motion: rendering - smooth motion - enable - OK

is there anything else I can try to remove the dragonfly artifacts completely?
You can try to change any settings. All main settings I told you before. You can reduce visibility of artifacts but it is impossible to remove this kind of artifatcs completely.

DAAO
Что за сторонняя прога?

himspb
Поздравляю. Было обычное несовпадение частот, которое давало накапливающуюся регулярную ошибку, приводившую к повтору кадра каждые 15 сек.

Размер экрана и частота обновления: 1920x1080 pixels, 60.005 Hz
Результирующая частота видеокадров: 59.94 fps
Повтор 1 кадра каждые 15 сек (без ReClock)

ReClock дотягивает частоту кадров до точного совпадения с частотой обновления экрана, тем самым исключая эту регулярную ошибку.

himspb
Такое вполне может быть, если не используется ReClock.
Что пишет madVR в статистике по Crl-J?
Интересует точная частота экрана и строчка про регулярный пропуск или повторение кадра. Можно скриншотом.
Эта же информация есть в SVP - показать - дополнительную информацию.

Добавлю объективности к выше сказанному.
Написал небольшой скрипт определения количества дублей в файле. Посчитал для имеющихся трех файлов.

Итак, Цифры, характеризующие качество работы вышеприведенных скриптов:
В исходном файле BF4_720p60.mp4 1142 одиночных выпавших кадра и 56 двойных.
В файле BF4_720p60_DropsFixed.mkv 318 одиночных выпавших кадра и 84 двойных.
В файле BF4_720p60_DropsFixed_v2.mkv 189 одиночных выпавших кадра и 96 двойных.

Видно, что число одиночных выпавших кадров во второй версии сокращено еще почти вдвое. Причину, по которой растет число двойных выпавших кадров я пока не знаю, но найду. А вот что самое главное, раз я теперь умею считать эти кадры, то смогу и заменить их, не пропустив ни одного. wink

Исправил несколько ошибок в предыдущем скрипте, переназвал вставляемые кадры по-правильному: как они соотносятся во времени к заменяемому:
fix50 - взять кадр между текущим и следующим по середине (+50%);
-fix50 - взять кадр между текущим и предыдущим по середине (-50%);
-fix33 & fix33 - всегда идут парой друг за другом с той же логикой: (-33% и 33%);

Картинки-диаграммы движения с выпавшим кадром, которые умеет восстанавливать скрипт:

http://www.svp-team.com/forum/misc.php?item=2470
http://www.svp-team.com/forum/misc.php?item=2471
http://www.svp-team.com/forum/misc.php?item=2472

Скрипт GameDropFix_v2

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

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

SetMTMode(3,threads)
DSS2("G:\Downloads\Game_60fps_trailer\BF4_720p60.mp4").ConvertToYV12()
SetMTMode(2)

global super_params_mini="{scale:{up:0},gpu:1}"
global analyse_params_mini="{block:{w:16,h:16}}"

mini=BicubicResize(width/2,height/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(width/32, height/32).PointResize(width/8, height/8).ConvertToYV12().mt_lut(y=2, u=128, v=128)

global super_params="{scale:{up:0},gpu:1}"
global analyse_params="{main:{search:{coarse:{distance:4,bad:{sad:2000}},type:2,distance:4},penalty:{lambda:1,pglobal:10000}},refine:[{thsad:65000}]}"
global smoothfps_params_2_1="{gpuid:21,rate:{num:2,den:1},algo:13,scene:{limits:{blocks:50}}}"
global smoothfps_params_3_1="{gpuid:21,rate:{num:3,den:1},algo:13,scene:{limits:{blocks:50}}}"

super=SVSuper(super_params)
vectors=SVAnalyse(super, analyse_params)
global fix50 = SVSmoothFps(super, vectors, smoothfps_params_2_1, mt=threads, url="www.svp-team.com").SelectOdd()
fix_3_1 = SVSmoothFps(super, vectors, smoothfps_params_3_1, mt=threads, url="www.svp-team.com")
global fix33 = fix_3_1.SelectEvery(3,1).Subtitle("fix33", align=3, size=12)
global fix66 = fix_3_1.SelectEvery(3,2).Subtitle("-fix33", align=3, size=12)

global min_move=0.02
global move_idx=10
global debug=0
global spc=" "
global fmt="% 1.2f"
global star="*"
global fix50t="fix50"
global fix50nt="-fix50"
last.ScriptClip("
    luma_lft=HorizontalSpeed_luma.crop(0,0,width/32,0)
    luma_rgh=HorizontalSpeed_luma.crop(width/32+width/16,0,0,0)
    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_lft_next2=128-luma_lft.trim(2,0).AverageLuma
    AvgLuma_rgh_next2=128-luma_rgh.trim(2,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))
    A_prev= (Max_rgh>Max_lft) ? AvgLuma_rgh_prev : AvgLuma_lft_prev
    A_cur= (Max_rgh>Max_lft) ? AvgLuma_rgh : AvgLuma_lft
    A_next= (Max_rgh>Max_lft) ? AvgLuma_rgh_next : AvgLuma_lft_next
    drop_lft= (AvgLuma_lft_prev*AvgLuma_lft_next>0 && abs(AvgLuma_lft*move_idx)<Max_lft && abs(AvgLuma_lft_prev)>min_move && abs(AvgLuma_lft_next)>min_move && abs(AvgLuma_lft)<=min_move) ? 1 : 0
    drop_rgh= (AvgLuma_rgh_prev*AvgLuma_rgh_next>0 && abs(AvgLuma_rgh*move_idx)<Max_rgh && abs(AvgLuma_rgh_prev)>min_move && abs(AvgLuma_rgh_next)>min_move && abs(AvgLuma_rgh)<=min_move) ? 1 : 0
    drop = drop_lft*drop_rgh
    drop = (drop==0 && A_cur==0 && abs(A_prev)>min_move && abs(A_next)>min_move) ? 1 : drop
    
    Max_lft2=max(abs(AvgLuma_lft),abs(AvgLuma_lft_next),abs(AvgLuma_lft_next2))
    Max_rgh2=max(abs(AvgLuma_rgh),abs(AvgLuma_rgh_next),abs(AvgLuma_rgh_next2))
    A_prev2= (Max_rgh2>Max_lft2) ? AvgLuma_rgh : AvgLuma_lft
    A_cur2= (Max_rgh2>Max_lft2) ? AvgLuma_rgh_next : AvgLuma_lft_next
    A_next2= (Max_rgh2>Max_lft2) ? AvgLuma_rgh_next2 : AvgLuma_lft_next2
    drop_lft2= (AvgLuma_lft*AvgLuma_lft_next2>0 && abs(AvgLuma_lft_next*move_idx)<Max_lft2 && abs(AvgLuma_lft)>min_move && abs(AvgLuma_lft_next2)>min_move && abs(AvgLuma_lft_next)<=min_move) ? 1 : 0
    drop_rgh2= (AvgLuma_rgh*AvgLuma_rgh_next2>0 && abs(AvgLuma_rgh_next*move_idx)<Max_rgh2 && abs(AvgLuma_rgh)>min_move && abs(AvgLuma_rgh_next2)>min_move && abs(AvgLuma_rgh_next)<=min_move) ? 1 : 0
    drop2 = drop_lft2*drop_rgh2
    drop2 = (drop2==0 && A_cur2==0 && abs(A_prev2)>min_move && abs(A_next2)>min_move) ? 1 : drop2

    drop2==1 \
    ? abs(A_prev2)/1.3>abs(A_next2) \
      ?  (fix50.trim(1,1)+fix50).Subtitle(fix50nt, align=3, size=12) \
      : (abs(A_prev2)/1.3<=abs(A_next2) && abs(A_prev2)>=abs(A_next2)/1.3) \
        ? fix66.trim(1,1)+fix66 \
        : last \
    : last
    
    drop==1 \
    ? abs(A_prev)<abs(A_next)/1.3 \
      ?  fix50.Subtitle(fix50t, align=3, size=12) \
      : abs(A_prev)/1.3<=abs(A_next) \
        ? fix33 \
        : last \
    : last

    debug==1 ? Subtitle(x=10,y=10,string(AvgLuma_lft_prev,fmt)+spc+string(AvgLuma_rgh_prev,fmt)) : last
    debug==1 ? Subtitle(x=10,y=30,string(AvgLuma_lft,fmt)+spc+string(AvgLuma_rgh,fmt),text_color=$FF8888) : last
    debug==1 ? Subtitle(x=10,y=50,string(AvgLuma_lft_next,fmt)+spc+string(AvgLuma_rgh_next,fmt)) : last
    debug==1 ? Subtitle(x=10,y=70,string(AvgLuma_lft_next2,fmt)+spc+string(AvgLuma_rgh_next2,fmt)) : last
    debug==1 ? Max_rgh>Max_lft ? Subtitle(x=70,y=90,star) : Subtitle(x=20,y=90,star) : last
    debug==1 ? Subtitle(x=10,y=110,string(drop_lft)+spc+string(drop_rgh)+spc+string(drop)) : last
    (debug==1 && drop==1 && abs(A_prev)/1.3>abs(A_next)) ? Subtitle(x=10,y=130, star+star+star+star+star+star) : last
")

trim(0,framecount-10)
Distributor()

Результат работы скрипта стал лучше:
BF4_720p60_DropsFixed_v2.mkv (1,22 ГБ)