chromium / webm / bitstream-guide / 0324fb5d0abaaef8b92cba656289db0eb5476174 / . / text_src / 16.02__vp8-bitstream__inter-predicted-macroblocks.txt

#### 16.2 Inter-Predicted Macroblocks {#h-16-02} | |

Otherwise (when the above bool is true), we are using inter-prediction (which of course only happens for interframes), to which we now restrict our attention. | |

The next datum is then another bool, `B( prob_last)`, selecting the reference frame. If 0, the reference frame is previous frame (last frame); if 1, another bool (`prob_gf`) selects the reference frame between golden frame (0) or altref frame (1). The probabilities `prob_last` and `prob_gf` are set in field J of the frame header. | |

Together with setting the reference frame, the purpose of inter-mode decoding is to set a motion vector for each of the sixteen Y subblocks of the current macroblock. This then defines the calculation of the inter-prediction buffer (detailed in Chapter 18). While the net effect of inter-mode decoding is straightforward, the implementation is somewhat complex; the (lossless) compression achieved by this method justifies the complexity. | |

After the reference frame selector comes the mode (or motion vector reference) applied to the macroblock as a whole, coded using the following enumeration and tree. Setting `mv_nearest = num_ymodes` is a convenience that allows a single variable to unambiguously hold an inter- or intraprediction mode. | |

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |

typedef enum | |

{ | |

mv_nearest = num_ymodes, /* use "nearest" motion vector | |

for entire MB */ | |

mv_near, /* use "next nearest" "" */ | |

mv_zero, /* use zero "" */ | |

mv_new, /* use explicit offset from | |

implicit "" */ | |

mv_split, /* use multiple motion vectors */ | |

num_mv_refs = mv_split + 1 - mv_nearest | |

} | |

mv_ref; | |

const tree_index mv_ref_tree [2 * (num_mv_refs - 1)] = | |

{ | |

-mv_zero, 2, /* zero = "0" */ | |

-mv_nearest, 4, /* nearest = "10" */ | |

-mv_near, 6, /* near = "110" */ | |

-mv_new, -mv_split /* new = "1110", split = "1111" */ | |

}; | |

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |

{:lang="c"} | |