

#### A.2 Frame Header                                        {#h-0a-02}


| Frame Header                                 | Type  |
|----------------------------------------------|-------|
| `if (key_frame) {`                           |       |
| `  color_space`                              | L(1)  |
| `  clamping_type`                            | L(1)  |
| `}`                                          |       |
| `segmentation_enabled`                       | L(1)  |
| `if (segmentation_enabled) {`                |       |
| `  update_segmentation()`                    |       |
| `}`                                          |       |
| `filter_type`                                | L(1)  |
| `loop_filter_level`                          | L(6)  |
| `sharpness_level`                            | L(3)  |
| `mb_lf_adjustments()`                        |       |
| `log2_nbr_of_dct_partitions`                 | L(2)  |
| `quant_indices()`                            |       |
| `if (key_frame) {`                           |       |
| `  refresh_entropy_probs`                    | L(1)  |
| `} else {`                                   |       |
| `  refresh_golden_frame`                     | L(1)  |
| `  refresh_alternate_frame`                  | L(1)  |
| `  if (!refresh_golden_frame)`               |       |
| `    copy_buffer_to_golden`                  | L(2)  |
| `  if (!refresh_alternate_frame)`            |       |
| `    copy_buffer_to_alternate`               | L(2)  |
| `  sign_bias_golden`                         | L(1)  |
| `  sign_bias_alternate`                      | L(1)  |
| `  refresh_entropy_probs`                    | L(1)  |
| `  refresh_last`                             | L(1)  |
| `}`                                          |       |
| `token_prob_update()`                        |       |
| `mb_no_coeff_skip`                           | L(1)  |
{:.col1-pre}


| Frame Header                                 | Type  |
|----------------------------------------------|-------|
| `prob_skip_false`                            | L(8)  |
| `if (!key_frame) {`                          |       |
| `  prob_intra`                               | L(8)  |
| `  prob_last`                                | L(8)  |
| `  prob_golden`                              | L(8)  |
| `  intra_16x16_prob_update_flag`             | L(1)  |
| `  if (intra_16x16_prob_update_flag) {`      |       |
| `    for (i = 0; i < 4; i++)`                |       |
| `      intra_16x16_prob`                     | L(8)  |
|   }                                          |       |
| `  intra_chroma prob_update_flag`            | L(1)  |
| `  if (intra_chroma_prob_update_flag) {`     |       |
| `    for (i = 0; i < 3; i++)`                |       |
| `      intra_chroma_prob`                    | L(8)  |
| `  }`                                        |       |
| `  mv_prob_update()`                         |       |
| `}`                                          |       |
{:.col1-pre}


  * `color_space` defines the YUV color space of the sequence ([9.2](#h-09-02))
  * `clamping_type` specifies if the decoder is required to clamp the reconstructed pixel values ([9.2](#h-09-02))
  * `segmentation_enabled` enables the segmentation feature for the current frame ([9.3](#h-09-03)) 
  * `filter_type` determines whether the normal or the simple loop filter is used ([9.4](#h-09-04), [15](#h-15-00))
  * `loop_filter_level` controls the deblocking filter ([9.4](#h-09-04), [15](#h-15-00))
  * `sharpness_level` controls the deblocking filter ([9.4](#h-09-04), [15](#h-15-00))
  * `log2_nbr_of_dct_partitions` determines the number of separate partitions containing the DCT coefficients of the macroblocks ([9.5](#h-09-05))
  * `refresh_entropy_probs` determines whether updated token probabilities are used only for this frame or until further update
  * `refresh_golden_frame` determines if the current decoded frame refreshes the golden frame ([9.7](#h-09-07))
  * `refresh_alternate_frame` determines if the current decoded frame refreshes the alternate reference frame ([9.7](#h-09-07))
  * `copy_buffer_to_golden` determines if the golden reference is replaced by another reference ([9.7](#h-09-07))
  * `copy_buffer_to_alternate` determines if the alternate reference is replaced by another reference ([9.7](#h-09-07))
  * `sign_bias_golden` controls the sign of motion vectors when the golden frame is referenced ([9.7](#h-09-07))
  * `sign_bias_alternate` controls the sign of motion vectors when the alternate frame is referenced ([9.7](#h-09-07))
  * `refresh_last` determines if the current decoded frame refreshes the last frame reference buffer ([9.8](#h-09-08))
  * `mb_no_coeff_skip` enables or disables the skipping of macroblocks containing no non-zero coefficients ([9.10](#h-09-10))
  * `prob_skip_false` the probability that the macroblock is not skipped (flag indicating skipped macroblock is false) ([9.10](#h-09-10))
  * `prob_intra` the probability of an intra macroblock ([9.10](#h-09-10))
  * `prob_last` the probability that the last reference frame is used for inter prediction ([9.10](#h-09-10))
  * `prob_golden` the probability that the golden reference frame is used for inter prediction ([9.10](#h-09-10))
  * `intra_16x16_prob_update_flag` indicates if the branch probabilies used in the decoding of luma intra prediction mode are updated ([9.10](#h-09-10))
  * `intra_16x16_prob` the branch probabilities of the luma intra prediction mode decoding tree
  * `intra_chroma_prob_update_flag` indicates if the branch probabilies used in the decoding of chroma intra prediction mode are updated ([9.10](#h-09-10))
  * `intra_chroma_prob` the branch probabilities of the chroma intra prediction mode decoding tree


| update_segmentation()                        | Type  |
| -------------------------------------------- | ----- |
| `update_mb_segmentation_map`                 | L(1)  |
| `update_segment_feature_data`                | L(1)  |
| `if (update_segment_feature_data) {`         |       |
| `  segment_feature_mode`                     | L(1)  |
| `  for (i = 0; i < 4; i++) {`                |       |
| `    quantizer_update`                       | L(1)  |
| `    if (quantizer_update) {`                |       |
| `      quantizer_update_value`               | L(7)  |
| `      quantizer_update_sign`                | L(1)  |
| `    }`                                      |       |
| `  }`                                        |       |
| `  for (i = 0; i < 4; i++) {`                |       |
| `    loop_filter_update`                     | L(1)  |
| `    if (loop_filter_update) {`              |       |
| `      lf_update_value`                      | L(6)  |
| `      lf_update_sign`                       | L(1)  |
| `    }`                                      |       |
| `  }`                                        |       |
| `}`                                          |       |
| `if (update_mb_segmentation_map) {`          |       |
| `  for (i = 0; i < 3; i++) {`                |       |
| `    segment_prob_update`                    | L(1)  |
| `    if (segment_prob_update) {`             |       |
| `      segment_prob`                         | L(8)  |
| `    }`                                      |       |
| `  }`                                        |       |
| `}`                                          |       |
{:.col1-pre}


  * `update_mb_segmentation_map` determines if the MB segmentation map is updated in the current frame ([9.3](#h-09-03))
  * `update_segment_feature_data` indicates if the segment feature data is updated in the current frame ([9.3](#h-09-03))
  * `segment_feature_mode` indicates the feature data update mode, 0 for delta and 1 for the absolute value ([9.3](#h-09-03))
  * `quantizer_update` indicates if the quantizer value is updated for the [[ i^(th) ]] segment ([9.3](#h-09-03))
  * `quantizer_update_value` indicates the update value for the segment quantizer ([9.3](#h-09-03))
  * `quantizer_update_sign` indicates the update sign for the segment quantizer ([9.3](#h-09-03))
  * `loop_filter_update` indicates if the loop filter level value is updated for the [[ i^(th) ]] segment ([9.3](#h-09-03))
  * `lf_update_value` indicates the update value for the loop filter level ([9.3](#h-09-03))
  * `lf_update_sign` indicates the update sign for the loop filter level ([9.3](#h-09-03))
  * `segment_prob_update` indicates if the branch probabilities used to decode the `segment_id` in the MB header are decoded from the stream or use the default value of 255 ([9.3](#h-09-03))
  * `segment_prob` the branch probabilities of the `segment_id` decoding tree ([9.3](#h-09-03))


| mb_lf_adjustments()                          | Type  |
|----------------------------------------------|-------|
| `loop_filter_adj_enable`                     | L(1)  |
| `if (loop_filter_adj_enable) {`              |       |
| `  mode_ref_lf_delta_update`                 | L(1)  |
| `  if (mode_ref_lf_delta_update) {`          |       |
| `    for (i = 0; i < 4; i++) {`              |       |
| `      ref_frame_delta_update_flag`          | L(1)  |
| `      if (ref_frame_delta_update_flag) {`   |       |
| `        delta_magnitude`                    | L(6)  |
| `        delta_sign`                         | L(1)  |
| `      }`                                    |       |
| `    }`                                      |       |
| `    for (i = 0; i < 4; i++) {`              |       |
| `      mb_mode_delta_update_flag`            | L(1)  |
| `      if (mb_mode_delta_update_flag) {`     |       |
| `        delta_magnitude`                    | L(6)  |
| `        delta_sign`                         | L(1)  |
| `      }`                                    |       |
| `    }`                                      |       |
| `  }`                                        |       |
| `}`                                          |       |
{:.col1-pre}


  * `loop_filter_adj_enable` indicates if the MB-level loop filter adjustment (based on the used reference frame and coding mode) is on for the current frame ([9.4](#h-09-04))
  * `mode_ref_lf_delta_update` indicates if the delta values used in adjustment are updated in the current frame ([9.4](#h-09-04))
  * `ref_frame_delta_update_flag` indicates if the adjustment delta value corresponding to a certain used reference frame is updated ([9.4](#h-09-04))
  * `delta_magnitude` is the absolute value of the delta value
  * `delta_sign` is the sign of the delta value
  * `mb_mode_delta_update_flag` indicates if the adjustment delta value corresponding to certain MB prediction mode is updated ([9.4](#h-09-04))


| quant_indices()                              | Type  |
|----------------------------------------------|-------|
| `y_ac_qi`                                    | L(7)  |
| `y_dc_delta_present`                         | L(1)  |
| `if (y_dc_delta_present) {`                  |       |
| `  y_dc_delta_magnitude`                     | L(4)  |
| `  y_dc_delta_sign`                          | L(1)  |
| `}`                                          |       |
| `if (y2_dc_delta_present) {`                 |       |
| `  y2_dc_delta_magnitude`                    | L(4)  |
| `  y2_dc_delta_sign`                         | L(1)  |
| `}`                                          |       |
| `if (y2_ac_delta_present) {`                 |       |
| `  y2_ac_delta_magnitude`                    | L(4)  |
| `  y2_ac_delta_sign`                         | L(1)  |
| `}`                                          |       |
| `if (uv_dc_delta_present) {`                 |       |
| `  uv_dc_delta_magnitude`                    | L(4)  |
| `  uv_dc_delta_sign`                         | L(1)  |
| `}`                                          |       |
| `if (uv_ac_delta_present) {`                 |       |
| `  uv_ac_delta_magnitude`                    | L(4)  |
| `  uv_ac_delta_sign`                         | L(1)  |
| }                                            |       |
{:.col1-pre}


  * `y_ac_qi` is the dequantization table index used for the luma AC coefficients (and other coefficient groups if no delta value is present) ([9.6](#h-09-06))
  * `y_dc_delta_present` indicates if the stream contains a delta value that is added to the baseline index to obtain the luma DC coefficient dequantization index ([9.6](#h-09-06))
  * `y_dc_delta_magnitude` the magnitude of the delta value ([9.6](#h-09-06))
  * `y_dc_delta_sign` the sign of the delta value ([9.6](#h-09-06))
  * `y2_dc_delta_present` indicates if the stream contains a delta value that is added to the baseline index to obtain the Y2 block DC coefficient dequantization index ([9.6](#h-09-06))
  * `y2_ac_delta_present` indicates if the stream contains a delta value that is added to the baseline index to obtain the Y2 block AC coefficient dequantization index ([9.6](#h-09-06))
  * `uv_dc_delta_present` indicates if the stream contains a delta value that is added to the baseline index to obtain the chroma DC coefficient dequantization index ([9.6](#h-09-06))
  * `uv_ac_delta_present` indicates if the stream contains a delta value that is added to the baseline index to obtain the chroma AC coefficient dequantization index ([9.6](#h-09-06))


| token_prob_update()                          | Type  |
| -------------------------------------------- | ----- |
| `for (i = 0; i < 4; i++) {`                  |       |
| `  for (j = 0; j < 8; j++) {`                |       | 
| `    for (k = 0; k < 3; k++) {`              |       |
| `      for (l = 0; l < 11; l++) {`           |       |
| `        coeff_prob_update_flag`             | L(1)  |
| `        if (coeff_prob_update_flag) {`      |       |
| `          coeff_prob`                       | L(8)  |
| `        }`                                  |       |
| `      }`                                    |       |
| `    }`                                      |       |
| `  }`                                        |       |
| `}`                                          |       |
{:.col1-pre}


  * `coeff_prob_update_flag` indicates if the corresponding branch probability is updated in the current frame ([13.4](#h-13-04))
  * `coeff_prob` is the new branch probability ([13.4](#h-13-04))


| mv_prob_update()                             | Type  |
| -------------------------------------------- | ----- |
| `for (i = 0; i < 2; i++) {`                  |       |
| `  for (j = 0; j < 19; j++) {`               |       | 
| `    mv_prob_update_flag`                    | L(1)  |
| `    if (mv_prob_update_flag) {`             |       |
| `      prob`                                 | L(7)  |
| `    }`                                      |       |
| `  }`                                        |       |
| `}`                                          |       |
{:.col1-pre}


  * `mv_prob_update_flag` indicates if the corresponding MV decoding probability is updated in the current frame ([17.2](#h-17-02))
  * `prob` is the updated probability ([17.2](#h-17-02))

