//检查是否是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 ...
}
}
}