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;
		}
	}
}
Example #2
0
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;
}