Blame view

DxDecoder/H265ParseSPS.h 2.01 KB
85cc8cb9   Hu Chunming   ๅŽŸ็‰ˆไปฃ็ 
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);