xref: /rockchip-linux_mpp/mpp/hal/rkdec/h264d/hal_h264d_api.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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