0 - LanCats

advertisement
-1
1.1. АНАЛИЗ СТРУКТУРЫ ФОРМАТА ФАЙЛА MPEG-2
1.1.1. АНАЛИЗ СЛУЖЕБНОЙ ИНФОРМАЦИИ ФОРМАТА
MPEG-2
В настоящем подразделе выполнено подробное описание служебной
информации системного уровня стандарта MPEG-2. В качестве основного
источника сведений взят текст стандарта ISO/IEC 13818-1.
1.1.1.1. Общее описание системного уровня стандарта MPEG-2
Первая часть стандарта МPEG-2 (Рекомендации ITU-T H.222.0|
ISO/IEC 13818-1) определяет системный уровень обработки различных видов информации. Она разработана в основном в целях поддержки методов
кодирования аудио и видео информации, определенных в частях 2 и 3
МPEG-2. Системный уровень реализует пять основных функций:
1) синхронизация нескольких сжатых потоков при декодировании,
2) соединение нескольких сжатых потоков в один поток,
1) инициализация буферов для начала декодирования,
2) непрерывное управление буферами,
5) управление времеными интервалами потоков.
Видеоданные
Аудиоданные
Видеокодер
Аудиокодер
Пакетизатор
Пакетизатор
Видео ПЭП
Аудио
ПЭП
Мультиплексор
программного
потока
Мультиплексор
транспортного
потока
Программный
поток
Транспортный
поток
Степень спецификации систем
Рис.1.1.1.1. Упрощенная структyрная схема формирования потоков в MPEG-2
Для организации многопрограммного вещания MPEG-2 обеспечивает объединение в общий поток программы, сформированные в разных местах и в разное время и не имеющие единой синхронизации. Причем средства объединения и транспортирования программ, состоящих из видео,
-2
аудииоинформации и данных, обеспечивают обратную совместимость с
MPEG-1.
Стандарт MPEG-2 предлагает две конструкции многокомпонентного
цифрового потока. Более простой программный поток (ПП) используется
для записи и передачи данных с переменной скоростью в среде без ошибок
(запись на магнитные и оптические носители, передача по линиям на расстояние в единицы метров и т.д.). Структура ПП включает пачки пакетов
(pack), содержащие один или несколько пакетов пакетизированных элементарных потоков (ПЭП или PES) и заголовок со ссылкой на системные
часы (SCR — System Clock Reference) (рис.1.1.1.2.). В программном потоке
может быть до 16 видео и до 32 звуковых потоков ПЭП, но все они считаются компонентами одной программы, так как имеют общую временную
базу (единый генератор тактовой частоты).
Рис.1.1.1.2. Структура программного потока MPEG-2
Транспортный поток (ТП) представляет собой более высокий уровень организации данных. В ТП пакетированные элементарные потоки,
принадлежащие разным программам, переносятся в различных транспортных пакетах небольшой длины, снабженных кодозащитой для передачи в
каналах с ошибками. Ошибки канала могут быть в виде ошибочной передачи битов или потери пакетов. Один транспортный поток может переносить несколько программ, не связанных единой временной базой, каждая
из нескольких компонентов. Передача оказывается, по сути дела, асинхронной и потому не может управляться единым синхронизирующим сигналом.
Транспортный поток может иметь как фиксированную, так и переменную скорость. В обоих случаях составляющие его элементарные потоки могут также обладать либо постоянной, либо переменной скоростью.
Синтаксические и семантические ограничения, накладываемые на поток,
совпадают в обоих случаях. Скорость транспортного потока определяется
значениями и расположением полей ссылок на программные часы
(Program Clock Reference -PCR), которые в общем случае отдельны для
каждой программы. Создание и поддержание транспортного потока, обслуживающего несколько программ с различной временной базой при переменной общей скорости потока является непростой задачей.
Транспортный поток может создаваться при помощи произвольного
метода, позволяющего создать поток c требуемым описанием. Транспортные потоки, содержащие несколько программ, могут создаваться из элементарных потоков кодированных данных, из программных потоков, или
-3
из других транспортных потоков, содержащих одну или несколько программ.
Транспортный поток организован так, чтобы упростить выполнение
следующих действий:
1. Извлечение получателем кодированных данных требуемой программы из транспортного потока, их декодирование и воспроизведение результатов (см. рис. 1.1.1.3).
2. Извлечение из транспортного потока пакетов, принадлежащих
требуемой программе и создание выходного транспортного потока, содержащего только эту программу (см. рис. 1.1.1.4).
3. Извлечение из одного или нескольких транспортных потоков пакетов, принадлежащих одной или нескольким программам, и создание из
них выходного транспортного потока.
4. Извлечение данных одной программы из транспортного потока и
создание программного потока, содержащего только извлеченную программу (см. рис. 1.1.1.5).
5. Преобразование программного потока в транспортный поток, передачу его по каналу с ошибками и восстановление на приеме программного потока.
На рис. 1.1.1.3 и рис. 1.1.1.4 показаны прототипы систем демультиплексирования и декодирования, принимающих на вход транспортный поток. На рис. 1.1.1.3 показан первый случай, в котором транспортный поток
напрямую демультиплексируется и декодируется. Транспортные потоки
создаются на двух уровнях: системный уровень и уровень сжатия. Во
входном потоке декодера транспортного потока системный уровень является оболочкой уровня сжатия. Входные потоки видео и аудио декодеров
обладают только уровнями сжатия.
Действия, производимые прототипом декодера, принимающего
транспортные потоки, относятся либо ко всему транспортному потоку
(«multiplex-wide operations»), либо к определенным элементарным потокам («stream-specific operations»). Системный уровень транспортного потока делится на два подуровня: один для операций над всем потоком
(multiplex-wide), другой для операций над элементарным потоком (уровень
пакетов ПЭП (PES).
На рис. 1.1.1.3 показан прототип декодера транспортных потоков,
обеспечивающий декодирование видео и аудио информации. Представленная архитектура декодера не единственная: такие системные функции,
как управление синхронизацией, вполне могут быть распределены между
декодерами элементарных потоков и канальным декодером. Информация
об ошибках, выявленных канальным декодером, может передаваться видео
и аудио декодерам различными способами. Представленная структура прототипа декодера не налагает никаких требований на структуру декодера
транспортного потока. Кроме аудио/видео информации, могут передаваться и другие данные, но они на этом рисунке не показаны.
-4
Видеодекодер
Канал
Декодер
канала
Демультиплексор
и декодер
транспортного
потока
Устройство
синхронизации
Аудиодекодер
Транспортный поток, содержащий
одну или несколько программ
Рис.1.1.1.3. Пример демультиплексирования и декодирования транспортного потока
Рисунок 1.1.1.4 иллюстрирует второй случай, в котором транспортный поток, содержащий несколько программ, преобразуется в транспортный поток, содержащий одну программу. В данном случае операция повторного демультиплексирования может привести к необходимости коррекции полей ссылок на программые часы PCR, в соответствии с изменениями положения PCR в битовом потоке.
Канал
Декодер
канала
Транспортный поток, содержащий
несколько программ
Демультиплексор
и декодер
транспортного
потока
Транспортный поток с единственной
программой
Рис.1.1.1.4. Пример мультиплексирования транспортного потока
Рисунок 1.1.1.5 служит иллюстрацией к случаю, в котором транспортный поток, содержащий несколько программ, подвергается демультиплексированию, после чего преобразуется в программный поток.
-5
Канал
Программный
декодер
Демультиплексор
транспортного потока и
мультиплексор
программного потока
Транспортный поток, содержащий
несколько программ
Программный поток
Рис.1.1.1.5. Пример преобразования транспортного потока в программный поток
Видно, что возможны различные преобразования типов и конфигураций транспортных потоков. Для упрощения таких преобразований в синтаксе транспортного потока и программного потока предусмотрены специальные поля. Конкретные реализации демультиплексоров или декодеров
не обязательно должны реализовывать все перечисленные функции.
Стандартная схема построения ТП в MPEG-2 может быть описана как
двухступенчатая. На первом этапе формируется программный поток (ПП)
путем мультиплексирования одного или нескольких ПЭП с общей временной базой и индивидуальными идентификаторами РID (рис. 1.1.1.6а). На
втором шаге ПП нескольких программ и управляющие потоки объединяются методом асинхронного пакетного мультиплексирования в единый
транспортный поток (рис.1.1.1.6б). Отметим, что транспортный поток может быть построен и непосредственно из ПЭП или других ТП, если при
этом сохраняются общие правила синтаксиса MPEG. Такая иерархическая
структура обеспечивает большую гибкость в построении систем вещания.
Можно, например, объявить один ПЭП принадлежащим более чем одной
программе и организовать так называемые виртуальные каналы, можно
использовать несколько потоков одного вида для масштабирования, возможна организация межрегионального вещания с выбором отдельного
языка для каждого региона и т.д.
Рис.1.1.1.6. Объединение ПЭП в программный поток (а) и программных потоков в
транспортный поток (б)
Гибкость мультиплексирования ТП представляет одну интересную
возможность построения многопрограммной системы вещания, связанную
с вводом в ТП, формируемый мультиплексором из программ, кодирован-
-6
ных локальными кодерами, «постороннего» транспортного потока, поступившего по линии связи и имеющего другую временную базу (режим ремулътиплексирования). Современные мультиплексоры легко справляются
с такой задачей, позволяя при этом выбрать из компонентов пришедшего
ТП желаемые, при необходимости изменить PID этих компонент, режим
скремблирования и другие параметры.
Еще одна возможность гибкого изменения параметров сжатого сигнала — статистическое мультиплексирование, заключающееся в динамическом перераспределении ресурса битов между кодерами в многопрограммном цифровом потоке с учетом конкретных особенностей изображения в каждой программе таким образом, чтобы качество всех программ
оставалось возможно более высоким. Более сложный контроллер может
использовать технологию «заглядывания вперед» для оценки сложности
представленных кадров и эта информация может служить для подстройки
управления скоростью.
Система работает следующим образом. Управляющий контроллер
статистического мультиплексора получает от всех кодеров информацию о
сложности обрабатываемого в данный момент изображения, оценивает ее
и выделяет каждому кодеру ресурс битов, пропорциональный потребности. Дело в том, что при суммировании скоростей нескольких каналов
среднее значение скорости растет пропорционально сумме средних значений составляющих, а среднеквадратичное отклонение изменяется пропорционально квадратному корню из числа каналов. Если в пакете программ
присутствуют, например, фильмовые, детские, спортивные, развлекательные программы, в разные моменты времени в зависимости от наличия
движения, детальности изображения, цветовой насыщенности они требуют
разной скорости выходного потока для сохранения примерно одинакового
субъективного качества изображения и, что еще важнее, пики скорости
наступают в разные моменты времени, так что суммарная скорость может
быть заметно снижена.
Программный поток
-7
Рассмотрим более подробно структуру программного потока
(Program Stream), предназначенным для передачи и хранения программ закодированных данных или других данных в условиях, предполагающих
малую вероятность ошибок в канале передачи.
Программные потоки могут обладать как фиксированной, так и переменной скоростью. В обоих случаях составляющие их элементарные потоки могут также обладать либо постоянной, либо переменной скоростью.
Синтаксические и семантические ограничения, накладываемые на поток,
совпадают в обоих случаях. Скорость программного потока определяется
значениями и позициями полей ссылки на системные часы (SCR - System
Clock References) и mux_rate.
Прототип декодера программного потока аудио/видео данных показан на рисунке 1.1.1.7. Представленная архитектура декодера не является
единственной: такие системные функции, как управление синхронизацией
декодера, вполне могут быть распределены между декодерами элементарных потоков и канальным декодером. Представленная структура прототипа декодера не налагает никаких требований на структуру декодера программного потока. Также возможна передача других данных кроме
аудио/видео информации, но они на этом рисунке не показаны.
Видеодекодер
Канал
Декодер
канала
Декодер
программного
потока
Устройство
синхронизации
Аудиодекодер
Программный поток
Рис.1.1.1.7. Прототип декодера программного потока
Прототип декодера программного потока, показанный на рис. 1.1.1.7,
состоит из декодеров системной, видео и аудио информации, которые соответствуют частям 1, 2 и 3 рассматриваемого стандарта. В данном декодере предполагается, что мультиплексированные данные одного или нескольких аудио/видео потоков хранятся или передаются по некоторому
каналу в соответствующем каналу формате. Формат, соответствующий каналу, не определяется в MPEG-2, и декодирование передаваемых данных
канала не является частью прототипа декодера.
-8
На вход декодера программного потока поступает программный поток. Декодер программного потока производит демультиплексирование
потока, и демультиплексированные данные используются в качестве входов для видео и аудио декодеров, восстанавливающих видео и аудио сигналы. В устройстве синхронизации выделяется информация синхронизации. Аудио и видео декодеры синхронизируются между собой и с каналом
при помощи этой информации.
Транспортные потоки создаются на двух уровнях: системный уровень и уровень сжатия. Во входном потоке декодера программного потока системный уровень является оболочкой уровня сжатия. Входные потоки видео и аудио декодеров относятся только к уровню сжатия.
Действия, производимые прототипом декодера, принимающего
транспортные потоки, относятся либо ко всему программному потоку
(«multiplex-wide operations»), либо к определенным элементарным потокам («stream-specific operations»). Системный уровень программного потока делится на два подуровня: один для операций над всем потоком (уровень пакетов), другой для операций зависящих от потока (уровень пакетов
PES).
Преобразование транспортного потока в программный поток
Преобразование транспортного потока в программные потоки реализуется при помощи пакетов PES. Пакеты PES реализуют соответствие
нагрузки одного мультиплексированного потока нагрузке другого мультиплексированного битового потока. В пакетах PES присутствует поле
program_packet_sequence_counter, и обеспечивается восстановление правильного порядка следования пакетов в программном потоке.
Дополнительная информация, необходимая для преобразования
(например, соотношение между элементарными потоками), доступна из
таблиц и заголовков обоих потоков. Если такая информация передается,
она является справедливой для любого потока до и после его преобразования.
1.1.1.1.2. Описание потоков формата MPEG-2
Пакетированный злементарный поток (PES)
Транспортные потоки и программные потоки логически состоят из
пакетов ПЭП (PES). Пакеты PES будут использоваться для преобразования
из транспортного потока в программные потоки; в некоторых случаях для
преобразования потоков не требуется модификации пакетов PES. Пакеты
PES могут быть значительно больше, чем пакеты транспортного потока.
-9
Рис.1.1.1.8. Структура пакета ПЭП
Непрерывная последовательность пакетов PES одного элементарного
потока с одним идентификатором потока может быть использована для создания потока PES. Когда пакеты PES используются для организации потока PES, они должны содержать такие поля, как поле ссылок на системные часы элементарного потока (Elementary Stream Clock Reference ESCR) и скорость элементарного потока (ES_Rate). Потоком PES называется непрерывная последовательность байт элементарного потока в исходном порядке. Потоки PES не содержат некоторой требуемой системной
информации, которая содержится в программных и транспортных потоках.
Примером такой системной информации может служить информация, содержащаяся в заголовке пакета, системном заголовке, структуре программного потока, справочнике программного потока, таблице состава
программ, а также элементы синтаксиса пакетов транспортного потока.
Поток пакетов PES является логической конструкцией, полезной для
реализаций данного стандарта, однако он не определяется как поток, предназначенный для обмена информацией. Приложения, нуждающиеся в потоках, состоящих только из одного элементарного потока, могут использовать программные потоки или транспортные потоки, состоящие только из
одного элементарного потока. Эти потоки содержат всю необходимую системную информацию. Могут быть создано несколько программных и
транспортных потоков, содержащих по одному элементарному потоку и
имеющих одинаковое базовое время. Таким образом, подобные потоки могут быть использованы для транспортировки полной программы, то есть
программы, включающей аудио и видео информацию.
Структура пакета транспортного потока
- 10
Пакеты ТП имеют фиксированную длину 188 байт, из которых 4
байта выделяются на заголовок и 184 байта — на полезные данные. Это
могут быть видео- или звукоданные, данные пользователя или пустые байты (1111 1111), называемые стаффингом. Каждый пакет переносит данные
только одного вида. Размер пакета выбран для совместимости с широко
применяемым на сетях связи стандартом асинхронной передачи данных
ATM. Ячейка ATM имеет длину 53 байта, из которых для данных используется 47 байт (с учетом 1 байта на уровень адаптации). Один пакет
MPEG-2 длиной 188 байт упаковывается в 4 пакета ATM. Структура заголовка показана на рис. 1.1.1.9. Первый байт — байт синхронизации - содержит зарезервированное кодовое число 0x47, легко опознаваемое демультиплексором. Далее идут три однобитовых флага (ошибки передачи,
начала пакета ПЭП и приоритетной передачи) и 13-битовый идентификатор типа пакета PID (Packet IDentifier), указывающий на принадлежность
пакета тому или иному потоку данных. PID служит основным признаком,
по которому демультиплексор сортирует приходящие пакеты на приемной
стороне. Из общего числа 8192 возможных значений PID 16 выделены на
общесистемные цели, номер 8191 (0 х 1FFF) закреплен за стаффинговыми
байтами, остальные могут назначаться пользователями произвольно для
отдельных компонент своих программ.
Рис.1.1.1.9. Структура заголовка пакета транстпортного потока МPEG-2
Передача информации пакетами фиксированной длины и система
идентификаторов имеют свои преимущества. Пропускная способность в
этом случае используется в максимальной степени и может динамически
перераспределяться между программами. Можно добавлять новые ПЭП
или удалять ненужные, не меняя в целом структуру потока. Для извлечения необходимой информации декодеру не нужно знать детальную структуру всего потока, достаточно указать только PID, который всегда находится в заголовке на одном и том же месте.
Вернемся к рис. 1.1.1.9. Еще один байт в заголовке содержит три необходимых указателя:
- 11
2-битовый указатель скремблирования ТП — свидетельствует о
наличии или отсутствии скремблирования ТП;
2-битовый индикатор наличия полей адаптации в нагрузке пакета.
Поле адаптации занимает часть области полезных данных и служит
для ввода управляющих и вспомогательных сигналов, передаваемых не в
каждом пакете. В частности, в полях адаптации передаются таблицы программно-зависимой информации (PSI — Program Specific Information) и
сигналы синхронизации. Поле адаптации может также использоваться для
передачи данных пользователя, в этом случае оно разбивается на секции.
Подробнее об этом рассказано в седьмой главе.
Значение указателя наличия полей адаптации 0x1 означает, что поле
адаптации отсутствует и в пакете передаются данные видео или звука; 0x2
присваивается пакету, в котором часть области полезных данных занимает
поле адаптации, остальное занято стаффингом; индикатор, установленный
на 0x3, свидетельствует об одновременном наличии и поля адаптации, и
полезных данных. Отметим, что заголовок пакета и поле адаптации не
скремблируются.
4-битный счетчик непрерывности пакетов увеличивает свое значение на единицу при поступлении каждого следующего пакета с данным
PID и обнуляется после каждого 15-го пакета. Он позволяет декодеру обнаруживать потерю пакета и принимать меры по его замене.
Область полезных данных транспортного пакета значительно меньше, чем обычная длина пакета ПЭП, поэтому последний для укладки в пакеты ТП должен разрезаться. Стандарт определяет, что первый байт пакета
ПЭП должен обязательно совпадать с первым байтом области полезных
данных, а конец пакета ПЭП - с концом одного из последующих транспортных пакетов. Незаполненные начальные байты этого последнего пакета дополняются пустыми байтами.
Если в пакете присутствует поле адаптации, оно имеет структуру,
показанную на рис. 1.1.1.10. Первый байт указывает длину поля, затем
следуют три однобитовых указателя - непрерывности, случайного доступа
и приоритета элементарного потока. Первый указатель свидетельствует о
непрерывности счета времени во временных метках и необходим на приеме для мониторинга ТП. Он устанавливается в «1», если на передающей
стороне изменена база отсчета времени, например, гладко введена другая
программа с иным PCR.
- 12
Рис.1.1.1.10. Cтруктура поля адаптации транспортного потока
Если в данном поле адаптации передается PCR, об этом свидетельствует однобитовый флаг PCR. Метка PCR занимает 48 битов, в том числе
33 бита собственно PCR, 6 битов зарезервировано для будущих применений и 9 битов занимает поле расширения PCR. В поле расширения ведется
счет импульсов тактовой частоты 27 МГц. Как только их число достигает
300, поле обнуляется и значение PCR увеличивается на единицу. Так обеспечивается совместимость с MPEG-1, где отсчет времени ведется в периодах тактового генератора 90 кГц. Такой же формат имеет метка Исходной
PCR (OPCR — Original PCR), передаваемой вместе с программой, заимствованной из другого транспортного потока. В отличие от PCR, значение
OPCR не изменяется в процессе передачи. Оно может использоваться,
например, при записи и воспроизведении программы.
Еще один флаг, splice_countdown, указывает число пакетов с тем же
PID в транспортном потоке, оставшихся до точки гладкого входа в поток
(например, для ввода рекламы или местных программ). Оставшуюся часть
поля адаптации могут занимать либо служебные данные, либо данные
пользователя, либо расширения поля адаптации, на что указывают соответствующие флаги. Формат данных пользователя включает однобайтовый
указатель длины поля и собственно поле данных, которые в этом случае
вводятся в так называемые секции транспортного потока.
1.1.1.1.2. Принципы обеспечения синхронизации потоков MPEG-2
Рассмотрим, как решены вопросы синхронизации в потоках MPEG-2.
Аудио и видео потоки используют модели синхронизации, при которых
сквозная задержка между поступлением сигнала на вход кодера и получением его на выходе декодера постоянна. Эта задержка складывается из задержек, обусловленных кодированием, буферизацией кодирования, мультиплексированием, передачей или хранением данных, демультиплексированием, буферизацией декодера, декодированием и воспроизведением.
Модель синхронизации также предполагает, что все видео и аудио данные
- 13
передаются (представляются) только один раз, если обратное не указано
явно, причем межкадровый интервал и частота дискретизации аудио потока в кодере и декодере совпадают. Кодирование системного потока включает в себя информацию о синхронизации, используемую для реализации
систем, поддерживающих постоянную величину сквозной задержки. Допустима реализация декодеров, не следующих этой модели точно; однако в
таких случаях обеспечение функционирования системы полностью ложится на разработчика. Синхронизация встроена во все спецификации
стандарта, которым должны следовать все действительные битовые потоки, вне зависимости от того, как они были созданы.
Синхронизация основана на использовании общих системных часах,
или иначе говоря, системного времени. Системное время программного
потока может быть строго синхронизировано с временем (частотой отсчетов) видео и аудио потоков, или может незначительно отличаться от их рабочей частоты отсчетов, но в любои случае должно обеспечивать точное
сквозное тактирование и восстановление значения системного времени.
Системное время транспортного потока, наоборот, всегда должно
отличаться на установленный множитель от частот видео и аудио потоков,
что позволяет упростить восстановление синхронизации в декодерах.
Общий отсчет времени задается ссылками на системные часы (SCR),
вводимыми в заголовок системного потока, по ним декодер подстраивает
свои внутренние часы и «привязывает» потоки видео и звука к абсолютным отсчетам времени. Для выравнивания задержки во времени отдельных
пакетов в заголовок пакета ПЭП вводятся временные метки воспроизведения (PTS) и временные метки декодирования (DTS), которые указывают, в
какие моменты этого абсолютного времени декодер должен обработать и
вывести на экран соответствующие изображения или звуковые последовательности. Эти же средства используются и в программном потоке
MPEG-2, где все компоненты потока также имеют общую временную базу.
Транспортный поток содержит программные компоненты с разной
предысторией, в том числе и с несколько различающимися тактовыми частотами, поэтому невозможно или весьма трудоемко привести все сигналы
к единой временной базе. Для управления такими потоками вводится еще
один механизм синхронизации, называемый ссылкой на программные часы (PCR — Program Clock Reference). PCR, как и другие временные метки,
также представляет собой 33-битовое число, отсчитываемое в периодах частоты 90 кГц, получаемой делением на 300 частоты тактового генератора
27 МГц. Оно показывает ожидаемое время завершения считывания в декодере поля PCR из транспортного потока, после чего декодер может приступить к сравнению пришедшего и местного отсчетов и выработке корректирующего сигнала. Отличие от SCR в том, что PCR вводится в поток
на программном, а не системном уровне, в одном потоке могут передаваться несколько различных PCR, по числу программ, и декодер при пере-
- 14
ключении на каждую новую программу заново синхронизирует свой внутренний генератор частоты 27 МГц.
Стандарт предписывает повторение метки PCR не реже чем 1 раз в 0,7
сек. В промежутках декодер вычисляет значения меток путем интерполяции.
Синхронизация нескольких элементарных потоков достигается использованием временных меток воспроизведения (PTS). Временные метки обычно представляют из себя количество отсчитанных периодов опорной частоты 90 kГц, но ссылки на системные часы (SCR), ссылки на программные часы (PCR) и необязательные ссылки на часы элементарного потока (ESCR) могут отсчитывать периоды опорной частоты 27 MГц. При
декодировании N элементарных потоков синхронизация происходит путем
засинхронизирования потоков с главным генератором синхронизирующих
импульсов, а не путем подстройки импульсов одного потока под импульсы
другого. В качестве главного генератора синхроимпульсов может использоваться генератор одного из N декодеров, генератор синхронизирующих
импульсов источника данных или же некоторый внешний генератора синхроимпульсов.
Каждая программа, содержащаяся в транспортном потоке, должна
иметь собственное базовое время (time base). Значения базового времени
разных программ, принадлежащих одному и тому же транспортному потоку, могут различаться.
Так как временные метки воспроизведения PTS относятся к декодированию отдельных элементарных потоков, они находятся на уровне пакетов
PES транспортных и программных потоков. Сквозная синхронизация происходит, когда кодеры сохраняют временные метки при записи, передают
их вместе с закодированными данными декодерам, которые в свою очередь используют их для воспроизведения данных.
Синхронизация декодированной информации осуществляется при помощи ссылок на системные часы (SCR) в программных потоках и при помощи ссылок на программные часы PCR в транспортных потоках. Значения SCR и PCR представляют собой временные метки, соответствующие
битовому потоку, они получены при помощи той же точки отсчета, которая используется для получения значений PTS для аудио и видео данных
программы. Так как каждая программа может использовать собственное
базовое время, транспортный поток, содержащий несколько программ, содержит поля PCR для каждой из них. В некоторых случаях программы могут использовать одно и то же значение поля PCR. Каждой программе соответствует одно и только одно базовое время PCR.
Условный доступ
В транспортных и программных потоках данных может использоваться шифрование и скремблирование, предназначенные для обеспечения
условного доступа. Под условным доступом понимается доступ пользова-
- 15
телей к информации за плату. Механизмы условного доступа в MPEG-2 не
специфицированы. MPEG-2 обеспечивает возможность реализации систем
условного доступа, его элементы синтаксиса предоставляют поддержку
подобных систем.
Контрольный системный декодер
В части 1 стандарта 13818 использует понятие «Контрольного системного декодера» (System Target Decoder - STD) для формализации вопросов задержек и буферизации. Эталонный декодер транспортных потоков называется «Контрольным транспортным системным декодером»
(Transport System Target Decoder – T-STD), эталонный декодер программных потоков называется «Контрольным программным системным декодером» (Program System Target Decoder – P - STD). Так как STD параметризован в терминах полей стандарта 13818 (например, размером буферов),
каждый элементарный поток порождает собственную параметризацию
STD. Предполагается, что системные кодеры порождают потоки, соответствующие требованиям STD. Конкретные реализации декодеров должны
быть построены так, чтобы соответствовать STD.
1.1.1.4.
Требования к транспортному потоку
1.1.1.4.1
Структура кодирования и параметры транспортного потока
Построение транспортного потока стандарта 13818 позволяет помещать в один поток одну или несколько программ. Данные каждого элементарного потока мультиплексируются с информацией, позволяющей
осуществить синхронизацию воспроизведения элементарных потоков в
программе. Транспортный поток состоит из одной или нескольких программ. Элементарные аудио и видео потоки состоят из элементов доступа.
Данные элементарного потока передаются при помощи пакетов PES
(см. рис.1.1.1.1.8). Пакет PES состоит из заголовка, за которым следуют
данные пакета. Пакеты PES вкладываются в пакеты транспортного потока.
Первый байт заголовка пакета PES находится на первой доступной позиции нагрузки в пакете транспортного потока.
Заголовок пакета PES начинается 32-битным стартовым кодом, определяющим поток или тип потока, которому принадлежит пакет. Заголовок
пакета PES может содержать временные метки декодирования и воспроизведения (DTS и PTS). Заголовок пакета PES также содержит другие необязательные поля. Поле данных пакета PES содержит переменное число
последовательных байтов элементарного потока.
Пакет транспортного потока начинается с 4-байтового префикса, содержащего 13-битный идентификатор пакета (Packet ID - PID), определенный в табл.П.1.3 Приложения 1.
- 16
Поле PID определяет содержание пакета транспортного потока при
помощи таблиц программо-зависимой информации (Program Specific
Tables - PSI). Пакеты транспортного потока, PID которых совпадают, передают данные одного и того же элементарного потока.
Таблицы PSI передаются транспортным потоком. Всего существует 4
таблицы PSI:
 Таблица объединения программ (Program Association Table),
 Таблица состава программы (Program Map Table),
 Таблица условного доступа (Conditional Access Table),
 Таблица сетевой информации (Network Information Table).
Эти таблицы содержат информацию, необходимую и достаточную для
демультиплексирования и воспроизведения программ. Таблица состава
программ, представленная в табл. П.1.28, кроме прочей информации определяет ассоциированные с программой элементарные потоки. Эта таблица
также определяет PID пакетов транспортного потока, передающих PCR
каждой программы. Таблица условного доступа используется для организации скремблирования, и появляется тогда, когда скремблирование применяется. Таблица сетевой информации необязательно присутствует, и ее
содержимое не определяется данным стандартом.
Среди пакетов транспортного потока могут встречаться нулевые (пустые) пакеты. Нулевые пакеты используются для дополнения транспортных потоков. Эти пакеты могут быть вставлены или удалены при повторном мультиплексировании, и поэтому передача нагрузки нулевых пакетов
декодеру не может быть гарантирована.
Данный стандарт не определяет вид кодированных данных, используемых в системах условного доступа. Однако данный стандарт предоставляет провайдерам услуг механизмы передачи и идентификации этих данных для декодирования, а также механизмы корректного получения доступа к данным, определенным стандартам. Подобная поддержка осуществляется как при помощи структуры пакетов транспортного потока, так и при
помощи таблицы условного доступа (см. табл.П.1.28).
1.1.1.4.2
Системный декодер транспортного потока
Для корректного описания семантики транспортного потока и ограничений, накладываемых на эту семантику, необходимы точные определения таких событий, как получение байта и действия декодирования, а также времени, в которые происходят эти события. В МPEG-2 необходимые
определения вводятся при помощи гипотетического декодера – прототипа
системного декодера транспортного потока (T-STD). T-STD представляет
собой концептуальную модель, используемую для точного определения
этих терминов и моделирования процесса декодирования в процессе создания и проверки корректных транспортных потоков. Концепция T-STD
- 17
определяется только с этой целью. T-STD состоит из трех типов декодеров: видео, аудио и системного декодеров (рис. 1.1.1.11).
i-ый байт
транспортного потока
A1(j)
Rx1
TB1
Rbx1
MB1
td1(j)
EB1
TBn
TBsys
Rxsys
Bn
Bsys
P1(k)
tp1(k)
k-ый элемент воспроизведения
An(j)
Rxn
Видео
D1
j-ый элемент доступа
t(i)
O1
tdn(j)
Rsys
Аудио
Dn
Dsys
Pn(k)
tpn(k)
Информация управления
Рис. 1.1.1.11. Системный декодер транспортного потока
При описании прототипа системного декодера транспортного потока
используются следующие обозначения, показанные на рис. 1.1.1.11.
i, i', i" - индексы байтов в транспортном потоке. Первый байт имеет
индекс 0.
j - индекс, используемый для доступа к элементам доступа элементарных потоков.
k, k', k'' - индексы элементов воспроизведения в элементарных потоках.
n - индекс элементарного потока.
p - индекс пакетов в транспортном потоке
t(i) - момент времени (в секундах), в который i-й байт транспортного потока поступает в системный декодер. Значение t(0) – произвольная
константа.
PCR(i) - временная отметка, закодированная в поле PCR и измеряемая
в периодах системных часов (27 MHz); i – индекс последнего байта поля
program_clock_reference_base.
An(j) - j-й элемент доступа в n-м элементарном потоке. An(j) индексируются в порядке декодирования.
tdn(j) - время декодирования (в секундах) j-ого элемента доступа в n-м
элементарном потоке.
- 18
Pn(k) - k-й элемент воспроизведения в n-м элементарном потоке.
Pn(k) является результатом декодирования An(j). Pn(k) индексируются в
порядке воспроизведения.
tpn(k) - время воспроизведения (в секундах) k-ого элемента воспроизведения n-го элементарного потока в системном декодере.
t - время (в секундах)
Fn(t) - степень заполнения входного буфера системного декодера элементарного потока n в момент времени t.
Bn - основной буфер элементарного потока n – присутствует только
для элементарных потоков аудио данных.
BSn - размер буфера Bn в байтах.
Bsys - основной буфер системного декодера, предназначенный для
хранения системной информации декодируемой программы.
Bssys - размер буфера Bsys в байтах.
MBn - буфер мультиплексирования элементарного потока n – присутствует только для элементарных потоков видео данных.
MBSn - размер буфера MBn в байтах.
Ebn - буфер потока элементарного потока n – присутствует только для
элементарных потоков видео данных.
EBSn - размер буфера EBn в байтах.
Tbsys - транспортный буфер для системной информации декодируемой программы.
TBSsys - размер буфера TBsys в байтах.
TBn - транспортный буфер элементарного потока n.
TBSn - размер буфера TBn в байтах.
Dsys - декодер системной информации программного потока n.
Dn - декодер для элементарного потока n.
On - буфер восстановления последовательности для элементарного
потока видео данных n.
Rsys - скорость удаления данных из буфера Bsys.
Rxn - скорость удаления данных из буфера TBn.
Rbxn - скорость удаления данных загрузки пакетов PES из буфера
MBn при использовании метода утечки (leak method). Определена только
для элементарных потоков видео данных.
Rbxn(j) - скорость удаления данных загрузки пакетов PES из буфера
MBn при использовании метода vbv_delay. Определена только для элементарных потоков видео данных.
Rxsys - скорость удаления данных из буфера TBsys.
Res - скорость элементарного потока видео данных, закодированная в
заголовке последовательности.
- 19
1.1.1.4.3. Использование параметров системных часов
Информация синхронизации, использующаяся в T-STD, передается в
нескольких полях, определенных в стандартем. В полях PCR информация
кодируется как значение системных часов программы. Поля PCR передаются в поле адаптации пакетов транспортного потока, значение PID которого
равно
значению
PCR_PID,
определенному
в
разделе
TS_program_map_section декодируемой программы.
Реализации декодеров могут восстанавливать значение часов по этим
значениям и соответствующему времени прибытия. Ниже перечислены
минимальные ограничения, накладываемые на частоту системных часов
программы, полученную декодером из значений PCR.
Частота системных часов измеряется в герцах и должна удовлетворять
следующим ограничениям:
27 000 000 - 810  system_clock_frequency  27 000 000 + 810,
скорость изменения system_clock_frequency во времени  75  10-3
Гц/сек.
Замечание: источники кодированных потоков должны более точно
отслеживать частоту для упрощения реализации совместимых устройств
для записи и проигрывания.
Значение system_clock_frequency программы может быть более точным, чем требует стандарт. Информация о повышенной точности может
быть передана декодеру через дескриптор системных часов.
Скорости битового потока, определенные в этой спецификации, измеряются в единицах, равных system_clock_frequency. Например, для T-STD
скорость потока 27 000 000 бит в секунду предполагает, что один байт
данных передается каждые восемь тактов системных часов.
Термин «system_clock_frequency» используется в нескольких разделах
стандарта для обозначения частоты, удовлетворяющей перечисленным
требованиям. Для удобства обозначения предполагается, что уравнения, в
которых участвуют значения PCR, PTS или DTS верны с точность до целого кратного (300233/system_clock_frequency) секундам. Этот эффект имеет место из-за того, что информация PCR кодируется как 33-битное значение, соответствующее целому кратному 1/300 частоты системных часов +9
бит, выделенных на кодирование остатка, а на кодирование PTS и DTS отведено только 33 бита (system_clock_frequency/300).
1.1.1.4.4. Входные данные системного декодера транспортного потока
Декодер T-STD получает на вход транспортный поток. Транспортный
поток может состоять из нескольких программ, имеющих различные точки
отсчета времени. Однако в заданный момент времени T-STD декодирует
- 20
только одну программу. В модели T-STD все значения временных отметок
относятся к точке отсчета времени декодируемой программы.
Данные транспортного потока подаются на вход T-STD с кусочнопостоянной скоростью. i-й байт потока поступает на вход в момент времени t(i). Время поступления байта на вход T-STD может быть получено по
входному потоку путем декодирования поля PCR (оно закодировано в поле адаптации декодируемой программы) и подсчета количества байт между последовательными отсчетами PCR декодируемой программы в полном
транспортном потоке. Согласно уравнению 1.1.1.3, значение PCR кодируется двумя числами: одно соответствует целым кратным 1/300 частоты системных часов (то есть 90 кГц) и называется program_clock_reference_base
(уравнение 1.1.1.1), другое соответствует целым кратным частоты системных часов и называется program_clock_reference_ext (уравнение 1.1.1.2).
Значение, содержащееся в поле PCR, определяет время t(i), где i соответствует
байту,
содержащему
последний
бит
поля
program_clock_reference_base.
А именно:
PCR_ base i     system _ clock _ frequency  t  i   DIV 300 % 2 33
(1.1.1.1)


PCR_ ext  i    system _ clock _ frequency  t  i   DIV 1 % 300
PCRi  PCR_basei 300 PCR_exti
(1.1.1.2)
(1.1.1.3)
Для остальных байтов время поступления t(i) вычисляется согласно
уравнению (1.1.1.4). Оно зависит от PCR(i") и скорость передачи данных,
которая определяется как отношение количества байтов, переданных в
промежутке
между
двумя
последовательными
полями
program_clock_reference, к разности значений этих полей PCR.
t i 
PCR i"
i  i"

system_ clock _ frequency transport _ rate(i )
(1.1.1.4)
Здесь:
i - индекс байта в транспортном потоке, i"< i < i'.
i''
- индекс байта, содержащего последний бит последнего поля
program_clock_reference_base, относящегося к декодируемой программе.
PCR(i") - время, закодированное в полях PCR_base и PCR_ext, выраженное в единицах, соответствующих частоте системных часов.
Скорость передачи данных выражается следующим образом:
 i' i"  system_ clock _ frequency
transport _ rate i 
PCR i'   PCR i"
(1.1.1.5)
Здесь i' есть индекс байта, содержащего последний бит следующего поля
program_clock_reference_base, относящегося к декодируемой программе.
Замечание: i"  i  i'.
В случае изменения точки отсчета времени (timebase discontinuity),
которая указывается поле адаптации discontinuity_indicator транспортного
пакета, определение, соответствующее уравнениям (1.1.1.4) и (1.1.1.5), не
- 21
применимо в промежутке времени между прибытием последним PCR старой точки отсчета времени и первым PCR новой точки отсчета времени. В
данном случае время прибытия байтов определяется в соответствии с
уравнением (1.1.1.4) с единственным изменением: используется скорость
передачи, соответствующая промежутку между предпоследним и последним PCR старой точки отсчета времени.
Для значений PCR определена предельная допустимая ошибка. Точность PCR определяется как максимальная допустимая погрешность в полученных значениях PCR. Неточность происходит из неточного представления PCR или привносится изменением PCR при ремультиплексировании. Погрешность не включает ошибки времени прибытия пакетов, обусловленные разбросом задержек в сети (джиттер) или другими причинами.
Точность PCR равна ±500 нс.
В модели T-STD неточность будет выражаться в неточном расчете
скорости передачи данных в соответствии с уравнением (1.1.1.5).
Транспортные потоки с несколькими программами и переменной
скоростью
Транспортный поток может состоять из нескольких программ, имеющих различные точки отсчета времени. Для каждой программы необходим
собственный набор полей PCR, что достигается установкой соответствующим значением PCR_PID. Для программы, поступающей на вход T-STD,
скорость транспортного потока кусочно постоянна. Таким образом, если
скорость транспортного потока переменна, она может меняться только при
помощи PCR рассматриваемой программы. Так как PCR, то есть точки изменения скорости передачи, не совпадают друг с другом, скорость поступления транспортного потока на вход T-STD изменяется в зависимости от
того, какая программа поступает на вход T-STD. Таким образом, если
транспортный поток состоит из нескольких программ с различными точками отсчета времени и скорость передачи непостоянна, невозможно построить устойчивую систему получения данных T-STD для всего транспортного потока. Однако несложно построить систему, принимающую битовый поток с постоянной скоростью, содержащий несколько программ,
скорость которых переменна.
1.1.1.4.5. Буферизация транспортного потока
Полные пакеты транспортного потока, содержащие данные n-го элементарного потока (это определяется параметром PID), передаются в
транспортный буфер n-го потока, TBn. Сказанное относится также к дублированным пакетам транспортного потока, а также к пакетам без нагрузки. Передача i-го байта из входного потока декодера в TBn не занимает
- 22
времени, то есть i-й байт поступает в буфер n-го потока (его размер равен
TBSn), в момент времени t(i).
Байты, поступающие в буфер TBn, извлекаются из буфера со скоростью Rxn, определенной ниже. Байты, составляющие часть пакета PES или
его содержание, поступают в основной буфер Bn (для аудио потоков или
потоков данных) или в буфер мультиплексирования MBn (для элементарных потоков видео данных). Другие байты не используются, но могут
быть использованы для управления системой. Дубликаты пакетов транспортного потока не доставляются Bn, MBn, или Bsys.
Буфер TBn освобождается следующим образом: если в TBn нет данных, скорость Rxn равна 0. В противном случае
для видео потоков
Rxn = 1.2 x Rmax [profile,level],
где Rmax[profile,level] определяется в соответствии с параметрами profile и
level, значения которых можно найти в таблице 8.12 части 2 данного стандарта. Таблица 8.12 определяет верхнюю границу скорости элементарного
видео потока для каждого значения profile и level.
Rxn = 1.2 * Rmax для видео потоков ISO/IEC 11172-2, где Rmax определяет максимально возможную скорость передачи данных для битового потока с ограниченными параметрами, соответствующего ISO/IEC 11172-2.
для аудио потока
Rxn = 2 x 106 бит в секунду,
для системных данных
Rxn = 1 x 106 бит в секунду.
Rxn измерятся относительно частоту системных часов.
Полные пакеты транспортного потока, содержащие системную информацию декодируемой программы, поступают в системный транспортный буфер TBsys, со скоростью транспортного потока. Эти пакеты включают пакеты транспортной системы, значения PID которых равны 0 или 1,
а также все пакеты транспортного потока, значение program_map_PID которых соответствует декодируемой программе (это можно проверить при
помощи Таблицы соответствия программы - таблица П.1.26). Данные
таблицы сетевой информации (NIT), содержащиеся в NIT PID, не передаются TBsys.
Данные извлекаются из TBsys со скоростью Rxsys и помещаются в
Bsys. Время передачи не учитывается.
Дубликаты пакетов транспортного потока не передаются в Bsys.
Транспортные пакеты, не передаваемые ни в TBn, ни в TBsys, отбрасываются.
Размер транспортного буфера фиксирован и равен 512 байтам.
Размеры буферов EBS1,…,EBSn определены для видео буферов и
равны vbv_buffer_size (это значение определяется в заголовке последовательности - см. описание 11172-2 и 13818-2).
Размер буферов мультиплексирования MBS1, …, MBSn для видеоданных следующим образом:
Для уровня Low и Main
MBSn=BSmux + BSoh +VBVmax[profile,level] - vbv_buffer_size,
- 23
где BSoh, задержка буферизации пакетов PES, определяется как
BSoh = (1/750)seconds x Rmax[profile,level]
а дополнительная задержка буферизации, BSmux,, , определяется как
BSmux = 0.004 seconds * Rmax[profile,level]
Здесь значение VBVmax[profile,level] определяется из таблицы 8-12,
и Rmax[profile,level] определяется по таблице 8-13 описания 13818-2, а
значение vbv_buffer_size определяется в заголовке последовательности
(см. описание 13818-2).
Для уровня High 1440 и High
MBSn=BSmux + BSoh
где BSoh определяется как:
BSoh = (1/750)seconds x Rmax[profile,level]
а BSmux определяется как:
BSmux = 0.004 seconds * Rmax[profile,level]
значение Rmax[profile,level] определяется по таблице 8-13 описания
13818-2.
Для битовых потоков ISO/IEC 11172-2 с ограниченными параметрами
MBSn=BSmux + BSoh + vbv_max - vbv_buffer_size
где BSoh определяется как
BSoh = (1/750) seconds x Rmax
а BSmux определяется как
BSmux = 0.004 seconds * Rmax
здесь Rmax и vbv_max означают максимальную битовую скорость и максимальное значение vbv_buffer_size для битового потока ISO/IEC 11172-2 с
ограниченными параметрами, соответственно.
Часть MBSn, равная BSmux = 4ms x Rmax[profile,level], отводится для
буферизации, обеспечивающей возможность мультиплексирования.
Остальная часть доступна BSoh, а также может использоваться для изначального мультиплексирования.
Размеры основных буферов BS1,…,BSn определяются следующим
образом:
для аудио данных
BSn = BSmux + BSdec + BSoh = 3 584 bytes.
Размеры буфера декодирования элементов доступа BSdec и буфера пакетов PES BSoh ограничены следующим условием:
BSdec + BSoh ≤ 2 848 bytes.
Часть (736 байт) буфера, состоящего из 3 584 байт, отведена под буферизацию для обеспечения возможности мультиплексирования. Остальные 2 848 байт разделяются между буферами элементов доступа BSdec, BSoh
и дополнительными буферами мультиплексирования.
Размер основного буфера системных данных (Bsys) равен BSsys =
1536 байт.
Следующее относится только к элементарным потокам видеоданных.
- 24
Для элементарных потоков видео данные передаются из буфера MB n
в буфер EBn при помощи одного из двух методов: метод утечки (leak) или
метод задержки VBV (VBV delay).
Метод утечки
При использовании метода утечки данные передаются из MBn в EBn
со скоростью утечки Rbx. Метод утечки используется при выполнении одного из следующих условий:
В транспортном потоке нет дескриптора STD элементарного потока,
дескриптор STD присутствует и флаг leak_valid принимает значение
‘1’,
дескриптор STD присутствует, флаг leak_valid принимает значение
‘0’, и либо поля vbv_delay, закодированные в видеопотоке, принимают
значение 0xFFFF, либо,
параметр trick_mode_status принимает значение 'истина’ (см. 2.4.3.6).
Для уровня Low и Main
Rbxn = Rmax(profile,level)
Для уровня Hight-1440 и High
Rbxn = Min {1.05 x Res, Rmax(profile,level)}
Для битового потока ISO/IEC 11172-2 с ограниченными параметрами
Rbxn = 1.2 x Rmax ,
где Rmax - максимальная скорость битового потока ISO/IEC 11172-2 с
ограниченными параметрами.
Если в буфере MBn есть данные нагрузки пакетов PES, а буфер EBn
не заполнен, данные передаются из MBn в EBn со скоростью Rbx. Если
буфер MBn полон, данные из буфера EBn не извлекаются. При передачи
байта данных из MBn в EBn все байты заголовков пакетов PES, находящиеся в MBn перед передаваемым байтом, удаляются из буфера. Если данных
нагрузки пакетов PES в буфере MBn нет, данные не удаляются. Все данные, помещенные в MBn, в некоторый момент покидают буфер. Передача
данных между EBn и MBn происходит мгновенно.
Метод задержки VBV (VBV_delay)
В методе задержки vbv момент времени, в который кодированные видеоданные передаются из MBn в EBn, определяется при помощи значений
vbv_delay, закодированных в видеопотоке. Метод задержки vbv используется, если в транспортном потоке присутствует дескриптор STD для рассматриваемого элементарного потока, флаг дескриптора leak_valid равен
‘0’, и поля vbv_delay, передаваемые в видеопотоке, не равны 0xFFFF.
Необходимо отметить, что если какое-нибудь из полей vbv_delay последо-
- 25
вательности видеоданных на равно 0xFFFF, ни одно их полей этой последовательности не будет равно 0xFFFF (см. ISO/IEC 11172-2 и 13818-2).
При использовании метода vbv_delay последний байт стартового кода
видеокадра для кадра j передается из MBn в EBn в момент времени tdn(j) vbv_delay(j), где tdn(j) равно времени декодирования кадра j, определенное
выше, а vbv_delay(j) равно времени задержки (в секундах), определенному
по полю vbv_delay j-го кадра. Передача байтов, заключенных между стартовыми кодами последовательных кадров (включая последний байт второго стартового кода), в буфер Ebn производится с кусочно-постоянной скоростью Rbx(j), определенной для j-го кадра. Точное значение Rbx(j) получается следующим образом:
Rbx(j) = NB(j) / (vbv_delay(j) - vbv_delay(j+1) + tdn(j+1) - tdn(j)).
Замечание – значения vbv_delay(j+1) и tdn(j+1) могут отличатся от
обычно принятых для воспроизведения видео, если флаг low_delay в расширении видео последовательности равен ‘1’. Правильные значения не
всегда могут быть получены по битовому потоку.
где NB(j) соответствует количеству байт между последними байтами
стартовых кодов кадров (включая последний байт второго стартового кода) кадров j и j+1, минус количество байт, отведенных на заголовок пакета
PES.
Значение Rbx(j), полученное из 2-10, меньше или равно
Rmax(profile,level) для элементарных потоков типа ‘0x02’ (см. табл. 2-36;
Rmax(profile,level) определено в Рекомендации ITU-T H.262 | ISO/IEC
13818-2), и меньше или равно максимальной скорости битового потока с
ограниченными параметрами для потоков типа ‘0x01’ (см. ISO/IEC 111722).
При передача байта данных из MBn в EBn все байты заголовков пакетов PES, предшествующие этому байту в MBn, удаляются из буфера. Все
данные, помещенные в MBn, в некоторый момент покидают буфер. Передача данных между EBn и MBn происходит мгновенно.
Удаление элементов доступа
Данные элемента доступа, находящиеся в буфере (буфер элементарного потока EBn или основной буфер Bn) дольше всего - An(j), а также все
дополняющие байты, находящиеся в буфере в момент времени tdn(j), удаляются в момент tdn(j). Время декодирования tdn(j) определяется полями
DTS или PTS (см. п. 2.4.3.6). Время декодирования элементов доступа,
следующих за элементом j и не имеющих полей DTS или PTS (td n(j+1),
tdn(j+2), ...), может быть получено с помощью информации элементарного
потока (cм. Приложение C Рекомендации ITU-T H.262 | ISO/IEC 13818-2,
ISO/IEC 13818-3, или ISO/IEC 11172, cм. также п. 2.7.5). В случае аудиопотока все заголовки пакетов PES, находящиеся непосредственно перед эле-
- 26
ментом доступа или включенные в данные элемента доступа, удаляются
одновременно с удалением элемента доступа. При удалении элемент доступа декодируется и становится элементом воспроизведения.
Системные данные
Системные данные удаляются из основного буфера Bsys со скоростью
Rsys, если в буфере есть хотя бы 1 байт.
Rsys  max80 000bits / s, transport _ rate i  8 bits / byte  500
(2-6)
Замечание – при высоких скоростях передачи параметр Rsys может быть
увеличен с целью увеличения скорости передачи PSI.
Малая задержка
Когда флаг low_delay в расширении последовательности видеоданных
равен ‘1’ (см. п. 6.2.2.3 Рекомендации ITU-T H.262 | ISO/IEC 13818-2),
может произойти опустошение буфера EBn. В данном случае в момент
времени tdn(j) буфер элементарного потока EBn может содержать неполный элемент доступа. Тогда будет произведена повторная проверка наличия полного элемента доступа в буфере с временным интервалом, равным
удвоенному периоду появления поля. Как только полный элемент появится, он будет удален из буфера EBn. Переполнение буфера EBn произойти
не может.
Если флаг low_delay_mode равен 1, на опустошение буфера EB n не
накладывается никаких ограничений. Декодер T-STD удаляет элементы
доступа из буфера EBn в наиболее ранний из возможных моментов времени, удовлетворяющих ограничениям, описанным в предыдущем параграфе,
а также значениям DTS и PTS из битового потока. Необходимо отметить,
что декодер может оказаться не в состоянии восстановить правильные
временные отметки декодирования до тех пор, пока опустошение буфера
EBn не прекратится и в битовом потоке будут обнаружены значения PTS
или DTS.
Режим спецэффектов (trick mode)
Если в заголовке пакета PES, содержащего начало элемента доступа
B-типа флаг DSM_trick_mode_flag установлен в ‘1’, а также значение поля
trick_mode_control равно ‘001’ (медленное воспроизведение), ‘010’ (неподвижный кадр) или ‘100’ (медленное воспроизвеление в обратном порядке), элемент доступа B-типа не удаляется из буфера видеоданных EBn, до
момента декодирования и (возможно, повторного) воспроизвеления полей этого кадра. Повторное воспроизведения кадров и полей возможно в
режиме медленного воспроизведения, медленного воспроизведения в обратном направлении и field_id_cntrl. Элемент доступа удаляется из EBn в
указанный момент времени, который зависит от значения rep_cntrl.
- 27
Если флаг DSM_trick_mode в заголовке пакета PES, содержащего первый байт стартового кода кадра, установлен в ‘1’, режим спецэффектов
(trick_mode) включается, когда стартовый код пакета PES удаляется из буфера. Режим сохраняется до того момента, когда T-STD получает заголовок пакета PES, флаг DSM_trick_mode равен ‘0’ и первый байт стартового
кода кадра, следующего за этим пакетом, удаляется из буфера. Если включен режим спецэффектов, может произойти опустошение буфера EB n. Все
остальные ограничение, накладываемые на обычные потока, сохраняются
в режиме спецэффектов.
1.1.1.4.6. Декодирование и воспроизведение элементарных потоков
Элементарные потоки, буферизованные в буферах B1,…,Bn и
EB1,…,EBn декодируются декодерами D1,…,Dn и могут быть задержаны в
буферах восстановления последовательности O1,…,On перед воспроизведением на выходе T-STD. Буферы восстановления последовательности используются только при передаче элементарных потоков видео данных, когда некоторые элементы доступа передаются в порядке, отличном от порядка воспроизведения. Порядок этих элементов доступа должен быть изменен перед воспроизведением. Например, если Pn(k) является I-кадром
или P-кадром, переданным перед одним или несколькими B-кадрами, перед воспроизведением их порядок следования следует изменить. Кадры,
ранее сохраненные в буфере On, должны быть воспроизведены перед сохранением текущего кадра. Pn(k) следует задержать до декодирования следующего I-кадра или P-кадра. В то время как Pn(k) хранится в буфере восстановления последовательности, последующие B-кадры декодируются и
представляются.
Элемент воспроизведения Pn(k) представляется в момент времени
tpn(k). Для элементов воспроизведения, не требующих восстановления последовательности, tpn(k) равно tdn(j), так как декодирование элементов доступа не занимает времени; например, это верно для B-кадров. Для элементов воспроизведения, подвергающихся задержке, tpn(k) и tdn(j) отличаются ровно на время задержки Pn(k) в буфере восстановления последовательности (это время кратно периоду кадра). Задержка восстановления
последовательности должна быть выбрана так, чтобы удовлетворить требованиям всего потока. Например, поток, состоящий изначально из I- и Pкадров, а позже включающий также B-кадры, должен предусмотреть задержку, начинающуюся в момент начала потока и позволяющую произвести корректное изменение последовательности кадров.
Часть 2 данного стандарта рассматривает восстановление последовательности видеокадров более подробно.
Функция системы декодирования заключается в восстановлении элементов воспроизведения из сжатых данных и воспроизведении их в виде
- 28
синхронизированной последовательности в правильные моменты времени.
Несмотря на то, что реальные устройства воспроизведения аудио и видео
данных имеют конечные и различные задержки, а также могут иметь задержки, обусловленные функциями пост-обработки или вывода, прототип
декодера предполагает, что эти задержки равны нулю.
Декодер T-STD, показанный на рис. П.1.16 выдает элемент воспроизведения (кадр) в момент его воспроизведения tpn(k).
Вывод элемента воспроизведения аудио данных начинается в момент
воспроизведения tpn(k), то есть когда декодер выдает первый отсчет.
Дальнейшие отсчеты элемента воспроизведения выдаются с частотой дискретизации аудиопотока.
Управление буфером
Построение транспортных потоков осуществляется так, чтобы обеспечить выполнение условий, определенных в данном разделе. Этот раздел
использует обозначения, принятые для прототипа системного декодера.
Переполнения буферов TBn и TBsys не произойдет. TBn и TBsys будут
опустошены по крайней мере один раз в секунду. Переполнения или опустошения буфера Bn не произойдет.
Опустошение буфера EBn может происходить только, когда флаг
low_delay расширения видео последовательности установлен равным ‘1’
(см. п. 6.2.2.3 описания 13818-2) или включен режим спецэффектов
(trick_mode).
При использовании метода утечки для передачи данных между буферами не произойдет переполнения буфера MBn, но он будет опустошаться,
по крайней мере, один раз в секунду.
При использовании метода vbv_delay не будет происходить ни переполнения, ни опустошения буфера MBn, кроме того, не будет происходить
переполнение буфера EBn.
Задержка данных, проходящих через буферы системного декодера, не
превосходит одной секунды, за исключением передачи неподвижных кадров. А именно: tdn(j)-t(i) <= 1сек. для всех j и всех байтов i элемента доступа An(j).
Для неподвижных изображений задержка ограничена условием td n(j)t(i) <= 60 сек. для всех j и всех байтов i элемента доступа An(j).
0  Fn  t   BSn ,
для всех t и n
и Fn(t) = 0 сразу же после t=t(0).
Fn(t) отражает степень наполнения буфера T-STD Bn в момент времени t.
- 29
1.1.1.4.7.
Спецификация синтаксиса и семантики транспортного потока
Следующие синтаксические конструкции описывают поток байтов.
Пакеты транспортного потока состоят из 188 байт.
Описание транспортного потока дано в табл.П.1.2. Построение пакетов транспортного потока показано в табл.П.1.3. Рассмотрим семантику
полей пакетов транспортного потока.
sync_byte – Байт sync_byte – 8 –битное поле с фиксированным значением, равным ‘0100 0111’ (0x47). Следует следить за тем, чтобы регулярно
встречающиеся поля (такие, как PID), не эмулировали байт синхронизации.
transport_error_indicator – битовый флаг. Если этот флаг установлен,
в пакете транспортного потока существует, по крайней мере, 1 неисправляемая ошибка. Этот бит может устанавливаться не только на транспортном уровне. После установки флаг может быть сброшен только если
ошибка в пакете была исправлена.
payload_unit_start_indicator – флаг, отмечающий пакеты транспортного потока, переносящие пакеты PES или данные PSI.
Если нагрузка пакета транспортного потока содержит данные пакета
PES, payload_unit_start_indicator имеет следующее значение: ‘1’ означает,
что нагрузка данного пакета транспортного потока начинается с первым
байтом пакета PES, ‘0’ означает, что данный пакет транспортного потока
не содержит пакет PES. Если значение payload_unit_start_indicator равно
‘1’, в транспортном пакете содержится один и только один пакет PES. Сказанное также относится к пользовательским потокам с типом stream_type 6
(см. табл. П.1.36).
Если нагрузка пакета транспортного потока содержит данные PSI,
payload_unit_start_indicator имеет следующее значение: Если пакет транспортного потока содержит первый байт секции PSI, значение
payload_unit_start_indicator равно ‘1’, то есть первый байт нагрузки данного пакета содержит поле pointer_field. Если пакет транспортного потока не
содержит первый байт раздела PSI, payload_unit_start_indicator будет равен
‘0’, то есть поле pointer_field в нагрузке не содержится. Сказанное также
относится к частным потокам типа stream_type 5 (см. табл.П.1.36).
Для нулевых пакетов значение флага payload_unit_start_indicator равно
‘0’.
Значение этого бита для пакетов транспортного потока, содержащих
пользовательские данные, в данной Рекомендации не определено.
transport_priority – битовый индикатор. Установка индикатора в 1
указывает, что данный пакет имеет более высокий приоритет, чем остальные пакеты с тем же PID, индикатор которых не равен 1. Этот механизм
может быть использован для введения приоритетов для пакетов одного и
того же элементарного потока. В зависимости от приложения поле
- 30
transport_priority может действовать либо независимо от PID, либо для пакетов с одним и тем же PID. Это поле может быть изменено канальными
кодерами или декодерами.
PID – PID представляет собой 13-битное поле, определяющее тип
данных, содержащихся в нагрузке пакета. Значение PID 0x0000 зарезервировано для Таблицы соответствия программы (табл. П.1.26). Значение PID
0x0001 зарезервировано для Таблицы условного доступа (табл. П.1.28).
Значения PID 0x002-0x000F также зарезервированы. Значение PID 0x1FFF
зарезервировано для нулевых пакетов.
Замечание – Транспортные пакеты, PID которых принимает значение
0x0000, 0x0001 или 0x0010-0x1FFE, могут быть использованы для передачи PCR.
transport_scrambling_control – 2-битное поле, определяющее режим
скремблирования нагрузки пакетов транспортного потока. Нагрузка транспортного потока, а также поле адаптации (если оно присутствует), не подвергаются скремблированию. В случае нулевого пакета значение поля
transport_scrambling_control устанавливается равным ‘00’.
adaptation_field_control – 2-битное поле, определяющее, следует ли
за заголовком пакета транспортного потока поле адаптации или нагрузка.
Декодеры, соответствующие Рекомендации 13818-1, отбрасывают
пакеты, поле adaptation_field_control которых равно ‘00’. В случае нулевого пакета значение поля adaptation_field_control устанавливается равным
‘00’.
continuity_counter – 4-битное поле, увеличивающееся при появлении
следующего пакета транспортного потока с тем же PID.
В транспортных потоках дубликаты пакетов могут передаваться только как два последовательных пакета с одинаковым PID. Значение
continuity_counter дубликатов должно совпадать со значением этого поля
исходного пакета, а поле adaptation_field_control должно принимать значение ‘01’ или ‘11’. В пакетах-дубликатах должны дублироваться все байты
исходного пакета, за исключением поля program_clock_reference, в котором в случае его присутствия должно содержаться правильное значение.
Непрерывным считается такое изменение значения continuity_counter,
при котором текущее значение либо больше предыдущего значения (для
пакета с тем же PID) на единицу, либо совпадает с ним (в случае
adaptation_field_control=’00’ или ‘01’, или же при передаче дубликатов пакетов). Изменение continuity_counter может быть разрывным, если поле
discontinuity_indicator установлено в ‘1’. Значение continuity_counter не
определено для нулевых пакетов.
data_byte – байты данных представляют собой непрерывную последовательность байтов данных пакетов PES, разделов PSI, дополняющих
байтов после разделов PSI, или же пользовательских данных, не принадлежащих этим структурам (как показывает значение PID). Для нулевых пакетов со значением PID 0x1FFF поле data_bytes может принимать любое
- 31
значение. Количество байт данных, N, определяется как 184 минус число
байт в поле адаптации (adaptation_field()), как описано ниже.
Опишем поле адаптации транспортного потока (табл. П.1.7).
adaptation_field_length – 8-битное поле, определяющее количество байт
поля адаптации, непосредственно следующих за полем adaptation_field_length.
Это поле равно 0 при добавлении дополняющего байта в пакет транспортного
потока.
Если
adaptation_field_control
равно
‘11’,
значение
adaptation_field_length будет принадлежать диапазону 0..182. Если adaptation_field_control равно ‘10’, adaptation_field_length равно 183. Если в пакете
PES недостаточно данных, чтобы заполнить нагрузку пакета транспортного
потока, вводятся дополняющие байты. Дополнение производится путем определения длины поля адаптации больше, чем сумма длин входящих в него элементов данных, так, чтобы оставшихся байтов нагрузки в точности хватило
для размещения доступных данных пакета PES. Образовавшееся дополнительное место в поле адаптации заполняется дополняющими байтами.
Это единственный допустимый метод дополнения пакетов транспортного потока, переносящих пакеты PES.
discontinuity_indicator – однобитовое поле, будучи установленным в
‘1’, указывает на разрыв последовательности, имеющий место для данного
транспортного пакета. Отсутствие поля discontinuity_indicator или его равенство ‘0’ указывает на сохранение непрерывности. Индикатор разрыва используется для указания на два типа разрывов: разрывы базового системного времени или разрывы значений поля continuity_counter.
Точка нарушения непрерывности базового системного времени отмечается при помощи флага discontinuity_indicator пакетов транспортного потока с
PID, равным PCR_PID. Если флаг discontinuity_indicator выставлен для пакета
с PID, равным PCR_PID, следующий пакет транспортного потока с таким же
значением PID определяет новое значение базового системного времени для
соответствующей программы. Изменение базового системного времени предполагается мгновенным и происходит в тот момент времени, когда на вход TSTD подается новое значение базового системного времени. При изменении
базового времени значение discontinuity_indicator соответствующего пакета
будет равно ‘1’. Бит discontinuity_indicator может также быть выставлен для
пакета, предшествующего пакету, передающему новое значение системного
PCR. В данном случае, если бит discontinuity_indicator установлен в ‘1’, он
будет выставлен во всех пакетах с тем же значением PCR_PID до тех пор, пока не появится пакет, содержащий первое значение PCR нового значения базового системного времени (включая этот пакет). Между последовательными
моментами возникновения разрывов базового системного времени должно
быть получено не менее двух значений PCR. Далее, во всех случаях за исключением моментов, когда система работает в режиме спецэффектов (trick
mode), в буферах T-STD могут присутствовать данные, использующие не более двух значений базового системного времени.
- 32
Кроме того, пакеты транспортного потока, содержащие PTS или DTS,
относящиеся к новой точке отсчета времени, не поступают на вход T-STD, пока не произойдет изменение точки отсчета системного времени.
Пакеты
транспортного потока, содержащие PTS или DTS, относящиеся к старой точке
отсчета времени, не поступают на вход T-STD после того, как произошло изменение базового системного времени.
Разрыв continuity_counter также отражается при помощи поля
discontinuity_indicator
пакетов
транспортного
потока.
Если
бит
discontinuity_indicator проставлен в пакете, PID которого не равен PCR_PID,
значение continuity_counter может не соответствовать значению для предыдущего пакета с тем же PID. Если бит discontinuity_indicator проставлен для
транспортного потока с PID, равных PCR_PID, поле continuity_counter может
не соответствовать предыдущему значению только в пакете, осуществляющем
изменение
базового
системного
времени.
Состояние
разрыва
continuity_counter определяется как состояние, в котором выполнены условия
разрыва (discontinuity_indicator=1) и поле continuity_counter текущего пакета
не соответствует предыдущему значению для потока с тем же PID. Точка
разрыва счетчика непрерывности (continuity counter) может возникать не более
одного раза в промежуток времени от возникновения состояния разрыва до
его окончания. Далее, если discontinuity_indicator равен ‘1’ для пакета с PID,
отличным от PCR_PID, то этот бит может быть выставлен в не более чем двух
последовательных пакетах с тем же PID.
Далее в данном параграфе точка доступа определяется следующим образом:
видео: первый байт заголовка видео последовательности,
айдио: первый байт аудиокадра.
После возникновения ситуации разрыва в пакете транспортного потока,
содержащего данные элементарного потока, первый байт данных элементарного потока, передаваемых в пакете транспортного потока с тем же самым
PID, будет точкой доступа, а в случае видеопотока будет либо первым байтом
точки доступа, либо кодом sequence_end_code, за которым следует точка доступа. Пакет транспортного потока, переносящий данные элементарного потока, а также обладающий PID, отличным от PCR_PID, в котором возникла
точка разрыва continuity_counter, поступит на вход T-STD после соответствующего изменения базового системного времени, если в нем присутствуют поля PTS или DTS.
Если при возникновении состояния разрыва два последовательных пакета транспортного потока с одинаковыми PID имеют также одинаковые значения continuity_counter и значения adaptation_field, равные ‘00’ или ‘11’, второй
пакет может быть отброшен. Транспортный поток будет гарантированно организован так, чтобы отбрасывание такого пакета не приводило к потере
нагрузки пакета PES или данных PSI.
После появления пакета с discontinuity_indicator=’1’ среди пакетов
транспортного пакета, содержащих информацию PSI, может возникнуть оди-
- 33
ночное несоответствие значения version_number разделов PSI. При возникновении такого несоответствия будет выслана версия TS_program_map_sections
соответствующей программы с параметрами section_length==13 и
current_next_indicator==1, так, чтобы
в потоке отсутствовали поля
program_descriptors и описания элементарных потоков. После этого передается версия раздела TS_program_map_section для каждой затронутой программы, причем значение поля version_number увеличивается на 1 и
current_next_indicator == 1, что завершает описание программы. Таким образом отражается изменение данных PSI.
random_access_indicator – однобитовое поле, определяющее, содержат
ли данные и последующие пакеты информация, помогающую организовать
произвольный доступ в данной точке. Именно, если бит установлен, следующий пакет PES, начинающийся в нагрузке транспортных пакетов (см. табл.
П.1.36) и имеющий такой же PID, будет содержать первый байт заголовка видео последовательности (для потоков PES типа 1 или 2 - видео) или же будет
содержать первый байт аудио кадра (для потоков PES типа 3 или 4- аудио).
Кроме того, в этих случаях в этом или последующих пакетах PES будет присутствовать временная метка воспроизведения (presentation timestamp) для
кадра, следующего за заголовком последовательности, или для аудио кадра.
Для пакетов с PID=PCR_PID PCR_flag устанавливается равным ‘1’.
elementary_stream_priority_indicator – однобитовое поле. Это поле
определяет приоритет данных элементарного потока, переносимых нагрузкой
данного пакета транспортного потока. Значение ‘1’ указывает на повышенный
относительно других пакетов приоритет. В случае видеопотока это поле может принимать значение ‘1’ только если его нагрузка содержит один или несколько байтов INTRA-CODED SLICE. Значение ‘0’ указывает, что нагрузка
имеет такой же приоритет, что и все остальные пакеты, для которых бит не
равен ‘1’.
PCR_flag – однобитовый флаг. Значение ‘1’ указывает на то, что поле
адаптации (adaptation_field) содержит поле PCR, закодированное в двух частях. Значение ‘0’ указывает на то, что поле адаптации не содержит поле
PCR.
OPCR_flag – однобитовый флаг. Значение ‘1’ указывает на то, что поле
адаптации (adaptation field) содержит поле OPCR, закодированной в двух частях. Значение ‘0’ определяет, что поле адаптации не содержит поля OPCR.
splicing_point_flag – однобитовый флаг. Значение ‘1’ указывает на присутствие поля splice_countdown в соответствующем поле адаптации, то есть на
возникновение точки стыковки (splicing point). Значение ‘0’ указывает на то,
что поле splice_countdown отсутствует в поле адаптации.
transport_private_data_flag – однобитовый флаг Значение ‘1’ указывает
на то, что поле адаптации содержит один или несколько байтов private_data.
Значение ‘0’ определяет, что поле адаптации не содержит байтов private_data.
- 34
adaptation_field_extension_flag – однобитовый флаг, устанавливаемый в
1 для обозначения присутствия расширения поля адаптации. Значение ‘0’ указывает на то, что расширение поля адаптации отсутствует.
program_clock_reference_base; program_clock_reference_extension –
42-битное поле, разбиваемое на две части для кодирования. Первая часть,
program_clock_reference_base, является 33-битным полем, значение которого
получается как PCR_base(i) в соответствии с уравнением 1.1.1.1. Вторая часть,
program_clock_reference_extension, является 9-битным полем, значение которого получается как PCR_ext(i) в соответствии с уравнением 1.1.1.2. Поле PCR
определяет ожидаемое время появления байта, содержащего последний бит
program_clock_reference_base, на входе системного декодера.
Если PCR присутствует в пакете транспотного потока, содержащем
аудио или видео данные некоторого элементарного потока, его значение будет
принято для этого потока.
original_program_clock_reference_base;
original_program_clock_reference_extension – 42-битное поле, разбиваемое на две части для кодирования. Эти части, база и расширение, кодируются так же, как и аналогичные параметры для поля PCR. Присутствие OPCR
определяется флагом OPCR. Поле OPCR кодируется только для потоков, в
которых присутствует поле PCR. Поля OPCR могут использоваться транспортными потоками, содержащими как одну, так и несколько программ.
OPCR используется для преобразования транспортного потока, состоящего из одной программы, в дпугой транспортный поток. При восстановлении исходного транспортного потока, содержащего одну программу, значение
OPCR может переноситься в PCR. Получившееся значение PCR корректно
только если исходный однопрограммный транспортный поток восстановлен
полностью. Эти действия предполагают включение дополнительных пакетов
PSI или пользовательских данных, присутствовавших в исходном транспортном потоке, которые, возможно, потребуют использования дополнительных
структур. Из всего сказанного следует, что поле OPCR должно быть точной
копией PCR исходного однопрограммного транспортного потока.
Значение OPCR выражается следующим образом:
33
OPC _basei  syste _ clock_ frequencti DIV300%2
(1.1.1.7)


OPCR _ ext  i    system_ clock _ frequency  t  i   DIV 1 % 300
R
m
y
(1.1.1.8)
(1.1.1.9)
Поле OPCR игнорируется декодером. Поле OPCR не изменяется никакими
мультиплексорами или декодерами.
splice_countdown – 8-битное поле, представляющее положительное или
отрицательное число. Положительное число обозначает количество следующих
за текущим пакетом пакетов транспортного потока, имеющих такой же PID,
после которых расположена точка стыковки. Дубликаты пакетов транспортного
потока, а также пакеты, содержащие только поля адаптации, исключаются из
рассмотрения. Точка стыка возникает непосредственно после перемещения
OPCR i   OPCR _ base i   300  OPCR _ ext  i 
- 35
данных из буфера TBn в момент обработки транспортного пакета, на котором
splice_countdown достигает нуля. Для транспортного пакета, на котором
splice_countdown достигает нуля, последний байт нагрузки транспортного
пакеты будет последним байтом закодированного аудиокадра или
кодированного изображения. В случае видеоданных соответствующий элемент
доступа может (не обязательно) завершаться кодом sequence_end_code. Пакеты
транспортного потока, следующие за текущим и имеющие такой же PID, могут
содержать данные другого элементарного потока того же типа.
Нагрузка следующего пакета транспортного потока с тем же PID (за
исключением дубликатов и пакетов без нагрузки) начинается одновременно с
первым байтом пакета PES. В случае аудиоданных пакет PES начинается с
точки доступа. В случае видеоданных нагрузка пакета PES начнется с точки
доступа или с кода sequence_end_code с последующей точкой доступа. Таким
образом, предыдущий аудио кадр или закодированное изображение выравнены
по границе пакета, в противном случае к ним добавляются дополняющие
байты. После точки стыка также может присутствовать поле countdown_field.
Если значение splice_countdown отрицательно и равно –n, то соответствующий
пакет транспортного потока является n-м пакетом после точки стыка (за
исключением дублирующих пакетов и пакетов без нагрузки).
Далее в данном параграфе точка доступа определяется следующим образом:
видео:
первый
байт
заголовка
видеопоследовательности
(video_sequence_header),
айдио: первый байт аудиокадра.
transport_private_data_length – 8-битное поле, определяющее количество
байт
private_data,
непосредственно
следующих
за
полем
private_data_length. Колчество байт private_data всегда такое, чтобы раздел
пользовательских данных не выходил за пределы поля адаптации.
private_data_byte – 8-битное поле; не специфицировано ISO/IEC.
adaptation_field_extension_length – 8-битное поле. Определяет число
байт данных расширенного поля адаптации, следующих за текущим полем,
включая зарезервированные байты (если такие присутствуют).
ltw_flag (legal time window_flag) – битовое поле; значение ‘1’ указывает
на присутствие поля ltw_offset.
piecewise_rate_flag – однобитовое поле; значение ‘1’ указывает на присутствие поля piecewise_rate.
seamless_splice_flag – однобитовый флаг; значение ‘1’ указывает на
присутствие поля splice_type и DTS_next_AU. Значение ‘0’ указывает на
отсутствие полей splice_type и DTS_next_AU. Поле устанавливается в ‘1’
только в пакетах транспортного потока, в которых установлен флаг
splicing_point_flag. Если seampless_splice_flag установлен в ’1’ в пакете с
положительным значением splice_countdown, флаг будет также установлен во
всех пакетах транспортного потока, имеющих такой же PID и значение
- 36
splicing_point_flag для которых равно ‘1’, до тех пор, пока значение
splice_countdown не достигнет 0 (включая последний пакет). Если флаг
установлен для пакета аудиопотока, поле splice_type будет установлено в 0000.
Если же пакет относится к видеопотоку, значение будет установленно в
соответствии с значением splice_type.
ltw_valid_flag(legal time window_valid_flag) – однобитовое поле; значение ‘1’ указывает на то, что значение lwt_offset действительно. Значение ‘0’
указывает на то, что значение ltw_offset не определено.
ltw_offset (legal time window_offset) – 15-битное поле, значение которого
определено только в том случае, если флаг ltw_valid установлен. Если значение определено, оно измеряется в (300/fs) долях секунды, где fs – частота системных часов программы, которой соответствует данный PID; выполняется
следующее условие:
t1(i) - t(i) = offset,
где i – индекс первого байта данного транспортного потока, offset – значение ltw_offset, t(i) – время поступления этого байта на T-STD, а t1(i) – верхняя граница времени Legal Time Window, соответствующему данному пакету.
Параметр Legal Time Window обладает следующим свойством: если
данный пакет постпает на T-STD в момент времени t1(i), то есть по истечении
Legal Time Window, и остальные пакеты также постпают по истечении Legal
Time Window, то
для видео потоков:
в момент поступления первого байта в буфер
MBn для данного PID этот буфер будет содержать менее 184 байтов данных
элементарного потока, и в T-STD не произойдет переполнений/опустошений
буферов;
для аудио потока: в момент поступления первого байта в буфер Bn для
данного PID этот буфер будет содержать менее BSdec +1 байтов данных элементарного потока, и в T-STD не произойдет переполнений/опустошений буферов.
Можно также определить другой момент времени t0(i) (он будет зависеть от размера буфера MBn и от скорости передачи данных между MBn и
EBn), такой, что если пакет будет доставлен в момент времени, принадлежащий интервалу [t0(i), t1(i)], не произойдет переполнений/опустошений буферов
T-STD. Этот промежуток времени называется Legal Time Window. Значение
t0 данной Рекомендацией не определяется.
Информация об этом поле предназначена для таких устройств, как ремультиплексоры, которым она может понадобится для восстановления состояния буферов MBn.
piecewise_rate – 22-битное поле, определенное только если установлены
флаги ltw_flag и ltw_valid_flag. Поле определяет гипотетическую скорость
передачи данных R, используемую для определения времени окончания периодов Legal Time Window для пакетов транспортного потока с тем же PID, следующих за текущим, но не содержащих поля legal_time_window_offset.
- 37
Пусть первый байт текущего пакета и первые байты N последующих пакетов имеют индексы Ai, Ai+1, ..., Ai+N соответственно, и что N последующих
пакетов не содержат поля legal_time_window_offset. Значение t1(Ai+j) определяются следующим образом:
t1(Ai+j) = t1(Ai) + j*188*8 bits/byte /R,
где j принимает значения 1..N.
Все пакеты между данным и первым последующим пакетом с тем же
PID, для которого опрелено поле legal_time_window_offset, будет обрабатываться так же, как и пакеты с определенным полем legal_time_window_offset.
offset = t1(Ai) - t(Ai),
При этом будут использованы значения, определенные по приведенной
выше формулой. Замечание: t(j) соответствует времени прибытия байта j на
вход T-STD.
Значение этого поля не определено, если оно присутствует в пакете
транспортного
потока,
для
которого
не
определено
поле
legal_time_window_offset.
splice_type – 4-битное поле. С момента появления и до появления пакета
с тем же PID, для которого поле splice_countdown равно 0, все пакеты будут
иметь поле с таким же значением. Если соответствующий поток является
аудиопотоком, поле будет равно 0000. Если элементарный поток, переносимый
данным PID, является видео потоком, поле определяет параметры элементарного потока, предназначенные для стыковки. Эти параметры определены как
функция от profile, level и splice_type в табл. П.1.8 .. П.1.17.
В этих таблицах значение ‘splice_decoding_delay’ и ‘max_splice_rate’
означают, что элементарный поток видеоданных удовлетворяет следующим
условиям:
1. Последний байт кодированного изображения, оканчивающегося
в транспортном пакете со значением
splice_countdown, равным 0,
останется в буфере VBV (при использовании модели VBV) в течение
времени (splice_decoding_delay - Dpn(k)), где в данном случае
 DPn(k) соответствует продолжительности воспроизведения
Pn(k)
 k таково, что tpn(k) = tdn(j), где An(j) содержит кодированное
изрбрадение, оканчивающееся в пакете с splice_countdown=0.
2. Буфер VBV не переполнится, если в момент стыковки (splicing
point) его входной поток будет заменен потоком с постоянной скоростью
передачи max_splice_rate на время splice_decoding_delay.
DTS_next_AU (decoding time stamp next access unit) - 33-битное поле,
разбиваемое на три части для кодирования. Определяет время декодирования
первого элемента доступа, следующего за точкой стыковки в том случае, если
стыковка не была произведена в этой точке. Время декодирования указывается
относительно точки отсчета, действительной в момент splice_countdown=0. Для
всех пакеты, приходящих с момента появления этого поля и до появления
пакета (с тем же PID) с splice_countdown=0, поле будет иметь то же значение.
- 38
stuffing_byte – фиксированное 8-битное значение, равное ‘1111 1111’;
используется кодером в качестве значения дополняющего байта. Декодер отбрасывает дополняющие байты.
Определение полей пакета PES дано в табл. П.1.18.
packet_start_code_prefix – 24-битный код. Вместе с полем stream_id составляет стартовый код пакета, указывающий на начало пакета. Значение поля packet_start_code_prefix равно битовой строке '0000 0000 0000 0000 0000
0001' (0x000001).
stream_id – для программных потоков идентификатор потока stream_id
определяет тип и номер элементарного потока. Для транспортных потоков
идентификатор потока может принимать любое значение, корректно определяющее тип потока, описанных в табл. П.1.19. Для транспортных потоков тип
элементарного потока указывается в PSI.
PES_packet_length – 16-битное поле, определяющее количество байт
пакета PES, следующих за последним байтом этого поля. Значение 0 указывает на то, что длина пакета PES не только не определена, но также и неограничена; такое значение допустимо только для пакетов PES, нагрузка которых
представляет собой элементарный поток видеоданных, содержащийся в пакетах транспортного потока.
PES_scrambling_control – 2-битовое поле, определяющее режим скремблирования нагрузки пакетов PES. Если скремблирование производится на
уровне PES, то заголовок пакета PES, а также необязательные поля, если они
присутствуют, не подвергаются скремблированию.
PES_priority – однобитовое поле, определяющее приоритет нагрузки,
содержащейся в данном пакете PES. Значение ‘1’ определяет приоритет
нагрузки данного пакета как более высокий, чем приоритет нагрузки пакета со
значением ‘0’. Мультиплексор может использовать бит PES_priority для введения приоритетов среди пакетов одного и того же элементарного потока. Это
поле не изменяется механизмом передачи пакетов.
data_alignment_indicator – однобитовый флаг. Значение ‘1’ указывает
на то, что за заголовком пакета PES непосредственно следует стартовый код
видео данных или слово синхронизации аудиоданных, определенное в
data_stream_alignment_descriptor (табл. П.1.47) . Значение ‘0’ не позволяет
определить, имеет ли место такое выравнивание. Если дескриптор отсутствует, требуется выравнивание, соответствующее типу alignment_type ‘01’, определенных в табл. П.1.48 и табл. П.1.49.
copyright – однобитовое поле. Значение ‘1’ означает, что содержание
соответствующего пакета PES защищено авторскими правами. Значение ‘0’ не
позволяет определить, защищено ли содержание пакетов авторскими правами.
С элементарным потоком, содержащим данный пакет PES, флаг copyright которого установлен в ‘1’, соответствует дескриптор. Дескриптор относится к
содержанию данного пакета PES.
- 39
original_or_copy – если этот бит установлен в ‘1’, содержание нагрузки
данного пакета PES является оригиналом. Значение ‘0’ указывает на то, что
это копия.
PTS_DTS_flags – 2-битовое поле. Если значение поля PTS_DTS_flags
равно ‘10’, поля PTS присутствуют в заголовке пакета PES. Если значение поля PTS_DTS_flags равно ‘11’, в заголовке пакета PES присутствуют как поля
PTS, так и поля DTS. Если значение поля PTS_DTS_flags равно ‘00’, в заголовке пакета отсутствуют поля PTS или DTS. Значение ‘01’ является запрещенным.
ESCR_flag – однобитовый флаг, значение ‘1’ указывает на то, что в заголовке пакета PES присутствуют поля ESCR_base и ESCR_extension. Значение ‘0’ указывает на отсутствие полей ESCR.
ES_rate_flag – однобитовый флаг, значение ‘1’ указывает на то, что в
заголовке пакета PES присутствует поле ES_rate. Значение ‘0’ указывает на
отсутствие поля ES_rate.
DSM_trick_mode_flag – однобитовый флаг, значение ‘1’ указывает на
присутствие 8-битного поля спецэффектов (trick mode). Значение ‘0’ указывает на отсутствие данного поля.
additional_copy_info_flag – однобитовый флаг, значение ‘1’ указывает
на присутствие поля additional_copy_info. Значение ‘0’ указывает на отсутствие этого поля.
PES_CRC_flag – однобитовый флаг, значение ‘1’ указывает на присутствие в пакете PES поля CRC. Значение ‘0’ указывает на отсутствие этого поля.
PES_extension_flag – однобитовый флаг, значение ‘1’ указывает на то,
что в заголовке пакета PES присутствует поле расширения. Значение ‘0’ указывает на отсутствие этого поля.
PES_header_data_length – 8-битное поле, определяющее общее количество байт, занимаемых необязательными полями, а также дополняющими полями, содержащимися в заголовке данного пакета PES. На присутствие или
отсутствие необязательных полей указывает байт, предшествующий полю
PES_header_data_length.
marker_bit – битовое поле; всегда принимает значение ‘1’.
PTS (presentation time stamp) –метка времени воспроизведения, которая соотносится со временем декодирования следующим образом:
Поле PTS представляет собой 33-битное число, разбиваемое на три поля
при кодировании. Оно определяет время воспроизведения tpn(k) декодером kго элемента воспроизведения n-го элементарного потока. Значение PTS указывается в единицах, равных 1/300 частоты системных часов (то есть 90 кГц).
Время воспроизведения определяется из PTS согласно выражению 1.1.1.10,
приведенному ниже. Ограничения на частоту кодирования временных меток
воспроизведения указаны далее.
PTS k     system _ clock _ frequency  tp n  k   DIV 300 % 2 33
,
(1.1.1.10)
где tpn(k) равно времени воспроизведения элемента Pn(k).
- 40
В случае аудиопотока, если PTS присутствует в заголовке пакета PES,
его значение соответствует первому элементу доступа, начинающемуся в пакете PES. Элемент доступа аудио потока начинается в пакете PES, если первый байт элемента доступа содержится в пакете PES.
В случае видео потока, если PTS присутствует в заголовке пакета PES,
его значение соответствует первому элементу доступа, содержащему стартовый код изображения, начинающегося в пакете PES. Стартовый код изображения начинается в пакете PES, если первый байт стартового кода изображения присутствует в пакете PES.
Для элементов воспроизведения аудио данных, элементов воспроизведения видео данных в последовательностях low_delay, а также B-кадров, время воспроизведения tpn(k) равно времени декодирования tdn(k).
Для I- и P-кадров, не принадлежащих последовательностям low_delay,
при условии отсутствия разрыва декодирования между элементами доступа
(access unit -AU) k и k’, время воспроизведения tpn(k) будет равно времени декодирования tdn(k) следующих переданных I- или P-кадров (см. п.2.7.5). При
возникновении разрыва декодирования или окончании потока разность между
tpn(k) и tdn(k) будет такой же, как если бы исходный поток был продолжен без
разрыва декодирования и без окончания.
Замечание – Последовательностью low_delay называется последовательность видео данных, для которой установлен флаг low_delay (см. п.
6.2.2.3 13818-2).
Если аудио система осуществляет фильтрацию, принятая модель предполагает, что фильтрация не вводит задержки, то есть отсчет, на который указывает PTS при кодировании, совпадает с отсчетом, на который указывает
PTS при декодировании. Случай масштабируемого кодирования см. в п. 2.7.6.
DTS (decoding time stamp) – метка времени декодирования есть 33битное поле, разбиваемое на три части при кодировании. Она определяет время воспроизведения tpn(j) декодером j-го элемента воспроизведения n-го элементарного потока. Значение DTS указывается в единицах, равных 1/300 частоты системных часов (то есть 90 кГц). Время воспроизведения получается
из DTS согласно выражению 2-11, приведенному ниже.


DTS j    system_ clock _ frequency  td n  j   DIV 300 % 2 33
,
(1.1.1.11)
где tdn(j) соответствует времени декодирования элемента доступа An(j).
Если DTS присутствует в заголовке пакета PES видео потока, его значение соответствует первому элементу доступа, содержащему стартовый коды
изображения, начинающегося в пакете PES. Стартовый код изображения
начинается в пакете PES, если первый байт стартового кода изображения присутствует в пакете PES.
ESCR_base; ESCR_extension – 42-битное поле, разбиваемое на две части при кодировании. Первая часть, представляет собой 33-битное поле, значение которого равно ESCR_base(i) в соответствии с уравнением 1.1.1.12.
Вторая часть, ESCR_ext, представляет собой 9-битное поле, значение которого
- 41
равно ESCR_ext(i) в соответствии с уравнением 1.1.1.13. Поле ESCR определяет предполагаемое время поступления байта, содержащего последний бит
поля ESCR_base, на вход PES-STD для потоков PES.
33
ESCR _ base i     system_ clock _ frequency * t  i   DIV 300 %2
.
(1.1.1.12)


ESCR _ ext  i    system_ clock _ frequency * t  i   DIV 1 % 300
ESCR i   ESCR_ base i   300  ESCR_ ext  i  .
.
(1.1.1.13)
(1.1.1.14)
Поля ESCR и ES_rate (см. выше описание семантики) содержат следующую информацию, относящуюся к последовательности потоков PES.
ES_rate (elementary stream rate) - поле ES_rate представляет собой 22битное безнаковое целое число, определяющее скорость, с которой системный
декодер получает байты пакета PES в случае потока PES. Значение ES_rate
действительно для пакета PES, в котором оно присутствует, а также во всех
последущих пакетах PES того же потока до тех пор, пока не будет определено
новое значение поля ES_rate. Значение поля ES_rate определяется в единицах,
равных 50 байт/сек. Значение 0 запрещено. Значение ES_rate используется для
определения времени прибытия байтов на вход P-STD для потоков PES. Значение, закодированное в поле ES_rate, может изменяться в зависимости от
пакета PES.
trick_mode_control – 3-битовое поле, определяющее режим trick mode,
применяемый к видеопотоку. Для других типов элементарных потоков значение этого поля и следующих за ним пяти бит не определено. Определение состояния trick_mode см. в разделе trick mode.
Если декодер работает не в режиме спецэффектов (trick mode), количество последовательных выводов кадра N определяется полями
repeat_first_field и top_field_first для видеоданных ISO/IEC 13818-2, или же
определяется в системном заголовке для видеоданных ISO/IEC 11172-2.
Если значение trick mode status равно true (при работе в режиме спецэффектов), изображение должно быть выведено некоторое число раз, зависящее
от N.
Необходимо отметить, что если изменяется значение этого поля или
прекращаются действия trick mode, может произойти любое из следующих событий:
 разрыв точки отсчета времени;
 разрыв декодирования;
 разрыв continuity_counter.
- 42
При работе в режиме спецэффектов (trick mode) скорость декодирования
и воспроизведения, отличная от нормальной, может привести к тому, что значения некоторых полей элементарного потока видео данных могут быть неправильными. То же самое верно для семантических ограничений на структуру слайса (slice). Элементы синтаксиса видео потока, к которым относится
это исключение, перечислены ниже:
 bit_rate
 vbv_delay
 repeat_first_field
 v_axis_positive
 field_sequence
 subcarrier
 burst_amplitude
 subcarrier_phase
Декодер не должен предполагать правильность этих значений при работе в режиме trick mode.
Обычно декодеры не должны обязательно декодировать поле
trick_mode_control. Однако декодеры, декодирующие поле trick_mode_control,
должны удовлетворять следующим требованиям.
fast forward – значение ‘000’ в поле trick_mode_control. Если в пакете присутствует это значение, оно указывает на то, что поток видео
данных должен воспроизводиться в режиме быстрого воспроизведения
вперед, а также определяет значение последующих пяти бит заголовка
пакета PES. Бит intra_slice_refresh может быть установлен в ‘1’, что указывает на отсутствие некоторых макроблоков, которые декодер может
заменить соседними макроблоками ранее декодированных кадров. Поле
field_id, определенное в табл. П.1.22, определяет поле или поля, которые
должны быть показаны. Поле frequency_truncation указывает на то, что
может быть включен ограниченный набор соэффициентов. Описание
значений этого поля приведено в табл. П.1.23.
slow motion -- значение ‘001’ в поле trick_mode_control. Если в пакете присутствует это значение, оно указывает на то, что поток видео
данных должен воспроизводиться в режиме медленного воспроизведения вперед, а также определяет значение последующих пяти бит заголовка пакета PES. В случае прогрессирующих последовательностей
(progressie sequences) кадр должен быть показан N x rep_cntrl раз, где N
совпадает с определенным выше.
В случае прогрессирующих последовательностей видео данных,
соответствующих ISO/IEC 11172-2 Video и 13818-2, кадр должен быть
показан в течение промежутка времени, равного N x rep_cntrl времени
показа одного изображения.
Для переплетенных последовательностей, соответствующих Рекомендации 13818-2, кадр должен быть показан в течение промежутка
- 43
времени, равного N x rep_cntrl времени показа одного изображения. Если кадр представляет собой фрейм, первым будет выведено верхнее поле, если значение top_field_first равно 1, и нижнее поле в противном
случае. Это поле выводится N x rep_cntrl /2 field раз. Второе поле выводится N - N x rep_cntrl / 2 раз.
freeze frame - значение ‘010’ в поле trick_mode_control. Если в
пакете присутствует это значение, оно указывает на то, что поток видео
данных должен воспроизводиться в режиме остановки кадра, а также
определяет значение последующих пяти бит заголовка пакета PES. Поле
field_id определено в табл. П.1.22, “Значение поля field_id ”. Поле
field_id относится к первому элементу доступа, начинающемуся в пакете PES и содержащему поле field_id, если только пакет PES содержит
байты нагрузки. Если пакет не содержит нагрузки, поле field_id относится к ближайшему предыдущему элементу доступа.
fast reverse – значение ‘011’ в поле trick_mode_control. Если в пакете присутствует это значение, оно указывает на то, что поток видео
данных должен воспроизводиться в режиме быстрого воспроизведения
назад, а также определяет значение последующих пяти бит заголовка
пакета PES. Бит intra_slice_refresh может быть установлен в ‘1’, что указывает на отсутствие некоторых макроблоков, которые декодер может
заменить соседними макроблоками ранее декодированных кадров. Поле
field_id, определенное в табл. П.1.22, определяет поле или поля, которые
должны быть показаны. Поле frequency_truncation указывает на то, что
может быть включен ограниченный набор соэффициентов. Описание
значений этого поля приведено в табл. П.1.23 «Значения выбора коэффициентов».
slow_reverse - значение ‘100’ в поле trick_mode_control. Если в
пакете присутствует это значение, оно указывает на то, что поток видео
данных должен воспроизводиться в режиме медленного воспроизведения назад, а также определяет значение последующих пяти бит заголовка пакета PES. В случае прогрессирующих последовательностей видео
данных, соответствующих ISO/IEC 11172-2 Video и 13818-2, кадр должен быть показан в течение промежутка времни, равного N x rep_cntrl
времени показа одного изображения, где N совпадает с определенным
выше.
Если кадр представляет собой фрейм, первым будет выведено
верхнее поле, если значение top_field_first равно 1, и нижнее поле в противном случае. Это поле выводится N x rep_cntrl /2 field раз. Второе поле выводится N - N x rep_cntrl / 2 раз.
field_id – 2-битное поле, определяющее поле или поля, которые
должны быть показаны. Поле кодируется в соответствии с табл. П.1.22.
intra_slice_refresh – однобитовый флаг, значение ‘1’ указывает на
то, что между кодированными видео данными слайса (slice) могут отсут-
- 44
ствовать некоторые макроблоки. Значение ‘0’ запрещено. Декодер может
заменить отсутствующие макроблоки соседними макроблоками ранее
декодированных изображений.
frequency_truncation – 2-битное поле, указывающее на то, что при
кодировании видео данных данного пакета PES было использовано ограниченное число коэффициентов. Эти значения определено в табл. П.1.23.
rep_cntrl – 5-битное поле, определяющее количество повторных
выводов переплетенного изображения или прогрессивного изображения.
В случае переплетенных изображений вывод верхнего или нижнего поля
определяется функцией от поля trick_mode_control и top_field_first. Значение '0' запрещено.
additional_copy_info – 7-битное поле, содержащее пользовательские
данные (private data), относящиеся к информации об авторских правах.
previous_PES_packet_CRC – 16-битное поле CRC, использующего многочлен
x16+x12+x5+1 после обработки байт данных предыдущего пакета PES (байты
заголовка не обрабатываются).
PES_private_data_flag – однобитовый флаг, значение ‘1’ указывает на
то, что заголовок пакета PES содержит пользовательские данные. Значение ‘0’
указывает на отсутствие пользовательских данных в заголовке пакета PES.
pack_header_field_flag – однобитовый флаг, значение ‘1’ указывает на
то, что в заголовке пакета PES содержится заголовок пакета программного потока или заголовок пакета ISO/IEC 11172. Для пакетов PES, содежащихся в
программном потоке, это поле равно ‘0’. Если значение этого поля равно ‘0’
для пакетов PES транспортного потока, этот пакет не содержит заголовка пакета.
program_packet_sequence_counter_flag – однобитовый флаг, значение
‘1’
указывает
на
присутствие
в
пакете
PES
полей
program_packet_sequence_counter,
MPEG1_MPEG2_identifier
и
original_stuff_length. Значение ‘0’ указывает на отсутствие этих полей в заголовке пакета PES.
P-STD_buffer_flag – однобитовый флаг, значение ‘1’ указывает на то,
что в заголовке пакета PES присутствуют поля P-STD_buffer_scale и PSTD_buffer_size. Значение ‘0’ указывает на отсутствие этих полей в заголовке
пакета PES.
PES_extension_flag_2 – однобитовый флаг, значение ‘1’ указывает на
присутствуе поля PES_extension_field_length и других подобных полей. Значение ‘0’ указывает на отсутствие поля PES_extension_field_length и других
подобных полей.
PES_private_data – 16-байтное поле, содержащее пользовательские
данные. Эти данные вместе с данными до и после этого поля, не должны совпадать с кодом packet_start_code_prefix (0x000001).
pack_field_length – 8-битное поле, определяющее длину поля
packet_header_field в байтах.
- 45
program_packet_sequence_counter – 7-битное поле. Необязательный
счетчик, увеличивающийся с каждым поступающим пакетом PES программного потока, системного потока ISO/IEC 11172 или потока пакетов PES, соответствующих определению программы внутри транспортного потока; это поле
предоставляет функции, сходные с функциями поля continuity_counter. Это
позволяет приложению восстанавливать исходную последовательность пакетов PES программного потока или исходного системного потока ISO/IEC
11172. Счетчик обнуляется после достижения максимального значения. Пакеты PES не будут повторяться. Таким образом, последовательные пакеты PES
мультиплексированного программного потока не могут иметь одинаковые
значения program_packet_sequence_counter.
MPEG1_MPEG2_identifier – однобитовый флаг, значение ‘1’ указывает
на то, что данный пакет PES передает информацию системного потока
ISO/IEC 11172. Значение ‘0’ указывает на то, что данный пакет PES передает
информацию программного потока.
original_stuff_length – 6-битное поле, определяет кодичество дополняющих байтов, использованных в исходном заголовке пакета PES Рекомендации 13818-1 или исходном заголовке пакета ISO/IEC 11172-1.
P-STD_buffer_scale – однобитовое поле, значение которого определено
только для пакетов PES, содержащихся в программном потоке. Оно определяет маштабирующий множитель, используемый для интерпретации поля PSTD_buffer_size. Если предыдущее поле stream_id определяет аудио поток, PSTD_buffer_scale равно ‘0’. Если предыдущее поле stream_id определяет видео поток, P-STD_buffer_scale равно ‘1’. Для остальных типов потока значение может быть как ‘1’, так и ‘0’.
P-STD_buffer_size –13-битное беззнаковое целое число, значение которого определено только, если пакет PES содержится в программном потоке.
Оно определяет размер входного BSn P-STD. Если P-STD_buffer_scale равно
‘0’, поле P-STD_buffer_size равно размеру буфера, умноженному на 128 байт.
Если P-STD_buffer_scale равно ‘1’, поле P-STD_buffer_size равно размеру буфера, умноженному на 1024 байт. Таким образом,
if (P-STD_buffer_scale == 0)
BSn = P-STD_buffer_size  128;
(1.1.1.15)
else
BSn = P-STD_buffer_size  1024;
(1.1.1.16)
PES_extension_field_length – 7-битное поле, определяющее размер данных (в байтах), следующих за данным полем и принадлежащих полю расширения PES, включая зарезервированные байты.
stuffing_byte – фиксированное 8-битное значение, равное '1111 1111',
которое может быть добавлено декодером для того, чтобы удовлетворять тре-
- 46
бованиям канала передачи. Это поле не используется декодером. В заголовке
пакета PES может присутствовать не более 32 дополняющих байтов.
PES_packet_data_byte – непрерывная последовательность байтов данных элементарного потока, определенного значением stream_id или PID пакета. Если элементарный поток соответствует Рекомендации 13818-2 или
13818-3, последовательность PES_packet_data_bytes будет выравнена по байтовой границе в соответствии с Рекомендацией 13818-1. Порядок следования
байтов элементарного потока будет сохранен. Количество байт
PES_packet_data_bytes, N, определяется полем PES_packet_length. N равно
разности значения, указанного в поле PES_packet_length и количества байт
между последним байтом поля PES_packet_length и первым байтом поля
PES_packet_data_byte.
Для потоков типа private_stream_1 или private_stream_2 содержание поля
PES_packet_data_byte определяется пользователем и не будет определяться
стандартами ISO в будущем.
padding_byte – фиксированное 8-битное значение, равное ‘1111 1111’.
Декодером не используется.
1.1.1.4.8. Передача программных потоков и системных потоков
ISO/IEC 11172-1 в транспортном потоке
Транспортный поток предусматривает поля, позволяющий осуществлять
передачу программных потоков и системных потоков ISO/IEC 11172-1 так,
чтобы обеспечить простое восстановление потока декодером.
При помещении программного потока в транспортный поток пакеты
PES программного потока, значение stream_id
которых равно
private_stream_1, или же пакетов, соответствующих Рекомендации 13818-2,
ISO/IEC 11172-2 видео, ISO/IEC 13818-3 или ISO/IEC 11172-3 аудио, передаются в пакетах программного потока.
При восстановлении программного потока декодером транспортного
потока данные пакета PES копируются в восстанавливаемый программный
поток.
Все поля пакета PES (за исключением поля packet_start_code_prefix) переносятся в новый пакет PES, если значение stream_id исходного пакета PES
программного
потока
равно
program_stream_map,
padding_stream,
private_stream_2, ECM, EMM, DSM_CC_stream, или program_stream_directory.
Поле stream_id нового пакета PES равно ancillary_stream. Новый пакет PES
передается в пакетах транспортного потока.
При восстановлении программного потока декодером транспортного
потока пакеты с stream_id, равным ancillary_stream_id, в восстанавливаемый
программный поток записывается packet_start_code_prefix, после которого записываются поля data_byte пакетов PES данного транспортного потока.
При передаче потоков ISO/IEC 11172-1 в транспортных потоках сначала
заголовки пакетов ISO/IEC 11172-1 заменяются на заголовки пакетов PES, соответствующих 13818-1. Поля заголовков пакетов ISO/IEC 11172-1 копируют-
- 47
ся в соответствующие поля заголовков пакетов PES, соответствующих 138181.
В заголовок любого пакета PES, передающего данные программного потока или системного потока ISO/IEC 11172-1 включается поле
program_packet_sequence. Это позволяет декодеру восстанавливать порядок
пакетов PES в исходном программном потоке или пакетов в исходном системном потоке ISO/IEC 11172-1.
Поле pack_header программного потока или системного потока ISO/IEC
11172-1 передается в транспортном потоке в заголовке, непосредственно следующим за пакетом PES.
1.1.1.5.
Информация о программе
Информация о программе (Program Specific Information - PSI) включает
как нормативные данные, соответствующие Рекомендации ISO/IEC 13818-1,
так и пользовательские данные (private data), позволяющие декодерам производить демультиплексирование программ. Программы состоят из одного или
нескольких элементарных потоков, каждый из которых индексируется идентификатором – PID. Программы, элементарные потоки или их части могут
подвергаться скремблированию, позволяющему реализовать условный доступ.
Однако информация о программе (PSI) скремблированию не подвергается.
Для транспортных потоков PSI разбивается на четыре структуры, как
показано на приведенной ниже таблице. Несмотря на то, что эти структуры
можно воспринимать как таблицы, они могут быть разбиты на разделы и помещены в пакеты транспортного потока.
Таблицы PSI, определенные в 13818-1, разбиваются на один или несколько разделов, передаваемых при помощи транспортных пакетов. Раздел
представляет собой синтаксическую структуру, используемую для отображения определенных Рекомендацией 13818-1 таблиц PSI в пакеты транспортного
потока.
Кроме определенных в Рекомендации 13818-1 таблиц PSI, также могут
передаваться таблицы пользовательских данных. Способ передачи пользовательских данных в пакетах транспортного потока не определяется данной
Спецификацией. Например, таблицы пользовательских данных могут передаватся так же, как и таблицы PSI, определенные 13818-1, так, что синтаксис
отображения этих данных совпадает с синтаксисом, определенным для таблиц PSI. Для этих целей определяется раздел пользовательских данных. Если
private data передаются в пакетах транспортного потока с тем же значением
PID, что и пакеты, переносящие Таблицы отображения программы, (это значение определено в PAT), используется синтаксис и семантика раздела
private_section. Данные, передаваемые в разделе private_data_bytes, могут подвергаться скремблированию. Однако никакие другие поля раздела
private_section не скремблируются. Если эта структура не используется, отоб-
- 48
ражение private data в пакеты транспортного потока не определено Рекомендацией 13818-1.
Разделы могут иметь переменную длину. Начало раздела обозначается
полем pointer_field нагрузки пакета транспортного потока. Синтаксис этого
поля определен в табл. П.1.25.
В пакетах транспортного потока, переносящих разделы, могут появляться поля адаптации.
В пакетах транспортного потока могут встречаться дополняющие байты
– 0xFF; в этом случае все последующие байты до конца пакета являются дополняющими и имеют значение 0xFF. Эти байты могут быть отброшены декодером. В данном случае нагрузка следующего пакета транспортного потока
с тем же PID должна начинаться с поля pointer_field, равного 0x00, указывающего на то, что следующий раздел начинается непосредственно после данного.
Каждый транспортный поток содержит один или несколько пакетов с
PID, равным 0x0000. Все такие пакеты транспортного потока составляют
полный список программ транспортного потока. Последняя из переданных
таблиц с current_next_indicator = ‘1’ соответствует текущим данным транспортного потока. Все изменения в программах, передаваемых в транспортном
потоке, описываются обновленной версией таблицей соответствий программы, переносимой пакетами транспортного потока с PID = 0x0000. Всех таких
разделов поле table_id будет равно 0x00. В пакетах транспортного потока со
значением PID 0x0000 разрешены только такие разделы. Перед тем, как
начнет использоваться новая веhсия PAT, все разделы (определяемые при помощи last_section_number), имеющие новое значение version_number и
current_next_indicator=’1’, должны покинуть буфер Bsys, определенный для TSTD. Новая таблица PAT становится действительной, как только последний
байт последнего необходимого раздела покидает буфер Bsys.
При скремблировании одного или нескольких элементарных потоков
транспортного потока пакеты транспортного потока с PID=0x0001 должны
содержать разделы CA_sections с дескрипторами CA_descriptors, соответствующими скремблированным потокам. Вместе переданные пакеты транспортного потока составляют полную версию таблицы условного доступа. Последняя из переданных таблиц с current_next_indicator = ‘1’ соответствует текущим данным транспортного потока. Любые изменения параметров скремблирования, которые делают текущую таблицу условного доступа неправильной или неполной, отражаются в обновленной версии таблицы условного доступа. Все такие разделы будут иметь table_id=0x01. В пакетах транспортного
потока со значением PID 0x0001 разрешены только такие разделы. Для того,
чтобы новая версия CAT была принята, необходимо, чтобы все разделы (это
определяется полем last_section_number) с новым version_number и полем
current_next_indicator, равным ‘1’, покинули буфер Bsys. Новая таблица CAT
становится действительной, как только последний байт последнего необходимого раздела покидает буфер Bsys.
- 49
В любом транспортном потоке обязательно присутствует один или несколько пакетов транспортного потока с PID, определенным в таблице объединения программ как PID пакета, передающего разделы отображения программы для транспортного потока (TS_program_map_section). Каждая программа, включенная в таблицу соответствия (PAT), описывается отдельным
разделом TS_program_map_section. Каждая программа полностью описывается в транспортном потоке. Private data, для которых в разделе отображения
программы предусмотрено поле elementary_PID, являются частью программы.
Другие private data могут существовать в транспортном потоке, не будучи указанными в разделе таблицы объединения программ. Последняя из переданных
версий TS_program_map_section с current_next_indicator = ‘1’ соответствует
текущим данным транспортного потока. Любые изменения определения программы транспортного потока отражаются в обновленной версии соответствующего раздела таблицы объединения программ, переданной в пакетах
транспортного потока со значением PID, равным program_map_PID для соответствующей программы. Все пакеты транспортного пакета, передающие
раздел TS_program_map_section, имеют одинаковое значение PID. Значение
program_map_PID не изменяется в течение времени передачи (жизни) программы. Определение программы не может занимать более одного раздела
TS_program_map_section. Новая версия раздела TS_program_map_section становится действительной, когда последний байт раздела с новым значением
varsion_number и current_next_indicator = ‘1’ покидает Bsys.
Разделы со значением table_id 0x02 содержат информацию таблицы
отображения программы. Такие разделы могут передаваться в пакетах транспортного потока с различными значениями PID.
Таблица сетевой информации является необязательной, и ее содержимое
не специфицировано. Если эта таблица присутствует, она передается в пакетах
транспортного потока, имеющих одно и то же значение PID, равное
network_PID. Значение network_PID определяется пользователем и, если оно
присутствует, находится в таблице соответствия программы под номером программы program_number=0x0000. Если таблица сетевой информации присутствует, она состоит из одной или нескольких разделов private_section.
Максимальный размер раздела таблицы PSI равен 1024 байт. Максимальный размер private_section равен 4096 байт.
На данные таблицы PSI, соответствующей 13818-1 или определенной
пользователем, не накладывается никаких ограничений по появлению стартовых кодов, байтов синхронизации или других последовательностей бит .
1.1.1.6. Описание таблиц
Синтаксис поля pointer_field определен в таблице П.1.25.
pointer_field – 8-битное поле, равное числу байт, отделяющих последний байт поля pointer _field от первого раздела нагрузки пакета транспортного
потока (так, например, значение 0x00 означает, что раздел начинается непосредственно после поля pointer_field). Если в пакете транспортного потока
- 50
присутствует хотя бы один раздел, поле payload_unit_start_indicator будет
установлено в 1, а первый байт нагрузки данного пакета будет содержать указатель. Если в пакете транспортного потока не начинается ни один раздел, поле payload_unit_start_indicator будет равно 0, и в нагрузке пакета не будет содержаться указатель.
Таблица обьединения программ
Таблица объединения программ определяет соответствие между значением program_number и значением PID пакетов транспортного потока, передающих определение программы. Значение program_number представляет собой метку, соответствующую программе.
Таблица может быть разбита на несколько секций в соответствии со
следующим синтаксисом.
Значение program_number 0x0000 зарезервировано для network_PID.
Это значение определяет PID пакетов транспортного потока, передающих
таблицу сетевой информации.
Определение идентификатора таблиц (table_id)
Поле table_id определяет содержимое раздела PSI транспортного потока
в соответствии с таблицей П.1.27:
Описание полей раздела таблицы объединения программ
table_id – 8-битное поле, в данном случае равное 0x00 в соответствии с
табл. П.1.27.
section_syntax_indicator – однобитовое поле, всегда равное ‘1’.
section_length – 12-битное поле; первые два бита равны ‘00’. Определяет число байт от поля section_length до CRC (включая CRC). Значение данного
поля не превосходит 1021.
transport_stream_id – 16-битное поле; выполняет функции метки, отличающей данный транспортный поток от других потоков в сети. Значение
определяется пользователем.
version_number – 5-битное поле, определяющее номер версии таблицы
объединения программ. Его значение увеличивается на 1 при каждом изменении таблицы объединения программ (PAT). После достижения значения 31
оно становится равным 0. Если current_next_indicator=’1’, version_number соответствует текущей таблицы объединения программ. Если current_next_indicator=’0’, значение version_number равно номеру следующей
PAT.
current_next_indicator – однобитовый индикатор, значение ‘1’ указывает на то, что пересылаемая PAT является текущей. Значение ‘0’ указывает на
то, что пересылаемая PAT является следующей применимой таблицей (еще не
утверждена).
section_number – 8-битное поле, определяющее номер данного раздела.
Поле section_number первого раздела PAT равно 0x00. Его значение увеличи-
- 51
вается на 1 при появлении новых разделов PAT.
last_section_number – 8-битное поле, определяющее номеру последнего
раздела (то есть раздела с наибольшим значением section_number) полной
таблицы PAT.
program_number – 16-битное поле. Определяет программу, к которой
относится program_map_PID. Значение 0x0000 определяет network PID. В
остальных случаях значение этого поля определяется пользователем. Это поле
не может принимать некоторое значение более одного раза для одной версии
PAT. Значение program_number может, например, использоваться для организации широковещательного канала.
network_PID – 13-битное поле, определяющее PID пакетов транспортного потока, содержащих таблицу сетевой информации. Значение поля
network_PID определяется пользователем, но может принимать только значение, определенные в таблице П.1.4. Поле netwok_PID является необязательным.
program_map_PID – 13-битное поле, определяющее PID пакетов транспортного потока, содержащих раздел program_map_section, относящийся к
программе (она определяется значением program_number). Ни одному значению program_number не может соответствовать более одного присваивания
program_map_PID. Значение program_map_PID определяется пользователем,
но принимает только значения, указанные в таблице П.1.4.
CRC_32 – 32-битное поле, содержащее значение CRC.
Таблица условного доступа
Таблица условного доступа (CA – Conditional Access) определяет соответствие между одной или несколькими системами CA, их потоками EMM и
связанными с ними параметрами.
Перед распределением по пакетам транспортного потока таблица может
быть разбита на несколько разделов согласно следующему синтаксису.
Описание полей раздела условного доступа
table_id – 8-битное поле, в данном случае равное 0x01 в соответствии с
табл. П.1.27.
section_syntax_indicator – однобитовое поле, всегда равное ‘1’.
section_length – 12-битное поле, первые два бита равны ‘00’. Определяет число байт от поля section_length до CRC (включая CRC). Значение данного
поля не превосходит 1021.
version_number – 5-битное поле, определяющее номер версии таблицы
условного доступа. Номер версии version_number увеличивается на 1 по модулю 32 при изменении информации таблицы условного доступа. Если
current_next_indicator=’1’, значение version_number равно номеру предыдущей
таблицы условного доступа. Если current_next_indicator=’0’, значение
version_number равно номеру следующей таблицы условного доступа.
- 52
current_next_indicator – однобитовый индикатор; значение ‘1’ указывает на то, что пересылаемая таблица условного доступа (CAT) является текущей. Значение ‘0’ указывает на то, что пересылаемая таблица условного доступа является следующей применяемой таблицей условного доступа, но не
является текущей.
section_number – 8-битное поле, определяющее номер данного раздела.
Поле section_number первого раздела CAT равно 0x00. Его значение увеличивается на 1 по модулю 256 при появлении новых разделов CAT.
last_section_number – 8-битное поле, определяющее номер последнего
раздела (то есть раздела с наибольшим значением section_number) полной
таблицы CAT.
CRC_32 – 32-битное поле, содержащее значение CRC после обработки
всего раздела условного доступа.
Таблица объединения программ
Таблица объединения программ определяет соответствие номеров программ элементам, их составляющим. Само по себе одно такое отображение
называется «определением программы». Таблица объединения программ
представляет собой полный набор определений программ транспортного потока. Эта таблица передается в пакетах, PID которых определяется кодером.
При необходимости может использоваться более одного значения PID. Перед
распределением по пакетам транспортного потока таблица может быть разбита на несколько разделов согласно следующему синтаксису. Поле number будет установлено равным 0 для каждого раздела. Разделы определяются полем
program_number.
Описание полей раздела таблицы объединения программ
table_id – 8-битное поле, в случае раздела TS_program_map_section равное 0x02 в соответствии с табл. П.1.27.
section_syntax_indicator – однобитовое поле, всегда равное ‘1’.
section_length – 12-битное поле, первые два бита равны ‘00’. Определяет число байт от поля section_length до CRC (включая CRC). Значение данного
поля не превосходит 1021.
program_number – 16-битное поле. Определяет программу, к которой
относится program_map_PID. Описание программы передается только в одном
разделе TS_program_map_section. Это предполагает, что определение программы не превосходит 1016 байт. Значение program_number может, например, использоваться для организации широковещательного канала. Описание
различных элементов, составляющих программу, позволяет соединять данные
из разных источников (например, последовательные события) для получения
непрерывного набора потоков при помощи поля program_number.
version_number – 5-битное поле, определяющее номер версии раздела
TS_program_map_section. Номер версии version_number увеличивается на 1 по
модулю 32 при изменении информации раздела. Номер версии относится к
- 53
определению программы, то есть к одному разделу. Если current_next_indicator=’1’, значение version_number равно номеру текущего раздела TS_program_map_section. Если current_next_indicator=’0’, значение version_number равно номеру текущего раздела TS_program_map_section.
current_next_indicator – однобитовый индикатор, значение ‘1’ указывает на то, что пересылаемый раздел TS_program_map_section является текущим.
Значение ‘0’ указывает на то, что пересылаемый раздел
TS_program_map_section является следующим применимым.
section_number – 8-битное поле, значение которого всегда равно 0x00.
last_section_number – 8-битное поле, значение которого всегда равно
0x00.
program_map_PID – 13-битное поле, определяющее PID пакетов транспортного потока, содержащих поля PCR, относящиеся к данной программе.
Если, например, для неспецифицированных (private) потоков определению
программы не соответствует PCR, это поле принимает значение 0x1FFF.
program_info_length – 12-битное поле, первые два бита равны ‘00’.
Определяет число байтов, занимаемых дескрипторами, непосредственно следующими за полем program_info_length.
stream_type – 8-битное поле, определяющее тип элемента программы,
передаваемого пакетами со значением PID, равным elementary_PID. Значения
stream_type определены в табл. П.1.36.
elementary_PID – 13-битное поле, определяющее PID пакетов программного потока, пересылающих соответствующий элемент программы.
ES_info_length – 12-битное поле, первые два бита равны ‘00’. Определяет число байтов, занимаемых дескрипторами эдемента программы, непосредственно следующими за полем ES_info_length.
CRC_32 – 32-битное поле, содержащее значение CRC после обработки
всего раздела отображения программы транспортного потока.
- 54
Описание раздела пользовательских данных
Использование раздела private_section необязательно, если пользовательские данные передаются в пакетах транспортного потока с PID, определенным в PAT как PID таблицы объединения программ. Использование раздела private_section позволяет передавать минимально структурированные данные, сохраняя возможность синтаксического разбора потока декодером. Такие
разделы могут быть использованы двумя способами: если поле
section_syntax_indicator установлено равным ‘1’, используется вся структура,
характерная для таблиц; в пртивном случае обычной для таблиц структурой
обладают только поля от ‘table_id’ до ‘private_section_length’, а формат
остальной части раздела определяется пользователем.
Таблица пользовательских данных может состоять из нескольких разделов private_section, имеющих одно и то же значение table_id.
Описание полей раздела таблицы пользовательских данных
table_id – 8-битное поле, определяющее таблцу пользовательских данных, которой принадлежит данный раздел. Некоторые значения зарезервированы (см. табл. П.1.27).
section_syntax_indicator – однобитовый индикатор. Значение ‘1’ указывает на то, что поля раздела после поля private_section_length удовлетворяют
общему синтаксису. Значение ‘0’ указывает на то, что за полем
private_section_length непосредственно следует поле private_ data_bytes.
private_indicator – однобитовый флаг, определяемый пользователем;
его значение не будет специфицировано ISO/IEC в будущем.
private_section_length – 12-битное поле. Определяет число байтов раздела пользовательских данных, непосредственно следующих за полем
private_section_length и продолжающихся до конца раздела. Значение данного
поля не превосходит 4093.
private_data_byte – поле, определяемое пользователем; его значение не
будет специфицировано ISO/IEC в будущем.
table_id_extension – 16-битное поле. Его использование и значение
определяются пользователем.
version_number – 5-битное поле, определяющее номер версии раздела.
Значение version_number увеличивается на 1 по модулю 32 при изменении
информации,
передаваемой
в
разделе
private_section.
Если
current_next_indicator=’0’, значение version_number равно номеру следующего
действительного раздела private_section с теми же значениями table_id и
section_number.
current_next_indicator – однобитовое поле, значение ‘1’ указывает на
то, что пересылаемый раздел private_section является текущим. Если current_next_indicator=’1’, значение version_number равно номеру текущего раздела private_section. Значение ‘0’ указывает на то, что пересылаемый раздел
private_section является следующим применимым, но является следующим
- 55
действительным разделом private_section с тем же значением section_number и
table_id.
section_number – 8-битное поле, определяющее номер данного раздела
private_section. Поле section_number первого раздела таблицы пользовательских данных равно 0x00. Его значение увеличивается на 1 по модулю 256 при
появлении новых разделов таблицы пользовательских данных.
last_section_number – 8-битное поле, определяющее номер последнего
раздела (то есть раздела с наибольшим значением section_number) полной
таблицы пользовательских данных, которой принадлежит данный раздел.
CRC_32 – 32-битное поле, содержащее значение CRC после обработки
всего раздела private_section.
1.1.1.6.
Требования к программному потоку
Структура кодирования и параметры программного
потока
Уровень кодирования, воспроизведенный программным потоком, позволяет объединять один или несколько элементарных потоков в один программный поток. Данные элементарных потоков мультиплексируются и кодируются вместе с информацией, позволяющей синхронно воспроизводить
элементарные потоки.
Программный поток состоит из одного или нескольких мультиплексированных элементарных потоков одной программы. Данные элементарных
потоков передаются в пакетах PES. Пакет PES состоит из заголовка, за которым следуют данные пакета.
Заголовок пакета PES начинается 32-битным стартовым кодом, определяющим поток (см. табл. П.1.19), которому принадлежит пакет. Пакет PES
может содержать либо только временную метку воспроизведения, либо временную метку воспроизведения и декодирования. Заголовок пакета PES также содержит набор флагов, позволяющих использовать необязательные поля.
Поле данных пакета PES содержит переменное число непрерывно следующих
байтов элементарного потока.
В программном потоке пакеты PES объединяются в пакеты. Пакет состоит из заголовка, за которым может следовать несколько пакетов. Заголовок
пакета начинается с 32-битного стартового кода. Заголовок пакета используется для передачи информации о скорости потока и временных метках.
Программный поток начинается с системного заголовка, который может
быть повторен несколько раз. Системный заголовок содержит параметры системы, определенные для потока.
1.1.1.6.1.
1.1.1.6.2. Системный декодер программного потока
Для корректного описания семантики программного потока и ограничений, накладываемых на эту семантику, необходимы точные определения со-
- 56
бытий декодирования, а также времени, в которые происходят эти события. В
этой Рекомендации необходимые определения вводятся при помощи гипотетического декодера – прототипа системного декодера программного потока
(P-STD).
P-STD представляет собой концептуальную модель, используемую для
точного определения этих терминов и моделирования процесса декодирования в процессе создания и проверки программных потоков. Концепция P-STD
определяется только с этой целью. Ни архитектура P-STD, ни описанная синхронизация не предполагают непрерывное, синхронизированное воспроизведение программных потоков, поступающих от различных декодеров с различным архитектурами и схемами синхронизации.
Рис. 1.1.1.12. Системный декодер программного потока
При описании прототипа системного декодера программного потока используются следующие обозначения, показанные на рис.1.1.1.12).
i, i' - индексы байтов в программном потоке. Первый байт имеет индекс 0.
j - индекс, используемый для доступа к элементам доступа элементарных потоков.
k, k', k'' - индексы элементов воспроизведения в элементарных потоках.
n - индекс элементарного потока.
t(i) - момент времени(в секундах), в который i-й байт программного потока поступает в системный декодер. Значение t(0) – произвольная константа.
SCR(i) - время, закодированное в поле SCR и измеряемое в
отсчетах системных часов (27 MГц); i равно индексу последнего байта
поля system_clock_reference_base.
- 57
An(j) - j-ый элемент доступа в n-ом элементарном потоке. An(j)
индексируются в порядке декодирования.
tdn(j) - время декодирования (в секундах) j-го элемента доступа в
n-ом элементарном потоке.
Pn(k) - k-ый элемент воспроизведения в n-ом элементарном потоке. Pn(k) индексируются в порядке воспроизведения.
tpn(k) время воспроизведения (в секундах) k-го элемента
воспроизведения n-го элементарного потока в системном декодере.
tвремя (в секундах).
Fn(t) - степень заполнения входного буфера системного декодера
n-го элементарного потока в момент времени t (измеряется в байтах).
Bn - входной буфер системного декодера, соответствующий n-му
элементарному потоку.
BSn - размер входного буфера системного декодера n-го элементарного потока (в байтах).
Dn - декодер n-го элементарного потока.
On - буфер восстановления последовательности n-го элементарного
потока видео данных.
1.1.1.6.3. Параметры системных часов
Временная информация, использующаяся в P-STD, передается в нескольких полях, определенных в данной Рекомендации. Частота системных
часов измеряется в герцах и должна удовлетворять следующим ограничениям:
27 000 000 - 810 <= system_clock_frequency <= 27 000 000 + 810,
скорость изменения system_clock_frequency во времени <= 75  10-3
Гц/сек.
Термин «system_clock_frequency» используется в нескольких разделах
этого стандарта для обозначения частоты, удовлетворяющей перечисленным
требованиям. Для удобства обозначения предполагается, что уравнения, в которых участвуют значения PCR, PTS или DTS, верны с точность до целого
кратного (300233/system_clock_frequency) секундам. Этот эффект имеет место из-за того, что информация PCR кодируется как 33-битное значение, соответствующее целому кратному 1/300 частоты системных часов + 9 бит, выделенных на кодирование остатка, а на кодирование PTS и DTS отведено только
33 бита, кодирующие целое кратное (system_clock_frequency/300).
1.1.1.6.4. Входные данные системного декодера программного потока
Данные программного потока поступают на вход системного декодера.
Очередной i-й байт потока поступает на вход в момент времени t(i). Время
поступления байта на вход системного декодера может быть получено по данным входного потока путем декодирования поля ссылки системных часов
- 58
(SCR) и поля program_mux_rate, закодированных в заголовке пакета. Согласно
уравнению (1.1.1.19), при кодировании поле SCR разбивается на две части:
одна равна частному от деления значения системных часов на 1/300  the
system clock frequency (system_clock_reference_base – уравнение 1.1.1.17), а
другая остатку (system_clock_reference_ext – уравнение 1.1.1.18). Далее эти
значения обозначаются SCR_base(i) и SCR_ext(i), соответственно. Значение,
закодированное в поле SCR, определяет время t(i), где i равно индексу байта,
содержащего последний бит поля system_clock_reference_base.
SCR _ base i     system_ clock _ frequency  t  i   DIV 300 %2 33
,
(1.1.1.17)


SCR _ ext  i    system_ clock _ frequency  t  i   DIV 1 % 300
(1.1.1.18)
(1.1.1.19)
Согласно уравнению (1.1.1.20), время поступления остальных байтов получается из SCR(i) и скорости поступления данных, причем скорость поступления байтов определяется для каждого пакета и равна значению поля
program_mux_rate заголовка пакета.
SCR i  SCR_ base i  300  SCR_ ext i .
t i 
SCR i '
system_ clock _ frequency

,
i  i'
program_ mux _ rate  50
(1.1.1.20)
где i'
индекс
байта,
содержащего
последний
бит
поля
system_clock_reference_base заголовка пакета.
i
- индекс произвольного байта пакета, включая байты заголовка
мультипакета.
SCR(i') - время, закодированное в полях SCR_base и SCR_ext, выраженное в единицах, соответствующих частоте системных часов.
После прибытия последнего байта пакета в течение некоторого промежутка времени на вход P-STD могут не поступать новые данные.
1.1.1.6.5. Буферизация
Данные пакета PES элементарного потока n помещаются в буфер n-го
потока, Bn. Передача i-го байта в буфер Bn происходит мгновенно, то есть iй байт поступает в буфер n-го потока (он имеет размер BSn) в момент времени
t(i).
Данные заголовка пакета, системных заголовков или заголовков пакетов
PES программного потока (например, поля SCR, DTS, PTS или packet_length)
не поступают ни в какой буфер, но могут быть использованы для управления системой.
В данном описании синтаксиса размеры буферов BS1 … BSn определяются параметром buffer size в уравнении (1.1.1.15) и уравнении (1.1.1.16).
В момент декодирования, tdn(j) все данные элемента доступа, находящиеся в буфере дольше всего, An(j), а также дополняющие байты, присутствующие в буфере в момент времени tdn(j), считываются в тот же момент
времени tdn(j). Время декодирования tdn(j) указывается в полях DTS и PTS.
- 59
Время декодирования элементов доступа, следующих за элементом j и не
имеющих полей DTS или PTS (tdn(j+1), tdn(j+2), ...), может быть получено с
помощью информации элементарного потока. Элемент доступа, считанный из
буфера, сразу же декодируется в элемент воспроизведения.
Далее будут построены программный потоки пакеты PES, а также выбраны моменты времени t(i) так, чтобы во входных буферах системного декодера программного потока (буферы имеют размер BS1…BSn) не произойдет
ни их переполнения, ни опустошения. То есть
0  Fn  t   BSn , для всех t и n,
и Fn(t) = 0 сразу же после t = t(0).
Fn(t) отражает наполнение буфера P-STD Bn в момент времени t.
Исключением является случай установленного флага low_delay заголовка последовательности видеоданных или работы в режиме спецэффектов (trick
mode).
Задержка, вносимая буферизацией на входе системного декодера, для
всех программных потоков не превосходит 1 секунды за исключением неподвижных изображений. Задержка, вносимая буферизацией на входе, равна
разности времени поступления байта во входной буфер и времени его декодирования.
А именно: в случае, исключающем неподвижные изображения, задержка ограничена условием
td n  j   t  i   1
секунд,
для неподвижных изображений задержка ограничена условием
td n  j   t i  60
секунд
для всех байтов, содержащихся в j-ом элементе доступа.
Во всех программных потоках все байты данного пакета поступают на
вход P-STD до поступления какого-либо байта, принадлежащего следующему
пакету.
Когда флаг low_delay в расширении последовательности видеоданных
равен ‘1’, может произойти опустошение буфера VBV. В данном случае в
момент времени tdn(j) буфер элементарного потока Bn может содержать неполный элемент доступа. Тогда будет произведена повторная проверка наличия полного элемента доступа в буфере с временным интервалом, равным
удвоенному периоду появления поля. В этот момент времени весь элемент
доступа и соответствующие системные данные будут удалены из буфера Bn.
Опустошение буфера VBV может происходить постоянно, на него не
наложено никаких ограничений. Декодер P-STD удаляет элементы доступа из
буфера Bn в наиболее ранний из возможных моментов времени, удовлетворяющих ограничениям, описанным в предыдущем параграфе, а также значениям
DTS и PTS из битового потока. Необходимо отметить, что декодер может
оказаться не в состоянии восстановить правильные временные отметки декодирования до тех пор, пока опустошение буфера VBV не прекратится и в битовом потоке будут обнаружены значения PTS или DTS.
- 60
1.1.1.6.6. Потоки ПЭП (PES)
Поток данных может быть организован как непрерывный поток пакетов
ПЭП, содержащие данные одного и того же элементарного потока и имеющие
одинаковые значения идентификатора потока stream_id. Такой поток называется потоком ПЭП. Модель PES-STD потока ПЭП идентична модели программного потока, за исключением того, что вместо SCR используется ESCR
(Elementary Stream Clock Reference – ссылка на часы элементарного потока), а
вместо program_mux_rate используется ES_rate. Демультиплексор посылает
данные только в один буфер элементарного потока.
Размеры буферов BSn модели PES-STD определяются следующим образом:
Для видео данных BSn = VBVmax[profile,level] + BSoh
BSoh = (1/750) секунд * Rmax[profile,level],
где VBVmax[profile,level] и Rmax[profile,level] равны максимальному
размеру VBV и битовой скорости для данного значения profile,
level и layer в соответствии с определением в табл. 8.12 и 8.13 в
части 2 данной Рекомендации. Буфер BSoh предназначен для
накладных расходов на обработку заголовков пакета PES.
Для аудио данных BSn = 2 848 байт.
Процессы декодирования и воспроизведения системного декодера программного потока совпадает с аналогичными процессами, описанными для
системного декодера транспортного потока.
1.1.1.6.7. Описание программного потока
Опишем семантику полей программного потока
MPEG_program_end_code – битовая строка, равная '0000 0000 0000
0000 0000 0001 1011 1001' (0x000001B9). Она завершает программный поток.
Определение семантики полей мультипакета программного потока:
pack_start_code - битовая строка '0000 0000 0000 0000 0000 0001 1011
1010' (0x000001BA). Это поле указывает на начало мультипакета.
system_clock_reference_base; system_clock_reference_extension – 42битное поле, разбиваемое на две части для кодирования. Первая часть,
system_clock_reference_base, представляет собой 33-битное поле, значение которого равно SCR_base(i) в соответствии с уравнением (1.1.1.17). Вторая
часть, system_clock_reference_extension, представляет собой 9-битное поле,
значение которого равно SCR_ext(i) в соответствии с уравнением (1.1.1.18).
SCR определяет предполагаемое время поступления байта, содержащего последний бит поля system_clock_reference_base, на вход декодера.
marker_bit – однобитовое поле, значение которого равно ‘1’.
program_mux_rate – 22-битное целое число, определяющее скорость
передачи данных при поступлении на вход P-STD, включающего это поле
мультипакета. Значение program_mux_rate измеряется в единицах, равных 50
- 61
байт/сек. Значение ‘0’ запрещено. Значение, закодированное в поле
program_mux_rate, используется для определения времени поступления байтов
на вход P-STD. Значения program_mux_rate для разных мультипакетов мультиплексированного программного потока могут различаться.
pack_stuffing_length – 3-битное целое число, определяющее количество
дополняющих байтов, следующих за этим полем.
stuffing_byte - фиксированное 8-битное число, равное ‘1111 1111’, которое кодер может помещать в поток, например, для того, чтобы согласовать с
процессом передачи. Это поле не используется декодером. В заголовке пакета
может присутствовать не более 7 дополняющих байтов.
Определение семантики полей системного заголовка
system_header_start_code - битовая строка '0000 0000 0000 0000 0000
0001 1011 1011' (0x000001BB). Это поле указывает на начало системного заголовка.
header_length – 16-битное поле; определяет длину (в байтах) системного заголовка, следующего за полем header_length. Необходимо отметить, что
будущие расширения данной Рекомендации могут расширять системный заголовок.
rate_bound – 22-битное поле. Целое число, большее или равное максимальному значению поля program_mux_rate, закодированного в любом пакете
программного потока. Может использоваться декодером для оценки возможности декодирования всего потока.
audio_bound – 6-битное поле. Целое число от 0 до 32 (включая граничные значения), большее или равное максимальному числу аудио потоков
ISO/IEC 13818-3 и IOS/IEC 11172-3 программного потока, для которых процессы декодирования активны одновременно. В данном случае считается, что
процесс активен, если не пуст буфер STD или элемент воспроизведения обрабатывается в модели P-STD.
fixed_flag – однобитовый флаг. Значение ‘1’ указывает на работу с фиксированной битовой скоростью. Значение ‘0’ определяет работу с переменной
битовой скоростью. При работе с фиксированной битовой скоростью значение, содержащееся в полях system_clock_reference мультиплексированных потоков, соответствующих 13818, удовлетворяет следующему уравнению:
SCR_ base(i) = ((c1 * i + c2) DIV 300) % 2 33
, (1.1.1.21)
(1.1.1.22)
где c1 - действительная константа, одинаковая для всех i;
c2 действительная константа, одинаковая для всех i;
iиндекс в потоке, соответствующем 13818, байта, содержащего
последний бит поля system_clock_reference.
CSPS_flag – однобитовое поле. Если его значение равно ‘1’, программный поток соответствует ограничениям, определенным в п.2.7.9 данной Рекомендации.
SCR_ ext(i) = ((c1 * i + c2) DIV 1) % 300 ,
- 62
system_audio_lock_flag – однобитовое поле, значение ‘1’ указывает на
постоянное
отношение
частоты
дискретизации
и
значения
system_clock_frequency системного декодера.
Частота дискретизации system_clock_frequency определена в ISO/IEC
13818-3. Флаг system_audio_lock_flag может быть установлен в ‘1’ только если
отношение system_clock_frequency к частоте дискретизации, SCASR, постоянно и равно значению, указанному в соответствующем столбце следующей
таблицы.
SCR  SCR
i
где cимволы
X
Y
300
bas i SCR_exi
t
_
(1.1.1.23)
обозначают деление действительных чисел.
Номинальная частота
дискретизации (кГц)
SCASR
16
32
22,05
27 000 000 27 000 000
------------- ---------16 000
32 000
44,1
24
48
27 000 000 27 000 000 27 000 000
------------- --------------------22 050
44 100
24 000
27 000 000
---------48 000
system_video_lock_flag – однобитовое поле, значение ‘1’ указывает на
постоянное
отношение
частоты
смены
кадра
и
значения
system_clock_frequency системного декодера. Частота смены кадров определяется в части 2 данной Рекомендации. Флаг system_video_flag может быть
установлен в ‘1’ если для всех элементов воспроизведения элементарных потоков 13818-1 отношение system_clock_frequency к частоте смены кадров,
SCPR, постоянно и равно значению, указанному в соответствующем столбце
приведенной ниже таблицы.
syste _ cloc _ frequenc
SCP 
m _ rate
k _ in_ the
y _ P STD
pictur
R
Номинальная
23,976
частота смены
кадров (Гц)
SCPR
1 126 125
24
1 125 000
25
29,97
1 080 000 900 900
(1.1.1.24)
30
900 000
50
59,94
540 000 450 450
60
450 000
Значения SCPR точны. Реальная частота смены кадров незначительно
отличается от номинальной частоты 23.976, 29.97 или 59.94 кадров в секунду.
video_bound – 5-битное целое число от 0 до 16 (включая граничные значения), большее или равное максимальному числу потоков, соответствующих
13818-2 и 11172-2, для которых процессы декодирования активны одновременно. В данном случае процесс декодирования видео потока, соответствующего 13818-2 и 11172-2, считается активным, если буфер STD не пуст, обрабатывается элемент воспроизведения в модели P-STD или буфер восстановления последовательности не пуст.
packet_rate_restriction_flag – однобитовый флаг. Если значение флага
CSPS равно ‘1’, packet_rate_restriction_flag определяет, какие ограничения
- 63
накладываются на скорость передачи пакетов. Если флаг CSPS установлен в
'0', значение флага packet_rate_restriction_flag не определено.
reserved_byte – байт зарезервирован для использования ISO/IEC. До
определения ITU-T | ISO/IEC он должен принимать значение ‘1111 1111'.
stream_id – 8-битное поле, определяющее номер элементарного потока,
которому
принадлежат
поля
P-STD_buffer_bound_scale
и
PSTD_buffer_size_bound.
Если stream_id принимает значение ‘1011 1000’, поля PSTD_buffer_bound_scale и P-STD_buffer_size_bound, следующие за stream_id,
относятся ко всем аудио потокам программного потока.
Если stream_id принимает значение ‘1011 1001’, поля PSTD_buffer_bound_scale и P-STD_buffer_size_bound относятся ко всем видео
потокам программного потока.
Если поле stream_id принимает другое значение, это значение будет не
меньше ‘1011 1100’ и будет интерпретировано как номер элементарного потока согласно табл. П.1.19.
Поля P-STD_buffer_bound_scale и P-STD_buffer_size_bound определяются таким образом для каждого элементарного потока, принадлежащего программному потоку, ровно один раз в каждом системном заголовке.
P-STD_buffer_bound_scale – однобитовое поле, определяющее масштабирующий множитель, используемый при интерпретации последующего поля
P-STD_buffer_size_bound. Если предыдущее поле stream_id определяет аудио
поток, значение P-STD_buffer_bound_scale равно ‘0’. Если предыдущее поле
stream_id определяет видео поток, значение P-STD_buffer_bound_scale равно
‘1’. Для остальных типов потока значение может быть как ‘1’, так и ‘0’.
P-STD_buffer_size_bound – 13-битное беззнаковое целое число, определяющее значение, большее или равное максимальному по всем пакетам n-го
потока размеру входного буфера P-STD (BSn). Если P-STD_buffer_scale равно
‘0’, значение P-STD_buffer_size_bound, умноженное на 128, равно верхней
границе размера буфера (в байтах). Если P-STD_buffer_scale равно ‘1’, значение P-STD_buffer_size_bound, умноженное на 1024, равно верхней границе
размера буфера (в байтах). Поэтому:
if (P-STD_buffer_bound_scale == 0)
BSn  P  STD_ buffer _ size_ bound  128;
else BSn  P  STD_ buffer _ size_ bound  1024;
1.1.1.7. Параметры системных часов
Этот дескриптор передает информацию о системных часах, использованных для генерации меток времени.
Если был использован внешний генератор, должен быть установлен бит
external_clock_reference_indicator. Если этот внешний генератор доступен, декодер может использовать его при декодировании.
Если точность системных часов превосходит необходимую точность в
30 ppm (ppm, или parts per million, означает величину относительной погреш-
- 64
ности 10-6), точность может быть передана декодеру в поле clock_accuracy.
Точность часов определяется следующим образом:
clock_accuracy_integer  10-clock_accuracy_exponent ppm (1.1.1.25)
Если clock_accuracy_integer = 0, то точность системных часов равна 30
ppm.
Если используются обе части дескриптора, под точностью часов понимается точность внешнего генератора.
Описание полей дескриптора системных часов
external_clock_reference_indicator – однобитовый индикатор. Значение
‘1’ указывает на то, что системные часы используют внешний генератор, который может быть доступен декодеру.
clock_accuracy_integer – 6-битное целое число. Вместе с
clock_accuracy_exponent определяет дробную часть точности частоты системных часов, измеряемую в ppm.
clock_accuracy_exponent – 3-битное целое число. Вместе с
clock_accuracy_integer определяет дробную часть точности частоты системных
часов, измеряемую в ppm.
Частота кодирования отсчетов системных часов
Программный поток должен быть организован так, чтобы промежуток
времени, отделяющий байты, содержащие последние биты полей
system_clock_reference_base последовательных пакетов, не превышал 0.7 секунды. Таким образом,
t  i   t  i '  0,7 sec
для всех i и i', где i и i' – индексы байтов, содержащих последние биты последовательных полей system_clock_reference_base.
Частота кодирования отсчетов программных часов
Транспортный поток должен быть организован так, чтобы промежуток
времени, отделяющий байты, содержащие последние биты полей
program_clock_reference_base значений поля PCR последовательных пакетов
транспортного потока с PID, равным PCR_PID фиксированой программы, не
превышал 0.1 секунды для любой праграммы. Таким образом,
t  i   t  i '  0,1 sec
для всех i и i', где i и i' – индексы байтов, содержащих последние биты полей
program_clock_reference_base последовательных пакетов транспортного потока с PID, равным PCR_PID заданной программы.
- 65
Для фиксированного PCR_PID между двумя последовательными разрывами PCR обязательно должны появляться по меньшей мере 2 значения PCR,
упрощающие фазовую подстройку частоты и экстраполяцию времени доставки байтов.
Частота кодирования отсчетов часов элементарного потока
Программный и транспортный потоки должны быть организованы так,
чтобы временной интервал, отделяющий байты, содержащие последние биты
последовательных полей ESCR_base, не превосходил 0.7 с., если отсчеты часов элементарного потока передаются в пакетах PES этого потока. Отсчеты
ESCR должны кодироваться в потоках PES с равными интервалами между
последовательными отсчетами. Таким образом,
t  i   t  i '  0,7 sec
для всех i и i', где i и i' – индексы байтов, содержащих последние биты последовательных полей ESCR_base.
Замечание – Кодирование отсчетов часов элементарного потока не является обязательным. Однако, если кодирование производится, оно должно удовлетворять описанным ограничениям.
Частота кодирования временной отметки воспроизведения
Программный и транспортный потоки должны быть организованы так,
чтобы длина максимального промежутка времени, разделяющего последовательные закодированные отметки времени воспроизведения элементарного
видео или аудио потока, не превосходила 0.7 секунды. Таким образом,
tpn  k   tpn  k "  0,7 sec
для всех n, k и k'', для которых
1. Pn(k) и Pn(k'') – элементы воспроизведения, временные отметки которых кодируются.
2. k и k'' выбраны так, что не существует элемента воспроизведения Pn(k'), для которого k < k' < k'';
3. в n-м элементарном потоке не было разрыва времени декодирования между Pn(k) and Pn(k'').
Это ограничение (0.7 сек.) не относится к случаю неподвижных изображений.
Download