H265ParseSPS.h
2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#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);