RU2811461C2 - Классификация в адаптивной контурной фильтрации - Google Patents

Классификация в адаптивной контурной фильтрации Download PDF

Info

Publication number
RU2811461C2
RU2811461C2 RU2022102907A RU2022102907A RU2811461C2 RU 2811461 C2 RU2811461 C2 RU 2811461C2 RU 2022102907 A RU2022102907 A RU 2022102907A RU 2022102907 A RU2022102907 A RU 2022102907A RU 2811461 C2 RU2811461 C2 RU 2811461C2
Authority
RU
Russia
Prior art keywords
block
samples
boundary
video
filter
Prior art date
Application number
RU2022102907A
Other languages
English (en)
Other versions
RU2022102907A (ru
Inventor
Ли ЧЖАН
Кай Чжан
Хунбинь Лю
Юэ Ван
Original Assignee
Бейджин Байтдэнс Нетворк Текнолоджи Ко., Лтд.
Байтдэнс Инк.
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Бейджин Байтдэнс Нетворк Текнолоджи Ко., Лтд., Байтдэнс Инк. filed Critical Бейджин Байтдэнс Нетворк Текнолоджи Ко., Лтд.
Publication of RU2022102907A publication Critical patent/RU2022102907A/ru
Application granted granted Critical
Publication of RU2811461C2 publication Critical patent/RU2811461C2/ru

Links

Abstract

Изобретение относится к средствам для кодирования видео. Технический результат заключается в повышении эффективности кодирования видео. Определяют градиенты субнабора отсчетов в области размером 88 для получения классификации блока 44 первого блока дерева кодирования в первом процессе фильтрации, причем блок 44 расположен внутри первого блока дерева кодирования и внутри области 88. Выполняют преобразование на основе указанного определения. При этом определяют набор коэффициентов фильтрации для отсчета блока 44 на основе указанных градиентов. Определяют набор значений сжатия для указанного отсчета. Применяют фильтр к указанному отсчету на основе набора коэффициентов фильтрации и набора значений сжатия. В случае когда не разрешено использовать отсчеты, пересекающие границу видеоблока в первом процессе фильтрации, крайние левые два столбца отсчетов в области 88 заполняются, когда в блоке 44, расположенном на левой границе видеоблока, имеется отсчет; или самые верхние две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на верхней границе видеоблока, имеется отсчет. 4 н. и 10 з.п. ф-лы, 43 ил.

Description

Область техники, к которой относится изобретение
Настоящий патентный документ, в целом, относится к технологиям видеокодирования и декодирования.
Уровень техники
Первоначально стандарты видеокодирования получили свое развитие через разработку хорошо известных стандартов ITU-T и ISO/IEC. ITU-T создал стандарты H.261 и H.263, ISO/IEC создал стандарты MPEG-1 и MPEG-4 Visual, и две организации совместно создали стандарты H.262/MPEG-2 Video и H.264/MPEG-4 Advanced Video Coding (AVC) и H.265/ High Efficiency Video Coding (HEVC). Начиная с H.262, стандарты видеокодирования основываются на гибридной структуре видеокодирования, в которой используются временное предсказание плюс кодирование преобразования. Для исследования будущих технологий видеокодирования, следующих за HEVC, в 2015 г. VCEG и МPEG совместно была основана Совместная группа исследований по видео (Joint Video Exploration Team, JVET). С этого времени JVET было предложено много новых способов, которые вошли в ссылочное программное обеспечение под названием Joint Exploration Model (JEM). В апреле 2018 г. JVET была создана между VCEG (Q6/16) и ISO/IEC JTC1 SC29/WG11 (MPEG) для работы над следующим поколением стандарта Versatile Video Coding (VVC), направленного на 50-типроцентное снижение битовой скорости по сравнению с HEVC.
Раскрытие сущности изобретения
Используя раскрытые технологии видеокодирования, транскодирования или декодирования, варианты осуществления видеокодеров или декодеров могут управлять виртуальными границами блоков дерева кодирования, чтобы обеспечивать большую эффективность сжатия и более простые реализации инструментов кодирования или декодирования.
В одном из примерных подходов раскрывается способ видеообработки. Способ содержит этап, на котором определяют, для преобразования блока видеоизображения в видео и представления битового потока видео, градиенты субнабора отсчетов в области для операции классификации в процессе фильтрации. Область имеет размер M×N и блок имеет размер K×L, причем M, N, K, L являются положительными целыми числами и блок располагается внутри области. Способ также содержит этап, на котором выполняют преобразование на основе указанного определения.
При другом примерном подходе раскрывается способ видеообработки. Способ содержит этап, на котором определяют, для преобразования блока видеоизображения в видео и представления битового потока, операцию равномерного заполнения в процессе адаптивной контурной фильтрации, которая применима к отсчетам, расположенным на 360-градусной виртуальной границе множества видеообластей видеоизображения, независимо от положения 360-градусной виртуальной границы внутри видеоизображения. Способ также содержит этап, накотором выполняют преобразование на основе указанного определения.
При другом примерном подходе раскрывается способ видеообработки. Способ содержит этап, на котором выполняют преобразование между видеоблоками видеоизображения и представлением их битового потока. Здесь видеоблоки обрабатываются, используя логическое группирование блоков дерева кодирования, и блоки дерева кодирования обрабатываются на основе того, находится ли нижняя граница нижнего блока дерева кодирования снаружи нижней границы видеоизображения.
При другом примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых определяют, на основе состоянии блока дерева кодирования текущего видеоблока, состояние использования виртуальных отсчетов во время внутриконтурной фильтрации и выполняют преобразование между видеоблоком и представлением битового потока видеоблока, совместимого с состоянием использования виртуальных отсчетов.
При ещё одном примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы. на которых определяют, во время преобразования между видеоизображением, которое логически сгруппировано в один или более видеосекций или видеобриков, и представлением битового потока видеоизображения, чтобы запретить использование отсчетов в другой секции или брике в процессе адаптивной контурной фильтрации, и выполняют преобразование, совместимое с указанным определением.
При ещё одном другом примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых определяют, во время преобразования между текущим видеоблоком видеоизображения и представлением битового потока текущего видеоблока, что текущий видеоблок содержит отсчеты, расположенные на границе видеоблока видеоизображения, и выполняют преобразование на основе указанного определения, причем на этапе выполнения преобразования формируют виртуальные отсчеты для процесса внутриконтурной фильтрации, используя унифицированный способ, который является одним и тем же для всех граничных типов в видеоизображении.
При ещё одном другом примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых определяют применить, во время преобразования между текущим видеоблоком видеоизображения и его представлением битового потока, один из множества способов выбора отсчетов адаптивного контурного фильтра (adaptive loop filter, ALF), доступных для видеоизображения во время преобразования, и выполняют преобразование путем применения указанного одного из множества способов выбора отсчетов ALF.
При ещё одном примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых выполняют, на основе граничного правила, операцию внутриконтурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; при этом граничное правило запрещает использование отсчетов, которые пересекают виртуальный блок конвейера передачи данных (virtual pipeline data unit, VPDU) видеоизображения, и выполняют преобразование, используя результат операции внутриконтурной фильтрации.
При ещё одном другом примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых выполняют, на основе граничного правила, операцию внутриконтурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; при этом граничное правило устанавливает использовать для местоположений текущего видеоблока по границе видеоблока отсчеты, которые формируются без использования заполнения, и выполняют преобразование, используя результат операции внутриконтурной фильтрации.
При ещё одном другом примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых выполняют, на основе граничного правила, операцию внутриконтурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; при этом граничное правило для операции внутриконтурной фильтрации устанавливает выбор фильтра, имеющего такие размеры, что отсчеты текущего видеоблока, используемые во время внутриконтурной фильтрации, не пересекают границу видеоблока видеоизображения, и выполняют преобразование, используя результат операции внутриконтурной фильтрации.
При ещё одном другом примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых выполняют, на основе граничного правила, операцию внутриконтурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; при этом граничное правило для операции внутриконтурной фильтрации устанавливает выбор параметров сжатия или коэффициентов фильтра на основе того, требуются ли заполненные отсчеты для внутриконтурной фильтрации, и выполняют преобразование, используя результат операции внутриконтурной фильтрации.
При ещё одном другом примерном подходе раскрывается другой способ видеообработки. Способ содержит этапы, на которых выполняют, на основе граничного правила, операцию внутриконтурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; при этом граничное правило зависит от идентификаторов цветовых компонентов текущего видеоблока, и выполняют преобразование, используя результат операции внутриконтурной фильтрации.
При ещё одном примерном подходе раскрывается устройство видеокодирования, выполненное с возможностью осуществления описанного выше способа.
При ещё одном примерном подходе раскрывается видеодекодер, выполненный с возможностью осуществления описанного выше способа.
При ещё одном примерном подходе раскрывается машиночитаемый носитель. На носителе хранится управляющая программа, которая при ее исполнении вызывает выполнение процессором одного или более из описанных выше способов.
Перечисленные выше и другие подходы и признаки раскрытой технологии описываются более подробно на чертежах, в описании и формуле изобретения.
Краткое описание чертежей
Фиг. 1 - пример изображения с блоками 18 х12 дерева кодирования (coding tree unit, CTU) яркости, которое делится на 12 плиток и 3 секции растрового сканирования.
Фиг. 2 - пример изображения с CTU 18х12 яркости, которое делится на 24 плитки и 9 прямоугольных секций.
Фиг. 3 - пример изображения, которое делится на 4 плитки, 11 бриков и 4 прямоугольных секции.
Фиг. 4А - пример блоков дерева кодирования (coding tree block, CTB), пересекающих границы изображения, когда K = M, L < N.
Фиг. 4В - пример блоков дерева кодирования, CTB, пересекающих границы изображения, когда K < M, L=N.
Фиг. 4C - пример блоков дерева кодирования CTB, пересекающих границы изображения, когда K < M, L< N.
Фиг. 5 - пример диаграммы блока кодирования.
Фиг. 6 - отсчеты изображения и горизонтальные и вертикальные границы блока на сетке 8×8 и неперекрывающиеся блоки отсчетов 8×8, которые могут деблокироваться паралелльно.
Фиг. 7 - примеры пикселей, участвующих в принятии решения о включении/выключении фильтра и сильной/слабой селекции фильтра.
Фиг. 8 - четыре одномерных направленных модели.
Фиг. 9 - примеры формы фильтров геометрической адаптивной контурной фильтрации (geometric adaptive loop filtering, GALF) (слева: ромбоид, 5×5, в середине: ромбоид 7×7, справа: ромбоид 9×9).
Фиг. 10 - относительные координаты для поддержки ромбоидного фильтра 5×5.
Фиг. 11 - примеры относительных координат для поддержки ромбоидного фильтра 5×5.
Фиг. 12A - пример построения для вычислений лапласианов подотсчетов.
Фиг. 12B - другой пример построения для вычислений лапласианов подотсчетов.
Фиг. 12C - другой пример построения для вычислений лапласианов подотсчетов.
Фиг. 12D - ещё один пример построения для вычислений лапласианов подотсчетов.
Фиг. 13 - пример требования к линейному буферу контурного фильтра в VTM-4.0 для компонента яркости Luma.
Фиг. 14 - пример требования к линейному буферу контурного фильтра для компонента цветности Chroma.
Фиг.15A - пример классификации блоков ALF на виртуальной границе, когда N = 4.
Фиг. 15B - другой пример классификации блоков ALF на виртуальной границе, когда N = 4.
Фиг. 16A пример модифицированной фильтрации ALF яркости на виртуальной границе.
Фиг.16B - другой пример модифицированной фильтрации ALF яркости на виртуальной границе.
Фиг. 16C ещё один другой пример модифицированной фильтрации ALF яркости на виртуальной границе.
Фиг. 17A - пример модифицированной фильтрации ALF цветности на виртуальной границе.
Фиг. 17B - другой пример модифицированной фильтрации ALF цветности на виртуальной границе.
Фиг. 18A - пример горизонтальной свёртки вокруг компенсации движения.
Фиг.18B - другой пример горизонтальной свёртки вокруг компенсации движения.
Фиг. 19 - пример модифицированного адаптивного контурного фильтра.
Фиг. 20 - пример обработки CTU в видеоизображении.
Фиг. 21 - пример модифицированной границы адаптивного контурного фильтра.
Фиг. 22 - блок-схема примера устройства видеообработки.
Фиг. 23 - блок-схема последовательности выполнения операций примерного способа видеообработки.
Фиг. 24 - пример изображения HEC в формате 3x2.
Фиг. 25 - пример количества заполняющих строк для отсчетов двух видов границ.
Фиг. 26 - пример обработки CTU в изображении.
Фиг. 27 - другой пример обработки CTU в изображении.
Фиг. 28 - другой пример текущего отсчета и отсчетов, которые должны требоваться для получения доступа.
Фиг. 29 - другой пример заполнения "недействительных" соседних отсчетов.
Фиг. 30 - пример отсчетов, необходимых для использования в процессе классификации ALF.
Фиг. 31 - блок-схема примера системы видеообработки, в которой могут быть использованы раскрытые технологии.
Фиг. 32 - блок-схема последовательности выполнения операций способа видеообработки в соответствии с представленной технологией.
Фиг. 33 - блок-схема последовательности выполнения операций представления другого способа видеообработки в соответствии с настоящей технологией.
Осуществление изобретения
Заголовки разделов используются в настоящем документе для облегчения понимания и не предназначены ограничивать варианты осуществления, раскрытые в разделе, только этим разделом. Кроме того, хотя некоторые варианты осуществления описываются со ссылкой на гибкое видеокодирование (Versatile Video Coding) или другие конкретные видеокодеки, раскрытые технологии применимы и к другим технологиям видеокодирования. Дополнительно, хотя некоторые варианты осуществления описывают этапы видеокодирования подробно, следует понимать, что соответствующие этапы, декодирующие то, что было сделано при кодировании, будут реализовываться декодером. Дополнительно, термин "видеообработка" охватывает видеокодирование или сжатие, видеодекодирование или декомпрессию и видеотранскодирование, при котором видеопиксели представляются из одного сжатого формата в другой сжатый формат или с другой битовой скоростью при сжатии.
1. Краткий обзор
Этот документ относится к технологиям видеокодирования. Конкретно, он относится к границе изображения/секции/плитки/брика. Конкретно, это относится к границе изображения/секции/плитки/брика и к кодированию виртуальной границы, особенно, для нелинейного адаптивного контурного фильтра. Он может применяться к существующему стандарту видеокодирования, такому как HEVC, или к стандарту (Versatile Video Coding), который предстоит окончательно принять. Он может также быть применим к будущим стандартам видеокодирования или к видеокодеку.
2. Начальное обсуждение
Стандарты видеокодирования были разработаны, прежде всего, через развитие хорошо известных стандартов организаций ITU-T и ISO/IEC. ITU-T создал H.261,H.263, а ISO/IEC создал MPEG-1 и MPEG-4 Visual, и эти две организации совместно создали стандарты H.262/MPEG-2 Video и H.264/MPEG-4 Advanced Video Coding (AVC) и H.265/HEVC. Начиная с H.262, стандарты видеокодирования основываются на гибридной структуре видеокодирования, в которой используются временное предсказание плюс кодирование с преобразованием. Для использования будущих технологий видеокодирования, помимо HEVC, VCEG и MPEG в 2015 году была образована совместная группа по использованию видео (Joint Video Exploration Team, JVET). С тех пор JVET было предложено много новых способов, которые вошли в базовое программное обеспечение под названием Joint Exploration Model (JEM). В апреле 2018 г. JVET между VCEG (Q6/16) и ISO/IEC было создано JTC1 SC29/WG11 (MPEG) для работы на стандарте VVC, направленном на 50-типроцентное снижение битовой скорости по сравнению с HEVC.
2.1 Цветовое пространство и суботсчет цветности
Цветовое пространство, также известное как цветовая модель (или цветовая система) является абстрактной математической моделью, которая просто описывает диапазон цветов как последовательность чисел, обычно как 3 или 4 цвета или цветовых компонента (например, RGB). Говоря в целом, цветовое пространство является развитием системы координат и субпространства.
Для видеосжатия наиболее часто используемыми являются YCbCr и RGB.
YCbCr, Y′CbCr, или Yг Pb/Cb Pr/Cr также записываемые как YCBCR или Y'CBCR, является семейством цветовых пространств, используемых как часть конвейера цветных изображений в видеосистемах и системах цифровой фотографии. Y′ является компонентом яркости, а CB и CR являются сине-разностными и красно-разностными компонентами цветности. Y′ (со штрихом) отличается от Y, который является яркостью, означая, что интенсивность света является нелинейно кодированной, основываясь на гамма-корректированных основных цветах RGB.
Подотсчет цветности является практикой кодирования изображений, реализующей меньшую разрешающую способность для информации о цветности, чем для информации о яркости, получая преимущества более низкой разрешающей способности, свойственной визуальной системе человека для различия цветов, чем для яркости.
2.1.1 Цветовой формат 4:4:4
Каждый из трёх компонентов Y'CbCr имеет одну и ту же частоту отсчетов, так что никакого подотсчета цветности не существует. Эта схема иногда используется Эта схема иногда используется в высокопроизводительных пленочных сканерах и при кинератографическом производстве сообщений.
2.1.2 Цветовой формат 4:2:2
Два компонента цветности выбираются с половинной частотой отсчетов яркости: разрешающая способность цветности по горизонтали является половинной. Это на треть уменьшает ширину полосы несжатого видеосигнала при небольшой визуальной разнице или при ее отсутствии.
2.1.3 Цветовой формат 4:2:0
В формате 4:2:0 горизонтальный отсчет удваивается по сравнению с форматом 4:1:1, но поскольку отсчет по каналам Cb и Cr в этой схеме делается только на каждой из чередующихся строк, разрешающая способность по вертикали является половинной. Частота передачи данных, таким образом, является той же самой. Для каждого из Cb и Cr подотсчет делается с коэффициентом 2 как по горизонтали, так и по вертикали. Существуют три варианта схем 4:2:0, имеющих различное расположение по горизонтали и по вертикали.
В MPEG-2, Cb и Cr размещаются совместно горизонтально. Cb и Cr размещаются между пикселями в вертикальном направлении (расположенными в порядке следования).
В JPEG/JFIF, H.261 и MPEG-1, Cb и Cr располагаются в порядке следования, на полпути между альтернативными отсчетами яркости.
В 4:2:0 DV, Cb и Cr являются совместно размещёнными в горизонтальном направлении. В вертикальном направлении они являются совместно размещёнными на чередующихся строках.
2.2 Различные видеоблоки
Изображение делится на одну или более строк плиток и один или более столбцов плиток. Плитка является последовательностью блоков CTU, которая покрывает прямоугольную область изображения.
Плитка делится на один или более бриков, каждый из которых состоит из множества строк CTU внутри плитки.
Плитка, которая не делится на множество бриков также упоминается как брик. Однако брик, который является действительным поднабором плитки, не рассматривается как плитка.
Секция содержит либо множество плиток изображения, либо множество бриков плитки.
Поддерживаются два режима секций, а именно, режим секций растрового сканирования и режим прямоугольных секций. В режиме секций растрового сканирования секция содержит последовательность плиток при растровом сканировании плиток изображения. В режиме прямоугольных секций секция содержит множество бриков изображения, которые все вместе формируют прямоугольную область изображения. Брики внутри прямоугольной секции следуют а порядке растрового сканирования бриков секции.
На фиг. 1 представлен пример разделения изображения на секции растрового сканирования, где изображение делится на 12 плиток и 3 секции растрового сканирования.
На фиг. 2 представлен пример деления изображения на прямоугольные секции, где изображение делится на 24 плитки (6 столбцов плиток и 4 строки плиток) и 9 прямоугольных секций.
На фиг. 3 показан пример изображения, разделенного на плитки, брики и прямоугольные секции, где изображение делится на 4 плитки (2 столбца плиток и 2 строки) 11 бриков (левая верхняя плитка содержит 1 брик, правая верхняя плитка содержит 5 бриков, левая нижняя плитка содержит 2 брика и правая нижняя плитка содержит. 3 брика) и 4 прямоугольных секции.
2.2.1 Размеры CTU/CTB
В стандарте VVC размер CTU, сообщаемый в SPS посредством элемента синтаксиса log2_ctu_size_minus2, может быть малым, таким как 4x4.
7.3.2.3 Синтаксис RBSP набора параметров последовательности
seq_parameter_set_rbsp( ) { Дескриптор
sps_decoding_parameter_set_id u(4)
sps_video_parameter_set_id u(4)
sps_max_sub_layers_minus1 u(3)
sps_reserved_zero_5bits u(5)
profile_tier_level( sps_max_sub_layers_minus1 )
gra_enabled_flag u(1)
sps_seq_parameter_set_id ue(v)
chroma_format_idc ue(v)
if( chroma_format_idc = = 3 )
separate_colour_plane_flag u(1)
pic_width_in_luma_samples ue(v)
pic_height_in_luma_samples ue(v)
conformance_window_flag u(1)
if( conformance_window_flag ) {
conf_win_left_offset ue(v)
conf_win_right_offset ue(v)
conf_win_top_offset ue(v)
conf_win_bottom_offset ue(v)
}
bit_depth_luma_minus8 ue(v)
bit_depth_chroma_minus8 ue(v)
log2_max_pic_order_cnt_lsb_minus4 ue(v)
sps_sub_layer_ordering_info_present_flag u(1)
for( i = ( sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1);
i <= sps_max_sub_layers_minus1; i++ ) {
sps_max_dec_pic_buffering_minus1[ i ] ue(v)
sps_max_num_reorder_pics[ i ] ue(v)
sps_max_latency_increase_plus1[ i ] ue(v)
}
long_term_ref_pics_flag u(1)
sps_idr_rpl_present_flag u(1)
rpl1_same_as_rpl0_flag u(1)
for( i = 0; i < !rpl1_same_as_rpl0_flag ? 2 : 1; i++ ) {
num_ref_pic_lists_in_sps[ i ] ue(v)
for( j = 0; j < num_ref_pic_lists_in_sps[ i ]; j++)
ref_pic_list_struct( i, j )
}
qtbtt_dual_tree_intra_flag u(1)
log2_ctu_size_minus2 ue(v)
log2_min_luma_coding_block_size_minus2 ue(v)
partition_constraints_override_enabled_flag u(1)
sps_log2_diff_min_qt_min_cb_intra_slice_luma ue(v)
sps_log2_diff_min_qt_min_cb_inter_slice ue(v)
sps_max_mtt_hierarchy_depth_inter_slice ue(v)
sps_max_mtt_hierarchy_depth_intra_slice_luma ue(v)
if( sps_max_mtt_hierarchy_depth_intra_slice_luma != 0 ) {
sps_log2_diff_max_bt_min_qt_intra_slice_luma ue(v)
sps_log2_diff_max_tt_min_qt_intra_slice_luma ue(v)
}
if( sps_max_mtt_hierarchy_depth_inter_slices != 0 ) {
sps_log2_diff_max_bt_min_qt_inter_slice ue(v)
sps_log2_diff_max_tt_min_qt_inter_slice ue(v)
}
if( qtbtt_dual_tree_intra_flag ) {
sps_log2_diff_min_qt_min_cb_intra_slice_chroma ue(v)
sps_max_mtt_hierarchy_depth_intra_slice_chroma ue(v)
if ( sps_max_mtt_hierarchy_depth_intra_slice_chroma != 0 ) {
sps_log2_diff_max_bt_min_qt_intra_slice_chroma ue(v)
sps_log2_diff_max_tt_min_qt_intra_slice_chroma ue(v)
}
}
rbsp_trailing_bits( )
}
log2_ctu_size_minus2 плюс 2 указывает размер блока дерева кодирования яркости для каждого CTU.
log2_min_luma_coding_block_size_minus2 плюс 2 указывает минимальный размер блока кодирования яркости.
Переменные CtbLog2SizeY, CtbSizeY, MinCbLog2SizeY, MinCbSizeY, MinTbLog2SizeY, MaxTbLog2SizeY, MinTbSizeY, MaxTbSizeY, PicWidthInCtbsY, PicHeightInCtbsY, PicSizeInCtbsY, PicWidthInMinCbsY, PicHeightInMinCbsY, PicSizeInMinCbsY, PicSizeInSamplesY, PicWidthInSamplesC и PicHeightInSamplesC получают следующим образом:
CtbLog2SizeY = log2_ctu_size_minus2 + 2 (7-9)
CtbSizeY = 1 << CtbLog2SizeY (7-10)
MinCbLog2SizeY = log2_min_luma_coding_block_size_minus2 + 2 (7-11)
MinCbSizeY = 1 << MinCbLog2SizeY (7-12)
MinTbLog2SizeY = 2 (7-13)
MaxTbLog2SizeY = 6 (7-14)
MinTbSizeY = 1 << MinTbLog2SizeY (7-15)
MaxTbSizeY = 1 << MaxTbLog2SizeY (7-16)
PicWidthInCtbsY = Ceil( pic_width_in_luma_samples ÷ CtbSizeY ) (7-17)
PicHeightInCtbsY = Ceil( pic_height_in_luma_samples ч CtbSizeY ) (7-18)
PicSizeInCtbsY = PicWidthInCtbsY * PicHeightInCtbsY (7-19)
PicWidthInMinCbsY = pic_width_in_luma_samples / MinCbSizeY (7-20)
PicHeightInMinCbsY = pic_height_in_luma_samples / MinCbSizeY (7-21)
PicSizeInMinCbsY = PicWidthInMinCbsY * PicHeightInMinCbsY (7-22)
PicSizeInSamplesY=pic_width_in_luma_samples * pic_height_in_luma_samples (7-23)
PicWidthInSamplesC = pic_width_in_luma_samples / SubWidthC (7-24)
PicHeightInSamplesC = pic_height_in_luma_samples / SubHeightC (7-25)
2.2.2 CTU в изображении
Предположим, что размер CTB/LCU, указанный посредством M x N (обычно M равно N, как определено в HEVC/VVC), и для CTB, расположенного на границе изображении (или в плитке или секции или в других видах типов, граница изображения берется в качестве примера), K x L отсчетов находятся внутри границы изображения, где K < M или L< N. Для таких CTB, как показано на фиг. 4A-4C, размер CTB всё ещё остается равным MxN, однако, нижняя граница/правая граница CTB находится вне изображения.
На фиг. 4A показаны CTB, пересекающие нижнюю границу изображения. На фиг. 4B показаны CTB, пересекающие правую границу изображения. На фиг. 4C показаны CTB, пересекающие правую нижнюю границу изображения.
На фиг. 4A-4C показаны примеры CTB, пересекающих границы изображения, (a) K=M, L<N; (b) K<M, L=N; (c) K<M, L<N
2.3 Поток кодирования типичного видеокодека
На фиг. 5 показан пример блок-схемы кодера VVC, содержащего три блока внутриконтурной фильтрации: деблокирующий фильтр (deblocking filter, DF), адаптивное смещение отсчета (sample adaptive offset, SAO) и ALF. В отличие от DF, который использует заданные фильтры, SAO и ALF используют оригинальные отсчеты текущего изображения, чтобы уменьшить среднеквадратичную ошибку между оригинальными отсчетами и реконструированным отсчетами, добавляя смещение и применяя фильтр конечной импульсной реакции (finite impulse response, FIR), соответственно, с кодированной вспомогательной информацией, сообщающей смещения и коэффициенты фильтра. ALF располагается на последнем этапе обработки каждого изображения и может рассматриваться как инструмент, пытающийся захватить и закрепить артефакты, созданные на предыдущих этапах.
2.4 Деблокирующий фильтр (Deblocking filter, DB)
Входными сигналами для DB являются реконструированные отсчеты перед внутриконтурными фильтрами.
Вертикальные края в изображении фильтруются первыми. Затем фильтруются горизонтальные края с отсчетами, модифицированными посредством процесса фильтрации вертикальных краев в качестве входного сигнала. Вертикальные и горизонтальные края CTB для каждого из CTU обрабатываются отдельно на основе блока кодирования. Вертикальные края блоков кодирования в блоке кодирования фильтруются, начиная с края на левой стороне блоков кодирования, продолжая через края в направлении правой стороны блоков кодирования в их геометрическом порядке. Горизонтальные края блоков кодирования в блоке кодирования фильтруются, начиная с края, находящегося наверху блоков кодирования, и продолжая, переекая края в направлении нижней границы блоков кодирования в их геометрическом порядке.
На фиг. 6 показаны отсчеты изображения и горизонтальные и вертикальные границы блоков на сетке 8×8 и неперекрывающиеся блоки из отсчетов 8×8, которые могут деблокироваться паралелльно.
2.4.1. Граничное решение
Фильтрация применяется к границам блоков 8x8. Кроме того, это должна быть граница блока преобразования или граница субблока кодирования (например, благодаря использованию аффинного предсказания движения (Affine motion prediction, ATMVP). Для тех границ, которые не являются такими границами, фильтр отключается.
2.4.1 Вычисление прочности границы
Для границы блока преобразования/границы субблока кодирования, если он расположен в сетке 8x8, он может фильтроваться и установка bS[ xDi ][ yDj ] (где [ xDi ][ yDj ] обозначает координату) для этого края определяется в таблице 1 и таблице 2, соответственно.
Таблица 1. Прочность границ (когда SPS IBC запрещен)
Приоритет Условия Y U V
5 По меньшей мере один из смежных блоков является внутренним. 2 2 2
4 Граница TU и по меньшей мере один из смежных блоков имеют ненулевые коэффициенты преобразования 1 1 1
3 Опорные изображения или количество MV (1 для однонаправленного предсказания, 2 для двунаправленного предсказания) смежных блоков различны. 1 N/A N/A
2 Абсолютная разность между векторами движения одного и того же опорного изображения, которое принадлежит смежным блокам, больше или равна единице. 1 N/A N/A
1 В противном случае 0 0 0
Таблица 2. Прочность границ (когда SPS IBC разрешен)
Приритет Условия Y U V
8 По меньшей мере один из смежных блоков является внутренним 2 2 2
7 Граница TU и по меньшей мере один из смежных блоков имеют ненулевые коэффициенты преобразования. 1 1 1
6 Режим предсказания смежных блоков различен (например, один - IBC, один - межблочный) 1
5 Оба, IBC и абсолютная разность между векторами движения, которые принадлежат смежным блокам, больше или равны одному целочисленному отсчету яркости 1 N/A N/A
4 Опорные изображения или количество MV (1 для однонаправленного предсказания, 2 для двунаправленного предсказания) смежных блоков различны. 1 N/A N/A
3 Абсолютная разность между векторами движения одного и того же опорного изображения, которые принадлежат смежным блокам, больше или равна одному целочисленному отсчету яркости. 1 N/A N/A
1 В противном случае 0 0 0
2.4.3 Решение по деблокированию для компонента яркости
В этом подразделе описывается процесс принятия решения по деблокированию.
На фиг. 7 представлены примеры пикселей, участвующих в принятии решения о включении/выключении фильтра и выборе сильного/слабого фильтра.
Более широкий/сильный фильтр яркости является фильтром, который используется, только если все условия Condition1, Condition2 и Condition 3 являются TRUE (истинными).
Условие 1 является "условием большого блока" (“large block condition”). Это условие определяет, принадлежат ли отсчеты на P-стороне и на Q-стороне к большим блокам, которые представляются переменными bSidePisLargeBlk и bSideQisLargeBlk, соответственно. bSidePisLargeBlk и bSideQisLargeBlk определяются нижеследующим образом.
bSidePisLargeBlk = ((тип края является вертикальным и p0 принадлежит CU с шириной >= 32) | | (тип края является горизонтальным и p0 принадлежит CU с высотой >= 32))? TRUE: FALSE
bSideQisLargeBlk = ((тип края является вертикальным и q0 принадлежит CU с шириной >= 32) | | (тип края является горизонтальным и q0 принадлежит CU с высотой >= 32))? TRUE: FALSE
Основываясь на bSidePisLargeBlk и bSideQisLargeBlk, условие 1 определяется следующим образом.
Condition1 = (bSidePisLargeBlk || bSidePisLargeBlk) ? TRUE: FALSE
Далее, если условие 1 действительно, дополнительно должно быть проверено условие 2. Сначала получают следующие переменные:
- dp0, dp3, dq0, dq3 получают первыми, как в HEVC
- если (сторона p больше или равна 32)
dp0 = ( dp0 + Abs( p50 − 2 * p40 + p30 ) + 1 ) >> 1
dp3 = ( dp3 + Abs( p53 − 2 * p43 + p33 ) + 1 ) >> 1
- если (сторона q больше или равна 32)
dq0 = ( dq0 + Abs( q50 − 2 * q40 + q30 ) + 1 ) >> 1
dq3 = ( dq3 + Abs( q53 − 2 * q43 + q33 ) + 1 ) >> 1
Condition2 = (d < β) ? TRUE: FALSE
где d= dp0 + dq0 + dp3 + dq3.
Если Condition1 и Condition2 действительны, независимо от того, используют ли блоки какие-либо субблоки, дополнительно проверяются:
If (bSidePisLargeBlk)
{
If (mode block P == SUBBLOCKMODE)
Sp =5
else
Sp =7
}
else
Sp = 3
If (bSideQisLargeBlk)
{
If (mode block Q == SUBBLOCKMODE)
Sq =5
else
Sq =7
}
else
Sq = 3
Наконец, если оба условия, Condition 1 и Condition 2, действительны, предложенный способ деблокирования будет проверять условие 3 (условие сильного фильтра для большого блока), которое проверяется следующим образом.
В условии 3 Condition3 StrongFilterCondition, получают следующие переменные:
dpq определяется как в HEVC.
sp3 = Abs( p3 − p0 ), определяется как в HEVC
если (сторона p side больше или равна 32)
if(Sp==5)
sp3 = ( sp3 + Abs( p5 − p3 ) + 1) >> 1
else
sp3 = ( sp3 + Abs( p7 − p3 ) + 1) >> 1
sq3 = Abs( q0 − q3 ), получают как в HEVC
если ( сторона q больше или равна 32)
If(Sq==5)
sq3 = ( sq3 + Abs( q5 − q3 ) + 1) >> 1
else
sq3 = ( sq3 + Abs( q7 − q3 ) + 1) >> 1
Как в HEVC, StrongFilterCondition = (dpq меньше, чем ( β >> 2 ), sp3 + sq3 меньше чем ( 3*β >> 5 ), и Abs( p0 − q0 ) меньше, чем ( 5 * tC + 1 ) >> 1) ? TRUE : FALSE.
2.4.4 Более сильный деблокирующий фильтр для яркости (предназначен для больших блоков)
Билинейный фильтр используется, когда Отсчеты с любой из сторон границы принадлежат большому блоку. Отсчет, принадлежащий большому блоку, определяется как таковой, когда ширина >= 32 для вертикального края и когда высота >= 32 для горизонтального края.
Билинейный фильтр представляется ниже.
Отсчеты pi границы блока для i=0 - Sp-1 и qi для j=0 - Sq-1 (pi и qi являются i-ым отсчетом внутри строки для фильтрации вертикального края или i-ым отсчетом внутри столбца для фильтрации горизонтального края) при деблокировании HEVC, описанном выше) затем заменяются линейной интерполяцией следующим образом:
где термин и является позиционно зависимым сжатием, описанным в разделе 2.4.7 и , , , и задаются ниже.
2.4.5 Управление деблокировании для цветности
Сильные фильтры для цветности используются по обеим сторонам границы блока. Здесь фильтр цветности выбирается, когда обе стороны края цветности больше или равны 8 (позиция цветности), и удовлетворяется нижеследующее решение с тремя условиями. Первое условие предназначено для определения прочности границ, а также большого блока. Предложенный фильтр может применяться, когда ширина или высота блока, который ортогонально пересекает край блока, равна или больше 8 в домене отсчетов цветности. Второе и третье условия являются, главным образом, такими же как для решения о деблокировании для яркости согласно HEVC и которые являются решением о включении/выключении и решением о сильном фильтре, соответственно.
В первом решении прочность границы (boundary strength, bS) модифицируется для фильтрации цветности и условия проверяются последовательно. Если условие удовлетворяется, то остальные условия с более низкими приоритетами пропускаются.
Деблокировании цветности выполняется, когда bS равно 2 или когда bS равно 1, если обнаруживается большой блок.
Второе и третье условия являются, главным образом, такими же, как решение для сильного фильтра яркости HEVC, как показано ниже.
Во втором условии:
d затем получают как при деблокировании яркости по HEVC.
Второе условие будет TRUE, когда d меньше β.
В третьем условии StrongFilterCondition получают следующим образом:
dpq получают как в HEVC.
sp3 = Abs (p3 − p0), получают как в HEVC
sq3 = Abs (q0 − q3), получают как в HEVC
Как в проекте HEVC, StrongFilterCondition = (dpq меньше, чем (β>> 2), sp3 +, sq3 меньше, чем (β>> 3), и Abs (p0 − q0) меньше, чем (5 * tC + 1)>> 1)
2.4.6 Сильный фильтр деблокирования для цветности
Нижеследующий сильный фильтр деблокирования для цветности определяется следующим образом:
p2’ = (3*p3+2*p2+p1+p0+q0+4)>> 3
p1’ = (2*p3+p2+2*p1+p0+q0+q1+4)>> 3
p0’ = (p3+p2+p1+2*p0+q0+q1+q2+4)>> 3
Предложенный фильтр цветности выполняет деблокирование на сетке отсчетов цветности 4x4.
2.4.7 Сжатие, зависящее от положения
Сжатие tcPD, зависящее от положения, применяется к выходным отсчетов процесса фильтрации яркости, содержащего сильные и длинные фильтры, которые изменяют 7, 5 и 3 отсчетов на границе. Принимая распределение ошибок квантования, предложено увеличить значение сжатия для отсчетов, которые, как ожидают, будут иметь более высокий шум квантования, который, как ожидают, будет иметь более высокое отклонение реконструированного значения отсчета от действительного значения отсчета.
Для каждой границы P или Q, фильтруемой с помощью асимметричного фильтра, в зависимости от результата процесса принятия решений в разделе 2.4.2, таблица порогов в зависимости от положения выбирается из двух таблиц (например, Tc7 и Tc3, представленных ниже), которые предоставляются декодеру в качестве побочной информации:
Tc7 = {6, 5, 4, 3, 2, 1, 1}; Tc3 = {6, 4, 2};
tcPD = (SP == 3)? Tc3: Tc7;
tcQD = (Кв. == 3)? Tc3: Tc7;
Для границ P или Q, фильтруемых коротким симметричным фильтром, применяется порог, зависимый от положения, более низкого значения:
Tc3 = {3, 2, 1};
Следуя определению порога, фильтрованные значения отсчетов p’i и q’i сжимаются согласно значениям сжатия tcP и tcQ:
p ’’i = Clip3 (p’i + tcPi, p’i – tcPi, p’i);
q ’’j = Clip3 (q’j + tcQj, q’j – tcQ j, q’j);
где p’i и q’i - отфильтрованные значения отсчета, p’’i и q’’j – выходные значения отсчета после сжатия и tcPi tcPi пороги сжатия, которые получают из параметра tc VVC и tcPD и tcQD. Функция Clip3 является функцией сжатия, как она определена в VVC.
2.4.8 Корректировка деблокирования субблока
Чтобы разрешить параллельное полезное деблокирование, используя одновременно как длинные фильтры, так и деблокирование субблока, длинные фильтры ограничиваются, чтобы изменить самое большее 5 отсчетов на стороне, которая использует деблокирование субблока (AFFINE или ATMVP или DMVR), как показано в управлении яркостью для длинных фильтров. Кроме того, деблокирование субблока корректируется таким образом, что границы субблока на сетке 8x8, которые близки к CU или неявной границе TU, ограничиваются для изменения самое большее двух отсчетов на каждой стороне.
Нижеследующее относится к границам субблока, которые не выровнены с границей CU.
If (mode block Q == SUBBLOCKMODE && edge !=0) {
if (!(implicitTU && (edge == (64 / 4))))
if (edge == 2 || edge == (orthogonalLength - 2) || edge == (56 / 4) || edge == (72 / 4))
Sp = Sq = 2;
else
Sp = Sq = 3;
else
Sp = Sq = bSideQisLargeBlk ? 5:3
}
Когда край, равный 0, соответствует границе CU, край, равный 2 или равный orthogonalLength-2, соответствует границе субблока 8 отсчетов из границы CU и т. д. При этом, неявный TU истинен, если используется неявное разбиение TU.
2.5 SAO
Входными данными SAO являются реконструированные отсчеты после DB. Концепция SAO остоит в уменьшении среднего искажения отсчета области путем первой классификации отсчетов области в нескольких категориях с выбранным классификатором, получение смещения для каждой категории и затем добавление смещения к каждому отсчету категории, где индекс классификатора и смещения области кодируются в битовом потоке. В HEVC и VVC область (единица для сигнализации параметров SAO) определяется так, чтобы быть CTU.
В HEVC приняты два типа SAO, которые могут удовлетворить требованиям низкой сложности. Этими двумя типами являются смещение края (edge offset, EO) и смещение полосы (band offset, BO), которые далее обсуждаются более подробно. Индекс типа SAO кодируется (он находится в диапазоне [0, 2]). Для EO классификация отсчетов основана на сравнении между текущими отсчетами и соседними отсчетами, соответствующими одномерным направленным моделям: горизонтальная, вертикальная, диагональная под углом на 135° и диагональная под углом 45°.
На фиг. 8 показаны четыре одномерных направленных модели для классификации отсчетов EO: горизонтальная (класс EO = 0), вертикальная (класс EO = 1), диагональ под углом 135° (класс EO = 2) и диагональная под углом 45° (класс EO = 3)
Для данного класса EO каждый отсчет внутри CTB классифицируется как одна из пяти категорий. Значение текущему отсчету, обозначенному как “c”, сравнивается с его двумя соседями вдоль выбранной одномерной модели. Правила классификации для каждого отсчета приводятся в таблице I. Категории 1 и 4 связаны с локальным провалом и локальным пиком вдоль выбранной одномерной модели, соответственно. Категории 2 и 3 связаны с вогнутым и выпуклам углами вдоль выбранной одномерной модели, соответственно. Если текущий отсчет не принадлежит категориям 1-4 EO, то это категория 0 и SAO не применяется.
Таблица 3: Правила классификации отсчетов для смещения края
Категория Условие
1 c<a и c<b
2 ( c < a && c==b) ||(c == a && c < b)
3 ( c > a && c==b) ||(c == a && c > b)
4 c > a && c > b
5 Ни одно из приведенных
2.6 Адаптивный контурный фильтр, основанный на преобразовании геометрии
Входными данными для DB являются реконструированные отсчеты после DB и SAO. Классификация отсчетов и процесс фильтрации основаны на реконструированных отсчетах после DB и SAO.
В некоторых вариантах осуществления применяется адаптивный контурный фильтр, основанный на преобразовании геометрии (geometry transformation-based adaptive loop filter, GALF). Для компонента яркости выбирают один из 25 фильтров для каждого блока 2×2, основываясь на направлении и действии локальных градиентов.
2.6.1 Форма фильтра
В некоторых вариантах осуществления для компонента яркости могут быть выбраны до трех ромбовидных форм фильтра (как показано на фиг. 9). Индекс сообщается на уровне изображения для указания формы фильтра, используемого для компонента яркости. Каждый квадрат представляет отсчет и Ci (i, равное 0~6 (слева), 0~12 (середина), 0~20 (справа)) обозначает коэффициент, который должен применяться к отсчету. Для компонентов цветности в изображении всегда используется ромбовидная форма 5×5.
2.6.1.1 Классификация блоков
Каждый блок 2х2 категоризируется в один из 25 классов. Индекс C классификации получают, основываясь на направленности D и квантованного значения действия А , следующим образом:
C = 5D + А . (1)
Для вычисления D и А сначала вычисляют градиенты горизонтального, вертикального и двух диагональных направлений, используя одномерный лапласиан:
((2)
((3)
((4)
((5)
Индексы i и j относятся к координатам верхнему левому отсчету в блоке 2 х 2 , и R(i, j) указывает реконструированный отсчет в координатах (i, j).
Затем максимальные и минимальные значения D градиентов горизонтальных и вертикальных направлений устанавливаются следующим образом:
, , ((6)
и максимальные и минимальные значения градиента двух диагональных направлений устанавливаются следующим образом:
, , (7) (
Для получения значения направленности D эти значения сравниваются друг с другом и с двумя порогами t1 и t2:
Этап 1. Если и оба истинны, D устанавливают равным 0.
Этап 2. Если , продолжают с этапа 3; в противном случае, продолжают с этапа 4.
Этап 3. Если , D устанавливают равным 2; в противном случае, D устанавливают равным 1.
Этап 4. Если , D устанавливают равным 4; в противном случае, D устанавливают равным 3.
Значение действия А вычисляется как:
(8)
А дополнительно квантуется в диапазоне от 0 до 4, включительно, и квантованное значение обозначено как А .
Для обоих компонентов цветности в изображении никакой способ классификации не применяется, например, к каждому компоненту цветности применяется единый набор коэффициентов ALF.
2.6.1.2 Геометрические преобразования коэффициентов фильтра
На фиг. 10 показан относительный координатор для ромбовидного фильтра 5×5 ромбовидная поддержка фильтра: левый: диагональный; центр: вертикальное зеркальное отражение, правый: вращение.
Прежде чем фильтровать каждый блок 2×2, геометрические преобразования, такие как вращение или диагональное и вертикальное зеркальное отражение, применяется к коэффициентам f(k,l) фильтра, который связан с координатой (k, l), в зависимости от значений градиента, вычисленных для того блока. Это эквивалентно применению этих преобразований к отсчетам в области поддержки фильтра. Идея состоит в том, чтобы сделать различные блоки, к которым применяется ALF, более схожими путем выравнивания их направленности.
Представлены три геометрических преобразования, включая диагональное, вертикальное зеркальное отражение и вращение:
Диагональное: fD(k,l) = f(l,k)
Вертикальное зеркальное отражение: fV(k,l) = f(k, K – l - 1)
Вращение: fR(k,l) = f(K – l – 1, k) (9)
где K размер фильтра и 0 ≤ k, l ≤ K-1 являются координатами коэффициентов, такими, что местоположение (0, 0) в левом верхнем углу, и местоположение (K – 1, K – 1) в правом нижнем углу. Преобразования применяется ся к коэффициентам фильтра f (k, l) в зависимости от значений градиента, вычисленных для этого блока. Соотношения между преобразованием и четырьмя градиентами четырех направлений обобщены в таблице 4. На фиг. 9 показаны преобразованные коэффициенты для каждого положения на основе ромба 5x5.
Таблица 4: Отображение градиента, вычисленного для одного блока и преобразований
Значения градиента Преобразование
gd2 < gd1 and gh < gv Нет преобразования
gd2 < gd1 and gv < gh Диагональное
gd1 < gd2 and gh < gv Вертикальное зеркальное отражение
gd1 < gd2 and gv < gh Вращение
2.6.1.3 Сигнализация параметров фильтра
В некоторых вариантах осуществления параметры фильтра GALF сигнализируются для первого CTU, например, после заголовка секции и перед параметрами SAO первого CTU. Может сообщаться до 25 наборов коэффициентов фильтра яркости. Для сокращения количества служебных битов коэффициенты фильтра с различной классификацией могут объединяться. Кроме того, коэффициенты GALF опорных изображений хранятся и разрешаются для их повторного использования в качестве коэффициентов GALF текущего изображения. Текущее изображение может принять решение использовать коэффициенты GALF, хранящиеся для опорных изображений, и обойти сигнализацию коэффициентов GALF. В этом случае индекс сигнализируется только одному из опорных изображений и хранящиеся коэффициенты GALF указанного опорного изображения используются затем для текущего изображения.
Для поддержки временного предсказания GALF ведется список кандидатов наборов фильтра GALF. В начале декодирования новой последовательности список кандидатов пуст. После декодирования одного изображения к списку кандидатов может быть добавлен соответствующий набор фильтров. Как только размер списка кандидатов достигает максимально допустимого значения (например, 6), новый набор фильтров перезаписывает самый старый набор в порядке декодирования и, то есть, правило "первым пришел - первым вышел" (first-in-first-out, FIFO) применяется для обновления списка кандидатов. Для предотвращения дублирований набор может добавляться к списку, только когда соответствующее изображение не использует временное предсказание GALF. Для поддержки временной масштабируемости существует множество списков кандидатов наборов фильтров и каждый список кандидатов связан с временным уровнем. Более конкретно, каждый массив, назначенный индексом временного уровня (TempIdx), может содержать наборы фильтров ранее декодированных изображений с равным-меньшим TempIdx. Например, k-ый массив назначается для связи с TempIdx, равным k, и он содержит только наборы фильтра из изображений с TempIdx, меньшим или равным k. После кодирования определенного изображения наборы фильтров, связанные с изображением, будут использоваться для обновления этих массивов, связанных с равным или более высоким TempIdx.
Временное предсказание коэффициентов GALF используется для межкадрово кодированных кадров, чтобы минимизировать служебную сигнализацию. Для внутрикадрово кодированных кадров временное предсказание недоступно и каждому классу назначается набор из 16 фиксированных фильтров. Для указания использования фиксированного фильтра сигнализируется флаг для каждого класса сообщен и, при необходимости, индекс выбранного фиксированного фильтра. Даже когда для данного класса выбирается фиксированный фильтр, коэффициенты адаптивного фильтра f(k, l) могут все еще быть посланы для этого класса и в этом случае коэффициенты фильтра, который будет применяться к реконструированному изображению, являются суммой обоих наборов коэффициентов.
Процесс фильтрации компонента яркости может управляться на уровне CU. Сигнализируется флаг, чтобы указать, применяется ли GALF к компоненту яркости CU. Для компонента цветности, применяется ли GALF, указывается только на уровне изображения.
2.6.1.4 Процесс фильтрации
На стороне декодера, когда GALF разрешен для блока, каждый отсчет R(i, j) внутри блока фильтруется, приводя в результате к значению R’(i, j) отсчета, как показано ниже, где L обозначает длину фильтра, fm,n представляет коэффициент фильтра и f(k, l) обозначает декодированные коэффициенты фильтра.
(10)
На фиг. 11 показан пример относительных координат, используемых для поддержки ромбовидного фильтра 5х5, предполагающего координату текущего отсчета (i, j) равной (0, 0). Отсчеты в различных координатах, заполненные одним и тем же цветом, умножаются с теми же самыми коэффициентами фильтра.
2.7 Адаптивный контурный фильтр (GALF), основанный на преобразовании геометрии
2.7.1 Пример GALF
В некоторых вариантах осуществления процессе фильтрации адаптивного контурного фильтра выполняется следующим образом:
, (11)
где отсчеты I(x + i,y + j) – входные отсчеты, O(x, y) - отфильтрованный выходной отсчет (например, результат действия фильтра) и w(i, j) - коэффициенты фильтра. На практике в VTM4.0 это реализуется, используя целочисленную арифметику для вычислений точности с фиксированной запятой:
(12)
где L - длина фильтра, и где w(i, j) - коэффициенты фильтра в точности с фиксированной запятой.
(1) Форма адаптивного фильтра удаляется. Для компонента яркости разрешается только форма фильтра 7х7 и форма фильтра 5х5 разрешается для компонента цветности.
(2) Сигнализация параметров ALF удаляется из уровня секции/изображения на уровень CTU.
(3) Вычисление индекса класса выполняется на уровне 4x4 вместо 2x2. Кроме того, в некоторых вариантах осуществления для классификации ALF используется способ вычисления лапласиана на основе суботсчетов. Более конкретно, нет необходимости вычислять горизонтальный/вертикальный/диагональный с углом 45 градусов/диагональный с углом 135 градусов для каждого отсчета внутри одного блока. Вместо этого используется подотсчет 1:2.
На фиг. 12A-12D показано вычисление лапласиана на основе суботсчетов для CE2.6.2. На фиг. 12 A показаны подотсчетные положения для вертикального градиента, на фиг. 12 показаны подотсчетные положения для горизонтального градиента, на фиг. 12С показаны подотсчетные положения для диагонального градиента и на фиг. 12D показаны подотсчетные положения для диагонального градиента.
2.8 Нелинейный ALF
2.8.1 Переформулирование фильтрации
Уравнение (11), не влияя на эффективность кодирования, может быть переформулировано в следующем выражении:
, (13)
где w(i, j) - те же самые коэффициенты фильтра, что и в уравнении (11) [исключено w(0, 0), который равен 1 в уравнении (13), в то время как в уравнении (11) он равен ].
Используя эту приведенную выше формулу (13) для фильтра, VVC вводит нелинейность для более эффективного создания ALF, используя простую функцию сжатия для уменьшения влияния значений (I(x + i, y + j)) соседних отсчетов, когда они значительно отличаются от текущего значения (I(x, y)) фильтруемого отсчета.
Более конкретно, фильтр ALF изменяется следующим образом:
, (14)
где - функция сжатия и k(i, j) – параметры сжатия, которые зависят от (i, j) коэффициента фильтра. Кодер выполняет оптимизацию для нахождения наилучшего k(i, j).
В некоторых вариантах осуществления параметры k(i, j) сжатия определяются для каждого фильтра ALF, одно значение сжатия сообщено для каждого коэффициента фильтра. Это означает, что в битовом потоке фильтра яркости может сообщаться до 12 значений сжатия и до 6 значений сжатия могут сообщаться для фильтра цветности.
Для ограничения сложности кодера и затрат на сигнализацию используются только 4 фиксированных значения, которые являются одинаковыми для секций INTER и INTRA.
Поскольку разброс локальных различий часто бывает выше для яркости, чем для цветности, применяется ся два различных набора для фильтров яркости (Luma) и цветности (Chroma). Максимальное значение отсчета (здесь 1024 для битовой глубины 10 битов) в каждом наборе также вводится, так чтобы сжатие могло быть запрещено, если в нем нет необходимости.
Наборы значений сжатия, используемые в некоторых вариантах осуществления, представляются в таблице 5. 4 значения были выбраны путем примерно одинакового разбиения в логарифмической области всего диапазона значений отсчетов (кодированных 10 битами) для яркости и диапазона от 4 до 1024 для цветности.
Более точно таблица значений сжатия для яркости была получена по следующей формуле:
AlfClipL с M=210 и N=4. (15)
Аналогично, таблицы значения сжатия для цветности получены в соответствии со следующей формулой:
AlfClipC с M=210, N=4 и A=4. (16)
Таблица 5: Разрешенные значения сжатия
Группа плиток INTRA/INTER
LUMA { 1024, 181, 32, 6 }
CHROMA { 1024, 161, 25, 4 }
Выбранные значения сжатия кодируются в элементе синтаксиса “alf_data”, используя схему кодирования Голомба, соответствующую индексу значения сжатия в приведенной выше таблице 5. Эта схема кодирования совпадает со схемой кодирования для индекса фильтра.
2.9 Виртуальная граница
В аппаратных средствах и встроенном программном обеспечении, обработка, основанная на изображении, практически недопустима из-за ее высокого требования к буферу изображения. Использование буферов изображений на микросхемах буферы является очень дорогостоящим, а использование буферов изображения не на микросхемах значительно усложняет доступ к внешней памяти, увеличивает потребляемую мощность и задержку доступа к данным. Поэтому в реальных изделиях DF, SAO и ALF будут уходить от использования, основанного на микросхемах, к декодированию, основанному на LCU. Когда для DF, SAO и ALF используется обработка, основанная на LCU, весь процесс декодирования может быть выполнен LCU посредством LCU в режиме растрового сканирования с LCU-конвейерной обработкой для параллельной обработки многочисленных LCU. В этом случае для DF, SAO и ALF требуются строчные буферы, потому что обработка одной строки LCU требует пикселей из вышестоящей строки LCU. Если используются строчные буферы, выполненные с навесным монтажем (например, DRAM), ширина полосы внешней памяти и потребляемая мощность будут увеличиваться; если используются строчные буферы на микросхемах (например, SRAM), площадь микросхемы будет увеличиваться. Поэтому, хотя строчные буферы уже намного меньше, чем буферы изображения, все же остается желательным уменьшать строчные буферы.
В некоторых вариантах осуществления, как показано на фиг. 13, общее количество требующихся строчных буферов равно 11,25 строк для компонента яркости Luma. Объяснение требования к количество буферных строк является следующим: деблокирование горизонтального края, перекрывающегося с краем CTU, не может быть выполнено, поскольку решения и фильтрация требуют строк K, L, M, M из первого CTU и строк O, P из нижнего CTU. Поэтому деблокирование горизонтальных краев, перекрывающихся с границей CTU, откладывается до появления более низкого CTU. Поэтому для строк K, L, M, N реконструированные отсчеты яркости должны запоминаться в строчном буфере (4 строки). Затем фильтрация SAO может быть выполнена для строк от А до J. Строка J может быть SAO-фильтрованной, поскольку деблокирование не изменяет отсчеты в строке K. Для SAO-фильтрации строки K решение о классификации смещения края хранится только в строчном буфере (который составляет 0,25 строк Luma). Фильтрация ALF может быть выполнена только для строк A-F. Как показано на фиг. 13, классификация ALF выполняется для каждого блока 4 x 4. Каждая классификация блоков 4 x 4 требует окна действия размером 8 x 8, которое, в свою очередь, нуждается в окне 9 x 9 для вычисления одномерного лапласиана для определения градиента.
Поэтому для классификации блока 4 x 4, перекрывающегося со строками G, H, I, J требуются SAO-фильтрованные отсчеты ниже виртуальной границы. Кроме того, для классификации ALF требуются SAO-фильтрованные отсчеты строк D, E, F. Более того, для ALF-фильтрации строки G необходимы три SAO фильтрованные строки D, E, F от числа перечисленных выше строк. Поэтому общее требование к строчным буферам является следующим:
- Строки K-N (пиксели горизонтальной DF): 4 строки
- Строки D-J (SAO-фильтрованные пиксели): 7 строк
- Значения классификатора смещения края SAO между строкой J и строкой K: 0,25 строки
Поэтому общее количество требующихся строк яркости равно: 7 + 4 + 0,25 = 11,25.
Аналогично требование к строчному буферу компонента цветности Chroma показано на фиг. 14. Требование к буферным строкам для компонента цветности оценивается как равное 6,25 строкам.
Для устранения требований SAO и ALF к буферным строкам, в последнем VVC вводится концепция виртуальной границы (virtual boundary, VB). Как показано на фиг. 13, VB являются направленными вверх смещенными на N пикселей горизонтальными границами LCU. Для каждого LCU SAO и ALF могут обрабатыать пиксели выше VB перед тем, как поступает нижний LCU, но не могут обрабатывать пиксели ниже VB до тех пор, пока не поступит нижний LCU, который вызывается посредством DF. С учетом стоимости аппаратной реализации, пространство между предложенным VB и горизонтальной границей LCU устанавливается как четыре пикселя для яркости (например, N=4 на фиг. 13) и два пикселя для цветности (например, N=2 на фиг. 9).
2.9.1 Модифицированная классификация блоков ALF, когда размер N для VB равен 4
На фиг. 15A-15B показана модифицированная классификация блоков для случая, когда виртуальная граница находится на 4 строки выше границы CTU (N = 4). Как показано на фиг. 15A, для блока 4 x 4, начинающегося в строке G, классификация блоков использует только строки от E до J. Однако вычисление лапласиана для градиента отсчета, принадлежащего строке J, требует еще одной строки, находящейся ниже (строка K). Поэтому строка K заполняется строкой J.
Аналогично, как показано на фиг. 15B, для блока 4 x 4, начинающегося на строке K, классификация блоков использует только строки от K до P. Однако вычисление лапласиана градиента для отсчетов, принадлежащих строке K, требует еще одной строки, находящейся выше (строка J). Поэтому строка J заополняется строкой K.
2.9.2 Двухстороннее заполнение отсчетов, пересекающих виртуальные границы
Как показано на фиг. 16A-16C, усеченная версия фильтров используется для фильтрации отсчетов яркости, принадлежащих строкам, находящимся вблизи виртуальных границ. Принимая фиг. 16A в качестве примера, при фильтрации строки M, как показано на фиг. 13, например, центральный отсчет ромбовидной поддержки 7x7 находится на строке M и это требует доступа к одной строке выше VB (обозначенной жирной линией). В этом случае, отсчет выше VB копируется с правого нижнего отсчета ниже VB, такой как отсчет P0, обозначенный сплошной линией, и копируется в положение, указанное выше пунктиром. Симметрично, отсчет P3, обозначенный сплошной линией, также копируется в правое нижнее обозначенное пунктиром положение, даже когда отсчет для этого положения доступен. Скопированные отсчеты используются только в процессе фильтрации яркости.
Способ заполнения, используемый для виртуальных границ ALF, может быть обозначен как "двухстороннее заполнение", в котором, если один отсчет, расположенный в (i, j) (например, P0A, обозначенная пунктирной линией на фиг. 16B), заполняется, то тогда соответствующий отсчет, расположенный в (m, n) (например, P3B, обозначенная штриховой линией на фиг. 16B), которая совместно использует тот же самый коэффициент фильтра, также заполняется, даже когда отсчет доступен, как показано на фиг. 16A-16C и фиг. 17A-17B. На фиг. 16A-16C показана поддержка ромбовидного фильтра 7x7, центром является текущий отсчет, который должен быть фильтрован. На фиг. 16A показана одна требуемая строка выше/ниже VB, которая должна быть заполнена. На фиг. 16B показаны 2 требуемые строки выше/ниже VB, которые должны быть заполнены. На фиг. 16C показаны 3 требуемые строки выше/ниже VB, которые должны быть заполнены.
Аналогично, как показано на фиг. 17A-17B, способ двухстороннего заполнения также используется для фильтрации ALF цветности. На фиг. 17A-17B показана модифицированная фильтрация ALF цветности на виртуальной границе (поддержка ромбовидного фильтра 5х5, центром является текущий отсчет, который должен фильтроваться). На фиг. 17A показана 1 требуемая строка выше/ниже VB, которая должна заполняться. На фиг. 17B показаны 2 требуемые строки выше/ниже VB, которые должны заполняться.
2.9.3 Альтернативный способ реализации двухстороннего заполнения, когда нелинейный ALF запрещен
Когда для CTB нелинейный ALF отключен, например, параметры k(i, j) сжатия в уравнении (14) равны (1 <<Битовая глубина), процесс заполнения может быть заменен модификацией коэффициентов фильтра (иначе называемых модифицированными коэффициентами, основанными на ALF, (modified-coeff based ALF, MALF). Например, при фильтрации отсчетов в строке L/I, коэффициент c5 фильтра изменяется на c5’, в этом случае нет никакой необходимости копировать отсчеты яркости из обозначенной сплошной линией P0A в обозначенную штриховой линией P0A и обозначенную сплошной линией P3В в обозначенную штриховой линией P3В на фиг. 18A. В этом случае двухстороннее заполнение и MALF будут формировать одинаковые результаты, предполагая, что текущий отсчет, который должен фильтроваться, расположен в (x, y).
(17)
поскольку K (d, b) = d и I(x – 1, y – 1) = I(x – 1, y – 2) из-за заполнения.
Однако, когда нелинейный ALF включен, MALF и двухстороннее заполнение могут формировать различные результаты фильтрации, так как нелинейные параметры связаны с каждым коэффициентом, например, коэффициенты фильтра c5 и c1, параметры сжатия отличаются. Поэтому
(18)
поскольку K (d, b)! = d, даже = из-за заполнения.
2.10 Спецификация фильтрации ALF
Недавно добавленные части обозначаются в тексте жирным, выделенным курсивом, подчеркнутым шрифтом. Удаленные части указываются, обозначаютсяиспользуя [[]].
7.3.2.4 Синтаксис RBSP набора параметров изображения
pic_parameter_set_rbsp( ) { Дескриптор
pps_pic_parameter_set_id ue(v)
pps_seq_parameter_set_id ue(v)
output_flag_present_flag u(1)
single_tile_in_pic_flag u(1)
if( !single_tile_in_pic_flag ) {
uniform_tile_spacing_flag u(1)
if( uniform_tile_spacing_flag ) {
tile_cols_width_minus1 ue(v)
tile_rows_height_minus1 ue(v)
} else {
num_tile_columns_minus1 ue(v)
num_tile_rows_minus1 ue(v)
for( i = 0; i < num_tile_columns_minus1; i++ )
tile_column_width_minus1[ i ] ue(v)
for( i = 0; i < num_tile_rows_minus1; i++ )
tile_row_height_minus1[ i ] ue(v)
}
brick_splitting_present_flag u(1)
for( i = 0; brick_splitting_present_flag && i < NumTilesInPic; i++ ) {
brick_split_flag[ i ] u(1)
if( brick_split_flag[ i ] ) {
uniform_brick_spacing_flag[ i ] u(1)
if( uniform_brick_spacing_flag[ i ] )
brick_height_minus1[ i ] ue(v)
else {
num_brick_rows_minus1[ i ] ue(v)
for( j = 0; j < num_brick_rows_minus1[ i ]; j++ )
brick_row_height_minus1[ i ][ j ] ue(v)
}
}
}
single_brick_per_slice_flag u(1)
if( !single_brick_per_slice_flag )
rect_slice_flag u(1)
if( rect_slice_flag && !single_brick_per_slice_flag ) {
num_slices_in_pic_minus1 ue(v)
for( i = 0; i <= num_slices_in_pic_minus1; i++ ) {
if( i > 0 )
top_left_brick_idx[ i ] u(v)
bottom_right_brick_idx_delta[ i ] u(v)
}
}
loop_filter_across_bricks_enabled_flag u(1)
if( loop_filter_across_bricks_enabled_flag )
loop_filter_across_slices_enabled_flag u(1)
}
if( rect_slice_flag ) {
signalled_slice_id_flag u(1)
if( signalled_slice_id_flag ) {
signalled_slice_id_length_minus1 ue(v)
for( i = 0; i <= num_slices_in_pic_minus1; i++ )
slice_id[ i ] u(v)
}
}
entropy_coding_sync_enabled_flag u(1)
cabac_init_present_flag u(1)
for( i = 0; i < 2; i++ )
num_ref_idx_default_active_minus1[ i ] ue(v)
rpl1_idx_present_flag u(1)
init_qp_minus26 se(v)
transform_skip_enabled_flag u(1)
if( transform_skip_enabled_flag )
log2_transform_skip_max_size_minus2 ue(v)
cu_qp_delta_enabled_flag u(1)
if( cu_qp_delta_enabled_flag )
cu_qp_delta_subdiv ue(v)
pps_cb_qp_offset se(v)
pps_cr_qp_offset se(v)
pps_joint_cbcr_qp_offset se(v)
pps_slice_chroma_qp_offsets_present_flag u(1)
weighted_pred_flag u(1)
weighted_bipred_flag u(1)
deblocking_filter_control_present_flag u(1)
if( deblocking_filter_control_present_flag ) {
deblocking_filter_override_enabled_flag u(1)
pps_deblocking_filter_disabled_flag u(1)
if( !pps_deblocking_filter_disabled_flag ) {
pps_beta_offset_div2 se(v)
pps_tc_offset_div2 se(v)
}
}
pps_loop_filter_across_virtual_boundaries_disabled_flag u(1)
if( pps_loop_filter_across_virtual_boundaries_disabled_flag ) {
pps_num_ver_virtual_boundaries u(2)
for( i = 0; i < pps_num_ver_virtual_boundaries; i++ )
pps_virtual_boundaries_pos_x[ i ] u(v)
pps_num_hor_virtual_boundaries u(2)
for( i = 0; i < pps_num_hor_virtual_boundaries; i++ )
pps_virtual_boundaries_pos_y[ i ] u(v)
}
pps_extension_flag u(1)
if( pps_extension_flag )
while( more_rbsp_data( ) )
pps_extension_data_flag u(1)
rbsp_trailing_bits( )
}
loop_filter_across_bricks_enabled_flag, равный 1, определяет, что операции внутриконтурной фильтрация могут выполняться через границы бриков в изображениях, относящихся к PPS. loop_filter_across_bricks_enabled_flag, равный 0, определяет, что операции внутриконтурной фильтрации не выполняются через границы бриков в изображениях, относящихся к PPS. Операции внутриконтурной фильтрации содержат операции фильтра деблокирования, фильтра адаптивного смещения отсчета и адаптивного контурного фильтра. При их отсутствии, значение loop_filter_across_bricks_enabled_flag предполагается равным 1.
loop_filter_across_slices_enabled_flag, равный 1, определяет, что операции внутриконтурной фильтрации могут выполняться через границы секций в изображениях, относящихся к PPS. loop_filter_across_slice_enabled_flag, равный 0, определяет, что операции внутриконтурной фильтрации не выполняются через границы секций в изображениях, относящихся к PPS. Операции внутриконтурной фильтрации содержат операции фильтра деблокирования, фильтра адаптивного смещения отсчета и адаптивного контурного фильтра. При их отсутствии, значение loop_filter_across_slices_enabled_flag предполагается равным 0.
pps_loop_filter_across_virtual_boundaries_disabled_flag, равный 1, определяет, что операции внутриконтурной фильтрации отключаются через виртуальные границы в изображениях, относящихся к PPS. pps_loop_filter_across_virtual_boundaries_disabled_flag, равный 0, определяет, что никакое такое отключение операций внутриконтурной фильтрации не применяется в изображениях, относящихся к PPS. Операции внутриконтурной фильтрации содержат операции фильтра деблокирования, фильтра адаптивного смещения отсчета и адаптивного контурного фильтра. При их отсутствии, значение pps_loop_filter_across_virtual_boundaries_disabled_flag предполагается равным 0.
pps_num_ver_virtual_boundaries определяет количество элементов синтаксиса pps_virtual_boundaries_pos_x[i], которые присутствуют в PPS. Когда pps_num_ver_virtual_boundaries отсутствует, предполагается, что оно равно 0.
8.8.5.2 Процесс фильтрации дерева кодирования для отсчетов яркости
Входными данными этого процесса являются:
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения,
местоположение (xCtb, yCtb) отсчетов яркости, указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно верхнего левого отсчета текущего изображения.
Выходным результатом этого процесса является модифицированный отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения.
Процесс получения индекса фильтра по п. 8.8.5.3 инициируется с помощью с местоположения (xCtb, yCtb) и реконструированного массива recPictureL отсчетов яркости изображения, взятого в качестве входных данных, и filtIdx[x][y] и transposeIdx[x][y] с x, y = 0.. CtbSizeY − 1 в качестве выходного результата.
Для получения отфильтрованных реконструированных отсчетов alfPictureL [x] [y] яркости каждый реконструированный ыборка яркости внутри текущего блока recPictureL[ x ][ y ] дерева кодирования яркости фильтруется следующим образом с помощью x, y = 0.. CtbSizeY − 1:
Массив коэффициентов f [j] фильтра яркости и массив значений с[j] сжатия яркости, соответствующие фильтру, указанному посредством filtIdx[x][y], получаются нижеследующим образом с j = 0.. 11:
Если AlfCtbFiltSetIdxY [xCtb>> Log2CtbSize] [yCtb>> Log2CtbSize] меньше 16, применяется следующее:
i = AlfCtbFiltSetIdxY [xCtb>> Log2CtbSize] [yCtb>> Log2CtbSize] (8-1172)
f [j] = AlfFixFiltCoeff [AlfClassToFiltMap [i] [filtidx]] [j] (8-1173)
c [j] = 2BitdepthY (8-1174),
В противном случае, (AlfCtbFiltSetIdxY [xCtb>> Log2CtbSize] [yCtb>> Log2CtbSize] больше или равно 16, применяется следующее:
i = slice_alf_aps_id_luma [AlfCtbFiltSetIdxY [xCtb>> Log2CtbSize] [yCtb>> Log2CtbSize] − 16] (8-1175)
[j] = AlfCoeffL [i] [filtIdx[x][y]] [j] (8-1176)
c [j] = AlfClipL [i] [filtIdx[x][y]] [j] (8-1177),
Коэффициенты фильтра яркости и значения сжатия index idx получают в зависимости от transposeIdx[x][y] следующим образом:
Если transposeIndex[x][y] равен 1, применяется следующее:
idx [] = {9, 4, 10, 8, 1, 5, 11, 7, 3, 0, 2, 6 } (8-1178),
В противном случае, если transposeIndex[x][y] равен 2, применяется следующее:
idx [] = {0, 3, 2, 1, 8, 7, 6, 5, 4, 9, 10, 11 } (8-1179) В противном случае, если transposeIndex[x][y] равен 3, применяется следующее:
idx [] = {9, 8, 10, 4, 3, 7, 11, 5, 1, 0, 2, 6 } (8-1180) В противном случае, применяется следующее:
idx [] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } (8-1181)
Местоположения (hx + i, vy + j) для каждой из соответствующих отсчетов (x, y) яркости внутри данного массива recPicture отсчетов яркости с i, j = −3.. 3 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и xCtb +, x − PpsVirtualBoundariesPosX[n] больше или равно 0 и меньше 3 для любого n = 0.. pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3 (PpsVirtualBoundariesPosX[n], pic_width_in_luma_samples − 1, xCtb + x +i) (8-1182),
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[n]− xCtb − x, больше 0 и меньше 4 для любого n = 0.. pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3 (0, PpsVirtualBoundariesPosX[n] − 1, xCtb + x + i) (8-1183)
В противном случае, применяется следующее:
hx + i = Clip3 (0, pic_width_in_luma_samples − 1, xCtb + x + i) (8-1184)
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtb + y − PpsVirtualBoundariesPosY[n], больше или равно 0 и меньше 3 для любого n = 0.. pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3 (PpsVirtualBoundariesPosY[n], pic_height_in_luma_samples − 1, yCtb + y + j) (8-1185),
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[n] − yCtb − y больше 0 и меньше 4 для любого n = 0.. pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3 (0, PpsVirtualBoundariesPosY[n] − 1, yCtb + y + j) (8-1186)
- В противном случае, применяется следующее:
vy + j = Clip3 (0, pic_height_in_luma_samples − 1, yCtb + y + j) (8-1187)
- Переменную applyVirtualBoundary получают следующим образом:
Если одно или несколько из следующих условий действительны, applyVirtualBoundary устанавливают равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.
Смещения реконструированных отсчетов r1, r2 и r3 указываются в таблице 8-22 в соответствии с горизонтальным положением y отсчета яркости и applyVirtualBoundary.
Переменную curr получают следующим образом:
curr = recPictureL [hx, vy] (8-1188)
Переменную sum получают следующим образом:
sum = f [idx [0]] * (Clip3 (−c [idx [0]], c [idx [0]], recPictureL [hx, vy + r3] − curr), + Clip3 (−c [idx [0]], c [idx [0]], recPictureL [hx, vy − r3] − curr)), +
f [idx[1]] * (Clip3 (−c [idx[1]], c [idx[1]], recPictureL [hx + 1, vy + r2] − curr), + Clip3 (−c [idx[1]], c [idx[1]], recPictureL [hx − 1, vy − r2] − curr)), +
f [idx[2]] * (Clip3 (−c [idx[2]], c [idx[2]], recPictureL [hx, vy + r2] − curr), + Clip3 (−c [idx[2]], c [idx[2]], recPictureL [hx, vy − r2] − curr)), +
f [idx[3]] * (Clip3 (−c [idx[3]], c [idx[3]], recPictureL [hx − 1, vy + r2] − curr), + Clip3 (−c [idx[3]], c [idx[3]], recPictureL [hx + 1, vy − r2] − curr)), +
f [idx[4]] * (Clip3 (−c [idx[4]], c [idx[4]], recPictureL [hx + 2, vy + r1] − curr), + Clip3 (−c [idx[4]], c [idx[4]], recPictureL [hx − 2, vy − r1] − curr)), +
f [idx[5]] * (Clip3 (−c [idx[5]], c [idx[5]], recPictureL [hx + 1, vy + r1] − curr), + Clip3 (−c [idx[5]], c [idx[5]], recPictureL [hx − 1, vy − r1] − curr)), +
f [idx[6]] * (Clip3 (−c [idx[6]], c [idx[6]], recPictureL [hx, vy + r1] − curr), + Clip3 (−c [idx[6]], c [idx[6]], recPictureL [hx, vy − r1] − curr)), + (8-1189)
f [idx[7]] * (Clip3 (−c [idx[7]], c [idx[7]], recPictureL [hx − 1, vy + r1] − curr), + Clip3 (−c [idx[7]], c [idx[7]], recPictureL [hx + 1, vy − r1] − curr)), +
f [idx[8]] * (Clip3 (−c [idx[8]], c [idx[8]], recPictureL [hx − 2, vy + r1] − curr), + Clip3 (−c [idx[8]], c [idx[8]], recPictureL [hx + 2, vy − r1] − curr)), +
f [idx[9]] * (Clip3 (−c [idx[9]], c [idx[9]], recPictureL [hx + 3, vy] − curr), + Clip3 (−c [idx[9]], c [idx[9]], recPictureL [hx − 3, vy] − curr)), +
f [idx[10]] * (Clip3 (−c [idx[10]], c [idx[10]], recPictureL [hx + 2, vy] − curr), + Clip3 (−c [idx[10]], c [idx[10]], recPictureL [hx − 2, vy] − curr)), +
f [idx[11]] * (Clip3 (−c [idx[11]], c [idx[11]], recPictureL [hx + 1, vy] − curr), + Clip3 (−c [idx[11]], c [idx[11]], recPictureL [hx − 1, vy] − curr))
sum = curr + ((sum + 64)>> 7) (8-1190)
Модифицированную отфильтрованную реконструированный отсчет яркости изображения alfPictureL [xCtb + x] [yCtb + y] получают следующим образом:
Если pcm_loop_filter_disabled_flag и pcm_flag [xCtb + x] [yCtb + y] оба равны 1, применяется следующее:
alfPictureL [xCtb + x] [yCtb + y] = recPictureL [hx, vy] (8 1191)
В противном случае, (pcm_loop_filter_disabled_flag равен 0 или pcm_flag [x] [y], равен 0), применяется следующее:
alfPictureL [xCtb + x] [yCtb + y] = Clip3 (0, (1 <<BitDepthY) − 1, sum) (8-1192) Таблица 8 22 – Спецификация r1, r2, и r3, соответствующих положению y горизонтальных отсчетов яркости и applyVirtualBoundary
Условие r1 r2 r3
( y = = CtbSizeY − 5 | | y = = CtbSizeY − 4 ) && ( applyVirtualBoundary = = 1 ) 0 0 0
( y = = CtbSizeY − 6 | | y = = CtbSizeY − 3 ) && ( applyVirtualBoundary = = 1 ) 1 1 1
( y = = CtbSizeY − 7 | | y = = CtbSizeY − 2 ) && ( applyVirtualBoundary = = 1 ) 1 2 2
В противном случае 1 2 3
8.8.5.4 Процесс фильтрации блока дерева кодирования для отсчетов цветности
Входные данные этого процесса:
реконструированный массив recPicture отсчетов цветности изображения, предшествующий адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения,
местоположение отсчетов цветности (xCtbC, yCtbC), указывающее верхний левый отсчет текущего блока дерева кодирования цветности относительно верхнего левого отсчета текущего изображения.
Выходным результатом этого процесса является модифицированная отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения.
Ширина и высота текущего блока ctbWidthC и ctbHeightC дерева кодирования цветности, получаются следующим образом:
ctbWidthC = CtbSizeY / SubWidthC (8-1230)
ctbHeightC = CtbSizeY / SubHeightC (8-1231)
Для получения отфильтрованных реконструированных отсчетов alfPicture [x] [y] цветности каждый реконструированный отсчет цветности внутри текущего блока recPicture [x] [y] дерева кодирования цветности фильтруется нижеследующим образом с x = 0.. ctbWidthC − 1, y = 0.. ctbHeightC − 1:
Местоположения (hx + i, vy + j) для каждой из соответствующих отсчетов (x, y) цветности в заданном массиве recPicture отсчетов цветности с i, j = −2.. 2 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и xCtbC + x − PpsVirtualBoundariesPosX[n] / SubWidthC больше или равен 0 и меньше 2 для любого n = 0.. pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3 (PpsVirtualBoundariesPosX[n] / SubWidthC, (8-1232) pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[n] / SubWidthC − xCtbC − x больше 0 и меньше 3 для любого n = 0.. pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3 (0, PpsVirtualBoundariesPosX[n] / SubWidthC − 1, xCtbC + x + i)
(8-1233)
Иначе, применяется следующее:
hx + i = Clip3 (0, pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i)
(8-1234)
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtbC + y − PpsVirtualBoundariesPosY[n] / SubHeightC больше или равен 0 и vtymit 2 для любого n = 0.. pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3 (PpsVirtualBoundariesPosY[n] / SubHeightC, (8-1235) pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[n] / SubHeightC − yCtbC − y больше 0 и меньше 3 для любого n = 0.. pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3 (0, PpsVirtualBoundariesPosY[n] / SubHeightC − 1, yCtbC + y + j)
(8-1236)
В противном случае, применяется следующее:
vy + j = Clip3 (0, pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j)
(8-1237)
Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий являются действительными, applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.
Смещения r1 и r2 реконструированных отсчетов определяются в таблице 8-22, соответствующей горизонтальному положению y отсчета яркости и applyVirtualBoundary.
Переменную curr получают следующим образом:
curr = recPicture [hx, vy] (8 1238)
Массив коэффициентов f[j] фильтра цветности и массив значений c[j] сжатия цветности получают как показано ниже с j = 0..5:
f[j] = AlfCoeffC[slice_alf_aps_id_chroma][j] (8-1239)
c[j] = AlfClipC[slice_alf_aps_id_chroma][j] (8- 1240)
Переменную sum получаю следующим образом:
sum = f [0] * (Clip3 (−c [0], c [0], recPicture [hx, vy + r2] − curr), + Clip3 (−c [0], c [0], recPicture [hx, vy − r2] − curr)) +
f[1] * (Clip3 (−c[1], c[1], recPicture [hx + 1, vy + r1] − curr) + Clip3 (−c[1], c[1], recPicture [hx − 1, vy − r1] − curr)), +
f[2] * (Clip3 (−c[2], c[2], recPicture [hx, vy + r1] − curr) + Clip3 (−c[2], c[2], recPicture [hx, vy − r1] − curr)), + (8-1241)
f[3] * (Clip3 (−c[3], c[3], recPicture [hx − 1, vy + r1] − curr) + Clip3 (−c[3], c[3], recPicture [hx + 1, vy − r1] − curr)), +
f[4] * (Clip3 (−c[4], c[4], recPicture [hx + 2, vy] − curr) + Clip3 (−c[4], c[4], recPicture [hx − 2, vy] − curr)), +
f[5] * (Clip3 (−c[5], c[5], recPicture [hx + 1, vy] − curr) + Clip3 (−c[5], c[5], recPicture [hx − 1, vy] − curr))
sum = curr + (sum + 64)>> 7) (8-1242)
Модифицированную отфильтрованную реконструированный отсчет alfPicture [xCtbC + x] [yCtbC + y] цветности изображения получают следующим образом:
Если pcm_loop_filter_disabled_flag и pcm_flag [(xCtbC + x) * SubWidthC] [(yCtbC + y) * SubHeightC] оба равны 1, применяется следующее:
alfPicture [xCtbC + x] [yCtbC + y] = recPictureL [hx, vy] (8-1243)
В противном случае, (pcm_loop_filter_disabled_flag равен 0 или pcm_flag [x] [y], равен 0), применяется следующее:
alfPicture [xCtbC + x] [yCtbC + y] = Clip3 (0, (1 <<BitDepthC) − 1, sum) (8-1244)
2.11 Примеры обработки CTU
В соответствующим построением VVC, если нижняя граница одного CTB является нижней границей секции/брика, способ управления виртуальной границей ALF отключается. Например, одно изображение разбивается на несколько CTU и 2 секции, как показано на фиг. 19.
Предположим, что размером CTU является MxM (например, M = 64), соответствующий определению виртуальной границы, последние 4 строки внутри CTB обрабатываются ниже виртуальной границы. В аппаратной реализации применяется следующее:
- Если нижняя граница CTB является нижней границей изображения (например, CTU-D), обрабатывается блок (M+4) × M, содержащий 4 строки от приведенной выше строки CTU и все строки в текущем CTU.
- В противном случае, если нижняя граница CTB является нижней границей секции (или брика) (например, CTU-C), и loop_filter_across_slice_enabled_flag (или loop_filter_across_bricks_enabled_flag) равен 0, обрабатывается блок (M+4) × M, содержащий 4 строки из приведенной выше строки CTU и все строки в текущем CTU.
- В противном случае, если CTU/CTB в первой строке CTU в секции/брике/плитке (например, CTU-A), обрабатывается блок M × (M-4), исключая последние 4 строки.
- В противном случае, если CTU/CTB не находится в первой строке CTU секции/брика/плитки (например, CTU-B) и не находится в последней строке CTU секции/брика/плитки, обрабатывается блок M × M, включая 4 строки из вышеупомянутой строки CTU и, исключая последние 4 строки в текущем CTU.
На фиг. 19 показывает пример обработки CTU в изображении.
2.12 360-градусное видеокодирование
Горизонтальная свертка вокруг компенсации движения в VTM5 является специальным инструментом 360-градусного кодирования, разработанным для повышения визуального качества реконструированного видео с полным обзором в формате эквипрямоугольной проекции (equi-rectangular projection, ERP). При традиционной компенсации движения, когда вектор движения относится к отсчетам, лежащим вне границ эталонного изображения, повторяющееся заполнение применяется для получения значений отсчетов, находящихся за пределами изображения, путем копирования самых близких соседей на соответствующей границе изображения. Для 360-градусного видео этот способ повторяющегося заполнения непригоден и мог вызывать визуальные артефакты, называемые "шовными артефактами" (seam artefact) в видео реконструированной области просмотра. Поскольку 360-градусное видео получают для сферы и оно, по сути, не имеет никакой "границы", опорные отсчеты, которые находятся вне границ опорного изображения в спроектированном домене, всегда могут быть получены из соседних отсчетов в сферическом домене, поскольку он содержит в себе двумерное и трехмерное преобразование координат , а также интерполяцию отсчетов для дробных позиций отсчетов. Эта проблема намного упрощается для левой и правой границ формата проекции ERP, поскольку сферические соседи, находящиеся за пределами левой границы изображения, могут быть получены из отсчетов, находящихся внутри правой границы изображения, и наоборот.
На фиг. 20 показан пример горизонтальной свертки вокруг компенсации движения в VVC.
Горизонтальная свертка вокруг процесса компенсации движения является такой, как показано на фиг. 20. Когда часть опорного блока находится за пределами левой (или правой) границы опорного изображения в спроецированном домене, вместо повторяющегося заполнения, часть "за пределами границы" берется от соответствующих сферических соседей, которые являются частью опорного изображения в направлении к правой (или левой) границы в спроектированном домене. Повторяющееся заполнение используется только для верхней и нижней границ изображения. Как показано на фиг. 20, горизонтальная свертка вокруг компенсации движения может быть объединена с ненормативным способом заполнения, часто используемым при видеокодировании с полным обзором. В VVC это достигается сигнализацией высокоуровневого элемента синтаксиса, чтобы указать на смещение общей свертки, которое должно быть установлено в ширину изображения ERP перед заполнением; этот синтаксис используется для регулирования положения общей горизонтальной свертки, соответственно. На этот синтаксис не влияет конкретный объем заполнения на левой и правой границах изображения и поэтому, естественно, поддерживается асимметричное заполнение изображения ERP, например, когда левое и правое заполнения различны. Горизонтальная свертка вокруг компенсации движения предоставляет более значимую информацию для компенсации движения, когда опорные отсчеты находятся за пределами левой и правой границ опорного изображения.
Для форматов проекции, состоящих из множества поверхностей, неважно, какое компактное расположение используется при упаковке кадра, в упакованном изображении кадра между двумя или более смежными поверхностями появляются разрывы. Например, рассматривая конфигурацию упаковки кадра 3×2, показанную на фиг. 24, три поверхности в верхней части являются непрерывными в трехмерной геометрии, три поверхности являются непрерывными в нижней половине трехмерной геометрии, но верхняя и нижняя половины упакованного кадра изображения являются разрывными в трехмерной геометрии. Если операции внутриконтурной фильтрации выполняются по этому разрыву, артефакты поверхностного шва могут стать видимыми в реконструированном видео.
Чтобы смягчить артефакты поверхностного шва, операции внутриконтурной фильтрации могут быть запрещены по этим разрывам в изображении с упакованными кадрами. Был предложен синтаксис, чтобы сигнализировать о вертикальной и/или горизонтальной виртуальных границах, на которых отключаются операции внутриконтурной фильтрации. По сравнению с использованием двух плиток, один для каждого набора непрерывных поверхностей, для отключения операции внутриконурной фильтрации по плиткам, предложенный способ сигнализации способ является более гибким, поскольку не требует, чтобы размер поверхности был кратным размеру CTU.
2.13 Примерное субизображение, основанное на независимых областях с ограниченные движением
В некоторые варианты осуществления включены следующие признаки:
1) Изображения могут быть разделены на субизображения.
2) Индикация существования субизображений указывается в SPS вместе с другой информацией субизображений об уровне последовательности.
3) Независимо от того, рассматривается ли субизображение как изображение в процессе декодирования (исключая операции внутриконтурной фильтрации), оно может управляться битовым потоком.
4) Независимо от того, отключена ли внутриконтурная фильтрация по границам субизображения, она может управляться битовым потоком для каждого субизображения. Процессы DBF, SAO и ALF обновляются для управления операциями внутриконтурной фильтрации по границам субизображения.
5) Для простоты, как начальная точка, ширина, высота, горизонтальное смещение и вертикальное смещение субизображения сообщаются в блоках отсчетов яркости в SPS. Границы субизображения ограничиваются границами секций.
6) Обработка субизображения как изображения в процессе декодирования (исключая операции внутриконтурной фильтрации цикле) определяется путем небольшого обновления синтаксиса coding_tree_unit() и обновляет до следующих процессов декодирования:
o Процесс получения для (усовершенствованного) временного предсказания вектора движения яркости
о Процесс билинейной интерполяция отсчета яркости
о Процесс фильтрации интерполяции с 8 отводами для отсчета яркости
o Процесс интерполяции отсчета цветности
7) Идентификаторы субизображения явно определены в SPS и включены в заголовки группы плиток, чтобы позволить извлечение последовательностей субизображения без необходимости изменения блоков VCL NAL.
Выходные наборы субизображения (Output sub-picture set, OSPS) предложены для определения нормативного извлечения и точек соответствия для субизображений и их наборов.
3. Технические проблемы, решаемые решениями, предоставленными в настоящем документе
Текущее построение VVC имеет следующие проблемы:
1. Текущая установка включения виртуальной границы ALF зависит от того, является ли нижняя граница CTB нижней границей изображения. Если это действительно так, то виртуальная граница ALF отключается, как CTU-D на фиг. 19. Однако возможно, что нижняя граница CTB, находящаяся за пределами нижней границы изображения, такого как изображение 256x240, изображение, разбивается на 4 CTU размером 128x128, и в этом случае, виртуальная граница ALF может быть установлена неправильно как действительная для последних 2 CTU, которые имеют отсчеты за пределами нижней границы изображения.
2. Способ обращения с виртуальной границей ALF запрещается для нижней границы изображения и для границы секции/плитки/брика. Отключение VB вдоль границы секции/брика может создать конвейерный пузырь или потребовать обработки 68 строк на каждый блок данных виртуального конвейера (Virtual pipeline data unit, VPDU, 64x64 в VVC), предполагая, что размер LCU равен 64x64. Например:
a. Для декодеров, не знающих заранее границ секций/бриков/плиток (например, с приложениями с малой задержкой), строчные буферы ALF должны быть реконструированы. Свыкнется ли контент в строчных буферах с фильтрацией ALF, зависит от того, является ли текущий CTU также CТU границы секции/брика/плитки, но эта информация, однако, неизвестна, пока не будет декодирована следующая секция/брик/плитка.
b. Для декодеров, заранее знающих границы секции/брика/плитки, либо для декодеров, которые должны существовать с конвейерными пузырями (очень маловероятными), или все время выполнять ALF со скоростью 68 строк на 64x64 VDPU (чрезмерное условие), чтобы избежать использования строчных буферов ALF.
3. Существуют различные пути действий с виртуальной границей и границей видеоблока, например, различные способы заполнения. Между тем, для строки, для которой это происходит на многочисленных границах, может выполняться более одного способов заполнения.
a. В одном из примеров, если нижняя граница блока является 360-градусной виртуальной границей и виртуальной границей ALF, также применяется к этому блоку, в этом случае, способ заполнения для 360-градусной виртуальной границы может быть сначала применен для формирования виртуальных отсчетов ниже 360-градусной виртуальной границы. После этого, эти виртуальные отсчеты, расположенные ниже 360-градусной виртуальной границы, рассматривают как доступные. И способ с двухсторонним заполнением ALF может быть дополнительно применен в соответствии с фиг. 16 A-C. Пример показан на фиг. 25.
4. Способ обращения с виртуальной границей может быть субоптимальным, поскольку используются заполненные отсчеты, которые могут быть менее эффективными.
5. Когда нелинейный ALF отключен, MALF и способы двухстороннего заполнения могут быть способны формировать те же самые результаты для фильтрации отсчета, которые требуются для доступа к отсчетам, пересекающим виртуальную границу. Однако, когда нелинейный ALF включен, эти два способа могут приносить разные результаты. Было бы предпочтительно уравнять эти два случая.
6. Секция могла бы быть прямоугольной или непрямоугольной, как показано на фиг. 28. В этом случае, для CTU она может не совпадать ни с какими границами (например, изображения/секции/плитки/брика). Однако, может оказаться необходимым получить доступ к отсчетам, находящимся вне текущей секции. Если фильтрация, пересекающая границу секции (например, loop_filter_across_slices_enabled_flag является ложным), отключена, как выполнить классификацию ALF и процесс фильтрации неизвестно.
7. Суб изображение является прямоугольной областью одной или нескольких секций внутри изображения. Субизображение содержит одну или несколько секций, которые коллективно охватывают прямоугольную область изображения. Таблица синтаксиса изменяется нижеследующим образом для включения концепции субизображения (жирный, курсив и подчеркнутый).
7.3.2.3 Синтаксис RBSP набора параметров последовательности
seq_parameter_set_rbsp( ) { Дескриптор
sps_decoding_parameter_set_id u(4)
sps_video_parameter_set_id u(4)
sps_max_sub_layers_minus1 u(3)
sps_reserved_zero_5bits u(5)
profile_tier_level( sps_max_sub_layers_minus1 )
gra_enabled_flag u(1)
sps_seq_parameter_set_id ue(v)
chroma_format_idc ue(v)
if( chroma_format_idc = = 3 )
separate_colour_plane_flag u(1)
pic_width_max_in_luma_samples ue(v)
pic_height_max_in_luma_samples ue(v)
sub_pics_present_flag u(1)
if( sub_pics_present_flag ) {
max_grid_idxs_minus1 u(8)
sub_pic_grid_col_width_minus1 u(v)
sub_pic_grid_row_height_minus1 u(v)
for( i = 0; i < NumSubPicGridRows; i++ )
for( j = 0; j < NumSubPicGridCols; j++ )
sub_pic_grid_idx[ i ][ j ] u(v)
for( i = 0; i <= NumSubPics; i++ ) {
sub_pic_treated_as_pic_flag[ i ] u(1)
loop_filter_across_sub_pic_enabled_flag[ i ] u(1)
}
}
bit_depth_luma_minus8 ue(v)
bit_depth_chroma_minus8 ue(v)
log2_max_pic_order_cnt_lsb_minus4 ue(v)
if( sps_max_sub_layers_minus1 > 0 )
Заметим, что разрешение пересечения при фильтрации субизображений управляется для каждого субизображения. Однако управление разрешением пересечения при фильтрации секции/плитки/брика управляется на уровне изображения, о чем сигнализируется один раз для управления всеми секциями/плитками/бриками в рамках одного изображения.
8. Классификация ALF выполняется в блоке 4x4, то есть, все отсчеты внутри одного блока 4x4 имеют одни и те же результаты классификации. Однако, чтобы быть более точными, для отсчетов в окне 8x8, содержащем текущий блок 4x4, блок должен вычислить их градиенты. В этом случае необходим доступ к отсчетам 10x10, как показано на фиг. 30. Если некоторые из отсчетов расположены в другом видеоблоке, например, другой секции/плитке/брике/субизображении/выше или слева или справа или внизу "360-градусной виртуальной границы"/выше или ниже "виртуальной границы ALF"), как вычислить классификацию, которую необходимо определить.
4. Примеры способов и вариантов осуществления
Приведенный ниже перечень должен рассматриваться как примеры для объяснения общих концепций. Перечисленные технологии не должны интерпретироваться в узком смысле. Кроме того, эти технологии могут объединяться любым способом.
Способ заполнения, используемый для виртуальных границ ALF, может быть обозначен как "двухстороннее заполнение", где, если один отсчет, расположенный в (i, j), заполняется, то тогда соответствующий отсчет, расположенный в (m, n), которые совместно используют один и тот же коэффициент фильтра, также заполняется, даже когда отсчет доступен, как показано на фиг. 12-13.
Способ заполнения, используемый для границ изображения/виртуальных границ видео с полным обзором, обычных границ (например, верхней и нижней границ) может быть обозначен как ‘одностороннее заполнение’, где, если один отсчет, который должен использоваться, находится вне границ, он копируется с доступного отсчета внутри изображения.
Способ заполнения, используемый для левых и правых границ 360-градусного видео, может быть обозначен как "заполнение, основанное на свертке", в котором, если один отсчет, которая должен использоваться, приходится вне границ, он копируется, используя компенсированные результаты движения.
В последующем обсуждении отсчет "на границе видеоблока" может означать, что расстояние между отсчетом и границей видеоблока меньше или не больше порога. "Строка" может относиться к отсчетам, находящимся в одном и том же горизонтальном положении, или к отсчетам, находящимся в одном и том же вертикальном положении (например, отсчеты в одной и той же строке и/или отсчеты в одном и том же столбце). Функция Abs (x) определяется следующим образом:
Abs (x) = .
В следующем обсуждении "виртуальный отсчет" относится к сформированному отсчету, который может отличаться от реконструированного отсчета (может обрабатываться посредством деблокирования и/или SAO). Виртуальный отсчет может использоваться для проведения ALF другого отсчета. Виртуальный отсчет может быть сформирован посредством заполнения.
"Способ обработки виртуальной границы ALF разрешается для одного блока" может указывать, что applyVirtualBoundary в спецификации установлен как действительный. "Разрешение виртуальной границы" может указывать, что текущий блок разбивается по меньшей мере на две части виртуальной границей и отсчеты, расположенные в одной части, являются отсчетами, запрещенными для использования в другой части в процессе фильтрации (например, ALF). Виртуальная граница может быть на K строк выше нижней границы одного блока.
В последующих описаниях соседние отсчеты могут быть отсчетами, которые требуются для классификации фильтров и/или процесса фильтрации.
В раскрытии соседний отсчет является "недоступным", если он находится вне текущего изображения или текущего субизображения, текущей плитки, текущей секции, текущего брика, текущего CTU или текущего блока обработки (такого как блок обработки ALF или блок узкой обработки ALF) или какого-либо другого текущего видеоблока.
1. Определение "нижняя граница текущего блока дерева кодирования является нижней границей изображения" заменяется на "нижняя граница текущего блока дерева кодирования является нижней границей изображения или находится вне изображения".
а. Альтернативно, дополнительно, в этом случае, способ обращения с виртуальными границами ALF может быть запрещен.
2. Разрешить ли использование виртуальных отсчетов (например, разрешить ли виртуальную границу (например, установить applyVirtualBoundary как действительную TRUE или ложную FALSE)) в процессе внутриконтурной фильтрации, может зависеть от размера CTB.
а. В одном из примеров, applyVirtualBoundary всегда устанавливается как FALSE для заданного размера CTU/CTB, например, для размера CTU/CTB, равного KxL (например, K=L=4).
b. В одном из примеров applyVirtualBoundary всегда устанавливается как FALSE для определенных размеров CTU/CTB, которые не больше или не меньше, чем KxL (например, K=L=8).
с. Альтернативно, ALF запрещается для определенных размеров CTU/CTB, таких как 4x4, 8x8.
3. Разрешить ли использование виртуальных отсчетов (например, заполненных из реконструированных отсчетов) в процессах внутриконтурной фильтрации (например, ALF), может зависеть от того, является ли нижняя граница блока нижней границей видеоблока, которая обладает более тонкой гранулярностью по сравнению с изображением (например, секцией/плиткой/бриком) или виртуальной границей.
а. В одном из примеров способ обращения с виртуальными границами ALF может быть разрешена (например, applyVirtualBoundary имеет значение TRUE) для блока дерева кодирования (CTB), если нижняя граница CTB является границей видеоблока или виртуальной границей.
i. Альтернативно, дополнительно, если нижняя граница не является нижней границей изображения или если нижняя граница находится вне изображения, вышеупомянутый способ разрешается.
b. Когда нижняя граница текущего блока дерева кодирования является одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1, способ обращения с виртуальными границами ALF может все еще быть разрешен (например, applyVirtualBoundary устанавливается как TRUE).
с. В одном из примеров, разрешить ли способ обращения с виртуальными границами ALF (например, значение applyVirtualBoundary) для CTB, может зависеть только от соотношения между нижней границей CTB и нижней границей изображения.
i. В одном из примеров applyVirtualBoundary имеет значение FALSE, только если нижняя граница CTB является нижней границей изображения, содержащего CTB или если нижняя граница находится вне изображения.
ii. В одном из примеров applyVirtualBoundary имеет значение TRUE, когда нижняя граница CTB НЕ является нижней границей изображения, содержащего CTB.
d. В одном из примеров, при декодировании CTU-C, показанного на фиг. 18A-18C, отсчеты M × M могут фильтроваться со строками K из вышеупомянутого CTU и исключая строки K, расположенные ниже виртуальной границы.
4. Предложено запретить использование отсчетов по границам брика/секции в процессе фильтрации (например, ALF), даже когда сообщаемое управление флагами использования для контурных фильтров, пересекающих границы брика/секции (например, loop_filter_across_bricks_enabled_flag/loop_filter_across_slices_enabled_flag), являются действительными TRUE.
а. Альтернативно, дополнительно, сообщенный loop_filter_across_bricks_enabled_flag/loop_filter_across_slices_enabled_flag может управлять только процессом фильтрации фильтра деблокирования фильтра и SAO, исключая ALF.
b. В одном из примеров виртуальный отсчет может использоваться вместо реконструированного отсчета в соответствующем положении для выполнения ALF для другого отсчета.
5. Когда один блок (например, CTB) содержит отсчет, расположенный на границе видеоблока (такую как секция/брик/плитка/360-градусная виртуальная или нормальная граница видео/граница изображения), то, как формировать виртуальный отсчет внутри или снаружи видеоблока (например, способами заполнения) для внутриконтурной фильтрации, такой как ALF, может унифицироваться для различных видов границ.
а. Альтернативно, дополнительно, способ виртуальных границ (например, способ двухстороннего заполнения) могут быть применим к блоку для обращения с отсчетом на границе для внутриконтурной фильтрации.
b. Альтернативно, дополнительно, вышеупомянутые способы могут применяться, когда блок содержит отсчет, расположенный на нижней границе видеоблока.
с. В одном из примеров, при декодировании K строк одного блока, если K строк находятся ниже виртуальной границы блока (например, последние строки K в CTU-B на фиг. 17A-17B), и нижняя граница блока является нижней границей видеоблока, виртуальные отсчеты могут формироваться в процессе классификации/фильтрации ALF для предотвращения использования других отсчетов, находящихся вне этих K строк, например, может применяться способ двухстороннего заполнения.
i. Альтернативно, для этих последних К строк ALF может запрещаться.
d. В одном из примеров, когда один блок находится на нескольких границах, пиксели/отсчеты, используемые для классификации ALF, могут ограничиваться до, но не через любую из этих нескольких границ.
i. В одном из примеров, для отсчета, если какой-либо его соседний отсчет является “недоступным” (например, на любой из нескольких границ), для отсчета не могут вычисляться один или все виды градиентов/направленности.
1. В одном из примеров градиенты отсчета можно рассматриваться как ноль.
2. В одном из примеров градиенты отсчета могут рассматриваться как “недоступные” и не могут добавляться к действию (например, определенному в уравнении (8) раздела 2.6.1.1), полученному в процессе классификации ALF.
ii. В одном из примеров действие/направленность, полученное в процессе классификации ALF, может быть масштабировано с коэфффициентом, когда “доступны” только частичные отсчеты, используемые в процессе классификации ALF (например, не на любой из этих границ).
iii. В одном из примеров, для граничного блока предполагается, что градиенты/направленность требуются для вычисления N отсчетов в процессе классификации ALF, и градиенты могут быть вычислены только для отсчетов M (например, если определенный соседний отсчет из отсчетов "недоступен", то градиент для него не может быть вычислен), тогда действие может быть умножено на N/M.
1. Альтернативно, она может быть умножена на коэффициент, зависящий от N/M. Например, число может равняться MN (N - целое число), например, M = 2.
е. В одном из примеров, градиенты частичных отсчетов в MxN (например, M=N=8 в данном случае, M столбцов и N строк) окно может использоваться для классификации.
i. Например, для текущего блока N1*N2 (N1=N2=4 в данном случае), M*N центрируется в блоке N1*N2.
i.. В одном из примеров могут использоваться градиенты отсчетов, которым не требуется получать доступ к отсчетам на границах.
1. Альтернативно, дополнительно, когда вычисление градиента отсчета, расположенного на одной или нескольких границах, заполнение (например, одностороннее заполнение) может быть выполнено, если некоторые отсчеты, соседние с текущим отсчетом, “недоступны”.
2. Альтернативно, дополнительно, упомянутые выше K недоступных строк (например, K = 1, 2) могут быть заполнены, если текущий отсчет расположен на верхней границе видеоблока (такого как виртуальные границы секции/брика/плитки/ 360-градусного видео с полным обзором или виртуальные границы ALF).
3. Альтернативно, дополнительно, левые K недоступных столбцов (например, K = 1, 2) могут быть заполнены, если текущий отсчет расположен на левой границе видеоблока.
4. Альтернативно, дополнительно, правые K недоступных столбцов (например, K = 1, 2) могут быть заполнены, если текущий отсчет расположен на правой границе видеоблока.
5. Альтернативно, дополнительно, нижние K недоступных строк (например, K = 1, 2) могут быть заполнены, если текущий отсчет расположен на нижней границе видеоблока.
6. Альтернативно, дополнительно, если текущий отсчет расположен на верхней границе и на левой границе видеоблока, упомянутые выше K1 недоступных строк (например, K1 = 1, 2) могут быть заполнены сначала для формирования окна M*(N + K1), затем, левые K2 недоступных столбцов (например, K2 = 1, 2) могут быть заполнены для формирования окна (M + K2) *(N + K1).
а. Альтернативно, левые K2 недоступных столбцов (например, K2 = 1, 2) могут быть заполнены сначала, чтобы сформировать окно (M+K2)*N, а затем вышеупомянутые K1 недоступных строк (например, K1 = 1, 2) могут быть заполнены для формирования окна (M + K2)*(N + K1).
7. Альтернативно, дополнительно, если текущий отсчет расположен на верхней границе и на правой границе видеоблока, вышеупомянутые K1 недоступных строк (например, K1 = 1, 2) могут быть заполнены сначала для формирования окна M*(N + K1), и затем правильные K2 недоступных столбцов (например, K2 = 1, 2) могут быть заполнены для формирования окна (M + K2)*(N + K1).
а. Альтернативно, правые K2 недоступных столбцов (например, K2 = 1, 2) могут быть заполнены сначала для формирования окна (M+K2)*N, и затем упомянутые выше K1 недоступных строк (например, K1 = 1, 2), могут быть заполнены для формирования окна (M + K2)*(N + K1).
8. Альтернативно, дополнительно, если текущий отсчет расположен на нижней границе и на правой границе видеоблока, нижние K1 недоступных строк (например, K1 = 1, 2) могут быть заполнены сначала для формирования окна M*(N + K1) и затем правые K2 недоступные столбцы (например, K2 = 1, 2) могут быть заполнены для формирования окна (M + K2)*(N + K1).
а. Альтернативно, правые K2 недоступных столбцов (например, K2 = 1, 2) могут быть заполнены сначала для формирования окна (M+K2)*N и затем нижние K1 недоступных строк (например, K1 = 1, 2) могут быть заполнены для формирования окна (M + K2)*(N + K1).
9. Альтернативно, дополнительно, если текущий отсчет расположен на нижней границе и на левой границе видеоблока, нижние K1 недоступных строк (например, K1 = 1, 2) могут быть заполнены сначала для формирования окна M*(N + K1) и затем левые K2 недоступных столбцов (например, K2 = 1, 2) могут быть заполнены для формирования окна (M + K2)*(N + K1).
а. Альтернативно, левые K2 недоступных столбцов (например, K2 = 1, 2) могут быть заполнены сначала для формирования окна (M+K2)*N и затем нижние K1 недоступных строк (например, K1 = 1, 2) могут быть заполнены для формирования окна (M + K2)*(N + K1).
10. Альтернативно, дополнительно, заполненные отсчеты могут использоваться для вычисления градиентов.
iii. В одном из примеров, для блока на верхней/нижней границе видеоблока (такой как виртуальные границы секции/брика/плитки/видео с полным обзором или виртуальные границы ALF), градиенты отсчетов в окне M*(N - C1) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты верхних/нижних строк C1 окна M*N не используются в классификации.
iv. В одном из примеров, для блока на левой/правой границе видеоблока, градиенты отсчетов в окне (M – C1)*N могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты левого/правого столбцов C1 окна M*N не используются в классификации.
v. В одном из примеров, для блока на верхней границе и на нижней границе видеоблока, градиентах отсчетов в окне M*(N - C1 - C2) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты верхних строк C1 и нижних строк C2 окна M*N не используются в классификации.
vi. В одном из примеров, для блока на верхней границе и левой границе видеоблока градиенты отсчетов в окне (M – C1)*(N - C2) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты верхних строк C1 и левых столбцов C2 окна M*N не используются в классификации.
vii. В одном из примеров, для блока на верхней границе и на правой границе видеоблока, градиенты отсчетов в окне (M – C1)*(N - C2) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты верхних строк C1 и правых столбцов C2 окна M*N не используются в классификации.
viii. В одном из примеров, для блока на границе и на левой границе видеоблока градиенты отсчетов в окне (M – C1)*(N - C2) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты нижних строк C1 и левых столбцов C2 окна M*N не используются в классификации.
ix. В одном из примеров, для блока на нижней границе и на правой границе видеоблока градиенты отсчетов в окне (M – C1)*(N - C2) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты нижних строк C1 и правых столбцов C2 окна M*N не используются в классификации.
x. В одном из примеров, для блока на левой границе и на правой границе видеоблока, градиенты отсчетов в окне (M – C1 – C2)*N могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты левых столбцов C1 и правых столбцов C2 окна M*N не используются в классификации.
xi. В одном из примеров, для блока на верхней границе, нижней границе и на левой границе видеоблока градиенты отсчетов в окне (M – C3)*(N - C1 - C2) могут использоваться для классификации блока.
1. Альтернативно, дополнительно градиенты верхних строк C1 и нижних строк C2 и левых столбцов C3 окна M*N не используются в классификации.
xii. В одном из примеров, для блока на верхней границе, на нижней границе и на правой границе видеоблока градиенты отсчетов в окне (M – C3)*(N - C1 - C2) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты верхних строк C1 и нижних строк C2 и правых столбцов C3 окна M*N не используются в классификации.
xiii. В одном из примеров, для блока на левой границе, на правой границе и на верхней границе видеоблока градиенты отсчетов в окне (M – C1 – C2)*(N - C3) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты левых столбцов C1 и правых столбцов C2 и верхних строк C3 окна M*N не используются в классификации.
xiv. В одном из примеров, для блока на левой границе, на правой границе и на нижней границе видеоблока градиенты отсчетов в окне (M – C1 – C2)*(N - C3) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты левых столбцов C1 и правых столбцов C2 и нижних строк C3 окна M*N не используются в классификации.
xv. В одном из примеров, для блока на левой границе, на правой границе, на верхней границе и на нижней границе видеоблока градиентых отсчетов в окне (M – C1 – C2)*(N - C3 - C4) могут использоваться для классификации блока.
1. Альтернативно, дополнительно, градиенты левых столбцов C1 и правых столбцов C2, верхних строк C3 и нижних строк C4 окна M*N не используются в классификации.
xvi. В одном из примеров C1, C2, C3 и C4 равны 2.
xvii. В одном из примеров могут использоваться градиенты отсчетов, которые не имеют никаких “недоступных” соседних отсчетов, требующихся при вычислении градиентов.
f. В одном из примеров, когда одна строка находится на нескольких границах (например, расстояние между строкой и границей меньше порога), процесс заполнения выполняется только один раз, независимо от того, какому количеству границ она может принадлежать.
i. Альтернативно, дополнительно, то, сколько соседних строк должно быть заполнено, может зависеть от положения текущей строки относительно всех границ.
ii. Например, то, сколько соседних строк должно быть заполнено, может быть решено на основании расстояний между текущей строкой и двумя границами, так что когда текущая строка находится внутри двух границ, эти две границы находятся выше и ниже ее.
iii. Например, сколько соседних строк должно быть заполнено, может быть решено на основании расстояния между текущей строкой и ближайшей границей, такой, что когда текущая строка находится внутри двух границ, эти две границы находятся выше и ниже ее.
iv. Например, сколько соседних строк должно быть заполнено, может быть вычислено для каждой границы независимо и максимальное количество строк выбирается в качестве конечного количества заполненных строк.
v. В одном из примеров, сколько соседних строк должно быть заполнено, может быть решено для каждой стороны (например, с верхней стороны и с нижней стороны) строки.
vi. В одном из примеров, для способа двухстороннего заполнения, сколько соседних строк должно быть заполнено, может быть решен совместно для этих двух сторон.
vii. Альтернативно, дополнительно применяется способ двухстороннего заполнения, используемый ALF.
g. В одном из примеров, когда одна строка находится на нескольких границах и на каждой стороне существует по меньшей мере одна граница с каждой стороны строки (например, с верхней стороны и с нижней стороны), ALF может быть для нее запрещена.
h. В одном из примеров, когда количество заполненных строк, требуемых текущей строкой, больше порога, ALF может быть запрещена для текущей строки.
i. В одном из примеров, когда количество заполненных строк на любой стороне больше порога, ALF может быть запрещена для текущей строки.
ii. В одном из примеров, когда общее количество заполненных строк на обеих сторонах больше порога, ALF может быть запрещена для текущей строки.
i. Альтернативно, дополнительно, вышеупомянутые способы могут применяться, когда блок содержит отсчет, расположенный на нижней границе видеоблока, и внутриконтурная фильтрация, такая как ALF, разрешается для блока.
j. Альтернативно, дополнительно, вышеупомянутые способы могут применяться при определенных условиях, таких, что когда блок содержит отсчет, расположенный на нижней границе видеоблока и пересечение при фильтрации границ запрещается (например, pps_loop_filter_across_virtual_boundaries_disabled_flag/ loop_filter_across_slices_enabled_flag/loop_filter_across_slices_enabled_flag является действительным TRUE).
k. Предложенный способ также применим к отсчетам/блокам, расположенным на вертикальных границах.
6. Когда отсчет находится по меньшей мере на двух границах одного блока (например, по меньшей мере отсчет, который находится выше текущей строки, является виртуальной границей ALF, а ниже находится другая граница), сколько строк должно быть заполнено не решается просто расстоянием между текущей строкой относительно виртуальной границы ALF. Вместо этого, это определяется расстояниями между текущей строкой относительно этих двух границ.
а. В одном из примеров количество строк для заполнения на каждой стороне устанавливается равным (M – min(D0, D1)).
b. В одном из примеров количество строк для заполнения на каждой стороне устанавливается равным (M – max(D0, D1)).
c. Для приведенного выше примера D0, D1 обозначают расстояние между текущей строкой и границами выше и ниже ее.
d. Для приведенного выше примера M обозначает количество строк, на которое виртуальная граница ALF отстоит от нижней части одного CTU.
7. Могут быть определены по меньшей мере два способа выбора отсчетов в процессе классификации ALF и/или линейной или нелинейной фильтрации ALF, с помощью одного из них выбирают отсчеты перед тем, как применить любой способ контурной фильтрации; в другом выбирают отсчеты после того, как применяется один или несколько способов внутриконтурной фильтрации, но до того, как применяется ALF.
a. В одном из примеров выбор различных способов может зависеть от местоположения отсчетов, подлежащих фильтрации.
b. В одном из примеров отсчет на нижней границе видеоблока (такого как CTB) может выбираться с помощью первого способа, когда он используется в ALF для другого отсчеты. В противном случае, (не на границе), выбирается второй способ.
8. Предложено запрещать использование отсчетов, пересекающих границу VPDU (например, область 64x64) в процессе фильтрации.
a. В одном из примеров, когда отсчет, требуемый для процесса классификации ALF, находится вне границы VPDU или ниже виртуальной границы, она может быть заменена виртуальным отсчетом или результаты классификации отсчета могут быть скопированы из отсчета, связанного с другими отсчетами, такой как отсчет, заполненный из числа доступных.
b. В одном из примеров, когда отсчет, требуемый для процесса фильтрации, находится вне границы VPDU или ниже виртуальной границы, он может быть заменен виртуальным отсчетом, таким как отсчет, заполненный из числа доступных.
c. В одном из примеров может быть разрешен способ обращения с виртуальными границами ALF для блока (например, applyVirtualBoundary устанавливается как действительный TRUE), если он содержит отсчеты, расположенные на границе VPDU.
d. Альтернативно, использование отсчетов, пересекающих горизонтальную границу VPDU, может быть запрещено в процессе фильтрации.
i. В одном из примеров, когда отсчет, требуемый для процесса фильтрации, находится ниже горизонтальной границы VPDU или ниже виртуальной границы, он может быть заменен виртуальным отсчетом, таким, который заполняется из числа доступных.
e. Альтернативно, использование отсчетов, пересекающих вертикальную границу VPDU, может быть запрещено в процессе фильтрации.
i. В одном из примеров, когда отсчет, требуемый для процесса фильтрации, находится вне вертикальной границы VPDU или ниже виртуальной границы, он может быть заменен виртуальным отсчетом, таким, который заполняется из числа доступных.
9. Вместо использования заполненных отсчетов (например, доступных, выше/ниже виртуальных границ, выше/ниже границ видеоблока) в процессе классификации/фильтрации ALF, предложено использовать реконструированные отсчеты перед всеми контурными фильтрами.
a. Альтернативно, дополнительно, концепция двухстороннего заполнения применяется через заполнение отсчетов из реконструированных отсчетов перед всеми контурными фильтрами.
i. В одном из примеров, если отсчет для поддержки фильтра берется из реконструированных отсчетов перед всеми контурными фильтрами, симметричная (например, симметричная относительно начала координат, например, текущий отсчет) отсчет для поддержки фильтра должен также использовать реконструированный отсчет перед всеми контурными фильтрами.
1. Предположим, что координатами текущего отсчет, который должен фильтроваться, являются (0, 0), и отсчет, расположенный в (i, j), является реконструированным перед всеми контурными фильтрами, тогда отсчет, расположенный в (-i,-j), является реконструированным отсчетом перед всеми контурными фильтрами.
2. Предположим, что координата текущего отсчета, который будет фильтроваться, (x, y), и отсчет, расположенный в (x + i, y + j), является реконструированным отсчетом перед всеми контурными фильтрами, тогда отсчет, расположенный в (x – i, y – j), является реконструированным отсчетом перед всеми контурными фильтрами.
b. Альтернативно, дополнительно, когда внутриконтурное изменение формы (иначе говоря, LMCS) разрешено, реконструированные отсчеты перед всеми контурными фильтрами являются отсчетами в исходном домене, преобразованном из измененного по форме домена.
10. Вместо того, чтобы использовать заполненные отсчеты (например, доступные, выше/ниже виртуальных границ, выше/ниже границ видеоблока) в процессе фильтрации ALF, предложено использовать различные поддержки фильтра ALF.
a. В одном из примеров, если предположить, что отсчет должен быть заполнен вышеупомянутым способом, то вместо того, чтобы выполнять заполнение, коэффициент фильтра, связанный с отсчетом, устанавливается равным нулю.
i. В этом случае поддержка фильтра модифицируется, исключая отсчеты, которые требуют заполнения.
ii. Альтернативно, дополнительно, коэффициенты фильтра, применяемые к другим отсчетам кроме текущего отсчета, сохраняются неизменными, однако, коэффициент фильтра, применяемый к текущему отсчету, может быть модифицирован, такой что ((1 <<C_BD) – sum для всех коэффициентов фильтра, применяемых к отсчетам, которые не требуют заполнения), где C_BD указывает битовую глубину коэффициента фильтра.
1. Беря фиг. 18A-18B в качестве примера, при фильтрации строк L и I коэффициент c12 фильтра, применяемый к текущему отсчету, модифицируется, чтобы быть равным ((1 <<C_BD) – 2* (c4+c5+c6+c7+c8+c9+c10+c11)).
b. В одном из примеров предположим, что отсчет (x1, y1) заполняется из (x2, y2) вышеупомянутым способом, вместо выполнения заполнения, коэффициент фильтра, связанный с (x1, y1), добавляется к положению (x2, y2), независимо от того, разрешается или запрещается нелинейный фильтр.
i. Альтернативно, дополнительно, параметр сжатия для (x2, y2) может быть получен в процессе обработки.
1. В одном из примеров он может быть установлен равным декодированному параметру сжатия для (x2, y2).
2. Альтернативно, это может быть установлено на возвращенное значение функции с декодированными параметрами сжатия для (x1, y1) и (x2, y2) в качестве входных данных, такие как большее значение или меньшее значение.
11. Выбор параметров сжатия/коэффициентов фильтра/поддержек фильтра может зависеть от того, требуется ли фильтрации отсчета получать доступ к заполненным отсчетам (например, доступным, выше/ниже виртуальных границ, выше/ниже границ видеоблока).
a. В одном из примеров различные параметры сжатия/коэффициенты фильтра/поддержки фильтра могут быть использованы для отсчетов с одним и тем же индексом класса, но для некоторых из них требуется доступ к заполненным отсчетам, а к другим – нет.
b. В одном из примеров параметры сжатия/коэффициенты фильтра/поддержки фильтра для фильтрации отсчетов, которые требуют доступа к заполненным отсчетам, могут быть сообщены на уровне CTU/области/секции/плитки.
c. В одном из примеров параметры сжатия/коэффициенты фильтра/поддержки фильтра для фильтрации отсчетов, которые требуют доступа к заполненным отсчетам, могут быть получены из используемого для фильтрации отсчетов, которые не требуют доступа к заполненным отсчетам.
i. В одном из примеров могут быть применены маркеры 9a или 9b.
12. То, как обрабатывать отсчет на границе для внутриконтурной фильтрации (такой как ALF), может зависеть от компонента цвета и/или цветового формата.
a. Например, определение “на границе” может быть различным для различных компонентов цвета. В одном из примеров отсчет яркости находится на нижней границе, если расстояние между ним и нижней границей меньше T1; отсчет цветности находится на нижней границе, если расстояние между ним и нижней границей меньше T2. T1 и T2 могут отличаться.
i. В одном из примеров T1 и T2 могут отличаться, когда цветовой формат не равен 4:4:4.
13. Когда нижняя/верхняя/левая/правая граница одного CTU/VPDU является также границей секции/плитки/брика/субобласти с независимым кодированием, применяется фиксированный порядок многочисленных процессов заполнения.
a. В одном из примеров, на первом этапе сначала применяется способ заполнения (например, заполнение 1 стороны) части/мозаики/кирпича. После этого, во время второго этапа применяется способ заполнения для обработки виртуальных границ ALF (например, способ двухстороннего заполнения). В этом случае заполненные отсчеты после первого этапа маркируются как доступные и могут использоваться для решения сколько строк должно быть заполнено в процессе обработки виртуальных границ ALF. То же самое правило (например, фиг. 16A-C) используется для обработки CTU, которые не расположены на этих границах.
14. Предложенные способы могут применяться к одной или нескольким границам между двумя субизображениями.
a. Граница, применяющая предложенные способы, может быть горизонтальной границей.
b. Граница, применяющая предложенные способы, может быть вертикальной границей.
15. Вышеупомянутые предложенные способы могут применяться к отсчетам/блокам на вертикальных границах.
16. Применяется ли предложенный способ к «виртуальным границам с полным обзором», может зависеть от положения “виртуальной границы с полным обзором”.
a. В одном из примеров, когда “360-градусная виртуальная граница” совпадает с границей CTU, предложенный способ может быть применен. Например, для отсчетов на "360-градусных виртуальных границах" в ALF может применяться только двухстороннее заполнение.
b. В одном из примеров, когда “360-градусная виртуальная граница” не совпадает с границей CTU, предложенный способ не может применяться. Например, для отсчетов на “360-градусной виртуальной границе” в ALF может применяться только одностороннее заполнение.
c. В одном из примеров тот же способ заполнения может быть применен в ALF для отсчетов на “виртуальной границе 360” независимо от положения “виртуального границы 360”.
i. Например, одностороннее заполнение может применяться в ALF для отсчетов на “виртуальной границе 360”.
ii. Например, двухстороннее заполнение может применяться в ALF для отсчетов на “виртуальной границе 360”.
d. В одном из примеров, для отсчетов на нескольких границах, где по меньшей мере одна граница является “виртуальной границей 360” и по меньшей мере одна из “виртуальных границ 360”, не совпадает с границей CTU, предложенный способ может не применяться.
i. Например, отсчеты на любой из этих многочисленных границ могут быть заполнены путем одностороннего заполнения.
1. Альтернативно, дополнительно, если существует “виртуальная граница”, двухстороннее заполнение может применяться в ALF после одностороннего заполнения.
e. В одном из примеров, для отсчетов, расположенных между двумя видами границ, если одна из них является “360-градусная виртуальная граница”, а другая - нет, заполнение применяется только однажды в процессе ALF.
i. В одном из примеров способ заполнения для обработки виртуальных границ ALF может применяться (например, способ двухстороннего заполнения).
1. Альтернативно, может применяться способ заполнения для обработки границ изображения (или секции/плитки/брика/субизображения), (например, одностороннее заполнение).
ii. Альтернативно, два или более процессов заполнения могут применяться по порядку.
1. В одном из примеров сначала может быть применен способ заполнения для обработки границы изображения (или секции/плитки/брика/субизображения) (например, одностороннее заполнение), после этого может быть дополнительно применен способ заполнения для обработки виртуальных границ ALF (например, двухсторонний способ заполнения).
a. Альтернативно, дополнительно, заполненные отсчеты после первого заполнения рассматривают как доступные для второго процессеа заполнения.
iii. В одном из примеров, для отсчетов, расположенных между двумя или более видами границ, (например, граница секции/граница плитки/граница брика/"360-градусная граница"/"виртуальная граница ALF"/граница субизображения), если только одна из границ является “360-градусной виртуальной границей” (как показано, например, на фиг. 24, первая граница является “360-градусной виртуальной границей” и вторая граница является “виртуальной границей ALF” или границей секции/брика/плитки/границей субизображения; или наоборот), предложенный способ может применяться. Например, в ALF для этих отсчетов может применяться только двухстороннее заполнение.
1. Альтернативно, если эти многочисленные виды границ являются “виртуальной границей 360” или границей изображения, предложенный способ может не применяться. Например, для этих отсчетов при ALF может быть применимо только одностороннее заполнение.
f. В одном из примеров, для отсчетов, расположенных между двумя или более видами границ, и, если по меньшей мере одна из границ является “виртуальной границей 360” и она не совпадает с границей CTU, предложенный способ не может применяться.
i. В этом случае это можно рассматриваться как предшествующий уровень техники для обращения с отсчетами только на “виртуальной границе 360”, но не на других видах границ.
ii. В одном из примеров, для этих отсчетов в ALF может применяться только одностороннее заполнение.
g. В одном из примеров, для отсчетов, расположенных между двумя или более видами границ, и если по меньшей мере одна из границ является “360-градусной виртуальной границей”, предложенный способ не может применяться.
i. В этом случае это можно рассматриваться как предшествующий уровень техники только на "360-градусной виртуальной границе”, но не на других видах границ.
ii. В одном из примеров для этих отсчетов при ALF может применяться только одностороннее заполнение.
17. Когда опорный отсчет, требующийся в процессе фильтрации ALF, (например, P0i, где i - A/B/C/D на фиг. 16C при фильтрации текущего отсчета P0) или/и процесс классификации ALF “недоступен”, например, из-за того, что отсчет расположен в другом видеоблоке (например, секции/брике/плитке/субизображении) относительно текущего отсчета и фильтрация, использующая отсчеты на видеоблоке (например, на границах секции/брика/плитки/субизображения), запрещена, “недоступный” отсчет может быть заполнен “доступными” отсчетами (например, отсчетами внутри той же самой секции/брике/плитке/субизображении с текущим образцом).
а. В одном из примеров “недоступный” опорный отсчет может быть сначала сжат до ближайшего “доступного” горизонтального положения, то затем, при необходимости, “недоступный” опорный отсчет сжимается до ближайшего “доступного” вертикального положения.
b. В одном из примеров “недоступный” опорный отсчет может быть сначала сжат до его ближайшего “доступного” вертикального положения, затем, при необходимости, “недоступный” отсчет сжимается до его ближайшего “доступного” горизонтального положения.
c. В одном из примеров координата “недоступного” опорного отсчета сжимается до координаты его ближайшего “доступного” отсчета (например, до наименьшего расстояния) в горизонтальном направлении.
i. В одном из примеров, для двух отсчетов с координатами (x1, y1) и (x2, y2), горизонтальное расстояние между ними может быть вычислено как Abs (x1 – x2).
d. В одном из примеров координата “недоступного” опорного отсчета сжимается до координаты его ближайшего “доступного” отсчета (например, наименьшего расстояние) в вертикальном направлении.
i. В одном из примеров, для двух отсчетов с координатами (x1, y1) и (x2, y2), вертикальное расстояние между ними может быть вычислено как Abs (y1 – y2).
e. В одном из примеров “недоступный” отсчет сжимается до ближайшего “доступного” отсчета (например, наименьшего расстояния).
i. В одном из примеров, для двух отсчетов с координатами (x1, y1) и (x2, y2), расстояние между ними может быть вычислено как (x1 – x2) * (x1 – x2) + (y1 – y2) * (y1 – y2).
ii.Альтернативно, расстояние между двумя пикселями может быть вычислено как Abs (x1 – x2) + Abs (y1 – y2).
f. Альтернативно, процесс фильтрации запрещается для текущего отсчета.
g. Альтернативно, процесс классификации в ALF (например, вычисление градиента для текущего отсчета) может быть запрещен для использования недоступных опорных отсчетов.
18. То, как получить заполненный отсчет из числа недоступных опорных отсчетов, может зависеть от того, совпадает ли CTU с какими-либо границами.
a. В одном из примеров, когда текущий CTU не совпадает ни с каким из видов границ, но процесс фильтрации (например, процесс классификации ALF/фильтрации ALF) для текущего отсчета нуждается в получении доступа к опорному отсчету в другом видеоблоке (например, секции), могут применяться способы, описанные в маркере 16.
i. Альтернативно, дополнительно, когда текущий CTU не совпадает ни с каким из видов границ, но процесс фильтрации (например, процесс классификации ALF/фильтрации ALF) для текущего отсчета нуждается в доступе к опорному отсчету в другом видеоблоке (например, секции) и пересечение при фильтрации границы секции запрещается, могут быть применены способы, описанные в маркере 16.
ii. Альтернативно, дополнительно, когда текущий CTU не совпадает ни с каким из видов границ, но процесс фильтрации (например, процесс классификации ALF/ALF фильтрации) для текущего отсчета нуждается в доступе к опорному отсчету в другом видеоблоке (например, секции) и опорному отсчету в том же самом видеоблоке и пересечение при фильтрации границы части запрещается, могут быть применены способы, описанные в маркере 16.
b. В одном из примеров, когда текущий CTU совпадает по меньшей мере с одним видом границы, могут применяться унифицированные способы заполнения (например, одностороннее заполнение или двухстороннее заполнение).
i. Альтернативно, когда текущий CTU совпадает с многими видами границ и пересечение при фильтрации этих границ запрещается, могут применяться унифицированные способы заполнения (например, двухстороннее заполнение или одностороннее заполнение).
c. В одном из примеров только “недоступные” отсчеты, которые не могут быть заполнены посредством двухстороннего заполнения или/и одностороннего заполнения, могут быть заполнены с помощью способов, описанных в маркере 16.
19. Может ли процесс фильтрации (например, деблокирование, SAO, ALF, двусторонняя фильтрация, фильтрация с преобразованием Адамара и т. д.) получить доступ к отсчетам через границы видеоблока (например, границу секции/брика/плитки/субизображения) может управляться на разных уровнях, например, управляться самостоятельно, вместо того, чтобы управляться для всех видеоблоков в последовательности/изображении.
a. Альтернативно, один элемент синтаксиса может быть сообщен для секции в заголовке PPS/секции, чтобы указать, может ли процесс фильтрации пересекать границу секции для секции.
b. Альтернативно, один элемент синтаксиса может быть сообщен для брика/плитки в PPS, чтобы указать, может ли процесс фильтрации пересекать границу брика/плитки для брика/плитки.
c. В одном из примеров элементы синтаксиса могут сообщаться в SPS/PPS, чтобы указать, может ли процесс фильтрации пересекать границу брика или/и границу плитки или/и границу секции или/и “360-градусную виртуальную границу” для видео/изображения.
i. В одном из примеров, для различных видов границ могут сообщаться отдельные элементы синтаксиса.
ii. В одном из примеров, один элемент синтаксиса может сообщаться для всех видов границ.
iii. В одном из примеров, один элемент синтаксиса может сообщаться для нескольких видов границ.
1. Например, 1 элемент синтаксиса может сообщаться как для границы брика, так и для границы плитки.
d. В одном из примеров, элемент синтаксиса может сообщаться в SPS, чтобы указать, существуют ли индикации уровня PPS/секции на процессе фильтрации.
i. В одном из примеров отдельные элементы синтаксиса могут сообщаться для различных видов границ.
ii. В одном из примеров один элемент синтаксиса может сообщаться для всех видов границ.
iii. В одном из примеров один элемент синтаксиса может сообщаться для нескольких видов границ.
1. Например, 1 элемент синтаксиса может сообщаться как для границы брика, так и для границы плитки.
iv. Индикации, может ли процесс фильтрации пересекать границу секции/брика/плитки/субизображения, могут сообщаться в заголовке PPS/секции, только когда соответствующий элемент синтаксиса в SPS равен определенному значению.
1. Альтернативно, индикации, может ли процесс фильтрации пересекать границу секции/брика/плитки/субиображения, не могут сообщаться в заголовке PPS/секции, когда соответствующий элемент синтаксиса в SPS равен определенным значениям.
a. В этом случае процессу фильтрации может не разрешаться пересекать границу секции/брика/плитки/субизображения, если индикация в SPS равна определенному значению.
b. В этом случае, процесс фильтрации может пересекать границу секции/брика/плитки/субизображения, если признак в SPS равен определенному значению.
5. Варианты осуществления
В разделах, представленных ниже, описаны некоторые примеры того, как текущая версия стандарта VVC изменяется, чтобы приспособить некоторые варианты осуществления раскрытой технологии. Недавно добавленные части указываются текстом, написанным жирным курсивом с подчеркиванием. Удаленные части указываются, используя [[]].
5.1 Вариант 1 осуществления
loop_filter_across_bricks_enabled_flag, равный 1, указывает, что операции внутриконтурной фильтрации могут выполняться на границах брика в изображениях, относящихся к PPS. loop_filter_across_bricks_enabled_flag, равный 0, указывает, что операции внутриконтурной фильтрации не могут выполняться на границах брика в изображениях, относящихся к PPS. Операции внутриконтурной фильтрации содержат операции деблокирующего фильтра, фильтра адаптивного смещения отсчета[[, и адаптивного контурного фильтра]]. Когда их нет, значение loop_filter_across_bricks_enabled_flag предполагается равным 1.
loop_filter_across_slices_enabled_flag, равный 1, указывает, что операции внутриконтурной фильтрации могут выполняться, пересекая границы секции в изображениях, относящихся к PPS. loop_filter_across_slice_enabled_flag, равный 0, указывает, что операции внутриконтурной фильтрации не выполняются, пересекая границы секции в изображениях, относящихся к PPS. Операции внутриконтурной фильтрации содержат операции фильтра деблокирования, фильтра [[ адаптивного смещения отсчета и адаптивного контурного фильтра]]. При отсутствии значения, значение loop_filter_across_slices_enabled_flag предполагается равным 0.
5.2 Вариант 2 осуществления
На фиг. 21 плоказана обработка блоков CTU в изображении. Отличия от фиг. 19 выделены пунктирными линиями.
5.3 Вариант 3 осуществления
8.8.5.2 Процесс фильтрации блока дерева кодирования для отсчетов яркости
Входными данными процесса являются:
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный массив alfPictureL реконструированных отсчетов яркости изображения,
местоположение (xCtb, yCtb) яркости, указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно верхнего левого отсчета текущего изображения.
Выходными данными этого процесса является модифицированный отфильтрованный реконструированный массив отсчетов яркости alfPictureL.
Процесс получения индекса фильтра по п. 8.8.5.3 вызывается вместе с местоположением (xCtb, yCtb) и реконструированным массивом recPictureL отсчетов яркости изображения в качестве входных данных и filtIdx[x][y] и transposeIdx[x][y] с x, y = 0.. CtbSizeY − 1 в качестве выходных данных.
Для получения отфильтрованных реконструированных отсчетов яркости alfPictureL [x] [y] каждый реконструированнй отсчет яркости в текущем recPictureL [x] [y] блока дерева кодировании яркости фильтруется следующим образом с использованием x, y = 0.. CtbSizeY − 1:
Массив коэффициентов f [j] фильтра яркости и массив значений c [j] сжатия яркости, соответствующие фильтру, определенному посредством filtIdx[x][y], получают следующим образом, используя j = 0.. 11:
Коэффициенты фильтра яркости и значения сжатия index idx получают в зависимости от transposeIdx[x][y] следующим образом:
Местоположения (hx + i, vy + j) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов яркости с i, j = −3.. 3 получают следующим образом:
– Переменную applyVirtualBoundary получают следующим образом:
– Если [[одно или более из]] следующее условие [[условий]] действительно, applyVirtualBoundary устанавливается равным 0:
– Нижняя граница текущего кодирующего блока дерева кодирования является нижней границей изображения.
[[– Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
– Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
– Нижняя граница текущего блока дерева кодирования является одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.]]
– В противном случае, applyVirtualBoundary устанавливается равным 1.
Реконструированные смещения r1, r2, и r3 отсчетов определяются в таблице 8-22 в соответствии с горизонтальным положением отсчетов y яркости и applyVirtualBoundary.
8.8.5.4 Процесс фильтрации блока дерева кодирования для отсчетов цветности
Исходные данные процесса:
реконструированный массив recPicture отсчетов цветности изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения,
местоположение цветности (xCtbC, yCtbC), указывающее верхний левый отсчет текущего блока дерева кодирования цветности относительно верхнего левого отсчета текущего изображения.
Выходными данными этого процесса является модифицированный отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения.
Ширину и высоту текущего блока ctbWidthC и ctbHeightC дерева кодирования цветности получают следующим образом:
ctbWidthC = CtbSizeY / SubWidthC (8-1230)
ctbHeightC = CtbSizeY / SubHeightC (8-1231)
Для получения отфильтрованных реконструированных отсчетов alfPicture[x][y] цветности каждый реконструированный отсчет цветности внутри текущего блока recPicture[x][y] дерева кодирования цветности фильтруется следующим образом, используя x = 0.. ctbWidthC − 1, y = 0.. ctbHeightC − 1:
Местоположения (hx + i, vy + j) для каждой из соответствующих отсчетов цветности (x, y) в заданном массиве recPicture отсчетов цветности с i, j = −2.. 2 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и xCtbC + x − PpsVirtualBoundariesPosX[n] / SubWidthC больше или равен 0 и меньше 2 для любого n = 0.. pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + = Clip3 (PpsVirtualBoundariesPosX[n] / SubWidthC, (8-1232) pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[n] / SubWidthC − xCtbC − x больше 0 и меньше 3 для любого n = 0.. pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx +i= Clip3 (0, PpsVirtualBoundariesPosX[n]/SubWidthC − 1, xCtbC+x+i) (8-1233)
В противном случае, применяется следующее:
hx +i= Clip3 (0, pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i) (8-1234)
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtbC + y − PpsVirtualBoundariesPosY[n] / SubHeightC, больше или равно 0 и меньше 2 для любого n = 0.. pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3 (PpsVirtualBoundariesPosY[n] / SubHeightC, (8-1235) pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[n] / SubHeightC − yCtbC − y больше 0 и меньше 3 для любого n = 0.. pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3 (0, PpsVirtualBoundariesPosY[n]/SubHeightC−1, yCtbC + y + j) (8-1236)
В противном случае, применяется следующее:
vy + j = Clip3 (0, pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j) (8-1237)
Переменную applyVirtualBoundary получают следующим образом:
Если [[одно или несколько из]] следующее условие [[условий]] действительно, applyVirtualBoundary установливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
[[Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего дерева кодирования является одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_ _disabled_flag равен 1.]]
В противном случае applyVirtualBoundary устанавливается равным 1.
Реконструированные смещения r1, и r2 отсчетов определяются в таблице 8-22 в соответствии с горизонтальным положением у отсчетов яркости и applyVirtualBoundary.
Альтернативно, условие “нижняя граница текущего блока дерева кодирования является нижней границей изображения” может быть заменено условием “нижняя границай текущего блока дерева кодирования является нижней границей изображения или находится вне изображения”.
5.4 Вариант 4 осуществления
Этот вариант осуществления показывает пример запрещения использования отсчетов ниже области VPDU в процессе классификации ALF (соответствующем маркеру 7 в разделе 4).
8.8.5.3 Процесс получения индекса фильтра и транспонирования ALF для отсчетов яркости
Исходные данные процесса:
местоположение (xCtb, yCtb) отсчетов яркости, указывающее верхний левый отсчет текущего блока дерева кодирования отсчетов яркости относительно левого верхнего отсчета текущего изображения,
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации.
Выходными данными этого процесса являются
массив filtIdx[x][y] индексов классификации фильтра с x, y = 0.. CtbSizeY − 1,
массив transposeIdx[x][y] транспонированных индексов с x, y = 0.. CtbSizeY − 1.
Местоположения (hx + i, vy + j) для каждой из соответствующих отсчетов (x, y) яркости в данном массиве recPicture отсчетов яркости с i, j = −2.. 5 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и xCtb +, x − PpsVirtualBoundariesPosX[n] больше или равен 0 и меньше 2 для любого n = 0.. pps_num_ver_virtual_boundaries − 1 применяется следующее:
hx +i= Clip3 (PpsVirtualBoundariesPosX[n], pic_width_in_luma_samples − 1, xCtb + x + i) (8-1193)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[n] − xCtb − x, больше 0 и меньше 6 для любого n = 0.. pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx +i= Clip3 (0, PpsVirtualBoundariesPosX[n] − 1, xCtb + x + i) (8-1194)
В противном случае, применяется следующее:
hx +i= Clip3 (0, pic_width_in_luma_samples − 1, xCtb + x + i) (8-1195),
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtb + y − PpsVirtualBoundariesPosY[n] больше или равен 0 и меньше 2 для любого n = 0.. pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3 (PpsVirtualBoundariesPosY[n], pic_height_in_luma_samples − 1, yCtb + y + j) (8-1196),
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] − yCtb − x больше 0 и меньше 6 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] − 1, yCtb + y + j ) (8-1197)
В противном случае, применяется следующее:
Если yCtb + CtbSizeY больше или равен pic_height_in_luma_samples, применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1198)
В противном случае, если y меньше, чем CtbSizeY − 4, применяется следующее:
vy + j = Clip3( 0, yCtb + CtbSizeY − 5, yCtb + y + j ) (8-1199)
В противном случае, применяется следующее:
vy + j = Clip3( yCtb + CtbSizeY − 4, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1200)
Массив filtIdx пндексов классификации фильтров и массив transposeIdx индексов транспорирования получают посредством следующих упорядоченных этапов:
1. Переменные filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] с x, y = − 2..CtbSizeY + 1 получают следующим образом:
Если х и у оба являются четными числами или х и у оба являются нечетными числами, применяется следующее:
diff[ x ][ y ] = (predSamplesL0[ hx ][ vy ] >> shift2 ) − ( predSamplesL1[ hx ][ vy ] >> shift2 ) (8-1201)
filtV[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx, vy − 1 ] − recPicture[ hx, vy + 1 ] ) (8-1202)
filtD0[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx − 1, vy − 1 ] − recPicture[ hx + 1, vy + 1 ] ) (8-1203)
filtD1[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx + 1, vy − 1 ] − recPicture[ hx − 1, vy + 1 ] ) (8-1204)
В противном случае, filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] устанавливаются равными 0.
2. Переменные minY, maxY и ac получают следующим образом:
Если ( y << 2 ) равно (min(CtbSizeY, 64)-8) [[( CtbSizeY − 8 )]] и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается равным −2, maxY устанавливается равным 3 и ac устанавливается равным 96.
В противном случае, если ( y << 2 ) равно (min(CtbSizeY, 64)-4) [[( CtbSizeY − 4 )]] и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается раным 0, maxY устанавливается равным 5 и ac устанавливается равным 96.
В противном случае, minY устанавливается равным −2 и maxY устанавливается равным 5 и ac устанавливается равным 64.
3. Переменные varTempH1[ x ][ y ], varTempV1[ x ][ y ], varTempD01[ x ][ y ], varTempD11[ x ][ y ] и varTemp[ x ][ y ] с x, y = 0..( CtbSizeY − 1 ) >> 2 получают следующим образом:
sumH[ x ][ y ] = ΣiΣj filtH[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1205)
sumH[ x ][ y ] = ΣiΣj filtH[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1206)
sumD0[ x ][ y ] = ΣiΣj filtD0[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1207)
sumD1[ x ][ y ] = ΣiΣj filtD1[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1208)
sumOfHV[ x ][ y ] = sumH[ x ][ y ] + sumV[ x ][ y ] (8-1209)
4. Переменные dir1[ x ][ y ], dir2[ x ][ y ] и dirS[ x ][ y ] с x, y = 0..CtbSizeY − 1 получают следующим образом:
Переменные hv1, hv0 и dirHV получают следующим образом:
Переменные d1, d0 и dirD получают следующим образом:
5. Переменные avgVar[ x ][ y ] с x, y = 0..CtbSizeY − 1 получают следующим образом:
varTab[ ] = { 0, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4 } (8-1227)
avgVar[ x ][ y ] = varTab[ Clip3( 0, 15, ( sumOfHV[ x >> 2 ][ y >> 2 ] * ac ) >> ( 3 + BitDepthY ) ) ] (8-1228)
6. Массив filtIdx[ x ][ y ] индексов классификации фильтров и массив transposeIdx[ x ][ y ] индексов транспорирования с x = y = 0..CtbSizeY − 1 получают следующим образом:
transposeTable[ ] = { 0, 1, 0, 2, 2, 3, 1, 3 }
transposeIdx[ x ][ y ] = transposeTable[ dir1[ x ][ y ] * 2 + ( dir2[ x ][ y ] >> 1 ) ]
filtIdx[ x ][ y ] = avgVar[ x ][ y ]
Когда dirS[ x ][ y ] не равен 0, filtIdx[ x ][ y ] изменяется следующим образом:
filtIdx[ x ][ y ] += ( ( ( dir1[ x ][ y ] & 0x1 ) << 1 ) + dirS[ x ][ y ] ) * 5 (8-1229)
5.5 Вариант 5 осуществления
Для отсчетов, расположенных на границах многочисленного вида (например, граница секции/брика, виртуальная 360-градусная граница), процесс заполнения, применяется только однажды. То, сколько строк должны быть заполнены для каждой стороны, зависит от местоположения текущего отсчета относительно границ.
В одном примере применяется способ двухстороннего заполнения ALF. Альтернативно, дополнительно, при симметричном способе двухстороннего заполнения, когда отсчет находится на двух границах, например, одна граница находится на верхней стороне, а другая находится на нижней стороне, сколько отсчетов выполняется, определяют по ближайшей границе, как показано на фиг. 27. При этом, когда получают информацию о классификации, используются только 4 строки между двумя границами, как показано на фиг. 27.
На фиг. 26 показан пример способов заполнения, если 4 строки отсчетов находятся на двух границах. В одном из примеров, первая граница на фиг. 26 может быть виртуальной границей ALF, вторая граница на фиг. 25 может быть границей секции/брика или 360-градусной виртуальной границей.
5.6 Вариант 6 осуществления
8.8.5.2 Процесс фильтрации блока дерева кодирования для отсчетов яркости
Входными данными этого процесса являются:
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения,
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета яркости текущего изображения.
Результатом этого процесса является модифицированный отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения.
Процесс получения индексов фильтров для пункта 8.8.5.3 вызывается вместе с местоположением ( xCtb, yCtb ) и реконструированным массивом recPictureL отсчетов яркости изображения в качестве входных данных и filtIdx[ x ][ y ] и transposeIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1 в качестве выходных данных.
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов яркости с i, j = −3..3 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ], pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1197)
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] − xCtb − x больше 0 и меньше 4 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
Clip1C( x ) = Clip3( 0, ( 1 << BitDepthC ) − 1, x ) (8-1198)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1199)
[[Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равен 0 и меньше 3 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется нижеследующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ], pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1200)
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] − yCtb − y больше 0 и меньше 4 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] − 1, yCtb + y + j ) (8-1201)]]
[[В противном случае]], применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1202)
[[Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий действительно, применяется applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования являет одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.]]
Переменные boundaryPos1 и boundaryPos2 получают, используя процесс получения положения вертикальной границы для отсчетов яркости, как указано в разделе 8.8.5.5 с yCtb, равным yCtb, и y, равным y.
Таблица 8-24 – Спецификация r1, r2 и r3, соответствующих горизонтальному положению у отсчетов яркости [[applyVirtualBoundary]] boundaryPos1 и boundaryPos2.
Условие r1 r2 r3
( y = = CtbSizeY − 5 | | y = = CtbSizeY − 4 ) && ( applyVirtualBoundary = = 1 ) 0 0 0
( y = = CtbSizeY − 6 | | y = = CtbSizeY − 3 ) && ( applyVirtualBoundary = = 1 ) 1 1 1
( y = = CtbSizeY − 7 | | y = = CtbSizeY − 2 ) && ( applyVirtualBoundary = = 1 ) 1 2 2
В противном случае 1 2 3
Условие r1 r2 r3
( y = = boundaryPos1 − 1 | | y = = boundaryPos1 ) && ( boundaryPos1 > −1 && ( boundaryPos2 = = −1 | | boundaryPos2 >= boundaryPos1 + 8 ) ) 0 0 0
( y = = boundaryPos1 − 2 | | y = = boundaryPos1 + 1) && ( boundaryPos1 > −1 && ( boundaryPos2 = = −1 | | boundaryPos2 >= boundaryPos1 + 8 ) ) 1 1 1
( y = = boundaryPos1 − 3 | | y = = boundaryPos1 + 2) && ( boundaryPos1 > −1 && ( boundaryPos2 = = −1 | | boundaryPos2 >= boundaryPos1 + 8 ) ) 1 2 2
( y = = boundaryPos1 − 1 | | y = = boundaryPos1 | | y = = boundaryPos2 − 1 | | y = = boundaryPos2 ) && ( boundaryPos1 > −1 && boundaryPos2 = = boundaryPos1 + 4 ) ) 0 0 0
( y = = boundaryPos1 − 2 | | y = = boundaryPos1 + 1 | | y = = boundaryPos2 − 2 | | y = = boundaryPos2 + 1 ) && ( boundaryPos1 > −1 && boundaryPos2 = = boundaryPos1 + 4 ) ) 1 1 1
( y = = boundaryPos1 − 3 | | y = = boundaryPos2 + 2 ) && ( boundaryPos1 > −1 && boundaryPos2 = = boundaryPos1 + 4 ) ) 1 2 2
В противном случае 1 2 3
8.8.5.3 Процесс получения индекса транспонирования ALF и фильтров для отсчетов яркости
Входными данными этого процесса являются:
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета текущего изображения.
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации.
Выходными данными этого процесса являются:
массив индексов классификации фильтров filtIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1,
массив индексов транспонирования transposeIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1.
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов яркости с i, j = -2.0,5 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше 0 и меньше 2 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ], pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1208)
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] − xCtb − x больше 0 и меньше 6 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] − 1, xCtb + x + i ) (8-1209)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1210)
[[Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равен 0 и меньше 2 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется нижеследующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ], pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1211)
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] − yCtb − y больше 0 и меньше 6 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] − 1, yCtb + y + j ) (8-1212)
В противном случае, применяется следующее:
Если yCtb + CtbSizeY больше или равен pic_height_in_luma_samples, применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1213)
В противном случае, если y меньше, чем CtbSizeY − 4, применяется следующее:
vy + j = Clip3( 0, yCtb + CtbSizeY − 5, yCtb + y + j ) (8-1214)
В противном случае, применяется следующее:
vy + j = Clip3( yCtb + CtbSizeY − 4, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1215)]]
Переменные boundaryPos1 и boundaryPos2 получают, используя процесс получения положения вертикальной границы для отсчетов яркости, как указано в разделе 8.8.5.5 с yCtb, равным yCtb, и y, равным y.
Если boundaryPos1 равно −1 и boundaryPos2 равно −1, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1211)
В противном случае, если boundaryPos1 не равно −1 и boundaryPos2 равно −1, применяется следующее:
Если y меньше, чем boundaryPos1, применяется следующее:
vy + j = Clip3( 0, yCtb +boundaryPos1 − 1, yCtb + y + j ) (8-1215)
В противном случае, если y равно или больше boundaryPos1, применяется следующее:
vy + j = Clip3( yCtb + boundaryPos1, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1216)
В противном случае (boundaryPos1 не равно −1 и boundaryPos2 не равно −1, применяется следующее:
Если y меньше, чем boundaryPos1, применяется следующее:
vy + j = Clip3( 0, yCtb +boundaryPos1 − 1, yCtb + y + j ) (8-1215)
В противном случае, если y равно или больше boundaryPos2, применяется следующее:
vy + j = Clip3( yCtb + boundaryPos2, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1216)
В противном случае (y больше boundaryPos1 и равно или меньше boundaryPos2), применяется следующее:
vy + j = Clip3( yCtb + boundaryPos1, yCtb + boundaryPos2 − 1, yCtb + y + j ) (8-1216)
Массив filtIdx пндексов классификации фильтров и массив transposeIdx индексов транспорирования получают посредством следующих упорядоченных этапов:
Переменные filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] с x, y = − 2..CtbSizeY + 1 получают следующим образом:
Если х и у оба являются четными числами или х и у оба являются нечетными числами, применяется следующее:
filtH[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx − 1, vy ] − (8-1216)
recPicture[ hx + 1, vy ] )
filtV[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx, vy − 1 ] − (8-1217)
recPicture[ hx, vy + 1 ] )
filtD0[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx − 1, vy − 1 ] − (8-1218)
recPicture[ hx + 1, vy + 1 ] )
filtD1[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx + 1, vy − 1 ] − (8-1219)
recPicture[ hx − 1, vy + 1 ] )
В противном случае, filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] устанавливаются равными 0.
2. Переменные minY, maxY и ac получаются следующим образом:
Если ( y << 2 ) равно (CtbSizeY - 8) и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается раным −2, maxY устанавливается равным 3 и ac устанавливается равным 96.
В противном случае, если ( y << 2 ) равно (CtbSizeY - 4) и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается раным 0, maxY устанавливается равным 5 и ac устанавливается равным 96.
Переменные boundaryPos1 и boundaryPos2 получают, используя процесс получения положения вертикальной границы для отсчетов яркости, как указано в разделе 8.8.5.5 с yCtb, равным yCtb, и y, равным y.
Если boundaryPos1 не равно −1 и boundaryPos2 равно −1, применяют следующее:
Если y равно boundaryPos1 – 4, minY устанавливается равным −2, maxY устанавливается равным 3 и ac устанавливается равным 96.
Если y равно boundaryPos1 – 4, minY устанавливается равным 0, maxY устанавливается равным 5 и ac устанавливается равным 96.
В противном случае, minY устанавливается равным −2 и maxY устанавливается равным 5 и ac устанавливается равным 64.
В противном случае, если boundaryPos1 не равно −1 и boundaryPos2 не равно −1, применяется следующее:
Если y равно boundaryPos1 – 4, minY устанавливается равным −2, maxY устанавливается равным 3 и ac устанавливается равным 96.
В противном случае, если y равно boundaryPos2, minY устанавливается равным 0, maxY устанавливается равным 5 и ac устанавливается равным 96.
В противном случае, если y равно boundaryPos1 и boundaryPos2 равно или больше boundaryPos2 + 8, minY устанавливается равным 0, maxY устанавливается равным 5 и ac устанавливается равным 96.
В противном случае, если y равно boundaryPos1 и boundaryPos2 равно или больше boundaryPos2 + 4, minY устанавливается равным 0, maxY устанавливается равным 3 и ac устанавливается равным 128.
В противном случае, если y равно boundaryPos2 - 4 и boundaryPos2 равно или больше boundaryPos2 + 8, minY устанавливается равным -2, maxY устанавливается равным 3 и ac устанавливается равным 96.
В противном случае, minY устанавливается равным −2 и maxY устанавливается равным 5 и ac устанавливается равным 64.
В противном случае (boundaryPos1 равно -1 и boundaryPos2 равно -1), minY устанавливается равным -2, maxY устанавливается равным 5 и ac устанавливается равным 64.
[[В противном случае, minY устанавливается равным −2 и maxY устанавливается равным 5 и ac устанавливается равным 64.]]
3. Переменные sumH[ x ][ y ], sumV[ x ][ y ], sumD0[ x ][ y ], sumD1[ x ][ y ] and sumOfHV[ x ][ y ] с x, y = 0..( CtbSizeY − 1 ) >> 2 получаются следующим образом:
sumH[ x ][ y ] = ΣiΣj filtH[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1220)
sumH[ x ][ y ] = ΣiΣj filtH[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1221)
sumD0[ x ][ y ] = ΣiΣj filtD0[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1222)
sumD1[ x ][ y ] = ΣiΣj filtD1[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = −2..5, j = minY..maxY (8-1223)
sumOfHV[ x ][ y ] = sumH[ x ][ y ] + sumV[ x ][ y ] (8-1224)
8.8.5.4 Процесс фильтрации блока дерева кодирования для отсчетов яркости
Входными данными этого процесса являются:
реконструированный массив recPicture отсчетов цветности изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения,
местоположение блока кодирования цветности (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования цветности относительно левого верхнего отсчета текущего изображения.
Результатом этого процесса является модифицированный отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения.
Ширину и высоту текущего блока дерева кодирования цветности ctbWidthC и ctbHeightC получают следующим образом:
ctbWidthC = CtbSizeY / SubWidthC (8-1245)
ctbHeightC = CtbSizeY / SubHeightC (8-1246)
Для получения отфильтрованных реконструированных отсчетов alfPicture[ x ][ y ] цветности, каждый реконструированный отсчет цветности внутри текущего блока recPicture[ x ][ y ] дерева кодирования цветности фильтруется нижеследующим образом с x = 0..ctbWidthC − 1, y = 0..ctbHeightC − 1:
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов цветности с i, j = -2..2 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и xCtb + x − PpsVirtualBoundariesPosX[ n ] / SubWidthC больше или равно 0 и меньше 2 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ] / SubWidthC, (8-1247)
pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i )
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ]/ SubWidthC − xCtbC − x больше 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] / SubWidthC − 1, xCtbC + x + i ) (8-1248)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i ) (8-1249)
[[Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtbС + y − PpsVirtualBoundariesPosY[ n ] / SubHeightC больше или равен 0 и меньше 2 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется нижеследующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ] / SubHeightC , (8-1250)
pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j )
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ]/ SubHeightC − yCtbC − y больше 0 и меньше 3 для любого n = 0..pps_hor_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] / SubHeightC − 1, yCtbC + y + j ) (8-1251)
В противном случае, [[Применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j ) (8-1252)
[[Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий действительно, applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования являет одной из нижних виртуальных границизображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.]]
Переменные boundaryPos1 и boundaryPos2 получают, используя процесс получения положения вертикальной границы для отсчетов яркости, как указано в разделе 8.8.5.5 с yCtb, равным yCtb, и y, равным y.
Переменная boundaryPos1 устанавливается равной boundaryPos1 / SubWidthC.
Переменная boundaryPos2 устанавливается равной boundaryPos2 / SubWidthC.
Смещения r1 и r2 реконструированных отсчетов указываются в таблице 8-24, соответствующей горизонтальному положению у отсчетов яркости и applyVirtualBoundary.
Переменную curr получают следующим образом:
curr = recPicture[ hx, vy ] (8-1253)
Массив коэффициентов f[ j ] фильтра цветности и массив значений c[ j ] сжатия цветности получают следующим образом с j = 0..5:
f[ j ] = AlfCoeffC[ slice_alf_aps_id_chroma ][ j ] (8-1254)
c[ j ] = AlfClipC[ slice_alf_aps_id_chroma ][ j ] (8-1255)
Переменную sum получают следующим образом:
sum = f[0] * (Clip3(−c[0], c[0], recPicture[hx, vy + r2] − curr) +
Clip3(−c[0],c[0],recPicture[hx,vy−r2]−curr))+ f[1]*(Clip3(−c[1], c[1], recPicture[hx + 1, vy + r1]−curr)+Clip3(−c[1],c[1],recPicture[hx−1,vy−r1]−curr))+ f[2]*(Clip3(−c[2],c[2], recPicture[hx,vy+r1]−curr)+ Clip3(−c[2], c[2], recPicture[hx, vy−r1]−curr)) + (8-1256)
f[3]*(Clip3(−c[3], c[3], recPicture[hx−1, vy+r1]−curr)+
Clip3(−c[3],c[3],recPicture[hx+1,vy−r1]−curr))+ f[4]*(Clip3(−c[4],c[4],recPicture[ hx + 2, vy] −curr)+ Clip3(−c[4], c[4], recPicture[hx−2, vy]−curr))+
f[5]*(Clip3(−c[5], c[5], recPicture[ hx + 1, vy]−curr)+
Clip3( −c[ 5 ], c[ 5 ], recPicture[ hx − 1, vy ] − curr ))
sum = curr + ( sum + 64 ) >> 7 ) (8-1257)
Модифицированную отфильтрованную реконструированный отсчет цветности изображения alfPicture[ xCtbC + x ][ yCtbC + y ] получают следующим образом:
Если pcm_loop_filter_disabled_flag и pcm_flag[ ( xCtbC + x ) * SubWidthC ][ ( yCtbC + y ) * SubHeightC ] оба равны 1, применяется следующее:
alfPicture[ xCtbC + x ][ yCtbC + y ] = recPictureL[ hx, vy ] (8-1258)
В противном случае, (pcm_loop_filter_disabled_flag равен 0 или pcm_flag[ x ][ y ] равен 0), применяется следующее:
alfPicture[ xCtbC + x ][ yCtbC + y ] = Clip3( 0, ( 1 << BitDepthC ) − 1, sum ) (8-1259)
Таблица 8-25 – Спецификация r1 и r2, соответствующая горизонтальному положению у отсчетов яркости и applyVirtualBoundary]]
[[Условие r1 r2
( y = = ctbHeightC − 2 | | y = = ctbHeightC − 3 ) && ( applyVirtualBoundary = = 1 ) 0 0
( y = = ctbHeightC − 1 | | y = = ctbHeightC − 4 ) && ( applyVirtualBoundary = = 1 ) 1 1
В противном случае 1 2]]
Таблица 8-25 – Спецификация r1 и r2, соответствующая горизонтальному положению у отсчетов яркости и boundaryPos1 и boundaryPos2
Условие r1 r2
( y = = boundaryPos1 − 1 | | y = = boundaryPos1 ) && ( boundaryPos1 > −1 && ( boundaryPos2 = = −1 | | boundaryPos2 >= boundaryPos1 + 4 ) ) 0 0
( y = = boundaryPos1 − 2 | | y = = boundaryPos1 + 1) && ( boundaryPos1 > −1 && ( boundaryPos2 = = −1 | | boundaryPos2 >= boundaryPos1 + 4 ) ) 1 1
( y = = boundaryPos1 − 1 | | y = = boundaryPos1 | | y = = boundaryPos2 − 1 | | y = = boundaryPos2 ) && ( boundaryPos1 > −1 && boundaryPos2 = = boundaryPos1 + 2 ) ) 0 0
( y = = boundaryPos1 − 2 | | y = = boundaryPos2 + 1 ) && ( boundaryPos1 > −1 && boundaryPos2 = = boundaryPos1 + 2 ) ) 1 1
В противном случае 1 2

8.8.5.5 Процесс получения положения вертикальной границы для отсчетов яркости
Входными данными этого процесса являются:
местоположение блока кодирования яркости yCtb, указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета яркости текущего изображения,
местоположение отсчета у яркости, указывающее вертикальное положение текущего пикселя относительно левого верхнего отсчета текущего блока дерева кодирования яркости.
Выходными данными этого процесса являются:
упомянутое выше положение Pos1 вертикальной границы,
упомянутое ниже положение boundaryPos2 вертикальной границы.
Переменную boundaryPos1 получают следующим образом:
Переменная boundaryPos1 устанавливается равной -1.
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше 0 и меньше 3 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
boundaryPos1 = PpsVirtualBoundariesPosY[ n ] (8-1201)
В противном случае, если, pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] − yCtb − y больше 0 и меньше 4 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
boundaryPos1 = PpsVirtualBoundariesPosY[ n ] (8-1201)
Переменную boundaryPos2 получают следующим образом:
Переменная boundaryPos2 устанавливается равной -1.
Если нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0, применяется следующее:
Если CtbSizeY – y меньше 4, переменная boundaryPos2 устанавливается равной CtbSizeY.
В противном случае, если нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0, применяется следующее:
Если CtbSizeY – y меньше 4, переменная boundaryPos2 устанавливается равной CtbSizeY.
В противном случае, если верхняя граница текущего блока дерева кодирования является верхней границей брика и loop_filter_across_slices_enabled_flag равен 0, применяется следующее:
Если y меньше 3, переменная boundaryPos2 устанавливается равной 0.
В противном случае, если верхняя граница текущего блока дерева кодирования является верхней границей секции и loop_filter_across_slices_enabled_flag равен 0, применяется следующее:
Если y меньше 3, переменная boundaryPos2 устанавливается равной 0.
Если переменная boundaryPos1 равна -1, применяется следующее:
Переменная boundaryPos1 устанавливается равной boundaryPos2.
Переменная boundaryPos2 устанавливается равной -1.
Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий действительно, applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
В противном случае, applyVirtualBoundary устанавливается равным 1.
Если переменная applyVirtualBoundary равна 1, применяется следующее:
Если boundaryPos1 равно −1 и boundaryPos1 устанавливается равным CtbSizeY–4.
В противном случае, если boundaryPos2 равно −1, boundaryPos2 устанавливается равным CtbSizeY–4.
Если boundaryPos1 не равно −1 и boundaryPos1 не равно −1, применяется следующее:
Если boundaryPos1 равно boundaryPos2, boundaryPos2 устанавливается –1.
В противном случае, если boundaryPos1 равно или больше boundaryPos2, применяется следующее:
Переменная tmpPos устанавливается равной boundaryPos2.
Переменная boundaryPos2 устанавливается равной boundaryPos1.
Переменная boundaryPos1 устанавливается равной tmpPos.
5.7 Вариант 7 осуществления
Для CTU, он может не совпадать ни с какой границей (например, с границей изображения/секции/плитки/брика/субизображения). Однако, может оказаться необходимым получать доступ к отсчетам за пределами текущего блока (например, изображения/секции/плитки/брика/субизображения). Если фильтрация, пересекающая границу секции (например, loop_filter_across_slices_enabled_flag is false), запрещается, нам необходимо заполнить отсчет вне текущего блока.
Например, для отсчета 2801 (беря для примера отсчет яркости) на фиг. 28, отсчеты, используемые в процессе фильтрации ALF могут быть заполнены, как на фиг. 29.
5.8 Вариант 8 осуществления
В этом варианте осуществления применяются нижеследующие основные идеи.
На виртуальных границах разрешения ALF:
- Для CTU, которые не находятся в последней строке CTU на изображении (например, нижняя граница CTU не является нижней границей изображения или превышает нижнюю границу изображения), виртуальная граница ALF разрешается, то есть, один CTU может быть разбит на две или более частей и отсчетам в одной части запрещается использовать отсчеты из другой части.
- Для CTU, которые находятся в последней строке CTU на изображении (например, нижняя граница CTU является нижней границей изображения или превышает нижнюю границу изображения), виртуальная граница ALF разрешается, то есть, один CTU может быть разбит на две или более частей и отсчетам в одной части запрещается использовать отсчеты из другой части.
При заполнении границ (включая виртуальные границы ALF, границы секции/плитки/брика/субизображения, "виртуальные границы 360") в процессе классификации:
Для отсчета на одной (или на многих типах) границе, когда соседствующие отсчеты, пересекающие границу, запрещаются для использования, выполняется одностороннее заполнение, чтобы заполнить такие соседствующие отсчеты.
При заполнении границ (включая виртуальные границы ALF, границы секции/плитки/брика/субизображения, "виртуальные границы 360") в процессе классификации:
- Для отсчета на одной (или на многих типах) границе, которая является границей секции/плитки/брика/субизображения или "виртуальной границей 360", которая совпадает с границей CTU, когда соседствующие отсчеты, пересекающие границу, запрещаются для использования, выполняется двухстороннее заполнение, чтобы заполнить такие соседствующие отсчеты.
- Для отсчета на одной (или на многих типах) границе, которая является границей секции/плитки/брика/субизображения или "виртуальной границей 360", которая совпадает с границей CTU, когда соседствующие отсчеты, пересекающие границу, запрещаются для использования, выполняется двухстороннее заполнение, чтобы заполнить такие соседствующие отсчеты.
8.8.5.2 Процесс фильтрации блока дерева кодирования для отсчетов яркости
Входными данными этого процесса являются:
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения,
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета яркости текущего изображения.
Результатом этого процесса является модифицированный отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения.
Процесс получения индексов фильтров для пункта 8.8.5.3 вызывается вместе с местоположением ( xCtb, yCtb ) и реконструированным массивом recPictureL отсчетов яркости изображения в качестве входных данных и filtIdx[ x ][ y ] и transposeIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1 в качестве выходных данных.
Для получения отфильтрованных реконструированных отсчетов alfPictureL[ x ][ y ] яркости, каждый реконструированный отсчет яркости внутри текущего блока recPictureL[ x ][ y ] дерева кодирования яркости фильтруется нижеследующим образом с x, y = 0..CtbSizeY − 1:
Массив коэффициентов f[ j ] фильтра яркости и массив значений c[ j ] сжатия яркости, соответствующий фильтру, указанному посредством filtIdx[ x ][ y ], получают следующим образом с j = 0..11:
Если AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize ][ yCtb >> Log2CtbSize ] меньше 16, применяется следующее:
i = AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize ][ yCtb >> Log2CtbSize ] (8-1187)
f[ j ] = AlfFixFiltCoeff[ AlfClassToFiltMap[ i ][ filtIdx[ x ][ y ] ] ][ j ] (8-1188)
c[ j ] = 2BitdepthY (8-1189)
В противном случае, (AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize][ yCtb >> Log2CtbSize ] больше или равно 16, применяется следующее:
i = slice_alf_aps_id_luma[ AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize ][ yCtb >> Log2CtbSize ] − 16 ] (8-1190)
f[ j ] = AlfCoeffL[ i ][ filtIdx[ x ][ y ] ][ j ] (8-1191)
c[ j ] = AlfClipL[ i ][ filtIdx[ x ][ y ] ][ j ] (8-1192)
Коэффициенты фильтра яркости и значения сжатия index idx получают в зависимости от transposeIdx[ x ][ y ], как показано далее:
Если [ x ][ y ] равно 1, применяется следующее:
idx[ ] = { 9, 4, 10, 8, 1, 5, 11, 7, 3, 0, 2, 6 } (8-1193)
В противном случае, если transposeIndex[ x ][ y ] равно 2, применяется следующее:
idx[ ] = { 0, 3, 2, 1, 8, 7, 6, 5, 4, 9, 10, 11 } (8-1194)
В противном случае, если transposeIndex[ x ][ y ] равно 3, применяется следующее:
idx[ ] = { 9, 8, 10, 4, 3, 7, 11, 5, 1, 0, 2, 6 } (8-1195)
В противном случае, применяется следующее:
idx[ ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } (8-1196)
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов яркости с i, j = −3..3 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше или равно 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ], pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1197)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosX[ n ] - xCtb - x больше 0 и меньше 4 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] − 1, xCtb + x + i ) (8-1198)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1199)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
hx + i = Clip3( SubPicLeftBoundaryPos, SubPicRightBoundaryPos, hx + i ) (8-1184)]]
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равно 0 и меньше 3 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ], pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1200)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosY[ n ] - yCtb - y больше 0 и меньше 4 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] − 1, yCtb + y + j ) (8-1201)
В противном случае, применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1202)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
vy + j = Clip3( SubPicTopBoundaryPos, SubPicBotBoundaryPos, vy + j ) (8-1184)
Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий действительно, applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей субизображения и loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ), равно 0.
Нижняя граница текущего блока дерева кодирования являет одной из нижних виртуальных границизображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.]]
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos получают, применяя процесс получения положения горизонтальной границы для отсчетов яркости, как указано в разделе 8.8.5.5 с (xCtb, yCtb) and (x, y) в качестве входных данных.
Смещения r1 r2 и r3 реконструированных отсчетов указываются в таблице 8-24, соответствующей горизонтальному положению у отсчетов яркости и clipTopPos and clipBottomPos [[applyVirtualBoundary]]./
Смещения с1, с2 и с3 реконструированных отсчетов указываются в таблице 8-25, соответствующей вертикальному положению х отсчетов яркости и clipLeftPos and clipRightPos.
Переменную curr получают следующим образом:
curr = recPictureL[ hx, vy ] (8-1203)
Переменную sum получают следующим образом:
sum = f[ idx[ 0 ] ]* (Clip3( −c[ idx[ 0 ] ], c[ idx[ 0 ] ], recPictureL[ hx, vy + r3 ] − curr ) + Clip3( −c[ idx[ 0 ] ], c[ idx[ 0 ] ], recPictureL[ hx, vy − r3 ] − curr ) ) +
f[ idx[ 1 ] ] * (Clip3( −c[ idx[ 1 ] ], c[ idx[ 1 ] ], recPictureL[ hx + c1, vy + r2 ] − curr ) +
Clip3( −c[ idx[ 1 ] ], c[ idx[ 1 ] ], recPictureL[ hx − c1, vy − r2 ] − curr ) ) +
f[ idx[ 2 ] ] * (Clip3( −c[ idx[ 2 ] ], c[ idx[ 2 ] ], recPictureL[ hx, vy + r2 ] − curr ) +
Clip3( −c[ idx[ 2 ] ], c[ idx[ 2 ] ], recPictureL[ hx, vy − r2 ] − curr ) ) +
f[ idx[ 3 ] ] * (Clip3( −c[ idx[ 3 ] ], c[ idx[ 3 ] ], recPictureL[ hx − c1, vy + r2 ] − curr ) +
Clip3( −c[ idx[ 3 ] ], c[ idx[ 3 ] ], recPictureL[ hx + c1, vy − r2 ] − curr ) ) +
f[ idx[ 4 ] ] * (Clip3( −c[ idx[ 4 ] ], c[ idx[ 4 ] ], recPictureL[ hx + c2, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 4 ] ], c[ idx[ 4 ] ], recPictureL[ hx − c2, vy − r1 ] − curr ) ) +
f[ idx[ 5 ] ] * (Clip3( −c[ idx[ 5 ] ], c[ idx[ 5 ] ], recPictureL[ hx + c1, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 5 ] ], c[ idx[ 5 ] ], recPictureL[ hx − c2, vy − r1 ] − curr ) ) +
f[ idx[ 6 ] ] * (Clip3( −c[ idx[ 6 ] ], c[ idx[ 6 ] ], recPictureL[ hx, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 6 ] ], c[ idx[ 6 ] ], recPictureL[ hx, vy − r1 ] − curr ) ) + (8-1204)
f[ idx[ 7 ] ] * (Clip3( −c[ idx[ 7 ] ], c[ idx[ 7 ] ], recPictureL[ hx − c1, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 7 ] ], c[ idx[ 7 ] ], recPictureL[ hx + c1, vy − r1 ] − curr ) ) +
f[ idx[ 8 ] ] * (Clip3( −c[ idx[ 8 ] ], c[ idx[ 8 ] ], recPictureL[ hx − c2, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 8 ] ], c[ idx[ 8 ] ], recPictureL[ hx + c2, vy − r1 ] − curr ) ) +
f[ idx[ 9 ] ] * (Clip3( −c[ idx[ 9 ] ], c[ idx[ 9 ] ], recPictureL[ hx + c3, vy ] − curr ) +
Clip3( −c[ idx[ 9 ] ], c[ idx[ 9 ] ], recPictureL[ hx − c3, vy ] − curr ) ) +
f[ idx[ 10 ] ] * (Clip3( −c[ idx[ 10 ] ], c[ idx[ 10 ] ], recPictureL[ hx + c2, vy ] − curr ) +
Clip3( −c[ idx[ 10 ] ], c[ idx[ 10 ] ], recPictureL[ hx − c2, vy ] − curr ) ) +
f[ idx[ 11 ] ] * (Clip3( −c[ idx[ 11 ] ], c[ idx[ 11 ] ], recPictureL[ hx + c1, vy ] − curr ) +
Clip3( −c[ idx[ 11 ] ], c[ idx[ 11 ] ], recPictureL[ hx − c1, vy ] − curr ) )
sum = curr + ( ( sum + 64 ) >> 7 ) (8-1205)
Модифицированную отфильтрованную реконструированный отсчет яркости изображения alfPictureL[ xCtb + x ][ yCtb + y ] получают следующим образом:
Если pcm_loop_filter_disabled_flag и pcm_flag[ xCtb+ x ][ yCtb + y ] оба равны 1, применяется следующее:
alfPictureL[ xCtb + x ][ yCtb + y ] = recPictureL[ hx, vy ] (8-1206)
В противном случае, (pcm_loop_filter_disabled_flag равен 0 или pcm_flag[ x ][ y ] равен 0), применяется следующее:
alfPictureL[ xCtb + x ][ yCtb + y ] = Clip3( 0, ( 1 << BitDepthY ) − 1, sum ) (8-1207)
Таблица 8-24 – Спецификация r1, r2 и r3, соответствующих горизонтальному положению отсчетов яркости у clipTopPos b clipBottomPos [[b applyVirtualBoundary]]
[[Условие r1 r2 r3
( y = = CtbSizeY − 5 | | y = = CtbSizeY − 4 ) && ( applyVirtualBoundary = = 1 ) 0 0 0
( y = = CtbSizeY − 6 | | y = = CtbSizeY − 3 ) && ( applyVirtualBoundary = = 1 ) 1 1 1
( y = = CtbSizeY − 7 | | y = = CtbSizeY − 2 ) && ( applyVirtualBoundary = = 1 ) 1 2 2
В противном случае 1 2 3]]
Условие r1 r2 r3
( y = = clipBottomPos − 1 | | y = = clipTopPos ) 0 0 0
( y = = clipBottomPos − 2 | | y = = clipTopPos + 1) 1 1 1
( y = = clipBottomPos − 3 | | y = = clipTopPos + 2) && (clipBottomPos != clipTopPos + 4)  1 2 2
( y = = clipTopPos + 2 ) && (clipBottomPos = = clipTopPos + 4)  1 1 1
В противном случае 1 2 3
Таблица 8-24 – Спецификация с1, с2 и с3, соответствующих вертикальному положению отсчетов яркости х, clipLeftPos и clipRightPos
Условие c1 c2 c3
(xCtb + x == clipLeftPos || xCtb + x == clipRightPos -1) 0 0 0
(xCtb + x == clipLeftPos +1 || xCtb + x == clipRightPos -2) 1 1 1
(xCtb + x == clipLeftPos +2 || xCtb + x == clipRightPos -3) 1 2 2
В противном случае 1 2 3
8.8.5.3 Процесс получения индекса транспонирования ALF и фильтров для отсчетов яркости
Входными данными этого процесса являются:
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета текущего изображения.
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации.
Выходными данными этого процесса являются:
массив индексов классификации фильтров filtIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1,
массив индексов транспонирования transposeIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1.
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов яркости с i, j = -2.0,5 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше или равно 0 и меньше 2 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ], pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1208)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosX[ n ] - xCtb - x больше 0 и меньше 6 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] − 1, xCtb + x + i ) (8-1209)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1210)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
hx + i = Clip3( SubPicLeftBoundaryPos, SubPicRightBoundaryPos, hx + i ) (8-1184)]]
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равно 0 и меньше 2 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ], pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1211)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosY[ n ] - yCtb - y больше 0 и меньше 6 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] − 1, yCtb + y + j ) (8-1212)
В противном случае, применяется следующее:
Если yCtb + CtbSizeY больше или равен pic_height_in_luma_samples, применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1213)
[[В противном случае, если y меньше, чем CtbSizeY − 4, применяется следующее:
vy + j = Clip3( 0, yCtb + CtbSizeY − 5, yCtb + y + j ) (8-1214)
В противном случае, применяется следующее:
vy + j = Clip3( yCtb + CtbSizeY − 4, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1215)
Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ), равно 0, применяется следующее:
vy + j = Clip3( SubPicTopBoundaryPos, SubPicBotBoundaryPos, vy + j ) (8-1184)]]
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos получают, применяя процесс получения положения горизонтальной границы для отсчетов яркости, как указано в разделе 8.8.5.5 с (xCtb, yCtb) и (x, y).
Если clipTopPos не равна -128, применяется следующее:
vy + j = Clip3( clipTopPos, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1213)
Если clipBottomPos не равна -128, применяется следующее:
vy + j = Clip3( 0, clipBottomPos − 1, yCtb + y + j ) (8-1213)
Если clipLeftPos не равна -128, применяется следующее:
hx + i = Clip3( clipLeftPos, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1213)
Если clipRightPos не равна -128, применяется следующее:
hx + i = Clip3( 0, clipRightPos − 1, xCtb + x + i ) (8-1213)
Массив filtIdx пндексов классификации фильтров и массив transposeIdx индексов транспорирования получают посредством следующих упорядоченных этапов:
1. Переменные filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] с x, y = − 2..CtbSizeY + 1 получают следующим образом:
Если х и у оба являются четными числами или х и у оба являются нечетными числами, применяется следующее:
filtH[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx − 1, vy ] − (8-1216)
recPicture[ hx + 1, vy ] )
filtV[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx, vy − 1 ] − (8-1217)
recPicture[ hx, vy + 1 ] )
filtD0[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx − 1, vy − 1 ] − (8-1218)
recPicture[ hx + 1, vy + 1 ] )
filtD1[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx + 1, vy − 1 ] − (8-1219)
recPicture[ hx − 1, vy + 1 ] )
В противном случае, filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] устанавливаются равными 0.
2. [[Переменные minY, maxY и ac получаются следующим образом:
Если ( y << 2 ) равно (CtbSizeY - 8) и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается раным −2, maxY устанавливается равным 3 и ac устанавливается равным 96.
В противном случае, если ( y << 2 ) равно (CtbSizeY - 4) и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается равным 0, maxY устанавливается равным 5 и ac устанавливается равным 96.]]
3. Переменные sumH[ x ][ y ], sumV[ x ][ y ], sumD0[ x ][ y ], sumD1[ x ][ y ] and sumOfHV[ x ][ y ] с x, y = 0..( CtbSizeY − 1 ) >> 2 получаются следующим образом:
Переменные minY, maxY и ac получаются следующим образом:
Если clipTopPos не равно -128 и clipBottomPos равно -128, применяют следующее:
Если ( y << 2 ) равно clipTopPos, minY устанавливается равным 0, maxY устанавливается равным 5.
В противном случае, если clipTopPos равно -128 и clipBottomPos не равно -128, применяют следующее:
Если ( y << 2 ) равно ( clipBottomPos – 4 ), minY устанавливается равным -2, maxY устанавливается равным 3.
В противном случае, если clipTopPos не равно -128 и clipBottomPos не равно -128, применяется следующее:
minY устанавливается равным 0, maxY устанавливается равным 3.
В противном случае, minY устанавливается равным −2 и maxY устанавливается равным 5 и ac устанавливается равным 64.
Переменные minY, maxY и ac получаются следующим образом:
Если clipLeftPos не равна -128, применяется следующее:
Если ( x << 2 ) равно clipLeftPos, minХ устанавливается равным 0, maxХ устанавливается равным 5.
В противном случае, если clipRightPos не равно -128, применяется следующее:
Если ( x << 2 ) равно (clipRightPos – 4), minХ устанавливается равным -2, maxХ устанавливается равным 3.
В противном случае, minХ устанавливается равным -2, maxХ устанавливается равным 5.
Переменную ac получают в соответствии с таблицей 8-24.
Таблица 8-24 – Спецификация ac, соответствующая minX, minY, maxX, maxY
(maxY – minY + 1) * (maxX – minX + 1) 8*8 8*6 8*4 6*6 6*4
ас 64 96 128 112 192
sumH[ x ][ y ] = ΣiΣj filtH[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1220)
sumV[ x ][ y ] = ΣiΣj filtV[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1221)
sumD0[ x ][ y ] = ΣiΣj filtD0[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1222)
sumD1[ x ][ y ] = ΣiΣj filtD1[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1223)
sumOfHV[ x ][ y ] = sumH[ x ][ y ] + sumV[ x ][ y ] (8-1224)
4. Переменные dir1[ x ][ y ], dir2[ x ][ y ] и dirS[ x ][ y ] с x, y = 0..CtbSizeY − 1 получают следующим образом:
Переменные hv1, hv0 и dirHV получают следующим образом:
Если sumV[ x >> 2 ][ y >> 2 ] больше, чем sumH[ x >> 2 ][ y >> 2 ], применяется следующее:
hv1 = sumV[ x >> 2 ][ y >> 2 ] (8-1225)
hv0 = sumH[ x >> 2 ][ y >> 2 ] (8-1226)
dirHV = 1 (8-1227)
В противном случае, применяется следующее:
hv1 = sumH[ x >> 2 ][ y >> 2 ] (8-1228)
hv0 = sumV[ x >> 2 ][ y >> 2 ] (8-1229)
dirHV = 3 (8-1230)
Переменные d1, d0 и dirD получают следующим образом:
Если sumD0[ x >> 2 ][ y >> 2 ] больше, чем sumD1[ x >> 2 ][ y >> 2 ], применяется следующее:
d1 = sumD0[ x >> 2 ][ y >> 2 ] (8-1231)
d0 = sumD1[ x >> 2 ][ y >> 2 ] (8-1232)
dirD = 0 (8-1233)
В противном случае, применяется следующее:
d1 = sumD1[ x >> 2 ][ y >> 2 ] (8-1234)
d0 = sumD0[ x >> 2 ][ y >> 2 ] (8-1235)
dirD = 2 (8-1236)
Переменные hvd1, hv0 получают следующим образом:
hvd1 = ( d1 * hv0 > hv1 * d0 ) ? d1 : hv1 (8-1237)
hvd0 = ( d1 * hv0 > hv1 * d0 ) ? d0 : hv0 (8-1238)
Переменные dirS[ x ][ y ], dir1[ x ][ y ] и dir2[ x ][ y ] получают следующим образом:
dir1[ x ][ y ] = ( d1 * hv0 > hv1 * d0 ) ? dirD : dirHV (8-1239)
dir2[ x ][ y ] = ( d1 * hv0 > hv1 * d0 ) ? dirHV : dirD (8-1240)
dirS[ x ][ y ] = ( hvd1 > 2 * hvd0 ) ? 1 : ( ( hvd1 * 2 > 9 * hvd0 ) ? 2 : 0 ) (8-1241)
5. Переменные avgVar[ x ][ y ] с x, y = 0..CtbSizeY − 1 получают следующим образом:
varTab[ ] = { 0, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4 } (8-1242)
avgVar[ x ][ y ] = varTab[ Clip3( 0, 15, ( sumOfHV[ x >> 2 ][ y >> 2 ] * ac ) >> ( 3 + BitDepthY ) ) ] (8-1243)
6. Массив filtIdx[ x ][ y ] индексов классификации фильтров и массив transposeIdx[ x ][ y ] индексов транспонирования с x = y = 0..CtbSizeY − 1 получают следующим образом:
transposeTable[ ] = { 0, 1, 0, 2, 2, 3, 1, 3 }
transposeIdx[ x ][ y ] = transposeTable[ dir1[ x ][ y ] * 2 + ( dir2[ x ][ y ] >> 1 ) ]
filtIdx[ x ][ y ] = avgVar[ x ][ y ]
Когда dirS[ x ][ y ] не равен 0, filtIdx[ x ][ y ] изменяется следующим образом:
filtIdx[ x ][ y ] += ( ( ( dir1[ x ][ y ] & 0x1 ) << 1 ) + dirS[ x ][ y ] ) * 5 (8-1244)
8.8.5.4 Процесс фильтрации блока дерева кодирования для отсчетов цветности
Входными данными этого процесса являются:
реконструированный массив recPicture отсчетов цветности изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения,
местоположение блока кодирования цветности (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования цветности относительно левого верхнего отсчета текущего изображения.
Результатом этого процесса является модифицированный отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения.
Ширину и высоту текущего блока дерева кодирования цветности ctbWidthC и ctbHeightC получают следующим образом:
ctbWidthC = CtbSizeY / SubWidthC (8-1245)
ctbHeightC = CtbSizeY / SubHeightC (8-1246)
Для получения отфильтрованных реконструированных отсчетов alfPicture[ x ][ y ] цветности, каждый реконструированный отсчет цветности внутри текущего блока recPicture[ x ][ y ] дерева кодирования цветности фильтруется нижеследующим образом с x = 0..ctbWidthC − 1, y = 0..ctbHeightC − 1:
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов цветности с i, j = -2..2 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и xCtb + x − PpsVirtualBoundariesPosX[ n ]/ SubWidthC больше или равно 0 и меньше 2 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ] / SubWidthC , (8-1247)
pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i )
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosX[ n ]/ SubWidthC - xCtb - x больше 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] / SubWidthC − 1, xCtbC + x + i ) (8-1248)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i ) (8-1249)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
hx + i = Clip3( SubPicLeftBoundaryPos / SubWidthC, SubPicRightBoundaryPos / SubWidthC, hx + i ) (8-1184)]]
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и xCtbC + y − PpsVirtualBoundariesPosY[ n ]/ SubHeightC больше или равно 0 и меньше 2 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ] / SubHeightC , (8-1250)
pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j )
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosY[ n ]/ SubHeightC - yCtbC - y больше 0 и меньше 3 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] / SubHeightC − 1, yCtbC + y + j ) (8-1251)
В противном случае, применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j ) (8-1252)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
vy + j = Clip3( SubPicTopBoundaryPos / SubWidthC, SubPicBotBoundaryPos / SubWidthC, vy + j ) (8-1184)
Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий действительно, applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей субизображения и loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ), равно 0.
Нижняя граница текущего блока дерева кодирования являет одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.]]
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos получают, применяя процесс получения положения горизонтальной границы для отсчетов яркости, как указано в разделе 8.8.5.5 с (xCtbC* SubWidthC, yCtbC*SubWidthC) and (x*SubWidthC, y*SubWidthC) в качестве входных данных.
Переменная clipTopPos устанавливается равной clipLeftPos / SubWidthC.
Переменная clipBottomPos устанавливается равной clipRightPos / SubWidthC.
Переменная clipTopPos устанавливается равной clipTopPos / SubWidthC.
Переменная clipBottomPos устанавливается равной clipBottomPos / SubWidthC.
Смещения r1 и r2 реконструированных отсчетов указываются в таблице 8-27, соответствующей горизонтальному положению у отсчетов яркости и clipBottomPos [[and applyVirtualBoundary]].
Смещения с1 и с2 реконструированных отсчетов указываются в таблице 8-28, соответствующей вертикальному положению х отсчетов яркости, clipLeftPos и clipRightPos.
Переменную curr получают следующим образом:
curr = recPicture[ hx, vy ] (8-1253)
Массив коэффициентов f[ j ] фильтра цветности и массив значений c[ j ] сжатия цветности получают следующим образом с j = 0..5:
f[ j ] = AlfCoeffC[ slice_alf_aps_id_chroma ][ j ] (8-1254)
c[ j ] = AlfClipC[ slice_alf_aps_id_chroma ][ j ] (8-1255)
Переменную sum получают следующим образом:
sum = f[ 0 ] * ( Clip3( −c[ 0 ], c[ 0 ], recPicture[ hx, vy + r2 ] − curr ) +
Clip3( −c[ 0 ], c[ 0 ], recPicture[ hx, vy − r2 ] − curr ) ) +
f[ 1 ] * ( Clip3( −c[ 1 ], c[ 1 ], recPicture[ hx + c1, vy + r1 ] − curr ) +
Clip3( −c[ 1 ], c[ 1 ], recPicture[ hx − c1, vy − r1 ] − curr ) ) +
f[ 2 ] * ( Clip3( −c[ 2 ], c[ 2 ], recPicture[ hx, vy + r1 ] − curr ) +
Clip3( −c[ 2 ], c[ 2 ], recPicture[ hx, vy − r1 ] − curr ) ) + (8-1256)
f[ 3 ] * ( Clip3( −c[ 3 ], c[ 3 ], recPicture[ hx − c1, vy + r1 ] − curr ) +
Clip3( −c[ 3 ], c[ 3 ], recPicture[ hx + c1, vy − r1 ] − curr ) ) +
f[ 4 ] * ( Clip3( −c[ 4 ], c[ 4 ], recPicture[ hx + c2, vy ] − curr ) +
Clip3( −c[ 4 ], c[ 4 ], recPicture[ hx − c2, vy ] − curr ) ) +
f[ 5 ] * ( Clip3( −c[ 5 ], c[ 5 ], recPicture[ hx + c1, vy ] − curr ) +
Clip3( −c[ 5 ], c[ 5 ], recPicture[ hx − c1, vy ] − curr ) )
sum = curr + ( sum + 64 ) >> 7 ) (8-1257)
Модифицированную отфильтрованную реконструированный отсчет цветности изображения alfPicture[ xCtbC + x ][ yCtbC + y ] получают следующим образом:
Если pcm_loop_filter_disabled_flag и pcm_flag[ ( xCtbC + x ) * SubWidthC ][ ( yCtbC + y ) * SubHeightC ] оба равны 1, применяется следующее:
alfPicture[ xCtbC + x ][ yCtbC + y ] = recPictureL[ hx, vy ] (8-1258)
В противном случае, (pcm_loop_filter_disabled_flag равен 0 или pcm_flag[ x ][ y ] равен 0), применяется следующее:
alfPicture[ xCtbC + x ][ yCtbC + y ] = Clip3( 0, ( 1 << BitDepthC ) − 1, sum ) (8-1259)
Таблица 8-27 – Спецификация r1 и r2, соответствующих горизонтальному положению у отсчетов яркости, clipTopPos и clipBottomPos [[и applyVirtualBoundary]]
[[Условие r1 r2
( y = = ctbHeightC − 2 | | y = = ctbHeightC − 3 ) && ( applyVirtualBoundary = = 1 ) 0 0
( y = = ctbHeightC − 1 | | y = = ctbHeightC − 4 ) && ( applyVirtualBoundary = = 1 ) 1 1
В противном случае 1 2]]
Условие r1 r2
( y = = clipBottomPos − 1 | | y = = clipTopPos ) 0 0
( y = = clipBottomPos − 2 | | y = = clipTopPos + 1 ) && (clipBottomPos != clipTopPos + 2 ) 1 1
( y = = clipTopPos + 1) && (clipBottomPos = = clipTopPos + 2 ) 0 0
В противном случае 1 2
Таблица 8-28 – Спецификация с1 и с2, соответствующих вертикальному положению х отсчетов яркости, clipLeftPos и clipRightPos
Условие c1 c2
(xCtbC + x == clipLeftPos || xCtbC + x == clipRightPos – 1 ) 0 0
(xCtbC + x == clipLeftPos + 1 || xCtbC + x == clipRightPos – 2) 1 1
В противном случае 1 2
8.8.5.5 Процесс получения положения границы ALF для отсчетов
Входными данными этого процесса являются:
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета яркости текущего изображения.
местоположение (x, y) отсчета, указывающее положение текущего отсчета относительно левого верхнего отсчета текущего блока дерева кодирования яркости.
Выходными данными этого процесса являются:
положение левой вертикальной границы clipLeftPos,
положение правой вертикальной границы clipRightPos,
положение верхней горизонтальной границы clipTopPos,
положение нижней горизонтальной границы clipBottomPos.
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos устанавливаются равными −128.
Переменная applyVirtualBoundary модифицируется следующим образом:
Если нижняя граница текущего блока дерева кодирования не является нижней границей изображения и y – ( CtbSizeY – 4 ) больше или равно 0, переменная clipTopPos устанавливается равной yCtb + CtbSizeY – 4.
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY равно 0, PpsVirtualBoundariesPosY[ n ] не равно pic_height_in_luma_samples – 1 или 0, и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равно 0 и меньше 3для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
clipTopPos = PpsVirtualBoundariesPosY[ n ] (8-1201)
В противном случае, если у меньше 3 и верхняя граница текущего блока дерева кодирования не является верхней границей изображения и одно из следующих условий действительно, переменная clipTopPos устанавливается равной yCtb:
Если верхняя граница текущего блока дерева кодирования является верхней границей брика, loop_filter_across_bricks_enabled_flag равен 0.
Если верхняя граница текущего блока дерева кодирования является верхней границей секции, loop_filter_across_slices_enabled_flag равен 0.
Если верхняя граница текущего блока дерева кодирования является верхней границей субизображения, loop_filter_across_sub_pic_enabled_flag равен 0.
Переменная clipBottomPos модифицируется следующим образом:
Если нижняя граница текущего блока дерева кодирования не является нижней границей изображения и CtbSizeY – 4 – y больше 0 и меньше 4, переменная clipBottomPos устанавливается равной yCtb + CtbSizeY – 4.
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY равно 0, PpsVirtualBoundariesPosY[ n ] не равно pic_height_in_luma_samples – 1 или 0, и PpsVirtualBoundariesPosY[ n ] - yCtb + y больше или равно 0 и меньше 4 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
clipBottomPos = PpsVirtualBoundariesPosY[ n ] (8-1201)
В противном случае, если CtbSizeY – у меньше 4 и нижняя граница текущего блока дерева кодирования не является нижней границей изображения и одно из следующих условий действительно, переменная clipBottomPos устанавливается равной yCtb + CtbSizeY:
Если нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Если нижняя граница текущего блока дерева кодирования является нижней границей брика, loop_filter_across_slices_enabled_flag равен 0.
Если нижняя граница текущего блока дерева кодирования является нижней границей субизображения, loop_filter_across_sub_pic_enabled_flag равен 0.
Переменная clipLeftPos модифицируется следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY равно 0, PpsVirtualBoundariesPosX[ n ] не равно pic_width_in_luma_samples – 1 или 0, и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше или равно 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
clipLeftPos = PpsVirtualBoundariesPosX[ n ] (8-1201)
В противном случае, если х меньше 3, левая граница текущего блока дерева кодирования не является левой границей изображения и одно из следующих условий действительно, переменная clipLeftPos устанавливается равной хCtb:
Если левая граница текущего блока дерева кодирования является левой границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Если левая граница текущего блока дерева кодирования является левой границей секции и loop_filter_across_slices_enabled_flag равен 0.
Если левая граница текущего блока дерева кодирования является левой границей субизображения, loop_filter_across_sub_pic_enabled_flag равен 0.
Переменная clipRightPos модифицируется следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY равно 0, PpsVirtualBoundariesPosX[ n ] не равно pic_width_in_luma_samples – 1 или 0, и PpsVirtualBoundariesPosX[ n ]− xCtb − x больше 0 и меньше 4 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
clipRightPos = PpsVirtualBoundariesPosX[ n ] (8-1201)
В противном случае, если CtbSizeY – х меньше 4 и правая граница текущего блока дерева кодирования не является правой границей изображения и одно из следующих условий действительно, переменная clipRightPos устанавливается равной хCtb + CtbSizeY.
Если правая граница текущего блока дерева кодирования является правой границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Если правая граница текущего блока дерева кодирования является правой границей секции и loop_filter_across_slices_enabled_flag равен 0.
Если правая граница текущего блока дерева кодирования является правой границей субизображения, loop_filter_across_sub_pic_enabled_flag равен 0.
Конкретное значение -128, используемое в представленном выше варианте осуществления, может быть заменено другими значениями, такими как –K, где, например, K больше или не меньше, чем количество строк, смещенных относительно нижней границы CTU (например, K = -5).
Альтернативно, условная проверка “PpsVirtualBoundariesPosY[ n ] не равно pic_height_in_luma_samples – 1 или 0” может быть дополнительно удалена, основываясь на том, что PpsVirtualBoundariesPosY[ n ] находится в области от 1 до Ceil( pic_height_in_luma_samples ч 8 ) − 1, включительно.
Альтернативно, один флаг может использоваться для маркировки, требуется ли для каждой из отсчетов обработка иным способом, если она располагается на границах видеоблока.
5.9 Вариант 9 осуществления
В этом варианте осуществления применяются нижеследующие основные идеи.
На виртуальных границах разрешения ALF:
- Для CTU, которые не находятся в последней строке CTU на изображении (например, нижняя граница CTU не является нижней границей изображения или превышает нижнюю границу изображения), виртуальная граница ALF разрешается, то есть, один CTU может быть разбит на две или более частей и отсчетам в одной части запрещается использовать отсчеты из другой части.
- Для CTU, которые находятся в последней строке CTU на изображении (например, нижняя граница CTU является нижней границей изображения или превышает нижнюю границу изображения), виртуальная граница ALF разрешается, то есть, один CTU может быть разбит на две или более частей и отсчетам в одной части запрещается использовать отсчеты из другой части.
При заполнении границ (включая виртуальные границы ALF, границы секции/плитки/брика/субизображения, "виртуальные границы 360") в процессе классификации:
Для отсчета на одной (или на многих типах) границе, когда соседствующие отсчеты, пересекающие границу, запрещаются для использования, выполняется одностороннее заполнение, чтобы заполнить такие соседствующие отсчеты.
При заполнении границ (включая виртуальные границы ALF, границы секции/плитки/брика/субизображения, "виртуальные границы 360") в процессе классификации:
- Для отсчета на одной (или на многих типах) границе, которая является границей секции/плитки/брика/субизображения или "виртуальной границей 360", которая совпадает с границей CTU, когда соседствующие отсчеты, пересекающие границу, запрещаются для использования, выполняется двухстороннее заполнение, чтобы заполнить такие соседствующие отсчеты.
- Для отсчета на одной (или на многих типах) границе, которая является границей секции/плитки/брика/субизображения или "виртуальной границей 360", которая совпадает с границей CTU, когда соседствующие отсчеты, пересекающие границу, запрещаются для использования, выполняется двухстороннее заполнение, чтобы заполнить такие соседствующие отсчеты.
8.8.5.2 Процесс фильтрации блока дерева кодирования для отсчетов яркости
Входными данными этого процесса являются:
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения,
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета яркости текущего изображения.
Результатом этого процесса является модифицированный отфильтрованный реконструированный массив alfPictureL отсчетов яркости изображения.
Процесс получения индексов фильтров для пункта 8.8.5.3 вызывается вместе с местоположением ( xCtb, yCtb ) и реконструированным массивом recPictureL отсчетов яркости изображения в качестве входных данных и filtIdx[ x ][ y ] и transposeIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1 в качестве выходных данных.
Для получения отфильтрованных реконструированных отсчетов alfPictureL[ x ][ y ] яркости, каждый реконструированный отсчет яркости внутри текущего блока recPictureL[ x ][ y ] дерева кодирования яркости фильтруется нижеследующим образом с x, y = 0..CtbSizeY − 1:
Массив коэффициентов f[ j ] фильтра яркости и массив значений c[ j ] сжатия яркости, соответствующий фильтру, указанному посредством filtIdx[ x ][ y ], получают следующим образом с j = 0..11:
Если AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize ][ yCtb >> Log2CtbSize ] меньше 16, применяется следующее:
i = AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize ][ yCtb >> Log2CtbSize ] (8-1187)
f[ j ] = AlfFixFiltCoeff[ AlfClassToFiltMap[ i ][ filtIdx[ x ][ y ] ] ][ j ] (8-1188)
c[ j ] = 2BitdepthY (8-1189)
В противном случае, (AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize][ yCtb >> Log2CtbSize ] больше или равно 16, применяется следующее:
i = slice_alf_aps_id_luma[ AlfCtbFiltSetIdxY[ xCtb >> Log2CtbSize ][ yCtb >> Log2CtbSize ] − 6 ] (8-1190)
f[ j ] = AlfCoeffL[ i ][ filtIdx[ x ][ y ] ][ j ] (8-1191)
c[ j ] = AlfClipL[ i ][ filtIdx[ x ][ y ] ][ j ] (8-1192)
Коэффициенты фильтра яркости и значения сжатия index idx получают в зависимости от transposeIdx[ x ][ y ], как показано далее:
Если [ x ][ y ] равно 1, применяется следующее:
idx[ ] = { 9, 4, 10, 8, 1, 5, 11, 7, 3, 0, 2, 6 } (8-1193)
В противном случае, если transposeIndex[ x ][ y ] равно 2, применяется следующее:
idx[ ] = { 0, 3, 2, 1, 8, 7, 6, 5, 4, 9, 10, 11 } (8-1194)
В противном случае, если transposeIndex[ x ][ y ] равно 3, применяется следующее:
idx[ ] = { 9, 8, 10, 4, 3, 7, 11, 5, 1, 0, 2, 6 } (8-1195)
В противном случае, применяется следующее:
idx[ ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } (8-1196)
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов яркости с i, j = −3..3 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше или равно 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ], pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1197)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosX[ n ] - xCtb - x больше 0 и меньше 4 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] − 1, xCtb + x + i ) (8-1198)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1199)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
hx + i = Clip3( SubPicLeftBoundaryPos, SubPicRightBoundaryPos, hx + i ) (8-1184)]]
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равно 0 и меньше 3 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ], pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1200)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosY[ n ] - yCtb - y больше 0 и меньше 4 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] − 1, yCtb + y + j ) (8-1201)
В противном случае, применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1202)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
vy + j = Clip3( SubPicTopBoundaryPos, SubPicBotBoundaryPos, vy + j ) (8-1184)
Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий действительно, applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей субизображения и loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ), равно 0.
Нижняя граница текущего блока дерева кодирования являет одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.]]
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos получают, применяя процесс получения положения границы ALF, как указано в разделе 8.8.5.5 с (xCtb, yCtb) and (x, y) в качестве входных данных.
Смещения r1, r2 и r3 реконструированных отсчетов указываются в таблице 8-24, соответствующей [[горизонтальному]] вертикальному положению у отсчетов яркости и clipBottomPos [[applyVirtualBoundary]].
Смещения с1, с2 и с3 положений отсчетов указываются в таблице 8-25, соответствующей горизонтальному положению х отсчетов яркости, clipLeftPos и clipRightPos.
Переменную curr получают следующим образом:
curr = recPictureL[ hx, vy ] (8-1203)
Переменную sum получают следующим образом:
sum = f[ idx[ 0 ] ]* (Clip3( −c[ idx[ 0 ] ], c[ idx[ 0 ] ], recPictureL[ hx, vy + r3 ] − curr ) +
Clip3( −c[ idx[ 0 ] ], c[ idx[ 0 ] ], recPictureL[ hx, vy − r3 ] − curr ) ) +
f[ idx[ 1 ] ] * (Clip3( −c[ idx[ 1 ] ], c[ idx[ 1 ] ], recPictureL[ hx + c1, vy + r2 ] − curr ) +
Clip3( −c[ idx[ 1 ] ], c[ idx[ 1 ] ], recPictureL[ hx − c1, vy − r2 ] − curr ) ) +
f[ idx[ 2 ] ] * (Clip3( −c[ idx[ 2 ] ], c[ idx[ 2 ] ], recPictureL[ hx, vy + r2 ] − curr ) +
Clip3( −c[ idx[ 2 ] ], c[ idx[ 2 ] ], recPictureL[ hx, vy − r2 ] − curr ) ) +
f[ idx[ 3 ] ] * (Clip3( −c[ idx[ 3 ] ], c[ idx[ 3 ] ], recPictureL[ hx − c1, vy + r2 ] − curr ) +
Clip3( −c[ idx[ 3 ] ], c[ idx[ 3 ] ], recPictureL[ hx + c1, vy − r2 ] − curr ) ) +
f[ idx[ 4 ] ] * (Clip3( −c[ idx[ 4 ] ], c[ idx[ 4 ] ], recPictureL[ hx + c2, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 4 ] ], c[ idx[ 4 ] ], recPictureL[ hx − c2, vy − r1 ] − curr ) ) +
f[ idx[ 5 ] ] * (Clip3( −c[ idx[ 5 ] ], c[ idx[ 5 ] ], recPictureL[ hx + c1, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 5 ] ], c[ idx[ 5 ] ], recPictureL[ hx − c2, vy − r1 ] − curr ) ) +
f[ idx[ 6 ] ] * (Clip3( −c[ idx[ 6 ] ], c[ idx[ 6 ] ], recPictureL[ hx, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 6 ] ], c[ idx[ 6 ] ], recPictureL[ hx, vy − r1 ] − curr ) ) + (8-1204)
f[ idx[ 7 ] ] * (Clip3( −c[ idx[ 7 ] ], c[ idx[ 7 ] ], recPictureL[ hx − c1, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 7 ] ], c[ idx[ 7 ] ], recPictureL[ hx + c1, vy − r1 ] − curr ) ) +
f[ idx[ 8 ] ] * (Clip3( −c[ idx[ 8 ] ], c[ idx[ 8 ] ], recPictureL[ hx − c2, vy + r1 ] − curr ) +
Clip3( −c[ idx[ 8 ] ], c[ idx[ 8 ] ], recPictureL[ hx + c2, vy − r1 ] − curr ) ) +
f[ idx[ 9 ] ] * (Clip3( −c[ idx[ 9 ] ], c[ idx[ 9 ] ], recPictureL[ hx + c3, vy ] − curr ) +
Clip3( −c[ idx[ 9 ] ], c[ idx[ 9 ] ], recPictureL[ hx − c3, vy ] − curr ) ) +
f[ idx[ 10 ] ] * (Clip3( −c[ idx[ 10 ] ], c[ idx[ 10 ] ], recPictureL[ hx + c2, vy ] − curr ) +
Clip3( −c[ idx[ 10 ] ], c[ idx[ 10 ] ], recPictureL[ hx − c2, vy ] − curr ) ) +
f[ idx[ 11 ] ] * (Clip3( −c[ idx[ 11 ] ], c[ idx[ 11 ] ], recPictureL[ hx + c1, vy ] − curr ) +
Clip3( −c[ idx[ 11 ] ], c[ idx[ 11 ] ], recPictureL[ hx − c1, vy ] − curr ) )
sum = curr + ( ( sum + 64 ) >> 7 ) (8-1205)
Модифицированную отфильтрованную реконструированный отсчет яркости изображения alfPictureL[ xCtb + x ][ yCtb + y ] получают следующим образом:
Если pcm_loop_filter_disabled_flag и pcm_flag[ xCtb+ x ][ yCtb + y ] оба равны 1, применяется следующее:
alfPictureL[ xCtb + x ][ yCtb + y ] = recPictureL[ hx, vy ] (8-1206)
В противном случае, (pcm_loop_filter_disabled_flag равен 0 или pcm_flag[ x ][ y ] равен 0), применяется следующее:
alfPictureL[ xCtb + x ][ yCtb + y ] = Clip3( 0, ( 1 << BitDepthY ) − 1, sum ) (8-1207)
Таблица 8-24 – Спецификация r1, r2 и r3, соответствующих [[горизонтальному]] вертикальному положению отсчетов у яркости, clipTopPos и clipBottomPos [[и applyVirtualBoundary]]
[[Условие r1 r2 r3
( y = = CtbSizeY − 5 | | y = = CtbSizeY − 4 ) && ( applyVirtualBoundary = = 1 ) 0 0 0
( y = = CtbSizeY − 6 | | y = = CtbSizeY − 3 ) && ( applyVirtualBoundary = = 1 ) 1 1 1
( y = = CtbSizeY − 7 | | y = = CtbSizeY − 2 ) && ( applyVirtualBoundary = = 1 ) 1 2 2
В противном случае 1 2 3]]
Условие r1 r2 r3
( yCtb + y = = clipBottomPos − 1 | | yCtb + y = = clipTopPos ) 0 0 0
( yCtb + y = = clipBottomPos − 2 | | yCtb + y = = clipTopPos + 1) 1 1 1
( yCtb + y = = clipBottomPos − 3 | | yCtb + y = = clipTopPos + 2) && (clipBottomPos != clipTopPos + 4)  1 2 2
( yCtb + y = = clipTopPos + 2 ) && (clipBottomPos = = clipTopPos + 4)  1 1 1
В противном случае 1 2 3
Таблица 8-25 – Спецификация с1, с2 и с3, соответствующих горизонтальному положению х отсчетов яркости, clipLeftPos и clipRightPos
Условие c1 c2 c3
( xCtb + x = = clipLeftPos | | xCtb + x = = clipRightPos − 1 ) 0 0 0
( xCtb + x = = clipLeftPos +1 | | xCtb + x = = clipRightPos − 2 ) 1 1 1
( xCtb + x = = clipLeftPos +2 | | xCtb + x = = clipRightPos − 3 ) 1 2 2
В противном случае 1 2 3
8.8.5.3 Процесс получения индекса транспонирования ALF и фильтров для отсчетов яркости
Входными данными этого процесса являются:
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета текущего изображения.
реконструированный массив recPictureL отсчетов яркости изображения, предшествующий процессу адаптивной контурной фильтрации.
Выходными данными этого процесса являются:
массив индексов классификации фильтров filtIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1,
массив индексов транспонирования transposeIdx[ x ][ y ] с x, y = 0..CtbSizeY − 1.
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов яркости с i, j = -2.0,5 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше или равно 0 и меньше 2 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ], pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1208)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosX[ n ] - xCtb - x больше 0 и меньше 6 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] − 1, xCtb + x + i ) (8-1209)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1210)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
hx + i = Clip3( SubPicLeftBoundaryPos, SubPicRightBoundaryPos, hx + i ) (8-1184)]]
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равно 0 и меньше 2 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ], pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1211)
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosY[ n ] - yCtb - y больше 0 и меньше 6 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] − 1, yCtb + y + j ) (8-1212)
В противном случае, применяется следующее:
[[Если yCtb + CtbSizeY больше или равен pic_height_in_luma_samples, применяется следующее:]]
vy + j = Clip3( 0, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1213)
[[В противном случае, если y меньше, чем CtbSizeY − 4, применяется следующее:
vy + j = Clip3( 0, yCtb + CtbSizeY − 5, yCtb + y + j ) (8-1214)
В противном случае, применяется следующее:
vy + j = Clip3( yCtb + CtbSizeY − 4, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1215)
Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ), равно 0, применяется следующее:
vy + j = Clip3( SubPicTopBoundaryPos, SubPicBotBoundaryPos, vy + j ) (8-1184)]]
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos получают, применяя процесс получения положения границы ALF с (xCtb, yCtb) и (x, y) в качестве входных данных.
Если clipTopPos не равна -128, применяется следующее:
vy + j = Clip3( clipTopPos, pic_height_in_luma_samples − 1, yCtb + y + j ) (8-1213)
Если clipBottomPos не равна -128, применяется следующее:
vy + j = Clip3( 0, clipBottomPos − 1, yCtb + y + j ) (8-1213)
Если clipLeftPos не равна -128, применяется следующее:
hx + i = Clip3( clipLeftPos, pic_width_in_luma_samples − 1, xCtb + x + i ) (8-1213)
Если clipRightPos не равна -128, применяется следующее:
hx + i = Clip3( 0, clipRightPos − 1, xCtb + x + i ) (8-1213)
Массив filtIdx индексов классификации фильтров и массив transposeIdx индексов транспонирования получают посредством следующих упорядоченных этапов:
1. Переменные filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] с x, y = − 2..CtbSizeY + 1 получают следующим образом:
Если х и у оба являются четными числами или х и у оба являются нечетными числами, применяется следующее:
filtH[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx − 1, vy ] − (8-1216)
recPicture[ hx + 1, vy ] )
filtV[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx, vy − 1 ] − (8-1217)
recPicture[ hx, vy + 1 ] )
filtD0[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx − 1, vy − 1 ] −
(8-1218)
recPicture[ hx + 1, vy + 1 ] )
filtD1[ x ][ y ] = Abs( ( recPicture[ hx, vy ] << 1 ) − recPicture[ hx + 1, vy − 1 ] −
(8-1219)
recPicture[ hx − 1, vy + 1 ] )
В противном случае, filtH[ x ][ y ], filtV[ x ][ y ], filtD0[ x ][ y ] и filtD1[ x ][ y ] устанавливаются равными 0.
2. [[Переменные minY, maxY и ac получаются следующим образом:
Если ( y << 2 ) равно (CtbSizeY - 8) и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается равным −2, maxY устанавливается равным 3 и ac устанавливается равным 96.
В противном случае, если ( y << 2 ) равно (CtbSizeY - 4) и ( yCtb + CtbSizeY ) меньше pic_height_in_luma_samples – 1, minY устанавливается равным 0, maxY устанавливается равным 5 и ac устанавливается равным 96.]]
3. Переменные sumH[ x ][ y ], sumV[ x ][ y ], sumD0[ x ][ y ], sumD1[ x ][ y ] and sumOfHV[ x ][ y ] с x, y = 0..( CtbSizeY − 1 ) >> 2 получаются следующим образом:
Переменные minY, maxY получаются следующим образом:
Если clipTopPos не равно -128 и clipBottomPos равно -128, применяют следующее:
Если ( y << 2 ) равно clipTopPos, minY устанавливается равным 0, maxY устанавливается равным 5.
В противном случае, если clipTopPos равно -128 и clipBottomPos не равно -128, применяют следующее:
Если ( y << 2 ) равно ( clipBottomPos – 4 ), minY устанавливается равным -2, maxY устанавливается равным 3.
В противном случае, если clipTopPos не равно -128 и clipBottomPos не равно -128, применяется следующее:
minY устанавливается равным 0, maxY устанавливается равным 3.
В противном случае, minY устанавливается равным −2 и maxY устанавливается равным 5 и ac устанавливается равным 64.
Переменные minY, maxY и ac получаются следующим образом:
Если clipLeftPos не равна -128, применяется следующее:
Если ( x << 2 ) равно clipLeftPos, minХ устанавливается равным 0, maxХ устанавливается равным 5.
В противном случае, если clipRightPos не равно -128, применяется следующее:
Если ( x << 2 ) равно (clipRightPos – 4), minХ устанавливается равным -2, maxХ устанавливается равным 3.
В противном случае, minХ устанавливается равным -2, maxХ устанавливается равным 5.
Переменную ac получают следующим образом:
Таблица 8-26 – Спецификация ac, соответствующая minX, minY, maxX, maxY
(maxY – minY + 1) * (maxX – minX + 1) 8*8 8*6 8*4 6*6 6*4
ac 64 96 128 112 192
[[Переменные sumH[ x ][ y ], sumV[ x ][ y ], sumD0[ x ][ y ], sumD1[ x ][ y ] и sumOfHV[ x ][ y ] с x, y = 0..( CtbSizeY − 1 ) >> 2 получаются следующим образом:]]
sumH[ x ][ y ] = ΣiΣj filtH[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1220)
sumV[ x ][ y ] = ΣiΣj filtV[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1221)
sumD0[ x ][ y ] = ΣiΣj filtD0[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1222)
sumD1[ x ][ y ] = ΣiΣj filtD1[ h(x << 2 ) + i − xCtb ][ v(y << 2) + j − yCtb ] с i = minX..maxX [[−2..5]], j = minY..maxY (8-1223)
sumOfHV[ x ][ y ] = sumH[ x ][ y ] + sumV[ x ][ y ] (8-1224)
4. Переменные dir1[ x ][ y ], dir2[ x ][ y ] и dirS[ x ][ y ] с x, y = 0..CtbSizeY − 1 получают следующим образом:
Переменные hv1, hv0 и dirHV получают следующим образом:
Если sumV[ x >> 2 ][ y >> 2 ] больше, чем sumH[ x >> 2 ][ y >> 2 ], применяется следующее:
hv1 = sumV[ x >> 2 ][ y >> 2 ] (8-1225)
hv0 = sumH[ x >> 2 ][ y >> 2 ] (8-1226)
dirHV = 1 (8-1227)
В противном случае, применяется следующее:
hv1 = sumH[ x >> 2 ][ y >> 2 ] (8-1228)
hv0 = sumV[ x >> 2 ][ y >> 2 ] (8-1229)
dirHV = 3 (8-1230)
Переменные d1, d0 и dirD получают следующим образом:
Если sumD0[ x >> 2 ][ y >> 2 ] больше, чем sumD1[ x >> 2 ][ y >> 2 ], применяется следующее:
d1 = sumD0[ x >> 2 ][ y >> 2 ] (8-1231)
d0 = sumD1[ x >> 2 ][ y >> 2 ] (8-1232)
dirD = 0 (8-1233)
В противном случае, применяется следующее:
d1 = sumD1[ x >> 2 ][ y >> 2 ] (8-1234)
d0 = sumD0[ x >> 2 ][ y >> 2 ] (8-1235)
dirD = 2 (8-1236)
Переменные hvd1, hv0 получают следующим образом:
hvd1 = ( d1 * hv0 > hv1 * d0 ) ? d1 : hv1 (8-1237)
hvd0 = ( d1 * hv0 > hv1 * d0 ) ? d0 : hv0 (8-1238)
Переменные dirS[ x ][ y ], dir1[ x ][ y ] и dir2[ x ][ y ] получают следующим образом:
dir1[ x ][ y ] = ( d1 * hv0 > hv1 * d0 ) ? dirD : dirHV (8-1239)
dir2[ x ][ y ] = ( d1 * hv0 > hv1 * d0 ) ? dirHV : dirD (8-1240)
dirS[ x ][ y ] = ( hvd1 > 2 * hvd0 ) ? 1 : ( ( hvd1 * 2 > 9 * hvd0 ) ? 2 : 0 ) (8-1241)
5. Переменные avgVar[ x ][ y ] с x, y = 0..CtbSizeY − 1 получают следующим образом:
varTab[ ] = { 0, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4 } (8-1242)
avgVar[ x ][ y ] = varTab[ Clip3( 0, 15, ( sumOfHV[ x >> 2 ][ y >> 2 ] * ac ) >> ( 3 + BitDepthY ) ) ] (8-1243)
6. Массив filtIdx[ x ][ y ] индексов классификации фильтров и массив transposeIdx[ x ][ y ] индексов транспонирования с x = y = 0..CtbSizeY − 1 получают следующим образом:
transposeTable[ ] = { 0, 1, 0, 2, 2, 3, 1, 3 }
transposeIdx[ x ][ y ] = transposeTable[ dir1[ x ][ y ] * 2 + ( dir2[ x ][ y ] >> 1 ) ]
filtIdx[ x ][ y ] = avgVar[ x ][ y ]
Когда dirS[ x ][ y ] не равен 0, filtIdx[ x ][ y ] изменяется следующим образом:
filtIdx[ x ][ y ] += ( ( ( dir1[ x ][ y ] & 0x1 ) << 1 ) + dirS[ x ][ y ] ) * 5 (8-1244)
8.8.5.4 Процесс фильтрации блока дерева кодирования для отсчетов цветности
Входными данными этого процесса являются:
реконструированный массив recPicture отсчетов цветности изображения, предшествующий процессу адаптивной контурной фильтрации,
отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения,
местоположение блока кодирования цветности (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования цветности относительно левого верхнего отсчета текущего изображения.
Результатом этого процесса является модифицированный отфильтрованный реконструированный массив alfPicture отсчетов цветности изображения.
Ширину и высоту текущего блока дерева кодирования цветности ctbWidthC и ctbHeightC получают следующим образом:
ctbWidthC = CtbSizeY / SubWidthC (8-1245)
ctbHeightC = CtbSizeY / SubHeightC (8-1246)
Для получения отфильтрованных реконструированных отсчетов alfPicture[ x ][ y ] цветности, каждый реконструированный отсчет цветности внутри текущего блока recPicture[ x ][ y ] дерева кодирования цветности фильтруется нижеследующим образом с x = 0..ctbWidthC − 1, y = 0..ctbHeightC − 1:
Местоположения ( hx + i, vy + j ) для каждой из соответствующих отсчетов (x, y) яркости внутри заданного массива recPicture отсчетов цветности с i, j = -2..2 получают следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и xCtb + x − PpsVirtualBoundariesPosX[ n ] / SubWidthC больше или равно 0 и меньше 2 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( PpsVirtualBoundariesPosX[ n ] / SubWidthC, (8-1247)
pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i )
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosX[ n ]/ SubWidthC - xCtb - x больше 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
hx + i = Clip3( 0, PpsVirtualBoundariesPosX[ n ] / SubWidthC − 1, xCtbC + x + i )
(8-1248)
В противном случае, применяется следующее:
hx + i = Clip3( 0, pic_width_in_luma_samples / SubWidthC − 1, xCtbC + x + i )
(8-1249)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
hx + i = Clip3( SubPicLeftBoundaryPos / SubWidthC, SubPicRightBoundaryPos / SubWidthC, hx + i ) (8-1184)]]
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и xCtbC + y − PpsVirtualBoundariesPosY[ n ]/ SubHeightC больше или равно 0 и меньше 2 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( PpsVirtualBoundariesPosY[ n ] / SubHeightC , (8-1250)
pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j )
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY не равно 0 и PpsVirtualBoundariesPosY[ n ]/ SubHeightC - yCtbC - y больше 0 и меньше 3 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
vy + j = Clip3( 0, PpsVirtualBoundariesPosY[ n ] / SubHeightC − 1, yCtbC + y + j )
(8-1251)
В противном случае, применяется следующее:
vy + j = Clip3( 0, pic_height_in_luma_samples / SubHeightC − 1, yCtbC + y + j )
(8-1252)
[[Когда loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ) равно 0, применяется следующее:
vy + j = Clip3(SubPicTopBoundaryPos/SubWidthC, SubPicBotBoundaryPos / SubWidthC, vy + j ) (8-1184)
Переменную applyVirtualBoundary получают следующим образом:
Если одно или более из следующих условий действительно, applyVirtualBoundary устанавливается равным 0:
Нижняя граница текущего блока дерева кодирования является нижней границей изображения.
Нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей секции и loop_filter_across_slices_enabled_flag равен 0.
Нижняя граница текущего блока дерева кодирования является нижней границей субизображения и loop_filter_across_sub_pic_enabled_flag[ SubPicIdx ] для субизображения, содержащего отсчет яркости в месте ( hx, vy ), равно 0.
Нижняя граница текущего блока дерева кодирования являет одной из нижних виртуальных границ изображения и pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1.
В противном случае, applyVirtualBoundary устанавливается равным 1.]]
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos получают, применяя процесс получения положения горизонтальной границы для отсчетов яркости с ( xCtbC * SubWidthC, yCtbC * SubHeightC ) и ( x * SubWidthC, y *SubHeightC ) в качестве входных данных.
Переменная clipLeftPos устанавливается равной clipLeftPos / SubWidthC.
Переменная clipRightPos устанавливается равной clipRightPos / SubWidthC.
Переменная clipTopPos устанавливается равной clipTopPos / SubHeightC.
Переменная clipBottomPos устанавливается равной clipBottomPos / SubHeightC.
Смещения r1 и r2 реконструированных отсчетов указываются в таблице 8-27, соответствующей [[горизонтальному положению отсчетов]] вертикальному положению у отсчетов цветности и clipTopPos и clipBottomPos [[и applyVirtualBoundary]].
Смещения с1 и с2 положений отсчетов указываются в таблице 8-28, соответствующей горизонтальному положению х отсчетов цветности, clipLeftPos и clipRightPos.
Переменную curr получают следующим образом:
curr = recPicture[ hx, vy ] (8-1253)
Массив коэффициентов f[ j ] фильтра цветности и массив значений c[ j ] сжатия цветности получают следующим образом с j = 0..5:
f[ j ] = AlfCoeffC[ slice_alf_aps_id_chroma ][ j ] (8-1254)
c[ j ] = AlfClipC[ slice_alf_aps_id_chroma ][ j ] (8-1255)
Переменную sum получают следующим образом:
sum = f[ 0 ] * ( Clip3( −c[ 0 ], c[ 0 ], recPicture[ hx, vy + r2 ] − curr ) +
Clip3( −c[ 0 ], c[ 0 ], recPicture[ hx, vy − r2 ] − curr ) ) +
f[ 1 ] * ( Clip3( −c[ 1 ], c[ 1 ], recPicture[ hx + c1, vy + r1 ] − curr ) +
Clip3( −c[ 1 ], c[ 1 ], recPicture[ hx − c1, vy − r1 ] − curr ) ) +
f[ 2 ] * ( Clip3( −c[ 2 ], c[ 2 ], recPicture[ hx, vy + r1 ] − curr ) +
Clip3( −c[ 2 ], c[ 2 ], recPicture[ hx, vy − r1 ] − curr ) ) + (8-1256)
f[ 3 ] * ( Clip3( −c[ 3 ], c[ 3 ], recPicture[ hx − c1, vy + r1 ] − curr ) +
Clip3( −c[ 3 ], c[ 3 ], recPicture[ hx + c1, vy − r1 ] − curr ) ) +
f[ 4 ] * ( Clip3( −c[ 4 ], c[ 4 ], recPicture[ hx + c2, vy ] − curr ) +
Clip3( −c[ 4 ], c[ 4 ], recPicture[ hx − c2, vy ] − curr ) ) +
f[ 5 ] * ( Clip3( −c[ 5 ], c[ 5 ], recPicture[ hx + c1, vy ] − curr ) +
Clip3( −c[ 5 ], c[ 5 ], recPicture[ hx − c1, vy ] − curr ) )
sum = curr + ( sum + 64 ) >> 7 ) (8-1257)
Модифицированную отфильтрованную реконструированный отсчет цветности изображения alfPicture[ xCtbC + x ][ yCtbC + y ] получают следующим образом:
Если pcm_loop_filter_disabled_flag и pcm_flag[ ( xCtbC + x ) * SubWidthC ][ ( yCtbC + y ) * SubHeightC ] оба равны 1, применяется следующее:
alfPicture[ xCtbC + x ][ yCtbC + y ] = recPictureL[ hx, vy ] (8-1258)
В противном случае, (pcm_loop_filter_disabled_flag равен 0 или pcm_flag[ x ][ y ] равен 0), применяется следующее:
alfPicture[ xCtbC + x ][ yCtbC + y ] = Clip3( 0, ( 1 << BitDepthC ) − 1, sum ) (8-1259)
Таблица 8-27 - Спецификация r1 и r2, соответствующих [[горизонтальному положению отсчетов]] вертикальному положению отсчетов у цветности, clipTopPos и clipBottomPos [[и applyVirtualBoundary]]
[[Условие r1 r2
( y = = ctbHeightC − 2 | | y = = ctbHeightC − 3 ) && ( applyVirtualBoundary = = 1 ) 0 0
( y = = ctbHeightC − 1 | | y = = ctbHeightC − 4 ) && ( applyVirtualBoundary = = 1 ) 1 1
В противном случае 1 2]]
Условие r1 r2
( yCtbC + y = = clipBottomPos − 1 | | yCtbC + y = = clipTopPos ) 0 0
( yCtbC + y = = clipBottomPos − 2 | | yCtbC + y = = clipTopPos + 1 ) && (clipBottomPos != clipTopPos + 2 ) 1 1
( yCtbC + y = = clipTopPos + 1) && (clipBottomPos = = clipTopPos + 2 ) 0 0
В противном случае 1 2
Таблица 8-28 – Спецификация с1 и с2, соответствующих вертикальному положению х отсчетов цветности, clipLeftPos и clipRightPos
Условие c1 c2
(xCtbC + x = = clipLeftPos | | xCtbC + x = = clipRightPos – 1 ) 0 0
(xCtbC + x = = clipLeftPos + 1 | | xCtbC + x = = clipRightPos – 2) 1 1
В противном случае 1 2
8.8.5.5 Процесс получения положения границы ALF
Входными данными этого процесса являются:
местоположение блока кодирования яркости (xCtb, yCtb), указывающее верхний левый отсчет текущего блока дерева кодирования яркости относительно левого верхнего отсчета яркости текущего изображения.
местоположение (x, y) отсчета, указывающее положение текущего отсчета относительно левого верхнего отсчета текущего блока дерева кодирования яркости.
Выходными данными этого процесса являются:
положение левой вертикальной границы clipLeftPos,
положение правой вертикальной границы clipRightPos,
положение верхней горизонтальной границы clipTopPos,
положение нижней горизонтальной границы clipBottomPos.
Переменные clipLeftPos, clipRightPos, clipTopPos и clipBottomPos устанавливаются равными −128.
Переменная applyVirtualBoundary модифицируется следующим образом:
Если нижняя граница текущего блока дерева кодирования не является нижней границей изображения и y – ( CtbSizeY – 4 ) больше или равно 0, переменная clipTopPos устанавливается равной yCtb + CtbSizeY – 4.
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosY[ n ] % CtbSizeY равно 0 и yCtb + y − PpsVirtualBoundariesPosY[ n ] больше или равно 0 и меньше 3 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
clipTopPos = PpsVirtualBoundariesPosY[ n ] (8-1201)
В противном случае, если у меньше 3 и верхняя граница текущего блока дерева кодирования не является верхней границей изображения и одно из следующих условий действительно, переменная clipTopPos устанавливается равной yCtb:
Если верхняя граница текущего блока дерева кодирования является верхней границей брика, loop_filter_across_bricks_enabled_flag равно 0.
Если верхняя граница текущего блока дерева кодирования является верхней границей секции, loop_filter_across_slices_enabled_flag равно 0.
Если верхняя граница текущего блока дерева кодирования является верхней границей субизображения, loop_filter_across_sub_pic_enabled_flag равно 0.
Переменная clipBottomPos модифицируется следующим образом:
Если нижняя граница текущего блока дерева кодирования не является нижней границей изображения и CtbSizeY – 4 – y больше 0 и меньше 4, переменная clipBottomPos устанавливается равной yCtb + CtbSizeY – 4.
В противном случае, если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1, PpsVirtualBoundariesPosY[ n ] % CtbSizeY равно 0 и PpsVirtualBoundariesPosY[ n ] - yCtb - y больше 0 и меньше 4 для любого n = 0..pps_num_hor_virtual_boundaries − 1, применяется следующее:
clipBottomPos = PpsVirtualBoundariesPosY[ n ] (8-1201)
В противном случае, если CtbSizeY – у меньше 4 и нижняя граница текущего блока дерева кодирования не является нижней границей изображения и одно или более из следующих условий действительно, переменная clipBottomPos устанавливается равной yCtb + CtbSizeY.
Если нижняя граница текущего блока дерева кодирования является нижней границей брика и loop_filter_across_bricks_enabled_flag равно 0.
Если нижняя граница текущего блока дерева кодирования является нижней границей брика, и loop_filter_across_slices_enabled_flag равно 0.
Если нижняя граница текущего блока дерева кодирования является нижней границей субизображения, loop_filter_across_sub_pic_enabled_flag равно 0.
Переменная clipLeftPos модифицируется следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY равно 0 и xCtb + x − PpsVirtualBoundariesPosX[ n ] больше или равно 0 и меньше 3 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
clipLeftPos = PpsVirtualBoundariesPosX[ n ] (8-1201)
В противном случае, если х меньше 3, левая граница текущего блока дерева кодирования не является левой границей изображения и одно или более из следующих условий действительно, переменная clipLeftPos устанавливается равной хCtb.
Если левая граница текущего блока дерева кодирования является левой границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Если левая граница текущего блока дерева кодирования является левой границей секции и loop_filter_across_slices_enabled_flag равен 0.
Если левая граница текущего блока дерева кодирования является левой границей субизображения, loop_filter_across_sub_pic_enabled_flag равен 0.
Переменная clipRightPos модифицируется следующим образом:
Если pps_loop_filter_across_virtual_boundaries_disabled_flag равен 1 и PpsVirtualBoundariesPosX[ n ] % CtbSizeY равно 0 и PpsVirtualBoundariesPosX[ n ] - xCtb - x больше 0 и меньше 4 для любого n = 0..pps_num_ver_virtual_boundaries − 1, применяется следующее:
clipRightPos = PpsVirtualBoundariesPosX[ n ] (8-1201)
В противном случае, если CtbSizeY – х меньше 4 и правая граница текущего блока дерева кодирования не является правой границей изображения и одно или более из следующих условий действительно, переменная clipRightPos устанавливается равной хCtb + CtbSizeY.
Если правая граница текущего блока дерева кодирования является правой границей брика и loop_filter_across_bricks_enabled_flag равен 0.
Если правая граница текущего блока дерева кодирования является правой границей секции и loop_filter_across_slices_enabled_flag равен 0.
Если правая граница текущего блока дерева кодирования является правой границей субизображения, loop_filter_across_sub_pic_enabled_flag равен 0.
Конкретное значение -128, используемое в представленном выше варианте осуществления, может быть заменено другими значениями, такими как –K, где, например, K больше или не меньше, чем количество строк , смещенных относительно нижней границы CTU (например, K = -5).
Альтернативно, один флаг может использоваться для маркировки, требуется ли для каждой из отсчетов обработка иным способом, если она располагается на границах видеоблока.
На фиг. 22 представлено устройство 2200 видеообработки. Устройство 2200 может использоваться для осуществления одного или более из описанных здесь способов. Устройство 2200 может быть реализовано в виде смартфона, планшета, компьютера, приемника Интернета вещей (Internet of Things, IoT) и т. д. Устройство 2200 может содержать один или более процессоров 2202, одну или более памятей 2204 и аппаратные средства 2206 видеообработки. Процессор(-ы) 2202 может быть выполнен с возможностью реализации одного или более способов, описанных в настоящем документе. Память(-и) 2204 могут использоваться для хранения данных и управляющей программы, используемых для реализации описанных здесь способов и технологий. Аппаратные средства 2206 видеообработки могут использоваться для реализации в аппаратной схеме одного или более способов, описанных в настоящем документе. В некоторых вариантах осуществления аппаратные средства 2206 видеообработки могут быть внутренними или частично внутренними для процессора 2202 (например, блока графического процессора).
В некоторых вариантах осуществления способы видеокодирования могут быть реализованы, используя аппаратные средства, которые могут быть реализованы на платформе аппаратных средств, как описано со ссылкой на фиг. 22.
На фиг. 23 представлена блок-схема последовательности выполнения операций примерного способа 2300 видеообработки. Способ содержит этапы, на которых определяют (2302) для преобразования между текущим видеоблоком видео и представлением битового потока текущего видеоблока один или более фильтров интерполяции, используемых в процессе преобразования, где один или несколько фильтров интерполяции являются фильтрами из числа множества фильтров интерполяции для видео, и выполняют (2304) преобразование, используя один или более фильтров интерполяции.
Различные решения и варианты осуществления, описанные в настоящем документе, дополнительно описываются, используя список решений.
Раздел 4, пункт 1 обеспечивает дополнительные примеры следующих решений.
1. Способ видеообработки, содержащий этапы, на которых: выполняют преобразование между видеоблоками видеоизображения и их представлением битового потока, где видеоблоки обрабатываются, используя логическое группирование блоков дерева кодирования, где блоки дерева кодирования обрабатываются на основе того, находится ли нижняя граница нижнего блока дерева кодирования за пределами нижней границы видеоизображения.
2. Способ по решению 1, в котором обработка блока дерева кодирования содержит содержит выполнение адаптивной контурной фильтрации значений отсчета блока дерева кодирования, используя отсчеты внутри блока дерева кодирования.
3. Способ по решению 1, в котором обработка блока дерева кодирования содержит выполнение адаптивной контурной фильтрации значений отсчета блока дерева кодирования, запрещая разбиение блока дерева кодирования на две части, соответствующие виртуальным границам.
Раздел 4, пункт 2 обеспечивает дополнительные примеры следующих решений.
4. Способ видеообработки, содержащий этапы, на которых: определяют, основываясь на условии блока дерева кодирования текущего видеоблока, состояния использования виртуальных отсчетов во время внутриконтурной фильтрации; и выполняют преобразование между видеоблоком и представлением битового потока видеоблока, совместимое с состоянием использования виртуальных отсчетов.
5. Способ по решению 4, в котором логическое действительное значение состояния использования указывает, что текущий видеоблок разделяется по меньшей мере на две части виртуальной границей и фильтрации отсчетов в одной части запрещается, чтобы использовать информацию из другой части.
6. Способ по решению 4, в котором логическое действительное значение состояния использования указывает, что виртуальные отсчеты используются во время контурной фильтрации, и в котором контурная фильтрация выполняется, используя измененные значения реконструированных отсчетов текущего видеоблока.
7. Способ по решению 4, в котором логическое ложное значение состояния использования указывает, что для фильтрации отсчетов в блоке разрешается использовать информацию в том же самом блоке.
8. Способ по решению 4, в котором логическое действительное значение состояния использования указывает, что контурная фильтрация выполняется на реконструированных отсчетах текущего видеоблока без дополнительной модификации реконструированных отсчетов.
9. Способ по любому из решений 4-8, в котором условие дает указание установить состояние использования как логическое ложное значение, благодаря блоку дерева кодирования, имеющему конкретный размер.
10. Способ по любому из решений 4-8, в котором условие дает указание установить состояние использования как логическое ложное значение, благодаря блоку дерева кодирования, имеющему размер, больший, чем определенного размера.
11. Способ по любому из решений 4-8, в котором блок дерева кодирования имеет размер, меньший, чем определенный размер.
Раздел 4, пункт 3 обеспечивает дополнительные примеры следующих решений.
12. Способ по решению 5, в котором условие зависит от того, является ли нижняя граница текущего видеоблока нижней границей видеоблока, которая меньше, чем видеоизображение, или нижняя граница текущего видеоблока является виртуальной границей.
13. Способ по решению 12, в котором условие зависит от того, является ли нижняя граница текущего видеоблока нижней границей секции или границей плитки или брика.
14. Способ по решению 12, в котором условие дает указание установить состояние использования как логическое действительное значение, когда нижняя граница текущего видеоблока является нижней границей секции или границей плитки или брика.
15. Способ по решению 4-12, в котором условие дает указание установить состояние использования как логическое ложное значение, когда нижняя граница текущего видеоблока является нижней границей изображения или находится за пределами нижней границы для границы изображения.
Раздел 4, пункт 4 обеспечивает дополнительные примеры следующих решений.
16. Способ обработки видеоданных, содержащий этапы, на которых: определяют во время преобразования между видеоизображением, которое логически сгруппировано в одну или более видеосекций или видеобриков, и представлениеи битового потока видеоизображения, чтобы запретить использование отсчетов в другой секции или брике в процессе адаптивной контурной фильтрации; и выполняют преобразования, совместимое с определением.
Раздел 4, пункт 5 обеспечивает дополнительные примеры следующих решений.
17. Способ видеообработки, содержащий этапы, на которых: определяют во время преобразования между текущим видеоблоком видеоизображения и представлением битового потока текущего видеоблока, что текущий видеоблок содержит отсчеты, расположенные на границе видеоблока видеоизображения; и выполняют преобразование на основе определения, где выполнение преобразования содержит формирование виртуальных отсчетов для процесса внутриконтурной фильтрации, используя унифицированный способ, который является одним и тем же для всех типов границ в видеоизображении.
18. Способ по решению 17, в котором видеоблок является секцией или плиткой или 360-градусным видео.
19. Способ по решения 17, в котором контурная фильтрация содержит адаптивную контурную фильтрацию.
20. Способ по любому из решений 17-19, в котором унифицированный способ является способом двухстороннего заполнения.
21. Способ по любому из решений 17-20, в котором унифицированный способ является способом, в котором, когда доступ к отсчетам ниже первой строки запрещается и используется заполнение для формирования виртуальных отсчетов для строк ниже первой строки, то затем доступ к отсчетам выше второй строки также устанавливается как запрещенный, и заполнение используется для формирования виртуальных отсчетов для строк выше второй строки.
22. Способ по любому из решений 17-20, в котором унифицированный способ является способом, в котором, когда доступ к отсчетам выше первой строки запрещается и заполнение, используется для формирования виртуальных отсчетов для строк выше первой строки, то тогда доступ к отсчетам ниже второй строки также устанавливается как запрещенный и заполнение используется для формирования виртуальных отсчетов для строк ниже второй строки.
23. Способ по любому из решений 21-22, в котором расстояние между первой строкой и текущей строкой, где располагается текущий отсчет, который должен фильтроваться, и расстояние между второй строкой и первой строкой, равны.
Раздел 4, пункт 6 обеспечивает дополнительные примеры следующих решений.
24. Способ видеообработки, содержащий этапы, на которых: решают применять во время преобразования между текущим видеоблоком видеоизображения и представлением битового потока один из многочисленных способов выбора отсчета для адаптивной контурной фильтрации (ALF), доступных для видеоизображения во время преобразования; и выполняют преобразование, примененяя один из множества способов выбора отсчета для ALF.
25. Способ по решению 24, в котором многочисленные способы выбора отсчета для ALF содержат первый способ, в котором отсчеты выбираются перед тем, как контурный фильтр применяется к текущему видеоблоку во время преобразования, и второй способ, в котором отсчеты выбираются после того, как контурный фильтр применяется к текущему видеоблоку во время преобразования.
Раздел 4, пункт 7 обеспечивает дополнительные примеры следующих решений.
26. Способ видеообработки, содержащий этапы, на которых: выполняют, основываясь на граничном правиле, операцию контурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; граничное правило запрещает использование отсчетов, которые пересекают виртуальный конвейерный блок данных (VPDU) видеоизображения, и выполняют преобразования, используя результат операции контурной фильтрации.
27. Способ по решению 26, в котором VPDU соответствует области видеоизображения, имеющего фиксированный размер.
28. Способ по любому из решений 26-27, в котором граничное правило дополнительно дает указание использовать виртуальные отсчеты для контурной фильтрации вместо запрещенных отсчетов.
29. Способ по решению 28, в котором виртуальные отсчеты формируются посредством заполнения.
Раздел 4, пункт 8 обеспечивает дополнительные примеры следующих решений.
30. Способ видеообработки, содержащий этапы, на которых: выполняют, основываясь на граничном правиле, операцию контурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; в котором граничное правило определяет для использования местоположения текущего видеоблока, пересекающего границу видеоблока, отсчеты, которые формируются без использования заполнения; и выполняют преобразование, используя результат операции контурной фильтрации.
31. Способ по решению 30, в котором отсчеты формируются, используя способ двухстороннего заполнения.
32. Способ по решению 30, в котором операция контурной фильтрации содержит использование одной и той же технологии формирования виртуальных отсчетов для симметрично расположенных отсчетов во время операции контурной фильтрации.
33. Способ по любому из решений 30-32, в котором операция контурной фильтрации на отсчетах текущего видеоблока содержит выполнение изменения формы отсчетов текущего видео блока перед применением контурной фильтрации.
Раздел 4, пункт обеспечивает дополнительные примеры следующих решений.
34. Способ видеообработки, содержащий этапы, на которых: выполняют, основываясь на граничном правиле, операцию контурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; где граничное правило определяет выбор для операции контурной фильтрации фильтра, имеющего такие размеры, что отсчеты текущего видеоблока, используемого во время контурной фильтрации, не пересекают границу видеоблока видеоизображения; и выполняют преобразование, используя результат операции контурной фильтрации.
Раздел 4, пункт 10 обеспечивает дополнительные примеры следующих решений.
35. Способ видеообработки, содержащий этапы, на которых: выполняют, основываясь на граничном правиле, операцию контурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; в котором граничное правило определяет для операции контурной фильтрации выбор параметров сжатия или коэффициентов фильтра, основываясь на том, необходимы ли заполненные отсчеты для контурной фильтрации; и выполняют преобразование, используя результат операции контурной фильтрации.
36. Способ по решению 35, в котором параметры сжатия или коэффициенты фильтра содержатся в представлении битового потока.
Раздел 4, пункт 11 обеспечивает дополнительные примеры следующих решений.
37. Способ видеообработки, содержащий этапы, на которых: выполняют, основыаясь на граничном правиле, операцию контурной фильтрации на отсчетах текущего видеоблока видеоизображения во время преобразования между текущим видеоблоком и представлением битового потока текущего видеоблока; в котором граничное правило зависит от идентификации компонентов цветности текущего видеоблока; и выполняют преобразование, используя результат операции контурной фильтрации.
38. Способ по решению 37, в котором граничное правило отличается для компонентов яркости и/или компонентов цветности.
39. Способ по любому из пунктов 1-38, в котором преобразование содержит кодирование текущего видеоблока в представление битового потока.
40. Способ по любому из решений 1-38, в котором преобразование содержит декодирование представления битового потока для формирования значений отсчета текущего видеоблока.
41. Устройство видеокодирования, содержащее процессор, выполненный с возможностью способа, описанного в одном или более решениях 1-38.
42. Устройство видеодекодирования, содержащее процессор, выполненный с возможностью реализации способа, описанного в одном или более решениях 1-38.
43. Считываемый компьютером носитель, на котором хранится управляющая программа, причем управляющая программа при исполнении процессором вызывает реализацию процессором способа, описанного в одном или более решениях 1-38.
На фиг. 31 представлена блок-схема, показывающая примерную систему 3100 видеообработки, в которой могут быть реализованы различные раскрытые здесь технологии. Различные реализации могут содержать некоторых или все компоненты системы 3100. Система 3100 может содержать вход 3102 для приема видеоконтента. Видеоконтент может приниматься в строчном или несжатом формате, например, 8-ми- или 10-ттибитовые многокомпонентные пиксельные значения или может быть в сжатом или кодированном формате. Вход 3102 может представлять собой сетевой интерфейс, интерфейс периферийной шины или интерфейс запоминающего устройства. Примеры сетевого интерфейса содержат проводные интерфейсы, такие как Ethernet, пассивная оптическая сеть (passive optical network, PON) и т. д., и беспроводные интерфейсы, такие как Wi-Fi или сотовые интерфейсы.
Система 3100 может содержать компонент 3104 кодирования, который может реализовать различные способы кодирования или декодирования, описанные в настоящем документе. Компонент 3104 кодирования может уменьшить битовую скорость передачи видео от входа 3102 к выходу компонента 3104 кодирования для создания кодированного представления видео. Способы кодирования поэтому иногда называют видеосжатием видео или способами видеотранскодирования. Выход компонента 3104 кодирования может быть либо запомнен, либо или передан через подключенную линию связи, как представлено компонентом 3106. Запомненное или переданное представление битового потока (или кодированное) для видео, принятого на входе 3102, может использоваться компонентом 3108 для формирования пиксельных значений или визуализуемого видео, которое посылается на интерфейс 3110 дисплея. Процесс формирования просматриваемого пользователем видео из представления битового потока иногда называют видеораспаковкой. Дополнительно, хоты некоторые операции видеообработки упоминаются как операции или инструменты "кодирования", следует понимать, что инструменты или операции кодирования, которые используются в кодере, и соответствующие инструменты и операции декодирования, которые инвертируют результаты кодирования, будую выполняться декодером.
Примеры интерфейса периферийной шины или интерфейса дисплея могут включать универсальную последовательную шину (universal serial bus, USB) или мультимедийный интерфейс с высоким разрешением (high definition multimedia interface, HDMI) или DisplayPort и так далее. Примеры интерфейсов запоминающего устройства включают SATA (serial advanced technology attachment), PCI, интерфейс IDE и т. п. Способы, описанные в настоящем документе, могут быть реализованы в различных электронных устройствах, таких как мобильные телефоны, ноутбуки, смартфоны или другие устройства, которые способны к выполнению обработки цифровых данных и/или видеоизображений.
На фиг. 32 представлена блок-схема последовательности выполнения операций способа 3200 видеообработки в соответствии с представленной технологией. Способ 3200 содержит этап 3210, на котором определяют для преобразования блока видеоизображения в видео и представление битового потока градиенты подмножества отсчетов в области для операции классификации в процессе фильтрации. Область имеет размер M×N и блок имеет размер K×L, где M, N, K, L - положительные целые числа и блок расположен внутри области. Способ также содержит выполнение на этапе 3220 преобразования, основанного на определении.
В некоторых вариантах осуществления подмножество отсчетов содержит отсчеты, которые не требуют соседних отсчетов, расположенных с пересечением каких-либо границ нескольких видеообластей видеоизображения для определения градиентов. В некоторых вариантах осуществления подмножество отсчетов содержит текущий отсчет, расположенный на одной или нескольких границах многочисленных видеообластей видеоизображения. В некоторых вариантах осуществления заполненные отсчеты формируются в случае, когда по меньшей мере одна соседний отсчет относительно текущего отсчета располагается с пересечением одной или нескольких границ.
В некоторых вариантах осуществления заполненные отсчеты формируются, используя отсчеты вдоль только одной стороны границы. В некоторых вариантах осуществления заполненные отсчеты формируются путем повторения отсчетов на одной или более границах. В некоторых вариантах осуществления одна или более строк заполненных отсчетов над блоком формируются в случае, когда текущий отсчет располагается на верхней границе видеоблока. В некоторых вариантах осуществления сгенерированы одна или более строк заполненных отсчетов слева от блока располагаются на левой границе видеоблока. В некоторых вариантах осуществления формируются одна или несколько строк заполненных отсчетов справа от блока в случае, когда текущий отсчет расположен на правой границе видеоблока. В некоторых вариантах осуществления одна или несколько строк заполненных отсчетов ниже блока формируются в случае, когда текущий отсчет расположен на нижней границе видеоблока. В некоторых вариантах осуществления граница содержит границу секции, границу брика, границу плитки, границу субизображения, 360-градусную виртуальную границу или виртуальную границу адаптивной контурной фильтрации. В некоторых вариантах осуществления виртуальная граница адаптивной контурной фильтрации разрешается для блока в случае, когда блок находится на нижней границе видеоизображения, так что отсчеты в первой части блока запрещаются для использования для второй части блока в процессе фильтрации, причем первая и вторая части разделяются виртуальной границей адаптивной контурной фильтрации. В некоторых вариантах осуществления виртуальная граница адаптивной контурной фильтрации разрешается для блока в случае, когда блок находится не на нижней границе видеоизображения, так что отсчеты в первой части блока запрещаются для использования для второй части блока в процессе фильтрации, причем первая и вторая части разделяются виртуальной границей адаптивной контурной , фильтрации.
В некоторых вариантах осуществления одна или более строк заполненных отсчетов содержат одну строку или две строки заполненных отсчетов. В некоторых вариантах осуществления область центрируется в блоке. В некоторых вариантах осуществления M = N = 8. В некоторых вариантах осуществления K = L = 4.
В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на верхней границе и на левой границе видеоблока, область регулируется на основе определения области M × (N + K1), основываясь на K1 строк заполненных отсчетов над блоком, где K1 является положительным целым числом; и на определении области (M + K2) × (N + K1), основываясь на K2 строк заполненных отсчетов слева от блока, где K2 является положительным целым числом. В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на верхней границе и на левой границе видеоблока, область регулируется, основываясь на определении области (M + K2) × N на основе K2 строк заполненных отсчетов слева от блока, где K2 является положительным целым числом; и определении области (M + K2) × (N + K1) на основе K1 строк заполненных отсчетов выше блока, где K1 является положительным целым числом. В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на верхней границе и на правой границе видеоблока, область регулируется на основе определения области M × (N + K1), основываясь на K1 строк заполненных отсчетов над блоом, где K1 является положительным целым числом; и на определении области (M + K2) × (N + K1), основываясь на K2 строк заполненных отсчетов справа от блока, где K2 является положительным целвм числом. В некоторых вариантах осуществления в случае, когда текущий отсчет располагается на нижней границе и левой границе видеоблока, область регулируется, основываясь на определении области M × (N + K1), на основе K1 строк заполненных отсчетов выше блока, где K1 является положительным целым числом; В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на верхней границе и на правой границе видеоблока, область регулируется на основе определения области (M + K2) × N, основываясь на K2 строк заполненных отсчетов справа от блока, где K2 является положительным целым числом; и определяют область (M + K2) × (N + K1) на основе K1 строк заполненных отсчетов выше блока, где K1 является положительным целым числом. В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на нижней границе и на правой границе видеоблока, область регулируется на основе определения области M × (N + K1), основываясь на K1 строк заполненных отсчетов ниже блока, где K1 является положительным целым числом; и определяют область (M + K2) × (N + K1) на основе K2 строк заполненных отсчетов справа от блока, где K2 является положительным целым числом. В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на нижней границе и на правой границе видеоблока, область регулируется на основе определения области (M + K2) × N, основываясь на K2 строк заполненных отсчетов справа от блока, где K2 является положительным целым числом; и определяют область (M + K2) × (N + K1) на основе K1 строк заполненных отсчетов ниже блока, где K1 является положительным целым числом. В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на нижней границе и на левой границе видеоблока, область регулируется, основываясь на определении области M × (N + K1), основываясь на K1 строк заполненных отсчетов ниже блока, где K1 является положительным целым числом; и определяют область (M + K2) × (N + K1) на основе K2 строк заполненных отсчетов слева от блока, где K2 является положительным целым числом. В некоторых вариантах осуществления, в случае, когда текущий отсчет расположен на нижней границе и на левой границе видеоблока, область регулируется на основе определения области (M + K2) × N, основываясь на K2 строк заполненных отсчетов слева от блока, где K2 является положительным целым числом; и определяют область (M + K2) × (N + K1) на основе K1 строк заполненных отсчетов ниже блока, где K1 является положительным целым числом. В некоторых вариантах осуществления градиенты определяются частично на основе заполненных отсчетов.
В некоторых вариантах осуществления, подмножество отсчетов располагается в субобласти M × (N - C1) области в случае, когда блок находится на верхней или на нижней границе видеоблока, где C1 является положительным целым числом. В некоторых вариантах осуществления верхние или нижние С1 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1) × N области в случае, когда блок находится на левой или на правой границе видеоблока, где C1 является положительным целым числом. В некоторых вариантах осуществления левые или правые С1 строк отсчетов исключаются для операции классификации.
В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти M × (N - C1 - C2) области в случае, если блок находится на верхней и нижней границах видеоблока, где C1 и C2 являются положительными целыми числами. В некоторых вариантах осуществления верхние С1 строк и нижние С2 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1) × (N - C2) области в случае, когда блок находится на верхней и на левой границе видеоблока, где C1 и C2 являются положительными целыми числами. В некоторых вариантах осуществления верхние С1 строк и левые С2 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов расположено в подобласти (M - C1) × (N - C2) области в случае, когда блок находится на верхней и правой границе видеоблока, где C1 и C2 являются положительными целыми числами. В некоторых вариантах осуществления верхние C1 строк и правые C2 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1) × (N - C2) области в случае, когда блок на нижней и левой границе видеоблока, где C1 и C2 являются положительными целыми числами. В некоторых вариантах осуществления нижние C1 строк и левые C2 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1) × (N - C2) области в случае, когда блок находится на нижней и правой границе видеоблока, где C1 и C2 являются положительным целым числом. В некоторых вариантах осуществления нижние C1 строк и правые C2 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1 - C2) × N области в случае, когда блок находится на левой и на правой границе видеоблока, где C1 и C2 являются положительными целыми числами. В некоторых вариантах осуществления верхние C1 строк и нижние C2 строк отсчетов исключаются для операции классификации.
В некоторых вариантах осуществления подмножество отсчетов расположено в подобласти (M - C3) × (N - C1 - C2) области в случае, когда блок находится на верхней границе, нижней границе и на левой границе видеоблока, где C1, C2 и C3 являются положительными целыми числами. В некоторых вариантах осуществления верхние C1 строк, нижние C2 строк и левые C3 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C3) × (N - C1 - C2) области в случае, когда блок находится на верхней границе, нижней границе и на правой границе видеоблока, где C1, C2 и C3 являются положительными целыми числами. В некоторых вариантах осуществления верхние C1 строк, нижние C2 строк и правые C3 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1 - C2) × (N - C3) области в случае, когда блок находится на левой границе, правой границе и на верхней границе видеоблока, где C1, C2 и C3 являются положительными целыми числами. В некоторых вариантах осуществления левые C1 строк, правые C2 строк и верхние C3 строк отсчетов исключаются для операции классификации. В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1 - C2) × (N - C3) области в случае, когда когда блок находится на левой границе, правой границе и на нижней границе видеоблока, где C1, C2 и C3 являются положительными целыми числами. В некоторых вариантах осуществления левые C1 строк, правые C2 строк и верхние C3 строк отсчетов исключаются для операции классификации.
В некоторых вариантах осуществления подмножество отсчетов располагается в подобласти (M - C1 - C2) × (N - C3 - C4) области в случае, когда блок находится на левой границе, правой границе, верхней границе и на нижней границе видеоблока, где C1, C2, C3 и C4 являются положительными целыми числами. В некоторых вариантах осуществления, левые С1 строк, правые С2 строк, верхние С3 строк и нижние строки C4 отсчетов исключаются для операции классификации. В некоторых вариантах осуществления по меньшей одно значение из C1, C2, C3 или C4 равно 2. В некоторых вариантах осуществления C1, C2, C3 и C4 равны 2.
В некоторых вариантах осуществления видеоблок содержит секцию, брик или плитку. В некоторых вариантах осуществления подмножество отсчетов содержит отсчеты, соседние отсчеты которых не располагаются, пересекая какие-либо границы множества видеообластей видеоизображения.
На фиг. 33 представлена блок-схема последовательности выполнения операций способа 3300 видеообработки в соответствии с настоящей технологией. Способ 3300 содержит этапы, на которых на этапе 3310 определяют для преобразования блока видеоизображения в видео и представление битового потока видео универсальную операцию заполнения в процессе адаптивной контурной фильтрации, который применим к отсчетам, расположенным на 360-градусных виртуальных границах нескольких видеообластей видеоизображения независимо от положения 360-градусных виртуальных границ внутри видеоизображения. Способ 3300 также содержит этап 3320, на котором выполняют преобразование, основанное на определении.
В некоторых вариантах осуществления универсальная операция заполнения содержит формирование заполненных отсчетов, используя отсчеты вдоль только одной стороны 360-градусной виртуальной границы. В некоторых вариантах осуществления заполненные отсчеты формируются путем повторения отсчетов на 360-градусной виртуальной границе. В некоторых вариантах осуществления 360-градусная виртуальная граница не совпадает с фактической границей блока. В некоторых вариантах осуществления универсальная операция заполнения содержит формирование заполненных отсчетов, используя отсчеты с обеих сторон 360-градусной виртуальной границы. В некоторых вариантах осуществления 360-градусная виртуальная граница содержит свернутый край основополагающего 360-градусного видео, проецируемого на видеоизображение, используя эквипрямоугольный формат проекции.
В некоторых вариантах осуществления преобразование содержит кодирование видео в представление битового потока. В некоторых вариантах осуществления преобразование содержит декодирование представления битового потока в видео.
Из вышесказанного следует понимать, что конкретные варианты осуществления раскрытой в настоящее время технологии были описаны здесь в целях иллюстрации, но эти различные модификации могут быть выполнены, не отступая от объема защиты изобретения. Соответственно, в настоящее время раскрытая технология не ограничивается ничем, кроме как приложенной формулой изобретения.
Некоторые варианты осуществления раскрытой технологии содержат принятие решения или определение для разрешения инструмента или режима видеообработки. В примере, когда инструмент или режим видеообработки разрешается, кодер будет использовать или реализовывать инструмент или режим при видеообработке блока видео, но может не обязательно модифицировать результирующий битовый поток, основываясь на использовании инструмента или режима. То есть, преобразование из блока видео в представление битового потока видео будет использовать инструмент или режим видеообработки, когда это разрешается на основе решения или определения. В другом примере, когда инструмент или режим видеообработки разрешены, декодер будет обрабатывать битовый поток, зная, что битовый поток был изменен на основе инструмента или режима видеообработки. То есть, преобразование из представления битового потока видео в блок видео будет выполняться, используя интструмент или режим видеообработки, которые были разрешены, основываясь на решении или определении.
Некоторые варианты осуществления раскрытой технологии содержат принятие решения или определение для разрешения инструмента или режима видеообработки. В примере, когда инструмент или режим видеобработки запрещены, кодер не будет использовать инструмент или режим для преобразования блока видео в представление битового потока видео. В другом примере, когда инструмент или режим видеообработки запрещены, декодер будет обрабатывать битовый поток, зная, что битовый поток не был модифицирован, используя инструмент или режим видеообработки, которые были разрешены на основе решения или определения.
Реализации существа предмета и функциональные операции, описанные в этом патентном документе, могут быть осуществлены в различных системах, цифровой электронной схеме или в программном обеспечении, встроенном микропрограммном обеспечении или в аппаратных средствах, включая структуры, раскрытые в этой спецификации и ее структурных эквивалентах или в сочетаниях одного или более из них. Реализации существа предмета, описанные в этой спецификации, могут быть осуществлены как один или более компьютерных программных продуктов, например, один или несколько модулей команд компьютерной программы, кодированных на физическом и предназначенном для длительного хранения считываемом компьютером носитель для выполнения или управления операциями устройчтва обработки данных. Считываемый компьютером носитель может быть машиночитаемым запоминающим устройством, машиночитаемой подложкой запоминающего устройства, устройством памяти, в сочетаниии с использования машинносчитываемого распространяющегося сигнала или в сочетании с одним или более из них. Термин “блок обработки данных” или “устройство обработки данных” охватывает все аппаратные средства, устройства и машины для обработки данных, включая, например, программируемый процессор, компьютер или несколько процессоров или компьютеров. Аппаратные средства могут включать в себя управляющую программу, которая создает среду выполнения рассматриваемой компьютерной программы, например, управляющую программу, которая составляет встроенное микропрограммное обеспечение процессора, стек протоколов, систему управления базами данных, операционную систему или сочетание одного или более из них.
Компьютерная программа (также известная как программа, программное обеспечение, приложение, сценарий или код) может быть записана в любой форме языка программирования, включая скомпилированные или интерпретируемые языки, и это может быть развернута в любой форме, включая как автономную программу или как модуль, компонент, подпрограмму или другой блок, пригодные для использования в компьютерной среде. Компьютерная программа не обязательно соответствует файлу в файловой системе. Программа может храниться в части файла, который содержит другие программы или данные (например, один или несколько сценариев, хранящихся в документе на языке разметки), в едином файле, выделенном для рассматриваемой программы, или в нескольких скоординированных файлах (например, файлах, которые хранят один или несколько модулей, субпрограмм или участков кода). Компьютерная программа может быть развернута так, чтобы исполняться на одном компьютере или на нескольких компьютерах, которые расположены на одном сайте или распределены на нескольких сайтах и взаимосвязаны сетью связи.
Процессы и логические потоки, описанные в этой спецификации, могут таже быть выполняться утройством, которое может быть реализовано одним или несколькими программируемыми процессорами, выполняющими одну или несколько компьютерных программ для выполнения функций, управляясь входными данными и формируя выходные данные. Процессы и логические потоки могут также выполняться и аппаратные средства могут также реализовываться как схема логики специального назначения, например, FPGA (программируемая логическая интегральная схема) или ASIC (специализированная прикладная интегральная схема).
Процессоры, пригодные для исполнения компьютерной программы, содержат, например, микропроцессоры как специального назначения, так и общего назначения, и любой один или более процессоров компьютеров любого вида. Обычно процессор принимает команды и данные из постоянной памяти или из оперативной памяти или их обоих. Основными элементами компьютера являются процессор для выполнения команд и одно или более запоминающих устройств для хранения команд и данных. Обычно компьютер будет также содержать или оперативно связываться, чтобы принимать или передавать данные или делать то и другое, одно или несколько устройств хранения большого объема данных для хранения данных, например, магнитные, магнито-оптические диски или оптические диски. Однако компьютер не обязательно должен иметь такие устройства. Считываемые компьютером носители, пригодные для хранения команд компьютерной программы и данных, содержат все формы энергонезависимой памяти, носители и устройства памяти, включая, например, устройства полупроводниковой памяти, например, EPROM, EEPROM и устройства флэш-памяти. Процессор и память могут добавляться или включаться в состав логической схемы специального назначения.
Предполагается, что спецификация вместе с чертежами должны рассматриваться только как примерные, где "примерные"означают пример. Термин "или", как он используется здесь, предназначен использоваться как включающий "и/или", если контекст явно не указывает иное.
Хотя этот патентный документ содержит много специфических особенностей, они не должны истолковываться как ограничения объема изобретения или того, что может быть заявлено, а скорее как описания признаков, которые могут быть характерными для конкретных вариантов осуществления конкретных изобретений. Конкретные признаки, описанные в этом патентном документе в контексте отдельных вариантов осуществления, могут также быть реализованы в сочетании в одном варианте осуществления. Альтернативно, различные признаки, которые описаны в контексте одного варианта осуществления, могут также быть реализованы в нескольких вариантах осуществления отдельно или в любом подходящем субсочетании. Более того, хотя функции могут описываться выше как действующие в определенных сочетаниях и даже первоначально заявляться как таковые, одна или несколько функций из требуемого сочетания могут в некоторых случаях быть извлечены из сочетания и заявляенное сочетание может быть направлено в субсочетание или вариант субсочетания.
Аналогично, хотя операции показаны на чертежах в конкретном порядке, это не должно быть пониматься как требование, чтобы такие операции выполнялись в показанном конкретном порядке или в последовательном порядке, или чтобы все показанные операции были выполнены, чтобы достигнуть желаемых результатов. Дополнительно, разделение различных компонентов системы в вариантах осуществления, описанных в этом патентном документе, не должно пониматься как требование такого разделения во всех вариантах осуществления.
Были описаны только несколько реализаций и примеров и другие реализации, улучшения и изменения могут быть сделаны на основе того, что описано и проиллюстрировано в этом патентном документе.

Claims (43)

1. Способ обработки видеоданных, содержащий этапы, на которых:
определяют, для преобразования между изображением в видео, содержащем один или более блоков дерева кодирования, и битовым потоком видео, градиенты субнабора отсчетов в области размером 88 для получения классификации блока 44 первого блока дерева кодирования в первом процессе фильтрации, причем блок 44 расположен внутри первого блока дерева кодирования и блок 44 расположен внутри области 88; и
выполняют преобразование на основе указанного определения,
при этом первый процесс фильтрации содержит этапы, на которых:
определяют набор коэффициентов фильтрации для отсчета блока 44 на основе указанных градиентов;
определяют набор значений сжатия для указанного отсчета; и
применяют фильтр к указанному отсчету на основе набора коэффициентов фильтрации и набора значений сжатия,
при этом в случае, когда не разрешено использовать отсчеты, пересекающие границу видеоблока в первом процессе фильтрации, крайние левые два столбца отсчетов в области 88 заполняются, когда в блоке 44, расположенном на левой границе видеоблока, имеется отсчет; или самые верхние две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на верхней границе видеоблока, имеется отсчет; или самые правые две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на правой границе видеоблока, имеется отсчет; или самые нижние две строки заполненных отсчетов в области 88 заполняются, если в блоке 44, расположенном на нижней границе видеоблока, имеется отсчет.
2. Способ по п. 1, в котором граница видеоблока содержит границу секции, границу плитки, границу субизображения, 360-градусную виртуальную границу или виртуальную границу адаптивной контурной фильтрации.
3. Способ по п. 2, в котором виртуальная граница адаптивной контурной фильтрации активирована для первого блока дерева кодирования в случае, когда нижняя граница первого блока дерева кодирования не находится на нижней границе изображения.
4. Способ по п. 2, в котором виртуальная граница адаптивной контурной фильтрации активирована для первого блока дерева кодирования в случае, когда первый блок дерева кодирования находится на нижней границе изображения и расстояние по вертикали между верхним левым отсчетом первого блока дерева кодирования и нижней границей изображения не меньше некоторого значения.
5. Способ по п. 2, в котором операция одностороннего заполнения применяется к отсчетам, пересекающим 360-градусную виртуальную границу, независимо от положения 360-градусной виртуальной границы внутри изображения, при этом при операции одностороннего заполнения, если один отсчет, который подлежит использованию, находится снаружи 360-градусной виртуальной границы, он копируется из доступного отсчета внутри 360-градусной виртуальной границы.
6. Способ по п. 1, в котором на разных уровнях сообщают отдельные элементы синтаксиса, указывающие, разрешается ли использовать отсчеты, пересекающие различного вида границы, при этом различного вида границы содержат границу секции, границу плитки и границу субизображения.
7. Способ по п. 6, в котором первый элемент синтаксиса для границы плитки элементов синтаксиса включается в набор параметров изображения, чтобы указать, разрешено ли использовать отсчеты, пересекающие границы плитки; второй элемент синтаксиса для границы секции элементов синтаксиса включается в набор параметров изображения, чтобы указать, разрешено ли использовать отсчеты, пересекающие границы секции; третий элемент синтаксиса для границы субизображения элементов синтаксиса включается в набор параметров последовательности, чтобы указать, разрешено ли использовать отсчеты, пересекающие границы субизображения.
8. Способ по п. 6, в котором отдельные элементы синтаксиса дополнительно применяются по меньшей мере в одном из процесса деблокирующей фильтрации, процесса адаптивного смещения отсчета (sample adaptive offset, SAO), процесса двусторонней фильтрации или процесса фильтрации с преобразованием Адамара.
9. Способ по п. 1, в котором область 88 расположена внутри области 1010 в случае, когда не разрешено использовать отсчеты, пересекающие границу видеоблока в первом процессе фильтрации, крайние левые три столбца отсчетов в области 1010, содержащие два столбца отсчетов в области 88, заполняются, когда в блоке 44, расположенном на левой границе видеоблока, имеется отсчет.
10. Способ по п. 1, в котором на этапе преобразования кодируют видео в битовый поток.
11. Способ по п. 1, в котором на этапе преобразования декодируют видео из битового потока.
12. Устройство обработки видеоданных, содержащее процессор и память долговременного пользования с хранящимися в ней командами, при этом команды, при исполнении их процессором, вызывают выполнение процессором:
определения, для преобразования между изображением в видео, содержащем один или более блоков дерева кодирования, и битовым потоком видео, градиентов субнабора отсчетов внутри области размером 88 для получения классификации блока 44 первого блока дерева кодирования в первом процессе фильтрации, причем блок 44 расположен внутри первого блока дерева кодирования и блок 44 расположен внутри области 88; и
выполнения преобразования на основе указанного определения,
при этом первый процесс фильтрации содержит:
определение набора коэффициентов фильтрации для отсчета блока 44 на основе указанных градиентов;
определения набора значений сжатия указанного отсчета; и
применения фильтра к указанному отсчету на основе набора коэффициентов фильтрации и набора значений сжатия,
при этом в случае, если не разрешено использовать отсчеты, пересекающие границу видеоблока в первом процессе фильтрации, крайние левые два столбца отсчетов в области 88 заполняются, когда в блоке 44, расположенном на левой границе видеоблока, имеется отсчет; или самые верхние две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на верхней границе видеоблока, имеется отсчет; или самые правые две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на правой границе видеоблока, имеется отсчет; или самые нижние две строки заполненных отсчетов в области 88 заполняются, если в блоке 44, расположенном на нижней границе видеоблока, имеется отсчет.
13. Считываемый компьютером носитель долговременного использования, хранящий команды, которые вызывают выполнение процессором:
определения, для преобразования между изображением в видео, содержащем один или более блоков дерева кодирования, и битовым потоком видео, градиентов субнабора отсчетов внутри области размером 88 для получения классификации блока 44 первого блока дерева кодирования в первом процессе фильтрации, причем блок 44 расположен внутри первого блока дерева кодирования и блок 44 расположен внутри области 88; и
выполнения преобразования на основе указанного определения,
при этом первый процесс фильтрации содержит:
определение набора коэффициентов фильтрации для отсчета блока 44 на основе указанных градиентов;
определения набора значений сжатия указанного отсчета; и
применения фильтра к указанному отсчету на основе набора коэффициентов фильтрации и набора значений сжатия,
при этом в случае, если не разрешено использовать отсчеты, пересекающие границу видеоблока в первом процессе фильтрации, крайние левые два столбца отсчетов в области 88 заполняются, когда в блоке 44, расположенном на левой границе видеоблока, имеется отсчет; или самые верхние две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на верхней границе видеоблока, имеется отсчет; или самые правые две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на правой границе видеоблока, имеется отсчет; или самые нижние две строки заполненных отсчетов в области 88 заполняются, если в блоке 44, расположенном на нижней границе видеоблока, имеется отсчет.
14. Способ сохранения битового потока видео, содержащий этапы, на которых:
определяют градиенты субнабора отсчетов в области с размером 88 для получения классификации блока 44 первого блока дерева кодирования в изображении видео в первом процессе фильтрации, причем блок 44 расположен внутри первого блока дерева кодирования и блок 44 расположен внутри области 88;
формируют битовый поток на основе указанного определения; и
сохраняют битовый поток в считываемом компьютером носителе долговременного использования,
при этом первый процесс фильтрации содержит этапы, на которых:
определяют набор коэффициентов фильтрации для отсчета блока 44 на основе указанных градиентов;
определяют набор значений сжатия для указанного отсчета; и
применяют фильтр к указанному отсчету на основе набора коэффициентов фильтрации и набора значений сжатия,
при этом в случае, если не разрешено использовать отсчеты, пересекающие границу видеоблока в первом процессе фильтрации, крайние левые два столбца отсчетов в области 88 заполняются, когда в блоке 44, расположенном на левой границе видеоблока, имеется отсчет; или самые верхние две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на верхней границе видеоблока, имеется отсчет; или самые правые две строки отсчетов в области 88 заполняются, если в блоке 44, расположенном на правой границе видеоблока, имеется отсчет; или самые нижние две строки заполненных отсчетов в области 88 заполняются, если в блоке 44, расположенном на нижней границе видеоблока, имеется отсчет.
RU2022102907A 2019-07-15 2020-07-15 Классификация в адаптивной контурной фильтрации RU2811461C2 (ru)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CNPCT/CN2019/096059 2019-07-15
CNPCT/CN2019/096398 2019-07-17

Publications (2)

Publication Number Publication Date
RU2022102907A RU2022102907A (ru) 2023-08-07
RU2811461C2 true RU2811461C2 (ru) 2024-01-11

Family

ID=

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130128986A1 (en) * 2011-11-23 2013-05-23 Mediatek Inc. Method and Apparatus of Slice Boundary Padding for Loop Filtering
US20130343447A1 (en) * 2012-06-25 2013-12-26 Broadcom Corporation Adaptive loop filter (ALF) padding in accordance with video coding
RU2521081C2 (ru) * 2008-07-11 2014-06-27 Квэлкомм Инкорпорейтед Фильтрация видеоданных с использованием множества фильтров
WO2016066093A1 (en) * 2014-10-31 2016-05-06 Mediatek Inc. Method of improved directional intra prediction for video coding
CN108449591A (zh) * 2018-03-21 2018-08-24 天津大学 一种深度视频dmm模式简化方法
US20190215518A1 (en) * 2018-01-10 2019-07-11 Qualcomm Incorporated Histogram of gradient based optical flow

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
RU2521081C2 (ru) * 2008-07-11 2014-06-27 Квэлкомм Инкорпорейтед Фильтрация видеоданных с использованием множества фильтров
US20130128986A1 (en) * 2011-11-23 2013-05-23 Mediatek Inc. Method and Apparatus of Slice Boundary Padding for Loop Filtering
US20130343447A1 (en) * 2012-06-25 2013-12-26 Broadcom Corporation Adaptive loop filter (ALF) padding in accordance with video coding
WO2016066093A1 (en) * 2014-10-31 2016-05-06 Mediatek Inc. Method of improved directional intra prediction for video coding
US20190215518A1 (en) * 2018-01-10 2019-07-11 Qualcomm Incorporated Histogram of gradient based optical flow
CN108449591A (zh) * 2018-03-21 2018-08-24 天津大学 一种深度视频dmm模式简化方法

Similar Documents

Publication Publication Date Title
US11553179B2 (en) Sample determination for adaptive loop filtering
CN114128278B (zh) 自适应环路滤波中的样点填充
CN113994671B (zh) 基于颜色格式处理视频单元边界和虚拟边界
US11671594B2 (en) Selective application of sample padding in adaptive loop filtering
JP7433346B2 (ja) ビデオ単位境界および仮想境界の処理
US11683488B2 (en) Adaptive loop filtering between different video units
US11706462B2 (en) Padding process at unavailable sample locations in adaptive loop filtering
US20230231998A1 (en) Classification in adaptive loop filtering
RU2811461C2 (ru) Классификация в адаптивной контурной фильтрации
RU2815441C2 (ru) Способ заполнения отсчетов при адаптивной контурной фильтрации
US12003712B2 (en) Handling video unit boundaries and virtual boundaries
KR102669852B1 (ko) 적응적 루프 필터링을 위한 샘플 결정
CN114128296A (zh) 自适应环路滤波中跨视频单元边界访问样点
CN118138754A (zh) 处理视频单元边界和虚拟边界