X264VideoDescription::X264VideoDescription(unsigned char* pNaluArray,unsigned len) throw() : _init_ok(false) { _extradata_offset = _extradata_len = 0; _extradata_ok = false; //没有异常抛出,不要给空指针 memset(&_profile,0,sizeof(_profile)); memset(&_basic_desc,0,sizeof(_basic_desc)); if (*(unsigned short*)pNaluArray == 0) { _parser = std::make_unique<H264AnnexBParser>(); _init_ok = _parser->InitFromStartCode(pNaluArray,len); if (_init_ok) _init_ok = ParseSPS(); if (_init_ok) { _extradata = std::unique_ptr<unsigned char>(new unsigned char[len / 4 * 4 + 8]); _extradata_offset = 0; _extradata_len = len; _extradata_ok = false; } } }
HRESULT CH264SequenceParser::ParseNALs(const BYTE *buffer, size_t buflen, int nal_size) { CH264Nalu nalu; nalu.SetBuffer(buffer, buflen, nal_size); while (nalu.ReadNext()) { const BYTE *data = nalu.GetDataBuffer() + 1; const size_t len = nalu.GetDataLength() - 1; if (nalu.GetType() == NALU_TYPE_SPS) { ParseSPS(data, len); break; } } return S_OK; }
HRESULT CHEVCSequenceParser::ParseNALs(const BYTE *buffer, size_t buflen, int nal_size) { CH265Nalu nalu; nalu.SetBuffer(buffer, buflen, nal_size); while (nalu.ReadNext()) { const BYTE *data = nalu.GetDataBuffer() + 2; const size_t len = nalu.GetDataLength() - 2; if (nalu.GetType() == HEVC_NAL_SPS) { CH264NALUnescape unescapedNAL(data, len); ParseSPS(unescapedNAL.GetBuffer(), unescapedNAL.GetSize()); break; } } return S_OK; }