x264cabac bits估算函数分析

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];
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值