【H264解析Demo】11、帧内预测编码_2_获得参考的像素值

基础知识请参考:
十五、帧内编码:3、获取预测数据

知识储备

保存邻块像素值到数组中,数组的存放顺序如下图:(绿色为当前待解析的4 * 4宏块)
在这里插入图片描述

定义

//<预测编码><6>表示44=16个子宏块 * (44=16)每个子宏块中的4*4个像素 (先是列坐标)

UINT8 m_reconstructed_block[4][4][4][4];

代码实现

//<预测编码><5>获得参考像素:neighbors相邻宏块,当前宏块index,refPixBuf参考像素的值
int CMacroblock::get_reference_pixels(NeighborBlocks neighbors, UINT8 blkIdx, UINT8 *refPixBuf)
{
	bool available_left = neighbors.flags & 1, available_top = neighbors.flags & 2, available_top_right = neighbors.flags & 4, available_top_left = neighbors.flags & 8;
	UINT8 blk_row = -1, blk_column = -1;
	CMacroblock *ref_mb = NULL;

	block_index_to_position(blkIdx, blk_row, blk_column);	//<预测编码><6>根据index获得在当前宏块中的位置

	if (available_left)
	{
		ref_mb = m_slice->Get_macroblock_at_index(neighbors.left.target_mb_idx);
		refPixBuf[0] = ref_mb->m_reconstructed_block[neighbors.left.block_column][neighbors.left.block_row][3][3];
		refPixBuf[1] = ref_mb->m_reconstructed_block[neighbors.left.block_column][neighbors.left.block_row][2][3];
		refPixBuf[2] = ref_mb->m_reconstructed_block[neighbors.left.block_column][neighbors.left.block_row][1][3];
		refPixBuf[3] = ref_mb->m_reconstructed_block[neighbors.left.block_column][neighbors.left.block_row][0][3];
	} 
	else
	{
		refPixBuf[0] = refPixBuf[1] = refPixBuf[2] = refPixBuf[3] = 128;
	}

	if (available_top_left)
	{
		ref_mb = m_slice->Get_macroblock_at_index(neighbors.top_left.target_mb_idx);
		refPixBuf[4] = ref_mb->m_reconstructed_block[neighbors.top_left.block_column][neighbors.top_left.block_row][3][3];
	} 
	else
	{
		refPixBuf[4] = 128;
	}

	if (available_top)
	{
		ref_mb = m_slice->Get_macroblock_at_index(neighbors.top.target_mb_idx);
		refPixBuf[5] = ref_mb->m_reconstructed_block[neighbors.top.block_column][neighbors.top.block_row][3][0];
		refPixBuf[6] = ref_mb->m_reconstructed_block[neighbors.top.block_column][neighbors.top.block_row][3][1];
		refPixBuf[7] = ref_mb->m_reconstructed_block[neighbors.top.block_column][neighbors.top.block_row][3][2];
		refPixBuf[8] = ref_mb->m_reconstructed_block[neighbors.top.block_column][neighbors.top.block_row][3][3];
	} 
	else
	{
		refPixBuf[5] = refPixBuf[6] = refPixBuf[7] = refPixBuf[8] = 128;
	}

	if (available_top_right)
	{
		ref_mb = m_slice->Get_macroblock_at_index(neighbors.top_right.target_mb_idx);
		refPixBuf[9] = ref_mb->m_reconstructed_block[neighbors.top_right.block_column][neighbors.top_right.block_row][3][0];
		refPixBuf[10] = ref_mb->m_reconstructed_block[neighbors.top_right.block_column][neighbors.top_right.block_row][3][1];
		refPixBuf[11] = ref_mb->m_reconstructed_block[neighbors.top_right.block_column][neighbors.top_right.block_row][3][2];
		refPixBuf[12] = ref_mb->m_reconstructed_block[neighbors.top_right.block_column][neighbors.top_right.block_row][3][3];
	} 
	else
	{
		refPixBuf[9] = refPixBuf[10] = refPixBuf[11] = refPixBuf[12] = refPixBuf[8];		//<预测编码><6>如果右上是不可获取的,则将其像素值写为 refPixBuf[8],标准文档定义
	}

	return kPARSING_ERROR_NO_ERROR;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值