1 /*
2 * Copyright (c) 2017-2021, 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     codec_def_common_vp9.h
24 //! \brief    Defines decode VP9 types and macros shared by CodecHal, MHW, and DDI layer
25 //! \details  Applies to VP9 codec  only. Should not contain any DDI specific code.
26 //!
27 #ifndef __CODEC_DEF_COMMON_VP9_H__
28 #define __CODEC_DEF_COMMON_VP9_H__
29 
30 #include "mos_os.h"
31 
32 #define CODEC_VP9_SUPER_BLOCK_WIDTH          64
33 #define CODEC_VP9_SUPER_BLOCK_HEIGHT         64
34 #define CODEC_VP9_MIN_BLOCK_WIDTH            8
35 #define CODEC_VP9_MIN_BLOCK_HEIGHT           8
36 
37 #define CODEC_VP9_BLOCK_TYPES                 2 //Outside dimension.  0 = Y with DC, 1 = UV
38 #define CODEC_VP9_REF_TYPES                   2 // intra=0, inter=1
39 #define CODEC_VP9_COEF_BANDS                  6 //Middle dimension reflects the coefficient position within the transform.
40 #define CODEC_VP9_UNCONSTRAINED_NODES         3
41 /* Inside dimension is measure of nearby complexity, that reflects the energy
42 of nearby coefficients are nonzero.  For the first coefficient (DC, unless
43 block type is 0), we look at the (already encoded) blocks above and to the
44 left of the current block.  The context index is then the number (0,1,or 2)
45 of these blocks having nonzero coefficients.
46 After decoding a coefficient, the measure is determined by the size of the
47 most recently decoded coefficient.
48 Note that the intuitive meaning of this measure changes as coefficients
49 are decoded, e.g., prior to the first token, a zero means that my neighbors
50 are empty while, after the first token, because of the use of end-of-block,
51 a zero means we just decoded a zero and hence guarantees that a non-zero
52 coefficient will appear later in this block.  However, this shift
53 in meaning is perfectly OK because our context depends also on the
54 coefficient band (and since zigzag positions 0, 1, and 2 are in
55 distinct bands). */
56 #define CODEC_VP9_PREV_COEF_CONTEXTS          6
57 #define CODEC_VP9_MBSKIP_CONTEXTS             3
58 #define CODEC_VP9_INTER_MODE_CONTEXTS         7
59 #define CODEC_VP9_INTER_MODES                 4 //NEAREST_MV, NEAR_MV, ZERO_MV, NEW_MV
60 #define CODEC_VP9_SWITCHABLE_FILTERS          3   // number of switchable filters
61 #define CODEC_VP9_INTRA_INTER_CONTEXTS        4
62 #define CODEC_VP9_COMP_INTER_CONTEXTS         5
63 #define CODEC_VP9_REF_CONTEXTS                5
64 #define CODEC_VP9_BLOCK_SIZE_GROUPS           4
65 #define CODEC_VP9_INTRA_MODES                 10 //DC_PRED,V_PRED,H_PRED,D45_PRED,D135_PRED,D117_PRED,D153_PRED,D207_PRED,D63_PRED,TM_PRED
66 #define CODEC_VP9_PARTITION_PLOFFSET          4  // number of probability models per block size
67 #define CODECHAL_VP9_PARTITION_CONTEXTS          (4 * CODEC_VP9_PARTITION_PLOFFSET)
68 #define CODEC_VP9_MV_JOINTS                   4
69 #define CODEC_VP9_MV_CLASSES                  11
70 #define CODEC_VP9_CLASS0_BITS                 1  /* bits at integer precision for class 0 */
71 #define CODECHAL_VP9_CLASS0_SIZE                 (1 << CODEC_VP9_CLASS0_BITS)
72 #define CODECHAL_VP9_MV_OFFSET_BITS              (CODEC_VP9_MV_CLASSES + CODEC_VP9_CLASS0_BITS - 2)
73 #define CODEC_VP9_MV_FP_SIZE                  4
74 #define CODEC_VP9_NUM_REF_FRAMES_LOG2         3
75 #define CODEC_VP9_NUM_REF_FRAMES              (1 << CODEC_VP9_NUM_REF_FRAMES_LOG2)
76 #define CODECHAL_VP9_NUM_DPB_BUFFERS             (CODEC_VP9_NUM_REF_FRAMES + 4)
77 #define CODEC_VP9_NUM_CONTEXTS                4
78 #define CODEC_VP9_MAX_REF_LF_DELTAS           4
79 #define CODEC_VP9_MAX_MODE_LF_DELTAS          2
80 #define CODECHAL_VP9_SEG_TREE_PROBS              (CODEC_VP9_MAX_SEGMENTS - 1)
81 #define CODEC_VP9_PREDICTION_PROBS            3
82 #define CODEC_VP9_MAX_LOOP_FILTER             63
83 
84 #define CODEC_VP9_MAX_QP                      255
85 #define CODEC_VP9_QINDEX_RANGE                (CODEC_VP9_MAX_QP + 1)
86 #define CODEC_VP9_MAX_REPAK_THRESHOLD         40342
87 
88 //VP9 Profile
89 typedef enum {
90     CODEC_PROFILE_VP9_PROFILE0 = 0,
91     CODEC_PROFILE_VP9_PROFILE1 = 1,
92     CODEC_PROFILE_VP9_PROFILE2 = 2,
93     CODEC_PROFILE_VP9_PROFILE3 = 3
94 }CODEC_VP9_PROFILE_IDC;
95 
96 typedef enum {
97     CODEC_VP9_KEY_FRAME = 0,
98     CODEC_VP9_INTER_FRAME = 1,
99     CODEC_VP9_FRAME_TYPES,
100 } CODEC_VP9_FRAME_TYPE;
101 
102 // block transform size
103 typedef enum {
104     CODEC_VP9_TX_4X4 = 0,                      // 4x4 transform
105     CODEC_VP9_TX_8X8 = 1,                      // 8x8 transform
106     CODEC_VP9_TX_16X16 = 2,                    // 16x16 transform
107     CODEC_VP9_TX_32X32 = 3,                    // 32x32 transform
108     CODEC_VP9_TX_SELECTABLE = 4,               // selectable transform
109     CODEC_VP9_TX_SIZES = 4,
110 } CODEC_VP9_TX_SIZE;
111 
112 typedef enum CODEC_VP9_PARTITION_TYPE {
113     CODEC_VP9_PARTITION_NONE,
114     CODEC_VP9_PARTITION_HORZ,
115     CODEC_VP9_PARTITION_VERT,
116     CODEC_VP9_PARTITION_SPLIT,
117     CODEC_VP9_PARTITION_TYPES,
118     CODECHAL_VP9_PARTITION_INVALID = CODEC_VP9_PARTITION_TYPES
119 } CODEC_VP9_PARTITION_TYPE;
120 
121 typedef uint8_t CODEC_VP9_COEFF_PROBS_MODEL[CODEC_VP9_REF_TYPES][CODEC_VP9_COEF_BANDS]
122     [CODEC_VP9_PREV_COEF_CONTEXTS]
123     [CODEC_VP9_UNCONSTRAINED_NODES];
124 
125 static const uint16_t CODECHAL_VP9_QUANT_DC[CODEC_VP9_QINDEX_RANGE] = {
126       4,       8,    8,    9,   10,   11,   12,   12,
127       13,     14,   15,   16,   17,   18,   19,   19,
128       20,     21,   22,   23,   24,   25,   26,   26,
129       27,     28,   29,   30,   31,   32,   32,   33,
130       34,     35,   36,   37,   38,   38,   39,   40,
131       41,     42,   43,   43,   44,   45,   46,   47,
132       48,     48,   49,   50,   51,   52,   53,   53,
133       54,     55,   56,   57,   57,   58,   59,   60,
134       61,     62,   62,   63,   64,   65,   66,   66,
135       67,     68,   69,   70,   70,   71,   72,   73,
136       74,     74,   75,   76,   77,   78,   78,   79,
137       80,     81,   81,   82,   83,   84,   85,   85,
138       87,     88,   90,   92,   93,   95,   96,   98,
139       99,    101,  102,  104,  105,  107,  108,  110,
140       111,   113,  114,  116,  117,  118,  120,  121,
141       123,   125,  127,  129,  131,  134,  136,  138,
142       140,   142,  144,  146,  148,  150,  152,  154,
143       156,   158,  161,  164,  166,  169,  172,  174,
144       177,   180,  182,  185,  187,  190,  192,  195,
145       199,   202,  205,  208,  211,  214,  217,  220,
146       223,   226,  230,  233,  237,  240,  243,  247,
147       250,   253,  257,  261,  265,  269,  272,  276,
148       280,   284,  288,  292,  296,  300,  304,  309,
149       313,   317,  322,  326,  330,  335,  340,  344,
150       349,   354,  359,  364,  369,  374,  379,  384,
151       389,   395,  400,  406,  411,  417,  423,  429,
152       435,   441,  447,  454,  461,  467,  475,  482,
153       489,   497,  505,  513,  522,  530,  539,  549,
154       559,   569,  579,  590,  602,  614,  626,  640,
155       654,   668,  684,  700,  717,  736,  755,  775,
156       796,   819,  843,  869,  896,  925,  955,  988,
157       1022, 1058, 1098, 1139, 1184, 1232, 1282, 1336,
158 };
159 
160 static const uint16_t CODECHAL_VP9_QUANT_AC[CODEC_VP9_QINDEX_RANGE] = {
161       4,       8,    9,   10,   11,   12,   13,   14,
162       15,     16,   17,   18,   19,   20,   21,   22,
163       23,     24,   25,   26,   27,   28,   29,   30,
164       31,     32,   33,   34,   35,   36,   37,   38,
165       39,     40,   41,   42,   43,   44,   45,   46,
166       47,     48,   49,   50,   51,   52,   53,   54,
167       55,     56,   57,   58,   59,   60,   61,   62,
168       63,     64,   65,   66,   67,   68,   69,   70,
169       71,     72,   73,   74,   75,   76,   77,   78,
170       79,     80,   81,   82,   83,   84,   85,   86,
171       87,     88,   89,   90,   91,   92,   93,   94,
172       95,     96,   97,   98,   99,  100,  101,  102,
173       104,   106,  108,  110,  112,  114,  116,  118,
174       120,   122,  124,  126,  128,  130,  132,  134,
175       136,   138,  140,  142,  144,  146,  148,  150,
176       152,   155,  158,  161,  164,  167,  170,  173,
177       176,   179,  182,  185,  188,  191,  194,  197,
178       200,   203,  207,  211,  215,  219,  223,  227,
179       231,   235,  239,  243,  247,  251,  255,  260,
180       265,   270,  275,  280,  285,  290,  295,  300,
181       305,   311,  317,  323,  329,  335,  341,  347,
182       353,   359,  366,  373,  380,  387,  394,  401,
183       408,   416,  424,  432,  440,  448,  456,  465,
184       474,   483,  492,  501,  510,  520,  530,  540,
185       550,   560,  571,  582,  593,  604,  615,  627,
186       639,   651,  663,  676,  689,  702,  715,  729,
187       743,   757,  771,  786,  801,  816,  832,  848,
188       864,   881,  898,  915,  933,  951,  969,  988,
189       1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151,
190       1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343,
191       1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567,
192       1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828,
193 };
194 
195 static const uint16_t CODECHAL_VP9_QUANT_DC_10[CODEC_VP9_QINDEX_RANGE] = {
196       4,    9,    10,   13,   15,   17,   20,   22,
197       25,   28,   31,   34,   37,   40,   43,   47,
198       50,   53,   57,   60,   64,   68,   71,   75,
199       78,   82,   86,   90,   93,   97,   101,  105,
200       109,  113,  116,  120,  124,  128,  132,  136,
201       140,  143,  147,  151,  155,  159,  163,  166,
202       170,  174,  178,  182,  185,  189,  193,  197,
203       200,  204,  208,  212,  215,  219,  223,  226,
204       230,  233,  237,  241,  244,  248,  251,  255,
205       259,  262,  266,  269,  273,  276,  280,  283,
206       287,  290,  293,  297,  300,  304,  307,  310,
207       314,  317,  321,  324,  327,  331,  334,  337,
208       343,  350,  356,  362,  369,  375,  381,  387,
209       394,  400,  406,  412,  418,  424,  430,  436,
210       442,  448,  454,  460,  466,  472,  478,  484,
211       490,  499,  507,  516,  525,  533,  542,  550,
212       559,  567,  576,  584,  592,  601,  609,  617,
213       625,  634,  644,  655,  666,  676,  687,  698,
214       708,  718,  729,  739,  749,  759,  770,  782,
215       795,  807,  819,  831,  844,  856,  868,  880,
216       891,  906,  920,  933,  947,  961,  975,  988,
217       1001, 1015, 1030, 1045, 1061, 1076, 1090, 1105,
218       1120, 1137, 1153, 1170, 1186, 1202, 1218, 1236,
219       1253, 1271, 1288, 1306, 1323, 1342, 1361, 1379,
220       1398, 1416, 1436, 1456, 1476, 1496, 1516, 1537,
221       1559, 1580, 1601, 1624, 1647, 1670, 1692, 1717,
222       1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929,
223       1958, 1990, 2021, 2054, 2088, 2123, 2159, 2197,
224       2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561,
225       2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102,
226       3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953,
227       4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347,
228 };
229 
230 static const uint16_t CODECHAL_VP9_QUANT_AC_10[CODEC_VP9_QINDEX_RANGE] = {
231       4,    9,    11,   13,   16,   18,   21,   24,
232       27,   30,   33,   37,   40,   44,   48,   51,
233       55,   59,   63,   67,   71,   75,   79,   83,
234       88,   92,   96,   100,  105,  109,  114,  118,
235       122,  127,  131,  136,  140,  145,  149,  154,
236       158,  163,  168,  172,  177,  181,  186,  190,
237       195,  199,  204,  208,  213,  217,  222,  226,
238       231,  235,  240,  244,  249,  253,  258,  262,
239       267,  271,  275,  280,  284,  289,  293,  297,
240       302,  306,  311,  315,  319,  324,  328,  332,
241       337,  341,  345,  349,  354,  358,  362,  367,
242       371,  375,  379,  384,  388,  392,  396,  401,
243       409,  417,  425,  433,  441,  449,  458,  466,
244       474,  482,  490,  498,  506,  514,  523,  531,
245       539,  547,  555,  563,  571,  579,  588,  596,
246       604,  616,  628,  640,  652,  664,  676,  688,
247       700,  713,  725,  737,  749,  761,  773,  785,
248       797,  809,  825,  841,  857,  873,  889,  905,
249       922,  938,  954,  970,  986,  1002, 1018, 1038,
250       1058, 1078, 1098, 1118, 1138, 1158, 1178, 1198,
251       1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386,
252       1411, 1435, 1463, 1491, 1519, 1547, 1575, 1603,
253       1631, 1663, 1695, 1727, 1759, 1791, 1823, 1859,
254       1895, 1931, 1967, 2003, 2039, 2079, 2119, 2159,
255       2199, 2239, 2283, 2327, 2371, 2415, 2459, 2507,
256       2555, 2603, 2651, 2703, 2755, 2807, 2859, 2915,
257       2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391,
258       3455, 3523, 3591, 3659, 3731, 3803, 3876, 3952,
259       4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604,
260       4692, 4784, 4876, 4972, 5068, 5168, 5268, 5372,
261       5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268,
262       6388, 6512, 6640, 6768, 6900, 7036, 7172, 7312,
263 };
264 
265 typedef struct _CODEC_VP9_SEG_PARAMS
266 {
267     union
268     {
269         struct
270         {
271             uint16_t      SegmentReferenceEnabled         : 1;        // [0..1]
272             uint16_t      SegmentReference                : 2;        // [0..3]
273             uint16_t      SegmentReferenceSkipped         : 1;        // [0..1]
274             uint16_t      ReservedField3                  : 12;       // [0]
275         } fields;
276         uint32_t            value;
277     } SegmentFlags;
278 
279     uint8_t               FilterLevel[4][2];                          // [0..63]
280     uint16_t              LumaACQuantScale;                           //
281     uint16_t              LumaDCQuantScale;                           //
282     uint16_t              ChromaACQuantScale;                         //
283     uint16_t              ChromaDCQuantScale;                         //
284 } CODEC_VP9_SEG_PARAMS, *PCODEC_VP9_SEG_PARAMS;
285 
286 #endif
287 
288