DGDecode

Общая информация

авторы: MarcFD, Nic, trbarry, Sh0dan, Graft и другие
версия: 1.4.7
категория: MPEG декодеры (источники)
загрузка: http://neuron2.net/dgmpgdec/dgmpgdec.html
требования:
лицензия:
GPL

Содержание

Описание

DGDecode, часть пакета DGMPGDec, являющаяся MPEG-1/2 декодером выполненного в виде плагина для AviSynth v2.5 или выше. Он позволяет декодировать любой MPEG-1 или MPEG-2 поток, прочитанный программой DGIndex. Возможности: YV12, I420, или YUY2 выходное цветовое пространство (и RGB24 через DGVfapi), оптимизированные iDCTs, пост-обработка (деблокинг и дерингинг), яркостный фильтр, и многое другое!
(Прим. ред.: здесь деблокинг - подавление блочности, дерингинг - подавление волновой окантовки, звона в блоках изображения при сжатии).

DGDecode основан на MPEG2Dec3 v1.10, который в свою очередь основан на MPEG2Dec2 из проекта "save-oe" на SourceForge.

Важное замечание: Этот фильтр был переименован в DGDecode во избежание проблем с названиями и чтобы явно связать с версией DVD2AVI neuron2'а, названной DGIndex. Neuron2 очень сильно хочет подтвердить происхождение DGDECODE, как описал MarcFD в тексте ниже! Да, neuron2 продолжил развитие и исправлял DGDECODE, но он стоял на плечах гигантов, указанных в секции "Авторы".

Вы можете взять последние откомпилированные программы и исходные коды DGMPGDec на http://neuron2.net/dgmpgdec/dgmpgdec.html

Это программное обеспечение распространяется свободно под лицензией GNU GPL v2.

Синтаксис фильтра

MPEG2Source()

MPEG2Source (string "d2v", int "idct", int "cpu", bool "iPP", int "moderate_h", int "moderate_v", str "cpu2", bool "upConv", int "iCC", bool "i420", int "info", bool "showQ", bool "fastMC")

Хотя DGDecode сейчас может декодировать MPEG-1 и MPEG-2, эта функция до сих пор называется MPEG2Source() для совместимости с имеющимися скриптами. Вы можете использовать её для MPEG-1 и MPEG-2 потоков.

d2v: "[ПУТЬ\]project.d2v"

Файл проекта DGIndex.
Необходимые параметры!
Замечание 1: ПУТЬ можно не писать, если файл "project.d2v" в той же папке, что и Ваш AviSynth (*.avs) скрипт.

idct: 0 to 7 (по умолчанию: 0)

Алгоритм iDCT.
Для большей информации об iDCT читайте Приложение B.
Смотрите Приложение C для списка поддерживаемых процессоров.
- 0: Использует значение, указанное в DGIndex (6 и 7 недоступны в DGIndex)
- 1: 32-bit MMX
- 2: 32-bit SSEMMX
- 3: 64-bit SSE2MMX
- 4: 32-bit Числа с плавающей запятой
- 5: 64-bit рекомендуемый IEEE-1180
- 6: 32-bit SSEMMX (Skal)
- 7: 32-bit Simple MMX (XviD)

cpu: 0 to 6 (по умолчанию: 0)

Предустановленные значения для пост-обработки.
(Y=яркость , C= цветность , H=горизонтально, V=вертикально)
- 0: Пост-обработка отключена
- 1: DEBLOCK_Y_H
- 2: DEBLOCK_Y_H, DEBLOCK_Y_V
- 3: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H
- 4: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H, DEBLOCK_C_V
- 5: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H, DEBLOCK_C_V, DERING_Y
- 6: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H, DEBLOCK_C_V, DERING_Y, DERING_C

Здесь обозначены части комбинации:
DEBLOCK_Y_H: Деблокинг яркости по-горизонтали,
DEBLOCK_Y_V: Деблокинг яркости по-вертикали
DEBLOCK_C_H: Деблокинг цветности по-горизонтали
DEBLOCK_C_V: Деблокинг цветности по-вертикали
DERING_Y: Дерингинг яркости
DERING_C: Дерингинг цветности

iPP: true/false (по умолчанию: auto)

Пост-обработка, основанная на полях.
DGDecode автоматически использует флаг прогрессивного кадра (PROGRESSIVE_FRAME) для переключения между основанной на поле/кадре пост-обработке на покадровую (per-frame-basis).
Вы можете установить параметр iPP, только если хотите чтобы DGDecode использовал конкретный режим пост-обработки.
- true: Использовать пост-обработку по полям (чересстрочного)
- false: Использовать пост-обработку по кадрам (прогрессивного)

moderate_h, moderate_v: 0 to 255 (по умолчанию: moderate_h=20, moderate_v=40)

Чувствительность определения блочности.
(moderate_h=horizontal, moderate_v=vertical)
Чем меньше значения, тем сильней, используйте осторожно.

cpu2: (default: "")

Выборочная пост-обработка.
Проставьте "x" или "o" во всех шести пунктах перечисленных ниже. (нечуствительно к регистру)
Каждый "x" включает соответствующую опцию пост-обработки, "o" - выключает.
первый символ: Деблокинг яркости по-горизонтали
второй символ: Деблокинг яркости по-вертикали
третий символ: Деблокинг цветности по-горизонтали
четвёртый символ: Деблокинг цветности по-вертикали
пятый символ: Дерингинг яркости
шестой символ: Дерингинг цвета

Например, чтобы включить только обработку цветности, используйте:

MPEG2Source("project.d2v", cpu2="ooxxox")

upConv: true/false (по умолчанию: false)

Делает YUY2 (4:2:2) из YV12 (4:2:0), основываясь на флаге прогрессивного кадра.
Игнорируется, если источник не YV12 (4:2:0)
Используйте фильтр для AviSynth, если хотите постоянный режим интерполяции отсчетов (upsampling) (цветности - прим ред.) YUY2->YV12.
- true: Выполняет интерполяцию если есть флаг PROGRESSIVE_FRAME
- false: Не выполняет интерполяцию

i420: true/false (по умолчанию: false)

Выводить в цветовом пространстве I420.
Требуется для совместимости с некоторыми приложениями.
Игнорируется, если источник не YV12 (4:2:0), или если upConv=true.
- true: Выводит в I420
- false: Выводит в YV12

info: 0 to 3 (по умолчанию: 0)

Отладочная информация.
- 0: Не генерировать отладочную
- 1: Отладочная информация выводится на видео через оверлей
- 2: Отладочная информация выводится через OutputDebugString()
- 3: Отладочная информация выводится на видео в виде подсказок - hints (как указано в utilities.cpp/utilities.h)

showQ: true/false (по умолчанию: false)

Показывать квантизеры (quantizer - параметр потерь деталей) макроблоков.
- true: Показывать квантизеры
- false: Не показывать.

fastMC: true/false (по умолчанию: false)

Компенсация быстрого движения Vlad'а.
Маленькая прибавка скорости, но значительное понижение точности декодирования.
Предназначена для тестирования, и может быть удалена в будущих версиях.
Требует SSE или 3DNow!, смотрите поддерживаемые процессоры в Приложении C.

LumaYV12()

LumaYV12 (clip, int "lumoff", float "lumgain")

Эта функция не связана с яркостным фильтром из DGIndex'а.
Это преобразование: Y = (y * lumgain) + lumoff

LumaYV12() выдаёт диапазон 0->255 YUV, а не CCIR-601 16->235. Используйте встроенный в Avisynth фильтр ColorYUV(), если хотите изменить диапазон до 16->235. Функциональность LumaYV12() может быть получена использованием ColorYUV(), который более функционален, но LumaYV12() оптимизирован по скорости для корректировки яркостной составляющей.

lumoff: -255 to 255 (по умолчанию: 0)

Яркостный отступ.
Изменить яркость всех пикселей на заданную величину.

lumgain: 0.0 to 2.0 (по умолчанию: 1.0)

Увеличение яркости.
Изменить яркость всех пикселей на пропорциональную величину.

BlindPP()

BlindPP (clip, int "quant", int "cpu", bool "iPP", int "moderate_h", int "moderate_v", string "cpu2")

Деблокинг и/или дерингинг любого видео источника.
Требует YUY2 или YV12 входное цветовое пространство.
Читайте Приложение A для пояснений использования.

quant: 0 to 31 (по умолчанию: 2)

Имитирует квантизер (quatizer).
Устанавливает силу устранения блочности.

cpu: 0 to 6 (по умолчанию: 6)

Такая же функция как и в MPEG2Source(), но с другими значениями по умолчанию.

iPP: true/false (по умолчанию: false)

Такая же функция как и в MPEG2Source(), но с другими значениями по умолчанию.

Автоматический режим ОТСУТСТВУЕТ.

moderate_h, moderate_v, cpu2: (по умолчанию: moderate_h=20, moderate_v=40, cpu2="")

Такая же функция как и в MPEG2Source(), но с другими значениями по умолчанию.

DeBlock()

Deblock (clip, int "quant", int "aOffset", int "bOffset", bool "mmx", bool "isse")

Фильтр устранения блочности H.264 от Manao. (v0.9.5)
Требует источник в YV12.
Оба (quant + aOffset) И (quant + bOffset) должны быть >= 16 иначе фильтр не имеет смысла.

quant: 0 to 51 (по умолчанию: 25)

Имитирует квантизер.
Устанавливает силу устранения блочности.

aOffset: (по умолчанию: 0)

Изменяет порог определения блочности.
Высокие значения означают, что больше краёв будет смазано.

bOffset: (по умолчанию: 0)

Модификатор определения блочности и силы её устранения.
И снова чем больше значение, тем сильней.

mmx: true/false (по умолчанию: true)

Автоматически выключается, если процессор не поддерживает набор комманд MMX
- true: Включает оптимизацию под MMX
- false: Отключает MMX

isse: true/false (по умолчанию: true)

Автоматически выключается, если процессор не поддерживает набор комманд SSE
Читайте Приложение C для списка поддерживаемых процессоров.
- true: Включает SSE оптимизации
- false: Не использует SSE оптимизации

Примеры использования

Пример LoadPlugin() из avisynth

AviSynth команда LoadPlugin() должна вызываться перед использованием любой функции DGDecode.
Чтобы проделать это, добавьте эту строчку в начало Вашего AviSynth (*.avs) скрипта:

LoadPlugin("[ПУТЬ\]DGDecode.dll")

Замечание: ПУТЬ может быть опущен, если DGDecode.dll находится в директории по умолчанию для плагинов AviSynth, иначе ПУТЬ должен быть указан.

Примеры MPEG2Source()

MPEG2Source() должен использоваться для MPEG-1 и MPEG-2 источников видео.

Чтобы только декодировать в YV12:

MPEG2Source("[ПУТЬ\]project.d2v")

Замечание: ПУТЬ может быть опущен, если DGDecode.dll находится в директории по умолчанию для плагинов AviSynth, иначе ПУТЬ должен быть указан.

Чтобы сделать только деблокинг:

MPEG2Source("project.d2v", cpu=4)

Чтобы сделать деблокинг на чересстрочном источнике с повышенной вертикальной чувствительностью:

MPEG2Source("project.d2v", cpu=4, iPP=true, moderate_v=20)

Чтобы делать только дерингинг:

MPEG2Source("project.d2v", cpu2="ooooxx")

Выбрать 32-bit SSE2 iDCT и установить выходное цветовое пространство I420 можно так:

MPEG2Source("project.d2v", idct=5, i420=true)

Изменить цветовое пространство в YUY2 исходя из флага прогрессивного кадра:

MPEG2Source("project.d2v", upConv=true)

Отобразить на экране информацию о видео:

MPEG2Source("project.d2v", info=1)

Примеры LumaYV12()

Приведённые примеры LumaYV12() конечно же субъективны и должны подбираться индивидуально.
Используйте их как Вам будет угодно.

Сделать темней:

MPEG2Source("project.d2v")
LumaYV12(lumoff=-10, lumgain=0.9)

Сделать светлей:

MPEG2Source("project.d2v")
LumaYV12(lumoff=10, lumgain=1.1)

Примеры BlindPP()

BlindPP() не должен использоваться, если видео открыто функцией
MPEG2Source(), потому что её пост-обработка работает лучше. Обычно BlindPP() используется, если видео открывается AviSynth'вским AviSource() или DirectShowSource().

Значения по умолчанию для деблокинга и дерингинга:

AVISource("my_video.avi")
BlindPP()

Только деблокинг:

AVISource("my_video.avi")
BlindPP(cpu=4)

Чтобы сделать деблокинг на чересстрочном источнике с повышенной горизонтальной чувствительностью:

AVISource("my_video.avi")
BlindPP(cpu=4, iPP=true, moderate_h=10)

Более сильный деблокинг и дерингинг:

DirectShowSource("my_video.mpg")
BlindPP(quant=12)

Только дерингинг:

DirectShowSource("my_video.mpg")
BlindPP(cpu2="ooooxx")

Примеры Deblock()

Deblock() не должен использоваться на MPEG-2 видео источнике.
Обычно он используется при открытие через функции AviSynth'а AviSource() или DirectShowSource().

Деблокинг по умолчанию:

AVISource("my_video.avi")
Deblock()

Сделать сильный деблокинг с повышенной чувствительностью:

DirectShowSource("my_video.mpg")
Deblock(quant=32, aOffset=16, bOffset=24)

Приложение A: описание BlindPP()

Блочность получается вследствие 8x8-пиксельного дискретное косинусное преобразование (далее DCT) используемого MPEG кодировщиком. Вы должны быть уверены что блоки, от которых Вы хотите избавиться имеют стороны по 8 пикселей. Это означает, что перед применением BlindPP() не нужно делать изменение размеров или обрезание картинки. Если источник закодирован с чередованием полей (чересстрочно), установите iPP=true, если же он прогрессивный, то значение по умолчанию - правильно (iPP=false).

Параметры: quant, cpu2, moderate_h, and moderate_v.

quant определяет общую силу с которой нужно убирать блоки.

Установите cpu2 в "xxxxoo" для горизонтального и вертикального деблокинга цветности и яркостной состовляющих, в "xooxoo" для горизонтального яркости и вертикального деблокинга цветности, и т.д. Идею Вы получили.

moderate_h и moderate_v означают горизонтальную и вертикальную чувствительность, определяющую зону, где будет выполняться деблокинг, а где нет. Эти значения регулируют чувствительность распознания наличия блочности.

quant=2, moderate_h=35-45, moderate_v=45-55 будет произведено очень мягкое сглаживание очень больших блоков. Это сохранит очень много деталей и резкости, но также не избавит от "слабых" блоков, и не уберёт полностью более сильные.

quant=16, moderate_h=15-20, moderate_v=20-30 будет произведено очень грубое удаление всего, что было блоками, а также это сгладит картинку и потеряются детали и резкость.

Выбирать Вам в зависимости от Вашего вкуса и видео источника.

Ещё один пример... Так как замечательный шумодав PixieDust() сам иногда вызывает появление блоков в движущихся областях, я решил с этим что-нибудь сделать:

PixieDust(2)
BlindPP(quant=8, cpu2="xxxxoo", moderate_h=45, moderate_v=55)

Этого удаляет значительную долю наиболее видимой блочности, если только действительно PixieDust() произвёл его. В оставшихся 99.8% случаев, когда PixieDust() не производит блоков, эта функция почти ничего не делает, как и желательно.

Приложение B: описание алгоритма iDCT

Файл readme из FlasKMPEG содержит замечательное техническое описание работы iDCTs. В нём излагается:

"Видео информация внутри MPEG файла хранится в частотном представлении, а не в пространственном представлении (те изображения, которые мы видим). Это делает информацию компактней и эту компактность мы можем использовать чтобы сжать (снизить) количество информации, которое мы должны послать по передающим каналам. (Прим перев.: Это позволяет алгоритму сжатия отбросить те элементы изображения, которые наименее важны для восприятия картинки человеческим глазом, степень сжатия, в итоге, и зависит от количества отбрасываемой информации). MPEG использует дискретное косинусное преобразование (DCT) чтобы перевести пространственную информацию в частотную. Чтобы вернуть обратно пространственную информацию из MPEG потока, мы должны применить iDCT, что означает обратное дискретное косинусное преобразование, которое обращает DCT, которое мы использовали при кодировании."

"Хотя MPEG жестко задает почти все почти полностью определяет все возможности (при данном MPEG потоке, выход должен быть идентичен для всех декодеров), но стандарт позволяет использовать разные iDCT (Прим. перев: например, для ускорения работы декодера). Поэтому декодер может быть легко реализован в зависимости от используемой аппаратуры. Стандарт требует от декодера, чтобы iDCT соответствовало IEEE-1180, иначе говоря чтобы ошибки iDCT не были бОльшими, чем это определено в IEEE-1180."

Какой iDCT Вы будете использовать зависит в основном от Вашего процессора и степени того, насколько точное iDCT Вы хотите. Большинство людей не способны сказать о разнице этих алгоритмов, но она может быть легко исследована комбининацией AviSynth фильтров Subtract() и Levels(). Все доступные опции совместимы с IEEE-1180, кроме SSE/MMX (Skal).

По качеству: IEEE-1180 Reference > 64-bit Floating Point > Simple MMX (XviD) > остальные iDCTs.

По скорости: SSE2/MMX и SSE/MMX (Skal) как правило самые быстрые. IEEE-1180 Reference - самый простой и медленный.

Приложение C: SIMD инструкции

SIMD расшифровывается как Single Instruction, Multiple Data(Одна инструкция, много данных). Это означает передачу набору команд большого кол-ва данных для эффективной параллельной обработки. Такой метод даёт большой прирост производительности в приложениях по обработке аудио и видео файлов. Это обычно требует повторения последовательности команд, которые будут выполняться теперь за один такт.

Существует семь разных наборов SIMD инструкций доступных в процессорах Intel и AMD, но не каждая модель процессора поддерживает все эти продвинутые наборы инструкций. Вот почему многие функции DGDecode снабжены опциями для определения, используемого набора комманд. Таблица ниже содержит SIMD инструкции, поддерживаемые DGDecode, и процессоры, требуемые для их использования.

История версий

Основан на MPEG2Dec2 (выгрузка из CVS от 28.09.2002), переработан до MPEG2Dec3 (MarcFD).

Переиздано как DGDecode (neuron2)

Участники 

Mathias Born, автор MPEG2Dec
Donald Graft ("neuron2"), исправление потерянного кадра, точное индексирование, поддержка PVA, и многое другое
Peter Gubanov, автор MMX/SSEMMX iDCT
Chia-chen Kuo ("jackei"), автор DVD2AVI
"MarcFD", ввёл поддержку YV12 и многое другое
"Nic", пост обработка и многое другое
Miha Peternel, автор Floating Point и Reference iDCT
Dmitry Rozhdestvensky, автор SSE2 iDCT
"sh0dan", оптимизация кода
"Skal", for his SSEMMX iDCT
"trbarry", разбор (parsing) TS, и оптимизация кода
"tritical", интеполяция отсчетов, информация через оверлей, улучшения VFAPI, и много исправленных ошибок
"Manao", за фильтр Deblock()
"ARDA", за фильтр LumaYV12()
"Didйe", за приложение A: описание использование BlindPP()
"Cyberia", за приложения B и C, и усовершенствование пользовательской инструкции

$English Date: 2007/09/22 21:28:24 $
Русский перевод 16.05.2006 SCIF [email protected] $

Редакция 18.05.2006-23.09.2007 Fizick