#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef unsigned char u8;
typedef signed char i8;
typedef unsigned short u16;
typedef signed short i16;
typedef unsigned int u32;
typedef signed int i32;
#define MAX_CPB_CNT 32
typedef struct
{
u8 *pStrmBuffStart; /* pointer to start of stream buffer */
u8 *pStrmCurrPos; /* current read address in stream buffer */
u32 bitPosInWord; /* bit position in stream buffer byte */
u32 strmBuffSize; /* size of stream buffer (bytes) */
u32 strmBuffReadBits; /* number of bits read from stream buffer */
} strmData_t;
typedef struct
{
u32 cpbCnt;
u32 bitRateScale;
u32 cpbSizeScale;
u32 bitRateValue[MAX_CPB_CNT];
u32 cpbSizeValue[MAX_CPB_CNT];
u32 cbrFlag[MAX_CPB_CNT];
u32 initialCpbRemovalDelayLength;
u32 cpbRemovalDelayLength;
u32 dpbOutputDelayLength;
u32 timeOffsetLength;
} hrdParameters_t;
/* storage for VUI parameters */
typedef struct
{
u32 aspectRatioPresentFlag;
u32 aspectRatioIdc;
u32 sarWidth;
u32 sarHeight;
u32 overscanInfoPresentFlag;
u32 overscanAppropriateFlag;
u32 videoSignalTypePresentFlag;
u32 videoFormat;
u32 videoFullRangeFlag;
u32 colourDescriptionPresentFlag;
u32 colourPrimaries;
u32 transferCharacteristics;
u32 matrixCoefficients;
u32 chromaLocInfoPresentFlag;
u32 chromaSampleLocTypeTopField;
u32 chromaSampleLocTypeBottomField;
u32 timingInfoPresentFlag;
u32 numUnitsInTick;
u32 timeScale;
u32 fixedFrameRateFlag;
u32 nalHrdParametersPresentFlag;
hrdParameters_t nalHrdParameters;
u32 vclHrdParametersPresentFlag;
hrdParameters_t vclHrdParameters;
u32 lowDelayHrdFlag;
u32 picStructPresentFlag;
u32 bitstreamRestrictionFlag;
u32 motionVectorsOverPicBoundariesFlag;
u32 maxBytesPerPicDenom;
u32 maxBitsPerMbDenom;
u32 log2MaxMvLengthHorizontal;
u32 log2MaxMvLengthVertical;
u32 numReorderFrames;
u32 maxDecFrameBuffering;
}vuiParameters_t;
typedef struct
{
u32 profileIdc;
u32 levelIdc;
u32 seqParameterSetId;
u32 maxFrameNum;
u32 picOrderCntType;
u32 maxPicOrderCntLsb;
u32 deltaPicOrderAlwaysZeroFlag;
i32 offsetForNonRefPic;
i32 offsetForTopToBottomField;
u32 numRefFramesInPicOrderCntCycle;
i32 *offsetForRefFrame;
u32 numRefFrames;
u32 gapsInFrameNumValueAllowedFlag;
u32 picWidthInMbs;
u32 picHeightInMbs;
u32 frameCroppingFlag;
u32 frameCropLeftOffset;
u32 frameCropRightOffset;
u32 frameCropTopOffset;
u32 frameCropBottomOffset;
u32 vuiParametersPresentFlag;
vuiParameters_t *vuiParameters;
u32 maxDpbSize;
} seqParamSet_t;
#ifdef _ASSERT_USED
#define ASSERT(expr) assert(expr)
#else
#define ASSERT(expr)
#endif
#ifdef _DEBUG_PRINT
#define DEBUG(args) printf args
#else
#define DEBUG(args)
#endif
#ifdef _ERROR_PRINT
#define EPRINT(msg) fprintf(stderr,"ERROR: %s\n",msg)
#else
#define EPRINT(msg)
#endif
#define ALLOCATE(ptr, count, type) \
{ \
(ptr) = malloc((count) * sizeof(type)); \
}
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a,b) ((a<b)?a:b)
#define HANTRO_OK 0
#define HANTRO_NOK 1
#define HANTRO_TRUE (1)
#define HANTRO_FALSE (0)
#define END_OF_STREAM 0xFFFFFFFFU
#define BIG_CODE_NUM 0xFFFFFFFFU
#define MEMORY_ALLOCATION_ERROR 0xFFFF
#define MAX_NUM_SEQ_PARAM_SETS 32
#define MAX_NUM_REF_PICS 16
#define ASPECT_RATIO_EXTENDED_SAR 255
#define MAX_DPB_SIZE 16
#define MAX_BR 240000 /* for level 5.1 */
#define MAX_CPB 240000 /* for level 5.1 */
enum {INVALID_DPB_SIZE = 0x7FFFFFFF};
u32 h264bsdFlushBits(strmData_t *pStrmData, u32 numBits)
{
ASSERT(pStrmData);
ASSERT(pStrmData->pStrmBuffStart);
ASSERT(pStrmData->pStrmCurrPos);
ASSERT(pStrmData->bitPosInWord < 8);
ASSERT(pStrmData->bitPosInWord == (pStrmData->strmBuffReadBits & 0x7));
pStrmData->strmBuffReadBits += numBits;
pStrmData->bitPosInWord = pStrmData->strmBuffReadBits & 0x7;
if ( (pStrmData->strmBuffReadBits ) <= (8*pStrmData->strmBuffSize) )
{
pStrmData->pStrmCurrPos = pStrmData->pStrmBuffStart +
(pStrmData->strmBuffReadBits >> 3);
return(HANTRO_OK);
}
else
return(END_OF_STREAM);
}
u32 h264bsdShowBits32(strmData_t *pStrmData)
{
i32 bits, shift;
u32 out;
u8 *pStrm;
ASSERT(pStrmData);
ASSERT(pStrmData->pStrmCurrPos);
ASSERT(pStrmData->bitPosInWord < 8);
ASSERT(pStrmData->bitPosInWord ==
(pStrmData->strmBuffReadBits & 0x7));
pStrm = pStrmData->pStrmCurrPos;
/* number of bits left in the buffer */
bits = (i32)pStrmData->strmBuffSize*8 - (i32)pStrmData->strmBuffReadBits;
/* at least 32-bits in the buffer */
if (bits >= 32)
{
u32 bitPosInWord = pStrmData->bitPosInWord;
out = ((u32)pStrm[0] << 24) | ((u32)pStrm[1] << 16) |
((u32)pStrm[2] << 8) | ((u32)pStrm[3]);
if (bitPosInWord)
{
u32 byte = (u32)pStrm[4];
u32 tmp = (8-bitPosInWord);
out <<= bitPosInWord;
out |= byte>>tmp;
}
return (out);
}
/* at least one bit in the buffer */
else if (bits > 0)
{
shift = (i32)(24 + pStrmData->bitPosInWord);
out = (u32)(*pStrm++) << shift;
bits -= (i32)(8 - pStrmData->bitPosInWord);
while (bits > 0)
{
shift -= 8;
out |= (u32)(*pStrm++) << shift;
bits -= 8;
}
return (out);
}
else
return (0);
}
u32 h264bsdGetBits(strmData_t *pStrmData, u32 numBits)
{
u32 out;
ASSERT(pStrmData);
ASSERT(numBits < 32);
out = h264bsdShowBits32(pStrmData) >> (32 - numBits);
if (h264bsdFlushBits(pStrmData, numBits) == HANTRO_OK)
{
return(out);
}
else
{
return(END_OF_STREAM);
}
}
u32 h264bsdCountLeadingZeros(u32 value, u32 length)
{
/* Variables */
u32 zeros = 0;
u32 mask = 1 << (length - 1);
/* Code */
ASSERT(length <= 32);
while (mask && !(value & mask))
{
zeros++;
mask >>= 1;
}
return(zeros);
}
u32 h264bsdDecodeExpGolombUnsigned(strmData_t *pStrmData, u32 *codeNum)
{
/* Variables */
u32 bits, numZeros;
/* Code */
ASSERT(pStrmData);
ASSERT(codeNum);
bits = h264bsdShowBits32(pStrmData);
/* first bit is 1 -> code length 1 */
if (bits >= 0x80000000)
{
h264bsdFlushBits(pStrmData, 1);
*codeNum = 0;
return(HANTRO_OK);
}
/* second bit is 1 -> code length 3 */
else if (bits >= 0x40000000)
{
if (h264bsdFlushBits(pStrmData, 3) == END_OF_STREAM)
return(HANTRO_NOK);
*codeNum = 1 + ((bits >> 29) & 0x1);
return(HANTRO_OK);
}
/* third bit is 1 -> code length 5 */
else if (bits >= 0x20000000)
{
if (h264bsdFlushBits(pStrmData, 5) == END_OF_STREAM)
return(HANTRO_NOK);
*codeNum = 3 + ((bits >> 27) & 0x3);
return(HANTRO_OK);
}
/* fourth bit is 1 -> code length 7 */
else if (bits >= 0x10000000)
{
if (h264bsdFlushBits(pStrmData, 7) == END_OF_STREAM)
return(HANTRO_NOK);
*codeNum = 7 + ((bits >> 25) & 0x7);
return(HANTRO_OK);
}
/* other code lengths */
else
{
numZeros = 4 + h264bsdCountLeadingZeros(bits, 28);
/* all 32 bits are zero */
if (numZeros == 32)
{
*codeNum = 0;
h264bsdFlushBits(pStrmData,32);
bits = h264bsdGetBits(p
H264解析SPS获取分辨率,profile,level
1星 需积分: 18 154 浏览量
2013-07-16
08:54:21
上传
评论 1
收藏 12KB GZ 举报
yuanfen139re
- 粉丝: 11
- 资源: 4
最新资源
- WANGSHANGYINHANG-4.2.9.031406-android
- docker&docker-compose离线安装包(centos)
- 滑动窗口是一种流量控制技术,用于在数据传输过程中进行拥塞控制和流量调节4.txt
- Nacos如何支持服务发现和注册-基于词频统计的分析.txt
- :基于java打造的深度学习框架,帮助你快速搭建神经网络,实现模型推理与训练,引擎支持自动求导,多线程与GPU运算
- 第九次作业(XY图,XY图显示,三维曲面,数字波形图)
- 微信小程序实战案例:打造高效便捷的在线书店.zip
- 1.0.5win(1)(1).exe
- ESP8266 WiFi模块入门教程:从连接到配置.zip
- 词频统计:从基础到实践的应用指南.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈