1 /*
2 * Copyright (c) 2020, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     bitstream_writer.h
24 //! \brief    Defines the common interface for hevc packer
25 //!
26 
27 #ifndef __BITSTREAM_WRITER_H__
28 #define __BITSTREAM_WRITER_H__
29 
30 #include "media_class_trace.h"
31 #include <map>
32 
33 typedef unsigned char  mfxU8;
34 typedef char           mfxI8;
35 typedef short          mfxI16;
36 typedef unsigned short mfxU16;
37 typedef unsigned int   mfxU32;
38 typedef int            mfxI32;
39 typedef unsigned long mfxUL32;
40 typedef long          mfxL32;
41 typedef float  mfxF32;
42 typedef double mfxF64;
43 //typedef __UINT64            mfxU64;
44 //typedef __INT64             mfxI64;
45 typedef void * mfxHDL;
46 typedef mfxHDL mfxMemId;
47 typedef void * mfxThreadTask;
48 typedef char   mfxChar;
49 
50 constexpr mfxU8  MAX_DPB_SIZE               = 15;
51 constexpr mfxU8  HW_SURF_ALIGN_W            = 16;
52 constexpr mfxU8  HW_SURF_ALIGN_H            = 16;
53 constexpr mfxU16 MAX_SLICES                 = 600;  // conforms to level 6 limits
54 constexpr mfxU8  DEFAULT_LTR_INTERVAL       = 16;
55 constexpr mfxU8  DEFAULT_PPYR_INTERVAL      = 3;
56 constexpr mfxU16 GOP_INFINITE               = 0xFFFF;
57 constexpr mfxU8  MAX_NUM_TILE_COLUMNS       = 20;
58 constexpr mfxU8  MAX_NUM_TILE_ROWS          = 22;
59 constexpr mfxU8  MAX_NUM_LONG_TERM_PICS     = 8;
60 constexpr mfxU16 MIN_TILE_WIDTH_IN_SAMPLES  = 256;
61 constexpr mfxU16 MIN_TILE_HEIGHT_IN_SAMPLES = 64;
62 
63 const mfxU8 tab_cabacRangeTabLps[128][4] =
64 {
65     { 128, 176, 208, 240 }, { 128, 167, 197, 227 }, { 128, 158, 187, 216 }, { 123, 150, 178, 205 },
66     { 116, 142, 169, 195 }, { 111, 135, 160, 185 }, { 105, 128, 152, 175 }, { 100, 122, 144, 166 },
67     {  95, 116, 137, 158 }, {  90, 110, 130, 150 }, {  85, 104, 123, 142 }, {  81,  99, 117, 135 },
68     {  77,  94, 111, 128 }, {  73,  89, 105, 122 }, {  69,  85, 100, 116 }, {  66,  80,  95, 110 },
69     {  62,  76,  90, 104 }, {  59,  72,  86,  99 }, {  56,  69,  81,  94 }, {  53,  65,  77,  89 },
70     {  51,  62,  73,  85 }, {  48,  59,  69,  80 }, {  46,  56,  66,  76 }, {  43,  53,  63,  72 },
71     {  41,  50,  59,  69 }, {  39,  48,  56,  65 }, {  37,  45,  54,  62 }, {  35,  43,  51,  59 },
72     {  33,  41,  48,  56 }, {  32,  39,  46,  53 }, {  30,  37,  43,  50 }, {  29,  35,  41,  48 },
73     {  27,  33,  39,  45 }, {  26,  31,  37,  43 }, {  24,  30,  35,  41 }, {  23,  28,  33,  39 },
74     {  22,  27,  32,  37 }, {  21,  26,  30,  35 }, {  20,  24,  29,  33 }, {  19,  23,  27,  31 },
75     {  18,  22,  26,  30 }, {  17,  21,  25,  28 }, {  16,  20,  23,  27 }, {  15,  19,  22,  25 },
76     {  14,  18,  21,  24 }, {  14,  17,  20,  23 }, {  13,  16,  19,  22 }, {  12,  15,  18,  21 },
77     {  12,  14,  17,  20 }, {  11,  14,  16,  19 }, {  11,  13,  15,  18 }, {  10,  12,  15,  17 },
78     {  10,  12,  14,  16 }, {   9,  11,  13,  15 }, {   9,  11,  12,  14 }, {   8,  10,  12,  14 },
79     {   8,   9,  11,  13 }, {   7,   9,  11,  12 }, {   7,   9,  10,  12 }, {   7,   8,  10,  11 },
80     {   6,   8,   9,  11 }, {   6,   7,   9,  10 }, {   6,   7,   8,   9 }, {   2,   2,   2,   2 },
81     //The same for valMPS=1
82     { 128, 176, 208, 240 }, { 128, 167, 197, 227 }, { 128, 158, 187, 216 }, { 123, 150, 178, 205 },
83     { 116, 142, 169, 195 }, { 111, 135, 160, 185 }, { 105, 128, 152, 175 }, { 100, 122, 144, 166 },
84     {  95, 116, 137, 158 }, {  90, 110, 130, 150 }, {  85, 104, 123, 142 }, {  81,  99, 117, 135 },
85     {  77,  94, 111, 128 }, {  73,  89, 105, 122 }, {  69,  85, 100, 116 }, {  66,  80,  95, 110 },
86     {  62,  76,  90, 104 }, {  59,  72,  86,  99 }, {  56,  69,  81,  94 }, {  53,  65,  77,  89 },
87     {  51,  62,  73,  85 }, {  48,  59,  69,  80 }, {  46,  56,  66,  76 }, {  43,  53,  63,  72 },
88     {  41,  50,  59,  69 }, {  39,  48,  56,  65 }, {  37,  45,  54,  62 }, {  35,  43,  51,  59 },
89     {  33,  41,  48,  56 }, {  32,  39,  46,  53 }, {  30,  37,  43,  50 }, {  29,  35,  41,  48 },
90     {  27,  33,  39,  45 }, {  26,  31,  37,  43 }, {  24,  30,  35,  41 }, {  23,  28,  33,  39 },
91     {  22,  27,  32,  37 }, {  21,  26,  30,  35 }, {  20,  24,  29,  33 }, {  19,  23,  27,  31 },
92     {  18,  22,  26,  30 }, {  17,  21,  25,  28 }, {  16,  20,  23,  27 }, {  15,  19,  22,  25 },
93     {  14,  18,  21,  24 }, {  14,  17,  20,  23 }, {  13,  16,  19,  22 }, {  12,  15,  18,  21 },
94     {  12,  14,  17,  20 }, {  11,  14,  16,  19 }, {  11,  13,  15,  18 }, {  10,  12,  15,  17 },
95     {  10,  12,  14,  16 }, {   9,  11,  13,  15 }, {   9,  11,  12,  14 }, {   8,  10,  12,  14 },
96     {   8,   9,  11,  13 }, {   7,   9,  11,  12 }, {   7,   9,  10,  12 }, {   7,   8,  10,  11 },
97     {   6,   8,   9,  11 }, {   6,   7,   9,  10 }, {   6,   7,   8,   9 }, {   2,   2,   2,   2 }
98 };
99 
100 /* CABAC trans tables: state (MPS and LPS ) + valMPS in 6th bit */
101 const mfxU8 tab_cabacTransTbl[2][128] =
102 {
103     {
104           1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,
105          17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,
106          33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
107          49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  62,  63,
108           0,  64,  65,  66,  66,  68,  68,  69,  70,  71,  72,  73,  73,  75,  75,  76,
109          77,  77,  79,  79,  80,  80,  82,  82,  83,  83,  85,  85,  86,  86,  87,  88,
110          88,  89,  90,  90,  91,  91,  92,  93,  93,  94,  94,  94,  95,  96,  96,  97,
111          97,  97,  98,  98,  99,  99,  99, 100, 100, 100, 101, 101, 101, 102, 102, 127
112     },
113     {
114            0,   0,   1,   2,   2,   4,   4,   5,   6,   7,   8,   9,   9,  11,  11,  12,
115           13,  13,  15,  15,  16,  16,  18,  18,  19,  19,  21,  21,  22,  22,  23,  24,
116           24,  25,  26,  26,  27,  27,  28,  29,  29,  30,  30,  30,  31,  32,  32,  33,
117           33,  33,  34,  34,  35,  35,  35,  36,  36,  36,  37,  37,  37,  38,  38,  63,
118           65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,
119           81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,
120           97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
121          113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 126, 127
122     }
123 };
124 
125 class IBsWriter
126 {
127 public:
~IBsWriter()128     virtual ~IBsWriter() {}
129     virtual void PutBits(mfxU32 n, mfxU32 b) = 0;
130     virtual void PutBit(mfxU32 b)            = 0;
131     virtual void PutUE(mfxU32 b)             = 0;
132     virtual void PutSE(mfxI32 b)             = 0;
133 
134 MEDIA_CLASS_DEFINE_END(IBsWriter)
135 };
136 
137 class BitstreamWriter
138     : public IBsWriter
139 {
140 public:
141     BitstreamWriter(mfxU8 *bs, mfxU32 size, mfxU8 bitOffset = 0);
142     ~BitstreamWriter();
143 
144     virtual void PutBits(mfxU32 n, mfxU32 b) override;
145     void         PutBitsBuffer(mfxU32 n, void *b, mfxU32 offset = 0);
146     virtual void PutBit(mfxU32 b) override;
147     void         PutGolomb(mfxU32 b);
148     void         PutTrailingBits(bool bCheckAligned = false);
149 
PutUE(mfxU32 b)150     virtual void PutUE(mfxU32 b) override { PutGolomb(b); }
PutSE(mfxI32 b)151     virtual void PutSE(mfxI32 b) override { (b > 0) ? PutGolomb((b << 1) - 1) : PutGolomb((-b) << 1); }
152 
GetOffset()153     mfxU32 GetOffset()
154     {
155         return mfxU32(m_bs - m_bsStart) * 8 + m_bitOffset - m_bitStart;
156     }
GetStart()157     mfxU8 *GetStart() { return m_bsStart; }
GetEnd()158     mfxU8 *GetEnd() { return m_bsEnd; }
159 
160     void Reset(mfxU8 *bs = 0, mfxU32 size = 0, mfxU8 bitOffset = 0);
161     void cabacInit();
162     void EncodeBin(mfxU8 &ctx, mfxU8 binVal);
163     void EncodeBinEP(mfxU8 binVal);
164     void SliceFinish();
165     void PutBitC(mfxU32 B);
166 
AddInfo(mfxU32 key,mfxU32 value)167     void AddInfo(mfxU32 key, mfxU32 value)
168     {
169         if (m_pInfo)
170             m_pInfo[0][key] = value;
171     }
SetInfo(std::map<mfxU32,mfxU32> * pInfo)172     void SetInfo(std::map<mfxU32, mfxU32> *pInfo)
173     {
174         m_pInfo = pInfo;
175     }
176 
177 private:
178     void   RenormE();
179     mfxU8 *m_bsStart;
180     mfxU8 *m_bsEnd;
181     mfxU8 *m_bs;
182     mfxU8  m_bitStart;
183     mfxU8  m_bitOffset;
184 
185     mfxU32                    m_codILow;
186     mfxU32                    m_codIRange;
187     mfxU32                    m_bitsOutstanding;
188     mfxU32                    m_BinCountsInNALunits;
189     bool                      m_firstBitFlag;
190     std::map<mfxU32, mfxU32> *m_pInfo = nullptr;
191 
192 MEDIA_CLASS_DEFINE_END(BitstreamWriter)
193 };
194 
195 #endif
196