## Чересстрочное (Interlaced) и основанное на полях (Field-based) видео

В настоящее время (версии 2.5x и более ранние), AviSynth не имеет чересстрочного флага (признака), который может быть использован для чересстрочного видео. Существует флаг для видео, основанного на полях (полукадрах, с полем в качестве базовой единицы, разделенное на поля, fieldbased), но в контрасте с тем что Вы могли бы ожидать, этот флаг не относится к чересстрочному видео. Фактически, любое видео (прогрессивное или чересстрочное) является основанным на кадрах (с кадром в качестве базовой единицы, framebased), если только Вы не используете специальные AviSynth фильтры, чтобы изменить это. Существуют два фильтра, которые превращают основанное на кадрах видео в основанное на полях: SeparateFields и AssumeFieldBased.

- SeparateFields / Weave
  - SeparateFields (разделить поля): Если необходимо (например, когда шумоподавители требуют прогрессивного видео на входе), Вы можете расщепить чересстрочные потоки на поля, используя фильтр SeparateFields. Выходной клип будет иметь удвоенную скорость кадров оригинального клипа.
  - Weave (соединить поля): После приложения пространственного шумоподавителя (для временных шумоподавителей ситуация немного более [сложная]), фильтр Weave может быть использован, чтобы объединить поля снова для производства чересстрочных кадров.
- AssumeFieldBased / AssumeFrameBased
  - AssumeFieldBased (принимай основанное на полях): Применение этого клипа имеет результатом клип, основанный на полях (field-based). Это может быть полезно при производстве "искусственных" основанных на полях клипов.
  - AssumeFrameBased (принимай основанное на кадрах): Применение этого фильтра имеет результатом клип, основанный на кадрах (frame-based). Это может быть полезно при производстве "искусственных" основанных на кадрах клипов.

### Преобразования цветовых форматов и чересстрочное / основанное на полях видео

Предположим Вы имеете чересстрочное видео, Вы хотите работать в основанном на полях режиме (чтобы например применить некоторую фильтрацию) и Вам также необходимо сделать преобразование цвета. Нужно ли Вам делать это преобразование с основанным на кадрах клипом или Вы можете сделать это с основанным на полях клипом? Итак, это зависит от типа преобразования цветового формата, которое вы хотите применить:

* YUY2<->RGB преобразования могут быть сделаны с любым из них. (Заметьте, что в этом случае, установка interlaced=true/false (чересстрочное да/нет) не влияет ни на что. Она просто игнорируется.)
* YV12<->YUY2/RGB преобразования должны быть сделаны с основанным на кадрах клипом (с установкой interlaced=true ). Выполнение их с основанным на полях клипом приведет к некорректным результатам. Точная причина этого лежит за пределами рассмотрения данной заметки, но в общем это является следствием того, как определен YV12 цветовой формат. Главная проблема - то что цветность совместно используется пикселами двух разных строчек кадра. Дополнительная информация может быть найдена здесь.

Более опытные пользователи должны рассмотреть следующее. Вообще говоря, чересстрочное видео имеет части, где нет или мало движения. Таким образом, Вы едва ли увидите какие-либо эффекты чересстрочности (также называемые "гребенкой"(combing)) в этих частях. Они могут рассматриваться прогрессивно, а при выполнении преобразования YV12<->YUY2/RGB с прогрессивным видео, вы должны использовать установку interlaced=false чтобы получить лучший результат. Является возможным делать преобразование YV12<->YUY2/RGB покадрово, переключаясь между установками interlaced=true и interlaced=false. Вот как сделать это (Вам необходимо иметь установленный плагин decomb для возможности использовать функцию IsCombed)

    function ConvertHybridToYUY2(clip a, int "threshold", bool "debug")
    {
    debug = default(debug, false)
    global threshold = default(threshold, 20)

    b = ConvertToYUY2(a, interlaced=false)
    c = ConvertToYUY2(a, interlaced=true)
    ConditionalFilter(a, b, c, "IsCombed(threshold)", "equals", "true", show=debug)
    }

    function ConvertHybridToRGB(clip a, int "threshold", bool "debug")
    {
    debug = default(debug, false)
    global threshold = default(threshold, 20)

    b = ConvertToYUY2(a, interlaced=false)
    c = ConvertToYUY2(a, interlaced=true)
    ConditionalFilter(a, b, c, "IsCombed(threshold)", "equals", "true", show=debug)
    }

    AviSource("D:\captures\interlaced-clip.avi") # interlaced YV12
    #ConvertHybridToYUY2(debug=true)
    ConvertHybridToYUY2()

Однако, оборотная сторона этого подхода то, что это может привести к [бурлению цветности (chroma shimmering)] при переходах от кадра с "гребенкой" к прогрессивному (или обратно). Так что это несовершенное решение.

### Преобразование цвета, чересстрочное / основанное на полях видео и флаг чересстрочности (interlaced) программы dvd2avi

Для более опытных пользователей. Dvd2avi прослеживает, является ли кадр чересстрочным или прогрессивным (используя флаг "interlaced"). В принципе, dvd2avi может быть модифицирована, чтобы хранить это в текстовом файле и AviSynth мог бы читать его покадрово. Однако, это бесполезно. Проблема в том, что иногда прогрессивное видео закодировано как чересстрочное, и таким образом детектируется dvd2avi как чересстрочное. В предыдущем разделе объяснялось, что в этом случае Вы должны использовать interlaced=false при преобразовании YV12<->YUY2/RGB (так как движения нет) чтобы получить более точные результаты. Таким образом, для преобразования YV12<->YUY2/RGB важно учесть именно присутствие "гребенки", а не то, что кадр является чересстрочным.

### Изменение порядка полей клипа

Существуют фильтр SwapFields, который обменивает четные/нечетные поля, и плагин, который обращает доминантность (первенство) поля [ReverseFieldDominance]. Первый изменяет пространственный порядок, а второй - временной порядок.

#### Обмен полей:

перед применением SwapFields:

line | frame 0
0 | t0
1 | b1
2 | t2
3 | b3
4 | t4
5 | b5

порядок полей (верхнее поле первое (top field first), затем нижнее (bottom) поле):

line | field 0 | field 1
0 | t0 |
1 |  | b1
2 | t2 |
3 |  | b3
4 | t4 |
5 |  | b5

после применения SwapFields:

line | frame 0
0 | b1
1 | t0
2 | b3
3 | t2
4 | b5
5 | t4

порядок полей (верхнее поле первое (top field first), затем нижнее (bottom) поле):

line | field 0 | field 1
0 |  | b1
1 | t0 |
2 |  | b3
3 | t2 |
4 |  | b5
5 | t4 |

Заметьте, что четные и нечетные строки обменены, так что Вы можете назвать верхнее поле нижним полем, и наоборот.

#### Обращение доминантности поля (Reversing field dominance):

перед обращением доминантности поля:

line | frame 0
0 | t0
1 | b1
2 | t2
3 | b3
4 | t4
5 | b5

порядок полей (верхнее поле первое (top field first), затем нижнее (bottom) поле):

line | field 0 | field 1
0 | t0 |
1 |  | b1
2 | t2 |
3 |  | b3
4 | t4 |
5 |  | b5

после обращения доминантности полей (предполагая что строки смещены вверх, и последняя дублирована):

line | frame 0
0 | b1
1 | t2
2 | b3
3 | t4
4 | b5
5 | b5

порядок полей (нижнее поле первое (bottom field first), затем верхнее (top) поле):

line | field 0 | field 1
0 | b1 |
1 |  | t2
2 | b3 |
3 |  | t4
4 | b5 |
5 |  | b5

Заметьте, что верхнее и нижнее поля обменены, но четные и нечетные строки не обменены.

### Четность (= порядок) полей в AviSynth

Если клип является основанным на полях, AviSynth прослеживает четность (parity) каждого поля (то есть, является ли оно верхним или нижним полем кадра). Если клип является основанным на кадрах, AviSynth прослеживает доминантное поле в каждом кадре (то есть, какое поле в кадре пришло бы первым если бы они были разделены).

Однако, эта информация не является заведомо корректной, так как полевая информация обычно не хранится в видео файлах и фильтры-источники AviSynth просто обычно по умолчанию предполагают нижнее поле первым (bottom field first) (за исключением плагина MPEG2Source, который дает это правильно!).

### Про DV / DVD в отношении к доминантности поля

Доминантность поля не одна и та же для каждого источника. DV (с чересстрочным содержимым) имеет нижнее поле первым (bottom field first), в то время как DVD (или CVD/SVCD) имеет верхнее поле первым (top field first). Таким образом, когда преобразуете один в другой, Вам необходимо изменить доминантность поля. Это может быть сделано в AviSynth (смотри выше), но также и в самом кодировщике (для bff материала подобно DV видео, Вам необходимо установить флаг Upper field first). Некоторые комментарии по [другим методам].

### Ссылки

[DV / DVD и доминантность поля]
Про [доминантность поля].
[тема на форуме Doom] про обмененные поля и доминантность поля.
[Плагин ReverseFieldDominance]

`$English Date: 2006/12/15 19:29:25 $
Русский перевод 26.05.2005-27.09.2006 Fizick http://avisynth.org.ru`