1 /*
2 *
3 * Copyright 2015 Rockchip Electronics Co. LTD
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18
19 #define MODULE_TAG "hal_h264d_api"
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <dlfcn.h>
25 #include <unistd.h>
26
27 #include "mpp_mem.h"
28 #include "mpp_env.h"
29 #include "mpp_platform.h"
30 #include "mpp_common.h"
31 #include "osal_2str.h"
32
33 #include "dxva_syntax.h"
34 #include "h264d_syntax.h"
35
36 #include "hal_h264d_global.h"
37 #include "hal_h264d_api.h"
38
39 #include "hal_h264d_rkv_reg.h"
40 #include "hal_h264d_vdpu34x.h"
41 #include "hal_h264d_vdpu382.h"
42 #include "hal_h264d_vdpu383.h"
43 #include "hal_h264d_vdpu384a.h"
44 #include "hal_h264d_vdpu2.h"
45 #include "hal_h264d_vdpu1.h"
46
47 RK_U32 hal_h264d_debug = 0;
48
49 // merge with vdpu34x and rkv is necessary
50 const RK_U32 h264_cabac_table[928] = {
51 0x3602f114, 0xf1144a03, 0x4a033602, 0x68e97fe4, 0x36ff35fa, 0x21173307,
52 0x00150217, 0x31000901, 0x390576db, 0x41f54ef3, 0x310c3e01, 0x321149fc,
53 0x2b094012, 0x431a001d, 0x68095a10, 0x68ec7fd2, 0x4ef34301, 0x3e0141f5,
54 0x5fef56fa, 0x2d093dfa, 0x51fa45fd, 0x370660f5, 0x56fb4307, 0x3a005802,
55 0x5ef64cfd, 0x45043605, 0x580051fd, 0x4afb43f9, 0x50fb4afc, 0x3a0148f9,
56 0x3f002900, 0x3f003f00, 0x560453f7, 0x48f96100, 0x3e03290d, 0x4efc2d00,
57 0x7ee560fd, 0x65e762e4, 0x52e443e9, 0x53f05eec, 0x5beb6eea, 0x5df366ee,
58 0x5cf97fe3, 0x60f959fb, 0x2efd6cf3, 0x39ff41ff, 0x4afd5df7, 0x57f85cf7,
59 0x36057ee9, 0x3b063c06, 0x30ff4506, 0x45fc4400, 0x55fe58f8, 0x4bff4efa,
60 0x36024df9, 0x44fd3205, 0x2a063201, 0x3f0151fc, 0x430046fc, 0x4cfe3902,
61 0x4004230b, 0x230b3d01, 0x180c1912, 0x240d1d0d, 0x49f95df6, 0x2e0d49fe,
62 0x64f93109, 0x35023509, 0x3dfe3505, 0x38003800, 0x3cfb3ff3, 0x39043eff,
63 0x390445fa, 0x3304270e, 0x4003440d, 0x3f093d01, 0x27103207, 0x34042c05,
64 0x3cfb300b, 0x3b003bff, 0x2c052116, 0x4eff2b0e, 0x45093c00, 0x28021c0b,
65 0x31002c03, 0x2c022e00, 0x2f003302, 0x3e022704, 0x36002e06, 0x3a023603,
66 0x33063f04, 0x35073906, 0x37063406, 0x240e2d0b, 0x52ff3508, 0x4efd3707,
67 0x1f162e0f, 0x071954ff, 0x031cf91e, 0x0020041c, 0x061eff22, 0x0920061e,
68 0x1b1a131f, 0x14251e1a, 0x4611221c, 0x3b054301, 0x1e104309, 0x23122012,
69 0x1f181d16, 0x2b122617, 0x3f0b2914, 0x40093b09, 0x59fe5eff, 0x4cfa6cf7,
70 0x2d002cfe, 0x40fd3400, 0x46fc3bfe, 0x52f84bfc, 0x4df766ef, 0x2a001803,
71 0x37003000, 0x47f93bfa, 0x57f553f4, 0x3a0177e2, 0x24ff1dfd, 0x2b022601,
72 0x3a0037fa, 0x4afd4000, 0x46005af6, 0x1f051dfc, 0x3b012a07, 0x48fd3afe,
73 0x61f551fd, 0x05083a00, 0x120e0e0a, 0x28021b0d, 0x46fd3a00, 0x55f84ffa,
74 0x6af30000, 0x57f66af0, 0x6eee72eb, 0x6eea62f2, 0x67ee6aeb, 0x6ce96beb,
75 0x60f670e6, 0x5bfb5ff4, 0x5eea5df7, 0x430956fb, 0x55f650fc, 0x3c0746ff,
76 0x3d053a09, 0x320f320c, 0x36113112, 0x2e07290a, 0x310733ff, 0x29093408,
77 0x37022f06, 0x2c0a290d, 0x35053206, 0x3f04310d, 0x45fe4006, 0x46063bfe,
78 0x1f092c0a, 0x35032b0c, 0x260a220e, 0x280d34fd, 0x2c072011, 0x320d2607,
79 0x2b1a390a, 0x0e0b0b0e, 0x0b120b09, 0xfe170915, 0xf120f120, 0xe927eb22,
80 0xe129df2a, 0xf426e42e, 0xe82d1d15, 0xe630d335, 0xed2bd541, 0x091ef627,
81 0x1b141a12, 0x52f23900, 0x61ed4bfb, 0x001b7ddd, 0xfc1f001c, 0x0822061b,
82 0x16180a1e, 0x20161321, 0x29151f1a, 0x2f172c1a, 0x470e4110, 0x3f063c08,
83 0x18154111, 0x171a1417, 0x171c201b, 0x2817181c, 0x1d1c2018, 0x39132a17,
84 0x3d163516, 0x280c560b, 0x3b0e330b, 0x47f94ffc, 0x46f745fb, 0x44f642f8,
85 0x45f449ed, 0x43f146f0, 0x46ed3eec, 0x41ea42f0, 0xfe093fec, 0xf721f71a,
86 0xfe29f927, 0x0931032d, 0x3b241b2d, 0x23f942fa, 0x2df82af9, 0x38f430fb,
87 0x3efb3cfa, 0x4cf842f8, 0x51fa55fb, 0x51f94df6, 0x49ee50ef, 0x53f64afc,
88 0x43f747f7, 0x42f83dff, 0x3b0042f2, 0xf3153b02, 0xf927f221, 0x0233fe2e,
89 0x113d063c, 0x3e2a2237, 0x00000000, 0x00000000, 0x3602f114, 0xf1144a03,
90 0x4a033602, 0x68e97fe4, 0x36ff35fa, 0x19163307, 0x00100022, 0x290409fe,
91 0x410276e3, 0x4ff347fa, 0x32093405, 0x360a46fd, 0x1613221a, 0x02390028,
92 0x451a2429, 0x65f17fd3, 0x47fa4cfc, 0x34054ff3, 0x5af34506, 0x2b083400,
93 0x52fb45fe, 0x3b0260f6, 0x57fd4b02, 0x380164fd, 0x55fa4afd, 0x51fd3b00,
94 0x5ffb56f9, 0x4dff42ff, 0x56fe4601, 0x3d0048fb, 0x3f002900, 0x3f003f00,
95 0x560453f7, 0x48f96100, 0x3e03290d, 0x33070f0d, 0x7fd95002, 0x60ef5bee,
96 0x62dd51e6, 0x61e966e8, 0x63e877e5, 0x66ee6eeb, 0x50007fdc, 0x5ef959fb,
97 0x27005cfc, 0x54f14100, 0x49fe7fdd, 0x5bf768f4, 0x37037fe1, 0x37073807,
98 0x35fd3d08, 0x4af94400, 0x67f358f7, 0x59f75bf3, 0x4cf85cf2, 0x6ee957f4,
99 0x4ef669e8, 0x63ef70ec, 0x7fba7fb2, 0x7fd27fce, 0x4efb42fc, 0x48f847fc,
100 0x37ff3b02, 0x4bfa46f9, 0x77de59f8, 0x14204bfd, 0x7fd4161e, 0x3dfb3600,
101 0x3cff3a00, 0x43f83dfd, 0x4af254e7, 0x340541fb, 0x3d003902, 0x46f545f7,
102 0x47fc3712, 0x3d073a00, 0x19122909, 0x2b052009, 0x2c002f09, 0x2e023300,
103 0x42fc2613, 0x2a0c260f, 0x59002209, 0x1c0a2d04, 0xf5211f0a, 0x0f12d534,
104 0xea23001c, 0x0022e726, 0xf420ee27, 0x0000a266, 0xfc21f138, 0xfb250a1d,
105 0xf727e333, 0xc645de34, 0xfb2cc143, 0xe3370720, 0x00000120, 0xe721241b,
106 0xe424e222, 0xe526e426, 0xf023ee22, 0xf820f222, 0x0023fa25, 0x121c0a1e,
107 0x291d191a, 0x48024b00, 0x230e4d08, 0x23111f12, 0x2d111e15, 0x2d122a14,
108 0x36101a1b, 0x38104207, 0x430a490b, 0x70e974f6, 0x3df947f1, 0x42fb3500,
109 0x50f74df5, 0x57f654f7, 0x65eb7fde, 0x35fb27fd, 0x4bf53df9, 0x5bef4df1,
110 0x6fe76be7, 0x4cf57ae4, 0x34f62cf6, 0x3af739f6, 0x45f948f0, 0x4afb45fc,
111 0x420256f7, 0x200122f7, 0x34051f0b, 0x43fe37fe, 0x59f84900, 0x04073403,
112 0x0811080a, 0x25031310, 0x49fb3dff, 0x4efc46ff, 0x7eeb0000, 0x6eec7ce9,
113 0x7ce77ee6, 0x79e569ef, 0x66ef75e5, 0x74e575e6, 0x5ff67adf, 0x5ff864f2,
114 0x72e46fef, 0x50fe59fa, 0x55f752fc, 0x48ff51f8, 0x43014005, 0x45003809,
115 0x45074501, 0x43fa45f9, 0x40fe4df0, 0x43fa3d02, 0x390240fd, 0x42fd41fd,
116 0x33093e00, 0x47fe42ff, 0x46ff4bfe, 0x3c0e48f7, 0x2f002510, 0x250b2312,
117 0x290a290c, 0x290c3002, 0x3b00290d, 0x28133203, 0x32124203, 0xfa12fa13,
118 0xf41a000e, 0xe721f01f, 0xe425ea21, 0xe22ae227, 0xdc2dd62f, 0xef29de31,
119 0xb9450920, 0xc042c13f, 0xd936b64d, 0xf629dd34, 0xff280024, 0x1a1c0e1e,
120 0x370c2517, 0xdf25410b, 0xdb28dc27, 0xdf2ee226, 0xe828e22a, 0xf426e331,
121 0xfd26f628, 0x141ffb2e, 0x2c191e1d, 0x310b300c, 0x16162d1a, 0x151b1617,
122 0x1c1a1421, 0x221b181e, 0x27192a12, 0x460c3212, 0x470e3615, 0x2019530b,
123 0x36153115, 0x51fa55fb, 0x51f94df6, 0x49ee50ef, 0x53f64afc, 0x43f747f7,
124 0x42f83dff, 0x3b0042f2, 0xf6113b02, 0xf72af320, 0x0035fb31, 0x0a440340,
125 0x392f1b42, 0x180047fb, 0x2afe24ff, 0x39f734fe, 0x41fc3ffa, 0x52f943fc,
126 0x4cfd51fd, 0x4efa48f9, 0x44f248f4, 0x4cfa46fd, 0x3efb42fb, 0x3dfc3900,
127 0x36013cf7, 0xf6113a02, 0xf72af320, 0x0035fb31, 0x0a440340, 0x392f1b42,
128 0x00000000, 0x00000000, 0x3602f114, 0xf1144a03, 0x4a033602, 0x68e97fe4,
129 0x36ff35fa, 0x101d3307, 0x000e0019, 0x3efd33f6, 0x101a63e5, 0x66e855fc,
130 0x39063905, 0x390e49ef, 0x0a142814, 0x0036001d, 0x610c2a25, 0x75ea7fe0,
131 0x55fc4afe, 0x390566e8, 0x58f25dfa, 0x37042cfa, 0x67f159f5, 0x391374eb,
132 0x54043a14, 0x3f016006, 0x6af355fb, 0x4b063f05, 0x65ff5afd, 0x4ffc3703,
133 0x61f44bfe, 0x3c0132f9, 0x3f002900, 0x3f003f00, 0x560453f7, 0x48f96100,
134 0x3e03290d, 0x58f72207, 0x7fdc7fec, 0x5ff25bef, 0x56e754e7, 0x5bef59f4,
135 0x4cf27fe1, 0x5af367ee, 0x500b7fdb, 0x54024c05, 0x37fa4e05, 0x53f23d04,
136 0x4ffb7fdb, 0x5bf568f5, 0x41007fe2, 0x48004ffe, 0x38fa5cfc, 0x47f84403,
137 0x56fc62f3, 0x52fb58f4, 0x43fc48fd, 0x59f048f8, 0x3bff45f7, 0x39044205,
138 0x47fe47fc, 0x4aff3a02, 0x45ff2cfc, 0x33f93e00, 0x2afa2ffc, 0x35fa29fd,
139 0x4ef74c08, 0x340953f5, 0x5afb4300, 0x48f14301, 0x50f84bfb, 0x40eb53eb,
140 0x40e71ff3, 0x4b095ee3, 0x4af83f11, 0x1bfe23fb, 0x41035b0d, 0x4d0845f9,
141 0x3e0342f6, 0x51ec44fd, 0x07011e00, 0x4aeb17fd, 0x7ce94210, 0xee2c2511,
142 0x7feade32, 0x2a002704, 0x1d0b2207, 0x25061f08, 0x28032a07, 0x2b0d2108,
143 0x2f04240d, 0x3a023703, 0x2c083c06, 0x2a0e2c0b, 0x38043007, 0x250d3404,
144 0x3a133109, 0x2d0c300a, 0x21144500, 0xee233f08, 0xfd1ce721, 0x001b0a18,
145 0xd434f222, 0x1113e827, 0x1d24191f, 0x0f222118, 0x4916141e, 0x1f132214,
146 0x10132c1b, 0x240f240f, 0x15191c15, 0x0c1f141e, 0x2a18101b, 0x380e5d00,
147 0x261a390f, 0x73e87fe8, 0x3ef752ea, 0x3b003500, 0x59f355f2, 0x5cf55ef3,
148 0x64eb7fe3, 0x43f439f2, 0x4df647f5, 0x58f055eb, 0x62f168e9, 0x52f67fdb,
149 0x3df830f8, 0x46f942f8, 0x4ff64bf2, 0x5cf453f7, 0x4ffc6cee, 0x4bf045ea,
150 0x3a013afe, 0x53f74ef3, 0x63f351fc, 0x26fa51f3, 0x3afa3ef3, 0x49f03bfe,
151 0x56f34cf6, 0x57f653f7, 0x7fea0000, 0x78e77fe7, 0x72ed7fe5, 0x76e775e9,
152 0x71e875e6, 0x78e176e4, 0x5ef67cdb, 0x63f666f1, 0x7fce6af3, 0x39115cfb,
153 0x5ef356fb, 0x4dfe5bf4, 0x49ff4700, 0x51f94004, 0x390f4005, 0x44004301,
154 0x440143f6, 0x40024d00, 0x4efb4400, 0x3b053707, 0x360e4102, 0x3c052c0f,
155 0x4cfe4602, 0x460c56ee, 0x46f44005, 0x3805370b, 0x41024500, 0x36054afa,
156 0x4cfa3607, 0x4dfe52f5, 0x2a194dfe, 0xf710f311, 0xeb1bf411, 0xd829e225,
157 0xd130d72a, 0xd82ee027, 0xd72ecd34, 0xed2bd934, 0xc93d0b20, 0xce3ed238,
158 0xec2dbd51, 0x0f1cfe23, 0x01270122, 0x2614111e, 0x360f2d12, 0xf0244f00,
159 0xef25f225, 0x0f220120, 0x19180f1d, 0x101f1622, 0x1c1f1223, 0x1c242921,
160 0x3e152f1b, 0x1a131f12, 0x17181824, 0x1e18101b, 0x29161d1f, 0x3c102a16,
161 0x3c0e340f, 0x7bf04e03, 0x38163515, 0x21153d19, 0x3d113213, 0x4af84efd,
162 0x48f648f7, 0x47f44bee, 0x46fb3ff5, 0x48f24bef, 0x35f843f0, 0x34f73bf2,
163 0xfe0944f5, 0xfc1ff61e, 0x0721ff21, 0x17250c1f, 0x4014261f, 0x25f947f7,
164 0x31f52cf8, 0x3bf438f6, 0x43f73ff8, 0x4ff644fa, 0x4af84efd, 0x48f648f7,
165 0x47f44bee, 0x46fb3ff5, 0x48f24bef, 0x35f843f0, 0x34f73bf2, 0xfe0944f5,
166 0xfc1ff61e, 0x0721ff21, 0x17250c1f, 0x4014261f, 0x00000000, 0x00000000,
167 0x3602f114, 0xf1144a03, 0x4a033602, 0x68e97fe4, 0x36ff35fa, 0x00003307,
168 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
169 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
170 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
171 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
172 0x3f002900, 0x3f003f00, 0x560453f7, 0x48f96100, 0x3e03290d, 0x37010b00,
173 0x7fef4500, 0x520066f3, 0x6beb4af9, 0x7fe17fe5, 0x5fee7fe8, 0x72eb7fe5,
174 0x7bef7fe2, 0x7af073f4, 0x3ff473f5, 0x54f144fe, 0x46fd68f3, 0x5af65df8,
175 0x4aff7fe2, 0x5bf961fa, 0x38fc7fec, 0x4cf952fb, 0x5df97dea, 0x4dfd57f5,
176 0x3ffc47fb, 0x54f444fc, 0x41f93ef9, 0x38053d08, 0x400142fe, 0x4efe3d00,
177 0x34073201, 0x2c00230a, 0x2d01260b, 0x2c052e00, 0x3301111f, 0x131c3207,
178 0x3e0e2110, 0x64f16cf3, 0x5bf365f3, 0x58f65ef4, 0x56f654f0, 0x57f353f9,
179 0x46015eed, 0x4afb4800, 0x66f83b12, 0x5f0064f1, 0x48024bfc, 0x47fd4bf5,
180 0x45f32e0f, 0x41003e00, 0x48f12515, 0x36103909, 0x480c3e00, 0x090f0018,
181 0x120d1908, 0x130d090f, 0x120c250a, 0x21141d06, 0x2d041e0f, 0x3e003a01,
182 0x260c3d07, 0x270f2d0b, 0x2c0d2a0b, 0x290c2d10, 0x221e310a, 0x370a2a12,
183 0x2e113311, 0xed1a5900, 0xef1aef16, 0xec1ce71e, 0xe525e921, 0xe428e921,
184 0xf521ef26, 0xfa29f128, 0x11290126, 0x031bfa1e, 0xf025161a, 0xf826fc23,
185 0x0325fd26, 0x002a0526, 0x16271023, 0x251b300e, 0x440c3c15, 0x47fd6102,
186 0x32fb2afa, 0x3efe36fd, 0x3f013a00, 0x4aff48fe, 0x43fb5bf7, 0x27fd1bfb,
187 0x2e002cfe, 0x44f840f0, 0x4dfa4ef6, 0x5cf456f6, 0x3cf637f1, 0x41fc3efa,
188 0x4cf849f4, 0x58f750f9, 0x61f56eef, 0x4ff554ec, 0x4afc49fa, 0x60f356f3,
189 0x75ed61f5, 0x21fb4ef8, 0x35fe30fc, 0x47f33efd, 0x56f44ff6, 0x61f25af3,
190 0x5dfa0000, 0x4ff854fa, 0x47ff4200, 0x3cfe3e00, 0x4bfb3bfe, 0x3afc3efd,
191 0x4fff42f7, 0x44034700, 0x3ef92c0a, 0x280e240f, 0x1d0c1b10, 0x24142c01,
192 0x2a052012, 0x3e0a3001, 0x40092e11, 0x61f568f4, 0x58f960f0, 0x55f955f8,
193 0x58f355f7, 0x4dfd4204, 0x4cfa4cfd, 0x4cff3a0a, 0x63f953ff, 0x5f025ff2,
194 0x4afb4c00, 0x4bf54600, 0x41004401, 0x3e0349f2, 0x44ff3e04, 0x370b4bf3,
195 0x460c4005, 0x1306060f, 0x0e0c1007, 0x0b0d0d12, 0x100f0f0d, 0x170d170c,
196 0x1a0e140f, 0x28112c0e, 0x11182f11, 0x16191515, 0x1d161b1f, 0x320e2313,
197 0x3f07390a, 0x52fc4dfe, 0x45095efd, 0xdd246df4, 0xe620de24, 0xe02ce225,
198 0xf122ee22, 0xf921f128, 0x0021fb23, 0x0d210226, 0x3a0d2317, 0x001afd1d,
199 0xf91f1e16, 0xfd22f123, 0xff240322, 0x0b200522, 0x0c220523, 0x1d1e0b27,
200 0x271d1a22, 0x151f4213, 0x32191f1f, 0x70ec78ef, 0x55f572ee, 0x59f25cf1,
201 0x51f147e6, 0x440050f2, 0x38e846f2, 0x32e844e9, 0xf3174af5, 0xf128f31a,
202 0x032cf231, 0x222c062d, 0x52133621, 0x17ff4bfd, 0x2b012201, 0x37fe3600,
203 0x40013d00, 0x5cf74400, 0x61f36af2, 0x5af45af1, 0x49f658ee, 0x56f24ff7,
204 0x46f649f6, 0x42fb45f6, 0x3afb40f7, 0xf6153b02, 0xf81cf518, 0x031dff1c,
205 0x1423091d, 0x430e241d, 0x00000000, 0x00000000
206 };
207
explain_input_buffer(void * hal,HalDecTask * task)208 static void explain_input_buffer(void *hal, HalDecTask *task)
209 {
210 RK_U32 i = 0;
211 H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
212 DXVA2_DecodeBufferDesc *pdes = (DXVA2_DecodeBufferDesc *)task->syntax.data;
213 for (i = 0; i < task->syntax.number; i++) {
214 switch (pdes[i].CompressedBufferType) {
215 case DXVA2_PictureParametersBufferType:
216 p_hal->pp = (DXVA_PicParams_H264_MVC *)pdes[i].pvPVPState;
217 break;
218 case DXVA2_InverseQuantizationMatrixBufferType:
219 p_hal->qm = (DXVA_Qmatrix_H264 *)pdes[i].pvPVPState;
220 break;
221 case DXVA2_SliceControlBufferType:
222 p_hal->slice_num = pdes[i].DataSize / sizeof(DXVA_Slice_H264_Long);
223 p_hal->slice_long = (DXVA_Slice_H264_Long *)pdes[i].pvPVPState;
224 break;
225 case DXVA2_BitStreamDateBufferType:
226 p_hal->bitstream = (RK_U8 *)pdes[i].pvPVPState;
227 p_hal->strm_len = pdes[i].DataSize;
228 break;
229 default:
230 break;
231 }
232 }
233 }
234
235 /*!
236 ***********************************************************************
237 * \brief
238 * init
239 ***********************************************************************
240 */
241 //extern "C"
hal_h264d_init(void * hal,MppHalCfg * cfg)242 MPP_RET hal_h264d_init(void *hal, MppHalCfg *cfg)
243 {
244 MPP_RET ret = MPP_ERR_UNKNOW;
245 H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
246 MppClientType client_type = VPU_CLIENT_BUTT;
247
248 INP_CHECK(ret, NULL == p_hal);
249 memset(p_hal, 0, sizeof(H264dHalCtx_t));
250
251 mpp_env_get_u32("hal_h264d_debug", &hal_h264d_debug, 0);
252
253 //!< choose hard mode
254 {
255 RK_S32 hw_type = -1;
256 RK_U32 mode = MODE_NULL;
257 RK_U32 vcodec_type = mpp_get_vcodec_type();
258
259 // check codec_type
260 if (!(vcodec_type & (HAVE_RKVDEC | HAVE_VDPU1 | HAVE_VDPU2))) {
261 mpp_err_f("can not found H.264 decoder hardware on platform %x\n", vcodec_type);
262 return ret;
263 }
264 mpp_env_get_u32("use_mpp_mode", &mode, cfg->cfg->base.codec_mode);
265 if (MODE_NULL == mode) {
266 MppDecBaseCfg *base = &cfg->cfg->base;
267
268 if (mpp_check_soc_cap(base->type, base->coding))
269 hw_type = base->hw_type;
270
271 if (hw_type > 0) {
272 if (vcodec_type & (1 << hw_type)) {
273 mpp_log("init with %s hw\n", strof_client_type(hw_type));
274 client_type = hw_type;
275 } else
276 mpp_err_f("invalid hw_type %d with vcodec_type %08x\n",
277 hw_type, vcodec_type);
278 }
279 }
280
281 if (client_type == VPU_CLIENT_BUTT) {
282 if ((mode <= RKVDEC_MODE) && (vcodec_type & HAVE_RKVDEC)) {
283 client_type = VPU_CLIENT_RKVDEC;
284 } else if (vcodec_type & HAVE_VDPU1) {
285 client_type = VPU_CLIENT_VDPU1;
286 } else if (vcodec_type & HAVE_VDPU2) {
287 client_type = VPU_CLIENT_VDPU2;
288 }
289 }
290 H264D_DBG(H264D_DBG_HARD_MODE, "client_type %d\n", client_type);
291 }
292
293 switch (client_type) {
294 case VPU_CLIENT_RKVDEC : {
295 RK_U32 hw_id = mpp_get_client_hw_id(client_type);
296
297 switch (hw_id) {
298 case HWID_VDPU383 : {
299 p_hal->hal_api = &hal_h264d_vdpu383;
300 } break;
301 case HWID_VDPU384A : {
302 p_hal->hal_api = &hal_h264d_vdpu384a;
303 } break;
304 case HWID_VDPU382_RK3528 :
305 case HWID_VDPU382_RK3562 : {
306 p_hal->hal_api = &hal_h264d_vdpu382;
307 } break;
308 case HWID_VDPU34X :
309 case HWID_VDPU38X : {
310 p_hal->hal_api = &hal_h264d_vdpu34x;
311 } break;
312 default : {
313 p_hal->hal_api = &hal_h264d_rkvdpu;
314 } break;
315 }
316
317 cfg->support_fast_mode = 1;
318 } break;
319 case VPU_CLIENT_VDPU1 : {
320 p_hal->hal_api = &hal_h264d_vdpu1;
321 } break;
322 case VPU_CLIENT_VDPU2 : {
323 p_hal->hal_api = &hal_h264d_vdpu2;
324 } break;
325 default : {
326 mpp_err_f("client_type error, value=%d\n", client_type);
327 mpp_assert(0);
328 } break;
329 }
330
331 ret = mpp_dev_init(&cfg->dev, client_type);
332 if (ret) {
333 mpp_err("mpp_dev_init failed ret: %d\n", ret);
334 goto __FAILED;
335 }
336 cfg->hw_info = mpp_get_dec_hw_info_by_client_type(client_type);
337 p_hal->hw_info = cfg->hw_info;
338
339 //!< callback function to parser module
340 p_hal->dec_cb = cfg->dec_cb;
341 p_hal->cfg = cfg->cfg;
342 p_hal->dev = cfg->dev;
343 p_hal->frame_slots = cfg->frame_slots;
344 p_hal->packet_slots = cfg->packet_slots;
345 p_hal->fast_mode = cfg->cfg->base.fast_parse;
346
347 //< get buffer group
348 if (p_hal->buf_group == NULL) {
349 FUN_CHECK(ret = mpp_buffer_group_get_internal
350 (&p_hal->buf_group, MPP_BUFFER_TYPE_ION));
351 }
352
353 //!< run init funtion
354 FUN_CHECK(ret = p_hal->hal_api->init(hal, cfg));
355 __RETURN:
356 return MPP_OK;
357 __FAILED:
358 return ret;
359 }
360
361 /*!
362 ***********************************************************************
363 * \brief
364 * deinit
365 ***********************************************************************
366 */
367 //extern "C"
hal_h264d_deinit(void * hal)368 MPP_RET hal_h264d_deinit(void *hal)
369 {
370 MPP_RET ret = MPP_ERR_UNKNOW;
371 H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
372
373 FUN_CHECK(ret = p_hal->hal_api->deinit(hal));
374
375 if (p_hal->dev) {
376 mpp_dev_deinit(p_hal->dev);
377 p_hal->dev = NULL;
378 }
379
380 if (p_hal->buf_group) {
381 FUN_CHECK(ret = mpp_buffer_group_put(p_hal->buf_group));
382 }
383
384 return MPP_OK;
385 __FAILED:
386 return ret;
387 }
388
389 /*!
390 ***********************************************************************
391 * \brief
392 * generate register
393 ***********************************************************************
394 */
395 //extern "C"
hal_h264d_gen_regs(void * hal,HalTaskInfo * task)396 MPP_RET hal_h264d_gen_regs(void *hal, HalTaskInfo *task)
397 {
398 H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
399
400 explain_input_buffer(hal, &task->dec);
401 if (!p_hal || !p_hal->hal_api || !p_hal->hal_api->reg_gen)
402 return MPP_NOK;
403
404 return p_hal->hal_api->reg_gen(hal, task);
405 }
406
407 /*!
408 ***********************************************************************
409 * \brief
410 * control
411 ***********************************************************************
412 */
413 //extern "C"
hal_h264d_control(void * hal,MpiCmd cmd_type,void * param)414 MPP_RET hal_h264d_control(void *hal, MpiCmd cmd_type, void *param)
415 {
416 H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
417
418 if (!p_hal || !p_hal->hal_api || !p_hal->hal_api->control)
419 return MPP_NOK;
420
421 return p_hal->hal_api->control(hal, cmd_type, param);
422 }
423
424 #define HAL_H264D_FUNC(func) \
425 static MPP_RET hal_h264d_##func(void *hal) \
426 { \
427 H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal; \
428 \
429 if (!p_hal || !p_hal->hal_api || !p_hal->hal_api->func) \
430 return MPP_OK; \
431 \
432 return p_hal->hal_api->func(hal); \
433 }
434
435 #define HAL_H264D_TASK_FUNC(func) \
436 static MPP_RET hal_h264d_##func(void *hal, HalTaskInfo *task) \
437 { \
438 H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal; \
439 \
440 if (!p_hal || !p_hal->hal_api || !p_hal->hal_api->func) \
441 return MPP_OK; \
442 \
443 return p_hal->hal_api->func(hal, task); \
444 }
445
446 HAL_H264D_FUNC(flush);
447 HAL_H264D_FUNC(reset);
448 HAL_H264D_TASK_FUNC(start);
449 HAL_H264D_TASK_FUNC(wait);
450
451 const MppHalApi hal_api_h264d = {
452 .name = "h264d_rkdec",
453 .type = MPP_CTX_DEC,
454 .coding = MPP_VIDEO_CodingAVC,
455 .ctx_size = sizeof(H264dHalCtx_t),
456 .flag = 0,
457 .init = hal_h264d_init,
458 .deinit = hal_h264d_deinit,
459 .reg_gen = hal_h264d_gen_regs,
460 .start = hal_h264d_start,
461 .wait = hal_h264d_wait,
462 .reset = hal_h264d_reset,
463 .flush = hal_h264d_flush,
464 .control = hal_h264d_control,
465 };
466