Поток битов, полученный декодером, описывается в подразделе 5.1. Каждый элемент данных описывается именем, длиной в битах, мнемоникой типа и порядком передачи.
Действие, вызванное декодируемым элементом данных в потоке битов, зависит от значения этого элемента данных и элементов данных, декодируемых ранее. Декодирование элементов данных и определение параметров состояния, используемых в их декодировании, описываются в подразделе 5.2.
В этом синтаксисе используется принятое в языке С соглашение о том, что переменная или выражение, возвращающие ненулевое значение, эквивалентны результату "истина".
Для выражения условия присутствия элементов данных используются следующие конструкции:
Если "истина", то группа элементов данных появляется в потоке данных. Это повторяется, пока условие не "ложь". | |
Элемент данных всегда существует, по крайней мере один раз. | |
Элемент данных повторяется при условии "истина". | |
Если условие "истина", то первая группа элементов данных появляется затем в потоке данных. | |
Если условие "истина" не сохраняется, то вторая группа элементов данных появляется затем в потоке данных. | |
Является инициализирующим выражением цикла. |
Следует обратить внимание на наиболее распространенные варианты использования этой конструкции:
Группа элементов данных появляется n раз. Условия в пределах группы элементов данных могут зависеть от значения переменной управления циклом i, которая обнуляется при первом появлении, увеличивается на 1 при втором появлении и т.д. |
Как отмечено, группа элементов данных может содержать вложенные условные конструкции. Для компактности скобки { } могут быть опущены, когда следует только один элемент данных.
data_element [ ] | Является массивом данных. |
data_element [n] | Является (n+1)-м элементом массива данных. |
data_element [m][n] | Является элементом (m+1)-й строки (n+1)-го столбца двухмерного массива данных. |
data_element [l][m][n] | Является (I+1), (m+1), (n+1)-м элементом трехмерного массива данных. |
data_element [m…n] | Биты массива data_element с m по n включительно. |
Знание самого синтаксиса потока битов в 5.3 не следует считать достаточным для декодирования. В частности, это лишь определяет корректный и свободный от ошибок входной поток битов. Реальные декодеры для того, чтобы правильно начать декодирование, должны иметь средства обнаружения стартовых последовательностей.
bytealigned( ) | Возвращает 1, если текущая позиция находится на границе байта, так что следующий бит потока будет первым битом нового байта. В противном случае функция возвращает 0. |
nextbits( ) | Реализует сравнение строки битов со строкой битов на входе декодера. |
next_start_code( ) | Удаляет все нулевые биты и биты стаффинга и определяет положение следующего синхрослова. |
Эта функция проверяет, является ли текущая позиция побайтно выровненной. Иначе присутствуют нулевые биты стаффинга. Это означает, что перед синхрословом может присутствовать любое количество нулевых байтов. В связи с этим синхрослово всегда является побайтно выровненным и ему может предшествовать любое число нулевых битов стаффинга.