xref: /rockchip-linux_mpp/mpp/hal/rkdec/h264d/hal_h264d_vdpu_com.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1 /*
2  * Copyright 2015 Rockchip Electronics Co. LTD
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define MODEUL_TAG "hal_h264d_vdpu_com"
18 
19 #include <string.h>
20 
21 #include "mpp_common.h"
22 #include "hal_h264d_vdpu_com.h"
23 
24 const RK_U32 vdpu_cabac_table[VDPU_CABAC_TAB_SIZE / 4] = {
25     0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07330000,
26     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
27     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
28     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
29     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
30     0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948, 0x0d29033e, 0x000b0137,
31     0x0045ef7f, 0xf3660052, 0xf94aeb6b, 0xe57fe17f, 0xe87fee5f, 0xe57feb72,
32     0xe27fef7b, 0xf473f07a, 0xf573f43f, 0xfe44f154, 0xf368fd46, 0xf85df65a,
33     0xe27fff4a, 0xfa61f95b, 0xec7ffc38, 0xfb52f94c, 0xea7df95d, 0xf557fd4d,
34     0xfb47fc3f, 0xfc44f454, 0xf93ef941, 0x083d0538, 0xfe420140, 0x003dfe4e,
35     0x01320734, 0x0a23002c, 0x0b26012d, 0x002e052c, 0x1f110133, 0x07321c13,
36     0x10210e3e, 0xf36cf164, 0xf365f35b, 0xf45ef658, 0xf054f656, 0xf953f357,
37     0xed5e0146, 0x0048fb4a, 0x123bf866, 0xf164005f, 0xfc4b0248, 0xf54bfd47,
38     0x0f2ef345, 0x003e0041, 0x1525f148, 0x09391036, 0x003e0c48, 0x18000f09,
39     0x08190d12, 0x0f090d13, 0x0a250c12, 0x061d1421, 0x0f1e042d, 0x013a003e,
40     0x073d0c26, 0x0b2d0f27, 0x0b2a0d2c, 0x102d0c29, 0x0a311e22, 0x122a0a37,
41     0x1133112e, 0x00591aed, 0x16ef1aef, 0x1ee71cec, 0x21e925e5, 0x21e928e4,
42     0x26ef21f5, 0x28f129fa, 0x26012911, 0x1efa1b03, 0x1a1625f0, 0x23fc26f8,
43     0x26fd2503, 0x26052a00, 0x23102716, 0x0e301b25, 0x153c0c44, 0x0261fd47,
44     0xfa2afb32, 0xfd36fe3e, 0x003a013f, 0xfe48ff4a, 0xf75bfb43, 0xfb1bfd27,
45     0xfe2c002e, 0xf040f844, 0xf64efa4d, 0xf656f45c, 0xf137f63c, 0xfa3efc41,
46     0xf449f84c, 0xf950f758, 0xef6ef561, 0xec54f54f, 0xfa49fc4a, 0xf356f360,
47     0xf561ed75, 0xf84efb21, 0xfc30fe35, 0xfd3ef347, 0xf64ff456, 0xf35af261,
48     0x0000fa5d, 0xfa54f84f, 0x0042ff47, 0x003efe3c, 0xfe3bfb4b, 0xfd3efc3a,
49     0xf742ff4f, 0x00470344, 0x0a2cf93e, 0x0f240e28, 0x101b0c1d, 0x012c1424,
50     0x1220052a, 0x01300a3e, 0x112e0940, 0xf468f561, 0xf060f958, 0xf855f955,
51     0xf755f358, 0x0442fd4d, 0xfd4cfa4c, 0x0a3aff4c, 0xff53f963, 0xf25f025f,
52     0x004cfb4a, 0x0046f54b, 0x01440041, 0xf249033e, 0x043eff44, 0xf34b0b37,
53     0x05400c46, 0x0f060613, 0x07100c0e, 0x120d0d0b, 0x0d0f0f10, 0x0c170d17,
54     0x0f140e1a, 0x0e2c1128, 0x112f1811, 0x15151916, 0x1f1b161d, 0x13230e32,
55     0x0a39073f, 0xfe4dfc52, 0xfd5e0945, 0xf46d24dd, 0x24de20e6, 0x25e22ce0,
56     0x22ee22f1, 0x28f121f9, 0x23fb2100, 0x2602210d, 0x17230d3a, 0x1dfd1a00,
57     0x161e1ff9, 0x23f122fd, 0x220324ff, 0x2205200b, 0x2305220c, 0x270b1e1d,
58     0x221a1d27, 0x13421f15, 0x1f1f1932, 0xef78ec70, 0xee72f555, 0xf15cf259,
59     0xe647f151, 0xf2500044, 0xf246e838, 0xe944e832, 0xf54a17f3, 0x1af328f1,
60     0x31f22c03, 0x2d062c22, 0x21361352, 0xfd4bff17, 0x0122012b, 0x0036fe37,
61     0x003d0140, 0x0044f75c, 0xf26af361, 0xf15af45a, 0xee58f649, 0xf74ff256,
62     0xf649f646, 0xf645fb42, 0xf740fb3a, 0x023b15f6, 0x18f51cf8, 0x1cff1d03,
63     0x1d092314, 0x1d240e43, 0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968,
64     0xfa35ff36, 0x07331721, 0x17021500, 0x01090031, 0xdb760539, 0xf34ef541,
65     0x013e0c31, 0xfc491132, 0x1240092b, 0x1d001a43, 0x105a0968, 0xd27fec68,
66     0x0143f34e, 0xf541013e, 0xfa56ef5f, 0xfa3d092d, 0xfd45fa51, 0xf5600637,
67     0x0743fb56, 0x0258003a, 0xfd4cf65e, 0x05360445, 0xfd510058, 0xf943fb4a,
68     0xfc4afb50, 0xf948013a, 0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948,
69     0x0d29033e, 0x002dfc4e, 0xfd60e57e, 0xe462e765, 0xe943e452, 0xec5ef053,
70     0xea6eeb5b, 0xee66f35d, 0xe37ff95c, 0xfb59f960, 0xf36cfd2e, 0xff41ff39,
71     0xf75dfd4a, 0xf75cf857, 0xe97e0536, 0x063c063b, 0x0645ff30, 0x0044fc45,
72     0xf858fe55, 0xfa4eff4b, 0xf94d0236, 0x0532fd44, 0x0132062a, 0xfc51013f,
73     0xfc460043, 0x0239fe4c, 0x0b230440, 0x013d0b23, 0x12190c18, 0x0d1d0d24,
74     0xf65df949, 0xfe490d2e, 0x0931f964, 0x09350235, 0x0535fe3d, 0x00380038,
75     0xf33ffb3c, 0xff3e0439, 0xfa450439, 0x0e270433, 0x0d440340, 0x013d093f,
76     0x07321027, 0x052c0434, 0x0b30fb3c, 0xff3b003b, 0x1621052c, 0x0e2bff4e,
77     0x003c0945, 0x0b1c0228, 0x032c0031, 0x002e022c, 0x0233002f, 0x0427023e,
78     0x062e0036, 0x0336023a, 0x043f0633, 0x06390735, 0x06340637, 0x0b2d0e24,
79     0x0835ff52, 0x0737fd4e, 0x0f2e161f, 0xff541907, 0x1ef91c03, 0x1c042000,
80     0x22ff1e06, 0x1e062009, 0x1f131a1b, 0x1a1e2514, 0x1c221146, 0x0143053b,
81     0x0943101e, 0x12201223, 0x161d181f, 0x1726122b, 0x14290b3f, 0x093b0940,
82     0xff5efe59, 0xf76cfa4c, 0xfe2c002d, 0x0034fd40, 0xfe3bfc46, 0xfc4bf852,
83     0xef66f74d, 0x0318002a, 0x00300037, 0xfa3bf947, 0xf453f557, 0xe277013a,
84     0xfd1dff24, 0x0126022b, 0xfa37003a, 0x0040fd4a, 0xf65a0046, 0xfc1d051f,
85     0x072a013b, 0xfe3afd48, 0xfd51f561, 0x003a0805, 0x0a0e0e12, 0x0d1b0228,
86     0x003afd46, 0xfa4ff855, 0x0000f36a, 0xf06af657, 0xeb72ee6e, 0xf262ea6e,
87     0xeb6aee67, 0xeb6be96c, 0xe670f660, 0xf45ffb5b, 0xf75dea5e, 0xfb560943,
88     0xfc50f655, 0xff46073c, 0x093a053d, 0x0c320f32, 0x12311136, 0x0a29072e,
89     0xff330731, 0x08340929, 0x062f0237, 0x0d290a2c, 0x06320535, 0x0d31043f,
90     0x0640fe45, 0xfe3b0646, 0x0a2c091f, 0x0c2b0335, 0x0e220a26, 0xfd340d28,
91     0x1120072c, 0x07260d32, 0x0a391a2b, 0x0e0b0b0e, 0x090b120b, 0x150917fe,
92     0x20f120f1, 0x22eb27e9, 0x2adf29e1, 0x2ee426f4, 0x151d2de8, 0x35d330e6,
93     0x41d52bed, 0x27f61e09, 0x121a141b, 0x0039f252, 0xfb4bed61, 0xdd7d1b00,
94     0x1c001ffc, 0x1b062208, 0x1e0a1816, 0x21131620, 0x1a1f1529, 0x1a2c172f,
95     0x10410e47, 0x083c063f, 0x11411518, 0x17141a17, 0x1b201c17, 0x1c181728,
96     0x18201c1d, 0x172a1339, 0x1635163d, 0x0b560c28, 0x0b330e3b, 0xfc4ff947,
97     0xfb45f746, 0xf842f644, 0xed49f445, 0xf046f143, 0xec3eed46, 0xf042ea41,
98     0xec3f09fe, 0x1af721f7, 0x27f929fe, 0x2d033109, 0x2d1b243b, 0xfa42f923,
99     0xf92af82d, 0xfb30f438, 0xfa3cfb3e, 0xf842f84c, 0xfb55fa51, 0xf64df951,
100     0xef50ee49, 0xfc4af653, 0xf747f743, 0xff3df842, 0xf242003b, 0x023b15f3,
101     0x21f227f9, 0x2efe3302, 0x3c063d11, 0x37222a3e, 0x14f10236, 0x034a14f1,
102     0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07331619, 0x22001000, 0xfe090429,
103     0xe3760241, 0xfa47f34f, 0x05340932, 0xfd460a36, 0x1a221316, 0x28003902,
104     0x29241a45, 0xd37ff165, 0xfc4cfa47, 0xf34f0534, 0x0645f35a, 0x0034082b,
105     0xfe45fb52, 0xf660023b, 0x024bfd57, 0xfd640138, 0xfd4afa55, 0x003bfd51,
106     0xf956fb5f, 0xff42ff4d, 0x0146fe56, 0xfb48003d, 0x0029003f, 0x003f003f,
107     0xf7530456, 0x0061f948, 0x0d29033e, 0x0d0f0733, 0x0250d97f, 0xee5bef60,
108     0xe651dd62, 0xe866e961, 0xe577e863, 0xeb6eee66, 0xdc7f0050, 0xfb59f95e,
109     0xfc5c0027, 0x0041f154, 0xdd7ffe49, 0xf468f75b, 0xe17f0337, 0x07380737,
110     0x083dfd35, 0x0044f94a, 0xf758f367, 0xf35bf759, 0xf25cf84c, 0xf457e96e,
111     0xe869f64e, 0xec70ef63, 0xb27fba7f, 0xce7fd27f, 0xfc42fb4e, 0xfc47f848,
112     0x023bff37, 0xf946fa4b, 0xf859de77, 0xfd4b2014, 0x1e16d47f, 0x0036fb3d,
113     0x003aff3c, 0xfd3df843, 0xe754f24a, 0xfb410534, 0x0239003d, 0xf745f546,
114     0x1237fc47, 0x003a073d, 0x09291219, 0x0920052b, 0x092f002c, 0x0033022e,
115     0x1326fc42, 0x0f260c2a, 0x09220059, 0x042d0a1c, 0x0a1f21f5, 0x34d5120f,
116     0x1c0023ea, 0x26e72200, 0x27ee20f4, 0x66a20000, 0x38f121fc, 0x1d0a25fb,
117     0x33e327f7, 0x34de45c6, 0x43c12cfb, 0x200737e3, 0x20010000, 0x1b2421e7,
118     0x22e224e4, 0x26e426e5, 0x22ee23f0, 0x22f220f8, 0x25fa2300, 0x1e0a1c12,
119     0x1a191d29, 0x004b0248, 0x084d0e23, 0x121f1123, 0x151e112d, 0x142a122d,
120     0x1b1a1036, 0x07421038, 0x0b490a43, 0xf674e970, 0xf147f93d, 0x0035fb42,
121     0xf54df750, 0xf754f657, 0xde7feb65, 0xfd27fb35, 0xf93df54b, 0xf14def5b,
122     0xe76be76f, 0xe47af54c, 0xf62cf634, 0xf639f73a, 0xf048f945, 0xfc45fb4a,
123     0xf7560242, 0xf7220120, 0x0b1f0534, 0xfe37fe43, 0x0049f859, 0x03340704,
124     0x0a081108, 0x10130325, 0xff3dfb49, 0xff46fc4e, 0x0000eb7e, 0xe97cec6e,
125     0xe67ee77c, 0xef69e579, 0xe575ef66, 0xe675e574, 0xdf7af65f, 0xf264f85f,
126     0xef6fe472, 0xfa59fe50, 0xfc52f755, 0xf851ff48, 0x05400143, 0x09380045,
127     0x01450745, 0xf945fa43, 0xf04dfe40, 0x023dfa43, 0xfd400239, 0xfd41fd42,
128     0x003e0933, 0xff42fe47, 0xfe4bff46, 0xf7480e3c, 0x1025002f, 0x12230b25,
129     0x0c290a29, 0x02300c29, 0x0d29003b, 0x03321328, 0x03421232, 0x13fa12fa,
130     0x0e001af4, 0x1ff021e7, 0x21ea25e4, 0x27e22ae2, 0x2fd62ddc, 0x31de29ef,
131     0x200945b9, 0x3fc142c0, 0x4db636d9, 0x34dd29f6, 0x240028ff, 0x1e0e1c1a,
132     0x17250c37, 0x0b4125df, 0x27dc28db, 0x26e22edf, 0x2ae228e8, 0x31e326f4,
133     0x28f626fd, 0x2efb1f14, 0x1d1e192c, 0x0c300b31, 0x1a2d1616, 0x17161b15,
134     0x21141a1c, 0x1e181b22, 0x122a1927, 0x12320c46, 0x15360e47, 0x0b531920,
135     0x15311536, 0xfb55fa51, 0xf64df951, 0xef50ee49, 0xfc4af653, 0xf747f743,
136     0xff3df842, 0xf242003b, 0x023b11f6, 0x20f32af7, 0x31fb3500, 0x4003440a,
137     0x421b2f39, 0xfb470018, 0xff24fe2a, 0xfe34f739, 0xfa3ffc41, 0xfc43f952,
138     0xfd51fd4c, 0xf948fa4e, 0xf448f244, 0xfd46fa4c, 0xfb42fb3e, 0x0039fc3d,
139     0xf73c0136, 0x023a11f6, 0x20f32af7, 0x31fb3500, 0x4003440a, 0x421b2f39,
140     0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07331d10,
141     0x19000e00, 0xf633fd3e, 0xe5631a10, 0xfc55e866, 0x05390639, 0xef490e39,
142     0x1428140a, 0x1d003600, 0x252a0c61, 0xe07fea75, 0xfe4afc55, 0xe8660539,
143     0xfa5df258, 0xfa2c0437, 0xf559f167, 0xeb741339, 0x143a0454, 0x0660013f,
144     0xfb55f36a, 0x053f064b, 0xfd5aff65, 0x0337fc4f, 0xfe4bf461, 0xf932013c,
145     0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948, 0x0d29033e, 0x0722f758,
146     0xec7fdc7f, 0xef5bf25f, 0xe754e756, 0xf459ef5b, 0xe17ff24c, 0xee67f35a,
147     0xdb7f0b50, 0x054c0254, 0x054efa37, 0x043df253, 0xdb7ffb4f, 0xf568f55b,
148     0xe27f0041, 0xfe4f0048, 0xfc5cfa38, 0x0344f847, 0xf362fc56, 0xf458fb52,
149     0xfd48fc43, 0xf848f059, 0xf745ff3b, 0x05420439, 0xfc47fe47, 0x023aff4a,
150     0xfc2cff45, 0x003ef933, 0xfc2ffa2a, 0xfd29fa35, 0x084cf74e, 0xf5530934,
151     0x0043fb5a, 0x0143f148, 0xfb4bf850, 0xeb53eb40, 0xf31fe740, 0xe35e094b,
152     0x113ff84a, 0xfb23fe1b, 0x0d5b0341, 0xf945084d, 0xf642033e, 0xfd44ec51,
153     0x001e0107, 0xfd17eb4a, 0x1042e97c, 0x11252cee, 0x32deea7f, 0x0427002a,
154     0x07220b1d, 0x081f0625, 0x072a0328, 0x08210d2b, 0x0d24042f, 0x0337023a,
155     0x063c082c, 0x0b2c0e2a, 0x07300438, 0x04340d25, 0x0931133a, 0x0a300c2d,
156     0x00451421, 0x083f23ee, 0x21e71cfd, 0x180a1b00, 0x22f234d4, 0x27e81311,
157     0x1f19241d, 0x1821220f, 0x1e141649, 0x1422131f, 0x1b2c1310, 0x0f240f24,
158     0x151c1915, 0x1e141f0c, 0x1b10182a, 0x005d0e38, 0x0f391a26, 0xe87fe873,
159     0xea52f73e, 0x0035003b, 0xf255f359, 0xf35ef55c, 0xe37feb64, 0xf239f443,
160     0xf547f64d, 0xeb55f058, 0xe968f162, 0xdb7ff652, 0xf830f83d, 0xf842f946,
161     0xf24bf64f, 0xf753f45c, 0xee6cfc4f, 0xea45f04b, 0xfe3a013a, 0xf34ef753,
162     0xfc51f363, 0xf351fa26, 0xf33efa3a, 0xfe3bf049, 0xf64cf356, 0xf753f657,
163     0x0000ea7f, 0xe77fe778, 0xe57fed72, 0xe975e776, 0xe675e871, 0xe476e178,
164     0xdb7cf65e, 0xf166f663, 0xf36ace7f, 0xfb5c1139, 0xfb56f35e, 0xf45bfe4d,
165     0x0047ff49, 0x0440f951, 0x05400f39, 0x01430044, 0xf6430144, 0x004d0240,
166     0x0044fb4e, 0x0737053b, 0x02410e36, 0x0f2c053c, 0x0246fe4c, 0xee560c46,
167     0x0540f446, 0x0b370538, 0x00450241, 0xfa4a0536, 0x0736fa4c, 0xf552fe4d,
168     0xfe4d192a, 0x11f310f7, 0x11f41beb, 0x25e229d8, 0x2ad730d1, 0x27e02ed8,
169     0x34cd2ed7, 0x34d92bed, 0x200b3dc9, 0x38d23ece, 0x51bd2dec, 0x23fe1c0f,
170     0x22012701, 0x1e111426, 0x122d0f36, 0x004f24f0, 0x25f225ef, 0x2001220f,
171     0x1d0f1819, 0x22161f10, 0x23121f1c, 0x2129241c, 0x1b2f153e, 0x121f131a,
172     0x24181817, 0x1b10181e, 0x1f1d1629, 0x162a103c, 0x0f340e3c, 0x034ef07b,
173     0x15351638, 0x193d1521, 0x1332113d, 0xfd4ef84a, 0xf748f648, 0xee4bf447,
174     0xf53ffb46, 0xef4bf248, 0xf043f835, 0xf23bf734, 0xf54409fe, 0x1ef61ffc,
175     0x21ff2107, 0x1f0c2517, 0x1f261440, 0xf747f925, 0xf82cf531, 0xf638f43b,
176     0xf83ff743, 0xfa44f64f, 0xfd4ef84a, 0xf748f648, 0xee4bf447, 0xf53ffb46,
177     0xef4bf248, 0xf043f835, 0xf23bf734, 0xf54409fe, 0x1ef61ffc, 0x21ff2107,
178     0x1f0c2517, 0x1f261440,
179 };
180 
181 const RK_U32 vdpu_value_list[34] = {
182     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
183     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33
184 };
185 
vdpu_ver_align(RK_U32 val)186 RK_U32 vdpu_ver_align(RK_U32 val)
187 {
188     return MPP_ALIGN(val, 16);
189 }
190 
vdpu_hor_align(RK_U32 val)191 RK_U32 vdpu_hor_align(RK_U32 val)
192 {
193     return MPP_ALIGN(val, 16);
194 }
195 
get_info_input(H264dVdpuPriv_t * priv,DXVA_Slice_H264_Long * p_long,DXVA_PicParams_H264_MVC * pp)196 static MPP_RET get_info_input(H264dVdpuPriv_t *priv,
197                               DXVA_Slice_H264_Long *p_long,
198                               DXVA_PicParams_H264_MVC  *pp)
199 {
200     MPP_RET ret = MPP_ERR_UNKNOW;
201 
202     memset(priv->new_dpb, 0, sizeof(priv->new_dpb));
203     memset(priv->refinfo, 0, sizeof(priv->refinfo));
204     //!< change dpb_info syntax
205     {
206         RK_U32 i = 0;
207         for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefFrameList); i++) {
208             if (pp->RefFrameList[i].bPicEntry != 0xff) {
209                 priv->new_dpb[i].valid        = 1;
210                 priv->new_dpb[i].is_long_term = pp->RefFrameList[i].AssociatedFlag;
211                 priv->new_dpb[i].slot_index   = pp->RefFrameList[i].Index7Bits;
212                 priv->new_dpb[i].top_poc      = pp->FieldOrderCntList[i][0];
213                 priv->new_dpb[i].bot_poc      = pp->FieldOrderCntList[i][1];
214                 if (priv->new_dpb[i].is_long_term) {
215                     priv->new_dpb[i].long_term_frame_idx = pp->FrameNumList[i];
216                 } else {
217                     priv->new_dpb[i].frame_num = pp->FrameNumList[i];
218                 }
219                 priv->new_dpb[i].long_term_pic_num = pp->LongTermPicNumList[i];
220                 priv->new_dpb[i].top_used = ((pp->UsedForReferenceFlags
221                                               >> (2 * i + 0)) & 0x1) ? 1 : 0;
222                 priv->new_dpb[i].bot_used = ((pp->UsedForReferenceFlags
223                                               >> (2 * i + 1)) & 0x1) ? 1 : 0;
224                 priv->new_dpb[i].colmv_is_used = ((pp->RefPicColmvUsedFlags >> i) & 0x1) ? 1 : 0;
225                 priv->new_dpb[i].field_flag = ((pp->RefPicFiledFlags >> i) & 0x1) ? 1 : 0;
226                 priv->new_dpb[i].is_ilt_flag = ((pp->UsedForInTerviewflags >> i) & 0x1) ? 1 : 0;
227             }
228         }
229         for (i = 0; i < MPP_ARRAY_ELEMS(pp->ViewIDList); i++) {
230             priv->new_dpb[i].view_id = pp->ViewIDList[i];
231         }
232 
233         for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefPicLayerIdList); i++) {
234             priv->new_dpb[i].voidx = pp->RefPicLayerIdList[i];
235         }
236     }
237     //!< change ref_pic_info syntax
238     {
239         RK_U32 i = 0, j = 0;
240         //!< list P B0 B1
241         for (j = 0; j < 3; j++) {
242             for (i = 0; i < MPP_ARRAY_ELEMS(p_long->RefPicList[j]); i++) {
243                 if (p_long->RefPicList[j][i].bPicEntry != 0xff) {
244                     priv->refinfo[j][i].valid = 1;
245                     priv->refinfo[j][i].dpb_idx = p_long->RefPicList[j][i].Index7Bits;
246                     priv->refinfo[j][i].bottom_flag = p_long->RefPicList[j][i].AssociatedFlag;
247                 }
248             }
249         }
250     }
251     return ret = MPP_OK;
252 }
253 
fill_picture_entry(DXVA_PicEntry_H264 * pic,RK_U32 index,RK_U32 flag)254 static MPP_RET fill_picture_entry(DXVA_PicEntry_H264 *pic, RK_U32 index,
255                                   RK_U32 flag)
256 {
257     ASSERT((index & 0x7f) == index && (flag & 0x01) == flag);
258     pic->bPicEntry = index | (flag << 7);
259 
260     return MPP_OK;
261 }
262 
refill_info_input(H264dVdpuPriv_t * priv,DXVA_Slice_H264_Long * p_long,DXVA_PicParams_H264_MVC * pp)263 static MPP_RET refill_info_input(H264dVdpuPriv_t *priv,
264                                  DXVA_Slice_H264_Long *p_long,
265                                  DXVA_PicParams_H264_MVC  *pp)
266 
267 {
268     MPP_RET ret = MPP_ERR_UNKNOW;
269     {
270         RK_U32 i = 0;
271         H264dVdpuDpbInfo_t *old_dpb = priv->old_dpb[priv->layed_id];
272         //!< re-fill dpb_info
273         pp->UsedForReferenceFlags = 0;
274         pp->RefPicColmvUsedFlags = 0;
275         pp->RefPicFiledFlags = 0;
276         pp->UsedForInTerviewflags = 0;
277         for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefFrameList); i++) {
278             if (old_dpb[i].valid) {
279                 fill_picture_entry(&pp->RefFrameList[i], old_dpb[i].slot_index,
280                                    old_dpb[i].is_long_term);
281                 pp->FieldOrderCntList[i][0] = old_dpb[i].top_poc;
282                 pp->FieldOrderCntList[i][1] = old_dpb[i].bot_poc;
283                 pp->FrameNumList[i] = old_dpb[i].is_long_term ?
284                                       old_dpb[i].long_term_frame_idx : old_dpb[i].frame_num;
285                 pp->LongTermPicNumList[i] = old_dpb[i].long_term_pic_num;
286                 if (old_dpb[i].top_used) { //!< top_field
287                     pp->UsedForReferenceFlags |= 1 << (2 * i + 0);
288                 }
289                 if (old_dpb[i].bot_used) { //!< bot_field
290                     pp->UsedForReferenceFlags |= 1 << (2 * i + 1);
291                 }
292                 if (old_dpb[i].colmv_is_used) {
293                     pp->RefPicColmvUsedFlags |= 1 << i;
294                 }
295                 if (old_dpb[i].field_flag) {
296                     pp->RefPicFiledFlags |= 1 << i;
297                 }
298                 if (old_dpb[i].is_ilt_flag) {
299                     pp->UsedForInTerviewflags |= 1 << i;
300                 }
301             } else {
302                 pp->RefFrameList[i].bPicEntry = 0xff;
303                 pp->FieldOrderCntList[i][0] = 0;
304                 pp->FieldOrderCntList[i][1] = 0;
305                 pp->FrameNumList[i] = 0;
306                 pp->LongTermPicNumList[i] = 0;
307             }
308         }
309         for (i = 0; i < MPP_ARRAY_ELEMS(pp->ViewIDList); i++) {
310             pp->ViewIDList[i] = old_dpb[i].view_id;
311         }
312 
313         for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefPicLayerIdList); i++) {
314             pp->RefPicLayerIdList[i] = old_dpb[i].voidx;
315         }
316     }
317     //!< re-fill ref_info
318     {
319         RK_U32 i = 0, j = 0;
320         for (j = 0; j < 3; j++) {
321             H264dVdpuRefPicInfo_t *p = priv->refinfo[j];
322             for (i = 0; i < MPP_ARRAY_ELEMS(p_long->RefPicList[j]); i++) {
323                 if (p[i].valid) {
324                     fill_picture_entry(&p_long->RefPicList[j][i],
325                                        p[i].dpb_idx, p[i].bottom_flag);
326                 } else {
327                     p_long->RefPicList[j][i].bPicEntry = 0xff;
328                 }
329             }
330         }
331     }
332     return ret = MPP_OK;
333 }
334 
adjust_input(H264dVdpuPriv_t * priv,DXVA_Slice_H264_Long * p_long,DXVA_PicParams_H264_MVC * pp)335 MPP_RET adjust_input(H264dVdpuPriv_t *priv,
336                      DXVA_Slice_H264_Long *p_long,
337                      DXVA_PicParams_H264_MVC  *pp)
338 {
339     MPP_RET ret = MPP_ERR_UNKNOW;
340 
341     get_info_input(priv, p_long, pp);
342     //!< dpb mapping to new order
343     {
344         RK_U32 i = 0, j = 0;
345         RK_U32 find_flag = 0;
346         H264dVdpuDpbInfo_t *new_dpb = priv->new_dpb;
347         H264dVdpuDpbInfo_t *old_dpb = priv->old_dpb[priv->layed_id];
348 
349 #if DEBUG_REF_LIST
350         {
351             mpp_log("=== frame_num %d ===\n", pp->frame_num);
352             for (i = 0; i < MPP_ARRAY_ELEMS(priv->old_dpb[priv->layed_id]); i++) {
353                 mpp_log("old_dpb[%d] frame_num=%d field=%d poc0=%d poc1=%d\n",
354                         i, old_dpb[i].frame_num, old_dpb[i].field_flag, old_dpb[i].top_poc, old_dpb[i].bot_poc);
355             }
356             for (i = 0; i < MPP_ARRAY_ELEMS(priv->old_dpb[priv->layed_id]); i++) {
357                 mpp_log("new_dpb[%d] frame_num=%d field=%d poc0=%d poc1=%d\n",
358                         i, new_dpb[i].frame_num, new_dpb[i].field_flag, new_dpb[i].top_poc, new_dpb[i].bot_poc);
359             }
360         }
361 #endif
362         //!< delete old dpb
363         for (i = 0; i < MPP_ARRAY_ELEMS(priv->old_dpb[priv->layed_id]); i++) {
364             find_flag = 0;
365             if (old_dpb[i].valid) {
366                 for (j = 0; j < MPP_ARRAY_ELEMS(priv->new_dpb); j++) {
367                     if (new_dpb[j].valid) {
368                         find_flag =
369                             ((old_dpb[i].frame_num == new_dpb[j].frame_num)
370                              ? 1 : 0);
371                         find_flag = ((old_dpb[i].slot_index
372                                       == new_dpb[j].slot_index)
373                                      ? find_flag : 0);
374                         if (new_dpb[j].top_used && old_dpb[i].top_used) {
375                             find_flag =
376                                 ((old_dpb[i].top_poc == new_dpb[j].top_poc)
377                                  ? find_flag : 0);
378                         }
379                         if (new_dpb[j].bot_used && old_dpb[i].bot_used) {
380                             find_flag  =
381                                 ((old_dpb[i].bot_poc == new_dpb[j].bot_poc)
382                                  ? find_flag : 0);
383                         }
384                         if (find_flag) { //!< found
385                             new_dpb[j].have_same = 1;
386                             new_dpb[j].new_dpb_idx = i;
387                             old_dpb[i] = new_dpb[j];
388                             break;
389                         }
390                     }
391                 }
392             }
393             //!< not found
394             if (find_flag == 0) {
395                 memset(&old_dpb[i], 0, sizeof(old_dpb[i]));
396             }
397         }
398         //!< add new dpb
399         for (j = 0; j < MPP_ARRAY_ELEMS(priv->new_dpb); j++) {
400             if ((new_dpb[j].valid == 0) || new_dpb[j].have_same) {
401                 continue;
402             }
403             for (i = 0; i < MPP_ARRAY_ELEMS(priv->old_dpb[priv->layed_id]); i++) {
404                 if (old_dpb[i].valid == 0) {
405                     old_dpb[i] = new_dpb[j];
406                     new_dpb[j].new_dpb_idx = i;
407                     break;
408                 }
409             }
410         }
411         //!< inter-layer reference
412         priv->ilt_dpb = NULL;
413         if (priv->layed_id) {
414             for (i = 0; i < MPP_ARRAY_ELEMS(priv->old_dpb[1]); i++) {
415                 if ((old_dpb[i].valid == 0) && old_dpb[i].is_ilt_flag) {
416                     priv->ilt_dpb = &old_dpb[i];
417                     break;
418                 }
419             }
420         }
421     }
422     //!< addjust ref_dpb
423     {
424         RK_U32 i = 0, j = 0;
425         H264dVdpuDpbInfo_t *new_dpb = priv->new_dpb;
426 
427         for (j = 0; j < 3; j++) {
428             H264dVdpuRefPicInfo_t *p = priv->refinfo[j];
429             for (i = 0; i < MPP_ARRAY_ELEMS(priv->refinfo[j]); i++) {
430                 if (p[i].valid) {
431                     p[i].dpb_idx = new_dpb[p[i].dpb_idx].new_dpb_idx;
432                 }
433             }
434         }
435     }
436     refill_info_input(priv, p_long, pp);
437 
438     return ret = MPP_OK;
439 }
440 
compare_p(const void * a,const void * b)441 RK_S32 compare_p(const void *a, const void *b)
442 {
443     RK_S32 val = 0;
444     H264dRefsList_t *p0 = (H264dRefsList_t *)a;
445     H264dRefsList_t *p1 = (H264dRefsList_t *)b;
446 
447     if (!p0->ref_flag)
448         return 1;
449     if (!p1->ref_flag)
450         return -1;
451 
452     if (p0->lt_flag && p1->lt_flag) { // inc
453         val = (p0->ref_picnum > p1->ref_picnum) ? 1 : -1;
454     } else if (!p0->lt_flag && p1->lt_flag) { // dec
455         val = -1;
456     } else if (p0->lt_flag && !p1->lt_flag) { // inc
457         val = 1;
458     } else if (!p0->lt_flag && !p1->lt_flag) { // dec
459         val = (p0->ref_picnum < p1->ref_picnum) ? 1 : -1;
460     }
461 
462     return val;
463 }
464 
compare_b0(const void * a,const void * b)465 RK_S32 compare_b0(const void *a, const void *b)
466 {
467     RK_S32 val = 0;
468     H264dRefsList_t *p0 = (H264dRefsList_t *)a;
469     H264dRefsList_t *p1 = (H264dRefsList_t *)b;
470 
471     if (!p0->ref_flag)
472         return 1;
473     if (!p1->ref_flag)
474         return -1;
475 
476     if (p0->lt_flag && p1->lt_flag) { // inc
477         val = (p0->ref_picnum > p1->ref_picnum) ? 1 : -1;
478     } else if (!p0->lt_flag && p1->lt_flag) { // dec
479         val = 1;
480     } else if (p0->lt_flag && !p1->lt_flag) { // inc
481         val = -1;
482     } else if (!p0->lt_flag && !p1->lt_flag) {
483         if (MPP_MAX(p0->ref_poc, p1->ref_poc) < p0->cur_poc) { // dec
484             val = (p0->ref_poc < p1->ref_poc) ? 1 : -1;
485         } else if (MPP_MIN(p0->ref_poc, p1->ref_poc) > p0->cur_poc) { // inc
486             val = (p0->ref_poc > p1->ref_poc) ? 1 : -1;
487         } else {
488             val = (p0->ref_poc > p1->ref_poc) ? 1 : -1; // inc
489         }
490     }
491 
492     return val;
493 }
494 
compare_b1(const void * a,const void * b)495 RK_S32 compare_b1(const void *a, const void *b)
496 {
497     RK_S32 val = 0;
498     H264dRefsList_t *p0 = (H264dRefsList_t *)a;
499     H264dRefsList_t *p1 = (H264dRefsList_t *)b;
500 
501     if (!p0->ref_flag)
502         return 1;
503     if (!p1->ref_flag)
504         return -1;
505 
506     if (p0->lt_flag && p1->lt_flag) { // inc
507         val = (p0->ref_picnum > p1->ref_picnum) ? 1 : -1;
508     } else if (!p0->lt_flag && p1->lt_flag) {
509         val = -1;
510     } else if (p0->lt_flag && !p1->lt_flag) {
511         val = 1;
512     } else if (!p0->lt_flag && !p1->lt_flag) {
513         if (MPP_MIN(p0->ref_poc, p1->ref_poc) > p0->cur_poc) { // inc
514             val = (p0->ref_poc > p1->ref_poc) ? 1 : -1;
515         } else if (MPP_MAX(p0->ref_poc, p1->ref_poc) < p0->cur_poc) { // dec
516             val = (p0->ref_poc < p1->ref_poc) ? 1 : -1;
517         } else {
518             val = (p0->ref_poc < p1->ref_poc) ? 1 : -1; // dec
519         }
520     }
521 
522     return val;
523 }
524