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