#pragma once #include 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);