H265ParseSPS.h 2.09 KB
#pragma once
#include <string.h>
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
typedef unsigned long long  uint64;
typedef signed char int8;
typedef signed short int16;
typedef signed long int32;
typedef signed long long int64;
struct vc_params_t
{
	signed long width, height;
	unsigned long profile, level;
	unsigned long nal_length_size;
	void clear()
	{
		memset(this, 0, sizeof(*this));
	}
};

class NALBitstream
{
public:NALBitstream() : m_data(NULL), m_len(0), m_idx(0), m_bits(0), m_byte(0), m_zeros(0) {}; 
 NALBitstream(void * data, int len) { Init(data, len); }; 
 void Init(void * data, int len) { m_data = (signed char*)data; m_len = len; m_idx = 0; m_bits = 0; m_byte = 0; m_zeros = 0; };
 signed char GetBYTE() 
 {
		if (m_idx >= m_len)
			return 0; 
		signed char b = m_data[m_idx++];
		if ( b == 0 ) {
			m_zeros++;
			if ( (m_idx < m_len) && (m_zeros == 2) && (m_data[m_idx] == 0x03) ) {
				m_idx++; m_zeros = 0;
			}
		}
		else {
			m_zeros = 0;
		}
		return b; 
 };
 uint32 GetBit()
{
	if (m_bits == 0)
	{
		m_byte = GetBYTE(); m_bits = 8;
	}m_bits--; return (m_byte >> m_bits) & 0x1;
};
uint32 GetWord(int bits)
{
	uint32 u = 0; while (bits > 0)
	{
		u <<= 1; u |= GetBit(); bits--;
	}return u;
};

uint32 GetUE()
{
	// Exp-Golomb entropy coding: leading zeros, then a one, then
	// the data bits. The number of leading zeros is the number of
	// data bits, counting up from that number of 1s as the base.
	// That is, if you see
	//      0001010
	// You have three leading zeros, so there are three data bits (010)
	// counting up from a base of 111: thus 111 + 010 = 1001 = 9
	int zeros = 0;
	while (m_idx < m_len && GetBit() == 0 ) 
		zeros++;
	return GetWord(zeros) + ((1 << zeros) - 1);
};
int32 GetSE()
{
	uint32 UE = GetUE();bool positive = UE & 1; int32 SE = (UE + 1) >> 1;if ( !positive ){SE = -SE;}return SE;
};
private:
	int8 * m_data;
	int m_len;
	int m_idx;
	int m_bits;
	int8 m_byte;
	int m_zeros;
};
bool  ParseSequenceParameterSet(int8* data, int size, vc_params_t& params);