ПРЕОБРАЗОВАНИЕ ИЗОБРАЖЕНИЯ В КОДИРОВАНИИ ВИДЕО С ИСПОЛЬЗОВАНИЕМ ОПТИМИЗАЦИИ ЗАВИСИМОСТИ ИСКАЖЕНИЯ ОТ СКОРОСТИ ПЕРЕДАЧИ
CONVERTING AN IMAGE IN VIDEO CODING USING OPTIMIZATION OF DISTORTION VERSUS SPEED

ПЕРЕКРЕСТНАЯ ССЫЛКА НА РОДСТВЕННЫЕ ЗАЯВКИ
Эта заявка заявляет приоритет предварительных заявок на патент США № 62/792,122, поданной 14 января 2019 г., № 62/782,659, поданной 20 декабря 2018 г., № 62/772,228, поданной 28 ноября 2018 г., № 62/739,402, поданной 1 октября 2018 г., № 62/726,608, поданной 4 сентября 2018 г., № 62/691,366, поданной 28 июня 2018 г., и № 62/630,385, поданной 14 февраля 2018 г., каждая из которых во всей своей полноте включена в данный документ посредством ссылки.
ОБЛАСТЬ ТЕХНИКИ
Настоящее изобретение относится в целом к кодированию изображений и видео. Более конкретно, один вариант осуществления настоящего изобретения относится к преобразованию изображений в кодировании видео.
ПРЕДПОСЫЛКИ ИЗОБРЕТЕНИЯ
В 2013 группа MPEG в Международной организации по стандартизации (ISO) совместно с Международным телекоммуникационным союзом (ITU) издала первый проект стандарта HEVC (также известного как H.265) кодирования видео (см. [4]). Позже та же группа призвала поддерживать развитие стандарта кодирования следующего поколения, который обеспечивает усовершенствованную производительность кодирования по сравнению с существующими технологиями кодирования видео.
Как используется в данном документе, термин «битовая глубина» обозначает количество пикселей, используемых для представления одной из цветовых компонент изображения. Традиционно изображения кодировали с 8 битами для цветовой компоненты на пиксель (например, 24 бита на пиксель), однако современные архитектуры теперь могут поддерживать более высокие битовые глубины, такие как 10 бит, 12 бит или более.
В традиционной последовательности обработки изображений захваченные изображения квантуют с использованием нелинейной оптоэлектронной функции (OETF), которая переводит линейный свет сцены в нелинейный видеосигнал (например, гамма-кодированный RGB или YCbCr). Затем на приемнике перед отображением на устройстве отображения сигнал обрабатывают электрооптической передаточной функцией (EOTF), которая переводит значения видеосигнала в значения цвета экрана вывода. Такие нелинейные функции включают традиционную «гамма»-кривую, как задокументировано в рекомендациях ITU-R Rec. BT.709 и BT. 2020, кривую «PQ» (квантование восприятия), описанную в стандарте SMPTE ST 2084, и «гибридную логарифмическую гамма» кривую, или «HLG», описанную в рекомендации Rec. ITU-R BT. 2100.
Как используется в данном документе, термин «прямое преобразование» обозначает процесс отображения цифрового изображения по принципу «выборка в выборку» или «кодовое слово в кодовое слово» из его исходной битовой глубины и исходного распределения или представления кодовых слов (например, гамма, или PQ, или HLG и т. п.) в изображение с такой же или другой битовой глубиной и другим распределением или представлением кодовых слов. Преобразование позволяет получать усовершенствованную сжимаемость или усовершенствованное качество изображения при фиксированной битовой скорости. Например, без ограничения, преобразование может быть применено к 10-битному или 12-битному PQ-кодированному HDR видео для усовершенствования эффективности кодирования в архитектуре кодирования 10-битного видео. В приемнике, после распаковки преобразованного сигнала приемник может применять «функцию обратного преобразования», чтобы восстанавливать сигнал в его исходное распределение кодовых слов. Здесь в понимании изобретателей, поскольку начинается разработка следующего поколения стандарта кодирования видео, желательными являются усовершенствованные методы для интегрированного преобразования и кодирования изображений. Способы согласно настоящему изобретению могут применяться к разнообразному содержимому видео, включая, но без ограничения, содержимому в стандартном динамическом диапазоне (SDR) и/или расширенном динамическом диапазоне (HDR).
Подходы, описанные в данном разделе, являются подходами, которые могут быть выполнены, но необязательно подходами, которые были ранее предложены или выполнены. Следовательно, если не указано иное, не следует предполагать, что любой из подходов, описанных в данном разделе, расценивается как известный уровень техники только лишь вследствие их включения в данный раздел. Подобным образом, не следует предполагать, что проблемы, определенные относительно одного или более подходов, были учтены в известном уровне техники на основе данного раздела, если не указано иное.
КРАТКОЕ ОПИСАНИЕ ГРАФИЧЕСКИХ МАТЕРИАЛОВ
Вариант осуществления настоящего изобретения проиллюстрирован в качестве примера, а не в качестве ограничения, на фигурах прилагаемых графических материалов, на которых одинаковые номера позиций относятся к подобным элементам и на которых:
На фиг. 1A показан пример процесса последовательности операций доставки видео;
на фиг. 1B показан пример процесса сжатия данных с использованием преобразования сигналов согласно известному уровню техники;
на фиг. 2A показан пример архитектуры кодера, использующего гибридное внутриконтурное преобразование согласно варианту осуществления настоящего изобретения;
на фиг. 2B показан пример архитектуры декодера, использующего гибридное внутриконтурное преобразование согласно варианту осуществления настоящего изобретения;
на фиг. 2C показан пример архитектуры для декодирования внутреннего CU с использованием преобразования согласно варианту осуществления;
на фиг. 2D показан пример архитектуры для декодирования внешнего CU с использованием преобразования согласно варианту осуществления;
на фиг. 2E показан пример архитектуры для декодирования внутреннего CU внутри слайсов с внешним кодированием согласно варианту осуществления для обработки яркости или цветности;
на фиг. 2F показан пример архитектуры для декодирования внутреннего CU внутри слайсов с внешним кодированием согласно варианту осуществления для обработки цветности;
на фиг. 3A показан пример способа кодирования видео с использованием архитектуры преобразования согласно варианту осуществления настоящего изобретения;
на фиг. 3B показан пример способа декодирования видео с использованием архитектуры преобразования согласно варианту осуществления настоящего изобретения;
на фиг. 4 показан пример способа перераспределения кодовых слов в преобразованной области согласно варианту осуществления настоящего изобретения;
на фиг. 5 показан пример способа получения порогов преобразования согласно варианту осуществления настоящего изобретения;
на фиг. 6A, 6B, 6C и 6D показаны примеры графиков данных для получения порогов преобразования согласно способу, представленному на фиг. 5, и варианту осуществления настоящего изобретения; и
на фиг. 6E показаны примеры распределения кодовых слов в соответствии с дисперсией интервала согласно вариантам осуществления настоящего изобретения.
ОПИСАНИЕ ПРИМЕРОВ ВАРИАНТОВ ОСУЩЕСТВЛЕНИЯ
В настоящем документе описаны методы преобразования и кодирования сигнала для сжатия изображений с использованием оптимизации зависимости искажений от скорости передачи (RDO). В следующем описании в целях пояснения изложены многочисленные специфические подробности для предоставления полного понимания настоящего изобретения. Однако следует понимать, что настоящее изобретение может быть реализовано на практике без этих специфических подробностей. В других примерах хорошо известные структуры и устройства не описаны в исчерпывающих подробностях во избежание ненужного перенасыщения, затемнения или запутывания настоящего изобретения.
Обзор
Примеры вариантов осуществления, описанные в настоящем документе, относятся к преобразования и кодированию сигналов для видео. В кодере процессор принимает входное изображение в первом представлении кодовых слов, подлежащем преобразованию во второе представление кодовых слов, причем второе представление кодовых слов позволяет более эффективное сжатие, чем первое представление кодовых слов, и генерирует функцию прямого преобразования, отображающую пиксели входного изображения во второе представление кодовых слов, при этом для генерирования функции прямого преобразования кодер: делит входное изображение на множество пиксельных областей, распределяет каждую из пиксельных областей в один из множества интервалов кодовых слов согласно первой яркостной характеристике каждой пиксельной области, вычисляет показатель интервала для каждого из множества интервалов кодовых слов согласно второй яркостной характеристике каждой из пиксельных областей, распределенных в каждый интервал кодовых слов, распределяет некоторое количество кодовых слов во втором представлении кодовых слов в каждый интервал кодовых слов согласно показателю интервала каждого интервала кодовых слов и критерию оптимизации зависимости искажения от скорости передачи и генерирует функцию прямого преобразования в ответ на распределение кодовых слов во втором представлении кодовых слов в каждый из множества интервалов кодовых слов.
В другом варианте осуществления в декодере процессор принимает элементы синтаксиса кодированного битового потока, характеризующие модель преобразования, при этом элементы синтаксиса включают один или более из флага, указывающего минимальное значение индекса интервала кодовых слов, которое необходимо использовать в процессе создания преобразования, флага, указывающего максимальное значение индекса интервала кодовых слов, которое необходимо использовать в процессе создания преобразования, флага, указывающего тип профиля модели преобразования, где тип профиля модели связан с параметрами по умолчанию, связанными с интервалом, включая значения значимости интервалов, или флага, указывающего одно или более дельта-значений значимости интервалов, которые необходимо использовать для регулирования значений значимости интервалов по умолчанию, определенных в профиле модели преобразования. На основании профиля модели преобразования процессор определяет значения значимости интервалов по умолчанию для каждого интервала и список распределения количеств кодовых слов по умолчанию, которые необходимо распределить в каждый интервал согласно значению значимости интервала. Затем
для каждого интервала кодовых слов процессор:
определяет его значение значимости интервала путем добавления его значения значимости интервала по умолчанию к его дельта-значению значимости интервала;
определяет количество кодовых слов, которые необходимо распределить в интервал кодовых слов, на основании значения значимости интервала для интервала и списка распределения; и
генерирует функцию прямого преобразования на основании количества кодовых слов, распределенных в каждый интервал кодовых слов.
В другом варианте осуществления в декодере процессор принимает кодированный битовый поток, содержащий одно или более кодированных преобразованных изображений в первом представлении кодовых слов, и метаданные, относящиеся к информации о преобразовании для кодированных преобразованных изображений. Процессор
на основании метаданных, относящихся к информации о преобразовании, генерирует функцию обратного преобразования и функцию прямого преобразования, причем функция обратного преобразования отображает пиксели преобразованного изображения из первого представления кодовых слов во второе представление кодовых слов, а функция прямого преобразования отображает пиксели изображения из второго представления кодовых слов в первое представление кодовых слов. Процессор извлекает из кодированного битового потока кодированное преобразованное изображение, содержащее один или более кодированных элементов, причем для одного или более кодированных элементов в кодированном преобразованном изображении:
для преобразованного элемента кодирования (CU) с внутренним кодированием в кодированном преобразованном изображении процессор:
генерирует первые преобразованные восстановленные выборки CU на основании преобразованных разностей в CU и первых преобразованных выборок предсказания;
генерирует преобразованный выход контурного фильтра на основании первых преобразованных восстановленных выборок и параметров контурного фильтра;
применяет функцию обратного преобразования к преобразованному выходу контурного фильтра для генерирования декодированных выборок элемента кодирования во втором представлении кодовых слов; и
сохраняет декодированные выборки элемента кодирования во втором представлении кодовых слов в опорном буфере;
для преобразованного элемента кодирования с внешним кодированием в кодированном преобразованном изображении процессор:
применяет функцию прямого преобразования к выборкам предсказания, хранящимся в опорном буфере во втором представлении кодовых слов, для генерирования вторых преобразованных выборок предсказания;
генерирует вторые преобразованные восстановленные выборки элемента кодирования на основании преобразованных разностей в кодированном CU и вторых преобразованных выборок предсказания;
генерирует преобразованный выход контурного фильтра на основании вторых преобразованных восстановленных выборок и параметров контурного фильтра;
применяет функцию обратного преобразования к преобразованному выходу контурного фильтра для генерирования выборок элемента кодирования во втором представлении кодовых слов; и
сохраняет выборки элемента кодирования во втором представлении кодовых слов в опорном буфере. Наконец, процессор генерирует декодированное изображение на основании сохраненных выборок в опорном буфере.
В другом варианте осуществления в декодере процессор принимает кодированный битовый поток, содержащий одно или более кодированных преобразованных изображений во входном представлении кодовых слов, и
метаданные (207) преобразования для одного или более кодированных преобразованных изображений в кодированном битовом потоке. Процессор генерирует функцию (282) прямого преобразования на основе метаданных преобразования, причем функция прямого преобразования отображает пиксели изображения из первого представления кодовых слов во входное представление кодовых слов. Процессор
генерирует функцию (265-3) обратного преобразования на основании метаданных преобразования или функции прямого преобразования, причем функция обратного преобразования отображает пиксели преобразованного изображения из входного представления кодовых слов в первое представление кодовых слов. Процессор извлекает из кодированного битового потока кодированное преобразованное изображение, содержащее один или более кодированных элементов, при этом:
для элемента кодирования с внутренним кодированием (внутренний CU) в кодированном преобразованном изображении процессор:
генерирует преобразованные восстановленные выборки внутреннего CU (285) на основании преобразованных разностей во внутреннем CU и преобразованных выборок предсказания с внутренним предсказанием;
применяет функцию (265-3) обратного преобразования к преобразованным восстановленным выборкам внутреннего CU для генерирования декодированных выборок внутреннего CU в первом представлении кодовых слов;
применяет контурный фильтр (270) к декодированным выборкам внутреннего CU
для генерирования выходных выборок внутреннего CU; и
сохраняет выходные выборки внутреннего CU в опорном буфере;
для CU с внешним кодированием (внешний CU) в кодированном преобразованном изображении процессор:
применяет функцию (282) прямого преобразования к выборкам внешнего предсказания, хранящимся в опорном буфере в первом представлении кодовых слов, для генерирования преобразованных выборок предсказания для внешнего CU во входном представлении кодовых слов;
генерирует преобразованные восстановленные выборки внешнего CU на основании преобразованных разностей во внешнем CU и преобразованных выборок предсказания для внешнего CU;
применяет функцию (265-3) обратного преобразования к преобразованным восстановленным выборкам внешнего CU для генерирования декодированных выборок внешнего CU в первом представлении кодовых слов;
применяет контурный фильтр (270) к декодированным выборкам внешнего CU
для генерирования выходных выборок внешнего CU; и
сохраняет выходные выборки внешнего CU в опорном буфере; и
генерирует декодированное изображение в первом представлении кодовых слов на основании выходных выборок в опорном буфере.
Пример последовательности обработки для доставки видео
На фиг. 1A изображен пример процесса обычной последовательности (100) для доставки видео, показывающий различные этапы от захвата видео до отображения содержимого видео. Последовательность видеокадров (102) захватывают или генерируют с использованием блока (105) генерирования изображений. Видеокадры (102) могут быть захвачены цифровым способом (например, посредством цифровой видеокамеры) или сгенерированы компьютером (например, с использованием компьютерной анимации) для предоставления видеоданных (107). Альтернативно видеокадры (102) могут быть захвачены на пленке кинокамерой. Пленку переводят в цифровой формат для предоставления видеоданных (107). На этапе (110) производства видеоданные (107) редактируют для предоставления потока (112) видеопроизводства.
Видеоданные потока (112) производства затем предоставляют на процессор в блоке (115) для редактирования в постпроизводстве. Блок (115) редактирования в постпроизводстве может включать регулирование или модификацию цветов или яркости в конкретных областях изображения для повышения качества изображения или получения конкретного визуального вида для изображения в соответствии с творческим замыслом создателя видео. Это иногда называют «цветоустановкой» или «цветокоррекцией». В блоке (115) может быть выполнено и другое редактирование (например, выбор сцен и определение последовательностей, обрезка изображений, добавление сгенерированных на компьютере визуальных специальных эффектов и т.п.) для получения окончательной версии (117) производства для дистрибуции. Во время редактирования (115) в постпроизводстве видеоизображения просматривают на опорном устройстве (125) отображения.
После постпроизводства (115) видеоданные завершенного производства (117) могут быть доставлены в блок (120) кодирования для доставки ниже по потоку в устройства декодирования и воспроизведения, такие как телевизоры, приставки, кинотеатры и т.п. В некоторых вариантах осуществления блок (120) кодирования может содержать кодеры звука и видео, такие как определены ATSC, DVB, DVD, Blu-Ray и другими форматами доставки, чтобы генерировать кодированный битовый поток (122). В приемнике кодированный битовый поток (122) декодируют посредством блока (130) декодирования, чтобы генерировать декодированный сигнал (132), представляющий близкую аппроксимацию сигнала (117) или идентичный ему сигнал. Приемник может быть подключен к целевому устройству (140) отображения, которое может обладать полностью отличными характеристиками от опорного устройства (125) отображения. В этом случае блок (135) управления отображением может быть использован для отображения динамического диапазона декодированного сигнала (132) в характеристики целевого устройства (140) отображения посредством генерирования сигнала (137), отображаемого на устройство отображения.
Преобразование сигналов
На фиг. 1B представлен пример процесса преобразования сигналов согласно известному уровню техники [2]. Принимая входные кадры (117), блок (150) прямого преобразования анализирует входные сигналы и ограничения кодирования и генерирует функции отображения кодовых слов, которые отображают входные кадры (117) в переквантованные выходные кадры (152). Например, входной сигнал (117) может быть закодирован в соответствии с определенной электрооптической передаточной функцией (EOTF) (например, гамма). В некоторых вариантах осуществления информация о процессе преобразования может передаваться на находящиеся ниже по потоку устройства (такие как декодеры) с использованием метаданных. В настоящем документе термин «метаданные» относится к любой вспомогательной информации, которая передается в качестве части кодированного битового потока и помогает декодеру представлять декодированное изображение. Такие метаданные могут включать, без ограничения, информацию о цветовом пространстве или гамме, параметры опорного устройства отображения и параметры вспомогательного сигнала, например описанные в настоящем документе.
После кодирования (120) и декодирования (130) декодированные кадры (132) могут быть обработаны функцией (160) инверсного (или обратного) преобразования, которая переводит переквантованные кадры (132) обратно в область исходной EOTF (например, гамма) для последующей обработки ниже по потоку, такой как процесс (135) управления отображением, обсуждавшийся ранее. В некоторых вариантах осуществления функция (160) обратного преобразования может быть интегрирована с устройством обратного квантования в декодере (130), например как часть устройства обратного квантования в декодере видео AVC или HEVC.
Как используется в данном документе, термин «преобразователь» может обозначать функцию прямого или обратного преобразования, предназначенную для использования при кодировании и/или декодировании цифровых изображений. Примеры функций преобразования обсуждаются по ссылке [2]. По ссылке [2] был предложен внутриконтурный основанный на блоках способ преобразования изображений для кодирования видео в расширенном динамическом диапазоне. Такая схема позволяет выполнять основанное на блоках преобразование внутри контура кодирования, но ценой повышенной сложности. Более конкретно, эта схема требует поддержания двух наборов буферов декодированных изображений: одного набора для прошедших обратное преобразование (или не прошедших преобразование) декодированных псевдокадров, который может быть использован как для предсказания без преобразования, так и для выдачи на устройство отображения, и другого набора для прошедших прямое преобразование декодированных псевдокадров, который используется только для предсказания с преобразованием. Хотя прошедшие прямое преобразование декодированные псевдокадры можно вычислять на лету, сложность является очень высокой, особенно для внешнего предсказания (компенсация движения с субпиксельной интерполяцией). В целом, управление буфером псевдокадров для отображения (DPB) является сложным и требует крайне тщательного внимания, и поэтому, в понимании изобретателей, требуются упрощенные способы кодирования видео.
По ссылке [6] были представлены дополнительные архитектуры кодеков на основе преобразования, включая внешний внеконтурный преобразователь, архитектуру с внутриконтурным исключительно внутренним преобразователем, архитектуру с внутриконтурным преобразователем для разности предсказания и гибридную архитектуру, которая сочетает как внутреннее, внутриконтурное, преобразование, так и внешнее разностное преобразование. Основной целью этих предложенных архитектур преобразования является улучшение субъективного визуального качества. Поэтому многие из этих подходов будут демонстрировать худшие объективные показатели, в частности хорошо известный показатель пикового отношения сигнала к шуму (Peak Signal to Noise Ratio, PSNR).
В этом изобретении новый преобразователь предложен на основании оптимизации зависимости искажений от скорости передачи (Rate-Distortion Optimization, RDO). В частности, когда целевым показателем искажения является MSE (среднеквадратичная ошибка, Mean Square Error), предложенный преобразователь будет улучшать как субъективное визуальное качество, так и хорошо известные объективные показатели, основанные на PSNR, PSNR Бьентегора (BD-PSNR) или скорости передачи Бьентегора (BD-Rate). Следует отметить, что любая из предложенных архитектур преобразования без потери общности может быть применена к яркостной компоненте, одной или более компонентам цветности или комбинации компонент яркости и цветности.
Преобразование, основанное на оптимизации зависимости искажений от скорости передачи
Рассмотрим преобразованный видеосигнал, представленный битовой глубиной B бит в цветовой компоненте (например, B = 10 для Y, Cb и/или Cr), таким образом, имеется в общем 2B доступных кодовых слов. Рассмотрим разделение желаемого диапазона кодовых слов [0 2B] на N сегментов или интервалов, и пусть Mk представляет количество кодовых слов в k-ом сегменте или интервале, после преобразовательного отображения, так что при заданной целевой битовой скорости R искажение D между исходным псевдокадром и декодированным или восстановленным псевдокадром является минимальным. Без потери общности D можно выразить как меру суммы квадратичной ошибки (SSE) между соответствующими значениями пикселей исходного входного сигнала (Source(i,j)) и восстановленного псевдокадра (Recon(i,j))
,       (1)
где
.
Оптимизационная задача преобразования может быть переписана как: найти Mk (k = 0, 1, ..., N-1) такое, что при заданной битовой скорости R D является минимальным, где .
Для нахождения решения могут быть использованы различные методы оптимизации, но оптимальное решение может быть очень сложным для кодирования в реальном времени. В этом изобретении предлагается неоптимальное, но более практическое аналитическое решение.
Без потери общности рассмотрим входной сигнал, представленный битовой глубиной B бит (например, B = 10), где кодовые слова равномерно разделены на N интервалов (например, N = 32). По умолчанию в каждый интервал распределяют Ma= 2B/N кодовых слов (например, для N=32 и B=10, Ma = 32). Затем более эффективное распределение кодовых слов, основанное на RDO, будет продемонстрировано на примере.
Как используется в данном документе, термин «узкий диапазон» [CW1, CW2] обозначает непрерывный диапазон кодовых слов между кодовыми словами CW1 и CW2, который представляет собой подмножество полного динамического диапазона [0 2B-1]. Например, в одном варианте осуществления узкий диапазон может быть определен как [16*2(B-8), 235*2(B-8)], (например, для B = 10, узкий диапазон содержит значения [64 940]). Полагая, что битовая глубина выходного сигнала равна Bo, если динамический диапазон входного сигнала находится в пределах узкого диапазона, то в процедуре, которая может быть названа преобразованием «по умолчанию», сигнал можно растянуть в полный диапазон [0 2Bo-1]. Тогда каждый интервал будет иметь приблизительно Mf  = CEIL((2Bo/(CW2-CW1))*Ma) кодовых слов, или, для нашего примера, если Bo=B=10, Mf = CEIL((1024/(940-64))*32) = 38 кодовых слов, где CEIL(x) обозначает функцию округления ceiling, которая отображает x в наименьшее целое число, которое больше или равно x. Без потери общности в приведенных ниже примерах для простоты полагается, что Bo=B.
Для одного и того же параметра квантования (QP) эффект увеличения количества кодовых слов в интервале эквивалентен распределению большего количества бит для кодирования сигнала в этом интервале, поэтому это эквивалентно уменьшению SSE или улучшению PSNR; однако равномерное увеличение распределения кодовых слов в каждом интервале может не дать лучших результатов, чем кодирование без преобразования, поскольку повышение PSNR не может превзойти увеличение битовой скорости, т.е. это не является хорошим компромиссом с точки зрения RDO. В идеале хотелось бы распределять больше кодовых слов только в те интервалы, которые обеспечивают лучший компромисс по RDO, т.е. создают значительное падение SSE (увеличение PSNR) за счет небольшой величины увеличения битовой скорости.
В одном варианте осуществления показатели RDO улучшают посредством адаптивного кусочного преобразовательного отображения. Этот метод может быть применен к сигналу любого типа, включая сигналы стандартного динамического диапазона (SDR) и расширенного динамического диапазона (HDR). Используя предыдущий простой случай в качестве примера, целью настоящего изобретения является распределение или Ma, или Mf кодовых слов для каждого сегмента кодовых слов или интервала кодовых слов.
На кодере при заданных N интервалах кодовых слов для входного сигнала среднюю дисперсию яркости каждого интервала можно аппроксимировать следующим образом:
Инициализировать в ноль сумму блочной дисперсии (varbin(k)) и счетчик (cbin(k)) для каждого интервала, например, varbin(k) = 0 и cbin(k) = 0, для k = 0, 1, …, N-1.
Разделить псевдокадр на L * L неперекрывающихся блоков (например, L=16)
Для каждого блока псевдокадра вычислить среднее яркости блока и дисперсию яркости блока i (например, Luma_mean(i) и Luma_var(i))
На основании среднего яркости блока распределить этот блок в один из N интервалов. В одном варианте осуществления, если Luma_mean(i) находится в пределах k-го сегмента во входном динамическом диапазоне, общую дисперсию яркости интервала для k-го интервала увеличивают на дисперсию яркости этого нового распределенного блока и счетчик для этого интервала увеличивают на единицу. То есть, если i-ая пиксельная область принадлежит k-му интервалу:
varbin(k) = varbin(k) + Luma_var(i);       (2)
cbin(k) = cbin(k) + 1.
Для каждого интервала, вычислить среднюю дисперсию яркости для этого интервала путем деления суммы блочных дисперсий в этом интервале на счетчик, полагая, что счетчик не равен 0; или если cbin(k) не равно 0, то
varbin(k) = varbin(k)/ cbin(k)        (3)
Специалист в данной области техники поймет, что можно применять альтернативные показатели, отличающиеся от дисперсии яркости, для описания характеристики подблоков. Например, можно использовать стандартное отклонение яркостных значений, взвешенные дисперсию яркости или яркостное значение, пиковую яркость и т.д.
В одном варианте осуществления следующий псевдокод описывает пример того, как кодер может регулировать распределение по интервалам с использованием вычисленных показателей для каждого интервала.
Для k-го интервала,
если в интервале нет пикселей
Mk = 0;
иначе если varbin(k) < THU        (4)
Mk = Mf ;
иначе
Mk = Ma ; // (замечание: это для того, чтобы убедиться, что каждый интервал будет иметь по меньшей мере Ma кодовых слов.  // Альтернативно также можно распределить Ma+1 кодовых слов)
конец
где THU обозначает заданный верхний порог.
В другом варианте осуществления распределение может выполняться следующим образом:
Для k-го интервала,
если в интервале нет пикселей
Mk = 0;
иначе если TH0 < varbin(k) < TH1        (5)
Mk = Mf ;
иначе
Mk = Ma ;
конец
где TH0 и TH1 обозначают заданные нижний и верхний пороги.
В другом варианте осуществления
Для k-го интервала,
если в интервале нет пикселей
Mk = 0;
иначе если varbin(k) >THL         (6)
Mk = Mf ;
иначе
Mk = Ma ;
конец
где THL обозначает заданный нижний порог.
Примеры выше показывают, как выбрать количество кодовых слов для каждого интервала из двух предварительно выбранных чисел Mf и Ma. Пороги (например, THU или THL) могут быть определены на основании оптимизации зависимости искажения от скорости передачи, например посредством прямого перебора. Пороги также могут быть отрегулированы на основании значений параметров квантования (QP). В одном варианте осуществления для B=10 пороги могут составлять от 1 000 до 10 000.
В одном варианте осуществления, чтобы ускорить обработку, порог может быть определен из фиксированного множества значений, к примеру, {2 000, 3 000, 4 000, 5 000, 6 000, 7 000}, с использованием метода оптимизации Лагранжа. Например, для каждого значения TH(i) во множестве, используя заданные тренировочные ограничения, можно провести испытания на сжатие с фиксированными QP и вычислить значения целевой функции J, определенной как:
J(i) = D + λ R.         (7)
Тогда оптимальное пороговое значение можно определить как значение TH(i) во множестве, для которого J(i) является минимальной.
В более общем примере можно задать справочную таблицу (LUT). Например, в таблице 1 первая строка определяет множество порогов, разделяющих полный диапазон возможных показателей интервалов (например, значений varbin(k)) на сегменты, а вторая строка определяет соответствующее количество кодовых слов (CW), подлежащих распределению в каждый сегмент. В одном варианте осуществления одно правило для построения такой LUT заключается в следующем: если дисперсия интервала является слишком большой, может потребоваться потратить множество битов для уменьшения SSE, поэтому можно распределить значения кодовых слов (CW), меньшие, чем Ma. Если дисперсия интервала очень мала, можно распределить значение CW, большее, чем Ma.
Таблица 1. Пример LUT для распределения кодовых слов на основании порогов дисперсии интервала
TH0
…
THp-1
THp
THp+1
…
THq-1
CW0
…
CWp-1
CWp
CWp+1
…
CWq-1
CWq
Используя таблицу 1, отображение порогов на кодовые слова можно выполнить следующим образом:
Для k-го интервала,
если в интервале нет пикселей
Mk = 0;
иначе если varbin(k) < TH0
Mk = CW0 ;
иначе если TH0< varbin(k) <TH1         (8)
Mk = CW1 ;
…
иначе если THp-1 < varbin(k) < THp
Mk = CWp ;
…
иначе если varbin(k) > THq-1
Mk = CWq ;
конец
Например, если заданы два порога и три распределения кодовых слов, для B = 10 в одном варианте осуществления TH0 = 3 000, CW0 = 38, TH1 = 10 000, CW1 = 32 и CW2 = 28.
В другом варианте осуществления два порога TH0 и TH1 могут быть выбраны следующим образом: a) положим, что TH1 является очень большим числом (даже бесконечностью), и выберем TH0 из множества заданных значений, например, с использованием оптимизации RDO в уравнении (7). При заданном TH0 теперь определим второе множество возможных значений для TH1, например множество {10 000, 15 000, 20 000, 25 000, 30 000} и применим уравнение (7) для нахождения оптимального значения. Этот подход можно итеративно выполнять с ограниченным числом пороговых значений или до тех пор, пока он не сойдется.
Можно отметить, что после распределения кодовых слов в интервалы согласно любой из этих схем, определенных ранее, либо сумма значений Mk может превысить максимальное количество доступных кодовых слов (2B), либо останутся неиспользованные кодовые слова. Если остаются неиспользованные кодовые слова, можно просто принять решение ничего не делать или распределить их в конкретные интервалы. С другой стороны, если алгоритм распределил больше кодовых слов, чем доступно, то можно изменить значения Mk, например посредством перенормировки значений CW. Альтернативно можно сгенерировать функцию прямого преобразования с использованием существующих значений Mk, но затем изменить выходное значение функции преобразования путем масштабирования на . Примеры методов распределения кодовых слов также описаны по ссылке [7].
На фиг. 4 представлен пример способа распределения кодовых слов в область преобразования согласно методу RDO, описанному ранее. На этапе 405 желаемый преобразованный динамический диапазон разделяют на N интервалов. После разделения входного изображения на непересекающиеся блоки (этап 410) для каждого блока:
На этапе 415 вычисляют его яркостные характеристики (например, среднее и дисперсию)
На этапе 420 распределяют каждый блок изображения в один из N интервалов
На этапе 425 вычисляют среднюю дисперсию яркости в каждом интервале
С учетом значений, вычисленных на этапе 425, на этапе 430 в каждый интервал распределяют ряд кодовых слов согласно одному или более порогам, например, с использованием любого из алгоритмов распределения кодовых слов, представленных в уравнениях с (4) по (8). Наконец, на этапе (435) окончательное распределение кодовых слов может быть использовано для генерирования функции прямого преобразования и/или функции обратного преобразования.
В одном варианте осуществления, в качестве примера и без ограничения, прямая LUT (FLUT) может быть построена с использованием следующего кода на языке C.
tot_cw = 2B;
hist_lens = tot_cw/N;
for (i = 0; i < N; i++)
{
double temp = (double) M[i] / (double)hist_lens; //M[i] соответствует Mk
for (j = 0; j < hist_lens; j++)
{
CW_bins_LUT_all[i*hist_lens + j] = temp;
}
}
Y_LUT_all[0] = CW_bins_LUT_all[0];
for (i = 1; i < tot_cw; i++)
{
Y_LUT_all[i] = Y_LUT_all [i - 1] + CW_bins_LUT_all[i];
}
for (i = 0; i < tot_cw; i++)
{
FLUT[i] = Clip3(0, tot_cw - 1, (Int)(Y_LUT_all[i] + 0.5));
}
В одном варианте осуществления LUT для обратного преобразования может быть построена следующим образом:
low = FLUT[0];
high = FLUT[tot_cw - 1];
first = 0;
last = tot_cw - 1;
for ( i = 1; i < tot_cw; i++)
if (FLUT[0] < FLUT[i])
{
first = i - 1;
break;
}
for (i = tot_cw - 2; i >= 0; i--)
if (FLUT[tot_cw - 1] > FLUT[i])
{
last = i + 1;
break;
}
for (i = 0; i < tot_cw; i++)
{
if (i <= low)
{
ILUT[i] = first;
}
else if (i >= high)
{
ILUT[i] = last;
}
else
{
for (j = 0; j < tot_cw - 1; j++)
if (FLUT[j] >= i)
{
ILUT[i] = j;
break;
}
}
}
Что касается синтаксиса, можно повторно использовать синтаксис, предложенный в предыдущих реализациях, например режим кусочных полиномов или параметрическую модель, представленные по ссылкам [5] и [6]. Таблица 2 показывает такой пример для N=32 для уравнения (4).
Таблица 2. Синтаксис преобразования с использованием первой параметрической модели
reshaping_model() {
Descriptor
reshaper_model_profile_type
ue(v)
reshaper_model_scale_idx
u(2)
reshaper_model_min_bin_idx
u(5)
reshaper_model_max_bin_idx
u(5)
for ( i = reshaper_model_min_bin_idx; i <= reshaper_model_max_bin_idx; i++ ) {
reshaper_model_bin_profile_delta [ i ]
u(1)
}
}
где,
reshaper_model_profile_type определяет тип профиля для использования в процессе создания преобразователя. Заданный профиль может предоставлять информацию о значениях, используемых по умолчанию, таких как количество интервалов, значений значимости или приоритета интервалов по умолчанию и распределения кодовых слов по умолчанию (например, значения Ma и/или Mf).
reshaper_model_scale_idx определяет значение индекса коэффициента масштабирования (обозначенного как ScaleFactor) для использования в процессе создания преобразователя. Значение ScaleFactor позволяет лучше контролировать функцию преобразования для повышения общей эффективности кодирования.
reshaper_model_min_bin_idx определяет минимальный индекс интервала для использования в процессе создания преобразователя. Значение reshaper_model_min_bin_idx должно быть в диапазоне от 0 до 31 включительно.
reshaper_model_max_bin_idx определяет максимальный индекс интервала для использования в процессе создания преобразователя. Значение reshaper_model_max_bin_idx должно быть в диапазоне от 0 до 31 включительно.
reshaper_model_bin_profile_delta [ i ] определяет дельта-значение для использования для регулирования профиля i-го интервала в процессе создания преобразователя. Значение reshaper_model_bin_profile_delta [ i ] должно быть в диапазоне от 0 до 1 включительно.
Таблица 3 представляет другой вариант осуществления с альтернативным более эффективным представлением синтаксиса.
Таблица 3. Синтаксис преобразования с использованием второй параметрической модели
где,
reshaper_model_delta_max_bin_idx устанавливают равным максимально разрешенному индексу интервала (например, 31) минус максимальный индекс интервала, который будет использоваться в процессе создания преобразователя.
reshaper_model_num_cw_minus1 плюс 1 определяет количество кодовых слов, о которых будут подаваться сигналы.
reshaper_model_delta_abs_CW [ i ] определяет i-е абсолютное дельта-значение кодового слова.
reshaper_model_delta_sign_CW [ i ] определяет знак для i-го дельта кодового слова.
Тогда:
reshaper_model_delta_CW [ i ] = (1-2* reshaper_model_delta_sign_CW [ i ]) * reshaper_model_delta_abs_CW [ i ];
reshaper_model_CW [ i ] = 32 + reshaper_model_delta_CW [ i ].
reshaper_model_bin_profile_delta [ i ] определяет дельта-значение для использования для регулирования профиля i-го интервала в процессе создания преобразователя. Значение reshaper_model_bin_profile_delta [ i ] должно быть в диапазоне от 0 до 1, когда reshaper_model_num_cw_minus1 равно 0. Значение reshaper_model_bin_profile_delta [ i ] должно быть в диапазоне от 0 до 2, когда reshaper_model_num_cw_minus1 равно 1.
CW=32, когда reshaper_model_bin_profile_delta [ i ] установлено равным 0, CW= reshaper_model_CW [ 0 ], когда reshaper_model_bin_profile_delta [ i ] установлено равным 1; CW= reshaper_model_CW [ 1 ], когда reshaper_model_bin_profile_delta [ i ] установлено равным 2. В одном варианте осуществления reshaper_model_num_cw_minus1 разрешено быть больше 1, позволяя передавать сигналы о reshaper_model_num_cw_minus1 и reshaper_model_bin_profile_delta[ i ] с ue(v) для более эффективного кодирования.
В другом варианте осуществления, как описано в таблице 4, количество кодовых слов на интервал может быть определено явно.
Таблица 4. Синтаксис преобразования с использованием третьей модели
slice_reshaper_model () {
Descriptor
reshaper_model_number_bins_minus1
ue(v)
reshaper_model_min_bin_idx
ue(v)
reshaper_model_delta_max_bin_idx
ue(v)
reshaper_model_bin_delta_abs_cw_prec_minus1
ue(v)
for ( i = reshaper_model_min_bin_idx; i <= reshaper_model_max_bin_idx; i++) {
reshaper_model_bin_delta_abs_CW [ i ]
u(v)
if( reshaper_model_bin_delta_abs_CW[ i ] ) > 0 )
reshaper_model_bin_delta_sign_CW_flag[ i ]
u(1)
}
}
reshaper_model_number_bins_minus1 плюс 1 определяет количество интервалов, используемых для компоненты яркости. В некоторых вариантах осуществления может быть более эффективно, чтобы количество интервалов было степенью двойки. Тогда общее количество интервалов может быть представлено его представлением через log2, например с использованием альтернативного параметра, такого как log2_reshaper_model_number_bins_minus1. Например, для 32 интервалов
log2_reshaper_model_number_bins_minus1 = 4.
reshaper_model_bin_delta_abs_cw_prec_minus1 плюс 1 определяет количество бит, используемое для представления синтаксической конструкции reshaper_model_bin_delta_abs_CW[ i ].
reshaper_model_bin_delta_abs_CW[ i ] определяет абсолютное дельта-значение кодового слова для i-го интервала.
reshaper_model_bin_delta_sign_CW_flag[ i ] определяет знак reshaper_model_bin_delta_abs_CW[ i ] следующим образом:
– Если reshaper_model_bin_delta_sign_CW_flag[ i ] равно 0, соответствующая переменная RspDeltaCW[ i ] имеет положительное значение.
– Иначе ( reshaper_model_bin_delta_sign_CW_flag[ i ] не равно 0 ), соответствующая переменная RspDeltaCW[ i ] имеет отрицательное значение.
Когда reshaper_model_bin_delta_sign_CW_flag[ i ] отсутствует, его полагают равным 0.
Переменная RspDeltaCW[ i ] = (1 - 2*reshaper_model_bin_delta_sign_CW[ i ]) *
reshaper_model_bin_delta_abs_CW [ i ];
Переменная OrgCW устанавливается равной (1 << BitDepthY ) / (reshaper_model_number_bins_minus1 + 1) ;
Переменную RspCW[ i ] выводят следующим образом:
если reshaper_model_min_bin_idx <= i <= reshaper_model_max_bin_idx
то RspCW[ i ] = OrgCW + RspDeltaCW[ i ],
иначе RspCW[ i ] = 0.
В одном варианте осуществления, подразумевая распределение кодовых слов согласно одному из предыдущих примеров, например уравнению (4), один пример того, как определять параметры, представленные в таблице 2, включает:
Сначала назначают «значимость интервала» следующим образом:
Для k-го интервала,
если Mk = 0;
bin_importance = 0;
иначе если Mk = = Mf
bin_importance = 2;         (9)
иначе
bin_importance = 1;
конец
Как используется в данном документе, термин «значимость интервала» обозначает значение, назначенное каждому из N интервалов кодовых слов, указывающее значимость всех кодовых слов в этом интервале в процессе преобразования относительно других интервалов.
В одном варианте осуществления можно установить default_bin_importance от reshaper_model_min_bin_idx до reshaper_model_max_bin_idx в 1. Значение reshaper_model_min_bin_idx устанавливают в наименьший индекс интервала, который имеет Mk, не равное 0. Значение reshaper_model_max_bin_idx устанавливают в наибольший индекс интервала, который имеет Mk, не равное 0. reshaper_model_bin_profile_delta для каждого интервала в [reshaper_model_min_bin_idx reshaper_model_max_bin_idx] представляет собой разность между bin_importance и default_bin_importance.
Один пример того, как использовать предложенную параметрическую модель для создания LUT для прямого преобразования (FLUT) и LUT для обратного преобразования (ILUT), представляется следующим образом.
Разделить диапазон яркости на N интервалов (например, N=32)
Получить индекс значимости интервала для каждого интервала из синтаксической конструкции. Например:
Для k-го интервала,
если reshaper_model_min_bin_idx <=k<=reshaper_model_max_bin_idx
bin_importance[k] = default_bin_importance[k] + reshaper_model_bin_profile_delta[k] ;
иначе
bin_importance[k] = 0;
Автоматически выполнить предварительное распределение кодовых слов на основании значимости интервалов:
для k-го интервала,
если bin_importance[k] == 0
Mk = 0;
иначе если bin_importance[k] == 2
Mk = Mf ;
иначе
Mk = Ma ;
конец
Построить LUT для прямого преобразования на основании распределения кодовых слов для каждого интервала посредством аккумулирования кодовых слов, распределенных в каждый интервал. Сумма должна быть меньшей или равной общему количеству кодовых слов (например, 1024 для 10-битного полного диапазона). (Например, см. самый ранний код на языке C).
Построить LUT для обратного преобразования (например, см. самый ранний код на языке C).
С точки зрения синтаксиса также могут быть применены и альтернативные способы. Главное состоит в том, чтобы определить количество кодовых слов в каждом интервале (например, Mk, для k = 0, 1, 2,…, N-1) явно или неявно. В одном варианте осуществления количество кодовых слов в каждом интервале можно определить явно. В другом варианте осуществления кодовые слова можно определять по-разному. Например, количество кодовых слов в интервале может быть определено с использованием разности количества кодовых слов в текущем интервале и предыдущем интервале (например, M_Delta(k) = M(k) – M(k-1)). В другом варианте осуществления можно определить наиболее часто используемое количество кодовых слов (к примеру, MM) и выразить количество кодовых слов в каждом интервале как разность количества кодовых слов в каждом интервале из этого количества (например, M_Delta(k) = M(k)- MM).
В одном варианте осуществления поддерживаются два способа преобразования. Один обозначают как «преобразователь по умолчанию», где Mf распределяют во все интервалы. Второй, обозначаемый как «адаптивный преобразователь», применяет адаптивный преобразователь, описанный ранее. Сигналы об этих двух методах могут быть переданы на декодер как описано по ссылке [6] с использованием специального флага, например, sps_reshaper_adaptive_flag (например, использовать sps_reshaper_adaptive_flag = 0 для преобразователя по умолчанию и использовать sps_reshaper_adaptive_flag = 1 для адаптивного преобразователя).
Настоящее изобретение применимо к любой архитектуре преобразования, предложенной по ссылке [6], такой как: внешний преобразователь, внутриконтурный исключительно внутренний преобразователь, внутриконтурный преобразователь для разности или внутриконтурный гибридный преобразователь. В качестве примера на фиг. 2A и 2B представлены примеры архитектур для гибридного внутриконтурного преобразования согласно вариантам осуществления настоящего изобретения. На фиг. 2A архитектура сочетает элементы как архитектуры внутриконтурного исключительно внутреннего преобразования (верхняя часть фигуры), так и архитектуры для внутриконтурной разности (нижняя часть фигуры). Согласно этой архитектуре для внутренних слайсов преобразование применяют к пикселям псевдокадров, тогда как для внешних слайсов преобразование применяют к разностям предсказания. В кодере (200_E) два новых блока добавляют к традиционному основанному на блоках кодеру (например, HEVC): блок (205) для оценки функции прямого преобразования (например, согласно фиг. 4), блок (210-1) прямого преобразования псевдокадра и блок (210-2) прямого разностного преобразования, который применяет прямое преобразование к одному или более из цветовых компонент входного видео (117) или разностей предсказания. В некоторых вариантах осуществления эти две операции могут быть выполнены как часть одного блока преобразования изображения. Параметры (207), относящиеся к определению функции обратного преобразования в декодере, могут быть переданы на блок кодирования без потерь кодера видео (например, CABAC 220) так, что они могут быть внедрены в кодированный битовый поток (122). Во внутреннем режиме внутреннее предсказание (225-1), трансформация и квантование (T&Q) и обратная трансформация и обратное квантование (Q-1 &T-1) все используют преобразованные псевдокадры. В обоих режимах сохраненные псевдокадры в DPB (215) всегда находятся в режиме обратного преобразования, что требует блока (например, 265-1) обратного преобразования псевдокадра или блока (например, 265-2) обратного разностного преобразования перед контурным фильтром (270-1, 270-2). Как показано на фиг. 2A, переключатель внутренних/внешних слайсов позволяет выполнять переключение между двумя архитектурами в зависимости от типа слайса, который необходимо кодировать. В другом варианте осуществления внутриконтурное фильтрование для внутренних слайсов может выполняться перед обратным преобразованием.
В декодере (200_D) следующие новые нормативные блоки добавляют к традиционному основанному на блоках декодеру: блок (250) (декодирование преобразователя) для восстановления функции прямого преобразования и функции обратного преобразования на основании кодированных параметров (207) функции преобразования, блок (265-1) для применения функции обратного преобразования к декодированным данным и блок (265-2) для применения как функции прямого преобразования, так и функции обратного преобразования для генерирования декодированного видеосигнала (162). Например, в (265-2)
восстановленное значение получают посредством Rec = ILUT(FLUT(Pred)+Res), где FLUT обозначает LUT прямого преобразования, а ILUT обозначает LUT обратного преобразования.
В некоторых вариантах осуществления операции, связанные с блоками 250 и 265, могут быть объединены в единый блок обработки. Как показано на фиг. 2B, переключатель внутренних/внешних слайсов позволяет выполнять переключение между двумя режимами в зависимости от типов слайсов в закодированных видеоснимках.
На фиг. 3A представлен пример способа (300_E) кодирования видео с использованием архитектуры (например, 200_E) преобразования согласно одному варианту осуществления настоящего изобретения. Если преобразование не поддерживается (ветвь 305), то кодирование (335) проходит так, как известно в кодерах уровня техники (например, HEVC). Если преобразование поддерживается (ветвь 310), то кодер может иметь варианты, состоящие в том, чтобы или применить заданную (по умолчанию) функцию (315) преобразования, или адаптивно определить новую функцию (325) преобразования на основании анализа (320) псевдокадра (например, как описано на фиг. 4). После кодирования псевдокадра с использованием архитектуры (330) преобразования остальная часть кодирования проходит по тем же этапам, что и традиционная последовательность (335) кодирования. Если применяется адаптивное преобразование (312), генерирование метаданных, относящихся к функции преобразования, выполняют как часть этапа (327) «Кодирование преобразователя».
На фиг. 3B представлен пример способа (300_D) декодирования видео с использованием архитектуры (например, 200_D) преобразования согласно одному варианту осуществления настоящего изобретения. Если преобразование не поддерживается (ветвь 340), то после декодирования (350) псевдокадра выходные кадры генерируют (390) как в традиционной последовательности декодирования. Если преобразование поддерживается (ветвь 360), то декодер определяет, следует ли применять заданную (по умолчанию) функцию (375) преобразования или адаптивно определять функцию (380) преобразования на основании принятых параметров (например, 207). После декодирования с использованием архитектуры (385) преобразования остальная часть декодирования проходит по традиционной последовательности декодирования.
Как описано по ссылке [6] и ранее в этом техническом описании, LUT прямого преобразования, FwdLUT, может быть построена посредством интегрирования, тогда как LUT обратного преобразования может быть построена на основании обратного отображения с использованием LUT прямого преобразования (FwdLUT). В одном варианте осуществления прямая LUT может быть построена с использованием кусочно-линейной интерполяции. В декодере обратное преобразование может быть выполнено с использованием непосредственно обратной LUT или снова посредством линейной интерполяции. Кусочно-линейную LUT строят на основании входных опорных точек и выходных опорных точек.
Пусть (X1, Y1), (X2, Y2) представляют собой две входные опорные точки и их соответствующие выходные значения для каждого интервала. Любое входное значение X между X1 и X2 можно интерполировать следующим уравнением:
Y = ((Y2-Y1)/(X2-X1)) * (X-X1) + Y1.
В реализации с фиксированной запятой вышеуказанное уравнение можно переписать как
Y = ((m * X + 2FP_PREC-1) >> FP_PREC) + c
где m и c обозначают скаляр и смещение для линейной интерполяции, а FP_PREC представляет собой константу, связанную с точностью фиксированной запятой.
К примеру, FwdLUT может быть построена следующим образом: Пусть переменная
lutSize = ( 1 << BitDepthY ).
Пусть переменные
binNum = reshaper_model_number_bins_minus1 + 1,
и
binLen = lutSize / binNum.
Для i-го интервала его две крайние опорные точки (например, X1 и X2) могут быть получены как X1= i*binLen и X2 = (i+1)*binLen. Тогда:
binsLUT[ 0 ] = 0;
for( i = 0; i < reshaper_model_number_bins_minus1 + 1; i++) {
binsLUT[ (i + 1) * binLen] = binsLUT[i*binLen] + RspCW[ i ];
Y1 = binsLUT[i*binLen];
Y2 = binsLUT[(i + 1)*binLen];
scale = ((Y2 - Y1) * (1 << FP_PREC) + (1 << (log2(binLen)- 1))) >> (log2(binLen));
for (j = 1; j < binLen; j++) {
binsLUT[i*binLen + j] = Y1 + ((scale * j + (1 << (FP_PREC - 1))) >> FP_PREC);
}
}
FP_PREC определяет точность фиксированной запятой дробной части переменных (например, FP_PREC = 14). В одном варианте осуществления binsLUT[] можно вычислить с большей точностью, чем точность FwdLUT. Например, значения binsLUT[] могут быть вычислены как 32-битные целые числа, но FwdLUT может содержать значения binsLUT, усеченные на 16 битах.
Адаптивное получение порогов
Как описано ранее, во время преобразования распределение кодовых слов может регулироваться с использованием одного или более порогов (например, TH, THU, THL и т.д.). В одном варианте осуществления такие пороги могут генерироваться адаптивно на основании характеристик содержимого. На фиг. 5 показан пример способа получения таких порогов согласно одному варианту осуществления.
На этапе 505 диапазон яркости входного изображения разделяют на N интервалов (например, N=32). Например, пусть N также обозначается как PIC_ANALYZE_CW_BINS.
На этапе 510 выполняют анализ изображения для вычисления яркостных характеристик для каждого интервала. Например, можно вычислить процентную долю пикселей в каждом интервале (обозначаемую как BinHist[b], b = 1, 2,…, N), где
BinHist[b] = 100* (общее количество пикселей в интервале b) / (общее количество пикселей в псевдокадре),       (10)
Как обсуждалось выше, другим хорошим показателем характеристик изображения является средняя дисперсия (или стандартное отклонение) пикселей в каждом интервале, обозначаемая BinVar[b]. BinVar[b] может быть вычислено в «блочном режиме» как  на этапах, описанных в части, относящейся к уравнениям (2) и (3). Альтернативно основанное на блоках вычисление может быть уточнено с помощью вычислений на основе пикселей. Например, обозначим как vf(i) дисперсию, связанную с группой пикселей, окружающих i-ый пиксель в соседнем окне m x m (например, m = 5), причем i-ый пиксель находится в его центре). Например, если
,        (11)
обозначает среднее значение пикселей в окне  (например, m = 5), окружающем i-ый пиксель со значением x(i), то
.       (12)
Необязательное нелинейное отображение, такое как vf(i) = log10(vf(i)+1), может быть использовано для подавления динамического диапазона исходных значений дисперсии. Тогда коэффициент дисперсии может быть использован для вычисления средней дисперсии в каждом интервале как
BinVar[b] = ,        (13)
где  обозначает количество пикселей в интервале b.
На этапе 515 средние дисперсии интервалов (и их соответствующие индексы) сортируют, например и без ограничения, в убывающем порядке. Например, отсортированные значения BinVar могут быть сохранены в BinVarSortDsd[b] и отсортированные индексы интервалов могут быть сохранены в BinIdxSortDsd[b]. В качестве примера, с использованием кода на языке C способ может быть описан как:
for (int b = 0; b < PIC_ANALYZE_CW_BINS; b++
// инициализация (несортированные)
{
BinVarSortDsd[b] = BinVar[b];
BinIdxSortDsd[b] = b;
}
//сортировка (см. пример кода в Приложении 1)
bubbleSortDsd(BinVarSortDsd, BinIdxSortDsd, PIC_ANALYZE_CW_BINS);
Пример графика отсортированных коэффициентов средней дисперсии интервалов представлен на фиг. 6A.
С учетом значений в интервальной гистограмме, вычисленных на этапе 510, на этапе 520 вычисляют и сохраняют функцию кумулятивной плотности распределения (CDF) согласно порядку отсортированных средних дисперсий интервалов. Например, если CDF сохраняют в массиве BinVarSortDsdCDF[b], в одном варианте осуществления:
BinVarSortDsdCDF[0] = BinHist[BinIdxSortDsd[0]];
for (int b = 1; b < PIC_ANALYZE_CW_BINS; b++)
{
BinVarSortDsdCDF[b] = BinVarSortDsdCDF[b - 1] + BinHist[BinIdxSortDsd[b]];
}
Пример графика (605) вычисленной CDF, основанной на данных по фиг. 6A, представлен на фиг. 6B. Пары зависимости значений CDF от отсортированных средних дисперсий интервалов: {x = BinVarSortDsd[b], y = BinVarSortDsdCDF[b]} можно интерпретировать как: «имеется y% пикселей на псевдокадре, имеющих дисперсию, большую или равную x» или «имеется (100-y)% пикселей на псевдокадре, имеющих дисперсию, меньшую x».
Наконец, на этапе 525 при заданной CDF BinVarSortDsdCDF[BinVarSortDsd[b]] как функции отсортированных значений средних дисперсий интервалов можно определить пороги на основании дисперсий интервалов и кумулятивных процентных долей.
Примеры определения одного порога или двух порогов показаны на фиг. 6C и 6D соответственно. Когда используется только один порог (например, TH), в качестве примера, TH может быть определен как «средняя дисперсия, при которой k % пикселей имеют TH». Тогда TH можно вычислить путем нахождения пересечения графика (605) CDF с линией k % (например, 610) (например, значение BinVarSortDsd[b] , где BinVarSortDsdCDF = k % ); например, как представлено на фиг. 6C, для k = 50, TH = 2,5. Тогда можно распределить Mf кодовых слов для интервалов, имеющих BinVar[b] < TH, и Ma кодовых слов для интервалов, имеющих BinVar[b] TH. На практике предпочтительно распределять большее количество кодовых слов в интервалы с меньшей дисперсией (например, Mf > 32 > Ma для 10-битного видеосигнала с 32 интервалами).
При использовании двух порогов пример выбора THL и THU представлен на фиг. 6D. Например, без потери общности, THL может быть определен как дисперсия, при которой 80% пикселей имеют  (тогда в нашем примере THL = 2,3), и THU может быть определен как дисперсия, при которой 10% всех пикселей имеют  (тогда в нашем примере THU = 3,5). С учетом этих порогов можно распределить Mf кодовых слов для интервалов, имеющих BinVar[b] < THL, и Ma кодовых слов для интервалов, имеющих BinVar[b] THU. Для интервалов, имеющих BinVar между THL и THU, можно использовать исходные количества кодовых слов в каждом интервале (например, 32 для B=10).
Вышеописанные методы можно легко расширить на случаи с более чем двумя порогами. Эту связь также можно использовать для регулирования количества кодовых слов (Mf, Ma и т.д.). На практике в интервалы с низкой дисперсией следует распределять больше кодовых слов, чтобы повышать PSNR (и уменьшать MSE); в интервалы с высокой дисперсией следует распределять меньше кодовых слов для экономии битов.
В одном варианте осуществления, если набор параметров (например, THL, THU, Ma, Mf и т.д.) был получен вручную для особого содержимого, например, посредством обстоятельной ручной настройки параметров, этот автоматический метод может быть применен для того, чтобы построить дерево решений для разбиения каждого содержимого на категории с целью автоматической установки оптимальных параметров, полученных вручную. Например, категории содержимого включают: фильм, телевидение, SDR, HDR, мультфильмы, фильмы о природе, боевики и т.п.
Чтобы уменьшить сложность, внутриконтурное преобразование может быть ограничено с использованием разнообразных схем. Если внутриконтурное преобразование принято в стандарте кодирования видео, то эти ограничения должны быть нормативными, чтобы гарантировать упрощения декодера. Например, в одном варианте осуществления преобразование яркости может быть отключено для определенных размеров кодирования блока. Например, можно отключить внутренний и внешний режим преобразователя во внешнем слайсе, когда nTbW * nTbH < TH, где переменная nTbW определяет ширину блока трансформации и переменная nTbH определяет высоту блока трансформации. Например, для TH=64 блоки с размерами 4x4, 4x8 и 8x4 не подвергаются преобразованию ни во внутреннем, ни во внешнем режиме в слайсах (или тайлах) с внешним кодированием.
Аналогично, в другом варианте осуществления можно отключить основанное на яркости разностное масштабирование цветности во внутреннем режиме в слайсах (или тайлах) с внешним кодированием или когда позволяется наличие отдельных деревьев разбиения яркости и цветности.
Взаимодействие с другими инструментами кодирования
Контурное фильтрование
По ссылке [6] было описано, что контурный фильтр может работать или в исходной пиксельной области, или в преобразованной пиксельной области. В одном варианте осуществления предлагается, чтобы контурное фильтрование выполнялось в исходной пиксельной области (после преобразования псевдокадра). Например, в архитектуре (200_E и 200_D) гибридного внутриконтурного преобразования для внутреннего псевдокадра потребуется применить обратное преобразование (265-1) перед контурным фильтром (270-1).
На фиг. 2C и фиг. 2D представлены альтернативные архитектуры (200B_D и 200C_D) декодера, где обратное преобразование (265) выполняют после контурного фильтрования (270) непосредственно перед сохранением декодированных данных в буфер (260) декодированных псевдокадров (DPB). В предложенных вариантах осуществления по сравнению с архитектурой в 200_D формула обратного разностного преобразования для внешних слайсов изменена, и обратное преобразование (например, посредством функции или справочной таблицы InvLUT()) выполняют после контурного фильтрования (270). Таким образом, обратное преобразование выполняют и для внутренних слайсов, и для внешних слайсов после контурного фильтрования, и восстановленные пиксели перед контурным фильтрованием и для CU с внутренним кодированием, и для CU с внешним кодированием находятся в преобразованной области. После обратного преобразования (265) все выходные выборки, которые сохранены в опорном DPB, находятся в исходной области. Такая архитектура позволяет для внутриконтурного преобразования как основанную на слайсах адаптацию, так и основанную на CTU адаптацию.
Как показано на фиг. 2C и фиг. 2D, в одном варианте осуществления контурное фильтрование (270) выполняют в преобразованной области для CU как с внутренним кодированием, так и с внешним кодированием, и обратное преобразование (265) псевдокадра происходит только один раз, таким образом обеспечивая унифицированную и более простую архитектуру для CU как с внутренним, так и с внешним кодированием.
Для декодирования CU с внутренним кодированием (200B_D) внутреннее предсказание (225) выполняют на преобразованных соседних пикселях. При заданных разности Res и предсказанной выборке PredSample восстановленную выборку (227) получают как:
RecSample = Res + PredSample.       (14)
При заданных восстановленных выборках (227) контурное фильтрование (270) и обратное преобразование (265) псевдокадра применяют для получения выборок RecSampleInDPB для сохранения в DPB (260), где
RecSampleInDPB = InvLUT(LPF(RecSample))) == InvLUT(LPF(Res + PredSample))),      (15)
где InvLUT() обозначает функцию обратного преобразования или справочную таблицу обратного преобразования, а LPF() обозначает операции контурного фильтрования.
При традиционном кодировании определение внешнего/внутреннего режима основано на вычислении функции искажения (dfunc()) между исходными выборками и предсказанными выборками. Примеры таких функций включают сумму квадратичных ошибок (SSE), сумму абсолютных разностей (SAD) и другие. При использовании преобразования на стороне кодера (не показано) предсказание CU и определение режима выполняют на преобразованной области. То есть, для определения режима
distortion = dfunc(FwdLUT(SrcSample)-RecSample),    (16)
где FwdLUT() обозначает функцию (или LUT) прямого преобразования и SrcSample обозначает исходные выборки изображений.
Для CU с внешним кодированием на стороне декодера (например, 200C_D) внешнее предсказание выполняют с использованием опорных псевдокадров в непреобразованной области в DPB. Затем в блоке 275 восстановления восстановленные пиксели (267) получают следующим образом:
RecSample = (Res + FwdLUT(PredSample)).     (17)
При заданных восстановленных выборках (267) контурное фильтрование (270) и обратное преобразование (265) псевдокадра применяют для получения выборок RecSampleInDPB для сохранения в DPB, где
RecSampleInDPB = InvLUT(LPF(RecSample))) = InvLUT(LPF( Res + FwdLUT(PredSample)))).         (18)
На стороне кодера (не показано) внутреннее предсказание выполняют в преобразованной области как
Res = FwdLUT(SrcSample) – PredSample,      (19a)
в предположении, что все соседние выборки (PredSample), используемые для предсказания, уже находятся в преобразованной области. Внешнее предсказание (например, с использованием компенсации движения) выполняют в непреобразованной области (т.е. с использованием опорных псевдокадров непосредственно из DPB), т.е.
PredSample = MC(RecSampleinDPB),      (19b)
где MC() обозначает функцию компенсации движения. Для оценки движения и определения быстрого режима, где разность не генерируют, искажение можно вычислить с использованием
distortion = dfunc(SrcSample-PredSample).
Однако для определения полного режима, где разность генерируют, определение режима выполняют в преобразованной области. То есть, для определения полного режима
distortion = dfunc(FwdLUT(SrcSample)-RecSample).    (20)
Адаптация уровня блока
Как объяснено ранее, предложенный внутриконтурный преобразователь позволяет адаптировать преобразование на уровне CU, например, устанавливать переменную CU_reshaper в состояние «включено» (on) или «выключено» (off) по необходимости. В одной и той же архитектуре для CU с внешним кодированием, когда CU_reshaper = off, восстановленные пиксели должны быть в преобразованной области, даже если флаг CU_reshaper выставлен в «выключено» для этого CU с внешним кодированием.
RecSample = FwdLUT(Res + PredSample),      (21)
так что внутреннее предсказание всегда имеет соседние пиксели в преобразованной области. Пиксели DPB можно получить как:
RecSampleInDPB = InvLUT(LPF(RecSample))) = =InvLUT(LPF(FwdLUT(Res+PredSample))).    (22)
Для CU с внутренним кодированием в зависимости от способа кодирования предлагаются два альтернативных метода:
1) Все CU с внутренним кодированием кодируют с CU_reshaper = on. В этом случае никакая дополнительная обработка не требуется, поскольку все пиксели уже находятся в преобразованной области.
2) Некоторые CU с внутренним кодированием могут быть закодированы с использованием CU_reshaper = off. В этом случае для CU_reshaper = off при применении внутреннего предсказания необходимо применять обратное преобразование к соседним пикселям, так что внутреннее предсказание выполняется в исходной области и конечные восстановленные пиксели должны находиться в преобразованной области, т.е.
RecSample = FwdLUT(Res + InvLUT(PredSample)),    (23)
тогда
RecSampleInDPB = InvLUT(LPF(RecSample))) ==InvLUT(LPF(FwdLUT(Res + InvLUT(PredSample))))).   (24)
В целом, предложенные архитектуры могут быть использованы в различных комбинациях, таких как внутриконтурное исключительно внутреннее преобразование, внутриконтурное преобразование только для разностей предсказания или гибридная архитектура, которая сочетает как внутреннее, внутриконтурное, преобразование, так и внешнее разностное преобразование. Например, для сокращения задержки в аппаратной последовательности декодирования для декодирования внешних слайсов можно выполнять внутреннее предсказание (то есть декодировать внутренние CU во внешнем слайсе) перед обратным преобразованием. Пример архитектуры (200D_D) такого варианта осуществления представлен на фиг. 2E. В модуле (285) восстановления для внешних CU (например, Mux обеспечивает выходной сигнал из 280 и 282), из уравнения (17)
RecSample = (Res + FwdLUT(PredSample)),
где FwdLUT(PredSample) обозначает выходной сигнал устройства (280) внешнего предсказания, после которого идет прямое преобразование (282). Иначе для внутренних CU (например, Mux обеспечивает выходной сигнал из 284) выходной сигнал модуля (285) восстановления представляет собой
RecSample = (Res + IPredSample),
где IPredSample обозначает выходной сигнал блока (284) внутреннего предсказания. Блок (265-3) обратного преобразования генерирует
= InvLUT[RecSample].
Применение внутреннего предсказания для внешних слайсов в преобразованной области применимо также и к другим вариантам осуществления, включая описанные на фиг. 2C (где обратное преобразование выполняют после контурного фильтрования) и фиг. 2D. Во всех таких вариантах осуществления особую осторожность необходимо проявлять в режиме объединенного внешнего/внутреннего предсказания (то есть, когда во время восстановления некоторые выборки происходят из блоков с внешним кодированием, а некоторые – из блоков с внутренним кодированием), поскольку внешнее предсказание происходит в исходной области, а внутреннее предсказание происходит в преобразованной области. При объединении данных из кодированных элементов как с внешним, так и с внутренним предсказанием предсказание может быть выполнено в любой из двух областей. Например, когда режим объединенного внешнего/внутреннего предсказания выполняют в преобразованной области, тогда
PredSampleCombined = PredSampeIntra + FwdLUT(PredSampleInter)
RecSample = Res + PredSampleCombined,
то есть выборки с внешним кодированием в исходной области преобразуют перед добавлением. Иначе, когда режим объединенного внешнего/внутреннего предсказания выполняют в исходной области, тогда:
PredSampleCombined = InvLUT(PredSampeIntra) + PredSampleInter
RecSample = Res + FwdLUT(PredSampleCombined),
то есть выборки с внутренним предсказанием подвергают обратному преобразованию, чтобы они были в исходной области.
Подобные рассуждения применимы также и к соответствующим вариантам осуществления кодирования, поскольку кодеры (например, 200_E) включают контур декодера, который соответствует соответствующему декодеру. Как обсуждалось ранее, уравнение (20) описывает вариант осуществления, в котором определение режима выполняют в преобразованной области. В другом варианте осуществления определение режима может быть выполнено в исходной области, то есть:
distortion = dfunc(SrcSample-InvLUT(RecSample)).
Для основанных на яркости смещения QP цветности или разностного масштабирования цветности среднее значение ( ) яркости CU всегда может быть рассчитано с использованием предсказанного значения (вместо восстановленного значения) для обеспечения минимальной задержки.
Получение QP цветности
Как указано по ссылке [6], можно применять тот же предложенный способ получения chromaDQP для уравновешивания связи яркости и цветности, создаваемой кривой преобразования. В одном варианте осуществления можно получить кусочное значение chromaDQP на основании распределения кодовых слов для каждого интервала. Например:
для k-го интервала
scalek = (Mk/Ma) ;        (25)
chromaDQP = 6*log2(scalek) ;
конец
Оптимизация кодера
Как описано по ссылке [6], рекомендуется использовать основанное на пикселях взвешенное искажение, когда поддерживается lumaDQP. Когда используется преобразование, в одном примере необходимый вес регулируют на основании функции (f(x)) преобразования. Например:
Wrsp = ,      (26)
где  обозначает наклон функции f(x) преобразования.
В другом варианте осуществления можно получить кусочные значения веса непосредственно на основе распределения кодовых слов для каждого интервала. Например:
для k-го интервала
.      (27)
Для компоненты цветности вес может быть установлен в 1 или некоторый коэффициент sf масштабирования. Для уменьшения искажения цветности sf может быть установлено большим 1. Для увеличения искажения цветности sf может быть установлено большим 1. В одном варианте осуществления sf может быть использован для компенсации уравнения (25). Поскольку chromaDQP может быть установлен только в целое число, можно использовать sf для приспособления дробной части chromaDQP: таким образом,
sf =  .
В другом варианте осуществления можно явно установить значение chromaQPOffset в наборе параметров псевдокадра (Picture Parameter Set, PPS) или заголовке слайса, чтобы управлять искажением цветности.
Кривая преобразователя или функция отображения не обязаны быть фиксированными для всей видеопоследовательности. Например, ее можно адаптировать на основании параметра квантования (QP) или целевой битовой скорости. В одном варианте осуществления можно использовать более агрессивную кривую преобразователя, когда битовая скорость является низкой, и использовать менее агрессивное преобразование, когда битовая скорость является относительно высокой. Например, при заданных 32 интервалах в 10-битных последовательностях каждый интервал сначала имеет 32 кодовых слова. Когда битовая скорость является относительно низкой, можно использовать кодовые слова в диапазоне [28 40] для выбора кодовых слов для каждого интервала. Когда битовая скорость является высокой, можно выбирать кодовые слова в диапазоне [31 33] для каждого интервала или можно просто использовать тождественную кривую преобразователя.
При заданном слайсе (или тайле) преобразование на уровне слайса (тайла) может быть выполнено различными способами, которые могут находить компромисс между эффективностью и сложностью кодирования, включая: 1) отключение преобразования только во внутренних слайсах; 2) отключение преобразования в особых внешних слайсах, таких как внешние слайсы на конкретном временном уровне (уровнях), или во внешних слайсах, которые не используются для опорных псевдокадров, или во внешних слайсах, которые считаются менее важными опорными псевдокадрами. Такое приспособление слайсов также может быть зависимым от QP/скорости, так что разные правила приспособления могут применяться для разных QP или битовых скоростей.
В кодере согласно предложенному алгоритму дисперсию вычисляют для каждого интервала (например, BinVar(b) в уравнении (13)). На основании этой информации можно распределять кодовые слова на основе дисперсии каждого интервала. В одном варианте осуществления BinVar(b) может обратно-линейно отображаться в количество кодовых слов в каждом интервале b. В другом варианте осуществления нелинейные отображения, такие как (BinVar(b))2, sqrt(BinVar(b)) и т.д., могут использоваться для обратного отображения количества кодовых слов в интервале b. По существу, этот подход позволяет кодеру применять произвольные кодовые слова к каждому интервалу, выходя за более простое отображение, использованное ранее, где кодер распределял кодовые слова в каждом интервале с использованием двух верхних значений диапазона Mf и Ma (например, см. фиг. 6C) или трех верхних значений диапазона Mf, 32 или Ma, (например, см. фиг. 6D).
В качестве примера на фиг. 6E показаны две схемы распределения кодовых слов на основании значений BinVar(b), при этом график 610 показывает распределение кодовых слов с использованием двух порогов, тогда как график 620 показывает распределение кодовых слов с использованием обратного линейного отображения, где распределение кодовых слов для интервала обратно пропорционально его значению BinVar(b). Например, в одном варианте осуществления следующий код может быть применен для получения количества кодовых слов (bin_cw) в конкретном интервале:
alpha = (minCW - maxCW) / (maxVar - minVar);
beta = (maxCW*maxVar - minCW*minVar) / (maxVar - minVar);
bin_cw = round(alpha * bin_var + beta);,
где minVar обозначает минимальную дисперсию на всех интервалах, maxVar обозначает максимальную дисперсию на всех интервалах и minCW, maxCW обозначают минимальное и максимальное количество кодовых слов на интервал, как определено моделью преобразования.
Уточнение основанного на яркости смещения QP цветности
Согласно [6], для компенсации взаимодействия между яркостью и цветностью были определены дополнительное смещение QP цветности (обозначенное как chromaDQP или cQPO) и основанный на яркости разностный преобразователь масштаба (cScale) цветности. Например:
chromaQP = QP_luma + chromaQPOffset + ,    (28)
где chromaQPOffset обозначает смещение QP цветности и QP_luma обозначает QP яркости для элемента кодирования. Как представлено по ссылке [6], в одном варианте осуществления
=  dQP(,    (29)
где  обозначает наклон (производную первого порядка) (). Для внешнего слайса  обозначает среднее предсказанное значение яркости CU. Для внутреннего слайса  обозначает подвергнутое обратному преобразованию значение среднего предсказанного значения яркости CU. Когда для CU используют кодирование по двум деревьям (то есть компоненты яркости и цветности имеют два отдельных дерева кодирования, и поэтому восстановление яркости доступно до начала кодирования цветности), среднее восстановленное значение яркости CU может быть использовано для получения значения cQPO. Коэффициент масштабирования cScale был определен как
cScale =  = pow(2, -cQPO/6),    (30)
где y = pow(2, x) обозначает функцию .
С учетом нелинейной связи между полученными из яркости значениями QP (обозначены как qPi) и конечными значениями QP цветности (обозначены как QpC) (например, см. таблицу 8–10 «Спецификация QpC как функции qPi для ChromaArrayType, равного 1» по ссылке [4]) в одном варианте осуществления  и cScale может быть дополнительно отрегулирован следующим образом.
Обозначим как f_QPi2QPc() отображение между отрегулированными значениями QP яркости и цветности, например как в Таблице 8–10 по ссылке [4], тогда
chromaQP_actual = f_QPi2QPc[chromaQP] ==f_QPi2QPc[QP_luma + chromaQPOffset + cQPO] .    (31)
Для масштабирования разности цветности масштаб необходимо вычислить на основании реальной разницы между фактическими QP кодирования цветности как перед применением cQPO, так и после применения cQPO:
QPcBase = f_QPi2QPc[QP_luma + chromaQPOffset];
QPcFinal = f_QPi2QPc[QP_luma + chromaQPOffset + cQPO];    (32)
cQPO_refine = QPcFinal – QpcBase;
cScale = pow(2, - cQPO_refine/6).
В другом варианте осуществления можно включать chromaQPOffset в cScale тоже. Например,
QPcBase = f_QPi2QPc[QP_luma];
QPcFinal = f_QPi2QPc[QP_luma + chromaQPOffset + cQPO];    (33)
cTotalQPO_refine = QPcFinal – QpcBase;
cScale = pow(2, - cTotalQPO_refine/6).
В качестве примера, как описано по ссылке [6], в одном варианте осуществления:
Пусть CSCALE_FP_PREC = 16 обозначает параметр точности
Прямое масштабирование: после генерирования разности цветности, перед преобразованием и квантованием:
C_Res = C_orig – C_pred
C_Res_scaled = C_Res * cScale + (1 << (CSCALE_FP_PREC - 1))) >> CSCALE_FP_PREC
Обратное масштабирование: после обратного квантования и обратного преобразования цветности, но перед восстановлением:
C_Res_inv = (C_Res_scaled << CSCALE_FP_PREC) / cScale
C_Reco = C_Pred + C_Res_inv;
В альтернативном варианте осуществления операции для внутриконтурного преобразования цветности могут быть выражены следующим образом. На стороне кодера для разности (CxRes = CxOrg - CxPred) компоненты Cx цветности (например, Cb или Cr) каждого CU или TU,
,      (34)
где CxResScaled представляет собой масштабированный разностный сигнал Cb или Cr для CU, предназначенного для преобразования и квантования. На стороне декодера CxResScaled представляет собой масштабированный разностный сигнал цветности после обратных квантования и преобразования и
.      (35)
Окончательное восстановление компоненты цветности представляет собой
CxRec = CxPred + CxRes.        (36)
Этот подход позволяет декодеру начинать операции обратных квантования и преобразования для декодирования цветности сразу же после синтаксического разбора. Значение cScale, используемое для CU, может быть совместно используемым компонентами Cb и Cr, и из уравнений (29) и (30) оно может быть получено как:
(37)
,
где  представляет собой среднее предсказанное значение яркости текущего CU во внешних слайсах (где кодирование по двум деревьям не используют и поэтому восстановленная яркость недоступна), и  представляет собой среднее восстановленное значение яркости текущего CU во внутренних слайсах (где используется кодирование по двум деревьям). В одном варианте осуществления масштабы вычисляют и сохраняют с помощью 16-битных целых чисел с фиксированной запятой и операции масштабирования на стороне как кодера, так и декодера реализуют с помощью арифметики целых чисел с фиксированной запятой.  обозначает первую производную функции прямого преобразования. Принимая кусочно-линейное представление кривой, получаем FwdLUT’(Y) = (CW[k]/32), когда Y принадлежит k-му интервалу. Для сокращения аппаратной задержки в другом варианте осуществления (см. фиг. 2E)  может использовать среднее предсказанное значение яркости текущего CU как для внутреннего, так и для внешнего режимов независимо от типа слайса и того, применяются или нет два дерева. В другом варианте осуществления  может быть получено с использованием восстановленных CU (например, как находящиеся в верхней строке и/или левом столбце текущего CU) для внутреннего и/или внешнего режима. В другом варианте осуществления основанное на области среднее, медианное и т. п. значение яркости или значение cScale может быть отправлено в битовом потоке явно с использованием синтаксиса высокого уровня.
Использование cScale не ограничено разностным масштабированием цветности для внутриконтурного преобразования. Тот же способ может быть применен также и для внеконтурного преобразования. Во внеконтурном преобразовании cScale может быть использован для масштабирования выборок цветности. Операции являются такими же, как и во внутриконтурном подходе.
На стороне кодера при вычислении RDOQ цветности лямбда-модификатор для регулирования цветности (или при использовании смещения QP, или при использовании разностного масштабирования цветности) также необходимо вычислить на основании уточненного смещения:
Modifier = pow(2, - cQPO_refine/3);
New_lambda = Old_lambda / Modifier.       (38)
Как указано в уравнении (35), использование cScale может потребовать деления в кодере. Для упрощения реализации декодера можно принять решение реализовать такую же функциональность с использованием деления в кодере и применить более простое умножение в декодере. Например, пусть
cScaleInv = (1/cScale)
тогда, в качестве примера, на кодере
cResScale = CxRes * cScale = CxRes / (1/cScale) = CxRes/cScaleInv,
и на декодере
CxRes = cResScale/cScale = CxRes * (1/cScale) = CxRes * cScaleInv.
В одном варианте осуществления каждый зависимый от яркости коэффициент масштабирования цветности может быть вычислен для соответствующего диапазона яркости в кусочно-линейном (piece-wise linear, PWL) представлении, а не для каждого значения кодового слова яркости. Таким образом, коэффициенты масштабирования цветности могут быть сохранены в меньшей LUT (например, с 16 или 32 записями), к примеру, cScaleInv[binIdx], вместо LUT с 1024 записями (для 10-битных кодовых слов яркости) (к примеру, cScale[Y]). Операции масштабирования на стороне как кодера, так и декодера могут быть реализованы с помощью арифметики целых чисел с фиксированной запятой следующим образом:
c’ = sign(c) * ((abs(c) * s + 2CSCALE_FP_PREC-1) >> CSCALE_FP_PREC),
где c представляет собой разность цветности, s представляет собой коэффициент масштабирования разности цветности из cScaleInv[binIdx], причем binIdx определяют по соответствующему среднему значению яркости, и CSCALE_FP_PREC представляет собой постоянное значение, связанное с точностью.
В одном варианте осуществления, хотя функция прямого преобразования может быть представлена с использованием N равных сегментов (например, N=8, 16, 32 и т.д.), обратное представление будет содержать нелинейные сегменты. С точки зрения реализации желательно получить представление функции обратного преобразования тоже с использованием равных сегментов; однако реализация такого представления может привести к потере эффективности кодирования. В качестве компромисса в одном варианте осуществления может существовать возможность создания функции обратного преобразования со «смешанным» PWL представлением с сочетанием равных и неравных сегментов. Например, при использовании 8 сегментов можно сначала разделить весь диапазон на два равных сегмента, а затем подразделить каждый из них на 4 неравных сегмента. Альтернативно можно разделить весь диапазон на 4 равных сегмента и затем подразделить каждый на два неравных сегмента. Альтернативно можно сначала разделить весь диапазон на несколько неравных сегментов, затем подразделить каждый неравный сегмент на несколько равных сегментов. Альтернативно можно сначала разделить весь диапазон на два равных сегмента, а затем подразделить каждый равный сегмент на равные подсегменты, где длина сегмента в каждой группе подсегментов не является одинаковой.
Например, без ограничения, из 1024 кодовых слов можно получить: a) 4 сегмента со 150 кодовыми словами в каждом и два сегмента с 212 кодовыми словами в каждом или b) 8 сегментов с 64 кодовыми словами в каждом и 4 сегмента со 128 кодовыми словами в каждом. Общее назначение такой комбинации сегментов состоит в сокращении количества сравнений, требующихся для идентификации PWL-кусочного индекса с данным кодовым значением, таким образом упрощая аппаратную и программную реализации.
В одном варианте осуществления для более эффективной реализации, связанной с разностным масштабированием цветности, могут быть возможны следующие варианты:
Отключение разностного масштабирования цветности при использовании отдельных деревьев яркости/цветности
Отключение разностного масштабирования цветности для цветности 2x2; и
Использование сигнала предсказания, а не сигнала восстановления, для элементов как с внутренним, так и с внешним кодированием
В качестве примера, когда задано, что декодер, представленный на фиг. 2E, (200D_D) будет обрабатывать компоненту яркости, на фиг. 2F представлен пример архитектуры (200D_DC) для обработки соответствующих выборок цветности.
Как показано на фиг. 2F, в сравнении с фиг. 2E, при обработке цветности внесены следующие изменения:
Блоки (282 и 265-3) прямого и обратного преобразования не используются
Имеется новый блок (288) разностного масштабирования цветности, фактически заменяющий блок обратного преобразования для яркости (265-3); и
Блок (285-C) восстановления модифицирован для обработки разностей цвета в исходной области, как описано в уравнении (36): CxRec = CxPred + CxRes.
Из уравнения (34), на стороне декодера, пусть CxResScaled обозначает извлеченный масштабированный разностный сигнал цветности после обратных квантования и преобразования (перед блоком 288) и пусть
обозначает перемасштабированную разность цветности, сгенерированную блоком (288) масштабирования разности цветности, предназначенную для использования блоком (285-C) восстановления для вычисления CxRec = CxPred + CxRes, где CxPred генерируется блоками или внутреннего (284), или внешнего (280) предсказания.
Значение , используемое для элемента преобразования (Transform Unit, TU), может совместно использоваться компонентами Cb и Cr и может быть вычислено следующим образом:
Если во внутреннем режиме, то вычисляют среднее значений яркости, полученных внутренним предсказанием;
если во внешнем режиме, то вычисляют среднее прошедших прямое преобразование значений яркости, полученных внешним предсказанием. То есть среднее значение  яркости вычисляют в преобразованной области; и
Если в совокупном объединении и внутреннем предсказании, то вычисляют среднее совокупных предсказанных значений яркости. Например, совокупные предсказанные значения яркости могут быть вычислены согласно Приложению 2, раздел 8.4.6.6.
В одном варианте осуществления можно применить LUT для вычисления  на основании . Альтернативно при заданном кусочно-линейном (PWL) представлении функции преобразования можно найти индекс idx, которому принадлежит значение , в PWL обратного отображения.
Тогда  = cScaleInv[idx]
Пример реализации, как это применимо к кодеку универсального кодирования видео (Versatile Video Coding codec, ссылка [8]), в настоящее время находящемуся в разработке ITU и ISO, можно найти в Приложении 2 (например, см. раздел 8.5.5.1.2).
Отключение основанного на яркости разностного масштабирования цветности для внутренних слайсов с двумя деревьями может привести к некоторой потере эффективности кодирования. Для улучшения эффектов преобразования цветности могут быть использованы следующие способы:
Коэффициент масштабирования цветности может быть оставлен одинаковым для всего кадра в зависимости от среднего или медианы значений выборок яркости. Это устранит зависимость уровня TU от яркости для разностного масштабирования цветности.
Коэффициенты масштабирования цветности могут быть получены с использованием восстановленных значений яркости из соседних CTU.
Кодер может получить коэффициент масштабирования цветности на основании исходных пикселей яркости и отправить его в битовом потоке на уровне CU/CTU (например, как индекс для кусочного представления функции преобразования). Тогда декодер может извлечь коэффициент масштабирования цветности из функции преобразования независимо от данных яркости.
Коэффициент масштаба для CTU может быть получен и отправлен только для внутренних слайсов; но может быть использован также и для внешних слайсов. Дополнительные затраты на передачу сигналов возникают только для внутренних слайсов, таким образом не оказывая влияния на эффективность кодирования в случайном доступе.
Цветность может быть преобразована на уровне кадра как яркость, при этом кривая преобразования цветности получается из кривой преобразования яркости на основании анализа корреляции между яркостью и цветностью. Это полностью устраняет разностное масштабирование цветности.
delta_qp Application
В AVC и HEVC параметру delta_qp разрешается модифицировать значение QP для блока кодирования. В одном варианте осуществления можно использовать кривую яркости в преобразователе для получения значения delta_qp. Можно получить кусочное значение lumaDQP на основании распределения кодовых слов для каждого интервала. Например:
для k-го интервала
scalek = (Mk/Ma) ;         (39)
lumaDQPk = INT(6*log2(scalek)) ,
где INT() может представлять собой CEIL(), ROUND() или FLOOR(). Кодер может использовать функцию яркости, например average(luma), min(luma), max(luma) и т. п., чтобы найти значение яркости для этого блока, затем использовать соответствующее значение lumaDQP для этого блока. Для получения выгоды от зависимости искажения от скорости передачи, из уравнения (27), можно использовать взвешенное искажение при определении режима и установить
.
Преобразование и обсуждение количества интервалов
В типичном 10-битном кодировании видео предпочтительно использовать по меньшей мере 32 интервала для преобразовательного отображения; однако, чтобы упростить реализацию декодера, в одном варианте осуществления можно использовать меньше интервалов, например 16 или даже 8 интервалов. С учетом того, что кодер может уже использовать 32 интервала, чтобы анализировать последовательность и получать распределение кодовых слов, можно повторно использовать исходное распределение кодовых слов по 32 интервалам и получать кодовые слова для 16 интервалов путем сложения соответствующих двух интервалов из 32 внутри каждого интервала из 16, т.е.
for i = 0 to 15
CWIn16Bin[i] = CWIn32Bin[2i] + CWIn32Bin[2i+1].
Для коэффициента разностного масштабирования цветности можно просто разделить кодовое слово на 2 и указать на chromaScalingFactorLUT для 32 интервалов. Например, при заданном
CWIn32Bin[32]={ 0 0 33 38 38 38 38 38 38 38 38 38 38 38 38 38 38 33 33 33 33 33 33 33 33 33 33 33 33 33 0 0}
соответствующее распределение для 16 интервалов CW имеет вид
CWIn16Bin[16] = { 0 71 76 76 76 76 76 76 71 66 66 66 66 66 66 0 }.
Этот подход может быть расширен для работы даже с меньшим количеством интервалов, например 8, тогда
for i = 0 to 7
CWIn8Bin[i] = CWIn16Bin[2i] + CWIn16Bin[2i+1].
При использовании узкого диапазона действительных кодовых слов (например, [64, 940] для 10-битных сигналов и [64, 235] для 8-битных сигналов) следует уделять внимание тому, чтобы первый и последний интервал не учитывали отображение в зарезервированные кодовые слова. Например, для 10-битного сигнала с 8 интервалами каждый интервал будет иметь 1024/8 = 128 кодовых слов, и первый интервал будет [0, 127]; однако, поскольку стандартный диапазон кодовых слов составляет [64, 940], первый интервал должен учитывать только кодовые слова [64, 127]. Специальный флаг (например, video_full_range_flag = 0 ) может быть использован для уведомления декодера о том, что входное видео имеет более узкий диапазон, чем полный диапазон [0, 2bitdepth – 1], и о том, что особое внимание следует уделить тому, чтобы не сгенерировать неразрешенные кодовые слова при обработке первого и последнего интервалов. Это относится к преобразованию как яркости, так и цветности.
В качестве примера и без ограничения, в Приложении 2 предоставлен пример синтаксической структуры и связанных синтаксических элементов для поддержки преобразования в кодеке универсального кодирования видео (VVC) ISO/ITU (ссылка [8]) согласно одному варианту осуществления с использованием архитектур, представленных на фиг. 2C, фиг. 2E и фиг. 2F, где функция прямого преобразования содержит 16 сегментов.
Ссылки
Каждый из документов, перечисленных в настоящем описании, включен посредством ссылки во всей своей полноте.
[1] «Exploratory Test Model for HDR extension of HEVC», K. Minoo и соавт., итоговый документ MPEG, JCTVC-W0092 (m37732), 2016, Сан-Диего, США.
[2] PCT заявка PCT/US2016/025082, «In-Loop Block-Based Image Reshaping in High Dynamic Range Video Coding», поданная 30 марта 2016 г., также опубликованная как WO 2016/164235, автор G-M. Su.
[3] Заявка на патент США 15/410563, «Content-Adaptive Reshaping for High Codeword representation Images», поданная 19 января 2017 г., автор T. Lu и соавт.
[4] ITU-T H.265, «High efficiency video coding», ITU, декабрь 2016 г.
[5] PCT заявка PCT/US2016/042229, «Signal Reshaping and Coding for HDR and Wide Color Gamut Signals», поданная 14 июля 2016 г., также опубликованная как WO 2017/011636, автор P. Yin и соавт.
[6] PCT заявка на патент PCT/US2018/040287, «Integrated Image Reshaping and Video Coding», поданная 29 июня 2018 г., автор T. Lu и соавт.
[7] J. Froehlich и соавт., «Content-Adaptive Perceptual Quantizer for High Dynamic Range Images», публикация заявки на патент США № 2018/0041759, 08 февраля 2018 г.
[8] B. Bross, J. Chen и S. Liu, «Versatile Video Coding (проект 3)», итоговый документ JVET, JVET-L1001, v9, загружен, 8 января 2019 г.
Пример реализации компьютерной системы
Варианты осуществления настоящего изобретения могут быть реализованы посредством компьютерной системы, систем, включенных в конфигурацию электронной схемы и компонентов, устройства на интегральной схеме (IC), такого как микроконтроллер, программируемой пользователем вентильной матрицы (FPGA) или другого конфигурируемого или программируемого логического устройства (PLD), процессора (DSP) обработки цифровых или дискретных временных сигналов, специализированной IC (ASIC) и/или приспособления, которое содержит одну или более таких систем, устройств или компонентов. Компьютер и/или IC могут выполнять, контролировать или исполнять команды, относящиеся к преобразованию сигнала и кодированию изображений, такие как описаны в данном документе. Компьютер и/или IC может вычислять любые различные параметры или значения, которые относятся к процессам преобразования и кодирования сигнала, описанным в настоящем документе. Варианты осуществления для изображения и видео могут быть реализованы в аппаратном обеспечении, программном обеспечении, программно-аппаратном обеспечении и различных их комбинациях.
Определенные реализации настоящего изобретения включают компьютерные процессоры, которые исполняют команды программного обеспечения, вызывающие выполнение процессорами способа согласно настоящему изобретению. Например, один или более процессоров в дисплее, кодере, телевизионной приставке, транскодере или тому подобном могут реализовать способы, относящиеся к преобразованию сигнала и кодированию изображений, как описано выше, посредством исполнения команд программного обеспечения в программной памяти, доступной для процессоров. Настоящее изобретение также может быть предоставлено в форме программного продукта. Программный продукт может содержать любой постоянный и материальный носитель, который содержит набор машиночитаемых сигналов, содержащих команды, которые при исполнении процессором данных вызывают исполнение процессором данных способа согласно настоящему изобретению. Программные продукты согласно настоящему изобретению могут иметь любую форму из широкого разнообразия постоянных и материальных форм. Программный продукт может содержать, например, физические носители, такие как магнитные носители данных, включая гибкие диски, жесткие диски, оптические носители данных, включая диски CD-ROM и DVD, электронные носители данных, включая ROM, флеш RAM или тому подобное. Машиночитаемые сигналы программного продукта необязательно могут быть сжатыми или зашифрованными.
Если компонент (например, модуль программного обеспечения, процессор, узел, устройство, схема и т.д.) относится к вышеизложенному, если не указано иное, ссылку на данный компонент (включая ссылку на «средства») следует интерпретировать как включающую эквиваленты любого компонента данного компонента, который выполняет функцию описанного компонента (например, который является функционально эквивалентным), включая компоненты, которые не являются структурно эквивалентными относительно описанной структуры, которая выполняет указанную функцию в проиллюстрированных приведенных в качестве примера вариантах осуществления изобретения.
Эквиваленты, расширения, альтернативы и прочее
Таким образом описаны примеры вариантов осуществления, которые относятся к эффективному преобразованию сигналов и кодированию изображений. В вышеизложенном описании варианты осуществления настоящего изобретения были описаны со ссылкой на многочисленные конкретные подробности, которые могут отличаться от реализации к реализации. Таким образом, единственным и исключительным показателем того, чем является изобретение, и того, чем должно являться изобретение по мнению заявителей, является формула изобретения, которая вытекает из данной заявки в конкретной форме, в которой представлена данная формула изобретения, включая любое последующее исправление. Любые определения, ясно изложенные в настоящем документе для терминов, содержащихся в такой формуле изобретения, должны обуславливать значение, в котором данные термины используются в формуле изобретения. Следовательно, никакое ограничение, элемент, свойство, признак, преимущество или атрибут, которое не указано явно в формуле изобретения, не должно никоим образом ограничивать объем такой формулы изобретения. Соответственно, описание и графические материалы следует рассматривать в иллюстративном, а не в ограничивающем смысле.
Пронумерованные примеры вариантов осуществления
Настоящее изобретение может осуществляться в любой из форм, описанных в данном описании, в том числе, но без ограничения, в нижеследующих пронумерованных примерах вариантов осуществления (ППВО), которые описывают конструкцию, характерные признаки и функции некоторых из частей настоящего изобретения.
ППВО 1. Способ адаптивного преобразования видеопоследовательности процессором, включающий:
получение процессором доступа к входному изображению в первом представлении кодовых слов; и
генерирование функции прямого преобразования, отображающей пиксели входного изображения во второе представление кодовых слов, причем второе представление кодовых слов обеспечивает более эффективное сжатие, чем первое представление кодовых слов, при этом генерирование функции прямого преобразования включает:
разделение входного изображения на множество пиксельных областей;
распределение каждой из пиксельных областей в один из множества интервалов кодовых слов согласно первой яркостной характеристике каждой пиксельной области;
вычисление показателя интервала для каждого одного из множества интервалов кодовых слов согласно второй яркостной характеристике каждой из пиксельных областей, распределенных в каждый из интервалов кодовых слов;
распределение некоторого количества кодовых слов во втором представлении кодовых слов в каждый интервал кодовых слов согласно показателю интервала каждого интервала кодовых слов и критерию оптимизации зависимости искажения от скорости передачи;
и генерирование функции прямого преобразования в ответ на распределение кодовых слов во втором представлении кодовых слов в каждый из множества интервалов кодовых слов.
ППВО 2. Способ по ППВО 1, в котором первая яркостная характеристика пиксельной области включает среднее значение яркости пикселей в пиксельной области.
ППВО 3. Способ по ППВО 1, в котором вторая яркостная характеристика пиксельной области включает дисперсию значений яркости пикселей в пиксельной области.
ППВО 4. Способ по ППВО 3, в котором вычисление показателя интервала для интервала кодовых слов включает вычисление среднего дисперсий значений яркости пикселей для всех пиксельных областей, распределенных в интервал кодовых слов.
ППВО 5. Способ по ППВО 1, в котором распределение некоторого количества кодовых слов во втором представлении кодовых слов в интервал кодовых слов согласно его показателю интервала включает:
отсутствие распределения кодовых слов в интервал кодовых слов, если никакие пиксельные области не распределены в интервал кодовых слов;
распределение первого количества кодовых слов, если показатель интервала для интервала кодовых слов ниже, чем верхнее пороговое значение; и
распределение второго количества кодовых слов в интервал кодовых слов в противном случае.
ППВО 6. Способ по ППВО 5, в котором для первого представления кодовых слов с глубиной B битов и второго представления кодовых слов с глубиной Bo битов и N интервалами кодовых слов первое количество кодовых слов содержит Mf = CEIL((2Bo/(CW2-CW1))* Ma) и второе количество кодовых слов содержит Ma = 2B/N, где CW1 < CW2 обозначают два кодовых слова в [0 2B-1].
ППВО 7. Способ по ППВО 6, в котором CW1 = 16*2(B-8) и CW2 = 235*2(B-8).
ППВО 8. Способ по ППВО 5, в котором определение верхнего порога включает:
определение множества потенциальных пороговых значений;
при этом для каждого порога во множестве пороговых значений:
генерирование функции прямого преобразования на основании порога;
кодирование и декодирование множества входных испытательных кадров согласно функции преобразования и битовой скорости R для генерирования выходного множества декодированных испытательных кадров; и
вычисление общего показателя оптимизации зависимости искажений от скорости передачи (RDO) на основе входных испытательных кадров и декодированных испытательных кадров;
и выбор в качестве верхнего порога порогового значения из множества потенциальных пороговых значений, для которого показатель RDO является минимальным.
ППВО 9. Способ по ППВО 8, в котором вычисление показателя RDO включает вычисление
J = D + λ R, где D обозначает меру искажения между значениями пикселей входных испытательных кадров и соответствующими значениями пикселей в декодированных испытательных кадрах, а λ обозначает множитель Лагранжа.
ППВО 10. Способ по ППВО 9, в котором D представляет собой меру суммы квадратичных разностей между соответствующими значениями пикселей входных испытательных кадров и декодированных испытательных кадров.
ППВО 11. Способ по ППВО 1, в котором распределение некоторого количества кодовых слов во втором представлении кодовых слов в интервал кодовых слов согласно его показателю интервала основано на справочной таблице распределения кодовых слов, причем справочная таблица распределения кодовых слов определяет два или более порогов, разделяющих диапазон значений показателя интервала на сегменты, и предоставляет количество кодовых слов, которые необходимо распределить в интервал с показателем интервала в пределах каждого сегмента.
ППВО 12. Способ по ППВО 11, в котором, при заданном распределении кодовых слов в интервал по умолчанию, в интервалы с большими показателями интервалов распределяют меньше кодовых слов, чем при распределении кодовых слов по умолчанию, а в интервалы с малыми показателями интервалов распределяют больше кодовых слов, чем при распределении кодовых слов по умолчанию.
ППВО 13. Способ по ППВО 12, в котором для первого представления кодовых слов с B битами и N интервалами распределение кодовых слов по умолчанию на интервал определяют уравнением Ma = 2B/N.
ППВО 14. Способ по ППВО 1, дополнительно включающий генерирование информации о преобразовании в ответ на функцию прямого преобразования, причем информация о преобразовании содержит
одно или более из следующего:
флаг, указывающий минимальное значение индекса интервала кодовых слов, которое необходимо использовать в процессе восстановления преобразования,
флаг, указывающий максимальное значение индекса интервала кодовых слов, которое необходимо использовать в процессе создания преобразования,
флаг, указывающий тип профиля модели преобразования, причем каждый тип профиля модели связан с параметрами по умолчанию, связанными с интервалом, или
одно или более дельта-значений, которые необходимо использовать для регулирования параметров по умолчанию, связанных с интервалом.
ППВО 15. Способ по ППВО 5, дополнительно включающий присваивание каждому интервалу кодовых слов значения значимости интервала, причем значение значимости интервала представляет собой:
0, если в интервал кодовых слов не распределено ни одно кодовое слово;
2, если интервалу кодовых слов присвоено первое значение кодовых слов; и
1 в ином случае.
ППВО 16. Способ по ППВО 5, в котором определение верхнего порога включает:
разделение диапазона яркости пиксельных значений во входном изображении на интервалы;
определение для каждого интервала значения гистограммы интервала и среднего значения дисперсии интервала, при этом для интервала значение гистограммы интервала содержит количество пикселей в интервале относительно общего количества пикселей в изображении, а среднее значение дисперсии интервала предоставляет показатель средней дисперсии пикселей для пикселей в интервале;
сортировку средних значений дисперсии интервалов для генерирования сортированного списка средних значений дисперсии интервалов и сортированного списка индексов средних значений дисперсии интервалов;
вычисление функции кумулятивной плотности распределения как функции сортированных средних значений дисперсии интервалов на основании значений гистограммы интервалов и сортированного списка индексов средних значений дисперсии интервалов; и
определение верхнего порога на основании критерия, которому удовлетворяют значения функции кумулятивной плотности распределения.
ППВО 17. Способ по ППВО 16, в котором вычисление функции кумулятивной плотности распределения включает вычисление:
BinVarSortDsdCDF[0] = BinHist[BinIdxSortDsd[0]];
for (int b = 1; b < PIC_ANALYZE_CW_BINS; b++)
{
BinVarSortDsdCDF[b] = BinVarSortDsdCDF[b - 1] + BinHist[BinIdxSortDsd[b]];
},
где b обозначает номер интервала, PIC_ANALYZE_CW_BINS обозначает общее количество интервалов, BinVarSortDsdCDF[b]обозначает выход функции CDF для интервала b, BinHist[i] обозначает значение гистограммы интервала для интервала i, и BinIdxSortDsd[] обозначает сортированный список индексов средних значений дисперсии интервалов.
ППВО 18. Способ по ППВО 16, в котором согласно критерию, заключающемуся в том, что для k % пикселей во входном изображении средняя дисперсия интервала больше или равна верхнему порогу, верхний порог определяют как среднее значение дисперсии интервала, для которого выход CDF составляет k %.
ППВО 19. Способ по ППВО 18, в котором k = 50.
ППВО 20. Способ восстановления функции преобразования в декодере, включающий:
прием в кодированном битовом потоке элементов синтаксиса, характеризующих модель преобразования, причем элементы синтаксиса включают одно или более из следующего:
флаг, указывающий минимальное значение индекса интервала кодовых слов, которое необходимо использовать в процессе создания преобразования,
флаг, указывающий максимальное значение индекса интервала кодовых слов, которое необходимо использовать в процессе создания преобразования,
флаг, указывающий тип профиля модели преобразования, причем тип профиля модели связан с параметрами по умолчанию, относящимися к интервалу, включая значения значимости интервалов, или
флаг, указывающий одно или более дельта-значений значимости интервалов, которые необходимо использовать для регулирования значений значимости интервалов по умолчанию, определенных в профиле модели преобразования;
определение на основании профиля модели преобразования значений значимости интервалов по умолчанию для каждого интервала и списка распределения количеств кодовых слов по умолчанию, которые необходимо распределить в каждый интервал согласно значению значимости интервала;
для каждого интервала кодовых слов:
определение его значения значимости интервала посредством добавления его значения значимости интервала по умолчанию к его дельта-значению значимости интервала;
определение количества кодовых слов, которые необходимо распределить в интервал кодовых слов, на основании значения значимости интервала для интервала и списка распределения; и
генерирование функции прямого преобразования на основании количества кодовых слов, распределенных в каждый интервал кодовых слов.
ППВО 21. Способ по ППВО 20, в котором определение Mk, количества кодовых слов, распределенных в k-ый интервал кодовых слов, с использованием списка распределения дополнительно включает:
для k-го интервала:
если bin_importance[k] == 0,
то Mk = 0;
иначе если bin_importance[k] == 2
то Mk = Mf ;
иначе
Mk = Ma ,
где Ma и Mf представляют собой элементы списка распределения и bin_importance[k] обозначает значение значимости интервала k-го интервала.
ППВО 22. Способ восстановления кодированных данных в декодере, содержащем один или более процессоров, включающий:
прием кодированного битового потока (122), содержащего одно или более кодированных преобразованных изображений в первом представлении кодовых слов, и метаданные (207), относящиеся к информации о преобразовании для кодированных преобразованных изображений;
генерирование (250) функции обратного преобразования на основании метаданных, относящихся к информации о преобразовании, причем функция обратного преобразования отображает пиксели преобразованного изображения из первого представления кодовых слов во второе представление кодовых слов;
генерирование (250) функции прямого преобразования на основании метаданных, относящихся к информации о преобразовании, причем функция прямого преобразования отображает пиксели изображения из второго представления кодовых слов в первое представление кодовых слов;
извлечение из кодированного битового потока кодированного преобразованного изображения, содержащего один или более кодированных элементов, причем для одного или более кодированных элементов в кодированном преобразованном изображении:
для элемента кодирования (coding unit, CU) с внутренним кодированием в кодированном преобразованном изображении:
генерирование первых преобразованных восстановленных выборок CU (227) на основании преобразованных разностей в CU и первых преобразованных выборок предсказания;
генерирование (270) преобразованного выхода контурного фильтра на основании первых преобразованных восстановленных выборок и параметров контурного фильтра;
применение (265) функции обратного преобразования к преобразованному выходу контурного фильтра для генерирования декодированных выборок элемента кодирования во втором представлении кодовых слов; и
сохранение декодированных выборок элемента кодирования во втором представлении кодовых слов в опорном буфере;
для элемента кодирования с внешним кодированием в кодированном преобразованном изображении:
применение функции прямого преобразования к выборкам предсказания, хранящимся в опорном буфере во втором представлении кодовых слов, для генерирования вторых преобразованных выборок предсказания;
генерирование вторых преобразованных восстановленных выборок элемента кодирования на основании преобразованных разностей в кодированном CU и вторых преобразованных выборок предсказания;
генерирование преобразованного выхода контурного фильтра на основании вторых преобразованных восстановленных выборок и параметров контурного фильтра;
применение функции обратного преобразования к преобразованному выходу контурного фильтра для генерирования выборок элемента кодирования во втором представлении кодовых слов; и
сохранение выборок элемента кодирования во втором представлении кодовых слов в опорном буфере;
и
генерирование декодированного изображения на основании сохраненных в опорном буфере выборок.
ППВО 23. Устройство, содержащее процессор и выполненное с возможностью осуществления способа, такого как указан в любом из ППВО 1–22.
ППВО 24. Постоянный машиночитаемый носитель данных, содержащий сохраненные на нем машиновыполняемые команды для исполнения способа по любому из ППВО 1–22 с помощью одного или более процессоров.
Приложение 1
Пример реализации пузырьковой сортировки
void bubbleSortDsd(double* array, int * idx, int n)
{
int i, j;
bool swapped;
for (i = 0; i < n - 1; i++)
{
swapped = false;
for (j = 0; j < n - i - 1; j++)
{
if (array[j] < array[j + 1])
{
swap(&array[j], &array[j + 1]);
swap(&idx[j], &idx[j + 1]);
swapped = true;
}
}
if (swapped == false)
break;
}
}
Приложение 2
В качестве примера в данном приложении представлен пример синтаксической структуры и связанных элементов синтаксиса согласно одному варианту осуществления для поддержки преобразования в кодеке универсального кодирования видео (VVC) (ссылка [8]), в данный момент в совместной разработке ISO и ITU. Новые элементы синтаксиса в существующей проектной версии либо , либо обозначены явно. Числа в уравнениях, такие как (8-xxx), обозначают заполнители, которые подлежат обновлению, по необходимости, в конечном описании.
В 7.3.2.1 синтаксис набора RBSP параметров последовательности
seq_parameter_set_rbsp( ) {
Descriptor
sps_seq_parameter_set_id
ue(v)
intra_only_constraint_flag
u(1)
max_bitdepth_constraint_idc
u(4)
max_chroma_format_constraint_idc
u(2)
frame_only_constraint_flag
u(1)
no_qtbtt_dual_tree_intra constraint_flag
u(1)
no_sao_constraint_flag
u(1)
no_alf_constraint_flag
u(1)
no_pcm_constraint_flag
u(1)
no_temporal_mvp_constraint_flag
u(1)
no_sbtmvp_constraint_flag
u(1)
no_amvr_constraint_flag
u(1)
no_cclm_constraint_flag
u(1)
no_affine_motion_constraint_flag
u(1)
no_ladf_constraint_flag
u(1)
no_dep_quant_constraint_flag
u(1)
no_sign_data_hiding_constraint_flag
u(1)
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)
bit_depth_luma_minus8
ue(v)
bit_depth_chroma_minus8
ue(v)
log2_max_pic_order_cnt_lsb_minus4
ue(v)
qtbtt_dual_tree_intra_flag
ue(v)
log2_ctu_size_minus2
ue(v)
log2_min_luma_coding_block_size_minus2
ue(v)
partition_constraints_override_enabled_flag
ue(v)
sps_log2_diff_min_qt_min_cb_intra_tile_group_luma
ue(v)
sps_log2_diff_min_qt_min_cb_inter_tile_group
ue(v)
sps_max_mtt_hierarchy_depth_inter_tile_groups
ue(v)
sps_max_mtt_hierarchy_depth_intra_tile_groups_luma
ue(v)
if( sps_max_mtt_hierarchy_depth_intra_tile_groups_luma != 0 ) {
sps_log2_diff_max_bt_min_qt_intra_tile_group_luma
ue(v)
sps_log2_diff_max_tt_min_qt_intra_tile_group_luma
ue(v)
}
if( sps_max_mtt_hierarchy_depth_inter_tile_groups != 0 ) {
sps_log2_diff_max_bt_min_qt_inter_tile_group
ue(v)
sps_log2_diff_max_tt_min_qt_inter_tile_group
ue(v)
}
if( qtbtt_dual_tree_intra_flag ) {
sps_log2_diff_min_qt_min_cb_intra_tile_group_chroma
ue(v)
sps_max_mtt_hierarchy_depth_intra_tile_groups_chroma
ue(v)
if ( sps_max_mtt_hierarchy_depth_intra_tile_groups_chroma != 0 ) {
sps_log2_diff_max_bt_min_qt_intra_tile_group_chroma
ue(v)
sps_log2_diff_max_tt_min_qt_intra_tile_group_chroma
ue(v)
}
}
sps_sao_enabled_flag
u(1)
sps_alf_enabled_flag
u(1)
pcm_enabled_flag
u(1)
if( pcm_enabled_flag ) {
pcm_sample_bit_depth_luma_minus1
u(4)
pcm_sample_bit_depth_chroma_minus1
u(4)
log2_min_pcm_luma_coding_block_size_minus3
ue(v)
log2_diff_max_min_pcm_luma_coding_block_size
ue(v)
pcm_loop_filter_disabled_flag
u(1)
}
sps_ref_wraparound_enabled_flag
u(1)
if( sps_ref_wraparound_enabled_flag )
sps_ref_wraparound_offset
ue(v)
sps_temporal_mvp_enabled_flag
u(1)
if( sps_temporal_mvp_enabled_flag )
sps_sbtmvp_enabled_flag
u(1)
sps_amvr_enabled_flag
u(1)
sps_bdof_enabled_flag
u(1)
sps_cclm_enabled_flag
u(1)
sps_mts_intra_enabled_flag
u(1)
sps_mts_inter_enabled_flag
u(1)
sps_affine_enabled_flag
u(1)
if( sps_affine_enabled_flag )
sps_affine_type_flag
u(1)
sps_gbi_enabled_flag
u(1)
sps_cpr_enabled_flag
u(1)
sps_ciip_enabled_flag
u(1)
sps_triangle_enabled_flag
u(1)
sps_ladf_enabled_flag
u(1)
if ( sps_ladf_enabled_flag ) {
sps_num_ladf_intervals_minus2
u(2)
sps_ladf_lowest_interval_qp_offset
se(v)
for( i = 0; i < sps_num_ladf_intervals_minus2 + 1; i++ ) {
sps_ladf_qp_offset[ i ]
se(v)
sps_ladf_delta_threshold_minus1[ i ]
ue(v)
}
}
<img file="00000044.jpg" he="5" wi="60" img-content="undefined" img-format="jpg" />
<img file="00000045.jpg" he="5" wi="7" img-content="undefined" img-format="jpg" />
rbsp_trailing_bits( )
}
В 7.3.3.1 Общий синтаксис заголовка группы тайлов
tile_group_header( ) {
Descriptor
tile_group_pic_parameter_set_id
ue(v)
if( NumTilesInPic > 1 ) {
tile_group_address
u(v)
num_tiles_in_tile_group_minus1
ue(v)
}
tile_group_type
ue(v)
tile_group_pic_order_cnt_lsb
u(v)
if( partition_constraints_override_enabled_flag ) {
partition_constraints_override_flag
ue(v)
if( partition_constraints_override_flag ) {
tile_group_log2_diff_min_qt_min_cb_luma
ue(v)
tile_group_max_mtt_hierarchy_depth_luma
ue(v)
if( tile_group_max_mtt_hierarchy_depth_luma != 0 )
tile_group_log2_diff_max_bt_min_qt_luma
ue(v)
tile_group_log2_diff_max_tt_min_qt_luma
ue(v)
}
if( tile_group_type = = I && qtbtt_dual_tree_intra_flag ) {
tile_group_log2_diff_min_qt_min_cb_chroma
ue(v)
tile_group_max_mtt_hierarchy_depth_chroma
ue(v)
if( tile_group_max_mtt_hierarchy_depth_chroma != 0 )
tile_group_log2_diff_max_bt_min_qt_chroma
ue(v)
tile_group_log2_diff_max_tt_min_qt_chroma
ue(v)
}
}
}
}
if ( tile_group_type != I ) {
if( sps_temporal_mvp_enabled_flag )
tile_group_temporal_mvp_enabled_flag
u(1)
if( tile_group_type = = B )
mvd_l1_zero_flag
u(1)
if( tile_group_temporal_mvp_enabled_flag ) {
if( tile_group_type = = B )
collocated_from_l0_flag
u(1)
}
six_minus_max_num_merge_cand
ue(v)
if( sps_affine_enable_flag )
five_minus_max_num_subblock_merge_cand
ue(v)
}
tile_group_qp_delta
se(v)
if( pps_tile_group_chroma_qp_offsets_present_flag ) {
tile_group_cb_qp_offset
se(v)
tile_group_cr_qp_offset
se(v)
}
if( sps_sao_enabled_flag ) {
tile_group_sao_luma_flag
u(1)
if( ChromaArrayType != 0 )
tile_group_sao_chroma_flag
u(1)
}
if( sps_alf_enabled_flag ) {
tile_group_alf_enabled_flag
u(1)
if( tile_group_alf_enabled_flag )
alf_data( )
}
if( tile_group_type = = P | | tile_group_type = = B ) {
num_ref_idx_l0_active_minus1
ue(v)
if( tile_group_type = = B )
num_ref_idx_l1_active_minus1
ue(v)
}
dep_quant_enabled_flag
u(1)
if( !dep_quant_enabled_flag )
sign_data_hiding_enabled_flag
u(1)
if( deblocking_filter_override_enabled_flag )
deblocking_filter_override_flag
u(1)
if( deblocking_filter_override_flag ) {
tile_group_deblocking_filter_disabled_flag
u(1)
if( !tile_group_deblocking_filter_disabled_flag ) {
tile_group_beta_offset_div2
se(v)
tile_group_tc_offset_div2
se(v)
}
}
if( num_tiles_in_tile_group_minus1 > 0 ) {
offset_len_minus1
ue(v)
for( i = 0; i < num_tiles_in_tile_group_minus1; i++ )
entry_point_offset_minus1[ i ]
u(v)
}
<img file="00000046.jpg" he="5" wi="61" img-content="undefined" img-format="jpg" />
<img file="00000047.jpg" he="5" wi="72" img-content="undefined" img-format="jpg" />
<img file="00000045.jpg" he="5" wi="7" img-content="undefined" img-format="jpg" />
<img file="00000048.jpg" he="4" wi="79" img-content="undefined" img-format="jpg" />
<img file="00000049.jpg" he="5" wi="53" img-content="undefined" img-format="jpg" />
<img file="00000050.jpg" he="5" wi="57" img-content="undefined" img-format="jpg" />
<img file="00000045.jpg" he="5" wi="7" img-content="undefined" img-format="jpg" />
<img file="00000051.jpg" he="8" wi="128" img-content="undefined" img-format="jpg" />
<img file="00000052.jpg" he="5" wi="85" img-content="undefined" img-format="jpg" />
<img file="00000045.jpg" he="5" wi="7" img-content="undefined" img-format="jpg" />
<img file="00000053.jpg" he="4" wi="5" img-content="undefined" img-format="jpg" />
byte_alignment( )
}
Добавить новую модель преобразователя группы тайлов синтаксической таблицы:
В общей семантике набора RBSP параметров последовательности добавить следующую семантику:
sps_reshaper_enabled_flag, равный 1, определяет, что преобразователь используется в кодированной видеопоследовательности (CVS). sps_reshaper_enabled_flag равно 0 определяет, что преобразователь не используется в CVS.
В синтаксисе заголовка группы тайлов добавить следующую семантику
tile_group_reshaper_model_present_flag, равный 1, определяет, что tile_group_reshaper_model() имеется в заголовке группы тайлов. tile_group_reshaper_model_present_flag равно 0 определяет, что tile_group_reshaper_model() отсутствует в заголовке группы тайлов. Если tile_group_reshaper_model_present_flag отсутствует, его полагают равным 0.
tile_group_reshaper_enabled_flag, равный 1, определяет, что преобразователь поддерживается для текущей группы тайлов. tile_group_reshaper_enabled_flag равно 0 определяет, что преобразователь не поддерживается для текущей группы тайлов. Если tile_group_reshaper_enable_flag отсутствует, его полагают равным 0.
tile_group_reshaper_chroma_residual_scale_flag, равный 1, определяет, что разностное масштабирование цветности поддерживается для текущей группы тайлов. tile_group_reshaper_chroma_residual_scale_flag равно 0 определяет, что разностное масштабирование цветности не поддерживается для текущей группы тайлов. Если tile_group_reshaper_chroma_residual_scale_flag отсутствует, его полагают равным 0.
Добавить синтаксис tile_group_reshaper_model( )
reshaper_model_min_bin_idx определяет минимальный индекс интервала (или участка) для использования в процессе создания преобразователя. Значение reshaper_model_min_bin_idx должно быть в диапазоне от 0 до MaxBinIdx включительно. Значение MaxBinIdx должно быть равным 15.
reshaper_model_delta_max_bin_idx определяет максимально разрешенный индекс MaxBinIdx интервала (или участка) минус максимальный индекс интервала для использования в процессе создания преобразователя. Значение reshaper_model_max_bin_idx устанавливают равным MaxBinIdx – reshaper_model_delta_max_bin_idx.
reshaper_model_bin_delta_abs_cw_prec_minus1 плюс 1 определяет количество бит, используемое для представления синтаксической конструкции reshaper_model_bin_delta_abs_CW[ i ].
reshaper_model_bin_delta_abs_CW[ i ] определяет абсолютное дельта-значение кодового слова для i-го интервала.
reshaper_model_bin_delta_sign_CW_flag[ i ] определяет знак reshaper_model_bin_delta_abs_CW[ i ] следующим образом:
– Если reshaper_model_bin_delta_sign_CW_flag[ i ] равно 0, соответствующая переменная RspDeltaCW[ i ] представляет собой положительное значение.
– Иначе ( reshaper_model_bin_delta_sign_CW_flag[ i ] не равно 0 ), соответствующая переменная RspDeltaCW[ i ] представляет собой отрицательное значение.
Когда reshaper_model_bin_delta_sign_CW_flag[ i ] отсутствует, его полагают равным 0.
Переменная RspDeltaCW[ i ] = (1 - 2*reshaper_model_bin_delta_sign_CW [ i ]) * reshaper_model_bin_delta_abs_CW [ i ];
Переменную RspCW[ i ] получают на следующих этапах:
Переменную OrgCW устанавливают равной (1 << BitDepthY ) / ( MaxBinIdx + 1).
– Если reshaper_model_min_bin_idx < = i <= reshaper_model_max_bin_idx
RspCW[ i ] = OrgCW + RspDeltaCW[ i ].
– Иначе RspCW[ i ] = 0.
Значение RspCW [ i ] должно быть в диапазоне от 32 до 2 * OrgCW - 1, если значение BitDepthY равно 10.
Переменные InputPivot[ i ] с i в диапазоне от 0 до MaxBinIdx + 1 включительно получают следующим образом
InputPivot[ i ] = i * OrgCW
Переменную ReshapePivot[ i ] с i в диапазоне от 0 до MaxBinIdx + 1 включительно, переменную ScaleCoef[ i ] и InvScaleCoeff[ i ] с i в диапазоне от 0 до MaxBinIdx включительно получают следующим образом:
shiftY = 14ReshapePivot[ 0 ] = 0;
for( i = 0; i <= MaxBinIdx ; i++) { ReshapePivot[ i + 1 ] = ReshapePivot[ i ] + RspCW[ i ]
ScaleCoef[ i ] = ( RspCW[ i ] * (1 << shiftY) + (1 << (Log2(OrgCW) - 1))) >> (Log2(OrgCW)) if ( RspCW[ i ] == 0 )  InvScaleCoeff[ i ] = 0 else  InvScaleCoeff[ i ] = OrgCW * (1 << shiftY) / RspCW[ i ]}Переменную ChromaScaleCoef[ i ] с i в диапазоне от 0 до MaxBinIdx включительно получают следующим образом:
ChromaResidualScaleLut[64] = {16384, 16384, 16384, 16384, 16384, 16384, 16384, 8192, 8192, 8192, 8192, 5461, 5461, 5461, 5461, 4096, 4096, 4096, 4096, 3277, 3277, 3277, 3277, 2731, 2731, 2731, 2731, 2341, 2341, 2341, 2048, 2048, 2048, 1820, 1820, 1820, 1638, 1638, 1638, 1638, 1489, 1489, 1489, 1489, 1365, 1365, 1365, 1365, 1260, 1260, 1260, 1260, 1170, 1170, 1170, 1170, 1092, 1092, 1092, 1092, 1024, 1024, 1024, 1024};
shiftC = 11
– если ( RspCW[ i ] == 0 )
ChromaScaleCoef [ i ] = (1 << shiftC)
–  иначе (RspCW[ i ] != 0),
ChromaScaleCoef[ i ] = ChromaResidualScaleLut[ Clip3(1, 64, RspCW[ i ] >> 1 ) – 1 ]
Примечание: в альтернативной реализации можно объединить масштабирование для яркости и цветности, таким образом устраняя необходимость в ChromaResidualScaleLut[]. Тогда масштабирование цветности может быть реализовано так:
shiftC = 11
– если ( RspCW[ i ] == 0 )
ChromaScaleCoef [ i ] = (1 << shiftC)
–  Иначе (RspCW[ i ] != 0), применяется следующее:
BinCW = BitDepthY > 10 ? ( RspCW[ i ] >> (BitDepthY 10)) : BitDepthY < 10 ? ( RspCW[ i ] << ( 10 BitDepthY) ): RspCW[ i ];ChromaScaleCoef[ i ] = OrgCW * (1 << shiftC) / BinCW [ i ].
Добавить следующее в процесс взвешенного предсказания выборки для комбинированного объединения и внутреннего предсказания. Добавление
8.4.6.6 Процесс взвешенного предсказания выборки для комбинированного объединения и внутреннего предсказания
Входными данными для этого процесса являются:
ширина cbWidth текущего блока кодирования,
высота cbHeight текущего блока кодирования,
два массива (cbWidth)x(cbHeight) predSamplesInter и predSamplesIntra,
режим внутреннего предсказания predModeIntra,
переменная cIdx, определяющая индекс цветовой компоненты.
Выходными данными этого процесса является массив (cbWidth)x(cbHeight) predSamplesComb значений выборок предсказания.
Переменную bitDepth получают следующим образом:
Если cIdx равно 0, bitDepth устанавливают равным BitDepthY.
Иначе bitDepth устанавливают равным BitDepthC.
Выборки предсказания predSamplesComb[ x ][ y ] с x = 0..cbWidth − 1 и y = 0..cbHeight − 1 получают следующим образом:
Вес w получают следующим образом:
Если predModeIntra представляет собой INTRA_ANGULAR50, w указан в таблице 8–10, при этом nPos равно y и nSize равно cbHeight.
Иначе, если predModeIntra представляет собой INTRA_ANGULAR18, w указан в таблице 8–10, при этом nPos равно x и nSize равно cbWidth.
Иначе w устанавливают равным 4.
Выборки предсказания predSamplesComb[ x ][ y ] получают следующим образом:
predSamplesComb[ x ][ y ] = ( w * predSamplesIntra[ x ][ y ] +  (8-740)  ( 8 − w ) * predSamplesInter[ x ][ y ] ) >> 3 )
Таблица 8-10 – Определение w как функции положения nP и размера nS
0 <= nP < ( nS / 4 )
( nS / 4 ) <= nP < ( nS / 2 )
( nS / 2 ) <= nP < ( 3 *nS / 4 )
( 3 *nS / 4 ) <= nP < nS
6
5
3
2
Добавить следующее в процесс восстановления псевдокадра
8.5.5 Процесс восстановления псевдокадра
Входными данными для этого процесса являются:
– положение ( xCurr, yCurr ), определяющее верхнюю левую выборку текущего блока относительно верхней левой выборки текущей компоненты псевдокадра,
– переменные nCurrSw и nCurrSh, определяющие соответственно ширину и высоту текущего блока,
– переменная cIdx, определяющая цветовую компоненту текущего блока,
– массив (nCurrSw)x(nCurrSh) predSamples, определяющий предсказанные выборки текущего блока,
– массив (nCurrSw)x(nCurrSh) resSamples, определяющий разностные выборки текущего блока.
В зависимости от значения цветовой компоненты cIdx выполняют следующие присвоения:
– Если cIdx равно 0, recSamples соответствует массиву SL выборок восстановленного псевдокадра и функция clipCidx1 соответствует Clip1Y.
– Иначе, если cIdx равно 1, recSamples соответствует массиву SCb восстановленных выборок цветности и функция clipCidx1 соответствует Clip1C.
– Иначе (cIdx равно 2), recSamples соответствует массиву SCr восстановленных выборок цветности и функция clipCidx1 соответствует Clip1C.
Иначе блок (nCurrSw)x(nCurrSh) массива recSamples восстановленных выборок в положении ( xCurr, yCurr ) получают следующим образом:
recSamples[ xCurr + i ][ yCurr + j ] = clipCidx1( predSamples[ i ][ j ] + resSamples[ i ][ j ] )  при этом i = 0..nCurrSw − 1, j = 0..nCurrSh – 1
В данном пункте описано восстановление псевдокадра посредством процесса отображения. Восстановление псевдокадра посредством процесса отображения для значения выборки яркости описано в 8.5.5.1.1. Восстановление псевдокадра посредством процесса отображения для значения выборки цветности описано в 8.5.5.1.2.
8.5.5.1.1 Восстановление псевдокадра посредством процесса отображения для значения выборки яркости
Входными данными для этого процесса являются:
– массив (nCurrSw)x(nCurrSh) predSamples, определяющий предсказанные выборки яркости текущего блока,
– массив (nCurrSw)x(nCurrSh) resSamples, определяющий разностные выборки яркости текущего блока.
Выходными данными этого процесса являются:
– массив (nCurrSw)x(nCurrSh) predMapSamples отображенных выборок предсказания яркости,
– массив (nCurrSw)x(nCurrSh) recSamples восстановленных выборок яркости.
predMapSamples получают следующим образом:
– если ( CuPredMode[ xCurr ][ yCurr ] = = MODE_INTRA ) || ( CuPredMode[ xCurr ][ yCurr ] = = MODE_INTER && mh_intra_flag[ xCurr ][ yCurr ] )
predMapSamples[ xCurr + i ][ yCurr + j ] = predSamples[ i ][ j ]  при этом i = 0..nCurrSw − 1, j = 0..nCurrSh – 1
–  иначе ( ( CuPredMode[ xCurr ][ yCurr ] = = MODE_INTER && !mh_intra_flag[ xCurr ][ yCurr ] )), применяют следующее:
shiftY = 14idxY = predSamples[ i ][ j ] >> Log2( OrgCW )predMapSamples[ xCurr + i ][ yCurr + j ] = ReshapePivot[ idxY ]  + ( ScaleCoeff[ idxY ] *(predSamples[ i ][ j ] - InputPivot[ idxY ] )  + ( 1 << ( shiftY – 1 ) ) ) >> shiftY   при этом i = 0..nCurrSw − 1, j = 0..nCurrSh – 1
recSamples получают следующим образом:
recSamples[ xCurr + i ][ yCurr + j ] = Clip1Y ( predMapSamples[ xCurr + i ][ yCurr + j ]+ resSamples[ i ][ j ] ] )  при этом i = 0..nCurrSw − 1, j = 0..nCurrSh – 1
8.5.5.1.2 Восстановление псевдокадра посредством процесса отображения для значения выборки цветности
Входными данными для этого процесса являются:
– массив (nCurrSwx2)x(nCurrShx2) predMapSamples отображенных значений, определяющий отображенные предсказанные выборки яркости текущего блока,
– массив (nCurrSw)x(nCurrSh) predSamples, определяющий предсказанные выборки цветности текущего блока,
– массив (nCurrSw)x(nCurrSh) resSamples, определяющий разностные выборки цветности текущего блока.
Выходными данными этого процесса является массив recSamples восстановленных выборок цветности.
recSamples получают следующим образом:
– если ( !tile_group_reshaper_chroma_residual_scale_flag || ( (nCurrSw)x(nCurrSh) <= 4) )
recSamples[ xCurr + i ][ yCurr + j ] = Clip1C ( predSamples[ i ][ j ] + resSamples[ i ][ j ] )  при этом i = 0..nCurrSw − 1, j = 0..nCurrSh – 1
–  иначе (tile_group_reshaper_chroma_residual_scale_flag && ( (nCurrSw)x(nCurrSh) > 4)), применяют следующее:
Переменную varScale получают следующим образом:
invAvgLuma = Clip1Y( ( ΣiΣj predMapSamples[ (xCurr << 1 ) + i ][ (yCurr << 1) + j ] + nCurrSw * nCurrSh *2) / ( nCurrSw * nCurrSh *4 ) )
Переменную idxYInv получают с использованием идентификации индекса кусочной функции, как определено в пункте , с входными данными значения выборки invAvgLuma.
varScale = ChromaScaleCoef[ idxYInv ]
recSamples получают следующим образом:
–  если tu_cbf_cIdx [ xCurr ][ yCurr ] равно 1, применяют следующее:
shiftC = 11recSamples[ xCurr + i ][ yCurr + j ] = ClipCidx1 ( predSamples[ i ][ j ] + Sign( resSamples[ i ][ j ] ) * ( ( Abs( resSamples[ i ][ j ] ) * varScale + ( 1 << ( shiftC – 1 ) ) ) >> shiftC ) )  при этом i = 0..nCurrSw − 1, j = 0..nCurrSh – 1
–  иначе (tu_cbf_cIdx[ xCurr ][ yCurr ] равно 0)
recSamples[ xCurr + i ][ yCurr + j ] = ClipCidx1(predSamples[ i ][ j ] )  при этом i = 0..nCurrSw − 1, j = 0..nCurrSh – 1
8.5.6 Процесс обратного отображения псевдокадра
Данный пункт применяется, когда значение tile_group_reshaper_enabled_flag равно 1. Входные данные представляют собой массив SL выборок яркости восстановленного псевдокадра, а выходные данные представляют собой измененный массив S’L выборок яркости восстановленного псевдокадра после процесса обратного отображения.
Процесс обратного отображения для значения выборки яркости описан в 8.4.6.1.
8.5.6.1 Процесс обратного отображения псевдокадра для значений выборки яркости
Входными данными для этого процесса является положение ( xP, yP ) яркости, определяющее положение выборки яркости относительно верхней левой выборки яркости текущего псевдокадра.
Выходными данными этого процесса является обратно отображенное значение invLumaSample выборки яркости.
Значение invLumaSample получают с применением следующих упорядоченных этапов:
Переменную idxYInv получают с использованием идентификации индекса кусочной функции, как определено в пункте 8.5.6.2, с входными данными значения SL[ xP ][ yP ] выборки яркости.
Значение reshapeLumaSample получают следующим образом:
shiftY = 14invLumaSample = InputPivot[ idxYInv ] + ( InvScaleCoeff[ idxYInv ] *( SL[ xP ][ yP ] - ReshapePivot[ idxYInv ] )  + ( 1 << ( shiftY – 1 ) ) ) >> shiftY
clipRange = ((reshaper_model_min_bin_idx > 0) && (reshaper_model_max_bin_idx < MaxBinIdx));
Если clipRange равно 1, применяют следующее:
minVal = 16 << (BitDepthY – 8)
maxVal = 235<< (BitDepthY – 8)
invLumaSample = Clip3(minVal, maxVal, invLumaSample)
иначе (clipRange равно 0) применяют следующее:
invLumaSample = ClipCidx1(invLumaSample)
8.5.6.2 Идентификация индекса кусочной функции для компонент яркости
Входными данными этого процесса является значение S выборки яркости.
Выходными данными этого процесса является индекс idxS, идентифицирующий кусок, которому принадлежит выборка S. Переменную idxS получают следующим образом:
for( idxS = 0, idxFound = 0; idxS <= MaxBinIdx; idxS++ ) { if( (S < ReshapePivot [ idxS + 1 ] ) {  idxFound = 1  break }}Следует отметить, что альтернативная реализация для нахождения идентификатора idxS является следующей:
if (S < ReshapePivot [ reshaper_model_min_bin_idx ]) idxS = 0else if (S >= ReshapePivot [ reshaper_model_max_bin_idx ]) idxS = MaxBinIdxelse idxS = findIdx ( S, 0, MaxBinIdx + 1, ReshapePivot [ ] )function idx = findIdx (val, low, high, pivot[ ]) { if ( high – low <= 1 )  idx = low
else {  mid = ( low + high) >> 1  if (val < pivot [mid] )   high = mid   else    low = mid  idx = findIdx (val, low, high, pivot[]) }
}