检查I帧

//检查是否是I帧
int  checkIsIFrame(struct media_cipher *handle,  EExtMediaType type, unsigned char *ptr, unsigned int frame_len, int *width, int *height)
{
	int find_idr = -1, ret;
	if(type == XXX_EXT_H264)
	{
			TVideoInfo  tH264Info;
			memset(&tH264Info, 0, sizeof(TVideoInfo));
			find_idr = tH264Info.l32IsIFrame;
	}
	else if(type == XXX_EXT_H265)
	{
			TVideoInfo  tH265Info;
			memset(&tH265Info, 0, sizeof(TVideoInfo));
			find_idr = tH265Info.l32IsIFrame;
	}
	else if(type == XXX_EXT_SVAC)
	{
			TVideoInfo  tSVACInfo;
			memset(&tSVACInfo, 0, sizeof(TVideoInfo));
			find_idr = tSVACInfo.l32IsIFrame;
	}
			

TVideoInfo结构体:
struct
{
int l32IsIFrame; //是否是I帧;
int l32Width; //图像宽度;
int l32Height; //图像高度;
int l32FrameNum; //帧号;
}

//获取H264码流信息
static int GetH264Info(char *pu8Stream,  unsigned int u32BsLen, TVideoInfo   *ptH264Info)
{
	 int  l32Ret = 0;
	 char *pu8H264Stream;
	
	if( NULL == pu8Stream)
	{
			return -1;
	}
	if( u32BsLen == 0)
	{
			return -1;
	}
	pu8H264Stream  =  (char *)malloc(u32BsLen + 3);
	//
	memcpy(pu8H264Stream, pu8Stream,  u32BsLen+3);
	ptH264Info->l32IsFrame = 0;
	
	//解码VOL头信息
	l32Ret = H264DecBsHeader(pu8H264Stream,   u32BsLen,  ptH264Info);
	
	//
	return   l32Ret;
}
// 初始化熵解码码流  --下文用到
static void BitstreamBufInit(TBiststreamBuf *ptBsBuf,  char * pu8BsBuffer,  s32  l32BsLen)
{
	ptBuf->pu8Buffer = pu8BsBuffer;
	ptBuf->l32BufferLen = l32BsLen;
	ptBuf->pu8SliceStart = pu8BsBuffer;
}
//实现读取一定数量Bits;    
//输入熵解码结构指针、读取的bit数目;
//输出bit所表示的数值;
static unsigned int BitstreamShowBits(TBitstream *ptBs, int l32NBits)
{
		int  l32NewBit = (l32NBits + ptBs->l32Pos) - 32;
		int l32Val;
		if(l32NewBit > 0)
		{
			l32Val = ((ptBs->u32BufA & (0xffffffff >> ptBs->l32Pos)) << l32NewBit) | (ptBs->u32BufB >> (32 - l32NewBit));
		}
		else
		{
			l32Val = (ptBs->u32BufA & (0xffffffff >> ptBs->l32Pos)) >> (32 - ptBs->l32Pos - l32NBits);
		}
		return l32Val;
}
// 读取一定数量Bits  --下文用到
static unsigned int BitstreamGetBits( TBitstream *ptBs,  int l32NBits)
{
	unsgined int u32Tmp;
	u32Tmp = BitStreamShowBits(ptBs, l32NBits);
	BitstreamSkip(ptBs, l32NBits);
	return u32Tmp;
}
//熵解码一帧
static int H264DecBsHeader(char* pu8BsBuffer,  int l32BsLen,  TVideoInfo *ptH264Info)
{
	int l32RetCode = 1;
	int l32NalType, l32BsSrcLen;
	char *pu8Src, *pu8BsSrc;
	char  u8SPSFlag = FALSE, u8PPSFlag = FALSE;
	short s16FirstMBNum = 0;
	int l32Val = 0;
	char u8MaxFrameNum = 0;
	TBitstreamBuff  tBsBuf;
	TBitstream  tBs;
	
	While(((*pu8Src) == 0) && (pu8Src < (pu8BsBuffer + l32BsLen)))
	{
		pu8Src ++;
	}
	if(((*pu8Src) == 0x01) && (pu8Src  - pu8BsBuffer) > 1))
	{
		pu8BsSrc = pu8Src - 2;
		l32BsSrcLen = l32BsLen - (pu8BsSrc - pu8BsBuffer);	
		BitstreamBufInit(&tBsBuf,  pu8BsSrc,  l32BsSrcLen);
	}
	else
	{
		return -1;
	}

	while(tBsBuf.pu8SliceStart < pu8BsSrc + l32BsSrclen)
	{
		BitsreamDecodeNal(&tBs, &tBsBuf);
		l32NalType = BitstreamGetBits(&tBs, 8);
	
		switch(l32NalType & 31)
		{
				case  NAL_IDRSLICE:
						ptH264Info->l32IsIFrame = 1;
						ptH264info->l32FrameNum = 0;
						break;
				case ...
       }
    }
		
	
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值