Ru-Board.club
← Вернуться в раздел «Программы»

» AviSynth

Автор: unreal666
Дата сообщения: 22.11.2011 11:40

Цитата:
Т.е. для нас разницы между RGB24/RGB32 нет?

Нет. Она будет только если юзать фильтры, связанные с альфа-каналом. Ну и при использовании фильтров VD в ависинте тоже нужен именно RGB32.

Цитата:
И еще, значит можно просто через точку два плагина (trim и для лого), это всегда так можно? не знал..., т.е. фактически в одну строку!

Так это же в доке в основах по ависинту написано. Вот, кстати, моя версия доки, сделанная по текущему англ. прототипу (а не старому варианту) + синхронизированная англ. версия (с соответствующими исправлениями и для русской) с официальным wiki.
Я эту доку и дальше буду модифицировать по примеру офф. вики, т.к. там понавороченней. Но для этого мне надо сначала перевести непереведенные части русской доки + перевести несколько нужных мне плагинов (один из них - это плагин для определения производительности других плагинов скриптов).
Автор: dmkov9
Дата сообщения: 22.11.2011 12:34
unreal666
спасибо большое, а как тогда все таки узнать какой цеветовой формат RGB24 или RGB32? (Для общего развития, Media info не показывает)
Автор: unreal666
Дата сообщения: 22.11.2011 12:48
dmkov9
RGB в сжатых форматах я вообще не встречал (может встречается только в кодеках для захвата видео с экрана). Там обычно или YV12 (XviD/DivX/MPEG-2/AVC и до фига еще) или YUY2.
YV12 в MediaInfo отображается так:

Код: Цветовое пространство : YUV
Подвыборка цветности : 4:2:0
Автор: Const2k
Дата сообщения: 22.11.2011 18:45
Уточню пару моментов.

Цитата:
Во всех этих плагинах встречается перед началом строчка с изменением цветности. Поясни когда это может быть надо.

Цветовых семейств, вообще, не менее 5 (наиболее используемые: CIE, RGB, YUV, HSL/HSV, CMYK), но AviSynth 2.5.x может работать только с двумя: RGB и YUV. Некоторые плагины работают только в определенном цветовом пространстве, и для их использования иногда приходится конвертировать RGB <-> YUV. Например, альфа-канал (прозрачность, маски) поддерживает только RGB32.
Нужно стараться работать только в цветовых пространствах внутри того же семейства, что и в исходном материале, потому что конверсия между RGB и YUV приводит к неисправимым искажениям цветов. Это едва заметно, но при нескольких таких конверсиях цвета "уплывают" сильнее.
Кроме того, RGB32 обрабатывается быстрее RGB24 из-за меньших "накладных расходов".
Работа в YUV требует четных высоты и ширины кадра, т.к. яркость Y у каждого пиксела своя, а цветность UV общая у квадрата 2х2 пиксел. http://avisynth.org/mediawiki/FAQ_YV12
Скорость обработки: (быстрее) YV12 > YUY2 > RGB32 > RGB24 (медленнее)
Некоторые кодировщики требуют определенного цветового пространства; например, TMPGEnc поддерживает только RGB24.


Цитата:
чем лучше вводить фильм для разных форматов (например Xvid, MPEG2, DV, несжатый)?

AviSource() для Xvid/DivX в *.avi;
MPEG2Source() отсюда для *.mpg/*.m2v/*.d2v/*.vob и прочего MPEG1 и MPEG2 "как есть" либо после индексирования;
FFmpegSource() для всего остального;
DSS2() (avss.dll из Haali Media Splitter) для обработки VFR-источников (с переменной частотой кадров) - он выводит кадры с постоянной частотой кадров (делает CFR из VFR), т.е. так, как их показывает видеоплеер;
DirectShowSource() в самом крайнем случае т.к. он без покадровой точности.


Цитата:
Если применять плагин для куска видео, то нужно сначала вырезать этот кусок видео, а потом дальше по коду склеивать?

Если фильтров мало, то так, как unreal666 сказал. Если много, проще порезать видео на куски, обработать каждый отдельно и склеить в конце:

src = FFmpegSource("test.mkv")
N = 100 # можно и явно указать в нарезке ниже
M = 200
part1 = src.Trim(0, N)
# Цепочка фильтров 1
part2 = src.Trim(N+1, M)
# Цепочка фильтров 2
part3 = src.Trim(M+1, 0)
# Цепочка фильтров 3
return part1+part2+part3
# Строки скрипта, идущие после первого return, не обрабатываются


Цитата:
а как тогда все таки узнать какой цеветовой формат RGB24 или RGB32?

Добавить Info() в конце скрипта или открыть видео в AvsP и посмотреть на строку состояния в низу окна.
Автор: unreal666
Дата сообщения: 22.11.2011 21:14
Const2k

Цитата:
Цветовых семейств, вообще, не менее 5 (наиболее используемые: CIE, RGB, YUV, HSL/HSV, CMYK),

что-то в видео я не встречал остальные 3 семейства. Только почему всего 5, есть еще Lab.

Цитата:
Нужно стараться работать только в цветовых пространствах внутри того же семейства, что и в исходном материале, потому что конверсия между RGB и YUV приводит к неисправимым искажениям цветов.

Эти потери в основном происходят при интерлейсе. И то только на однородных участках. При обычном видео искажений не будет видно. Для теста пробовал прогонять 1000 раз туда обратно: на фигне типа "У нас проблемы с каналом" (таблица на телике) искажения возникают уже при > 10 конвертаций, а на обычном видео даже при 1000 разницы не заметил.

Цитата:
Кроме того, RGB32 обрабатывается быстрее RGB24 из-за меньших "накладных расходов".

Вот это праавильно. Компы то минимум 32 битные.

Цитата:
Работа в YUV требует четных высоты и ширины кадра, т.к. яркость Y у каждого пиксела своя, а цветность UV общая у квадрата 2х2 пиксел. http://avisynth.org/mediawiki/FAQ_YV12

Не совсем верно. Даже в ависинте (то ли 2.58, то ли 2.60) есть поддержка (и такой существует) Y=4, а UV=1. Т.е. Y = 4 по горизонтали, а UV =1 по вертикали. Может это даже YUY2 и есть - точно не помню. А залазить/читать сейчас времени нет.

Цитата:
AviSource() для Xvid/DivX в *.avi;
MPEG2Source() отсюда для *.mpg/*.m2v/*.d2v/*.vob и прочего MPEG1 и MPEG2 "как есть" либо после индексирования;
FFmpegSource() для всего остального;
DSS2() (avss.dll из Haali Media Splitter) для обработки VFR-источников (с переменной частотой кадров) - он выводит кадры с постоянной частотой кадров (делает CFR из VFR), т.е. так, как их показывает видеоплеер;

Тогда уж не FFmpegSource, а FFVideoSource. И, судя по доке, для ts у него не покадровая точность. Для ts лучше юзать или dss или DGIndexNV (еслм карточка NVidia) или перемуксовать в mkv и все-таки натравить FFVideoSource. Только для не фильмов лучше все-таки проверять - VFR или CFR.

Цитата:
Если фильтров мало, то так, как unreal666 сказал. Если много, проще порезать видео на куски, обработать каждый отдельно и склеить в конце:

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

Добавлено:
Const2k
А так судя по всему ты довольно плотно знаешь ависинт. А чего тогда всего 10 постов за 4 года?


Добавлено:
ЗЫ.
Если ts + MPEG, то вполне себе работает даже обычный DGIndex.
Автор: dmkov9
Дата сообщения: 23.11.2011 11:07
unreal666
Const2k
Уважаемые гуру!
Еще вопрос возник, если нужно на одно видео на ложить в определенном месте другое видео (меньшее по размеру, где то 1/4) как кадр в кадре. Чем лучше это сделать, чем то вроде Layer, но мне нужно указать четкую позицию по кадре желательно (хотя в принципе можно и четко с определенного края видео.
И еще возник вопрос по de_Logo. Я то не гуру и еще очень много пробелов, выскакивает вот такая ошибка (по описанию маска логотип белая, остальное - черное) все именно так, да и InpaintFunc был доволен, там такие требования)

110: analyse.AnalyzeLogo(logo_mask)
111:
112: # The analysis is complete, save a frame (all frames are the same)
113: Trim( 0, -1 )
114: ImageWriter( logo_name + loc + string(percent) + "AnalyzeResult", 0, 1, "ebmp" )
115: }
Как понять что ему не нравится?

И возвращаясь к цветам, как понять какой цвет нужен конкретному фильтру, если в описании ничего нет? Я так думаю что он сам преобразует, но все же
Автор: unreal666
Дата сообщения: 25.11.2011 04:18
dmkov9

Цитата:
Еще вопрос возник, если нужно на одно видео на ложить в определенном месте другое видео (меньшее по размеру, где то 1/4) как кадр в кадре. Чем лучше это сделать, чем то вроде Layer, но мне нужно указать четкую позицию по кадре желательно (хотя в принципе можно и четко с определенного края видео.

Эм.. В Layer же есть параметры x и у (сдвиг положения overlay_clip).

Цитата:
И возвращаясь к цветам, как понять какой цвет нужен конкретному фильтру, если в описании ничего нет? Я так думаю что он сам преобразует, но все же

Методом тыка. Если цвет. пространство не поддерживается фильтром, то просто вылезет ошибка.
По части RGB32 я говорил применительно только для фильтра ExInpaint, т.к. в нем надо указывать цвет используемой маски, а в не RGB его непонятно как указывать, т.к. по умолчанию в YUV используется суженный диапазон.

Добавлено:

Цитата:
И еще возник вопрос по de_Logo.

rm_logo.

Цитата:
Я то не гуру и еще очень много пробелов, выскакивает вот такая ошибка (по описанию маска логотип белая, остальное - черное) все именно так, да и InpaintFunc был доволен, там такие требования)

что за InpaintFunc ?
код своего скрипта показать можешь?
Автор: dmkov9
Дата сообщения: 25.11.2011 11:09
unreal666
Я вчера попробовал overlay все нормально вроде (поздно было).
Про цвета понятно, просто ждать ошибки.
InpaintFunc это то же фильтр для удаления лого похожий (уж оо-очень долго работает, вот и захотел попробовать этот)
rm_logo да-да...

Скрипт:
LOADCPLUGIN("c:\Program Files (x86)\AviSynth 2.5\plugins\AVSInpaint.dll")
Import("c:\Program Files (x86)\AviSynth 2.5\AVS\Rm_logo.avs")
avisource("e:\1.avi",false)
rm_logo(last,logomask="d:\1.bmp", loc="bl", mode="inpaint", percent=20, pp=1)

На всякий случай вот маска http://s017.radikal.ru/i405/1111/82/e8b09ae29685.bmp
Автор: unreal666
Дата сообщения: 03.12.2011 02:56
dmkov9
ну и как... разобрался?
Автор: dmkov9
Дата сообщения: 03.12.2011 08:30
Да нет с ним не разобрался, перепробовал все, маску не хочет брать что то, юзаю AVSInpaint, но очень долго работает (0,1кадра\с). Но мне удалять по длительности немного надо, так что бог с ним.
Автор: unreal666
Дата сообщения: 04.12.2011 07:54
у него там скорее всего чего-то не то с цветовыми пространствами в фильтре.
Попробовал фильтр-функцию InpaintFunc - ничего так. Она тоже как раз юзает плагин AVSInpaint и по коду очень похожа на RM_logo.

Цитата:
юзаю AVSInpaint

может все-таки InpaintFunc? AVSInpaint - это плагин (dll'ка) с 4-мя функциями.
InpaintFunc при reset=False создает дополнительную 32-битную маску, которая создается на этапе компиляции скрипта и скорость ее создания зависит от параметра speed. Я поставил speed=100 и время создания маски = примерно времени самого видео. После создания маски уже с нормальной скоростью обрабатывает и качество довольно нормальное.

ЗЫ.
Позже, на днях посмотрю, чего там намудрили в RM_logo, т.к. она по качеству по идее должна быть немного лучше.
Автор: dmkov9
Дата сообщения: 05.12.2011 16:28
Ну да-да я имел ввиду InpaintFunc конечно же! На работе пишу, так немного запутался... Скорость особо не экспериментировал, попробую сегодня...
Ну качество в принципе нормальное...
Автор: dmkov9
Дата сообщения: 06.12.2011 12:24

Цитата:
speed=100

Попробовал. Скорость там же регулируется от 1 до 20. А ты написал 100...
Поигрался, изменений в скорости не заметил (правда кусок секунд 10), может на длинном куске и будет заметна. Но эти 10 секунд делает где то 4 минуты...

И еще вопрос, поджскажешь какой нить фильтр для удаления шумов после оцифровки. Поигрался с встроенными, только хуже...? http://s017.radikal.ru/i416/1112/fa/6aa120ca2ad3.jpg
Автор: unreal666
Дата сообщения: 06.12.2011 13:46

Цитата:
попробовал. Скорость там же регулируется от 1 до 20. А ты написал 100...

Забыл... Я же немного изменил код, чтобы можно было ставить от 1 до 100. 1 = 1%.

Цитата:
Поигрался, изменений в скорости не заметил (правда кусок секунд 10), может на длинном куске и будет заметна. Но эти 10 секунд делает где то 4 минуты...

Чего-то долго у тебя делает. У меня 40 минут видео делалось примерно 45 минут. И качество у меня при этом на этом тестовом видео немного лучше, чем при 25% (или сколько там по умолчанию было), т.к. были участки, где лого просто не было, из-за этого альфа-маска при 100% немного темнее делается.

Цитата:
поджскажешь какой нить фильтр для удаления шумов после оцифровки

А фиг его знает. Такое видео не пытался очищать. Вообще в основном для очистки пользуюсь тяжелыми скриптами MCTemporalDenoise и MC_Spuds. Только какой-то из них по нормальному надо перевести на 2-ю версию mvtools. По части этого спроси лучше на рутрекере в теме Обработка и пересжатие видео [обсуждение].
На оффсайте ависинта есть нехилый список разных плагинов/фильтров-скриптов.


ЗЫ.
Уже почти домодифицировал скрипт Rm_Logo. По текущим результатам получше получается. Только с размытием доразберусь.
Автор: maniac007
Дата сообщения: 06.12.2011 23:41
Изучаю Adobe Premiere Elements v.9. Установил плагин PremiereAVSPlugin-v1.95 с целью обработки в Adobe файлов после AviSynth (чтобы можно было их открывать).

Цель простая - убрать шумы из видео-файла (фотоаппарат).
Создаю Avs файл следующего содержания:

AVISource("MVI_2797.AVI")
TemporalSoften(14, 14, 18, scenechange=15, mode=2)

И открываю его в Elements. Изображение - ок, звук - ШУМ.
Отключаю 2 строку - не помогает.

Звук при желании можно разобрать, но это сложно.
Или можно в Elements убрать шумы без AVS ?
Автор: unreal666
Дата сообщения: 07.12.2011 04:05
А при открытии этого avs в обычных плеерах/VD звук тоже шум?
Автор: dmkov9
Дата сообщения: 07.12.2011 07:58
unreal666
Спасибо, жду результатов!
Автор: maniac007
Дата сообщения: 07.12.2011 14:33
unreal666
Нет, только в Elements. Могу открыть только в VirtualDub
Автор: unreal666
Дата сообщения: 07.12.2011 18:33
Если в VD и плеерах играет нормально, значит чего-то с настройками звука в самом Elements.
Автор: unreal666
Дата сообщения: 14.12.2011 07:11
Переделал фильтр RM_Logo:
[more=код]
Код: #____________________________________________________________________________________
#
# ######. ##
# .## ### ##
# .## ### .##########. ## .#####. .#####.# .#####.
# .####### ## ## ## ## ## ## ## ## ## ##
# .###### ## ## ## ## ## ## ## ## ## ##
# .## ### ## ## ## ## ## ## ## ## ## ##
# .## ### ## ## ## ##..... ## ## ##.....## ## ##
# .## ### ## ## ## ###### ######## '#####' '#### ## '#####'
# ##
# .######
#____________________________________________________________________________________

# rm_logo() версия 0.5.1 -- 14.12.2011
# Модифицировано unreal666 на основе версии 0.5 и скрипта InpaintFunc
#
# Скрипт, помогающий удалять логотипы каналов или другие мешающие объекты

#____________________________________________________________________________________

# Требуемые фильтры:
# AVSInpaint: Ver 2008-01-06
# Discussion & Code : http://forum.doom9.org/showthread.php?t=133682
# ExInpaint: Ver 0.1+
# Code http://avisynth.org.ru/exinpaint/exinpaint.html
# mt_masktools: Ver 2.0.32+
# Code http://manao4.free.fr/masktools-v2.0a48.zip
# removegrain:
# Code http://www.removegrain.de.tf/
# fft3dgpu: Ver 0.8.2
# Discussion & Code http://forum.doom9.org/showthread.php?t=89941
# medianblur Ver 0.8.4
# Code http://www.avisynth.org/tsp/medianblur084.zip

#______________________________________________________________________________________
#
# Как делать :
#______________________________________________________________________________________

# 1) Получите видео с логотипом, который вы хотите удалить.
# Подготовьте видео для анализа. Очень важно, чтобы логотип присутствовал в каждом анализируемом кадре.
# Удостоверьтесь, что логотип присутствует с начала до конца. Часто он появляется только после нескольких секунд
# или минут с начала видео. Иногда логотип исчезает из-за рекламных вставок.
# Для получения после анализа оптимальных результатов вы должны вырезать куски без логотипа. Для экономии времени
# вы можете также исключить титры, т.к. они не улучшат результаты анализа. Черный фон не очень полезен для получения
# любой альфа-информации.

# 2) Сохраните кадр из вышеупомянутого видео и отредактируйте его в граф. программе, закрасив логотип чисто белым цветом,
# а остальное - черным. Сохраните его в logo.bmp (с любым желаемым именем). Для облегчения закраски можете выбрать кадр
# из титров или где у логотипа темный фон.

# 3) Создайте avs-скрипт типа: rm_logo(last,logomask="logo.bmp",loc="br",par=(4.0/3.0)*(576.0/720.0),mode="inpaint",percent=20,PPMode=1)

# 4) После окончания анализа можете вставить вырезанные куски обратно в видео и добавить деблокинг, удаление шумов и т.п. после
# вызова rm_logo

# Примечание: При первом выполнении скрипта приложение как-будто бы зависнет. В данный момент будут вычисляться маска цветов и альфа-маска.
# В зависимости от размера части изображения с логотипом, установленного параметром loc, и указанных процентов это может занять некоторое время.
# До 2 часов или больше для 1080p на Intel Core 2 Duo!

#______________________________________________________________________________________
#
# Параметры функции :
#______________________________________________________________________________________

# string "logomask" : Расположение файла-логотипа. Маска логотипа должна быть чисто белого цвета, а фона - черного.
# Изображение должно быть или 24- или 32-битным. Поддерживаемые форматы изображений см. в описании фильтра ImageSource.

# String "loc" : Выбор части изображения, где находится удаляемый логотип.
# См. таблицу :
#
# ______________ ______________
# | TL | TC |TR | | X1 | X2 |X3 |
# |____|____|___| |____|____|___|
# | ML | MC |MR | or | Y1 | Y2 |Y3 |
# |____|____|___| |____|____|___|
# | BL | BC |BR | | Z1 | Z2 |Z3 |
# |____|____|___| |____|____|___|
#
# Если удаляемый логотип находится в правом верхнем углу, вы можете выбрать
# или loc="TR" или loc="x3".
#
# Если вы не хотите использовать один из этих пресетов, то для изоляции логотипа вы можете вручную ввести значения кропа (обрезки).
# пример : loc = "0,300,-440,-20". В параметре "loc" не разрешены пробелы.
# Для помощи установки значений обрезки вы можете использовать функцию InpaintAssist.
#
# float "par" : Pixel Aspect Ratio (соотношение размеров пикселей) вашего видео.
# Например, для видео 16:9 DVD с разрешением 720x576, будет использоваться PixelAspect=(16.0/9.0)*(576.0/720.0)?1.422.
# Т.е. PAR = DAR/SAR (DAR - Display Aspect Ratio, SAR - Sample Aspect Ratio).
# Результат ф-и DistanceFunction изменяется (искажается) в соответствии с этим значением.
# По умолчанию: 1.0
#
# string "mode" : 3 выбора:
# - Deblend : Если логотип прозрачный, используйте этот режим.
# - Inpaint : Если логотип непрозрачный, используйте этот режим.
# - Both : Если логотип и прозрачный и непрозрачный, используйте этот режим.
# По умолчанию: inpaint
#
# int "Exmode" : 3 выбора:
# - 0 : Никакого влияния
# - 1 : В этом режиме после восстановления пикселей в режиме mode дополнительно применяется функция ExInpaint.
# - 2 : В этом режиме для восстановления пикселей применяется только функция ExInpaint. В таком режиме значение параметра mode влиять
# ни на что не будет, т.е. типа 4-й режим для параметра mode.
# По умолчанию: 0
#
# float "percent" : Процент анализа клипа для создания маски цвета и альфа-маски. Больше лучше, но медленней.
# По умолчанию: 25
#
# int "deblendfalloff" : Коэффициент при создании градиентного поля из маски логотипа. Чем больше этот коэффициент, тем больший размер
# градиентного поля вокруг точек логотипа и, соответственно, тем сильнее наложение восстановленной части на оригинал.
# При положит. значениях градиент создается для области точек со значениями более 127. Каждому пикселю вне этой
# области с расстоянием d от этой области будет присвоено значение 255*(1-d/deblendfalloff). При отрицат.
# значениях цвет инвертируется до и после расчета.
# При значениях больше 255 и меньше -255 (255 < deblendfalloff < -255) изображение просто делается 2-ух цветным
# (1-битным). Примерно то же, что и Levels(127,1,128,0,255).
# По умолчанию: 5
#
# int "AlphaToRepair" : Значение яркости сплошной (т.е. непрозрачной) части логотипа в альфа-канале после анализа. Все, что ниже этого значения,
# восстанавливаться/подрисовываться не будет. Используется и при основном восстановлении и при постобработке.
# Включайте режим отладки и смотрите, чтобы в Logo Inpaont попало то, что нужно.
# По умолчанию: 55.
#
# float "RepairRadiusPre" : Используется для расширения маски сплошной (т.е. непрозрачной) части логотипа при создании маски LogoInpaint.
# По умолчанию: 1.0.
#
# float "RepairRadiusPost" : Используется для расширения маски сплошной (т.е. непрозрачной) части логотипа при создании маски PostMask.
# По умолчанию: 1.0.
#
# float "InpaintRadius" : Радиус вокруг "поврежденного" пикселя, указывающий область взятия значений при подрисовывании/восстановлении данного пикселя.
# Большие значения предотвращают подрисовывание в неправильном направлении, но также и создают больше размытости.
# По умолчанию: 8.0.
#
# float "InpaintSharpness" : Более высокие значения могут предотвратить размывание, вызванное высокими значениями InpaintRadius.
# По умолчанию: 50.0.
#
# float "InpaintPreBlur" : Стандартное отклонение размытости, которое применяется к изображению перед вычислением структурного тензора. Более высокие
# значения помогают соединению изофот (кривых равной освещённости), которые были вырезаны областью подрисовки, но также и
# увеличивают нагрузку на процессор. PreBlur=0.0 отключает предварительное размывание.
# По умолчанию: 8.0.
#
# float "InpaintPostBlur" : Стандартное отклонение размытости, которое применяется к структурным тензорам перед их использованием для определения
# направления подрисовки. Более высокие значения помогают собрать больше информации о направлении, когда доступно только
# немного валидных пикселей, но при этом также увеличивается нагрузка на процессор.
# По умолчанию: 5.0.
#
# bool "lmask" : Применить постобработку через маску восстановления (LogoInpaint). По умолчанию в коде строка, использующая данный параметр,
# вообще закомментирована. Поэтому убрал ее и из списка параметров функции.
#
# int "PPMode" : Режим постобработки, применяемый для уменьшения повреждений, оставшихся после удаления логотипа.
# Значения от 0 до 3. 0 - отключено.
# По умолчанию: 2.
#
# bool "debug" : Включает режим отладки для помощи настройки параметров функции.

#______________________________________________________________________________________

# ФУНКЦИЯ :
#______________________________________________________________________________________

function rm_logo( clip clp, string "logomask", string "loc", float "PAR", string "mode", int "Exmode", float "percent",int "deblendfalloff",\
int "AlphaToRepair", float "RepairRadiusPre", float "RepairRadiusPost", float "InpaintRadius", float "InpaintSharpness",\
float "InpaintPreBlur", float "InpaintPostBlur", int "PPMode", bool "debug" ) {

x = width (clp)
y = height (clp)

logomask = default( logomask, "" )
loc = default( loc, "" )
PAR = default( par, 1.0 )
mode = default( mode, "inpaint" )
ExMode = default( Exmode, 0 )
percent = default( percent, 25.0 )
deblendfalloff = default( deblendfalloff, 5 )
AlphaToRepair = default( AlphaToRepair, 55 )
RepairRadiusPre = default( RepairRadiusPre, 1.0 )
RepairRadiusPost = default( RepairRadiusPost, 1.0 )
InpaintRadius = default( InpaintRadius, 8.0 )
InpaintSharpness = default( InpaintSharpness, 50.0 )
InpaintPreBlur = default( InpaintPreBlur, 8.0 )
InpaintPostBlur = default( InpaintPostBlur, 5.0 )
#~ lmask = default( lmask, false )
PPMode = default( PPMode, 2 )
debug = default( debug, false )

RGB = isRGB( clp )
RGB32 = isRGB32( clp )
RGB24 = isRGB24( clp )
YUY2 = isYUY2(clp)
cropval = (StrLen(loc) != 2 ) ? true : false
bugloc = (loc == "" ) ? true : false
par = ( par!= 1.0 ) ? float( clp_height ) / float( clp_width ) * par : 1.0
percent = ( percent <= 0.0) ? 25.0 : (percent > 100) ? 100.0 : percent

# Проверка входных параметров на валидность
assert ( findstr(loc," ") == 0 , """Space character is not allowed in string "loc".""")
assert ( logomask != "" , """You have to define a logomask (string "mymask")""")
assert ( bugloc == false , """You must define "Loc".""")
assert ( mode == "both" || mode == "inpaint" || mode == "deblend", "Specified mode doesn't exist.")
assert ( ExMode == 0 || ExMode == 1 || ExMode == 2, "Specified ExMode mode doesn't exist.")

# Определяем координаты обрезки
loc = UCase( loc )
null = (cropval == false ) ? eval("""

a = (Rightstr(loc,1) == "L" || Rightstr(loc,1) == "1") ? 0 : (Rightstr(loc,1) == "C" || Rightstr(loc,1) == "2") ? round((x*1/6))*2 : round((x*1/3))*2
b = (leftstr(loc,1) == "T" || leftstr(loc,1) == "X") ? 0 : (leftstr(loc,1) == "M" || leftstr(loc,1) == "Y") ? round((y*1/6))*2 : round((y*1/3))*2
c = (Rightstr(loc,1) == "R" || Rightstr(loc,1) == "3") ? 0 : (Rightstr(loc,1) == "C" || Rightstr(loc,1) == "2") ? -round((x*1/6))*2 : -round((x*1/3))*2
d = (leftstr(loc,1) == "B" || leftstr(loc,1) == "Z") ? 0 : (leftstr(loc,1) == "M" || leftstr(loc,1) == "Y") ? -round((y*1/6))*2 : -round((y*1/3))*2

""") : eval("""

long = StrLen(loc)

posvirg1 = findstr(loc, ",")
posvirg2 = findstr(rightstr(loc,long-posvirg1), ",")
posvirg2 = posvirg2+posvirg1
posvirg3 = findstr(rightstr(loc,long-posvirg2), ",")
posvirg3 = posvirg3 + posvirg2

a = int(value(leftstr(loc,posvirg1-1)))
b = int(value(leftstr(rightstr(loc,long-posvirg1),posvirg2-posvirg1-1)))
c = int(value(leftstr(rightstr(loc,long-posvirg2),posvirg3-posvirg2-1)))
d = int(value(rightstr(loc,long-posvirg3)))
""")


cropped = clp.crop(a,b,c,d)
input = RGB24 ? cropped : cropped.converttoRGB24()
analyse = percent != 100 ? cropped.SelectRangeEvery( round(100.0/percent), 1 ) : cropped # Анализируем весь клип или процент он него?
# Очищаем (сглаживаем) анализируемый клип для улучшения результатов
#~ analyse = (IsYV12(analyse)) ? analyse : analyse.ConvertToYV12
#~ analyse = analyse.TTempSmoothF(maxr=2,lthresh=256,cthresh=256,scthresh=255).converttoRGB24() # Во многих случаях подглючивает, поэтому отключил

# Читаем файл нашей маски, обрезаем ее и подготавливаем
logo_mask = imagesource(logomask,0,0).crop(a,b,c,d)
logo_mask = logo_mask.ConvertToYV12()
logo_mask = logo_mask.DistanceFunction(255/deblendfalloff, par).Greyscale()
# Создаем Deblend маску, которая используется при смешивании "восстановленного" участка с оригиналом
DeblendMask = logo_mask.DistanceFunction( 255.0 / DeblendFalloff, PixelAspect=par )

# Отделение каталога и имени логотипа для сохранения уникального ebmp-файла
ID = logomask.revstr().findstr("\") - 1
ID = ID <= 0 ? logomask : rightstr(logomask, ID) # имя и расширение
ID = LeftStr(ID, StrLen(ID) - ID.revstr().findstr(".")) # только имя
ID = ID + + "_" + loc + "_" + string(percent) + "_"

# Здесь мы производим анализ, необходимый для последующего создания карты цветов и карты альфа-канала
Logo = eval("""try {
# Анализ является медленным, поэтому мы делаем его только один раз с проверкой, существует ли он
imagesource(ID + "%06d.ebmp",0,0)
} catch( dummy ) {
# здесь мы выполняем анализ логотипа, т.к. он еще не существует
analyse.AnalyzeLogo(logo_mask).trim(0,-1)
imagewriter(ID,0,1,"ebmp")
}""")

# Карта цветов является верхней половиной результата анализа, альфа-канал - нижней половиной
Logo = Logo.AssumeFPS(analyse.FrameRate)
LogoColor = Logo.Crop(0,0,0,Logo.Height/2)
LogoAlpha = Logo.Crop(0,Logo.Height/2,0,0).ConvertToYV12()
LogoInpaint = LogoAlpha.Invert.mt_lut(expr="x " + string(255-AlphaToRepair) + " < 255 0 ?").mt_expand.mt_inflate().Greyscale()
LogoInpaint = RepairRadiusPre > 0.1 ? LogoInpaint.DistanceFunction( 84.0 / RepairRadiusPre, PixelAspect=par ) : LogoInpaint

# InpaintLogo и DeblendLogo, основанные на пользоват. параметрах
repaired = (mode == "both") ? input.DeblendLogo(LogoColor,LogoAlpha).InpaintLogo(LogoInpaint, Radius=InpaintRadius, Sharpness=InpaintSharpness, \
PreBlur=InpaintPreBlur, PostBlur=InpaintPostBlur, PixelAspect=par) \
: (mode == "inpaint") ? input.InpaintLogo(LogoInpaint, Radius=InpaintRadius, Sharpness=InpaintSharpness, PreBlur=InpaintPreBlur, PostBlur=InpaintPostBlur, PixelAspect=par) \
: input.DeblendLogo(logoColor,logoAlpha)
repaired = (Exmode == 1) ? repaired.converttorgb32.ExInpaint(LogoInpaint.converttorgb32, color=$ffffff, xsize=8, ysize=8, radius=0) \
: (EXmode == 2) ? input.converttorgb32.ExInpaint(LogoInpaint.converttorgb32, color=$ffffff, xsize=8, ysize=8, radius=0) \
: repaired


repout = Layer(input.ConvertToRGB32, repaired.ConvertToRGB32.Mask(DeblendMask.ConvertToRGB32()))

PostMask = LogoAlpha.Invert.mt_lut(expr="x " + string(255-AlphaToRepair) + " < 255 0 ?").mt_expand.mt_inflate().Greyscale()
PostMask = PostMask.DistanceFunction( 64.0 / RepairRadiusPost, par )
#~ PostMask = (PPMode > 0 && lmask) ? LogoInpaint.DistanceFunction( 512.0 / DeblendFalloff, PixelAspect=par ) : blankclip(repout,color=$000000)

# постобработка результатов
post = ( PPMode == 1 ) ? repout.converttoyv12().minblur(1,uv=3).medianblur(3,0,0).removegrain(11) \
: ( PPMode == 2 ) ? repout.converttoyv12().fft3dgpu(sigma=16,sigma2=12,sigma3=8,sigma4=4,bt=3,bw=16,bh=16,ow=8,oh=8,plane=4) \
: ( PPMode == 3 ) ? repout.converttoyv12().mt_convolution("1 8 28 56 76 56 28 8 1","1 8 28 56 76 56 28 8 1",y=3,v=2,u=2) \
: repout

output = ( PPMode > 0 ) ? mt_merge(repout.converttoyv12(), post, PostMask) : repout

aa = debug ? stackhorizontal(cropped.ConvertToYV12.subtitle("source"),repout.ConvertToYV12.subtitle("repaired out"),output.ConvertToYV12.subtitle("repaired pp out")) : nop
bb = debug ? stackhorizontal(cropped.ConvertToYV12.BlankClip().subtitle("none"),repaired.ConvertToYV12.subtitle("repaired"),post.ConvertToYV12.subtitle("repaired pp")) : nop
cc = debug ? stackhorizontal(logocolor.ConvertToYV12.subtitle("Logo Color"),logoalpha.ConvertToYV12.subtitle("Logo Alpha"),LogoInpaint.ConvertToYV12.subtitle("Logo Inpaint")) : nop
dd = debug ? stackhorizontal(logo_mask.ConvertToYV12.subtitle("Logo Mask"),deblendmask.ConvertToYV12.subtitle("Deblend Mask"),PostMask.ConvertToYV12.subtitle("Post Mask")) : nop

# Вставка восстановленного участка обратно в исходное видео
output = RGB ? ( RGB24 ? output : output.converttoRGB32() ) : ( YUY2 ? fullclip.converttoYUY2() : fullclip.converttoYV12() )
final = clp.overlay(output,a, b)

RETURN debug ? stackvertical(aa,bb,cc,dd) : final
}

function InpaintAssist ( clip clp, string "loc", string "alignment") {
    loc = default (loc, "")
    x = width (clp)
    y = height (clp)
    alignment = default (alignment, "top")
    align = (alignment == "top") ? 8 : (alignment == "center") ? 5 : (alignment == "bottom") ? 2 :8
    framecount = framecount(clp)


    # I "Loc" parameter is not specified, split the clip in 9 parts et show crop value for each part
    # ==============================================================================================


    loc == "" ? Eval("""

    white = blankclip(width=round(x/3),height=round(y/3),color=$FFFFFF,length=framecount)
    black = blankclip(width=round(x/3),height=round(y/3),color=$000000,length=framecount)

    l1 = stackhorizontal(white,black,white)
    l2 = stackhorizontal(black,white,black)
    background = stackvertical(l1,l2,l1).converttoRGB32.spline36resize(x,y)
    clp = clp.converttoRGB32

    a1 = string(0)
    a2 = string(round((x*1/6))*2)
    a3 = string(round((x*1/3))*2)

    b1 = string(0)
    b2 = string(round((y*1/6))*2)
    b3 = string(round((y*1/3))*2)

    ca1 = string(-round((x*1/3))*2)
    ca2 = string(-round((x*1/6))*2)
    ca3 = string(0)

    d1 = string(-round((y*1/3))*2)
    d2 = string(-round((y*1/6))*2)
    d3 = string(0)

    c1 = clp.crop(0 , 0 , -round((x*1/3))*2, -round((y*1/3))*2)
    \ .subtitle("TL (" + a1 + "," + b1 + "," + ca1 + "," + d1+ ")",align=8)
    c2 = clp.crop(round((x*1/6))*2, 0 , -round((x*1/6))*2, -round((y*1/3))*2)
    \ .subtitle("TC (" + a2 + "," + b1 + "," + ca2 + "," + d1+ ")",align=8)
    c3 = clp.crop(round((x*1/3))*2, 0 , 0 , -round((y*1/3))*2)
    \ .subtitle("TR (" + a3 + "," + b1 + "," + ca3 + "," + d1+ ")",align=8)

    c4 = clp.crop(0 , round((y*1/6))*2 , -round((x*1/3))*2, -round((y*1/6))*2)
    \ .subtitle("ML (" + a1 + "," + b2 + "," + ca1 + "," + d2+ ")",align=8)
    c5 = clp.crop(round((x*1/6))*2, round((y*1/6))*2 , -round((x*1/6))*2, -round((y*1/6))*2)
    \ .subtitle("MC (" + a2 + "," + b2 + "," + ca2 + "," + d2+ ")",align=8)
    c6 = clp.crop(round((x*1/3))*2, round((y*1/6))*2 , 0 , -round((y*1/6))*2)
    \ .subtitle("MR (" + a3 + "," + b2 + "," + ca3 + "," + d2+ ")",align=8)

    c7 = clp.crop(0 , round((y*1/3))*2, -round((x*1/3))*2, 0)
    \ .subtitle("BL (" + a1 + "," + b3 + "," + ca1 + "," + d3+ ")",align=8)
    c8 = clp.crop(round((x*1/6))*2, round((y*1/3))*2, -round((x*1/6))*2, 0)
    \ .subtitle("BC (" + a2 + "," + b3 + "," + ca2 + "," + d3+ ")",align=8)
    c9 = clp.crop(round((x*1/3))*2, round((y*1/3))*2, 0 , 0)
    \ .subtitle("BR (" + a3 + "," + b3 + "," + ca3 + "," + d3+ ")",align=8)

    output = stackvertical(stackhorizontal(c1,c2,c3), stackhorizontal(c4,c5,c6), stackhorizontal(c7,c8,c9))
    output = output.spline36resize(x,y)
    clip1 = background.layer(output.mask(blankclip(output,color=$DEDEDE)))


    """) : nop


    # If "Loc" is specified, hightlight the part choosen by user
    # ==========================================================


    (strlen(loc) == 2) ? Eval("""

    a = (Rightstr(loc,1) == "L" || Rightstr(loc,1) == "1") ? 0 : (Rightstr(loc,1) == "C" || Rightstr(loc,1) == "2") ? round((x*1/6))*2 : round((x*1/3))*2
    b = (leftstr(loc,1) == "T" || leftstr(loc,1) == "X") ? 0 : (leftstr(loc,1) == "M" || leftstr(loc,1) == "Y") ? round((y*1/6))*2 : round((y*1/3))*2
    c = (Rightstr(loc,1) == "R" || Rightstr(loc,1) == "3") ? 0 : (Rightstr(loc,1) == "C" || Rightstr(loc,1) == "2") ? -round((x*1/6))*2 : -round((x*1/3))*2
    d = (leftstr(loc,1) == "B" || leftstr(loc,1) == "Z") ? 0 : (leftstr(loc,1) == "M" || leftstr(loc,1) == "Y") ? -round((y*1/6))*2 : -round((y*1/3))*2

                 """) : (strlen(loc) != 0) ? eval("""

    long = StrLen(loc)
    posvirg1 = findstr(loc, ",")
    posvirg2 = findstr(rightstr(loc,long-posvirg1), ",")
    posvirg2 = posvirg2+posvirg1
    posvirg3 = findstr(rightstr(loc,long-posvirg2), ",")
    posvirg3 = posvirg3 + posvirg2

    a = int(value(leftstr(loc,posvirg1-1)))
    b = int(value(leftstr(rightstr(loc,long-posvirg1),posvirg2-posvirg1-1)))
    c = int(value(leftstr(rightstr(loc,long-posvirg2),posvirg3-posvirg2-1)))
    d = int(value(rightstr(loc,long-posvirg3)))

                 """) : nop


    (loc != "") ? eval("""

    hightlight = blankclip(width=x-a+c,height=y-b+d,color=$96ff2d).converttoRGB32
    clip2 = clp.converttoRGB32.layer(hightlight.Mask(blankclip(hightlight, color=$444444)),x=a,y=b)
    return clip2.subtitle("Crop value : " + string(a) +", " +string(b) +", " +string(c) +", " +string(d), align=align, size=20 )

                 """) : clip1


    return last
}
Автор: unreal666
Дата сообщения: 16.12.2011 18:40
Где-нибудь в инете есть, как и в каком Visual Studio правильно компилировать AviSynth ?
Автор: szl
Дата сообщения: 16.12.2011 22:29
unreal666, в VS2010 собирается без проблем и работает отлично.
Автор: unreal666
Дата сообщения: 16.12.2011 22:51
szl

Ничига не беспроблем. Задолбался в инете искать инфу по всяким требуемым библиотекам.

скачанная из CVS без шаманства не собралась.
- Пришлось взять файлы проектов/решений из 2.58 MT (которая с гуглкод)
- поудалять из этих проектов ссылки на MT-файлы
- из этого же 2.58 MT вытащил папку distrib\include\baseclasses (такая же есть в папке Sample из Microsoft SDK v7.1, только из MT файл проекта модифицированный)
- оттуда же из distrib\lib перекинул файл ddraw.lib
- core/main.cpp закомментировать пару строк (определения констант KSDATAFORMAT_SUBTYPE_PCM и KSDATAFORMAT_SUBTYPE_IEEE_FLOAT), т.к. эти определения конфликтуют с их же определениями из Microsoft SDK.

И это называется без проблем ?

Да и еще в CVS файлы ядра для версии 2.60, а плагины версии 2.58. Притом, что в ветке avisynth_2_6 плагины версии 2.60. Хрен поймешь из чего собирать. Просто охота пересобрать сам исходник и модифицировать его под MT, так как текущий 2.60 MT с форума doom9.org скомпилирован криво (минимум, ф-я Imagewriter не может записывать в путь с кириллицей).
И прикол, что в 2.58 MT используется всего одна avisynth.h, а из CVS три - в core, в plugins\DirectShowSource и в plugins\TCPDeliver. И все разные. Понимаю, если бы только из core отличался от других, т.к. версии разные (2.6 vs 2.5), но почему в плагинах отличаются?
Автор: szl
Дата сообщения: 16.12.2011 23:56

Цитата:
Ничига не беспроблем

unreal666, ну не знаю, это дело привычки.
1. Получаю исходники avisynth из CVS.
Из ком.строки авторизуюсь с пустым паролем на CVS сервере:

Код: $ cvs -d:pserver:anonymous@avisynth2.cvs.sourceforge.net:/cvsroot/avisynth2 login
Автор: unreal666
Дата сообщения: 17.12.2011 01:34

Цитата:
и к либам от старого DirectX SDK

а вот это знать надо, что за "старый" DirectX SDK. Да и вообще из него нужен только ddraw.lib. А в новом DirectX SDK его нет.

Цитата:
В main.cpp комментирую строки KSDATAFORMAT_SUBTYPE_PCM и KSDATAFORMAT_SUBTYPE_IEEE_FLOAT

я не понимаю, чего они сами уже давно не закомментировали его или лучше бы #ifndef воткнули.

Цитата:
Для своего удобства убираю все ссылки на обработку выходных файлов с помощью UPX, и ссылки на копирование в системные директории.

это где?

Цитата:
Похоже, просто у народа руки не доходят для наведения порядка, возможно просто не хватает времени на плотную работу со своим проектом. Так, иногда, урывками фиксят, добавляют, пополняют... и так несколько лет топчутся на месте.

Возможно. Хотя судя по cvs и старую ветку 2.6 и текущую MAIN/HEAD ведет один и тот же чувак. Мог бы слить эти ветки сразу.
Автор: szl
Дата сообщения: 17.12.2011 14:31

Цитата:
это где?

unreal666, сегодня ночью отпишу тебе в личку, сейчас не могу... куча дел.

Цитата:
я не понимаю, чего они сами уже давно не закомментировали его или лучше бы #ifndef воткнули

Просто, авторы до сих пор используют для сборки VS6+SP5+CPUpack
Автор: unreal666
Дата сообщения: 18.12.2011 23:38
Что-то не понял. По идее, значение аргумента типа int должно лежать в диапазоне от -2147483648 до 2147483647. Но AviSynth при использовании значения -2147483648 матерится на него (на -2147483647 - нет). Чего за фигня?

PS.
AviSynth скомпилирован из CVS с помощью VS 2010.
Автор: Abs62
Дата сообщения: 19.12.2011 00:09
unreal666
Правильно матерится. Потому как выражение "-2147483648" означает применение операции "унарный минус" к значению 2147483648, которое для целого недопустимо. Потому и константа INT_MIN в limits.h прописана как (-2147483647-1).
Автор: unreal666
Дата сообщения: 19.12.2011 00:24

Цитата:
(-2147483647-1)

А для чего после -2147483647 еще и -1 ?
Автор: Abs62
Дата сообщения: 19.12.2011 00:27
unreal666
А чтобы как раз и получилось -2147483648.

Страницы: 12345678910111213141516171819

Предыдущая тема: Вставка из clipboard'а в MS Outlook 2000


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.