VP8 tree coding is similar to Huffman coding algorithm which use pre-defined coding tree to decode (encode) syntax element value from (into) binary bit strings.
“A tree representing an encoding of an alphabet of n possible values always contains n-1 non-leaf nodes". In VP8, these coding trees are 2-forks trees stored in sequential arrays with positive items represent non-leaf nodes (sub-trees) while the non-positive items represent the leaf nodes.
Take ymode as example:
typedef enum
{
DC_PRED,
V_PRED,
H_PRED,
TM_PRED,
B_PRED,
num_ymodes
}
intra_mbmode;
const tree_index ymode_tree [2 * (num_ymodes - 1)] =
{
-DC_PRED, 2, /* root: DC_PRED = "0", "1" subtree */
4, 6, /* "1" subtree has 2 descendant subtrees */
-V_PRED, -H_PRED, /* "10" subtree: V_PRED = "100", H_PRED = "101" */
-TM_PRED, -B_PRED /* "11" subtree: TM_PRED = "110", B_PRED = "111" */
};
The ymode_tree can be represented as follow:
The tree decoding process is like this:
idx = 0;
while(){
idx += read_one_bit();
item = coding_tree[ idx ];
if( item > 0 ) {
idx = item; // jump to subtree
}else{
return (-item); // got a leaf
}
}