КОДЕР ВИДЕО, ДЕКОДЕР ВИДЕО И СООТВЕТСТВУЮЩИЕ СПОСОБЫ
VIDEO ENCODER, VIDEO DECODER, AND CORRESPONDING METHODS

ОБЛАСТЬ ТЕХНИКИ, К КОТОРОЙ ОТНОСИТСЯ ИЗОБРЕТЕНИЕ
[0001] Настоящее изобретение в целом относится к кодированию видео и, в частности, относится к гибкой схеме разбиения на тайлы видео (video tiling), которая поддерживает множество тайлов с разными разрешениями в одном и том же изображении.
УРОВЕНЬ ТЕХНИКИ
[0002] Объем видеоданных, необходимых для изображения даже относительно короткого видео, может быть значительным, что может привести к трудностям, когда данные должны передаваться в потоковом режиме или иным образом передаваться по сети связи с ограниченной пропускной способностью. Таким образом, видеоданные обычно сжимаются перед передачей по современным телекоммуникационным сетям. Размер видео также может быть проблемой, когда видео хранится на запоминающем устройстве, поскольку ресурсы памяти могут быть ограничены. Устройства сжатия видео часто используют программное обеспечение и/или оборудование в источнике для кодирования видеоданных перед передачей или хранением, тем самым уменьшая количество данных, необходимых для представления цифровых видеоизображений. Затем сжатые данные принимаются в месте назначения устройством декомпрессии видео, которое декодирует видеоданные. С ограниченными сетевыми ресурсами и постоянно растущими требованиями к более высокому качеству видео желательны улучшенные методы сжатия и декомпрессии, которые улучшают степень сжатия с минимальными потерями в качестве изображения или вообще без них.
СУЩНОСТЬ ИЗОБРЕТЕНИЯ
[0003] В варианте осуществления изобретение включает в себя способ, реализуемый в кодере, причем способ содержит: разделение процессором кодера изображения на множество тайлов первого уровня; разделение процессором подмножества тайлов первого уровня на множество тайлов второго уровня, при этом каждый тайл второго уровня содержит один прямоугольный сегмент данных изображения; кодирование процессором тайлов первого уровня и тайлов второго уровня в поток битов; и сохранение в памяти кодера потока битов для передачи в декодер. Системы кодирования видео могут использовать сегменты и тайлы для разделения изображений. Некоторые потоковые приложения (например, виртуальная реальность (VR, virtual reality) и телеконференции) могут быть улучшены, если можно отправить одно изображение, содержащее множество областей, закодированных с разными разрешениями. Некоторые механизмы разделения на сегменты и тайлы могут не поддерживать такую функциональность, поскольку тайлы с разными разрешениями могут обрабатываться по-разному. Например, тайл с первым разрешением может содержать один сегмент данных, тогда как тайл со вторым разрешением может нести множество сегментов данных из-за различий в плотности пикселей. Согласно аспектам настоящего изобретения используется гибкая схема разбиения на тайлы, включая тайлы первого уровня и тайлы второго уровня. Тайлы второго уровня создаются путем разделения тайлов первого уровня. Эта схема тайлов позволяет тайлу первого уровня содержать один сегмент данных с первым разрешением, и тайл первого уровня, содержащий тайлы второго уровня, содержать множество сегментов со вторым разрешением. Следовательно, раскрытая гибкая схема разбиения на тайлы позволяет кодеру/декодеру (кодеку) поддерживать изображение, содержащее множество разрешений, и, следовательно, увеличивает функциональные возможности как кодера, так и декодера.
[0004] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает тайлы первого уровня за пределами подмножества, которые содержат данные изображения с первым разрешением, и тайлы второго уровня содержат данные изображения со вторым разрешением, отличным от первого разрешения.
[0005] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает каждый элемент тайла первого уровня в подмножестве тайлов первого уровня, который включает в себя два или более полных тайла второго уровня.
[0006] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает дополнительно кодирование процессором данных, указывающих конфигурацию тайлов второго уровня в наборе параметров изображения, связанном с изображением.
[0007] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает конфигурацию тайлов второго уровня, которая сообщается как количество столбцов тайлов второго уровня и количество строк тайлов второго уровня.
[0008] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает данные, явно указывающие количество столбцов тайла второго уровня и количество строк тайла второго уровня, которые исключаются из потока битов, когда ширина тайла первого уровня меньше двукратного. минимального порогового значения ширины, и высота тайла первого уровня меньше двукратного минимального порогового значения высоты.
[0009] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает дополнительно назначение процессором тайлов первого уровня и тайлов второго уровня в одну или более групп тайлов, так что все тайлы в соответствующей группе тайлов ограничены для покрытия прямоугольной части изображения.
[0010] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает дополнительно кодирование процессором указаний разделения, указывающих тайлы первого уровня, которые разделены на тайлы второго уровня, причем указания разделения исключаются из потока битов, когда ширина тайла первого уровня меньше минимального порогового значения ширины, и высота тайла первого уровня меньше минимального порогового значения высоты.
[0011] В варианте осуществления изобретение включает в себя способ, реализуемый в декодере, причем способ содержит: прием процессором декодера через приемник потока битов, включающего изображение, разделенное на множество тайлов первого уровня, причем подмножество тайлов первого уровня дополнительно разделено на множество тайлов второго уровня, и каждый тайл второго уровня содержит один прямоугольный сегмент данных изображения; определение процессором конфигурации тайлов первого уровня и конфигурации тайлов второго уровня на основе параметров, включенных в поток битов; декодирование процессором тайлов первого уровня и тайлов второго уровня на основе конфигурации тайлов первого уровня и конфигурации тайлов второго уровня; и формирование процессором реконструированной видеопоследовательности для отображения на основе декодированных тайлов первого уровня и тайлов второго уровня. Системы кодирования видео могут использовать сегменты и тайлы для разделения изображений. Некоторые потоковые приложения (например, VR, virtual reality и телеконференции) можно улучшить, если можно отправить одно изображение, содержащее множество областей, закодированных с разными разрешениями. Некоторые механизмы разделения на сегменты и тайлы могут не поддерживать такую функциональность, поскольку тайлы с разными разрешениями могут обрабатываться по-разному. Например, тайл с первым разрешением может содержать один сегмент данных, тогда как тайл со вторым разрешением может содержать множество сегментов данных из-за различий в плотности пикселей. Настоящие аспекты используют гибкую схему разбиения на тайлы, включая тайлы первого уровня и тайлы второго уровня. Тайлы второго уровня создаются путем разделения тайлов первого уровня. Эта схема тайлов позволяет тайлу первого уровня содержать один сегмент данных с первым разрешением, и тайл первого уровня, содержащий тайлы второго уровня, содержать множество сегментов со вторым разрешением. Следовательно, раскрытая гибкая схема разбиения на тайлы позволяет кодеку поддерживать изображение, содержащее множество разрешений, и, следовательно, увеличивает функциональные возможности как кодера, так и декодера.
[0012] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает тайлы первого уровня за пределами подмножества, которые содержат данные изображения с первым разрешением, и тайлы второго уровня содержат данные изображения со вторым разрешением, отличным от первого разрешения.
[0013] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает каждый тайл первого уровня в подмножестве тайлов первого уровня, который включает в себя два или более полных тайла второго уровня.
[0014] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает дополнительно получение процессором данных, указывающих конфигурацию тайлов второго уровня, из набора параметров изображения, связанного с изображением.
[0015] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает конфигурацию тайлов второго уровня, которая сообщается как количество столбцов тайлов второго уровня и количество строк тайлов второго уровня.
[0016] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает данные, явно указывающие количество столбцов тайла второго уровня и количество строк тайла второго уровня, которые исключаются из потока битов, когда ширина тайла первого уровня меньше двукратного минимального порогового значения ширины, и высота тайла первого уровня меньше двукратного минимального порогового значения высоты.
[0017] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает тайлы первого уровня и тайлы второго уровня, которые назначаются в одну или более групп тайла, так что все тайлы в соответствующей группе тайлов ограничены для покрытия прямоугольной части картины.
[0018] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает дополнительно получение процессором указаний разделения, указывающих тайлы первого уровня, которые разделены на тайлы второго уровня, причем указания разделения исключаются из потока битов, когда ширина тайла первого уровня меньше минимального порогового значения ширины, и высота тайла первого уровня меньше минимального порогового значения высоты.
[0019] В варианте осуществления изобретение включает в себя устройство кодирования видео, содержащее: процессор, приемник, связанный с процессором, и передатчик, связанный с процессором, при этом процессор, приемник и передатчик, выполнены с возможностью выполнения способа по любому из предшествующих аспектов.
[0020] В варианте осуществления изобретение включает в себя некратковременный считываемый компьютером носитель, содержащий компьютерный программный продукт для использования устройством кодирования видео, причем компьютерный программный продукт содержит выполняемые компьютером инструкции, хранящиеся на некратковременном считываемом компьютером носителе, так что при выполнении процессор предписывает устройству кодирования видео выполнять способ по любому из предшествующих аспектов.
[0021] В варианте осуществления изобретение включает в себя кодер, содержащий: средство разделения для: разделения изображения на множество тайлов первого уровня; и разделение подмножества тайлов первого уровня на множество тайлов второго уровня, при этом каждый тайл второго уровня содержит один прямоугольный сегмент данных изображения; средство кодирования для кодирования тайлов первого уровня и тайлов второго уровня в поток битов; и средство хранения для хранения потока битов для передачи в декодер.
[0022] Необязательно, в любом из предыдущих аспектов, другая реализация аспекта обеспечивает кодер дополнительно выполнен с возможностью выполнения способа по любому из предыдущих аспектов.
[0023] В варианте осуществления изобретение включает в себя декодер, содержащий: средство приема для приема потока битов, включающего в себя изображение, разделенное на множество тайлов первого уровня, при этом подмножество тайлов первого уровня дополнительно разделено на множество тайлов второго уровня, и при этом каждый тайл второго уровня содержит один прямоугольный сегмент данных изображения; средство определения для определения конфигурации тайлов первого уровня и конфигурации тайлов второго уровня на основе параметров, включенных в поток битов; средство декодирования для декодирования тайлов первого уровня и тайлов второго уровня на основе конфигурации тайлов первого уровня и конфигурации тайлов второго уровня; и средство формирования для формирования реконструированной видеопоследовательности для отображения на основе декодированных тайлов первого уровня и тайлов второго уровня.
[0024] Необязательно, в любом из предшествующих аспектов, другая реализация аспекта обеспечивает декодер дополнительно выполнен с возможностью выполнения способа по любому из предыдущих аспектов.
[0025] Для ясности любой из вышеупомянутых вариантов осуществления изобретения может быть объединен с любым одним или несколькими другими вышеупомянутыми вариантами осуществления изобретения, чтобы создать новый вариант осуществления в пределах объема настоящего изобретения.
[0026] Эти и другие особенности будут более понятны из следующего подробного описания, рассматриваемого вместе с сопроводительными чертежами и формулой изобретения.
КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ
[0027] Для более полного понимания этого изобретения дана ссылка на следующее краткое описание ввиду сопроводительных чертежей и подробное описание, в котором одинаковые ссылочные номера представляют одинаковые части.
[0028] Фиг. 1 - блок-схема примерного способа кодирования видеосигнала.
[0029] Фиг. 2 - схематическая диаграмма примерной системы кодирования и декодирования (кодека) для кодирования видео.
[0030] Фиг. 3 - схематическая диаграмма, иллюстрирующая пример видеокодера.
[0031] Фиг. 4 - схематическая диаграмма, иллюстрирующая пример видеодекодера.
[0032] Фиг. 5 - схематическая диаграмма, иллюстрирующая примерный поток битов, содержащий кодированную видеопоследовательность.
[0033] Фиг. 6A-6E иллюстрируют примерный механизм для создания дорожки экстрактора для объединения под-изображений с множеством разрешений из разных потоков битов в одно изображение для использования в приложениях виртуальной реальности (VR, virtual reality).
[0034] Фиг.7 иллюстрирует пример приложения видеоконференцсвязи, которое объединяет изображения с множеством разрешений из разных потоков битов в одно изображение для отображения.
[0035] Фиг. 8A-8B - схематические диаграммы, иллюстрирующие пример гибкой схемы разбиения на тайлы видео, обеспечивающей поддержку множества тайлов с разными разрешениями в одном и том же изображении.
[0036] Фиг. 9 - схематическая диаграмма примерного устройства кодирования видео.
[0037] Фиг. 10 - блок-схема примерного способа кодирования изображения с использованием гибкой схемы разбиения на тайлы.
[0038] Фиг. 11 - блок-схема примерного способа декодирования изображения с использованием гибкой схемы разбиения на тайлы.
[0039] Фиг. 12 - схематическая диаграмма примерной системы для кодирования видеопоследовательности с использованием гибкой схемы разбиения на тайлы.
ОПИСАНИЕ ВАРИАНТОВ ОСУЩЕСТВЛЕНИЯ ИЗОБРЕТЕНИЯ
[0040] Вначале следует понимать, что хотя иллюстративная реализация одного или более вариантов осуществления изобретения приведена ниже, раскрытые системы и/или способы могут быть реализованы с использованием любого количества методов, известных в настоящее время или существующих. Изобретение никоим образом не должно ограничиваться иллюстративными реализациями, чертежами и технологиями, проиллюстрированными ниже, включая иллюстративные конструкции и реализации, проиллюстрированные и описанные здесь, но может быть изменено в пределах объема прилагаемой формулы изобретения вместе с полным объемом их эквивалентов.
[0041] Здесь используются различные сокращения, такие как блок дерева кодирования (CTB, coding tree block), блок дерева кодирования (CTU, coding tree unit), блок кодирования (CU, coding unit), кодированная видеопоследовательность (CVS, coded video sequence), объединенная команда видео-экспертов (JVET, Joint Video Experts Team), набор тайлов с ограничением движения (MCTS, motion constrained tile set), блок максимальной передачи (MTU, maximum transfer unit), уровень сетевой абстракции (NAL, network abstraction layer), счетчик порядка изображений (POC, picture order count), полезная нагрузка последовательности необработанных битов (RBSP, raw byte sequence payload), набор параметров последовательности (SPS, sequence parameter set), универсальное кодирование видео (VVC, versatile video coding) и рабочий проект (WD, working draft).
[0042] Для уменьшения размера видеофайлов с минимальной потерей данных можно использовать многие методы сжатия видео. Например, методы сжатия видео могут включать в себя выполнение пространственного (например, внутрикадрового) прогнозирования и/или временного (например, межкадрового) прогнозирования для уменьшения или удаления избыточности данных в видеопоследовательностях. Для блочного кодирования видео сегмент видео (например, видеоизображение или часть видеоизображения) может быть разделен на видеоблоки, которые также могут называться древовидными блоками, блоками дерева кодирования (CTB), блоками дерева кодирования (CTU), блоками кодирования (CU) и/или узлами кодирования. Видеоблоки в интракодированном (I) сегменте изображения кодируются с использованием пространственного прогнозирования относительно опорных выборок в соседних блоках в одном и том же изображении. Видеоблоки в сегменте изображения с однонаправленным прогнозированием (P) или двунаправленным прогнозированием (B) с межкадровым кодированием можно кодировать, используя пространственное прогнозирование относительно опорных выборок в соседних блоках в одном и том же изображении или временное прогнозирование относительно опорных выборок в другие опорные изображения. Изображения могут называться кадрами и/или изображениями, а опорные изображения могут называться опорными кадрами и/или опорными изображениями. Пространственное или временное прогнозирование приводит к блоку прогнозирования, представляющему блок изображения. Остаточные данные представляют собой пиксельные различия между блоком исходного изображения и блоком прогнозирования. Соответственно, интракодированный блок кодируется согласно вектору движения, который указывает на блок опорных выборок, образующих блок прогнозирования, и остаточные данные, указывающие разницу между кодированным блоком и блоком прогнозирования. Интракодированный блок кодируется в соответствии с режимом интракодирования и остаточными данными. Для дальнейшего сжатия остаточные данные могут быть преобразованы из области пикселей в область преобразования. В результате получаются остаточные коэффициенты преобразования, которые можно квантовать. Квантованные коэффициенты преобразования могут изначально быть расположены в двумерном массиве. Квантованные коэффициенты преобразования могут сканироваться для создания одномерного вектора коэффициентов преобразования. Для достижения еще большего сжатия может применяться энтропийное кодирование. Такие методы сжатия видео обсуждаются более подробно ниже.
[0043] Чтобы обеспечить точное декодирование закодированного видео, видео кодируется и декодируется согласно соответствующим стандартам кодирования видео. Стандарты кодирования видео включают в себя Сектор Стандартизации Международного Союза Электросвязи (ITU, International Telecommunication Union) (ITU-T) H.261, Международную Организацию по Стандартизации/Международную Электротехническую Комиссию (ISO/IEC, International Organization for Standardization/ International Electrotechnical Commission), Группу Экспертов по Кинематографии стандарт сжатия движущихся видеоизображений (MPEG, Motion Picture Experts Group) -1 Часть 2, ITU-T H.262 или ISO/IEC MPEG-2 Part 2, ITU-T H.263, ISO/IEC MPEG-4 Part 2, стандарт усовершенствованного кодирования видео(AVC, Advanced Video Coding), также известный как ITU-T H.264 или ISO/IEC MPEG - 4, часть 10, и стандарт высокоэффективного кодирования видео (HEVC, High Efficiency Video Coding), также известное как ITU-T H.265 или MPEG-H, часть 2. AVC включает такие расширения, как масштабируемое кодирование видео (SVC, Scalable Video Coding), кодирование видео с множественными ракурсами (MVC, Multiview Video Coding) и кодирование видео с множественными ракурсами плюс глубина (MVC+D, Multiview Video Coding plus Depth) и трехмерное (3D, three dimensional) AVC (3D-AVC). HEVC включает в себя такие расширения, как масштабироемое HEVC (SHVC, Scalable High Efficiency Video Coding), HEVC с множественными ракурсами (MV-HEVC, Multiview- High Efficiency Video Coding) и 3D HEVC (3D-HEVC, three dimensional High Efficiency Video Coding). Совместная группа экспертов по видео (JVET) ITU-T и ISO/IEC приступила к разработке стандарта кодирования видео, называемого универсальным кодированием видео (VVC, Versatile Video Coding). VVC включен в рабочий проект (WD, Working Draft), который включает JVET-L1001-v5.
[0044] Чтобы закодировать видеоизображение, изображение сначала делится, и эти разделения кодируются в поток битов. Доступны различные схемы разделения изображения. Например, изображение можно разделить на обычные сегменты, зависимые сегменты, тайлы и/или в соответствии с параллельной обработкой волнового фронта (WPP, Wavefront Parallel Processing). Для простоты HEVC ограничивает кодеры, так что при разделении сегмента на группы CTB для кодирования видео можно использовать только обычные сегменты, зависимые сегменты, тайлы, WPP и их комбинации. Такое разделение может применяться для поддержки согласования размера блока максимальной передачи (MTU, Maximum Transfer Unit), параллельной обработки и уменьшения сквозной задержки. MTU обозначает максимальный объем данных, который может быть передан в одном пакете. Если полезная нагрузка пакета превышает MTU, эта полезная нагрузка разделяется на два пакета посредством процесса, называемого фрагментацией.
[0045] Обычный сегмент, также называемый просто сегментом, представляет собой разделенную часть изображения, которая может быть восстановлена независимо от других обычных сегментов в пределах того же изображения, несмотря на некоторые взаимозависимости из-за операций петлевой фильтрации. Каждый обычный сегмент инкапсулируется в свой собственный блок уровня сетевой абстракции (NAL) для передачи. Кроме того, прогнозирование в картинке (прогнозирование внутри выборки, прогнозирование информации о движении, прогнозирование режима кодирования) и зависимость энтропийного кодирования по границам сегмента могут быть отключены для поддержки независимого реконструирования. Такая независимая реконструкция поддерживает распараллеливание. Например, обычное распараллеливание на основе сегментов требует минимального межпроцессорного или межъядерного взаимодействия. Однако, поскольку каждый обычный сегмент независим, каждый сегмент связан с отдельным заголовком сегмента. Использование обычных сегментов может привести к значительным накладным расходам на кодирование из-за битовой стоимости заголовка сегмента для каждого сегмента и из-за отсутствия прогнозирования через границы сегмента. Кроме того, для поддержки соответствия требованиям размера MTU могут использоваться обычные сегменты. В частности, поскольку обычный сегмент инкапсулирован в отдельный блок NAL и может быть независимо закодирован, каждый обычный сегмент должен быть меньше, чем MTU в схемах MTU, чтобы избежать разделения сегмента на множество пакетов. Таким образом, цель распараллеливания и цель согласования размера MTU могут предъявлять противоречивые требования к слою сегмента в изображении.
[0046] Зависимые сегменты похожи на обычные сегменты, но имеют укороченные заголовки сегментов и позволяют разделить границы древовидного блока изображения без нарушения прогнозирования в картинке. Соответственно, зависимые сегменты позволяют фрагментировать обычный сегмент на множество блоков NAL, что обеспечивает уменьшенную сквозную задержку, позволяя отправить часть обычного сегмента до завершения кодирования всего обычного сегмента.
[0047] Тайл - это разделенная часть изображения, созданная горизонтальными и вертикальными границами, которые образуют столбцы и строки тайлов. Тайлы можно кодировать в порядке растрового сканирования (справа налево и сверху вниз). Порядок сканирования CTB является локальным внутри тайла. Соответственно, CTB в первом тайле кодируются в порядке растрового сканирования перед переходом к CTB в следующем тайле. Подобно обычным сегментам, тайлы разрушают зависимости прогнозирования в картинке, а также зависимости энтропийного декодирования. Однако тайлы не могут быть включены в отдельные блоки NAL, и, следовательно, тайлы нельзя использовать для согласования размера MTU. Каждый тайл может обрабатываться одним процессором/ядром, и межпроцессорная/межъядерная связь, используемая для прогнозирования в картинке между блоками обработки, декодирующими соседние тайлы, может быть ограничена передачей общего заголовка сегмента (когда соседние тайлы находятся в одном и том же сегменте) и выполнение совместного использования реконструированных выборок и метаданных, связанных с петлевой фильтрацией. Когда в сегмент включено более одного тайла, смещение точки входа байта для каждого тайла, отличное от смещения первой точки входа в сегменте, может сообщаться в заголовке сегмента. Для каждого сегмента и тайла должно выполняться по меньшей мере одно из следующих условий: 1) все кодированные древовидные блоки в сегменте принадлежат одному и тому же тайлу; и 2) все кодированные древовидные блоки в тайле принадлежат одному и тому же сегменту.
[0048] В WPP изображение разбивается на отдельные строки CTB. Механизмы энтропийного декодирования и прогнозирования могут использовать данные из CTB в других строках. Параллельная обработка стала возможной благодаря параллельному декодированию строк CTB. Например, текущая строка может быть декодирована параллельно с предыдущей строкой. Однако декодирование текущей строки задерживается по сравнению с процессом декодирования предыдущих строк двумя CTB. Эта задержка гарантирует, что данные, относящиеся к CTB выше и CTB выше и справа от текущего CTB в текущей строке, будут доступны до того, как текущий CTB будет закодирован. Этот подход выглядит как волновой фронт при графическом представлении. Этот поэтапный запуск позволяет распараллеливать столько процессоров/ядер, сколько изображение содержит строки CTB. Поскольку прогнозирование в картинке между соседними строками древовидного блока в картинке разрешено, межпроцессорная/межъядерная связь для обеспечения прогнозирования в картинке может быть существенной. При разделении WPP учитываются размеры блоков NAL. Следовательно, WPP не поддерживает сопоставление размера MTU. Однако обычные сегменты могут использоваться в сочетании с WPP с определенными накладными расходами на кодирование для реализации согласования размера MTU по желанию.
[0049] Тайлы также могут включать в себя наборы тайлов с ограничением движения. Набор тайлов с ограничением движения (MCTS) - это набор тайлов, разработанный таким образом, что связанные векторы движения ограничиваются указанием на местоположения полной выборки внутри MCTS и на местоположения с частичной выборкой, которые требуют только местоположения полной выборки внутри MCTS для интерполяции. Кроме того, запрещается использование кандидатов вектора движения для временного прогнозирования вектора движения, полученного из блоков за пределами MCTS. Таким образом, каждый MCTS может быть независимо декодирован без наличия тайлов, не включенных в MCTS. Сообщения временной дополнительной расширенной информации (SEI, supplemental enhancement information) MCTS могут использоваться для указания наличия MCTS в потоке битов и сообщения MCTS. Сообщение SEI MCTS предоставляет дополнительную информацию, которая может использоваться при извлечении подпотока битов MCTS (заданного как часть семантики сообщения SEI), чтобы сформировать соответствующий поток битов для MCTS. Информация включает в себя число наборов информации для извлечения, каждый из которых определяет число MCTS и содержит биты полезной нагрузки последовательности необработанных битов (RBSP), биты замещающих наборов параметров видео (VPS), наборы параметров последовательности (SPS) и наборы параметров изображения (PPS) для использования в процессе извлечения подпотока битов MCTS. При извлечении подпотока битов в соответствии с процессом извлечения подпотока MCTS наборы параметров (VPS, SPS и PPS) могут быть переписаны или заменены, а заголовки сегментов могут быть обновлены, поскольку один или все элементы синтаксиса, связанные с адресом сегмента( включая first_slice_segment_in_pic_flag и slice_segment_address) могут использовать разные значения в извлеченном подпотоке битов.
[0050] При разделении изображения для дальнейшего кодирования могут использоваться различные схемы тайлов. В качестве конкретного примера тайлы могут быть назначены группам тайлов, которые в некоторых примерах могут занимать место сегментов. В некоторых примерах каждая группа тайлов может быть извлечена независимо от других групп тайлов. Соответственно, группирование тайлов может поддерживать распараллеливание, позволяя назначать каждую группу тайлов разному процессору. Группирование тайлов также можно использовать в случаях, когда декодер может не захотеть декодировать все изображение. В качестве конкретного примера схемы кодирования видео могут использоваться для поддержки видео виртуальной реальности (VR, virtual reality), которое может быть закодировано в соответствии с форматом всенаправленного мультимедийного приложения (OMAF, Omnidirectional Media Application Format).
[0051] В видео VR одна или более камер могут записывать окружающую среду вокруг камеры (камер). Затем пользователь может просматривать видео VR, как если бы пользователь находился в том же месте, что и камера. В видео VR изображение охватывает всю среду вокруг пользователя. Затем пользователь просматривает часть изображения. Например, пользователь может использовать закрепленный на голове дисплей, который изменяет часть отображаемого изображения на основе движений головы пользователя. Часть отображаемого видео может называться областью просмотра.
[0052] Соответственно, отличительной особенностью всенаправленного видео является то, что в любой конкретный момент времени отображается только область просмотра. Это отличается от других видеоприложений, которые могут отображать видео целиком. Эта функция может использоваться для повышения производительности всенаправленных видеосистем, например, посредством выборочной доставки в зависимости от области просмотра пользователя (или любых других критериев, таких как рекомендованные метаданные с синхронизацией области просмотра). Доставка, зависящая от области просмотра, может быть разрешена, например, путем использования пакетирования по регионам и/или кодирования видео в зависимости от области просмотра. Улучшение производительности может привести к меньшей ширине полосы передачи, меньшей сложности декодирования или и к тому, и к другому по сравнению с другими всенаправленными видеосистемами при использовании того же разрешения/качества видео.
[0053] Примером операции, зависящей от области просмотра, является основанный на MCTS подход для достижения разрешения пяти тысяч выборок (например, 5120 × 2560 выборок яркости) разрешение (5K) эффективного равнопрямоугольного проекционного разрешения (ERP, equirectangle projection) с зависимым от области просмотра профилем видео OMAF на основе HEVC. Этот подход более подробно описан ниже. Но обычно этот подход разделяет видео VR на группы тайлов и кодирует видео с множеством разрешений. Декодер может указать область просмотра, которая в настоящее время используется пользователем во время потоковой передачи. Видеосервер, предоставляющий видеоданные VR, может затем пересылать группу (-ы) тайлов, связанную с областью просмотра, с высоким разрешением и пересылать непросматриваемые группы тайлов с более низким разрешением. Это позволяет пользователю просматривать видео VR с высоким разрешением, не требуя отправки всего изображения с высоким разрешением. Непросмотренные части отбрасываются, и, следовательно, пользователь может не знать о более низких разрешениях. Однако группы тайлов с более низким разрешением могут отображаться пользователю, если пользователь меняет области просмотра. Затем разрешение новой области просмотра может быть увеличено по мере продвижения видео. Для реализации такой системы должны быть созданы изображения, содержащие как группы тайлов с более высоким разрешением, так и группы тайлов с более низким разрешением.
[0054] В другом примере приложения видеоконференцсвязи могут быть разработаны для пересылки изображений с множеством разрешений. Например, видеоконференция может включать множество участников. Говорящий в данный момент участник может отображаться с более высоким разрешением, а другие участники могут отображаться с более низким разрешением. Для реализации такой системы должны быть созданы изображения, которые содержат как группы тайлов с более высоким разрешением, так и группы тайлов с более низким разрешением.
[0055] В данном документе раскрыты различные гибкие механизмы тайлов для поддержки создания изображения с под-изображениями, закодированными с множеством разрешений. Например, видео можно кодировать с множеством разрешений. Видео также можно кодировать, используя сегменты в каждом разрешении. Сегменты с более низким разрешением меньше сегментов с более высоким разрешением. Чтобы создать изображение с несколькими разрешениями, изображение можно разделить на тайлы первого уровня. Сегменты самого высокого разрешения могут быть включены непосредственно в тайлы первого уровня. Кроме того, тайлы первого уровня могут быть разделены на тайлы второго уровня, которые меньше тайлов первого уровня. Соответственно, меньшие тайлы второго уровня могут напрямую принимать сегменты с более низким разрешением. Таким образом, сегменты из каждого разрешения могут быть сжаты в единое изображение через взаимосвязь индексов тайла без необходимости динамической переадресации тайлов с различным разрешением для использования согласованной схемы адресации. Тайлы первого уровня и тайлы второго уровня могут быть реализованы как MCTS и, следовательно, могут принимать данные изображения с ограничением движения с различными разрешениями. Настоящее изобретение включает в себя множество аспектов. В качестве конкретного примера тайлы первого уровня разделяются на тайлы второго уровня. Затем тайлы второго уровня ограничиваются тем, чтобы каждый содержал один прямоугольный сегмент данных изображения (например, с меньшим разрешением). Используемый здесь тайл - это разделенная часть изображения, созданная горизонтальными и вертикальными границами (например, согласно столбцам и строкам). Прямоугольный сегмент - это сегмент, ограниченный для сохранения прямоугольной формы, и, следовательно, кодируется на основе горизонтальных и вертикальных границ изображения. Соответственно, прямоугольный сегмент не кодируется на основе группы растрового сканирования (которая содержит CTU в строке слева направо и сверху вниз и может не поддерживать прямоугольную форму). Сегмент (slice) - это пространственно отличная область изображения/кадра, которая кодируется отдельно от любой другой области в том же кадре/изображении.
[0056] Фиг. 1 является блок-схемой примерного рабочего способа 100 кодирования видеосигнала. В частности, видеосигнал кодируется в кодере. Процесс кодирования сжимает видеосигнал, используя различные механизмы для уменьшения размера видеофайла. Меньший размер файла позволяет передавать сжатый видеофайл пользователю, уменьшая при этом накладные расходы на полосу пропускания. Затем декодер декодирует сжатый видеофайл, чтобы восстановить исходный видеосигнал для отображения конечному пользователю. Процесс декодирования обычно отражает процесс кодирования, чтобы декодер мог последовательно восстанавливать видеосигнал.
[0057] На этапе 101 видеосигнал вводится в кодер. Например, видеосигнал может быть несжатым видеофайлом, хранящимся в памяти. В качестве другого примера видеофайл может быть захвачен устройством видеозахвата, например, видеокамерой, и закодирован для поддержки потоковой передачи видео в реальном времени. Видеофайл может включать в себя как аудиокомпонент, так и видеокомпонент. Компонент видео содержит серию кадров изображения, которые при просмотре в последовательности создают визуальное впечатление движения. Кадры содержат пиксели, которые выражаются в понятиях света, называемых здесь компонентами яркости (или выборками яркости), и цветом, который упоминается как компоненты цветности (или образцы цвета). В некоторых примерах кадры могут также содержать значения глубины для поддержки трехмерного просмотра.
[0058] На этапе 103 видео разделяется на блоки. Разделение включает в себя разделение пикселей в каждом кадре на квадратные и/или прямоугольные блоки для сжатия. Например, при высокоэффективном кодировании видео (HEVC) (также известном как H.265 и MPEG-H, часть 2) кадр сначала можно разделить на блоки дерева кодирования (CTU), которые представляют собой блоки определенного размера (например, шестьдесят -четыре пикселя на шестьдесят четыре пикселя). Блоки CTU содержат образцы яркости и цветности. Деревья кодирования могут использоваться для разделения CTU на блоки, а затем рекурсивно разделять блоки до тех пор, пока не будут достигнуты конфигурации, поддерживающие дальнейшее кодирование. Например, компоненты яркости кадра могут быть подразделены до тех пор, пока отдельные блоки не будут содержать относительно однородные значения освещения. Кроме того, компоненты цветности кадра могут быть подразделены до тех пор, пока отдельные блоки не будут содержать относительно однородные значения цвета. Соответственно, механизмы разделения меняются в зависимости от содержимого видеокадров.
[0059] На этапе 105 используются различные механизмы сжатия для сжатия блоков изображения, разделенных на этапе 103. Например, может использоваться межкадровое прогнозирование и/или внутрикадровое прогнозирование. Межкадровое прогнозирование предназначено для использования того факта, что объекты в общей сцене имеют тенденцию появляться в последовательных кадрах. Соответственно, блок, изображающий объект в опорном кадре, не нужно повторно описывать в соседних кадрах. В частности, объект, такой как таблица, может оставаться в постоянной позиции на протяжении множества кадров. Следовательно, таблица описывается один раз, и соседние кадры могут относиться к опорному кадру. Механизмы сопоставления с образцом могут использоваться для сопоставления объектов во множестве кадрах. Кроме того, движущиеся объекты могут быть представлены во множестве кадрах, например, из-за движения объекта или движения камеры. В качестве конкретного примера видео может показывать автомобиль, который движется по экрану в течение множества кадров. Векторы движения могут использоваться для описания такого движения. Вектор движения - это двумерный вектор, который обеспечивает смещение от координат объекта в кадре до координат объекта в опорном кадре. По существу, межкадровое прогнозирование может кодировать блок изображения в текущем кадре как набор векторов движения, указывающих смещение от соответствующего блока в опорном кадре.
[0060] Внутрикадровое прогнозирование кодирует блоки в общем кадре. Внутрикадровое прогнозирование использует тот факт, что компоненты яркости и цветности имеют тенденцию группироваться в кадре. Например, участок зеленого цвета на части дерева имеет тенденцию располагаться рядом с аналогичными участками зеленого цвета. Внутрикадровое прогнозирование использует множество режимов направленного прогнозирования (например, тридцать три в HEVC), планарный режим и режим постоянного тока (DC, direct current). Направленные режимы указывают, что текущий блок подобен/совпадает с выборками соседнего блока в соответствующем направлении. Планарный режим указывает, что последовательность блоков вдоль строки/столбца (например, плоскости) может быть интерполирована на основе соседних блоков на краях строки. Фактически, планарный режим указывает на плавный переход света/цвета по строке/столбцу за счет использования относительно постоянного наклона при изменении значений. Режим DC используется для сглаживания границ и указывает, что блок подобен/совпадает со средним значением, связанным с выборками всех соседних блоков, связанных с угловыми направлениями режимов направленного прогнозирования. Соответственно, блоки внутрикадрового прогнозирования могут представлять блоки изображения как различные значения режима реляционного прогнозирования вместо фактических значений. Кроме того, блоки межкадрового прогнозирования могут представлять блоки изображения как значения вектора движения вместо фактических значений. В любом случае блоки прогнозирования могут не точно представлять блоки изображения в некоторых случаях. Любые отличия хранятся в остаточных блоках. К остаточным блокам могут применяться преобразования для дальнейшего сжатия файла.
[0061] На этапе 107 могут применяться различные методы фильтрации. В HEVC фильтры применяются в соответствии со схемой внутриконтурной фильтрации. Обсуждаемое выше прогнозирование на основе блоков может привести к созданию блочных изображений в декодере. Кроме того, схема прогнозирования на основе блоков может кодировать блок, а затем восстанавливать кодированный блок для последующего использования в качестве опорного блока. Схема внутриконтурной фильтрации итеративно применяет фильтры подавления шума, деблокирующие фильтры, адаптивные контурные фильтры и фильтры с адаптивным смещением выборки (SAO, sample adaptive offset) к блокам/кадрам. Эти фильтры уменьшают такие артефакты блокировки, чтобы можно было точно восстановить закодированный файл. Кроме того, эти фильтры уменьшают артефакты в реконструированных опорных блоках, так что артефакты с меньшей вероятностью создают дополнительные артефакты в последующих блоках, которые кодируются на основе реконструированных опорных блоков.
[0062] После того, как видеосигнал разделен, сжат и отфильтрован, полученные данные кодируются в потоке битов на этапе 109. Поток битов включает в себя данные, описанные выше, а также любые данные сигналов, необходимые для поддержки надлежащего реконструирования видеосигнала в декодере. Например, такие данные могут включать в себя данные раздела, данные прогнозирования, остаточные блоки и различные флаги, предоставляющие инструкции кодирования для декодера. Поток битов может храниться в памяти для передачи декодеру по запросу. Поток битов также может быть широковещательным и/или многоадресным для множества декодеров. Создание потока битов - это итеративный процесс. Соответственно, этапы 101, 103, 105, 107 и 109 могут происходить непрерывно и/или одновременно во многих кадрах и блоках. Порядок, показанный на фиг. 1 представлен для ясности и простоты обсуждения и не предназначен для ограничения процесса кодирования видео конкретным порядком.
[0063] Декодер принимает поток битов и начинает процесс декодирования на этапе 111. В частности, декодер использует схему энтропийного декодирования для преобразования потока битов в соответствующий синтаксис и видеоданные. Декодер использует данные синтаксиса из потока битов для определения разделений для кадров на этапе 111. Разделение должно соответствовать результатам разделения блока на этапе 103. Теперь описывается энтропийное кодирование/декодирование, используемое на этапе 111. Кодер делает множество вариантов во время процесса сжатия, например, выбирает схемы разделения на блоки из нескольких возможных вариантов на основе пространственного позиционирования значений во входном изображении (-ях). Для передачи сигналов о точном выборе может использоваться большое количество ячеек. В данном контексте бин - это двоичное значение, которое обрабатывается как переменная (например, битовое значение, которое может варьироваться в зависимости от контекста). Энтропийное кодирование позволяет кодеру отбросить любые параметры, которые явно не подходят для конкретного случая, оставив набор допустимых вариантов. Затем каждому допустимому варианту присваивается кодовое слово. Длина кодовых слов основана на количестве допустимых опций (например, одна ячейка для двух вариантов, две ячейки для трех-четырех вариантов и т. д.) Затем кодер кодирует кодовое слово для выбранной опции. Эта схема уменьшает размер кодовых слов, поскольку кодовые слова настолько велики, насколько желательно, чтобы однозначно указать выбор из небольшого подмножества допустимых вариантов, в отличие от однозначного указания выбора из потенциально большого набора всех возможных вариантов. Затем декодер декодирует выбор, определяя набор допустимых опций аналогично кодеру. Определив набор допустимых опций, декодер может прочитать кодовое слово и определить выбор, сделанный кодером.
[0064] На этапе 113 декодер выполняет декодирование блоков. В частности, декодер использует обратное преобразование для формирования остаточных блоков. Затем декодер использует остаточные блоки и соответствующие блоки прогнозирования для реконструирования блоков изображения в соответствии с разделением. Блоки прогнозирования могут включать в себя как блоки внутрикадрового прогнозирования, так и блоки межкадрового прогнозирования, сформированные в кодере на этапе 105. Затем блоки реконструированного изображения размещаются в кадрах реконструированного видеосигнала в соответствии с данными разделения, определенными на этапе 111. Синтаксис для этапа 113 также может быть передан в потоке битов посредством энтропийного кодирования, как описано выше.
[0065] На этапе 115 выполняется фильтрация кадров реконструированного видеосигнала аналогично этапу 107 в кодере. Например, фильтры подавления шума, фильтры деблокирования, адаптивные петлевые фильтры и фильтры SAO могут применяться к кадрам для удаления артефактов блокировки. После фильтрации кадров видеосигнал может выводиться на дисплей на этапе 117 для просмотра конечным пользователем.
[0066] Фиг. 2 является схематической диаграммой примерной системы 200 кодирования и декодирования (кодека) для кодирования видео. В частности, система 200 кодеков обеспечивает функциональные возможности для поддержки реализации способа 100 работы. Система 200 кодека обобщена для изображения компонентов, используемых как в кодере, так и в декодере. Система 200 кодека принимает и разделяет видеосигнал, как описано в отношении этапов 101 и 103 в способе работы 100, что приводит к разделенному видеосигналу 201. Система 200 кодека затем сжимает разделенный видеосигнал 201 в кодированный поток битов, действуя в качестве кодера, как описано в отношении этапов 105, 107 и 109 в способе 100. При работе в качестве декодера система 200 кодеков формирует выходной видеосигнал из потока битов, как описано в отношении этапов 111, 113, 115 и 117 в способе работы 100. Система 200 кодека включает в себя компонент 211 общего управления кодером, компонент 213 преобразования масштабирования и квантования, компонент 215 внутрикадровой оценки, компонент 217 внутрикадрового прогнозирования, компонент 219 компенсации движения, компонент 221 оценки движения, компонент 229 масштабирования и обратного преобразования, компонент 227 анализа управления фильтром, компонент 225 внутриконтурных фильтров, компонент 223 буфера декодированных изображений и компонент 231 форматирования заголовка и контекстно-адаптивного двоичного арифметического кодирования (CABAC, context adaptive binary arithmetic coding). Такие компоненты соединяются, как показано на фиг. 2 черные линии указывают перемещение данных, подлежащих кодированию/декодированию, а пунктирные линии указывают перемещение данных управления, которые управляют работой других компонентов. Все компоненты системы 200 кодека могут присутствовать в кодере. Декодер может включать в себя подмножество компонентов системы 200 кодеков. Например, декодер может включать в себя компонент 217 внутрикадрового прогнозирования, компонент 219 компенсации движения, компонент 229 масштабирования и обратного преобразования, компонент 225 внутриконтурных фильтров и компонент 223 буфера декодированных изображений. Эти компоненты теперь описаны.
[0067] Разделенный видеосигнал 201 представляет собой захваченную видеопоследовательность, которая была разделена на блоки пикселей посредством дерева кодирования. Дерево кодирования использует различные режимы разделения для разделения блока пикселей на более мелкие блоки пикселей. Эти блоки затем можно разделить на более мелкие блоки. Блоки могут называться узлами в дереве кодирования. Более крупные родительские узлы разделяются на более мелкие дочерние узлы. Количество раз, когда узел делится на подразделения, называется глубиной дерева узлов/кодирования. В некоторых случаях разделенные блоки могут быть включены в блоки кодирования (CU). Например, CU может быть частью CTU, которая содержит блок яркости, блок(-и) цветности красного (Cr) и блок(-и) синего сигнала цветности (Cb) вместе с соответствующими инструкциями синтаксиса для CU. Режимы разделения могут включать в себя двоичное дерево (BT, binary tree), тройное дерево (TT, triple tree) и квадратное дерево (QT, quad tree), используемые для разделения узла на два, три или четыре дочерних узла, соответственно, различной формы в зависимости от применяемых режимов разделения. Разделенный видеосигнал 201 пересылается в компонент 211 общего управления кодером, компонент 213 преобразования масштабирования и квантования, компонент 215 внутрикадровой оценки, компонент 227 анализа управления фильтром и компонент 221 оценки движения для сжатия.
[0068] Компонент 211 общего управления кодером выполнен с возможностью принятия решений, связанных с кодированием изображений видеопоследовательности в поток битов в соответствии с ограничениями приложения. Например, компонент 211 общего управления кодером управляет оптимизацией скорости передачи/размера потока битов по сравнению с качеством реконструирования. Такие решения могут быть приняты на основе доступности пространства для хранения/полосы пропускания и запросов разрешения изображения. Компонент 211 общего управления кодером также управляет использованием буфера с учетом скорости передачи, чтобы уменьшить проблемы опустошения и переполнения буфера. Чтобы управлять этими проблемами, компонент 211 общего управления кодером управляет разделением, прогнозированием и фильтрацией посредством других компонентов. Например, компонент 211 общего управления кодером может динамически увеличивать сложность сжатия для увеличения разрешения и увеличения использования полосы пропускания или уменьшения сложности сжатия для уменьшения разрешения и использования полосы пропускания. Следовательно, компонент 211 общего управления кодером управляет другими компонентами системы 200 кодека, чтобы сбалансировать качество реконструирования видеосигнала, учитывая скорость передачи битов. Компонент 211 общего управления кодером создает данные управления, которые управляют работой других компонентов. Данные управления также направляются в компонент 231 форматирования заголовка и CABAC для кодирования в потоке битов, чтобы сообщать параметры для декодирования в декодере.
[0069] Разделенный видеосигнал 201 также отправляется в компонент 221 оценки движения и компонент 219 компенсации движения для межкадрового прогнозирования. Кадр или сегмент разделенного видеосигнала 201 может быть разделен на множество видеоблоков. Компонент 221 оценки движения и компонент 219 компенсации движения выполняют кодирование с межкадровым прогнозированием принятого видеоблока относительно одного или более блоков в одном или более опорных кадрах, чтобы обеспечить временное прогнозирование. Система 200 кодека может выполнять множество проходов кодирования, например, чтобы выбрать соответствующий режим кодирования для каждого блока видеоданных.
[0070] Компонент 221 оценки движения и компонент 219 компенсации движения могут быть сильно интегрированы, но проиллюстрированы отдельно для концептуальных целей. Оценка движения, выполняемая компонентом 221 оценки движения, представляет собой процесс формирования векторов движения, которые оценивают движение для видеоблоков. Вектор движения, например, может указывать смещение кодированного объекта относительно блока прогнозирования. Блок прогнозирования - это блок, который, как установлено, близко соответствует блоку, который должен быть кодирован, с точки зрения разности пикселей. Блок прогнозирования также может называться опорным блоком. Такая разность пикселей может определяться суммой абсолютной разности (SAD, sum of absolute difference), суммой квадратов разности (SSD, sum of square difference) или другими показателями разности. HEVC использует несколько закодированных объектов, включая CTU, блоки дерева кодирования (CTB) и CU. Например, CTU можно разделить на CTB, которые затем можно разделить на CB для включения в CU. CU может быть закодирован как блок прогнозирования (PU), содержащий данные прогнозирования, и/или блок преобразования (TU), содержащий преобразованные остаточные данные для CU. Компонент 221 оценки движения формирует векторы движения, PU и TU, используя анализ искажения скорости как часть процесса оптимизации искажения скорости. Например, компонент 221 оценки движения может определять множество опорных блоков, множество векторов движения и т.д. для текущего блока/кадра и может выбирать опорные блоки, векторы движения и т.д., имеющие наилучшие характеристики скорости/искажения. Наилучшие характеристики соотношение скорость-искажение уравновешивают как качество реконструкции видео (например, объем потери данных при сжатии), так и эффективность кодирования (например, размер окончательного кодирования).
[0071] В некоторых примерах система 200 кодека может вычислять значения для положений субцелочисленных пикселей опорных изображений, сохраненных в компоненте 223 буфера декодированных изображений. Например, система 200 видеокодека может интерполировать значения положений четверти пикселя, положений одной восьмой пикселя или других положений дробных пикселей опорного изображения. Следовательно, компонент 221 оценки движения может выполнять поиск движения относительно положений целых пикселей и положений дробных пикселей и выводить вектор движения с точностью до дробных пикселей. Компонент 221 оценки движения вычисляет вектор движения для PU видеоблока в интеркодированном сегменте путем сравнения положения PU с положением блока прогнозирования опорного изображения. Компонент 221 оценки движения выводит вычисленный вектор движения как данные движения в компонент 231 форматирования заголовка и CABAC для кодирования и движения в компонент 219 компенсации движения.
[0072] Компенсация движения, выполняемая компонентом 219 компенсации движения, может включать в себя выборку или формирование блока прогнозирования на основе вектора движения, определенного компонентом 221 оценки движения. Опять же, в некоторых примерах компонент 221 оценки движения и компонент 219 компенсации движения могут быть функционально интегрированы. После приема вектора движения для PU текущего видеоблока компонент 219 компенсации движения может определить местонахождение блока прогнозирования, на который указывает вектор движения. Затем формируется остаточный видеоблок путем вычитания значений пикселей блока прогнозирования из значений пикселей текущего кодируемого видеоблока, формируя значения разности пикселей. В общем, компонент 221 оценки движения выполняет оценку движения относительно компонентов яркости, а компонент 219 компенсации движения использует векторы движения, вычисленные на основе компонентов яркости как для компонентов цветности, так и для компонентов яркости. Блок прогнозирования и остаточный блок направляются в компонент 213 преобразования масштабирования и квантования.
[0073] Разделенный видеосигнал 201 также отправляется в компонент 215 внутрикадровой оценки и компонент 217 внутрикадрового прогнозирования. Как и в случае с компонентом 221 оценки движения и компонентом 219 компенсации движения, компонент 215 внутрикадровой оценки и компонент 217 внутрикадрового прогнозирования могут быть сильно интегрированы, но проиллюстрированы отдельно для концептуальных целей. Компонент 215 внутрикадровой оценки и компонент 217 внутрикадрового прогнозирования прогнозируют текущий блок относительно блоков в текущем кадре в качестве альтернативы межкадровому прогнозированию, выполняемому компонентом 221 оценки движения и компонентом 219 компенсации движения между кадрами, как описано выше. В частности, компонент 215 внутрикадровой оценки определяет режим внутрикадрового прогнозирования для использования для кодирования текущего блока. В некоторых примерах компонент 215 внутрикадровой оценки выбирает соответствующий режим внутрикадрового прогнозирования для кодирования текущего блока из множества проверенных режимов внутрикадрового прогнозирования. Выбранные режимы внутрикадрового прогнозирования затем направляются в компонент 231 форматирования заголовка и CABAC для кодирования.
[0074] Например, компонент 215 внутрикадровой оценки вычисляет значения скоростного искажения, используя анализ скоростного искажения для различных тестируемых режимов внутрикадрового прогнозирования, и выбирает режим внутрикадрового прогнозирования, имеющий лучшие характеристики скоростного искажения среди тестированных режимов. Анализ искажения скорости обычно определяет величину искажения (или ошибки) между закодированным блоком и исходным некодированным блоком, который был закодирован для создания закодированного блока, а также скорость передачи данных (например, количество битов), используемую для создания закодированного блока. Компонент 215 внутрикадровой оценки вычисляет отношения из искажений и скоростей для различных кодированных блоков, чтобы определить, какой режим внутрикадрового прогнозирования показывает наилучшее значение искажения скорости для блока. Кроме того, компонент 215 внутрикадровой оценки может быть выполнен с возможностью кодирования блоков глубины карты глубины с использованием режима моделирования глубины (DMM, depth modeling mode) на основе оптимизации скорость-искажения (RDO, rate-distortion optimization).
[0075] Компонент 217 внутрикадрового прогнозирования может формировать остаточный блок из блока прогнозирования на основе выбранных режимов внутрикадрового прогнозирования, определенных компонентом 215 внутрикадровой оценки, когда он реализован на кодере, или считывать остаточный блок из потока битов, когда он реализован на декодере. Остаточный блок включает в себя разницу в значениях между блоком прогнозирования и исходным блоком, представленную в виде матрицы. Остаточный блок затем пересылается в компонент 213 преобразования масштабирования и квантования. Компонент 215 внутрикадровой оценки и компонент 217 внутрикадрового прогнозирования могут работать как с компонентами яркости, так и с компонентами цветности.
[0076] Компонент 213 преобразования масштабирования и квантования выполнен с возможностью дополнительного сжатия остаточного блока. Компонент 213 преобразования масштабирования и квантования применяет преобразование, такое как дискретное косинусное преобразование (DCT, discrete cosine transform), дискретное синусоидальное преобразование (DST, discrete sine transform) или концептуально аналогичное преобразование, к остаточному блоку, создавая видеоблок, содержащий значения остаточных коэффициентов преобразования. Также можно использовать вейвлет-преобразования, целочисленные преобразования, преобразования поддиапазонов или другие типы преобразований. Преобразование может преобразовывать остаточную информацию из области значений пикселей в область преобразования, такую как частотная область. Компонент 213 преобразования масштабирования и квантования также выполнен с возможностью масштабирования преобразованной остаточной информации, например, на основе частоты. Такое масштабирование включает в себя применение масштабного коэффициента к остаточной информации, так что разная частотная информация квантуется с разной степенью детализации, что может повлиять на окончательное визуальное качество реконструированного видео. Компонент 213 преобразования масштабирования и квантования также выполнен с возможностью квантования коэффициентов преобразования для дальнейшего снижения скорости передачи битов. Процесс квантования может уменьшить битовую глубину, связанную с некоторыми или всеми коэффициентами. Степень квантования может быть изменена путем регулировки параметра квантования. В некоторых примерах компонент 213 преобразования масштабирования и квантования может затем выполнить сканирование матрицы, включая квантованные коэффициенты преобразования. Квантованные коэффициенты преобразования направляются в компонент 231 форматирования заголовка и CABAC для кодирования в потоке битов.
[0077] Компонент 229 масштабирования и обратного преобразования применяет обратную операцию компонента 213 преобразования масштабирования и квантования для поддержки оценки движения. Компонент 229 масштабирования и обратного преобразования применяет обратное масштабирование, преобразование и/или квантование для реконструирования остаточного блока в области пикселей, например, для последующего использования в качестве опорного блока, который может стать блоком прогнозирования для другого текущего блока. Компонент 221 оценки движения и/или компонент 219 компенсации движения может вычислять опорный блок, добавляя остаточный блок обратно к соответствующему блоку прогнозирования для использования при оценке движения более позднего блока/кадра. Фильтры применяются к реконструированным опорным блокам для уменьшения артефактов, возникающих во время масштабирования, квантования и преобразования. В противном случае такие артефакты могут вызвать неточное прогнозирование (и создать дополнительные артефакты) при прогнозировании последующих блоков.
[0078] Компонент 227 анализа управления фильтром и компонент 225 внутриконтурных фильтров применяют фильтры к остаточным блокам и/или к реконструированным блокам изображения. Например, преобразованный остаточный блок из компонента 229 масштабирования и обратного преобразования может быть объединен с соответствующим блоком прогнозирования из компонента 217 внутрикадрового прогнозирования и/или компонента 219 компенсации движения для реконструирования исходного блока изображения. Затем фильтры могут быть применены к реконструированному блоку изображения. В некоторых примерах вместо этого фильтры могут применяться к остаточным блокам. Как и в случае с другими компонентами на фиг. 2, компонент 227 анализа управления фильтром и компонент 225 внутриконтурных фильтров сильно интегрированы и могут быть реализованы вместе, но изображены отдельно для концептуальных целей. Фильтры, применяемые к реконструированным опорным блокам, применяются к конкретным пространственным областям и включают множество параметров для настройки того, как такие фильтры применяются. Компонент 227 анализа управления фильтрами анализирует реконструированные опорные блоки, чтобы определить, где такие фильтры должны быть применены, и устанавливает соответствующие параметры. Такие данные пересылаются в компонент 231 форматирования заголовка и CABAC в качестве данных управления фильтром для кодирования. Компонент 225 внутриконтурных фильтров применяет такие фильтры на основе данных управления фильтром. Фильтры могут включать в себя фильтр удаления блочности, фильтр подавления шума, фильтр SAO и адаптивный контурный фильтр. Такие фильтры могут применяться в пространственной/пиксельной области (например, в реконструированном блоке пикселей) или в частотной области, в зависимости от примера.
[0079] При работе в качестве кодера отфильтрованный блок реконструированного изображения, остаточный блок и/или блок прогнозирования сохраняются в компоненте 223 буфера декодированных изображений для последующего использования при оценке движения, как описано выше. При работе в качестве декодера компонент 223 буфера декодированных изображений сохраняет и пересылает реконструированные и отфильтрованные блоки на дисплей как часть выходного видеосигнала. Компонент 223 буфера декодированных изображений может быть любым устройством памяти, способным хранить блоки прогнозирования, остаточные блоки и/или реконструированные блоки изображения.
[0080] Компонент 231 форматирования заголовка и CABAC принимает данные от различных компонентов системы 200 кодеков и кодирует такие данные в кодированный поток битов для передачи в декодер. В частности, компонент 231 форматирования заголовка и CABAC формирует различные заголовки для кодирования данных управления, таких как общие данные управления и данные управления фильтром. Кроме того, данные прогнозирования, включая данные внутрикадрового прогнозирования и движения, а также остаточные данные в форме квантованных данных коэффициентов преобразования, все кодируются в потоке битов. Конечный поток битов включает в себя всю информацию, требуемую декодером для реконструирования исходного разделенного видеосигнала 201. Такая информация может также включать в себя таблицы индексов режима внутрикадрового прогнозирования (также называемые таблицами отображения кодовых слов), определения контекстов кодирования для различных блоков, указания наиболее вероятных режимов внутрикадрового прогнозирования, указание информации о разделах и т. д. Такие данные могут быть закодированы с использованием энтропийного кодирования. Например, информация может быть закодирована с использованием контекстно-адаптивного кодирования с переменной длиной (CAVLC, context adaptive variable length coding), CABAC, основанного на синтаксисе контекстно-адаптивного двоичного арифметического кодирования (SBAC, syntax-based context-adaptive binary arithmetic coding), энтропийного кодирования с вероятностным интервалом разделения (PIPE, probability interval partitioning entropy) или другого метода энтропийного кодирования. После энтропийного кодирования закодированный поток битов может быть передан на другое устройство (например, видеодекодер) или заархивирован для последующей передачи или поиска.
[0081] Фиг. 3 представляет собой блок-схему, иллюстрирующую примерный видеокодер 300. Видеокодер 300 может использоваться для реализации функций кодирования системы 200 кодека и/или реализации этапов 101, 103, 105, 107 и/или 109 рабочего способа 100. Кодер 300 разделяет входной видеосигнал, в результате чего получается разделенный видеосигнал 301, который по существу аналогичен разделенному видеосигналу 201. Разделенный видеосигнал 301 затем сжимается и кодируется в поток битов компонентами кодера 300.
[0082] В частности, разделенный видеосигнал 301 пересылается в компонент 317 внутрикадрового прогнозирования изображения для внутрикадрового прогнозирования. Компонент 317 внутрикадрового прогнозирования может быть по существу аналогичным компоненту 215 внутрикадровой оценки и компоненту 217 внутрикадрового прогнозирования. Разделенный видеосигнал 301 также пересылается в компонент 321 компенсации движения для межкадрового прогнозирования на основе опорных блоков в компоненте 323 буфера декодированных изображений. Компонент 321 компенсации движения может быть по существу аналогичен компоненту 221 оценки движения и компоненту 219 компенсации движения. Блоки прогнозирования и остаточные блоки из компонента 317 внутрикадрового прогнозирования и компонента 321 компенсации движения направляются в компонент 313 преобразования и квантования для преобразования и квантования остаточных блоков. Компонент 313 преобразования и квантования может быть по существу аналогичен компоненту 213 преобразования масштабирования и квантования. Преобразованные и квантованные остаточные блоки и соответствующие блоки прогнозирования (вместе со связанными данными управления) направляются в компонент 331 энтропийного кодирования для кодирования в поток битов. Компонент 331 энтропийного кодирования может быть по существу аналогичен компоненту 231 форматирования заголовка и CABAC.
[0083] Преобразованные и квантованные остаточные блоки и/или соответствующие блоки прогнозирования также направляются из компонента 313 преобразования и квантования в компонент 329 обратного преобразования и квантования для реконструирования в опорные блоки для использования компонентом 321 компенсации движения. Компонент 329 обратного преобразования и квантования может быть по существу аналогичен компоненту 229 масштабирования и обратного преобразования. Контурные фильтры в компоненте 325 внутриконтурных фильтров также применяются к остаточным блокам и/или реконструированным опорным блокам, в зависимости от примера. Компонент 325 внутриконтурных фильтров может быть по существу аналогичен компоненту 227 анализа управления фильтром и компоненту 225 внутриконтурных фильтров. Компонент 325 внутриконтурных фильтров может включать в себя множество фильтров, как обсуждалось в отношении компонента 225 внутриконтурных фильтров. Отфильтрованные блоки затем сохраняются в компоненте 323 буфера декодированных изображений для использования в качестве опорных блоков компонентом 321 компенсации движения. Компонент 323 буфера декодированных изображений может быть по существу аналогичен компоненту 223 буфера декодированных изображений.
[0084] Фиг. 4 - это блок-схема, иллюстрирующая примерный видеодекодер 400. Видеодекодер 400 может использоваться для реализации функций декодирования системы 200 кодека и/или реализации этапов 111, 113, 115 и/или 117 рабочего способа 100. Декодер 400 принимает поток битов, например, от кодера 300, и формирует реконструированный выходной видеосигнал на основе потока битов для отображения конечному пользователю.
[0085] Поток битов принимается компонентом 433 энтропийного декодирования. Компонент 433 энтропийного декодирования выполнен с возможностью реализации схемы энтропийного декодирования, такой как CAVLC, CABAC, SBAC, PIPE-кодирование или другие методы энтропийного кодирования. Например, компонент 433 энтропийного декодирования может использовать информацию заголовка, чтобы предоставить контекст для интерпретации дополнительных данных, закодированных как кодовые слова в потоке битов. Декодированная информация включает в себя любую желаемую информацию для декодирования видеосигнала, такую как общие данные управления, данные управления фильтром, информацию о разделах, данные движения, данные прогнозирования и квантованные коэффициенты преобразования из остаточных блоков. Квантованные коэффициенты преобразования направляются в компонент 429 обратного преобразования и квантования для реконструирования в остаточные блоки. Компонент 429 обратного преобразования и квантования может быть аналогичен компоненту 329 обратного преобразования и квантования.
[0086] Реконствруированные остаточные блоки и/или блоки прогнозирования направляются в компонент 417 внутрикадрового прогнозирования для реконструкции в блоки изображения на основе операций внутрикадрового прогнозирования. Компонент 417 внутрикадрового прогнозирования может быть аналогичен компоненту 215 внутрикадровой оценки и компоненту 217 внутрикадрового прогнозирования. В частности, компонент 417 внутрикадрового прогнозирования использует режимы прогнозирования для определения местоположения опорного блока в кадре и применяет остаточный блок к результату для реконструирования блоков изображения с внутрикадровым прогнозированием. Реконструированные блоки изображения с внутрикадровым прогнозированием и/или остаточные блоки и соответствующие данные межкадрового прогнозирования пересылаются в компонент 423 буфера декодированных изображений через компонент 425 внутриконтурных фильтров, который может быть по существу аналогичен компоненту 223 буфера декодированных изображений и компоненту 225 внутриконтурных фильтров соответственно. Компонент 425 внутриконтурных фильтров фильтрует блоки реконструированного изображения, остаточные блоки и/или блоки прогнозирования, и такая информация хранится в компоненте 423 буфера декодированных изображений. Реконструированные блоки изображения из компонента 423 буфера декодированных изображений пересылаются в компонент 421 компенсации движения для межкадрового прогнозирования. Компонент 421 компенсации движения может быть по существу аналогичным компоненту 221 оценки движения и/или компоненту 219 компенсации движения. В частности, компонент 421 компенсации движения использует векторы движения из опорного блока для формирования блока прогнозирования и применяет остаточный блок к результату для реконструирования блока изображения. Результирующие реконструированные блоки также могут быть отправлены через компонент 425 внутриконтурных фильтров в компонент 423 буфера декодированных изображений. Компонент 423 буфера декодированных изображений продолжает хранить дополнительные реконструированные блоки изображения, которые могут быть преобразованы в кадры посредством информации о разделениях. Такие кадры также можно размещать последовательно. Последовательность выводится на дисплей как реконструированный выходной видеосигнал.
[0087] Фиг. 5 - схематическая диаграмма, иллюстрирующая примерный поток 500 битов, содержащий кодированную видеопоследовательность. Например, поток 500 битов может быть сформирован системой 200 кодека и/или кодером 300 для декодирования системой 200 кодека и/или декодером 400. В качестве другого примера поток 500 битов может быть сформирован кодером на этапе 109 способа 100 для использования декодером на этапе 111.
[0088] Поток битов 500 включает в себя набор 510 параметров последовательности (SPS, sequence parameter set), множество наборов 512 параметров изображения (PPSs), заголовки 514 группы тайлов и данные 520 изображения. SPS 510 содержит данные последовательности, общие для всех изображений в видеопоследовательности, содержащейся в потоке 500 битов. Такие данные могут включать размер изображения, битовую глубину, параметры инструмента кодирования, ограничения битовой скорости и т. Д. PPS 512 содержит параметры, которые относятся к одному или нескольким соответствующим изображениям. Следовательно, каждое изображение в видеопоследовательности может относиться к одному PPS 512. PPS 512 может указывать инструменты кодирования, доступные для тайлов в соответствующих изображениях, параметры квантования, смещения, параметры инструмента кодирования для конкретных изображений (например, элементы управления фильтрами) и т. д. Заголовок 514 группы тайлов содержит параметры, которые являются специфическими для каждой группы тайлов в изображении. Следовательно, может быть один заголовок 514 группы тайлов на группу тайлов в видеопоследовательности. Заголовок 514 группы тайлов может содержать информацию о группе тайлов, счетчики порядка изображений (POC), списки опорных изображений, веса прогнозирования, точки входа тайлов, параметры удаления блочности и т. д. Следует отметить, что некоторые системы ссылаются на заголовок 514 группы тайлов как на заголовок сегмента и используют такую информацию для поддержки сегментов вместо групп тайлов.
[0089] Данные 520 изображения содержат видеоданные, закодированные согласно межкадровому прогнозированию и/или внутрикадровому прогнозированию, а также соответствующие преобразованные и квантованные остаточные данные. Такие данные 520 изображения сортируются согласно разделению, используемому для разделения изображения перед кодированием. Например, изображение в данных 520 изображения разделено на тайлы 523. Тайлы 523 дополнительно делятся на блоки дерева кодирования (CTU). Блоки CTU дополнительно делятся на блоки кодирования на основе деревьев кодирования. Затем блоки кодирования можно кодировать/декодировать согласно механизмам прогнозирования. Изображение/картинка может содержать одну или более тайлов 523.
[0090] Тайл 523 - это разделенная часть изображения, созданная горизонтальными и вертикальными границами. Тайл 523 может быть прямоугольным и/или квадратным. В частности, тайл 523 включает четыре стороны, соединенные под прямым углом. Четыре стороны включают две пары параллельных сторон. Кроме того, стороны в паре параллельных сторон имеют одинаковую длину. Таким образом, тайл 523 может иметь любую прямоугольную форму, где квадрат является особым случаем прямоугольника, у которого все четыре стороны имеют одинаковую длину. Изображение может быть помещено в строки и столбцы ячеек 523. Строка тайлы представляет собой набор 523 тайлов, расположенных рядом друг с другом по горизонтали для создания непрерывной линии от левой границы до правой границы изображения (или наоборот). Столбец тайлов представляет собой набор тайлов 523, расположенных рядом друг с другом по вертикали для создания непрерывной линии от верхней границы до нижней границы изображения (или наоборот). Тайлы 523 могут или могут не разрешать прогнозирование на основе других тайлов 523, в зависимости от примера. Каждый тайл 523 может иметь уникальный индекс тайла в изображении. Индекс тайла - это процедурно выбранный числовой идентификатор, который может использоваться, чтобы отличать один тайл 523 от другого. Например, индексы тайлов могут численно увеличиваться в порядке растрового сканирования. Порядок сканирования растров - слева направо и сверху вниз. Следует отметить, что в некоторых примерах тайлам 523 также могут быть назначены идентификаторы (ID, identifier) тайлов. ID тайла - это назначенный идентификатор, который можно использовать для отличия одного тайла 523 от другого. В некоторых примерах вычисления могут использовать идентификаторы тайла вместо индексов тайла. Кроме того, идентификаторам тайла можно назначить те же значения, что и индексы тайла в некоторых примерах. Индексы и/или идентификаторы тайлов могут сообщаться для указания групп тайлов, содержащих тайлы 523. Например, индексы и/или идентификаторы тайла могут использоваться для отображения данных изображения, связанных с тайлом 523, в надлежащую позицию для отображения. Группа тайлов - это связанный набор 523 тайлов, которые можно отдельно извлекать и кодировать, например, для поддержки отображения интересующей области и/или для поддержки параллельной обработки. Тайлы 523 в группе тайлов могут быть закодированы без ссылки на тайлы 523 за пределами группы тайлов. Каждому тайлу 523 может быть назначена соответствующая группа тайлов, и поэтому изображение может содержать множество групп тайлов.
[0091] Фиг. 6A-6E иллюстрируют примерный механизм 600 для создания дорожки 610 экстрактора для объединения тайлов изображений с множеством разрешений из разных потоков битов в одно изображение для использования в приложениях виртуальной реальности (VR, virtual reality). Механизм 600 может использоваться для поддержки примерного варианта использования способа 100. Например, механизм 600 может использоваться для формирования потока 500 битов для передачи от системы 200 кодека и/или кодера 300 к системе 200 кодека и/или декодеру 400. В качестве конкретного примера механизм 600 может использоваться для использования в сочетании с VR, OMAF, видео на триста шестьдесят градусов и т. д.
[0092] В VR пользователю отображается только часть видео. Например, видео VR может быть снято, чтобы включать в себя сферу, окружающую пользователя. Пользователь может использовать головной дисплей (HMD, head mounted display) для просмотра видео VR. Пользователь может направить HMD на интересующую область. Интересующая область отображается пользователю, а другие видеоданные отбрасываются. Таким образом, пользователь в любой момент просматривает только выбранную пользователем часть видео VR. Этот подход имитирует восприятие пользователя и, следовательно, заставляет пользователя воспринимать виртуальную среду таким образом, чтобы имитировать реальную среду. Одна из проблем с этим подходом заключается в том, что все видео VR может быть передано пользователю, но фактически используется только текущее область просмотра видео, а остальное отбрасывается. Чтобы повысить эффективность сообщения для потоковых приложений, текущее область просмотра пользователя может передаваться с более высоким первым разрешением, а другие области просмотра могут передаваться с более низким вторым разрешением. Таким образом, области просмотра, которые, вероятно, будут отброшены, занимают меньшую полосу пропускания, чем области просмотра, которые, вероятно, будут просматриваться пользователем. В случае, если пользователь выбирает новую область просмотра, содержимое с более низким разрешением может отображаться до тех пор, пока декодер не запросит передачу другой текущей области просмотра с более высоким первым разрешением. Механизм 600 может использоваться для создания дорожки 610 экстрактора, как показано на фиг. 6E, чтобы поддерживать эту функциональность. Дорожка 610 экстрактора - это дорожка данных изображения, которая инкапсулирует изображение с множеством разрешений для использования, как описано выше.
[0093] Механизм 600 кодирует один и тот же видеоконтент с первым разрешением 611 и вторым разрешением 612, как показано на фиг. 6А и 6Б соответственно. В качестве конкретного примера первое разрешение 611 может составлять 5120 × 2560 выборок яркости, а второе разрешение 612 может составлять 2560 × 1280 выборок яркости. Изображения видео могут быть разделены на тайлы 601 с первым разрешением 611 и тайлы 603 со вторым разрешением 612 соответственно. В показанном примере каждый тайл 601 и 603 разделен на сетку 4×2. Кроме того, MCTS может быть закодирован для каждой позиции 601 и 603 тайла. Каждое из изображений с первым разрешением 611 и вторым разрешением 612 приводит к последовательности MCTS, описывающей видео во времени с соответствующим разрешением. Каждая закодированная последовательность MCTS хранится как дорожка стандартной детали изображения или дорожка тайла. Механизм 600 может затем использовать изображения для создания сегментов для поддержки выбора MCTS, адаптивного к области просмотра. Например, рассматривается каждый диапазон ориентации просмотра, который вызывает различный выбор MCTS с высоким и низким разрешением. В проиллюстрированном примере получаются четыре тайла 601, содержащие MCTS с первым разрешением 611, и четыре тайла 603, содержащие MCTS со вторым разрешением 613.
[0094] Механизм 600 может затем создать дорожку 610 экстрактора для каждого возможного выбора MCTS, адаптивного к области просмотра. Фиг. 6C и 6D иллюстрируют пример выбора MCTS, адаптивного к области просмотра. В частности, набор выбранных ячеек 605 и 607 выбирается с первым разрешением 611 и вторым разрешением 612 соответственно. Выбранные тайлы 605 и 607 показаны серой заливкой. В показанном примере выбранные тайлы 605 - это тайлы 601 с первым разрешением 611, которые должны быть показаны пользователю, а выбранные тайлы 607 - это тайлы 603 со вторым разрешением 612, которые, вероятно, будут отброшены, но сохранены для поддержки отображения в случае, если пользователь выбирает новую область просмотра. Выбранные тайлы 605 и 607 затем объединяются в одно изображение, содержащее данные изображения как с первым разрешением 611, так и со вторым разрешением 612. Такие изображения объединяются для создания дорожки 610 экстрактора. Фиг. 6E иллюстрирует одиночное изображение с соответствующей дорожки 610 экстрактора в целях иллюстрации. Как показано, изображение на дорожке 610 экстрактора содержит выбранные тайлы 605 и 607 из первого разрешения 611 и второго разрешения 612. Как отмечалось выше, фиг. 6C-6E иллюстрируют выбор MCTS, адаптируемый к одной области просмотра. Чтобы позволить пользователю выбрать любую область просмотра, дорожка 610 экстрактора должна быть создана для каждой возможной комбинации выбранных тайлов 605 и 607.
[0095] В показанном примере каждый выбор тайлов 603, инкапсулирующих контент из потока битов второго разрешения 612, содержит два сегмента. RegionWisePackingBox может быть включен в дорожку 610 экстрактора для создания отображения между пакетированным изображением и проецируемым изображением формата ERP. В представленном примере потоки битов, выделенные из дорожек экстрактора, имеют разрешение 3200 × 2560. Следовательно, декодер с поддержкой четырех тысяч выборок (4K) может декодировать контент, в котором область просмотра извлекается из кодированного потока битов с разрешением 5K (5120 × 2560) из пяти тысяч выборок.
[0096] Как показано, дорожка 610 экстрактора содержит две строки ячеек 601 с высоким разрешением и четыре строки ячеек 603 с низким разрешением. Соответственно, дорожка 610 экстрактора содержит два сегмента контента с высоким разрешением и четыре сегмента контента с низким разрешением. Равномерная тайл может не поддерживать такой вариант использования. Равномерная тайл определяется набором столбцов тайлов и набором строк тайлов. Столбцы тайлов продолжаются от верха изображения до низа изображения. Точно так же строки тайлов продолжаются от левого края изображения до правого. Хотя такую структуру можно просто определить, эта структура не может эффективно поддерживать расширенные варианты использования, такие как вариант использования, описываемый механизмом 600. В показанном примере на разных участках дорожки 610 экстрактора используется разное количество строк. Если используется равномерное расположение тайлов, тайлы на правой стороне дорожки 610 экстрактора должны быть переписаны, чтобы каждая могла принимать по два сегмента. Этот подход неэффективен и сложен в вычислительном отношении.
[0097] Настоящее изобретение включает в себя гибкую схему разбиения на тайлы, как описано ниже, которая не требует перезаписи тайла, чтобы включить в него различное количество сегментов. Гибкая схема разбиения на тайлы позволяет мозаике 601 содержать контент с первым разрешением 611. Гибкая схема разбиения на тайлы также позволяет разделить тайл 601 на более мелкие тайлы, каждая из которых может быть напрямую сопоставлена с тайлами 603 со вторым разрешением 612. Это прямое сопоставление более эффективно, поскольку такой подход не требует перезаписи/переадресации тайлов при объединении различных разрешений, как описано выше.
[0098] Фиг. 7 иллюстрирует пример приложения 700 видеоконференцсвязи, которое объединяет изображения с множеством разрешений из разных потоков битов в одно изображение для отображения. Приложение 700 может использоваться для поддержки примерного варианта использования способа 100. Например, приложение 700 может использоваться в системе 200 кодека и/или декодере 400 для отображения видеоконтента из потока 500 битов из системы 200 кодека и/или кодера 300. Приложение 700 видеоконференцсвязи отображает пользователю видеопоследовательность. Видеопоследовательность содержит изображения, отображающие говорящего участника 701 и других участников 703. Выступающий участник 701 отображается с более высоким первым разрешением, а другие участники 703 отображаются с меньшим вторым разрешением. Чтобы закодировать такое изображение, изображение должно содержать часть с одной строкой и часть с тремя строками. Для поддержки такого сценария с равномерного расположения тайлов изображение разделено на левый и правый тайл. Затем правый тайл переписывается/переадресовывается, чтобы включить три строки. Такая переадресация приводит как к сжатию, так и к снижению производительности. Гибкая схема разбиения на тайлы, описанная ниже, позволяет разделить один тайл на меньшие тайлы и сопоставить тайлы в потоках битов тайлов изображения, связанных с другими участниками 703. Таким образом, говорящий участник 701 может быть напрямую отображен в тайл первого уровня, а другие участники 703 могут быть отображены на тайлы второго уровня, отделенные от первой тайлы, без такой перезаписи/переадресации.
[0099] Фиг. 8A-8B являются схематическими диаграммами, иллюстрирующими примерную гибкую схему 800 тайла, допускающую поддержку множества тайлов с разными разрешениями в одном и том же изображении. Гибкая схема 800 тайла может использоваться для поддержки более эффективного механизма 600 кодирования и приложения 700. Соответственно, гибкая схема 800 тайла может использоваться как часть способа 100. Кроме того, гибкая схема 800 тайла может использоваться системой 200 кодека, кодером 300 и/или декодером 400. Результаты гибкой схемы 800 тайла могут быть сохранены в потоке 500 битов для передачи между кодером и декодером.
[00100] Как показано на фиг. 8A, изображение (например, кадр, изображение и т.д.) может быть разделено на тайлы 801 первого уровня, также известные как тайлы первого уровня. Как показано на фиг. 8B, тайлы 801 первого уровня могут быть выборочно разделены для создания тайлов 803 второго уровня, также известных как тайлы второго уровня. Затем тайлы 801 первого уровня и тайлы 803 второго уровня могут использоваться для создания изображения с тайлами изображения, кодированными с множеством разрешений. Тайл 801 первого уровня - это тайл, сформированный путем полного разделения изображения на набор столбцов и набор строк. Тайл 803 второго уровня - это тайл, сформированный путем разделения тайла 801 первого уровня.
[00101] Как описано выше, в различных сценариях видео можно кодировать с множеством разрешений, например, в VR и/или при проведении телеконференций. Видео также можно кодировать, используя сегменты в каждом разрешении. Сегменты с более низким разрешением меньше сегментов с более высоким разрешением. Чтобы создать изображение с множеством разрешений, изображение может быть разделено на тайлы 801 первого уровня. Сегменты с наивысшим разрешением могут быть включены непосредственно в тайлы 801 первого уровня. Кроме того, тайлы 801 первого уровня могут быть разделены на тайлы 803 второго уровня, которые меньше, чем тайлы 801 первого уровня. Соответственно, меньшие тайлы 803 второго уровня могут напрямую принимать сегменты с более низким разрешением. Таким образом, сегменты из каждого разрешения могут быть сжаты в единое изображение, например, через взаимосвязь индексов тайла, без необходимости динамической переадресации тайлов с различным разрешением для использования согласованной схемы адресации. Тайлы 801 первого уровня и тайлы 803 второго уровня могут быть реализованы как MCTS и, следовательно, могут принимать данные изображения с ограничением движения с разными разрешениями.
[00102] Настоящее изобретение включает в себя множество аспектов. В качестве конкретного примера тайлы 801 первого уровня разделяются на тайлы 803 второго уровня. Затем тайлы 803 второго уровня могут быть ограничены тем, что каждый из них может содержать один прямоугольный сегмент данных изображения (например, с меньшим разрешением). Прямоугольный сегмент - это сегмент, ограниченный для сохранения прямоугольной формы, и, следовательно, кодируется на основе горизонтальных и вертикальных границ изображения. Соответственно, прямоугольный сегмент не кодируется на основе группы растрового сканирования (которая содержит CTU в строке слева направо и сверху вниз и может не поддерживать прямоугольную форму). Сегмент - это пространственно отличная область изображения/кадра, которая кодируется отдельно от любой другой области в том же кадре/изображении. В другом примере тайл 801 первого уровня может быть разделена на два или более полных тайла 803 второго уровня. В таком случае тайл 801 первого уровня может не содержать частичный тайл 803 второго уровня. В другом примере конфигурация тайлов 801 первого уровня и 803 тайлов второго уровня может сообщаться в параметре, установленном в потоке битов, таком как PPS, связанный с изображением, разделенным для создания тайлов. В одном примере указание разделения, такое как флаг, может быть закодировано в наборе параметров для каждого тайла 801 первого уровня. Указание обозначает, какие тайлы 801 первого уровня дополнительно разделяются на тайлы 803 второго уровня. В другом примере конфигурация тайлов 803 второго уровня может сообщаться как количество столбцов тайлов второго уровня и количество строк тайлов второго уровня.
[00103] В другом примере тайлы 801 первого уровня и тайлы 803 второго уровня могут быть назначены в группы тайлов. Такие группы тайлов могут быть ограничены так, чтобы все тайлы в соответствующей группе тайлов были ограничены для покрытия прямоугольной области изображения (например, в отличие от растрового сканирования). Например, некоторые системы могут добавлять тайлы в группу тайлов в порядке растрового сканирования. Это включает в себя добавление начального тайла в текущую строку, продолжение добавления каждого тайла в строку до тех пор, пока не будет достигнута левая граница изображения текущей строки, переход к правой границе следующей строки и добавление каждого тайла в следующую строку, и т.д., пока не будет достигнут последний тайл. Такой подход может привести к получению непрямоугольных форм, которые распространяются по изображению. Такие формы могут быть бесполезны для создания изображений с несколькими разрешениями, как описано здесь. Вместо этого настоящий пример может ограничивать группы тайлов таким образом, что любой тайл 801 первого уровня и/или тайл 803 второго уровня может быть добавлен к группе тайлов (например, в любом порядке), но результирующая группа тайлов должна быть прямоугольником или квадратом (например, включать четыре стороны, соединенные под прямым углом). Это ограничение может гарантировать, что тайлы 803 второго уровня, разделенные из один тайл 801 первого уровня, не будут помещены в разные группы тайлов.
[00104] В другом примере данные, явно указывающие количество столбцов тайла второго уровня и количество строк тайла второго уровня, могут быть исключены из потока битов, когда ширина тайла первого уровня меньше двукратного минимального порогового значения ширины и высота тайла первого уровня меньше двукратного минимального порогового значения высоты. Это связано с тем, что тайл 801 первого уровня, удовлетворяющий таким условиям, не может быть разделен более чем на один столбец или одну строку, соответственно, и, следовательно, такая информация может быть выведена декодером. В другом примере указания разделения, указывающее, какие тайлы 801 первого уровня разделены на тайлы 803 второго уровня, могут быть исключены из потока битов для определенных тайлов 801 первого уровня. Например, такие данные могут быть опущены, когда тайл 801 первого уровня имеет ширину тайла первого уровня, которая меньше минимального порогового значения ширины, а высота тайла первого уровня меньше порогового значения минимальной высоты. Это связано с тем, что тайл 801 первого уровня, удовлетворяющий таким условиям, слишком мал для разделения на тайлы 803 второго уровня, и, следовательно, такая информация может быть выведена декодером.
[00105] Как описано выше, гибкая схема 800 тайла поддерживает объединение тайлов изображений из разных потоков битов в изображение, содержащее множество разрешений. Ниже описаны различные варианты осуществления, которые поддерживают такие функции. В общем, настоящее изобретение описывает способы передачи сигналов и кодирования тайлов в кодировании видео, которые разделяют изображения более гибким образом, чем схема тайлов в HEVC. Более конкретно, это изобретение описывает некоторые схемы тайлов, в которых столбцы тайла могут не проходить равномерно сверху вниз кодированного изображения, и аналогично строки тайла могут не проходить равномерно слева направо от кодированного изображения.
[00106] Например, на основе подхода к расположению тайлов HEVC некоторые тайлы следует дополнительно разделить на множество строк тайлов для поддержки функциональных возможностей, описанных на фиг. 6A-6E и 7. Кроме того, в зависимости от того, как расположены тайлы, тайл следует разделить на столбцы тайлов. Например, на фиг. 7 участники со второго по четвертый в некоторых случаях могут располагаться ниже участника один, что может поддерживаться разделением тайлы на столбцы. Чтобы удовлетворить эти сценарии, тайл первого уровня может быть разделен на строки тайла и столбцы тайла второго уровня, как описано ниже.
[00107] Например, структуру тайла можно смягчить следующим образом. Необязательно, чтобы тайлы на одном изображении составляли определенное количество строк тайлов. Кроме того, тайлы на одном изображении не обязательно должны быть определенным количеством столбцов тайла. Для передачи сигналов гибких тайлов можно использовать следующие шаги. Структура тайла первого уровня может быть определена столбцами тайла и строками тайла, как определено в HEVC. Столбцы тайлов и строки тайлов могут быть одинаковыми или неоднородными по размеру. Каждый из этих тайлов может называться тайлом первого уровня. Может сообщаться флаг, чтобы указать, разделен ли каждый тайл первого уровня дополнительно на один или более столбцов тайла и одну или более строк тайла. Если тайл первого уровня дополнительно разделен, столбцы тайлов и строки тайлов могут быть одинаковыми или неоднородными по размеру. Новые тайлы, полученные в результате разделения тайлов первого уровня, называются тайлами второго уровня. Гибкая структура тайла может быть ограничена только тайлами второго уровня, и, следовательно, в некоторых примерах дальнейшее разделение какой-либо тайла второго уровня не допускается. В других примерах дальнейшее разделение тайлов второго уровня может применяться для создания тайлов последующих уровней способом, аналогичным созданию тайлов второго уровня из тайлов первого уровня.
[00108] Для простоты, когда тайл первого уровня делится на два или более тайла второго уровня, разделение всегда может использовать столбцы тайлов одинакового размера и одинаковые строки тайлов. Выведение местоположений тайлов, размеров, индексов и порядка сканирования гибких тайлов, определенных этим подходом, описано ниже. Для простоты, когда используется такая гибкая структура тайлов, группа тайлов может быть ограничена включением одного или более полных тайлов первого уровня. В этом примере, когда группа тайлов содержит тайл второго уровня, все тайлы второго уровня, которые возникли в результате разделения одного и того же тайлы первого уровня, должны содержаться в группе тайлов. Кроме того, можно ограничить, что, когда используется такая гибкая структура тайлов, группа тайлов содержит один или более тайлов, и вместе все тайлы принадлежат группе тайлов, которая покрывает прямоугольную область изображения. В другом аспекте, когда используется такая гибкая структура тайлов, группа тайлов содержит один или более тайлов первого уровня, и вместе все тайлы принадлежат группе тайлов, которая покрывает прямоугольную область изображения.
[00109] В примере сообщение гибких тайлов может быть следующим. Минимальная ширина тайла и минимальная высота тайла являются определенными значениями. Структура тайла первого уровня может быть определена столбцами тайла и строками тайла. Столбцы тайла и строки тайла могут быть одинаковыми или неоднородными по размеру. Каждый из этих тайлов можно назвать тайлом первого уровня. Может сообщаться флаг, чтобы указать, можно ли дополнительно разделить какой-либо из тайла первого уровня. Этот флаг может отсутствовать, если ширина каждого тайла первого уровня не больше двукратной минимальной ширины тайла, а высота каждого тайла первого уровня не больше двукратной минимальной высоты тайла. Если флаг отсутствует, предполагается, что значение флага равно нулю.
[00110] В примере для каждого тайла первого уровня применяется следующее. Флаг может сообщать, чтобы указать, разделен ли тайл первого уровня дополнительно на один или более столбцов тайла и одну или более строк тайла. Наличие флага можно ограничить следующим образом. Если ширина тайла первого уровня больше минимальной ширины тайла или если высота тайла первого уровня больше минимальной высоты тайла, флаг присутствует/сообщается. В противном случае флаг отсутствует, и предполагается, что значение флага равно нулю, что указывает на то, что тайл первого уровня не разделяется далее.
[00111] Если тайл первого уровня дополнительно разделен, количество столбцов тайла и количество строк тайла для этого разделения могут дополнительно сообщаться. Столбцы тайлов и строки тайлов могут быть одинаковыми или неоднородными по размеру. Тайлы, полученные в результате разделения тайлов первого уровня, называются тайлами второго уровня. Наличие количества столбцов тайла и количество строк тайла можно ограничить следующим образом. Когда ширина тайла первого уровня меньше, двукратной минимальной ширины тайла, количество столбцов тайла может не передаваться, и значение количества столбцов тайла может быть выведено равным единице. В сообщении может использоваться синтаксический элемент _minus1, так что сообщаемое значение элемента синтаксиса может быть нулевым, а количество столбцов тайла равно значению элемента синтаксиса плюс один. Этот подход может дополнительно сжимать данные сообщения. Когда высота тайлыа первого уровня меньше двукратной минимальной высоты тайла, количество строк тайла может не передаваться, и значение количества строк тайла может быть выведено равным нулю. Сообщаемое значение элемента синтаксиса может быть нулевым, а количество строк тайла может быть значением элемента синтаксиса плюс один для дальнейшего сжатия данных сообщения. Тайлы, полученные в результате разделения тайлов первого уровня, могут называться тайлами второго уровня. Гибкая структура тайлов может быть ограничена только тайлами второго уровня, так что дальнейшее разделение тайлов второго уровня не допускается. В других примерах дальнейшее разделение тайлов второго уровня может применяться аналогично разделению тайла первого уровня на тайлы второго уровня.
[00112] В примере сообщение гибкой структуры тйлов может быть следующим. Когда изображение содержит более одного тайла, сигнал, такой как флаг, может использоваться в наборе параметров, на который прямо или косвенно ссылается соответствующая группа тайлов. Флаг может указывать, является ли соответствующая структура тайла однородной структурой тайла или неоднородной структурой тайла (например, гибкой структурой тайла, как описано в данном документе). Флаг может называться uniform_tile_structure_flag. Когда uniform_tile_structure_flag равен единице, используется сообщение унифицированной структуры тайлов в стиле HEVC, например, путем передачи сигналов num_tile_columns_minus1 и num_tile_rows_minus1 для указания одного уровня однородных тайлов. Когда uniform_tile_structure_flag равен нулю, также может передаваться следующая информация. Количество тайлов в изображении может сообщаться элементом синтаксиса num_tiles_minus2, который указывает, что количество тайлов в изображении (NumTilesInPic) равно num_tiles_minus2+2. Это может привести к экономии битов во время сообщения, поскольку изображение по умолчанию может считаться тайлом. Для каждого тайла, за исключением последнего, сообщаются адреса первого блока кодирования (например, CTU) и последнего блока кодирования тайла. Адрес блока кодирования может быть индексом блока в изображении (например, индексом CTU в изображении). Элементами синтаксиса для таких блоков кодирования могут быть tile_first_block_address [i] и tile_last_block_address [i]. Эти элементы синтаксиса могут быть закодированы как ue (v) или u (v). Когда элементы синтаксиса кодируются как u (v), количество битов, используемых для представления каждого элемента синтаксиса, равно ceil(log2 (максимальное количество блока кодирования в изображении)). Адреса первого и последнего блока кодирования последнего тайла могут не сообщаться и вместо этого могут быть получены на основе размера изображения в выборках яркости и агрегирования всех других тайлов в изображении.
[00113] В примере для каждого тайла, за исключением последнего, вместо того, чтобы сообщать адреса первого и последнего блока кодирования тайла, адрес первого блока кодирования тайла, а также ширину и высоту тайла может сообщаться. В другом примере для каждого тайла, за исключением последнего, вместо сообщения адресов первого и последнего блока кодирования тайла смещение верхней левой точки тайла относительно оригинала изображения (например, верхний левый угол изображения), а также может указываться ширина и высота тайла. В еще одном примере для каждого тайла, за исключением последнего, вместо сообщения адресов первого и последнего блока кодирования тайла может передаваться следующая информация. Можно сообщать ширину и высоту тайла. Кроме того, местоположение каждого тайла может не передаваться. Вместо этого может сообщаться флаг, указывающий, размещать ли тайл сразу справа или сразу под предыдущей тайлом. Этот флаг может отсутствовать, если тайл может быть только справа или может находиться только под предыдущим тайлом. Верхнее левое смещение первого тайла всегда может быть установлено как начало/верхний левый угол изображения (например, x=ноль и y=ноль).
[00114] Для эффективности сообщения может передаваться набор уникальных размеров тайла (например, ширины и высоты). К этому списку уникальных размеров тайлов можно обращаться по индексу из цикла, который включает в себя сообщение каждого размера тайла. В некоторых примерах положения и размеры тайлов, полученные из сообщаемой структуры тайлов, должны ограничивать раздел, чтобы гарантировать отсутствие зазора и перекрытия между любыми тайлами.
[00115] Также могут применяться следующие ограничения. Может потребоваться, чтобы формы тайла были прямоугольными (например, формы не растрового сканирования). Блок тайлов на изображении должен покрывать изображение без каких-либо зазоров и перекрытий между тайлами. Когда декодирование выполняется только с одним ядром, для кодирования текущего блока кодирования (например, CTU), который не находится на левой границе изображения, левый соседний блок кодирования должен быть декодирован перед текущим блоком кодирования. Когда декодирование выполняется только с одним ядром, для кодирования текущего блока кодирования (например, CTU), который не находится на верхней границе изображения, верхний соседний блок кодирования должен быть декодирован перед текущим блоком кодирования. Когда два тайлы имеют индексы тайлов, которые находятся рядом друг с другом (например, idx три и idx четыре), верно одно из следующих утверждений. Два тайла имеют общую вертикальную границу и/или когда первый тайл имеет верхнее левое положение в (Xa, Ya) с размером (Wa и Ha, представляющие ее ширину и высоту), и когда второй тайл имеет верхнее левое положение в (Xb, Yb) тогда Yb=Ya+Ha.
[00116] Также могут применяться следующие ограничения. Если у тайла более одного левого соседнего тайла, высота тайла должна быть равна сумме высот всех его левых соседних тайлов. Когда тайл имеет более одного правого соседнего тайла, высота тайла должна быть равна сумме высот всех его левых соседних тайлов. Когда тайл имеет более одного верхнего соседнего тайла, ширина тайла должна быть равна сумме ширин всех его верхних соседних тайлов. Когда тайл имеет более одного нижнего соседнего тайла, ширина тайла должна быть равна сумме ширин всех его нижних соседних тайлов.
[00117] Ниже приводится конкретный пример осуществления вышеупомянутых аспектов. Процесс сканирования растров и тайлов CTB может быть следующим. Список ColWidth [i] для i в диапазоне от 0 до num_level1_tile_columns_minus1 включительно, определяющий ширину i-го столбца тайла первого уровня в блоках CTB, может быть получен следующим образом.
if( uniform_level1_tile_spacing_flag )
for( i = 0; i <= num_level1_tile_columns_minus1; i++ )
ColWidth[i] = ( (i+1) * PicWidthInCtbsY) / (num_level1_tile_columns_minus1+1) -
(i * PicWidthInCtbsY) / (num_level1_tile_columns_minus1+1)
else {
ColWidth[num_level1_tile_columns_minus1] = PicWidthInCtbsY (6-1)
for( i = 0; i < num_level1_tile_columns_minus1; i++ ) {
ColWidth[i] = tile_level1_column_width_minus1[i] + 1
ColWidth[num_tile_level1_columns_minus1] -= ColWidth[i]
}
}
[00118] Список RowHeight [j] для j в диапазоне от 0 до num_level1_tile_rows_minus1 включительно, определяющий высоту j-й строки тайла в блоках CTB, может быть получен следующим образом:
if( uniform_level1_tile_spacing_flag )
for( j = 0; j <= num_level1_tile_rows_minus1; j++ )
RowHeight[j] = ( ( j + 1 ) * PicHeightInCtbsY ) / ( num_level1_tile_rows_minus1+1 ) -
( j * PicHeightInCtbsY ) / ( num_level1_tile_rows_minus1+1 )
else {
RowHeight[num_level1_tile_rows_minus1] = PicHeightInCtbsY (6-2)
for( j = 0; j < num_level1_tile_rows_minus1; j++ ) {
RowHeight[j] = tile_level1_row_height_minus1[j] + 1
RowHeight[num_level1_tile_rows_minus1] -= RowHeight[j]
}
}
[00119] Список colBd [i] для i в диапазоне от 0 до num_level1_tile_columns_minus1+1 включительно, определяющий положение границы столбца i-го тайла в блоках CTB, может быть получен следующим образом:
for( colBd[0] = 0, i = 0; i <= num_level1_tile_columns_minus1; i++ ) colBd[i+1] = colBd[i] + ColWidth[i] (6-3)
[00120] Список rowBd [j] для j в диапазоне от 0 до num_level1_tile_rows_minus1+1 включительно, определяющий положение границы j-й строки тайла в блоках CTB, может быть получен следующим образом:
for( rowBd[0] = 0, j = 0; j <= num_level1_tile_rows_minus1; j++ ) rowBd[j+1] = rowBd[j] + RowHeight[j] (6-4)
[00121] Переменная NumTilesInPic, определяющая количество тайлов в изображении, относящихся к PPS, и списки TileColBd [i], TileRowBd [i], TileWidth [i] и TileHeight [i] для i в диапазоне от 0 до NumTilesInPic - 1, включительно, с указанием положения границы столбца i-го тайла в блоках CTB, положения границы строки i-го тайла в блоках CTB, ширины i-го столбца тайла в блоках CTB и высоты i-го столбца тайла в блоках CTBs, можно получить следующим образом:
for ( tileIdx = 0, i = 0; i < NumLevel1Tiles; i++ ) { tileX = i % ( num_level1_tile_columns_minus1 + 1 ) tileY = i / ( num_level1_tile_columns_minus1 + 1 ) if ( !level2_tile_split_flag[i] ) { (6-5)TileColBd[tileIdx] = colBd[tileX] TileRowBd[tileIdx] = rowBd[tileY] TileWidth[tileIdx] = ColWidth[tileX] TileHeight[tileIdx] = RowHeight[tileY] tileIdx++} else {for( k = 0; k <= num_level2_tile_columns_minus1[i]; k++ ) colWidth2[k] = ( (k+1) * ColWidth[tileX]) / (num_level2_tile_columns_minus1[i] +1) -(k * ColWidth[tileX]) / (num_level2_tile_columns_minus1[i] +1) for( k = 0; k <= num_level2_tile_rows_minus1[i]; k++ ) rowHeight2[k] = ( (k+1) * RowHeight[tileY]) / (num_level2_tile_rows_minus1[i] +1) -(k * RowHeight[tileY]) / (num_level2_tile_rows_minus1[i] +1) for( colBd2[0] = 0, k = 0; k <= num_level2_tile_columns_minus1[i]; k++ ) colBd2[k+1] = colBd2[k] + colWidth2[k]for( rowBd2[0] = 0, k = 0; k <= num_level2_tile_rows_minus1[i]; k++ ) rowBd2[k+1] = rowBd2[k] + rowHeight2[k] numSplitTiles = (num_level2_tile_columns_minus1[i] + 1) * (num_level2_tile_rows_minus1[i] + 1) for( k = 0; k < numSplitTiles; k++ ) { tileX2 = k % (num_level2_tile_columns_minus1[i] + 1) tileY2 = k / (num_level2_tile_columns_minus1[i] + 1) TileColBd[tileIdx] = colBd[tileX] + colBd2[tileX2] TileRowBd[tileIdx] = rowBd[tileY] + rowBd2[tileY2] TileWidth[tileIdx] = colWidth2[tileX2] TileHeight[tileIdx] = rowHeight2[tileY2] tileIdx++ } } } NumTilesInPic = tileIdx
[00122] Список CtbAddrRsToTs [ctbAddrRs] для ctbAddrRs в диапазоне от 0 до PicSizeInCtbsY - 1 включительно, определяющий преобразование из адреса CTB в растровом сканировании CTB изображения в адрес CTB при сканировании тайлов, можно получить следующим образом:
for (ctbAddrRs = 0; ctbAddrRs < PicSizeInCtbsY; ctbAddrRs++ ) { tbX = ctbAddrRs%PicWidthInCtbsY tbY = ctbAddrRs/PicWidthInCtbsY tileFound = FALSE for ( tileIdx = NumTilesInPic-1, i = 0; i < NumTilesInPic-1&& !tileFound; i++ ) { (6-6) tileFound = tbX< (TileColBd[i] + TileWidth[i] ) && tbY< ( TileRowBd[i] + TileHeight[i] ) if (tileFound) tileIdx = I } CtbAddrRsToTs[ctbAddrRs] = 0 for( i = 0; i < tileIdx; i++ ) CtbAddrRsToTs[ctbAddrRs] +=TileHeight[i] *TileWidth[i] CtbAddrRsToTs[ctbAddrRs] += ( tbY-TileRowBd[tileIdx] ) *TileWidth[tileIdx] +tbX-TileColBd[tileIdx] }
[00123] Список CtbAddrTsToRs [ctbAddrTs] для ctbAddrTs в диапазоне от нуля до PicSizeInCtbsY - 1 включительно, определяющий преобразование из адреса CTB при сканировании тайла в адрес CTB при сканировании растра CTB изображения, можно получить следующим образом.
for( ctbAddrRs = 0; ctbAddrRs < PicSizeInCtbsY; ctbAddrRs++ ) (6-7) CtbAddrTsToRs[CtbAddrRsToTs[ctbAddrRs]] = ctbAddrRs
[00124] Список TileId [ctbAddrTs] для ctbAddrTs в диапазоне от нуля до PicSizeInCtbsY - 1 включительно, определяющий преобразование из адреса CTB при сканировании тайла в идентификатор тайла, можно получить следующим образом.
for( i = 0, tileIdx = 0; i<=NumTilesInPic; i++, tileIdx++ ) for( y = TileRowBd[i]; y < TileRowBd[i+1]; y++ ) (6-8) for( x = TileColBd[i]; x < TileColBd[i+1]; x++ ) TileId[CtbAddrRsToTs[y*PicWidthInCtbsY+x]] = tileIdx
[00125] Список NumCtusInTile [tileIdx] для tileIdx в диапазоне от нуля до NumTilesInPic- 1 включительно, определяющий преобразование из индекса тайла в количество CTU в мозаичном элементе, может быть получен следующим образом.
for( i = 0,tileIdx = 0; i < NumTilesInPic; i++, tileIdx++ ) (6-9) NumCtusInTile[tileIdx] = TileColWidth[tileIdx] *TileRowHeight[tileIdx]
[00126] Пример синтаксиса RBSP набора параметров изображения следующий.
pic_parameter_set_rbsp() {
Descriptor
<b> pps_pic_parameter_set_id</b>
ue(v)
<b> pps_seq_parameter_set_id</b>
ue(v)
<b> transform_skip_enabled_flag</b>
u(1)
<b> single_tile_in_pic_flag</b>
u(1)
<b></b>if( !single_tile_in_pic_flag ) {
<b> num_level1_tile_columns_minus1</b>
ue(v)
<b> num_level1_tile_rows_minus1</b>
ue(v)
<b> uniform_level1_tile_spacing_flag</b>
u(1)
<b></b>if( !uniform_level1_tile_spacing_flag ) {
<b></b>for( i = 0; i < num_level1_tile_columns_minus1; i++ )
<b> level1_tile_column_width_minus1</b>[i]
ue(v)
<b></b>for( i = 0; i < num_level1_tile_rows_minus1; i++ )
<b> level1_tile_row_height_minus1</b>[i]
ue(v)
<b></b>}
<b> level2_tile_present_flag</b>
u(1)
<b></b>for( i = 0; level2_tile_present_flag && i < NumLevel1Tiles; i++ ) {
<b> level2_tile_split_flag</b>[i]
u(1)
<b></b>if( level2_tile_split_flag ) {
<b> num_level2_tile_columns_minus1</b>[i]
ue(v)
<b> num_level2_tile_rows_minus1</b>[i]
ue(v)
<b></b>}
<b></b>}
<b></b>if( NumTilesInPic > 1 )
<b>loop_filter_across_tiles_enabled_flag</b>
u(1)
}
rbsp_trailing_bits()
}
[00127] Пример семантики набора параметров изображения RBSP выглядит следующим образом. Num_level1_tile_columns_minus1 плюс 1 определяет количество столбцов тайла уровня 1, разделяющих изображение. Num_level1_tile_columns_minus1 должен находиться в диапазоне от нуля до PicWidthInCtbsY - 1 включительно. Если нет, значение num_level1_tile_columns_minus1 предполагается равным нулю. Num_level1_tile_rows_minus1 плюс 1 задает количество строк тайла первого уровня, разделяющих изображение. num_level1_tile_rows_minus1 должен быть в диапазоне от нуля до PicHeightInCtbsY - 1 включительно. Если нет, значение num_level1_tile_rows_minus1 предполагается равным нулю. Переменная NumLevel1Tiles устанавливается равной (num_level1_tile_columns_minus1+1) * (num_level1_tile_rows_minus1+1). Когда single_tile_in_pic_flag равно нулю, NumTilesInPic должен быть больше единицы. Uniform_level1_tile_spacing_flag устанавливается равным единице, чтобы указать, что границы столбца тайла уровня 1 и аналогично границы строки тайла уровня 1 распределены равномерно по изображению. Uniform_level1_tile_spacing_flag равен нулю, чтобы указать, что границы столбца тайла первого уровня и аналогично границы строк тайла первого уровня не распределяются равномерно по изображению, а явно сообщаются с использованием элементов синтаксиса level1_tile_column_width_minus1 [i] и level1_tile_row_height_minus1 [i]. Если отсутствует, значение uniform_level1_tile_spacing_flag считается равным единице. Level1_tile_column_width_minus1 [i] плюс 1 определяет ширину столбца i-го тайла первого уровня в блоках CTB. Level1_tile_row_height_minus1 [i] плюс 1 определяет высоту i-го тайла строки первого уровня в блоках CTB. Level2_tile_present_flag указывает, что один или более тайлов первого уровня разделены на множество тайлов. Level2_tile_split_flag [i] плюс 1 указывает, что i-й тайл первого уровня разделен на два или более тайла. Num_level2_tile_columns_minus1 [i] плюс 1 указывает количество столбцов тайла, разделяющих i-й тайл. Num_level2_tile_columns_minus1 [i] должен находиться в диапазоне от нуля до ColWidth [i] включительно. Если нет, значение num_level2_tile_columns_minus1 [i] предполагается равным нулю. Num_level2_tile_rows_minus1 [i] плюс 1 определяет количество строк тайла, разделяющих i-й тайл. Num_level2_tile_rows_minus1 [i] должен находиться в диапазоне от нуля до RowHeight [i] включительно. Если нет, значение num_level2_tile_rows_minus1 [i] предполагается равным нулю.
[00128] Следующие переменные получаются путем вызова процесса преобразования сканирования растров и тайлов CTB: список ColWidth [i] для i в диапазоне от 0 до num_level1_tile_columns_minus1 включительно, определяющий ширину столбца i-го тайла уровня 1 в блоках CTB; список RowHeight [j] для j в диапазоне от 0 до num_level1_tile_rows_minus1 включительно, определяющий высоту строки j-го тайла уровня 1 в блоках CTB; переменная NumTilesInPic, определяющая количество тайлов в изображении, относящихся к PPS; список TileWidth [i] для i в диапазоне от 0 до NumTilesInPic включительно, определяющий ширину i-го тайла в блоках CTB; список TileHeight [i] для i в диапазоне от 0 до NumTilesInPic включительно, определяющий высоту i-го тайла в блоках CTB; список TileColBd [i] для i в диапазоне от 0 до NumTilesInPic включительно, определяющий положение границы столбца i-го тайла в блоках CTB; список TileRowBd [i] для j в диапазоне от 0 до NumTilesInPic включительно, определяющий положение границы строки i-го тайла в блоках CTB; список CtbAddrRsToTs [ctbAddrRs] для ctbAddrRs в диапазоне от 0 до PicSizeInCtbsY - 1 включительно, определяющий преобразование из адреса CTB в растровом сканировании CTB изображения в адрес CTB в сканировании тайла; список CtbAddrTsToRs [ctbAddrTs] для ctbAddrTs в диапазоне от 0 до PicSizeInCtbsY - 1 включительно, определяющий преобразование из адреса CTB в развертке тайла в адрес CTB в развертке растра CTB изображения; список TileId [ctbAddrTs] для ctbAddrTs в диапазоне от 0 до PicSizeInCtbsY - 1 включительно, определяющий преобразование из адреса CTB при сканировании тайла в идентификатор тайла; список NumCtusInTile [tileIdx] для tileIdx в диапазоне от 0 до PicSizeInCtbsY - 1 включительно, определяющий преобразование из индекса тайла в количество CTU в тайле; и список FirstCtbAddrTs [tileIdx] для tileIdx в диапазоне от 0 до NumTilesInPic - 1 включительно, определяя преобразование из идентификатора тайла в адрес CTB при сканировании тайла первого CTB в тайле.
[00129] Пример семантики заголовка группы тайлов выглядит следующим образом. Параметр tile_group_address указывает адрес первого тайла в группе тайлов, где адрес тайла равен TileId [firstCtbAddrTs], как определено уравнением 6-8, причем firstCtbAddrTs является адресом CTB при сканировании тайлов CTB первого CTU. в группе тайла. Длина tile_group_address составляет Ceil (Log2 (NumTilesInPic)) бит. Значение tile_group_address должно быть в диапазоне от нуля до NumTilesInPic - 1 включительно, а значение tile_group_address не должно быть равно значению tile_group_address любого другого блока NAL группы кодированных тайлов того же кодированного изображения. Когда tile_group_address отсутствует, предполагается, что он равен нулю.
[00130] Ниже приводится второй конкретный пример осуществления вышеупомянутых аспектов. Ниже приведен пример процесса сканирования растров и тайлов CTB. Переменная NumTilesInPic, определяющая количество тайлов в изображении, относящихся к PPS, и списки TileColBd [i], TileRowBd [i], TileWidth [i] и TileHeight [i] для i в диапазоне от нуля до NumTilesInPic - 1, включительно, с указанием местоположения границы столбца i-го тайла в блоках CTB, положения границы строки i-го тайла в блоках CTB, ширины i-го столбца тайла в блоках CTB и высоты столбца i-го тайла в блоках CTB, выводятся следующим образом.
for ( tileIdx = 0, i = 0; i < NumLevel1Tiles; i++ ) { tileX = i % ( num_level1_tile_columns_minus1 + 1 ) tileY = i / ( num_level1_tile_columns_minus1 + 1 ) if ( !level2_tile_split_flag[i] ) { (6-5) TileColBd[tileIdx] = colBd[tileX] TileRowBd[tileIdx] = rowBd[tileY] TileWidth[tileIdx] = ColWidth[tileX] TileHeight[tileIdx] = RowHeight[tileY] tileIdx++ } else { if ( uniform_level2_tile_spacing_flag[i] ) { for( k = 0; k <= num_level2_tile_columns_minus1[i]; k++ ) colWidth2[k] = ( (k+1) * ColWidth[tileX]) / (num_level2_tile_columns_minus1[i] +1) - (k * ColWidth[tileX]) / (num_level2_tile_columns_minus1[i] +1) for( k = 0; k <= num_level2_tile_rows_minus1[i]; k++ ) rowHeight2[k] = ( (k+1) * RowHeight[tileY]) / (num_level2_tile_rows_minus1[i] +1) - (k * RowHeight[tileY]) / (num_level2_tile_rows_minus1[i] +1) } else { colWidth2[num_level2_tile_columns_minus1[i]] = ColWidth[tileX]) for( k = 0; k <= num_level2_tile_columns_minus1[i]; k++ ) { colWidth2[k] = tile_level2_column_width_minus1[k] + 1 colWidth2[k] -= colWidth2[k] } rowHeight2[num_level2_tile_rows_minus1[i]] = RowHeight[tileY]) for( k = 0; k <= num_level2_tile_rows_minus1[i]; k++ ) { rowHeigh2[k] = tile_level2_column_width_minus1[k] + 1 rowHeight2[k] -= rowHeight2[k] } } for( colBd2[0] = 0, k = 0; k <= num_level2_tile_columns_minus1[i]; k++ ) colBd2[k+1] = colBd2[k] + colWidth2[k] for( rowBd2[0] = 0, k = 0; k <= num_level2_tile_rows_minus1[i]; k++ ) rowBd2[k+1] = rowBd2[k] + rowHeight2[k] numSplitTiles = (num_level2_tile_columns_minus1[i] + 1) * (num_level2_tile_rows_minus1[i] + 1) for( k = 0; k < numSplitTiles; k++ ) { tileX2 = k % (num_level2_tile_columns_minus1[i] + 1) tileY2 = k / (num_level2_tile_columns_minus1[i] + 1) TileColBd[tileIdx] = colBd[tileX] + colBd2[tileX2] TileRowBd[tileIdx] = rowBd[tileY] + rowBd2[tileY2] TileWidth[tileIdx] = colWidth2[tileX2] TileHeight[tileIdx] = rowHeight2[tileY2] tileIdx++ } }}NumTilesInPic = tileIdx
[00131] Пример синтаксиса RBSP набора параметров изображения следующий.
pic_parameter_set_rbsp() {
<b>Descriptor</b>
pps_pic_parameter_set_id
ue(v)
pps_seq_parameter_set_id
ue(v)
transform_skip_enabled_flag
u(1)
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
num_level1_tile_columns_minus1
ue(v)
num_level1_tile_rows_minus1
ue(v)
uniform_level1_tile_spacing_flag
u(1)
if( !uniform_level1_tile_spacing_flag ) {
for( i = 0; i < num_level1_tile_columns_minus1; i++ )
level1_tile_column_width_minus1[i]
ue(v)
for( i = 0; i < num_level1_tile_rows_minus1; i++ )
level1_tile_row_height_minus1[i]
ue(v)
}
level2_tile_present_flag
u(1)
for( i = 0; level2_tile_present_flag && i < NumLevel1Tiles; i++ ) {
level2_tile_split_flag[i]
u(1)
if( level2_tile_split_flag ) {
num_level2_tile_columns_minus1[i]
ue(v)
num_level2_tile_rows_minus1[i]
ue(v)
uniform_level2_tile_spacing_flag[i]
u(1)
if( !uniform_level2_tile_spacing_flag[i] ) {
for( j = 0; j < num_level2_tile_columns_minus1[i]; j++ )
level2_tile_column_width_minus1[j]
ue(v)
for( j = 0; j < num_level2_tile_rows_minus1[i]; j++ )
level2_tile_row_height_minus1[j]
ue(v)
}
}
}
if( NumTilesInPic > 1 )
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00132] Пример семантики набора параметров изображения RBSP выглядит следующим образом. Uniform_level2_tile_spacing_flag [i] устанавливается равным единице, чтобы указать, что границы столбца тайла второго уровня i-го тайла первого уровня и, аналогично, границы строки тайла второго уровня i-го тайла первого уровня распределены равномерно по всему изображению. Uniform_level2_tile_spacing_flag [i] может быть установлен равным нулю, чтобы указать, что границы столбца тайла второго уровня для i-го тайла первого уровня и, аналогично, границы строки тайла второго уровня i-го тайла первого уровня не распределены равномерно по изображению, но сообщаются явно с использованием элементов синтаксиса level2_tile_column_width_minus1 [j] и level2_tile_row_height_minus1 [j]. Если отсутствует, значение uniform_level2_tile_spacing_flag [i] предполагается равным единице. Level2_tile_column_width_minus1 [j] плюс 1 определяет ширину столбца j-го тайла второго уровня i-го тайла первого уровня в блоках CTB. Level2_tile_row_height_minus1 [j] плюс 1 определяет высоту строки j-го тайла строки второго уровня i-го тайла первого уровня в блоках CTB.
[00133] Ниже приводится третий конкретный пример осуществления вышеупомянутых аспектов. Пример синтаксиса RBSP набора параметров изображения следующий.
pic_parameter_set_rbsp() {
<b>Descriptor</b>
pps_pic_parameter_set_id
ue(v)
pps_seq_parameter_set_id
ue(v)
transform_skip_enabled_flag
u(1)
if ( (PicWidthInCtbsY * CtbSizeY) >= (2 * MinTileWidth) || (PicHeightInCtbsY * CtbSizeY) >= (2 * MinTileHeight) )
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
if ( PicWidthInCtbsY * CtbSizeY >= (2 * MinTileWidth) )
num_level1_tile_columns_minus1
ue(v)
if ( PicHeightInCtbsY * CtbSizeY >= (2 * MinTileHeight) )
num_level1_tile_rows_minus1
ue(v)
uniform_level1_tile_spacing_flag
u(1)
if( !uniform_level1_tile_spacing_flag ) {
for( i = 0; i < num_level1_tile_columns_minus1; i++ )
level1_tile_column_width_minus1[i]
ue(v)
for( i = 0; i < num_level1_tile_rows_minus1; i++ )
level1_tile_row_height_minus1[i]
ue(v)
}
if( Level1TilesMayFurtherBeSplit )
level2_tile_present_flag
u(1)
for( i = 0; level2_tile_present_flag && i < NumLevel1Tiles; i++ ) {
if ( ColWidth[i] * CtbSizeY > MinTileWidth || RowHeight[i] * CtbSizeY > MinTileHeight )
level2_tile_split_flag[i]
u(1)
if( level2_tile_split_flag ) {
if ( ColWidth[i] * CtbSizeY >= (2 * MinTileWidth) )
num_level2_tile_columns_minus1[i]
ue(v)
if ( RowHeight[i] * CtbSizeY >= (2 * MinTileHeight) )
num_level2_tile_rows_minus1[i]
ue(v)
}
}
if (NumTilesInPic > 1)
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00134] Пример семантики набора параметров изображения RBSP выглядит следующим образом. Соответствие потока битов может потребовать применения следующих ограничений. Значение MinTileWidth определяет минимальную ширину тайла и должно быть равно двести пятьдесят шести отсчетам яркости. Значение MinTileHeight определяет минимальную высоту тайла и должно быть равно шестидесяти четырем отсчетам яркости. Значение минимальной ширины тайла и минимальной высоты тайла может изменяться в соответствии с определением профиля и уровня. Переменная Level1TilesMayBeF FurtherSplit может быть получена следующим образом:
Level1TilesMayBeFurtherSplit = 0for ( i = 0, !Level1TilesMayBeFurtherSplit && i = 0; i < NumLevel1Tiles; i++ ) if ( (ColWidth[i] * CtbSizeY >= (2 * MinTileWidth)) || (RowHeight[i] * CtbSizeY >= (2 * MinTileHeight))) Level1TilesMayBeFurtherSplit = 1
[00135] Level2_tile_present_flag указывает, что один или более тайлов уровня разделены на множество тайлов. Если отсутствует, предполагается, что значение level2_tile_present_flag равно нулю. Level2_tile_split_flag [i] плюс 1 указывает, что i-й тайл первого уровня разделен на два или более тайла. Если отсутствует, значение level2_tile_split_flag [i] предполагается равным нулю.
[00136] Ниже приводится четвертый конкретный пример осуществления вышеупомянутых аспектов. Можно сообщать о каждом местоположении и размере тайла. Синтаксис для поддержки такого сообщения структуры тайла может быть представлен в таблице ниже. Tile_top_left_address [i] и tile_bottom_right_address [i] - это индекс CTU в изображении, который указывает прямоугольную область, покрытую тайлом. Количество битов для обозначения этих элементов синтаксиса должно быть достаточным для представления максимального количества CTU в изображении.
pic_parameter_set_rbsp() {
<b>Descriptor</b>
…
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
tile_size_unit_idc
ue(v)
uniform_tile_flag
u(1)
if( uniform_tile_flag ) {
num_tile_columns_minus1
ue(v)
num_tile_rows_minus1
ue(v)
}
else {
num_tiles_minus2
ue(v)
for( i = 0; i < (num_tiles_minus2 + 2); i++ ) {
tile_top_left_address[i]
u(v)
tile_bottom_right_address[i]
u(v)
}
}
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00137] Можно сообщать о каждом местоположении и размере тайла. Синтаксис для поддержки такого сообщения структуры тайла может быть представлен в таблице ниже. Tile_top_left_address [i] - это индекс CTU первого CTU в тайле в порядке растрового сканирования CTU изображения. Ширина и высота тайла определяют размер тайла. Некоторые биты могут быть сохранены при сообщении этих двух элементов синтаксиса, сначала сообщая блок общего размера тайла.
pic_parameter_set_rbsp() {
<b>Descriptor</b>
…
.
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
tile_size_unit_idc
ue(v)
uniform_tile_flag
u(1)
if( uniform_tile_flag ) {
num_tile_columns_minus1
ue(v)
num_tile_rows_minus1
ue(v)
}
else {
num_tiles_minus2
ue(v)
for( i = 0; i < (num_tiles_minus2 + 2); i++ ) {
tile_top_left_address[i]
u(v)
tile_width_minus1[i]
ue(v)
tile_height_minus1[i]
ue(v)
}
}
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00138] В качестве альтернативы сообщение может быть следующим.
pic_parameter_set_rbsp() {
<b>Descriptor</b>
…
.
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
tile_size_unit_idc
ue(v)
uniform_tile_flag
u(1)
if( uniform_tile_flag ) {
num_tile_columns_minus1
ue(v)
num_tile_rows_minus1
ue(v)
}
else {
num_tiles_minus2
ue(v)
for( i = 0; i < (num_tiles_minus2 + 2); i++ ) {
tile_x_offset[i]
ue(v)
tile_y_offset[i]
ue(v)
tile_width_minus1[i]
ue(v)
tile_height_minus1[i]
ue(v)
}
}
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00139] В другом примере каждый размер тайла может сообщаться следующим образом. Для сообщения о гибкой структуре тайла местоположение каждого тайла может не сообщаться. Вместо этого может сообщаться флаг, указывающий, помещать ли тайл сразу справа от или сразу под предыдущим тайлом. Этот флаг может отсутствовать, если тайл может быть только справа или может быть только ниже текущего тайлы.
[00140] Значения tile_x_offset [i] и tile_y_offset [i] могут быть получены посредством следующих упорядоченных шагов.
tile_x_offset [0] и tile_y_offset [0] устанавливаются равными 0.
maxWidth устанавливается равным tile_width [0], а maxHeight устанавливается равным tile_height [0]
runningWidth устанавливается равным tile_width [0], а runningHeight устанавливается равным tile_height [0]
lastNewRowHeight устанавливается равным 0
TilePositionCannotBeInferred=false
Для i > 0 применяется следующее:
Пусть значение isRight установлено следующим образом:
если runningWidth+tile_width [i] < = PictureWidth, то isRight == 1
иначе isRight == 0
Пусть значение isBelow установлено следующим образом:
если runningHeight+tile_height [i] < = PictureHeight, то isBelow = = 1
иначе isBelow == 0
Если isRight == 1 && isBelow == 1, то TilePositionCannotBeInferred=true
Если isRight == 1 && isBelow == 0, применяется следующее:
right_tile_flag [i] = 1
tile_x_offset [i] = runningWidth.
tile_y_offset [i] = (runningWidth == maxWidth)? 0: lastNewRowHeight
lastNewRowHeight = (runningWidth == maxWidth)? 0: lastNewRowHeight
иначе, если isRight == 0 && isBelow == 1, то применяется следующее:
right_tile_flag [i] = 0
tile_y_offset [i] = runningHeight
tile_x_offset [i] = (runningHeight == maxHeight)? 0: tile_x_offset [i - 1]
lastNewRowHeight = (runningHeight == maxHeight && runningWidth == maxWidth)? runningHeight: lastNewRowHeight
иначе, если isRight == 1 && isBelow == 1 && right_tile_flag [i] == 1, то применяется следующее:
tile_x_offset [i] = runningWidth.
tile_y_offset [i] = (runningWidth == maxWidth)? 0: lastNewRowHeight
lastNewRowHeight = (runningWidth == maxWidth)? 0: lastNewRowHeight
else (т.е. isRight == 1 && isBelow == 1 && right_tile_flag [i] == 0), то применяется следующее:
tile_y_offset [i] = runningHeight
tile_x_offset [i] = (runningHeight == maxHeight)? 0: tile_x_offset [i - 1]
lastNewRowHeight = (runningHeight == maxHeight && runningWidth == maxWidth)? runningHeight: lastNewRowHeight
если right_tile_flag [i] == 1, применяется следующее:
runningWidth=runningWidth+tile_width [i]
если runningWidth > maxWidth, тогда установите maxWidth равным runningWidth
runningHeight равно tile_y_offset [i] + tile_height [i]
else (т.е. right_tile_flag [i] == 0) применяется следующее:
runningHeight=runningHeight+tile_height [i]
если runningHeight > maxHeight, установите maxHeight равным runningHeight
runningWidth равно tile_x_offset [i] + tile_width [i]
[00141] Предыдущее можно описать в псевдокоде следующим образом.
tile_x_offset[0] = 0 tile_y_offset[0] = 0 maxWidth = tile_width[0] maxHeight = tile_height[0] runningWidth = tile_width[0] runningHeight = tile_height[0] lastNewRowHeight = 0 isRight = false isBelow = false TilePositionCannotBeInferred = false for( i = 1; i < num_tiles_minus2 + 2; i++ ) { TilePositionCannotBeInferred = false isRight = ( runningWidth + tile_width[i] <= PictureWidth ) ? true : false isbelow = ( runningHeight + tile_height[i] <= PictureHeight ) ? true : false if (!isRight && !isBelow) //Error. This case shall not happen! if (isRight && isBelow) TilePositionCannotBeInferred = true if (isRight && !isBelow) { right_tile_flag[i] = true tile_x_offst[i] = runningWidth tile_y_offset[i] = (runningWidth == maxWidth) ? 0 : lastNewRowHeight lastNewRowHeight = tile_y_offset[i] } else if (!isRight && isBelow) { right_tile_flag[i] = false tile_y_offset[i] = runningHeight tile_x_offset[i] = (runningHeight == maxHeight) ? 0 : tile_x_offset[i - 1] lastNewRowHeight = (runningHeight == maxHeight && runningWidth == maxWidth) ? runningHeight : lastNewRowHeight } else if ( right_tile_flag[i] ) { tile_x_offst[i] = runningWidth tile_y_offset[i] = (runningWidth == maxWidth) ? 0 : lastNewRowHeight lastNewRowHeight = tile_y_offset[i] } else { tile_y_offset[i] = runningHeight tile_x_offset[i] = (runningHeight == maxHeight) ? 0 : tile_x_offset[i - 1] lastNewRowHeight = (runningHeight == maxHeight && runningWidth == maxWidth) ? runningHeight : lastNewRowHeight } } if ( right_tile_flag[i] ) { runningWidth += tile_width[i] if ( runningWidth > maxWidth ) maxWidth = runningWidth runningHeight = tile_y_offset[i] + tile_height[i] } else { runningHeight += tile_height[i] if ( runningHeight > maxHeight ) maxHeight = runningHeight runningWidth = tile_x_offset[i] + tile_width[i] }
pic_parameter_set_rbsp() {
<b>Descriptor</b>
…
.
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
tile_size_unit_idc
ue(v)
uniform_tile_flag
u(1)
if( uniform_tile_flag ) {
num_tile_columns_minus1
ue(v)
num_tile_rows_minus1
ue(v)
}
else {
num_tiles_minus2
ue(v)
for( i = 0; i < (num_tiles_minus2 + 2); i++ ) {
tile_width_minus1 [i]
ue(v)
tile_height_minus1 [i]
ue(v)
if( TilePositionCannotBeInferred )
right_tile_flag[i]
u(1)
}
}
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00142] Ниже приведена реализация получения размера последнего тайла в псевдокоде.
tile_x_offset[0] = 0 tile_y_offset[0] = 0 maxWidth = tile_width[0] maxHeight = tile_height[0] runningWidth = tile_width[0] runningHeight = tile_height[0] lastNewRowHeight = 0 isRight = false isBelow = false TilePositionCannotBeInferred = false for( i = 1; i < num_tiles_minus2 + 2; i++ ) { currentTileWidth = ( i == num_tiles_minus2 + 1 ) ? (PictureWidth - runningWidth) % PictureWidth : tile_width[i] currentTileHeight = ( i == num_tiles_minus2 + 1 ) ? (PictureHeight - runningHeight) % PictureHeight : tile_Height[i] isRight = ( runningWidth + currentTileWidth <= PictureWidth ) ? true : false isbelow = ( runningHeight + currentTileHeight <= PictureHeight ) ? true : false if (!isRight && !isBelow) //Error. This case shall not happen! if (isRight && isBelow) TilePositionCannotBeInferred = true if (isRight && !isBelow) { right_tile_flag[i] = true tile_x_offst[i] = runningWidth tile_y_offset[i] = (runningWidth == maxWidth) ? 0 : lastNewRowHeight lastNewRowHeight = tile_y_offset[i] } else if (!isRight && isBelow) { right_tile_flag[i] = false tile_y_offset[i] = runningHeight tile_x_offset[i] = (runningHeight == maxHeight) ? 0 : tile_x_offset[i - 1] lastNewRowHeight = (runningHeight == maxHeight && runningWidth == maxWidth) ? runningHeight : lastNewRowHeight } else if ( right_tile_flag[i] ) { tile_x_offst[i] = runningWidth tile_y_offset[i] = (runningWidth == maxWidth) ? 0 : lastNewRowHeight lastNewRowHeight = tile_y_offset[i] } else { tile_y_offset[i] = runningHeight tile_x_offset[i] = (runningHeight == maxHeight) ? 0 : tile_x_offset[i - 1] lastNewRowHeight = (runningHeight == maxHeight && runningWidth == maxWidth) ? runningHeight : lastNewRowHeight } } if ( right_tile_flag[i] ) { runningWidth += currentTileWidth if ( runningWidth > maxWidth ) maxWidth = runningWidth runningHeight = tile_y_offset[i] + currentTileHeight } else { runningHeight += currentTileHeight if ( runningHeight > maxHeight ) maxHeight = runningHeight runningWidth = tile_x_offset[i] + currentTileWidth }
pic_parameter_set_rbsp() {
Descriptor
…
.
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
tile_size_unit_idc
ue(v)
uniform_tile_flag
u(1)
if( uniform_tile_flag ) {
num_tile_columns_minus1
ue(v)
num_tile_rows_minus1
ue(v)
}
else {
num_tiles_minus2
ue(v)
for( i = 0; i < (num_tiles_minus2 + 1); i++ ) {
tile_width_minus1[i]
ue(v)
tile_height_minus1[i]
ue(v)
if( TilePositionCannotBeInferred )
right_tile_flag[i]
u(1)
}
}
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00143] Для дополнительной экономии битов сообщения количество уникальных размеров тайла может сообщаться для поддержки табулирования размера блока тайла. Тогда на размер тайла можно будет ссылаться только по индексу.
pic_parameter_set_rbsp() {
Descriptor
…
.
single_tile_in_pic_flag
u(1)
if( !single_tile_in_pic_flag ) {
tile_size_unit_idc
ue(v)
uniform_tile_flag
u(1)
if( uniform_tile_flag ) {
num_tile_columns_minus1
ue(v)
num_tile_rows_minus1
ue(v)
}
else {
num_tiles_minus2
ue(v)
num_unique_tile_sizes
ue(v)
for( i = 0; i < num_unique_tile_sizes; i++ ) {
preset_tile_width_minus1[i]
ue(v)
preset_tile_height_minus1[i]
ue(v)
}
for( i = 0; i < (num_tiles_minus2 + 2); i++ ) {
if ( num_unique_tile_sizes )
tile_size_idx[i]
u(v)
else {
tile_width_minus1[i]
ue(v)
tile_height_minus1[i]
ue(v)
}
if( TilePositionCannotBeInferred )
right_tile_flag[i]
u(1)
}
}
loop_filter_across_tiles_enabled_flag
u(1)
}
rbsp_trailing_bits()
}
[00144] Фиг. 9 - схематическая диаграмма примерного устройства 900 кодирования видео. Устройство 900 кодирования видео подходит для реализации раскрытых примеров/вариантов осуществления, как описано в данном документе. Устройство 900 кодирования видео содержит нисходящие порты 920, восходящие порты 950 и/или блоки приемопередатчиков (Tx/Rx) 910, включая передатчики и/или приемники для передачи данных в восходящем и/или нисходящем направлениях по сети. Устройство 900 кодирования видео также включает в себя процессор 930, содержащий в себя логический блок и/или центральный процессор (ЦП) для обработки данных и память 932 для хранения данных. Устройство 900 кодирования видео может также содержать электрические, оптико-электрические (OE, optical-to-electrical) компоненты, электрические-оптические (EO, electrical-to-optical) компоненты и/или компоненты беспроводной связи, подключенные к восходящим портам 950 и/или нисходящим портам 920 для передачи данных через электрические, оптические или беспроводные сети связи. Устройство 900 кодирования видео может также включать в себя устройства 960 ввода и/или вывода (I/O, input/output) для передачи данных пользователю и от пользователя. Устройства 960 ввода-вывода могут включать в себя устройства вывода, такие как дисплей для отображения видеоданных, динамики для вывода аудиоданных и т. д. Устройства 960 ввода-вывода могут также включать в себя устройства ввода, такие как клавиатура, мышь, трекбол и т.д., и/или соответствующие интерфейсы для взаимодействия с такими устройствами вывода.
[00145] Процессор 930 реализован аппаратно и программно. Процессор 930 может быть реализован как одна или более микросхем ЦП, ядер (например, как многоядерный процессор), программируемых вентильных матриц (FPGA), специализированных интегральных схем (ASIC) и процессоров цифровых сигналов (DSP, digital signal processors). Процессор 930 связан с нисходящими портами 920, Tx/Rx 910, восходящими портами 950 и памятью 932. Процессор 930 содержит модуль 914 кодирования. Модуль 914 кодирования реализует раскрытые варианты осуществления, описанные в данном документе, такие как способы 100, 1000 и 1100, механизм 600 и/или приложение 700, которое может использовать поток 500 битов и/или изображение, разделенное согласно гибкой схеме 800 тайла. Модуль 914 кодирования также может реализовывать любой другой способ/механизм, описанный в данном документе. Кроме того, модуль 914 кодирования может реализовывать систему 200 кодеков, кодер 300 и/или декодер 400. Например, модуль 914 кодирования может разделить изображение на тайлы первого уровня и разбить тайлы первого уровня на тайлы второго уровня. Модуль 914 кодирования также может сообщать вспомогательные данные, чтобы указать конфигурацию тайлов первого уровня и тайлов второго уровня. Модуль 914 кодирования дополнительно поддерживает использование таких механизмов для объединения тайлов изображений с разными разрешениями в одно изображение для различных случаев использования, как описано в данном документе. Таким образом, модуль 914 кодирования улучшает функциональные возможности устройства 900 кодирования видео, а также решает проблемы, которые являются специфическими для искусства кодирования видео. Кроме того, модуль 914 кодирования выполняет преобразование устройства 900 кодирования видео в другое состояние. В качестве альтернативы, модуль 914 кодирования может быть реализован как инструкции, хранящиеся в памяти 932 и выполняемые процессором 930 (например, как компьютерный программный продукт, хранящийся на некратковременном носителе).
[00146] Память 932 содержит один или более типов памяти, таких как диски, ленточные накопители, твердотельные накопители, постоянное запоминающее устройство (ROM, Read Only Memory), оперативное запоминающее устройство (RAM, Random Access Memory), флэш-память, троичное запоминающее устройство с адресацией по содержимому (TCAM, Ternary Content-Addressable Memory), статическое произвольное запоминающее устройство. доступ к памяти (SRAM, Static Random-Access Memory) и т. д. Память 932 может использоваться как запоминающее устройство переполнения данных, для хранения программ, когда такие программы выбраны для выполнения, и для хранения инструкций и данных, которые считываются во время выполнения программы.
[00147] Фиг. 10 является блок-схемой примерного способа 1000 кодирования изображения с использованием гибкой схемы разбиения на тайлы, такой как гибкая схема 800 тайла. Способ 1000 может осуществляться кодером, таким как система 200 кодека, кодер 300 и/или устройство 900 кодирования видео, при выполнении способа 100, механизма 600 и/или поддерживающего приложения 700. Кроме того, способ 1000 может осуществляться для формирования потока 500 битов для передачи в декодер, такой как декодер 400.
[00148] Способ 1000 может начинаться, когда кодер принимает видеопоследовательность, включающую в себя множество изображений, и решает кодировать эту видеопоследовательность в поток битов, например, на основе ввода пользователя. Например, видеопоследовательность и, следовательно, изображения можно кодировать с множеством разрешений. На этапе 1001 изображение разделяется на множество тайлов первого уровня. На этапе 1003 подмножество тайлов первого уровня разделяется на множество тайлов второго уровня. Каждый тайл второго уровня может содержать один прямоугольный сегмент данных изображения. В некоторых примерах тайлы первого уровня за пределами подмножества содержат данные изображения с первым разрешением, а тайлы второго уровня содержат данные изображения со вторым разрешением, отличным от первого разрешения. В некоторых примерах каждый тайл первого уровня в подмножестве тайлов первого уровня включает в себя два или более полных тайла второго уровня. В некоторых примерах тайлы первого уровня и тайлы второго уровня могут быть назначены в одну или более групп тайлов, так что все тайлы в соответствующей группе тайлов ограничены для покрытия прямоугольной части изображения.
[00149] На этапе 1005 тайлы первого уровня и тайлы второго уровня кодируются в поток битов. В некоторых примерах данные, указывающие конфигурацию тайлов второго уровня, могут быть закодированы в потоке битов в наборе параметров изображения, связанном с изображением. Конфигурация тайлов второго уровня может сообщаться как количество столбцов тайлов второго уровня и количество строк тайлов второго уровня (например, в PPS). В некоторых примерах данные, явно указывающие количество столбцов тайла второго уровня и количество строк тайла второго уровня, исключаются из потока битов, когда ширина тайла первого уровня меньше двукратного минимального порогового значения ширины, а высота тайла первого уровня меньше двукратного минимального порогового значения высоты. В некоторых примерах указания разделения, указывающие тайлы первого уровня, которые разделены на тайлы второго уровня, могут быть закодированы в потоке битов (например, в PPS). В некоторых примерах указания разделения могут быть исключены из потока битов для соответствующих тайлов первого уровня, когда ширина тайла первого уровня меньше минимального порогового значения ширины, а высота тайла первого уровня меньше минимального порогового значения высоты.
[00150] На этапе 1007 поток битов может быть сохранен в памяти для передачи в декодер. Поток битов может быть передан в декодер по запросу.
[00151] Фиг. 11 является блок-схемой примерного способа 1100 декодирования изображения с использованием гибкой схемы разбиения на тайлы, такой как гибкая схема 800 тайла. Способ 1100 может осуществляться декодером, например, системой 200 кодека, декодером 400 и/или устройством 900 кодирования видео, при выполнении способа 100, механизма 600 и/или вспомогательного приложения 700. Кроме того, способ 1100 может осуществляться после приема потока 500 битов от кодера, такого как кодер 300.
[00152] Способ 1100 может начинаться, когда декодер начинает прием потока битов кодированных данных, представляющих видеопоследовательность, например, в результате метода 1000. Поток битов может содержать видеоданные из видеопоследовательностей, закодированных с множеством разрешений. На этапе 1101 принимается поток битов. Поток битов включает в себя изображение, разделенное на множество тайлов первого уровня. Подмножество тайлов первого уровня дополнительно разделяется на множество тайлов второго уровня. Каждый тайл второго уровня содержит один прямоугольный сегмент данных изображения. В некоторых примерах тайлы первого уровня за пределами подмножества содержат данные изображения с первым разрешением, а тайлы второго уровня содержат данные изображения со вторым разрешением, отличным от первого разрешения. В некоторых примерах каждый тайл первого уровня в подмножестве тайлов первого уровня включает в себя два или более полных тайла второго уровня. В некоторых примерах тайлы первого уровня и тайлы второго уровня назначаются в одну или более групп тайлов, так что все тайлы в соответствующей группе тайлов ограничены, чтобы покрывать прямоугольную часть изображения.
[00153] На этапе 1103 конфигурация тайлов первого уровня и конфигурация тайлов второго уровня определяются на основе параметров, включенных в поток битов. Например, данные, указывающие конфигурацию тайлов второго уровня, могут быть получены из набора параметров изображения, связанного с изображением. В некоторых примерах конфигурация тайлов второго уровня сообщается как количество столбцов тайлов второго уровня и количество строк тайлов второго уровня. В некоторых примерах данные, явно указывающие количество столбцов тайла второго уровня и количество строк тайла второго уровня, исключаются из потока битов для соответствующего тайла, когда ширина тайла первого уровня меньше двукратного минимального порогового значения ширины и высота тайла первого уровня меньше двукратного минимального порогового значения высоты. В некоторых примерах указания разделения могут быть получены из потока битов как часть определения конфигураций тайлов первого уровня и тайлов второго уровня. Указания разделения могут указывать тайлы первого уровня, которые разделены на тайлы второго уровня. В некоторых примерах указания разделения исключаются из потока битов, когда ширина тайла первого уровня меньше минимального порогового значения ширины, а высота тайла первого уровня меньше минимального порогового значения высоты.
[00154] На этапе 1105 тайлы первого уровня и тайлы второго уровня декодируются на основе конфигурации тайлов первого уровня и конфигурации тайлов второго уровня. На этапе 1107 реконструированная видеопоследовательность формируется для отображения на основе декодированных тайлов первого уровня и тайлов второго уровня.
[00155] Фиг. 12 является схематической диаграммой примерной системы 1200 для кодирования видеопоследовательности с использованием гибкой схемы расположения тайлов, такой как гибкая схема 800 расположения тайлов видео. Система 1200 может быть реализована посредством кодера и декодера, такого как система 200 кодеков, кодер 300, декодер 400 и/или устройство 900 кодирования видео. Кроме того, система 1200 может использоваться при реализации способа 100, 1000, 1100, механизма 600 и/или приложения 700. Система 1200 также может кодировать данные в поток битов, такой как поток 500 битов, и декодировать такой поток битов для отображения пользователю.
[00156] Система 1200 включает в себя видеокодер 1202. Видеокодер 1202 содержит модуль 1201 разделения для разделения изображения на множество тайлов первого уровня и разделения подмножества тайлов первого уровня на множество тайлов второго уровня, при этом каждый тайл второго уровня содержит один прямоугольный сегмент данных изображения. Видеокодер 1202 дополнительно содержит модуль 1205 кодирования для кодирования тайлов первого уровня и тайлов второго уровня в поток битов. Видеокодер 1202 дополнительно содержит модуль 1207 хранения для хранения потока битов для передачи в декодер. Видеокодер 1202 дополнительно содержит передающий модуль 1209 для передачи потока битов в декодер. Видеокодер 1202 может быть дополнительно выполнен с возможностью выполнения любого из этапов способа 1000.
[00157] Система 1200 также включает в себя видеодекодер 1210. Видеодекодер 1210 содержит модуль 1211 приема для приема потока битов, включающего изображение, разделенное на множество тайлов первого уровня, при этом подмножество тайлов первого уровня дополнительно разделено на множество тайлов второго уровня, и при этом каждый тайл второго уровня содержит один прямоугольный сегмент данных изображения. Видеодекодер 1210 дополнительно содержит модуль 1213 определения для определения конфигурации тайлов первого уровня и конфигурации тайлов второго уровня на основе параметров, включенных в поток битов. Видеодекодер 1210 дополнительно содержит модуль 1215 декодирования для декодирования тайлов первого уровня и тайлов второго уровня на основе конфигурации тайлов первого уровня и конфигурации тайлов второго уровня. Видеодекодер 1210 дополнительно содержит модуль 1217 формирования для формирования реконструированной видеопоследовательности для отображения на основе декодированных тайлов первого уровня и тайлов второго уровня. Видеодекодер 1210 может быть дополнительно выполнен с возможностью выполнения любого из этапов способа 1100.
[00158] Первый компонент напрямую связан со вторым компонентом, когда нет промежуточных компонентов, за исключением линии, следа или другой среды между первым компонентом и вторым компонентом. Первый компонент косвенно связан со вторым компонентом, когда есть промежуточные компоненты, отличные от линии, следа или другой среды между первым компонентом и вторым компонентом. Термин «связанный» и его варианты включают как напрямую связанные, так и косвенно связанные. Использование термина «примерно» означает диапазон, содержащий ± 10% от следующего числа, если не указано иное.
[00159] Также следует понимать, что этапы примерных способов, изложенных в данном документе, не обязательно должны выполняться в описанном порядке, и порядок этапов таких способов следует понимать как просто примерный. Аналогичным образом, в такие способы могут быть включены дополнительные этапы, а некоторые этапы могут быть опущены или объединены в способах, согласующихся с различными вариантами осуществления настоящего изобретения.
[00160] Хотя в настоящем изобретении было предоставлено несколько вариантов осуществления, можно понять, что раскрытые системы и способы могут быть воплощены во многих других конкретных формах без отступления от сущности или объема настоящего изобретения. Настоящие примеры следует рассматривать как иллюстративные, а не как ограничительные, и цель не ограничиваться приведенными здесь деталями. Например, различные элементы или компоненты могут быть объединены или интегрированы в другую систему, или определенные функции могут быть опущены или не реализованы.
[00161] Кроме того, методы, системы, подсистемы и способы, описанные и проиллюстрированные в различных вариантах осуществления как отдельные или отдельные, могут быть объединены или интегрированы с другими системами, компонентами, технологиями или способами без выхода за рамки настоящего изобретения. Другие примеры изменений, замен и переделок могут быть установлены специалистом в данной области техники и могут быть выполнены без отклонения от сущности и объема, раскрытых в данном документе.