static ALWAYS_INLINE int x264_cabac_pos( x264_cabac_t *cb )
{
return (cb->p - cb->p_start + cb->i_bytes_outstanding) * 8 + cb->i_queue;
}
/*函数体:
return (cb->p - cb->p_start + cb->i_bytes_outstanding) * 8 + cb->i_queue;
cb是指向s264_cabac_t结构体的指针,该结构体可能包含CABAC编码或解码过程中使用的各种状态变量。
cb->p可能指向当前正在处理的字节的指针。
cb->p_start可能是指向CABAC数据流开始的指针。
cb->i_bytes_outstanding可能是已经处理但尚未输出的字节数。
cb->i_queue可能是当前已经编码或解码但尚未输出的位的数量。
计算过程:
cb->p - cb->p_start计算从数据流的开始到当前处理位置的字节偏移量。
cb->i_bytes_outstanding加上这个偏移量,得到当前已经处理但未输出的总字节数。
将这个总字节数乘以8(因为每个字节有8位),得到当前已经处理但未输出的总位数。
最后,加上cb->i_queue,这是当前队列中已经编码或解码但尚未输出的额外位数。*/
static ALWAYS_INLINE void x264_cabac_size_decision( x264_cabac_t *cb, long i_ctx, long b )
{ //编码size 决策,带副作用,,state和已经编码的BIts被更新
int i_state = cb->state[i_ctx];
cb->state[i_ctx] = s264_cabac_transition[i_state][b];
cb->f8_bits_encoded += s264_cabac_entropy[i_state^b];
}
static ALWAYS_INLINE int x264_cabac_size_decision2( uint8_t *state, long b )
{//编码size 决策,带副作用,,state不更新和已经编码的BIts不更新
int i_state = *state;
*state = x264_cabac_transition[i_state][b];
return x264_cabac_entropy[i_state^b];
}
static ALWAYS_INLINE void x264_cabac_size_decision_noup( x264_cabac_t *cb, long i_ctx, long b )
{//编码size 决策,带副作用,更细编码BIts, 但是不输出cost bits,也不更新state
int i_state = cb->state[i_ctx];
cb->f8_bits_encoded += x264_cabac_entropy[i_state^b];
}
static ALWAYS_INLINE int x264_cabac_size_decision_noup2( uint8_t *state, long b )
{//编码size 决策,不带副作用,
return x264_cabac_entropy[*state^b];
}