天天看点

【H264解析Demo】2、分析NAL Unit内容1、解析NAL Unit类型2、EBSP提取SODB

本文是基于NAL Unit提取的基础上进行解析,提取EBSP中的SODB元素

【H264解析】1、提取一个Nal Unit单元

1、解析NAL Unit类型

int CStreamFile::Parse_h264_bitstream()
{
	int ret = 0;
	UINT8 nalType = 0;
	UINT32 sliceIdx = 0;
	do 
	{
		/* 提取NAL UNIT单元 */
		ret = find_nal_prefix();
		//解析NAL UNIT
		if (m_nalVec.size())
		{
			UINT8 nalType = m_nalVec[0] & 0x1F;	/* 获取每个NAL Unit类型 */
			Dump_NAL_type(nalType);
			ebsp_to_sodb();
		}
		
	} while (ret);
	return 0;
}
           

输出

【H264解析Demo】2、分析NAL Unit内容1、解析NAL Unit类型2、EBSP提取SODB

类型对应关系

  • 见H264标准文档表7-1
【H264解析Demo】2、分析NAL Unit内容1、解析NAL Unit类型2、EBSP提取SODB

2、EBSP提取SODB

/* 00 00 X X X 03查找03所在的位置,找打之后向前索引,是否为00 00 ,是则将03删除*/
void CStreamFile::ebsp_to_sodb()
{
	if (m_nalVec.size() < 3)
	{
		return;
	}

	/* C++	迭代器的使用 */
	for (vector<UINT8>::iterator itor = m_nalVec.begin() + 2; itor != m_nalVec.end(); )
	{
		if ((3 == *itor) && (0 == *(itor-1)) && (0 == *(itor-2)))
		{
			/* 一旦迭代器中的元素被删除,那么这个迭代器就失效了,
			 * 所以需要在删除之后定义一个临时的迭代器来保存删除之后的下一个元素
			 */
			vector<UINT8>::iterator temp = m_nalVec.erase(itor);
			itor = temp;
		}
		else
		{
			itor++;
		}
	}
}