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