xref: /rockchip-linux_mpp/mpp/hal/rkdec/h264d/hal_h264d_vdpu382.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2022 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_h264d_vdpu382"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "rk_type.h"
24*437bfbebSnyanmisaka #include "mpp_err.h"
25*437bfbebSnyanmisaka #include "mpp_mem.h"
26*437bfbebSnyanmisaka #include "mpp_common.h"
27*437bfbebSnyanmisaka #include "mpp_bitput.h"
28*437bfbebSnyanmisaka #include "mpp_service.h"
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka #include "mpp_device.h"
31*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #include "hal_h264d_global.h"
34*437bfbebSnyanmisaka #include "hal_h264d_vdpu382.h"
35*437bfbebSnyanmisaka #include "vdpu382_h264d.h"
36*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka /* Number registers for the decoder */
39*437bfbebSnyanmisaka #define DEC_VDPU382_REGISTERS       276
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka #define VDPU382_CABAC_TAB_SIZE      (928*4 + 128)       /* bytes */
42*437bfbebSnyanmisaka #define VDPU382_SPSPPS_SIZE         (256*48 + 128)      /* bytes */
43*437bfbebSnyanmisaka #define VDPU382_RPS_SIZE            (128 + 128 + 128)   /* bytes */
44*437bfbebSnyanmisaka #define VDPU382_SCALING_LIST_SIZE   (6*16+2*64 + 128)   /* bytes */
45*437bfbebSnyanmisaka #define VDPU382_ERROR_INFO_SIZE     (256*144*4)         /* bytes */
46*437bfbebSnyanmisaka #define H264_CTU_SIZE               16
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka #define VDPU382_CABAC_TAB_ALIGNED_SIZE      (MPP_ALIGN(VDPU382_CABAC_TAB_SIZE, SZ_4K))
49*437bfbebSnyanmisaka #define VDPU382_ERROR_INFO_ALIGNED_SIZE     (0)
50*437bfbebSnyanmisaka #define VDPU382_SPSPPS_ALIGNED_SIZE         (MPP_ALIGN(VDPU382_SPSPPS_SIZE, SZ_4K))
51*437bfbebSnyanmisaka #define VDPU382_RPS_ALIGNED_SIZE            (MPP_ALIGN(VDPU382_RPS_SIZE, SZ_4K))
52*437bfbebSnyanmisaka #define VDPU382_SCALING_LIST_ALIGNED_SIZE   (MPP_ALIGN(VDPU382_SCALING_LIST_SIZE, SZ_4K))
53*437bfbebSnyanmisaka #define VDPU382_STREAM_INFO_SET_SIZE        (VDPU382_SPSPPS_ALIGNED_SIZE + \
54*437bfbebSnyanmisaka                                              VDPU382_RPS_ALIGNED_SIZE + \
55*437bfbebSnyanmisaka                                              VDPU382_SCALING_LIST_ALIGNED_SIZE)
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka #define VDPU382_CABAC_TAB_OFFSET            (0)
58*437bfbebSnyanmisaka #define VDPU382_ERROR_INFO_OFFSET           (VDPU382_CABAC_TAB_OFFSET + VDPU382_CABAC_TAB_ALIGNED_SIZE)
59*437bfbebSnyanmisaka #define VDPU382_STREAM_INFO_OFFSET_BASE     (VDPU382_ERROR_INFO_OFFSET + VDPU382_ERROR_INFO_ALIGNED_SIZE)
60*437bfbebSnyanmisaka #define VDPU382_SPSPPS_OFFSET(pos)          (VDPU382_STREAM_INFO_OFFSET_BASE + (VDPU382_STREAM_INFO_SET_SIZE * pos))
61*437bfbebSnyanmisaka #define VDPU382_RPS_OFFSET(pos)             (VDPU382_SPSPPS_OFFSET(pos) + VDPU382_SPSPPS_ALIGNED_SIZE)
62*437bfbebSnyanmisaka #define VDPU382_SCALING_LIST_OFFSET(pos)    (VDPU382_RPS_OFFSET(pos) + VDPU382_RPS_ALIGNED_SIZE)
63*437bfbebSnyanmisaka #define VDPU382_INFO_BUFFER_SIZE(cnt)       (VDPU382_STREAM_INFO_OFFSET_BASE + (VDPU382_STREAM_INFO_SET_SIZE * cnt))
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka #define VDPU382_SPS_PPS_LEN     (43)
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka #define SET_REF_INFO(regs, index, field, value)\
68*437bfbebSnyanmisaka     do{ \
69*437bfbebSnyanmisaka         switch(index){\
70*437bfbebSnyanmisaka         case 0: regs.reg99.ref0_##field = value; break;\
71*437bfbebSnyanmisaka         case 1: regs.reg99.ref1_##field = value; break;\
72*437bfbebSnyanmisaka         case 2: regs.reg99.ref2_##field = value; break;\
73*437bfbebSnyanmisaka         case 3: regs.reg99.ref3_##field = value; break;\
74*437bfbebSnyanmisaka         case 4: regs.reg100.ref4_##field = value; break;\
75*437bfbebSnyanmisaka         case 5: regs.reg100.ref5_##field = value; break;\
76*437bfbebSnyanmisaka         case 6: regs.reg100.ref6_##field = value; break;\
77*437bfbebSnyanmisaka         case 7: regs.reg100.ref7_##field = value; break;\
78*437bfbebSnyanmisaka         case 8: regs.reg101.ref8_##field = value; break;\
79*437bfbebSnyanmisaka         case 9: regs.reg101.ref9_##field = value; break;\
80*437bfbebSnyanmisaka         case 10: regs.reg101.ref10_##field = value; break;\
81*437bfbebSnyanmisaka         case 11: regs.reg101.ref11_##field = value; break;\
82*437bfbebSnyanmisaka         case 12: regs.reg102.ref12_##field = value; break;\
83*437bfbebSnyanmisaka         case 13: regs.reg102.ref13_##field = value; break;\
84*437bfbebSnyanmisaka         case 14: regs.reg102.ref14_##field = value; break;\
85*437bfbebSnyanmisaka         case 15: regs.reg102.ref15_##field = value; break;\
86*437bfbebSnyanmisaka         default: break;}\
87*437bfbebSnyanmisaka     }while(0)
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka #define SET_POC_HIGNBIT_INFO(regs, index, field, value)\
90*437bfbebSnyanmisaka     do{ \
91*437bfbebSnyanmisaka         switch(index){\
92*437bfbebSnyanmisaka         case 0: regs.reg200.ref0_##field = value; break;\
93*437bfbebSnyanmisaka         case 1: regs.reg200.ref1_##field = value; break;\
94*437bfbebSnyanmisaka         case 2: regs.reg200.ref2_##field = value; break;\
95*437bfbebSnyanmisaka         case 3: regs.reg200.ref3_##field = value; break;\
96*437bfbebSnyanmisaka         case 4: regs.reg200.ref4_##field = value; break;\
97*437bfbebSnyanmisaka         case 5: regs.reg200.ref5_##field = value; break;\
98*437bfbebSnyanmisaka         case 6: regs.reg200.ref6_##field = value; break;\
99*437bfbebSnyanmisaka         case 7: regs.reg200.ref7_##field = value; break;\
100*437bfbebSnyanmisaka         case 8: regs.reg201.ref8_##field = value; break;\
101*437bfbebSnyanmisaka         case 9: regs.reg201.ref9_##field = value; break;\
102*437bfbebSnyanmisaka         case 10: regs.reg201.ref10_##field = value; break;\
103*437bfbebSnyanmisaka         case 11: regs.reg201.ref11_##field = value; break;\
104*437bfbebSnyanmisaka         case 12: regs.reg201.ref12_##field = value; break;\
105*437bfbebSnyanmisaka         case 13: regs.reg201.ref13_##field = value; break;\
106*437bfbebSnyanmisaka         case 14: regs.reg201.ref14_##field = value; break;\
107*437bfbebSnyanmisaka         case 15: regs.reg201.ref15_##field = value; break;\
108*437bfbebSnyanmisaka         case 16: regs.reg202.ref16_##field = value; break;\
109*437bfbebSnyanmisaka         case 17: regs.reg202.ref17_##field = value; break;\
110*437bfbebSnyanmisaka         case 18: regs.reg202.ref18_##field = value; break;\
111*437bfbebSnyanmisaka         case 19: regs.reg202.ref19_##field = value; break;\
112*437bfbebSnyanmisaka         case 20: regs.reg202.ref20_##field = value; break;\
113*437bfbebSnyanmisaka         case 21: regs.reg202.ref21_##field = value; break;\
114*437bfbebSnyanmisaka         case 22: regs.reg202.ref22_##field = value; break;\
115*437bfbebSnyanmisaka         case 23: regs.reg202.ref23_##field = value; break;\
116*437bfbebSnyanmisaka         case 24: regs.reg203.ref24_##field = value; break;\
117*437bfbebSnyanmisaka         case 25: regs.reg203.ref25_##field = value; break;\
118*437bfbebSnyanmisaka         case 26: regs.reg203.ref26_##field = value; break;\
119*437bfbebSnyanmisaka         case 27: regs.reg203.ref27_##field = value; break;\
120*437bfbebSnyanmisaka         case 28: regs.reg203.ref28_##field = value; break;\
121*437bfbebSnyanmisaka         case 29: regs.reg203.ref29_##field = value; break;\
122*437bfbebSnyanmisaka         case 30: regs.reg203.ref30_##field = value; break;\
123*437bfbebSnyanmisaka         case 31: regs.reg203.ref31_##field = value; break;\
124*437bfbebSnyanmisaka         default: break;}\
125*437bfbebSnyanmisaka     }while(0)
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka #define VDPU382_FAST_REG_SET_CNT    3
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka typedef struct h264d_rkv_buf_t {
130*437bfbebSnyanmisaka     RK_U32              valid;
131*437bfbebSnyanmisaka     Vdpu382H264dRegSet  *regs;
132*437bfbebSnyanmisaka     DXVA_PicEntry_H264  RefFrameList[16];
133*437bfbebSnyanmisaka     DXVA_PicEntry_H264  RefPicList[3][32];
134*437bfbebSnyanmisaka } H264dRkvBuf_t;
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka typedef struct Vdpu382H264dRegCtx_t {
137*437bfbebSnyanmisaka     RK_U8               spspps[48];
138*437bfbebSnyanmisaka     RK_U8               rps[VDPU382_RPS_SIZE];
139*437bfbebSnyanmisaka     RK_U8               sclst[VDPU382_SCALING_LIST_SIZE];
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka     MppBuffer           bufs;
142*437bfbebSnyanmisaka     RK_S32              bufs_fd;
143*437bfbebSnyanmisaka     void                *bufs_ptr;
144*437bfbebSnyanmisaka     RK_U32              offset_cabac;
145*437bfbebSnyanmisaka     RK_U32              offset_errinfo;
146*437bfbebSnyanmisaka     RK_U32              offset_spspps[VDPU382_FAST_REG_SET_CNT];
147*437bfbebSnyanmisaka     RK_U32              offset_rps[VDPU382_FAST_REG_SET_CNT];
148*437bfbebSnyanmisaka     RK_U32              offset_sclst[VDPU382_FAST_REG_SET_CNT];
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka     H264dRkvBuf_t       reg_buf[VDPU382_FAST_REG_SET_CNT];
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     RK_U32              spspps_offset;
153*437bfbebSnyanmisaka     RK_U32              rps_offset;
154*437bfbebSnyanmisaka     RK_U32              sclst_offset;
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     RK_S32              width;
157*437bfbebSnyanmisaka     RK_S32              height;
158*437bfbebSnyanmisaka     /* rcb buffers info */
159*437bfbebSnyanmisaka     RK_U32              bit_depth;
160*437bfbebSnyanmisaka     RK_U32              mbaff;
161*437bfbebSnyanmisaka     RK_U32              chroma_format_idc;
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka     RK_S32              rcb_buf_size;
164*437bfbebSnyanmisaka     Vdpu382RcbInfo      rcb_info[RCB_BUF_COUNT];
165*437bfbebSnyanmisaka     MppBuffer           rcb_buf[VDPU382_FAST_REG_SET_CNT];
166*437bfbebSnyanmisaka 
167*437bfbebSnyanmisaka     RK_U32              err_ref_hack;
168*437bfbebSnyanmisaka 
169*437bfbebSnyanmisaka     Vdpu382H264dRegSet  *regs;
170*437bfbebSnyanmisaka } Vdpu382H264dRegCtx;
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka const RK_U32 rkv_cabac_table_v382[928] = {
173*437bfbebSnyanmisaka     0x3602f114, 0xf1144a03, 0x4a033602, 0x68e97fe4, 0x36ff35fa, 0x21173307,
174*437bfbebSnyanmisaka     0x00150217, 0x31000901, 0x390576db, 0x41f54ef3, 0x310c3e01, 0x321149fc,
175*437bfbebSnyanmisaka     0x2b094012, 0x431a001d, 0x68095a10, 0x68ec7fd2, 0x4ef34301, 0x3e0141f5,
176*437bfbebSnyanmisaka     0x5fef56fa, 0x2d093dfa, 0x51fa45fd, 0x370660f5, 0x56fb4307, 0x3a005802,
177*437bfbebSnyanmisaka     0x5ef64cfd, 0x45043605, 0x580051fd, 0x4afb43f9, 0x50fb4afc, 0x3a0148f9,
178*437bfbebSnyanmisaka     0x3f002900, 0x3f003f00, 0x560453f7, 0x48f96100, 0x3e03290d, 0x4efc2d00,
179*437bfbebSnyanmisaka     0x7ee560fd, 0x65e762e4, 0x52e443e9, 0x53f05eec, 0x5beb6eea, 0x5df366ee,
180*437bfbebSnyanmisaka     0x5cf97fe3, 0x60f959fb, 0x2efd6cf3, 0x39ff41ff, 0x4afd5df7, 0x57f85cf7,
181*437bfbebSnyanmisaka     0x36057ee9, 0x3b063c06, 0x30ff4506, 0x45fc4400, 0x55fe58f8, 0x4bff4efa,
182*437bfbebSnyanmisaka     0x36024df9, 0x44fd3205, 0x2a063201, 0x3f0151fc, 0x430046fc, 0x4cfe3902,
183*437bfbebSnyanmisaka     0x4004230b, 0x230b3d01, 0x180c1912, 0x240d1d0d, 0x49f95df6, 0x2e0d49fe,
184*437bfbebSnyanmisaka     0x64f93109, 0x35023509, 0x3dfe3505, 0x38003800, 0x3cfb3ff3, 0x39043eff,
185*437bfbebSnyanmisaka     0x390445fa, 0x3304270e, 0x4003440d, 0x3f093d01, 0x27103207, 0x34042c05,
186*437bfbebSnyanmisaka     0x3cfb300b, 0x3b003bff, 0x2c052116, 0x4eff2b0e, 0x45093c00, 0x28021c0b,
187*437bfbebSnyanmisaka     0x31002c03, 0x2c022e00, 0x2f003302, 0x3e022704, 0x36002e06, 0x3a023603,
188*437bfbebSnyanmisaka     0x33063f04, 0x35073906, 0x37063406, 0x240e2d0b, 0x52ff3508, 0x4efd3707,
189*437bfbebSnyanmisaka     0x1f162e0f, 0x071954ff, 0x031cf91e, 0x0020041c, 0x061eff22, 0x0920061e,
190*437bfbebSnyanmisaka     0x1b1a131f, 0x14251e1a, 0x4611221c, 0x3b054301, 0x1e104309, 0x23122012,
191*437bfbebSnyanmisaka     0x1f181d16, 0x2b122617, 0x3f0b2914, 0x40093b09, 0x59fe5eff, 0x4cfa6cf7,
192*437bfbebSnyanmisaka     0x2d002cfe, 0x40fd3400, 0x46fc3bfe, 0x52f84bfc, 0x4df766ef, 0x2a001803,
193*437bfbebSnyanmisaka     0x37003000, 0x47f93bfa, 0x57f553f4, 0x3a0177e2, 0x24ff1dfd, 0x2b022601,
194*437bfbebSnyanmisaka     0x3a0037fa, 0x4afd4000, 0x46005af6, 0x1f051dfc, 0x3b012a07, 0x48fd3afe,
195*437bfbebSnyanmisaka     0x61f551fd, 0x05083a00, 0x120e0e0a, 0x28021b0d, 0x46fd3a00, 0x55f84ffa,
196*437bfbebSnyanmisaka     0x6af30000, 0x57f66af0, 0x6eee72eb, 0x6eea62f2, 0x67ee6aeb, 0x6ce96beb,
197*437bfbebSnyanmisaka     0x60f670e6, 0x5bfb5ff4, 0x5eea5df7, 0x430956fb, 0x55f650fc, 0x3c0746ff,
198*437bfbebSnyanmisaka     0x3d053a09, 0x320f320c, 0x36113112, 0x2e07290a, 0x310733ff, 0x29093408,
199*437bfbebSnyanmisaka     0x37022f06, 0x2c0a290d, 0x35053206, 0x3f04310d, 0x45fe4006, 0x46063bfe,
200*437bfbebSnyanmisaka     0x1f092c0a, 0x35032b0c, 0x260a220e, 0x280d34fd, 0x2c072011, 0x320d2607,
201*437bfbebSnyanmisaka     0x2b1a390a, 0x0e0b0b0e, 0x0b120b09, 0xfe170915, 0xf120f120, 0xe927eb22,
202*437bfbebSnyanmisaka     0xe129df2a, 0xf426e42e, 0xe82d1d15, 0xe630d335, 0xed2bd541, 0x091ef627,
203*437bfbebSnyanmisaka     0x1b141a12, 0x52f23900, 0x61ed4bfb, 0x001b7ddd, 0xfc1f001c, 0x0822061b,
204*437bfbebSnyanmisaka     0x16180a1e, 0x20161321, 0x29151f1a, 0x2f172c1a, 0x470e4110, 0x3f063c08,
205*437bfbebSnyanmisaka     0x18154111, 0x171a1417, 0x171c201b, 0x2817181c, 0x1d1c2018, 0x39132a17,
206*437bfbebSnyanmisaka     0x3d163516, 0x280c560b, 0x3b0e330b, 0x47f94ffc, 0x46f745fb, 0x44f642f8,
207*437bfbebSnyanmisaka     0x45f449ed, 0x43f146f0, 0x46ed3eec, 0x41ea42f0, 0xfe093fec, 0xf721f71a,
208*437bfbebSnyanmisaka     0xfe29f927, 0x0931032d, 0x3b241b2d, 0x23f942fa, 0x2df82af9, 0x38f430fb,
209*437bfbebSnyanmisaka     0x3efb3cfa, 0x4cf842f8, 0x51fa55fb, 0x51f94df6, 0x49ee50ef, 0x53f64afc,
210*437bfbebSnyanmisaka     0x43f747f7, 0x42f83dff, 0x3b0042f2, 0xf3153b02, 0xf927f221, 0x0233fe2e,
211*437bfbebSnyanmisaka     0x113d063c, 0x3e2a2237, 0x00000000, 0x00000000, 0x3602f114, 0xf1144a03,
212*437bfbebSnyanmisaka     0x4a033602, 0x68e97fe4, 0x36ff35fa, 0x19163307, 0x00100022, 0x290409fe,
213*437bfbebSnyanmisaka     0x410276e3, 0x4ff347fa, 0x32093405, 0x360a46fd, 0x1613221a, 0x02390028,
214*437bfbebSnyanmisaka     0x451a2429, 0x65f17fd3, 0x47fa4cfc, 0x34054ff3, 0x5af34506, 0x2b083400,
215*437bfbebSnyanmisaka     0x52fb45fe, 0x3b0260f6, 0x57fd4b02, 0x380164fd, 0x55fa4afd, 0x51fd3b00,
216*437bfbebSnyanmisaka     0x5ffb56f9, 0x4dff42ff, 0x56fe4601, 0x3d0048fb, 0x3f002900, 0x3f003f00,
217*437bfbebSnyanmisaka     0x560453f7, 0x48f96100, 0x3e03290d, 0x33070f0d, 0x7fd95002, 0x60ef5bee,
218*437bfbebSnyanmisaka     0x62dd51e6, 0x61e966e8, 0x63e877e5, 0x66ee6eeb, 0x50007fdc, 0x5ef959fb,
219*437bfbebSnyanmisaka     0x27005cfc, 0x54f14100, 0x49fe7fdd, 0x5bf768f4, 0x37037fe1, 0x37073807,
220*437bfbebSnyanmisaka     0x35fd3d08, 0x4af94400, 0x67f358f7, 0x59f75bf3, 0x4cf85cf2, 0x6ee957f4,
221*437bfbebSnyanmisaka     0x4ef669e8, 0x63ef70ec, 0x7fba7fb2, 0x7fd27fce, 0x4efb42fc, 0x48f847fc,
222*437bfbebSnyanmisaka     0x37ff3b02, 0x4bfa46f9, 0x77de59f8, 0x14204bfd, 0x7fd4161e, 0x3dfb3600,
223*437bfbebSnyanmisaka     0x3cff3a00, 0x43f83dfd, 0x4af254e7, 0x340541fb, 0x3d003902, 0x46f545f7,
224*437bfbebSnyanmisaka     0x47fc3712, 0x3d073a00, 0x19122909, 0x2b052009, 0x2c002f09, 0x2e023300,
225*437bfbebSnyanmisaka     0x42fc2613, 0x2a0c260f, 0x59002209, 0x1c0a2d04, 0xf5211f0a, 0x0f12d534,
226*437bfbebSnyanmisaka     0xea23001c, 0x0022e726, 0xf420ee27, 0x0000a266, 0xfc21f138, 0xfb250a1d,
227*437bfbebSnyanmisaka     0xf727e333, 0xc645de34, 0xfb2cc143, 0xe3370720, 0x00000120, 0xe721241b,
228*437bfbebSnyanmisaka     0xe424e222, 0xe526e426, 0xf023ee22, 0xf820f222, 0x0023fa25, 0x121c0a1e,
229*437bfbebSnyanmisaka     0x291d191a, 0x48024b00, 0x230e4d08, 0x23111f12, 0x2d111e15, 0x2d122a14,
230*437bfbebSnyanmisaka     0x36101a1b, 0x38104207, 0x430a490b, 0x70e974f6, 0x3df947f1, 0x42fb3500,
231*437bfbebSnyanmisaka     0x50f74df5, 0x57f654f7, 0x65eb7fde, 0x35fb27fd, 0x4bf53df9, 0x5bef4df1,
232*437bfbebSnyanmisaka     0x6fe76be7, 0x4cf57ae4, 0x34f62cf6, 0x3af739f6, 0x45f948f0, 0x4afb45fc,
233*437bfbebSnyanmisaka     0x420256f7, 0x200122f7, 0x34051f0b, 0x43fe37fe, 0x59f84900, 0x04073403,
234*437bfbebSnyanmisaka     0x0811080a, 0x25031310, 0x49fb3dff, 0x4efc46ff, 0x7eeb0000, 0x6eec7ce9,
235*437bfbebSnyanmisaka     0x7ce77ee6, 0x79e569ef, 0x66ef75e5, 0x74e575e6, 0x5ff67adf, 0x5ff864f2,
236*437bfbebSnyanmisaka     0x72e46fef, 0x50fe59fa, 0x55f752fc, 0x48ff51f8, 0x43014005, 0x45003809,
237*437bfbebSnyanmisaka     0x45074501, 0x43fa45f9, 0x40fe4df0, 0x43fa3d02, 0x390240fd, 0x42fd41fd,
238*437bfbebSnyanmisaka     0x33093e00, 0x47fe42ff, 0x46ff4bfe, 0x3c0e48f7, 0x2f002510, 0x250b2312,
239*437bfbebSnyanmisaka     0x290a290c, 0x290c3002, 0x3b00290d, 0x28133203, 0x32124203, 0xfa12fa13,
240*437bfbebSnyanmisaka     0xf41a000e, 0xe721f01f, 0xe425ea21, 0xe22ae227, 0xdc2dd62f, 0xef29de31,
241*437bfbebSnyanmisaka     0xb9450920, 0xc042c13f, 0xd936b64d, 0xf629dd34, 0xff280024, 0x1a1c0e1e,
242*437bfbebSnyanmisaka     0x370c2517, 0xdf25410b, 0xdb28dc27, 0xdf2ee226, 0xe828e22a, 0xf426e331,
243*437bfbebSnyanmisaka     0xfd26f628, 0x141ffb2e, 0x2c191e1d, 0x310b300c, 0x16162d1a, 0x151b1617,
244*437bfbebSnyanmisaka     0x1c1a1421, 0x221b181e, 0x27192a12, 0x460c3212, 0x470e3615, 0x2019530b,
245*437bfbebSnyanmisaka     0x36153115, 0x51fa55fb, 0x51f94df6, 0x49ee50ef, 0x53f64afc, 0x43f747f7,
246*437bfbebSnyanmisaka     0x42f83dff, 0x3b0042f2, 0xf6113b02, 0xf72af320, 0x0035fb31, 0x0a440340,
247*437bfbebSnyanmisaka     0x392f1b42, 0x180047fb, 0x2afe24ff, 0x39f734fe, 0x41fc3ffa, 0x52f943fc,
248*437bfbebSnyanmisaka     0x4cfd51fd, 0x4efa48f9, 0x44f248f4, 0x4cfa46fd, 0x3efb42fb, 0x3dfc3900,
249*437bfbebSnyanmisaka     0x36013cf7, 0xf6113a02, 0xf72af320, 0x0035fb31, 0x0a440340, 0x392f1b42,
250*437bfbebSnyanmisaka     0x00000000, 0x00000000, 0x3602f114, 0xf1144a03, 0x4a033602, 0x68e97fe4,
251*437bfbebSnyanmisaka     0x36ff35fa, 0x101d3307, 0x000e0019, 0x3efd33f6, 0x101a63e5, 0x66e855fc,
252*437bfbebSnyanmisaka     0x39063905, 0x390e49ef, 0x0a142814, 0x0036001d, 0x610c2a25, 0x75ea7fe0,
253*437bfbebSnyanmisaka     0x55fc4afe, 0x390566e8, 0x58f25dfa, 0x37042cfa, 0x67f159f5, 0x391374eb,
254*437bfbebSnyanmisaka     0x54043a14, 0x3f016006, 0x6af355fb, 0x4b063f05, 0x65ff5afd, 0x4ffc3703,
255*437bfbebSnyanmisaka     0x61f44bfe, 0x3c0132f9, 0x3f002900, 0x3f003f00, 0x560453f7, 0x48f96100,
256*437bfbebSnyanmisaka     0x3e03290d, 0x58f72207, 0x7fdc7fec, 0x5ff25bef, 0x56e754e7, 0x5bef59f4,
257*437bfbebSnyanmisaka     0x4cf27fe1, 0x5af367ee, 0x500b7fdb, 0x54024c05, 0x37fa4e05, 0x53f23d04,
258*437bfbebSnyanmisaka     0x4ffb7fdb, 0x5bf568f5, 0x41007fe2, 0x48004ffe, 0x38fa5cfc, 0x47f84403,
259*437bfbebSnyanmisaka     0x56fc62f3, 0x52fb58f4, 0x43fc48fd, 0x59f048f8, 0x3bff45f7, 0x39044205,
260*437bfbebSnyanmisaka     0x47fe47fc, 0x4aff3a02, 0x45ff2cfc, 0x33f93e00, 0x2afa2ffc, 0x35fa29fd,
261*437bfbebSnyanmisaka     0x4ef74c08, 0x340953f5, 0x5afb4300, 0x48f14301, 0x50f84bfb, 0x40eb53eb,
262*437bfbebSnyanmisaka     0x40e71ff3, 0x4b095ee3, 0x4af83f11, 0x1bfe23fb, 0x41035b0d, 0x4d0845f9,
263*437bfbebSnyanmisaka     0x3e0342f6, 0x51ec44fd, 0x07011e00, 0x4aeb17fd, 0x7ce94210, 0xee2c2511,
264*437bfbebSnyanmisaka     0x7feade32, 0x2a002704, 0x1d0b2207, 0x25061f08, 0x28032a07, 0x2b0d2108,
265*437bfbebSnyanmisaka     0x2f04240d, 0x3a023703, 0x2c083c06, 0x2a0e2c0b, 0x38043007, 0x250d3404,
266*437bfbebSnyanmisaka     0x3a133109, 0x2d0c300a, 0x21144500, 0xee233f08, 0xfd1ce721, 0x001b0a18,
267*437bfbebSnyanmisaka     0xd434f222, 0x1113e827, 0x1d24191f, 0x0f222118, 0x4916141e, 0x1f132214,
268*437bfbebSnyanmisaka     0x10132c1b, 0x240f240f, 0x15191c15, 0x0c1f141e, 0x2a18101b, 0x380e5d00,
269*437bfbebSnyanmisaka     0x261a390f, 0x73e87fe8, 0x3ef752ea, 0x3b003500, 0x59f355f2, 0x5cf55ef3,
270*437bfbebSnyanmisaka     0x64eb7fe3, 0x43f439f2, 0x4df647f5, 0x58f055eb, 0x62f168e9, 0x52f67fdb,
271*437bfbebSnyanmisaka     0x3df830f8, 0x46f942f8, 0x4ff64bf2, 0x5cf453f7, 0x4ffc6cee, 0x4bf045ea,
272*437bfbebSnyanmisaka     0x3a013afe, 0x53f74ef3, 0x63f351fc, 0x26fa51f3, 0x3afa3ef3, 0x49f03bfe,
273*437bfbebSnyanmisaka     0x56f34cf6, 0x57f653f7, 0x7fea0000, 0x78e77fe7, 0x72ed7fe5, 0x76e775e9,
274*437bfbebSnyanmisaka     0x71e875e6, 0x78e176e4, 0x5ef67cdb, 0x63f666f1, 0x7fce6af3, 0x39115cfb,
275*437bfbebSnyanmisaka     0x5ef356fb, 0x4dfe5bf4, 0x49ff4700, 0x51f94004, 0x390f4005, 0x44004301,
276*437bfbebSnyanmisaka     0x440143f6, 0x40024d00, 0x4efb4400, 0x3b053707, 0x360e4102, 0x3c052c0f,
277*437bfbebSnyanmisaka     0x4cfe4602, 0x460c56ee, 0x46f44005, 0x3805370b, 0x41024500, 0x36054afa,
278*437bfbebSnyanmisaka     0x4cfa3607, 0x4dfe52f5, 0x2a194dfe, 0xf710f311, 0xeb1bf411, 0xd829e225,
279*437bfbebSnyanmisaka     0xd130d72a, 0xd82ee027, 0xd72ecd34, 0xed2bd934, 0xc93d0b20, 0xce3ed238,
280*437bfbebSnyanmisaka     0xec2dbd51, 0x0f1cfe23, 0x01270122, 0x2614111e, 0x360f2d12, 0xf0244f00,
281*437bfbebSnyanmisaka     0xef25f225, 0x0f220120, 0x19180f1d, 0x101f1622, 0x1c1f1223, 0x1c242921,
282*437bfbebSnyanmisaka     0x3e152f1b, 0x1a131f12, 0x17181824, 0x1e18101b, 0x29161d1f, 0x3c102a16,
283*437bfbebSnyanmisaka     0x3c0e340f, 0x7bf04e03, 0x38163515, 0x21153d19, 0x3d113213, 0x4af84efd,
284*437bfbebSnyanmisaka     0x48f648f7, 0x47f44bee, 0x46fb3ff5, 0x48f24bef, 0x35f843f0, 0x34f73bf2,
285*437bfbebSnyanmisaka     0xfe0944f5, 0xfc1ff61e, 0x0721ff21, 0x17250c1f, 0x4014261f, 0x25f947f7,
286*437bfbebSnyanmisaka     0x31f52cf8, 0x3bf438f6, 0x43f73ff8, 0x4ff644fa, 0x4af84efd, 0x48f648f7,
287*437bfbebSnyanmisaka     0x47f44bee, 0x46fb3ff5, 0x48f24bef, 0x35f843f0, 0x34f73bf2, 0xfe0944f5,
288*437bfbebSnyanmisaka     0xfc1ff61e, 0x0721ff21, 0x17250c1f, 0x4014261f, 0x00000000, 0x00000000,
289*437bfbebSnyanmisaka     0x3602f114, 0xf1144a03, 0x4a033602, 0x68e97fe4, 0x36ff35fa, 0x00003307,
290*437bfbebSnyanmisaka     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
291*437bfbebSnyanmisaka     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
292*437bfbebSnyanmisaka     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
293*437bfbebSnyanmisaka     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
294*437bfbebSnyanmisaka     0x3f002900, 0x3f003f00, 0x560453f7, 0x48f96100, 0x3e03290d, 0x37010b00,
295*437bfbebSnyanmisaka     0x7fef4500, 0x520066f3, 0x6beb4af9, 0x7fe17fe5, 0x5fee7fe8, 0x72eb7fe5,
296*437bfbebSnyanmisaka     0x7bef7fe2, 0x7af073f4, 0x3ff473f5, 0x54f144fe, 0x46fd68f3, 0x5af65df8,
297*437bfbebSnyanmisaka     0x4aff7fe2, 0x5bf961fa, 0x38fc7fec, 0x4cf952fb, 0x5df97dea, 0x4dfd57f5,
298*437bfbebSnyanmisaka     0x3ffc47fb, 0x54f444fc, 0x41f93ef9, 0x38053d08, 0x400142fe, 0x4efe3d00,
299*437bfbebSnyanmisaka     0x34073201, 0x2c00230a, 0x2d01260b, 0x2c052e00, 0x3301111f, 0x131c3207,
300*437bfbebSnyanmisaka     0x3e0e2110, 0x64f16cf3, 0x5bf365f3, 0x58f65ef4, 0x56f654f0, 0x57f353f9,
301*437bfbebSnyanmisaka     0x46015eed, 0x4afb4800, 0x66f83b12, 0x5f0064f1, 0x48024bfc, 0x47fd4bf5,
302*437bfbebSnyanmisaka     0x45f32e0f, 0x41003e00, 0x48f12515, 0x36103909, 0x480c3e00, 0x090f0018,
303*437bfbebSnyanmisaka     0x120d1908, 0x130d090f, 0x120c250a, 0x21141d06, 0x2d041e0f, 0x3e003a01,
304*437bfbebSnyanmisaka     0x260c3d07, 0x270f2d0b, 0x2c0d2a0b, 0x290c2d10, 0x221e310a, 0x370a2a12,
305*437bfbebSnyanmisaka     0x2e113311, 0xed1a5900, 0xef1aef16, 0xec1ce71e, 0xe525e921, 0xe428e921,
306*437bfbebSnyanmisaka     0xf521ef26, 0xfa29f128, 0x11290126, 0x031bfa1e, 0xf025161a, 0xf826fc23,
307*437bfbebSnyanmisaka     0x0325fd26, 0x002a0526, 0x16271023, 0x251b300e, 0x440c3c15, 0x47fd6102,
308*437bfbebSnyanmisaka     0x32fb2afa, 0x3efe36fd, 0x3f013a00, 0x4aff48fe, 0x43fb5bf7, 0x27fd1bfb,
309*437bfbebSnyanmisaka     0x2e002cfe, 0x44f840f0, 0x4dfa4ef6, 0x5cf456f6, 0x3cf637f1, 0x41fc3efa,
310*437bfbebSnyanmisaka     0x4cf849f4, 0x58f750f9, 0x61f56eef, 0x4ff554ec, 0x4afc49fa, 0x60f356f3,
311*437bfbebSnyanmisaka     0x75ed61f5, 0x21fb4ef8, 0x35fe30fc, 0x47f33efd, 0x56f44ff6, 0x61f25af3,
312*437bfbebSnyanmisaka     0x5dfa0000, 0x4ff854fa, 0x47ff4200, 0x3cfe3e00, 0x4bfb3bfe, 0x3afc3efd,
313*437bfbebSnyanmisaka     0x4fff42f7, 0x44034700, 0x3ef92c0a, 0x280e240f, 0x1d0c1b10, 0x24142c01,
314*437bfbebSnyanmisaka     0x2a052012, 0x3e0a3001, 0x40092e11, 0x61f568f4, 0x58f960f0, 0x55f955f8,
315*437bfbebSnyanmisaka     0x58f355f7, 0x4dfd4204, 0x4cfa4cfd, 0x4cff3a0a, 0x63f953ff, 0x5f025ff2,
316*437bfbebSnyanmisaka     0x4afb4c00, 0x4bf54600, 0x41004401, 0x3e0349f2, 0x44ff3e04, 0x370b4bf3,
317*437bfbebSnyanmisaka     0x460c4005, 0x1306060f, 0x0e0c1007, 0x0b0d0d12, 0x100f0f0d, 0x170d170c,
318*437bfbebSnyanmisaka     0x1a0e140f, 0x28112c0e, 0x11182f11, 0x16191515, 0x1d161b1f, 0x320e2313,
319*437bfbebSnyanmisaka     0x3f07390a, 0x52fc4dfe, 0x45095efd, 0xdd246df4, 0xe620de24, 0xe02ce225,
320*437bfbebSnyanmisaka     0xf122ee22, 0xf921f128, 0x0021fb23, 0x0d210226, 0x3a0d2317, 0x001afd1d,
321*437bfbebSnyanmisaka     0xf91f1e16, 0xfd22f123, 0xff240322, 0x0b200522, 0x0c220523, 0x1d1e0b27,
322*437bfbebSnyanmisaka     0x271d1a22, 0x151f4213, 0x32191f1f, 0x70ec78ef, 0x55f572ee, 0x59f25cf1,
323*437bfbebSnyanmisaka     0x51f147e6, 0x440050f2, 0x38e846f2, 0x32e844e9, 0xf3174af5, 0xf128f31a,
324*437bfbebSnyanmisaka     0x032cf231, 0x222c062d, 0x52133621, 0x17ff4bfd, 0x2b012201, 0x37fe3600,
325*437bfbebSnyanmisaka     0x40013d00, 0x5cf74400, 0x61f36af2, 0x5af45af1, 0x49f658ee, 0x56f24ff7,
326*437bfbebSnyanmisaka     0x46f649f6, 0x42fb45f6, 0x3afb40f7, 0xf6153b02, 0xf81cf518, 0x031dff1c,
327*437bfbebSnyanmisaka     0x1423091d, 0x430e241d, 0x00000000, 0x00000000
328*437bfbebSnyanmisaka };
329*437bfbebSnyanmisaka 
330*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_deinit(void *hal);
rkv_ver_align(RK_U32 val)331*437bfbebSnyanmisaka static RK_U32 rkv_ver_align(RK_U32 val)
332*437bfbebSnyanmisaka {
333*437bfbebSnyanmisaka     return MPP_ALIGN(val, 16);
334*437bfbebSnyanmisaka }
335*437bfbebSnyanmisaka 
rkv_hor_align(RK_U32 val)336*437bfbebSnyanmisaka static RK_U32 rkv_hor_align(RK_U32 val)
337*437bfbebSnyanmisaka {
338*437bfbebSnyanmisaka     return MPP_ALIGN(val, 16);
339*437bfbebSnyanmisaka }
340*437bfbebSnyanmisaka 
rkv_hor_align_256_odds(RK_U32 val)341*437bfbebSnyanmisaka static RK_U32 rkv_hor_align_256_odds(RK_U32 val)
342*437bfbebSnyanmisaka {
343*437bfbebSnyanmisaka     return (MPP_ALIGN(val, 256) | 256);
344*437bfbebSnyanmisaka }
345*437bfbebSnyanmisaka 
rkv_len_align(RK_U32 val)346*437bfbebSnyanmisaka static RK_U32 rkv_len_align(RK_U32 val)
347*437bfbebSnyanmisaka {
348*437bfbebSnyanmisaka     return (2 * MPP_ALIGN(val, 16));
349*437bfbebSnyanmisaka }
350*437bfbebSnyanmisaka 
rkv_len_align_422(RK_U32 val)351*437bfbebSnyanmisaka static RK_U32 rkv_len_align_422(RK_U32 val)
352*437bfbebSnyanmisaka {
353*437bfbebSnyanmisaka     return ((5 * MPP_ALIGN(val, 16)) / 2);
354*437bfbebSnyanmisaka }
355*437bfbebSnyanmisaka 
prepare_spspps(H264dHalCtx_t * p_hal,RK_U64 * data,RK_U32 len)356*437bfbebSnyanmisaka static MPP_RET prepare_spspps(H264dHalCtx_t *p_hal, RK_U64 *data, RK_U32 len)
357*437bfbebSnyanmisaka {
358*437bfbebSnyanmisaka     RK_S32 i = 0;
359*437bfbebSnyanmisaka     RK_S32 is_long_term = 0, voidx = 0;
360*437bfbebSnyanmisaka     DXVA_PicParams_H264_MVC *pp = p_hal->pp;
361*437bfbebSnyanmisaka     RK_U32 tmp = 0;
362*437bfbebSnyanmisaka     BitputCtx_t bp;
363*437bfbebSnyanmisaka 
364*437bfbebSnyanmisaka     mpp_set_bitput_ctx(&bp, data, len);
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka     if (!p_hal->fast_mode && !pp->spspps_update) {
367*437bfbebSnyanmisaka         bp.index = VDPU382_SPS_PPS_LEN >> 3;
368*437bfbebSnyanmisaka         bp.bitpos = (VDPU382_SPS_PPS_LEN & 0x7) << 3;
369*437bfbebSnyanmisaka     } else {
370*437bfbebSnyanmisaka         //!< sps syntax
371*437bfbebSnyanmisaka         mpp_put_bits(&bp, -1, 13); //!< sps_id 4bit && profile_idc 8bit && constraint_set3_flag 1bit
372*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->chroma_format_idc, 2);
373*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->bit_depth_luma_minus8, 3);
374*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->bit_depth_chroma_minus8, 3);
375*437bfbebSnyanmisaka         mpp_put_bits(&bp, 0, 1);   //!< qpprime_y_zero_transform_bypass_flag
376*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->log2_max_frame_num_minus4, 4);
377*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->num_ref_frames, 5);
378*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->pic_order_cnt_type, 2);
379*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->log2_max_pic_order_cnt_lsb_minus4, 4);
380*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->delta_pic_order_always_zero_flag, 1);
381*437bfbebSnyanmisaka         mpp_put_bits(&bp, (pp->wFrameWidthInMbsMinus1 + 1), 12);
382*437bfbebSnyanmisaka         mpp_put_bits(&bp, (pp->wFrameHeightInMbsMinus1 + 1), 12);
383*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->frame_mbs_only_flag, 1);
384*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->MbaffFrameFlag, 1);
385*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->direct_8x8_inference_flag, 1);
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka         mpp_put_bits(&bp, 1, 1);    //!< mvc_extension_enable
388*437bfbebSnyanmisaka         mpp_put_bits(&bp, (pp->num_views_minus1 + 1), 2);
389*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->view_id[0], 10);
390*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->view_id[1], 10);
391*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->num_anchor_refs_l0[0], 1);
392*437bfbebSnyanmisaka         if (pp->num_anchor_refs_l0[0]) {
393*437bfbebSnyanmisaka             mpp_put_bits(&bp, pp->anchor_ref_l0[0][0], 10);
394*437bfbebSnyanmisaka         } else {
395*437bfbebSnyanmisaka             mpp_put_bits(&bp, 0, 10);
396*437bfbebSnyanmisaka         }
397*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->num_anchor_refs_l1[0], 1);
398*437bfbebSnyanmisaka         if (pp->num_anchor_refs_l1[0]) {
399*437bfbebSnyanmisaka             mpp_put_bits(&bp, pp->anchor_ref_l1[0][0], 10);
400*437bfbebSnyanmisaka         } else {
401*437bfbebSnyanmisaka             mpp_put_bits(&bp, 0, 10); //!< anchor_ref_l1
402*437bfbebSnyanmisaka         }
403*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->num_non_anchor_refs_l0[0], 1);
404*437bfbebSnyanmisaka         if (pp->num_non_anchor_refs_l0[0]) {
405*437bfbebSnyanmisaka             mpp_put_bits(&bp, pp->non_anchor_ref_l0[0][0], 10);
406*437bfbebSnyanmisaka         } else {
407*437bfbebSnyanmisaka             mpp_put_bits(&bp, 0, 10); //!< non_anchor_ref_l0
408*437bfbebSnyanmisaka         }
409*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->num_non_anchor_refs_l1[0], 1);
410*437bfbebSnyanmisaka         if (pp->num_non_anchor_refs_l1[0]) {
411*437bfbebSnyanmisaka             mpp_put_bits(&bp, pp->non_anchor_ref_l1[0][0], 10);
412*437bfbebSnyanmisaka         } else {
413*437bfbebSnyanmisaka             mpp_put_bits(&bp, 0, 10);//!< non_anchor_ref_l1
414*437bfbebSnyanmisaka         }
415*437bfbebSnyanmisaka         mpp_put_align(&bp, 128, 0);
416*437bfbebSnyanmisaka         //!< pps syntax
417*437bfbebSnyanmisaka         mpp_put_bits(&bp, -1, 13); //!< pps_id 8bit && sps_id 5bit
418*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->entropy_coding_mode_flag, 1);
419*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->pic_order_present_flag, 1);
420*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->num_ref_idx_l0_active_minus1, 5);
421*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->num_ref_idx_l1_active_minus1, 5);
422*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->weighted_pred_flag, 1);
423*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->weighted_bipred_idc, 2);
424*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->pic_init_qp_minus26, 7);
425*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->pic_init_qs_minus26, 6);
426*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->chroma_qp_index_offset, 5);
427*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->deblocking_filter_control_present_flag, 1);
428*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->constrained_intra_pred_flag, 1);
429*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->redundant_pic_cnt_present_flag, 1);
430*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->transform_8x8_mode_flag, 1);
431*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->second_chroma_qp_index_offset, 5);
432*437bfbebSnyanmisaka         mpp_put_bits(&bp, pp->scaleing_list_enable_flag, 1);
433*437bfbebSnyanmisaka         mpp_put_bits(&bp, 0, 32);// scanlist buffer has another addr
434*437bfbebSnyanmisaka     }
435*437bfbebSnyanmisaka 
436*437bfbebSnyanmisaka     //!< set dpb
437*437bfbebSnyanmisaka     for (i = 0; i < 16; i++) {
438*437bfbebSnyanmisaka         is_long_term = (pp->RefFrameList[i].bPicEntry != 0xff) ? pp->RefFrameList[i].AssociatedFlag : 0;
439*437bfbebSnyanmisaka         tmp |= (RK_U32)(is_long_term & 0x1) << i;
440*437bfbebSnyanmisaka     }
441*437bfbebSnyanmisaka     for (i = 0; i < 16; i++) {
442*437bfbebSnyanmisaka         voidx = (pp->RefFrameList[i].bPicEntry != 0xff) ? pp->RefPicLayerIdList[i] : 0;
443*437bfbebSnyanmisaka         tmp |= (RK_U32)(voidx & 0x1) << (i + 16);
444*437bfbebSnyanmisaka     }
445*437bfbebSnyanmisaka     mpp_put_bits(&bp, tmp, 32);
446*437bfbebSnyanmisaka     mpp_put_align(&bp, 64, 0);
447*437bfbebSnyanmisaka 
448*437bfbebSnyanmisaka     return MPP_OK;
449*437bfbebSnyanmisaka }
450*437bfbebSnyanmisaka 
prepare_framerps(H264dHalCtx_t * p_hal,RK_U64 * data,RK_U32 len)451*437bfbebSnyanmisaka static MPP_RET prepare_framerps(H264dHalCtx_t *p_hal, RK_U64 *data, RK_U32 len)
452*437bfbebSnyanmisaka {
453*437bfbebSnyanmisaka     RK_S32 i = 0, j = 0;
454*437bfbebSnyanmisaka     RK_S32 dpb_idx = 0, voidx = 0;
455*437bfbebSnyanmisaka     RK_S32 dpb_valid = 0, bottom_flag = 0;
456*437bfbebSnyanmisaka     RK_U32 max_frame_num = 0;
457*437bfbebSnyanmisaka     RK_U16 frame_num_wrap = 0;
458*437bfbebSnyanmisaka     RK_U32 tmp = 0;
459*437bfbebSnyanmisaka 
460*437bfbebSnyanmisaka     BitputCtx_t bp;
461*437bfbebSnyanmisaka     DXVA_PicParams_H264_MVC *pp = p_hal->pp;
462*437bfbebSnyanmisaka 
463*437bfbebSnyanmisaka     mpp_set_bitput_ctx(&bp, data, len);
464*437bfbebSnyanmisaka     mpp_put_align(&bp, 128, 0);
465*437bfbebSnyanmisaka     max_frame_num = 1 << (pp->log2_max_frame_num_minus4 + 4);
466*437bfbebSnyanmisaka     for (i = 0; i < 16; i++) {
467*437bfbebSnyanmisaka         if ((pp->NonExistingFrameFlags >> i) & 0x01) {
468*437bfbebSnyanmisaka             frame_num_wrap = 0;
469*437bfbebSnyanmisaka         } else {
470*437bfbebSnyanmisaka             if (pp->RefFrameList[i].AssociatedFlag) {
471*437bfbebSnyanmisaka                 frame_num_wrap = pp->FrameNumList[i];
472*437bfbebSnyanmisaka             } else {
473*437bfbebSnyanmisaka                 frame_num_wrap = (pp->FrameNumList[i] > pp->frame_num) ?
474*437bfbebSnyanmisaka                                  (pp->FrameNumList[i] - max_frame_num) : pp->FrameNumList[i];
475*437bfbebSnyanmisaka             }
476*437bfbebSnyanmisaka         }
477*437bfbebSnyanmisaka 
478*437bfbebSnyanmisaka         mpp_put_bits(&bp, frame_num_wrap, 16);
479*437bfbebSnyanmisaka     }
480*437bfbebSnyanmisaka 
481*437bfbebSnyanmisaka     mpp_put_bits(&bp, 0, 16);//!< NULL
482*437bfbebSnyanmisaka     tmp = 0;
483*437bfbebSnyanmisaka     for (i = 0; i < 16; i++) {
484*437bfbebSnyanmisaka         tmp |= (RK_U32)pp->RefPicLayerIdList[i] << i;
485*437bfbebSnyanmisaka     }
486*437bfbebSnyanmisaka     mpp_put_bits(&bp, tmp, 16);
487*437bfbebSnyanmisaka 
488*437bfbebSnyanmisaka     for (i = 0; i < 32; i++) {
489*437bfbebSnyanmisaka         tmp = 0;
490*437bfbebSnyanmisaka         dpb_valid = (p_hal->slice_long[0].RefPicList[0][i].bPicEntry == 0xff) ? 0 : 1;
491*437bfbebSnyanmisaka         dpb_idx = dpb_valid ? p_hal->slice_long[0].RefPicList[0][i].Index7Bits : 0;
492*437bfbebSnyanmisaka         bottom_flag = dpb_valid ? p_hal->slice_long[0].RefPicList[0][i].AssociatedFlag : 0;
493*437bfbebSnyanmisaka         voidx = dpb_valid ? pp->RefPicLayerIdList[dpb_idx] : 0;
494*437bfbebSnyanmisaka         tmp |= (RK_U32)(dpb_idx | (dpb_valid << 4)) & 0x1f;
495*437bfbebSnyanmisaka         tmp |= (RK_U32)(bottom_flag & 0x1) << 5;
496*437bfbebSnyanmisaka         tmp |= (RK_U32)(voidx & 0x1) << 6;
497*437bfbebSnyanmisaka         mpp_put_bits(&bp, tmp, 7);
498*437bfbebSnyanmisaka     }
499*437bfbebSnyanmisaka     for (j = 1; j < 3; j++) {
500*437bfbebSnyanmisaka         for (i = 0; i < 32; i++) {
501*437bfbebSnyanmisaka             tmp = 0;
502*437bfbebSnyanmisaka             dpb_valid = (p_hal->slice_long[0].RefPicList[j][i].bPicEntry == 0xff) ? 0 : 1;
503*437bfbebSnyanmisaka             dpb_idx = dpb_valid ? p_hal->slice_long[0].RefPicList[j][i].Index7Bits : 0;
504*437bfbebSnyanmisaka             bottom_flag = dpb_valid ? p_hal->slice_long[0].RefPicList[j][i].AssociatedFlag : 0;
505*437bfbebSnyanmisaka             voidx = dpb_valid ? pp->RefPicLayerIdList[dpb_idx] : 0;
506*437bfbebSnyanmisaka             tmp |= (RK_U32)(dpb_idx | (dpb_valid << 4)) & 0x1f;
507*437bfbebSnyanmisaka             tmp |= (RK_U32)(bottom_flag & 0x1) << 5;
508*437bfbebSnyanmisaka             tmp |= (RK_U32)(voidx & 0x1) << 6;
509*437bfbebSnyanmisaka             mpp_put_bits(&bp, tmp, 7);
510*437bfbebSnyanmisaka         }
511*437bfbebSnyanmisaka     }
512*437bfbebSnyanmisaka     mpp_put_align(&bp, 128, 0);
513*437bfbebSnyanmisaka 
514*437bfbebSnyanmisaka     return MPP_OK;
515*437bfbebSnyanmisaka }
516*437bfbebSnyanmisaka 
prepare_scanlist(H264dHalCtx_t * p_hal,RK_U8 * data,RK_U32 len)517*437bfbebSnyanmisaka static MPP_RET prepare_scanlist(H264dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
518*437bfbebSnyanmisaka {
519*437bfbebSnyanmisaka     RK_U32 i = 0, j = 0, n = 0;
520*437bfbebSnyanmisaka 
521*437bfbebSnyanmisaka     if (p_hal->pp->scaleing_list_enable_flag) {
522*437bfbebSnyanmisaka         for (i = 0; i < 6; i++) { //!< 4x4, 6 lists
523*437bfbebSnyanmisaka             for (j = 0; j < 16; j++) {
524*437bfbebSnyanmisaka                 data[n++] = p_hal->qm->bScalingLists4x4[i][j];
525*437bfbebSnyanmisaka             }
526*437bfbebSnyanmisaka         }
527*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) { //!< 8x8, 2 lists
528*437bfbebSnyanmisaka             for (j = 0; j < 64; j++) {
529*437bfbebSnyanmisaka                 data[n++] = p_hal->qm->bScalingLists8x8[i][j];
530*437bfbebSnyanmisaka             }
531*437bfbebSnyanmisaka         }
532*437bfbebSnyanmisaka     }
533*437bfbebSnyanmisaka     mpp_assert(n <= len);
534*437bfbebSnyanmisaka 
535*437bfbebSnyanmisaka     return MPP_OK;
536*437bfbebSnyanmisaka }
537*437bfbebSnyanmisaka 
set_registers(H264dHalCtx_t * p_hal,Vdpu382H264dRegSet * regs,HalTaskInfo * task)538*437bfbebSnyanmisaka static MPP_RET set_registers(H264dHalCtx_t *p_hal, Vdpu382H264dRegSet *regs, HalTaskInfo *task)
539*437bfbebSnyanmisaka {
540*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
541*437bfbebSnyanmisaka     DXVA_PicParams_H264_MVC *pp = p_hal->pp;
542*437bfbebSnyanmisaka     Vdpu382RegCommon *common = &regs->common;
543*437bfbebSnyanmisaka     HalBuf *mv_buf = NULL;
544*437bfbebSnyanmisaka 
545*437bfbebSnyanmisaka     // memset(regs, 0, sizeof(Vdpu382H264dRegSet));
546*437bfbebSnyanmisaka     memset(&regs->h264d_highpoc, 0, sizeof(regs->h264d_highpoc));
547*437bfbebSnyanmisaka     common->reg016_str_len = p_hal->strm_len;
548*437bfbebSnyanmisaka     common->reg013.cur_pic_is_idr = p_hal->slice_long->idr_flag;
549*437bfbebSnyanmisaka     common->reg012.colmv_compress_en =
550*437bfbebSnyanmisaka         (p_hal->hw_info && p_hal->hw_info->cap_colmv_compress && pp->frame_mbs_only_flag) ? 1 : 0;
551*437bfbebSnyanmisaka     common->reg012.info_collect_en = 1;
552*437bfbebSnyanmisaka     common->reg013.h26x_error_mode = ctx->err_ref_hack ? 0 : 1;
553*437bfbebSnyanmisaka 
554*437bfbebSnyanmisaka     //!< caculate the yuv_frame_size
555*437bfbebSnyanmisaka     {
556*437bfbebSnyanmisaka         MppFrame mframe = NULL;
557*437bfbebSnyanmisaka         RK_U32 hor_virstride = 0;
558*437bfbebSnyanmisaka         RK_U32 ver_virstride = 0;
559*437bfbebSnyanmisaka         RK_U32 y_virstride = 0;
560*437bfbebSnyanmisaka 
561*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p_hal->frame_slots, pp->CurrPic.Index7Bits, SLOT_FRAME_PTR, &mframe);
562*437bfbebSnyanmisaka         hor_virstride = mpp_frame_get_hor_stride(mframe);
563*437bfbebSnyanmisaka         ver_virstride = mpp_frame_get_ver_stride(mframe);
564*437bfbebSnyanmisaka         y_virstride = hor_virstride * ver_virstride;
565*437bfbebSnyanmisaka 
566*437bfbebSnyanmisaka         if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(mframe))) {
567*437bfbebSnyanmisaka             RK_U32 fbc_hdr_stride = mpp_frame_get_fbc_hdr_stride(mframe);
568*437bfbebSnyanmisaka             RK_U32 fbd_offset = MPP_ALIGN(fbc_hdr_stride * (ver_virstride + 16) / 16, SZ_4K);
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka             common->reg012.fbc_e = 1;
571*437bfbebSnyanmisaka             common->reg018.y_hor_virstride = fbc_hdr_stride / 16;
572*437bfbebSnyanmisaka             common->reg019.uv_hor_virstride = fbc_hdr_stride / 16;
573*437bfbebSnyanmisaka             common->reg020_fbc_payload_off.payload_st_offset = fbd_offset >> 4;
574*437bfbebSnyanmisaka         } else {
575*437bfbebSnyanmisaka             common->reg012.fbc_e = 0;
576*437bfbebSnyanmisaka             common->reg018.y_hor_virstride = hor_virstride / 16;
577*437bfbebSnyanmisaka             common->reg019.uv_hor_virstride = hor_virstride / 16;
578*437bfbebSnyanmisaka             common->reg020_y_virstride.y_virstride = y_virstride / 16;
579*437bfbebSnyanmisaka         }
580*437bfbebSnyanmisaka     }
581*437bfbebSnyanmisaka     //!< set current
582*437bfbebSnyanmisaka     {
583*437bfbebSnyanmisaka         MppBuffer mbuffer = NULL;
584*437bfbebSnyanmisaka         RK_S32 fd = -1;
585*437bfbebSnyanmisaka 
586*437bfbebSnyanmisaka         regs->h264d_param.reg65.cur_top_poc = pp->CurrFieldOrderCnt[0];
587*437bfbebSnyanmisaka         regs->h264d_param.reg66.cur_bot_poc = pp->CurrFieldOrderCnt[1];
588*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p_hal->frame_slots, pp->CurrPic.Index7Bits, SLOT_BUFFER, &mbuffer);
589*437bfbebSnyanmisaka         fd = mpp_buffer_get_fd(mbuffer);
590*437bfbebSnyanmisaka         regs->common_addr.reg130_decout_base = fd;
591*437bfbebSnyanmisaka 
592*437bfbebSnyanmisaka         //colmv_cur_base
593*437bfbebSnyanmisaka         mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, pp->CurrPic.Index7Bits);
594*437bfbebSnyanmisaka         regs->common_addr.reg131_colmv_cur_base = mpp_buffer_get_fd(mv_buf->buf[0]);
595*437bfbebSnyanmisaka         regs->common_addr.reg132_error_ref_base = fd;
596*437bfbebSnyanmisaka         if (pp->field_pic_flag)
597*437bfbebSnyanmisaka             regs->h264d_highpoc.reg204.cur_poc_highbit = 1 << pp->CurrPic.AssociatedFlag; // top:1 bot:2
598*437bfbebSnyanmisaka         else
599*437bfbebSnyanmisaka             regs->h264d_highpoc.reg204.cur_poc_highbit = 0; // frame
600*437bfbebSnyanmisaka     }
601*437bfbebSnyanmisaka     //!< set reference
602*437bfbebSnyanmisaka     {
603*437bfbebSnyanmisaka         RK_S32 i = 0;
604*437bfbebSnyanmisaka         RK_S32 ref_index = -1;
605*437bfbebSnyanmisaka         RK_S32 near_index = -1;
606*437bfbebSnyanmisaka         MppBuffer mbuffer = NULL;
607*437bfbebSnyanmisaka         RK_U32 min_frame_num  = 0;
608*437bfbebSnyanmisaka         MppFrame mframe = NULL;
609*437bfbebSnyanmisaka 
610*437bfbebSnyanmisaka         task->dec.flags.ref_miss = 0;
611*437bfbebSnyanmisaka 
612*437bfbebSnyanmisaka         for (i = 0; i <= 15; i++) {
613*437bfbebSnyanmisaka             RK_U32 field_flag = (pp->RefPicFiledFlags >> i) & 0x01;
614*437bfbebSnyanmisaka             RK_U32 top_used = (pp->UsedForReferenceFlags >> (2 * i + 0)) & 0x01;
615*437bfbebSnyanmisaka             RK_U32 bot_used = (pp->UsedForReferenceFlags >> (2 * i + 1)) & 0x01;
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka             regs->h264d_param.reg67_98_ref_poc[2 * i] = pp->FieldOrderCntList[i][0];
618*437bfbebSnyanmisaka             regs->h264d_param.reg67_98_ref_poc[2 * i + 1] = pp->FieldOrderCntList[i][1];
619*437bfbebSnyanmisaka             SET_REF_INFO(regs->h264d_param, i, field, field_flag);
620*437bfbebSnyanmisaka             SET_REF_INFO(regs->h264d_param, i, topfield_used, top_used);
621*437bfbebSnyanmisaka             SET_REF_INFO(regs->h264d_param, i, botfield_used, bot_used);
622*437bfbebSnyanmisaka             SET_REF_INFO(regs->h264d_param, i, colmv_use_flag, (pp->RefPicColmvUsedFlags >> i) & 0x01);
623*437bfbebSnyanmisaka 
624*437bfbebSnyanmisaka             if (pp->RefFrameList[i].bPicEntry != 0xff) {
625*437bfbebSnyanmisaka                 ref_index = pp->RefFrameList[i].Index7Bits;
626*437bfbebSnyanmisaka                 near_index = pp->RefFrameList[i].Index7Bits;
627*437bfbebSnyanmisaka             } else {
628*437bfbebSnyanmisaka                 ref_index = (near_index < 0) ? pp->CurrPic.Index7Bits : near_index;
629*437bfbebSnyanmisaka                 task->dec.flags.ref_miss |= (1 << i);
630*437bfbebSnyanmisaka             }
631*437bfbebSnyanmisaka             /* mark 3 to differ from current frame */
632*437bfbebSnyanmisaka             if (ref_index == pp->CurrPic.Index7Bits) {
633*437bfbebSnyanmisaka                 SET_POC_HIGNBIT_INFO(regs->h264d_highpoc, 2 * i, poc_highbit, 3);
634*437bfbebSnyanmisaka                 SET_POC_HIGNBIT_INFO(regs->h264d_highpoc, 2 * i + 1, poc_highbit, 3);
635*437bfbebSnyanmisaka             }
636*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(p_hal->frame_slots, ref_index, SLOT_BUFFER, &mbuffer);
637*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(p_hal->frame_slots, ref_index, SLOT_FRAME_PTR, &mframe);
638*437bfbebSnyanmisaka 
639*437bfbebSnyanmisaka             if (pp->FrameNumList[i] < pp->frame_num &&
640*437bfbebSnyanmisaka                 pp->FrameNumList[i] > min_frame_num &&
641*437bfbebSnyanmisaka                 (!mpp_frame_get_errinfo(mframe))) {
642*437bfbebSnyanmisaka                 min_frame_num = pp->FrameNumList[i];
643*437bfbebSnyanmisaka                 regs->common_addr.reg132_error_ref_base =  mpp_buffer_get_fd(mbuffer);
644*437bfbebSnyanmisaka                 common->reg021.error_intra_mode = 0;
645*437bfbebSnyanmisaka             }
646*437bfbebSnyanmisaka 
647*437bfbebSnyanmisaka             RK_S32 fd = mpp_buffer_get_fd(mbuffer);
648*437bfbebSnyanmisaka             /*
649*437bfbebSnyanmisaka              * if ref is err frame, set fd = 0,
650*437bfbebSnyanmisaka              * in order for trigger pagefault if the cur frame use the err ref.
651*437bfbebSnyanmisaka              * This makes it possible to accurately identify whether an err ref
652*437bfbebSnyanmisaka              * frame is being used.
653*437bfbebSnyanmisaka              */
654*437bfbebSnyanmisaka             if (ctx->err_ref_hack && mpp_frame_get_errinfo(mframe)) {
655*437bfbebSnyanmisaka                 regs->h264d_param.reg67_98_ref_poc[2 * i] = 0;
656*437bfbebSnyanmisaka                 regs->h264d_param.reg67_98_ref_poc[2 * i + 1] = 0;
657*437bfbebSnyanmisaka                 fd = 0;
658*437bfbebSnyanmisaka             }
659*437bfbebSnyanmisaka             regs->h264d_addr.ref_base[i] = fd;
660*437bfbebSnyanmisaka             mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, ref_index);
661*437bfbebSnyanmisaka             regs->h264d_addr.colmv_base[i] = mpp_buffer_get_fd(mv_buf->buf[0]);
662*437bfbebSnyanmisaka 
663*437bfbebSnyanmisaka         }
664*437bfbebSnyanmisaka     }
665*437bfbebSnyanmisaka     {
666*437bfbebSnyanmisaka         MppBuffer mbuffer = NULL;
667*437bfbebSnyanmisaka         Vdpu382H264dRegCtx *reg_ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
668*437bfbebSnyanmisaka 
669*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p_hal->packet_slots, task->dec.input, SLOT_BUFFER, &mbuffer);
670*437bfbebSnyanmisaka         regs->common_addr.reg128_rlc_base = mpp_buffer_get_fd(mbuffer);
671*437bfbebSnyanmisaka         regs->common_addr.reg129_rlcwrite_base = regs->common_addr.reg128_rlc_base;
672*437bfbebSnyanmisaka 
673*437bfbebSnyanmisaka         regs->h264d_addr.cabactbl_base = reg_ctx->bufs_fd;
674*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 197, reg_ctx->offset_cabac);
675*437bfbebSnyanmisaka     }
676*437bfbebSnyanmisaka 
677*437bfbebSnyanmisaka     return MPP_OK;
678*437bfbebSnyanmisaka }
679*437bfbebSnyanmisaka 
init_common_regs(Vdpu382H264dRegSet * regs)680*437bfbebSnyanmisaka static MPP_RET init_common_regs(Vdpu382H264dRegSet *regs)
681*437bfbebSnyanmisaka {
682*437bfbebSnyanmisaka     Vdpu382RegCommon *common = &regs->common;
683*437bfbebSnyanmisaka     Vdpu382H264dHighPoc_t *highpoc = &regs->h264d_highpoc;
684*437bfbebSnyanmisaka 
685*437bfbebSnyanmisaka     common->reg009.dec_mode = 1;  //!< h264
686*437bfbebSnyanmisaka     common->reg015.rlc_mode = 0;
687*437bfbebSnyanmisaka 
688*437bfbebSnyanmisaka     common->reg011.buf_empty_en = 1;
689*437bfbebSnyanmisaka     common->reg011.err_head_fill_e = 1;
690*437bfbebSnyanmisaka     common->reg011.err_colmv_fill_e = 1;
691*437bfbebSnyanmisaka 
692*437bfbebSnyanmisaka     common->reg010.dec_e = 1;
693*437bfbebSnyanmisaka     common->reg017.slice_num = 0x3fff;
694*437bfbebSnyanmisaka 
695*437bfbebSnyanmisaka     common->reg013.h26x_error_mode = 1;
696*437bfbebSnyanmisaka     common->reg013.strmd_zero_rm_en = 1;
697*437bfbebSnyanmisaka 
698*437bfbebSnyanmisaka     common->reg021.error_deb_en = 1;
699*437bfbebSnyanmisaka     common->reg021.inter_error_prc_mode = 0;
700*437bfbebSnyanmisaka     common->reg021.error_intra_mode = 1;
701*437bfbebSnyanmisaka 
702*437bfbebSnyanmisaka     common->reg024.cabac_err_en_lowbits = 0xffffffff;
703*437bfbebSnyanmisaka     common->reg025.cabac_err_en_highbits = 0x3ff3ffff;
704*437bfbebSnyanmisaka 
705*437bfbebSnyanmisaka     common->reg026.inter_auto_gating_e = 1;
706*437bfbebSnyanmisaka     common->reg026.filterd_auto_gating_e = 1;
707*437bfbebSnyanmisaka     common->reg026.strmd_auto_gating_e = 1;
708*437bfbebSnyanmisaka     common->reg026.mcp_auto_gating_e = 1;
709*437bfbebSnyanmisaka     common->reg026.busifd_auto_gating_e = 1;
710*437bfbebSnyanmisaka     common->reg026.dec_ctrl_auto_gating_e = 1;
711*437bfbebSnyanmisaka     common->reg026.intra_auto_gating_e = 1;
712*437bfbebSnyanmisaka     common->reg026.mc_auto_gating_e = 1;
713*437bfbebSnyanmisaka     common->reg026.transd_auto_gating_e = 1;
714*437bfbebSnyanmisaka     common->reg026.sram_auto_gating_e = 1;
715*437bfbebSnyanmisaka     common->reg026.cru_auto_gating_e = 1;
716*437bfbebSnyanmisaka     common->reg026.reg_cfg_gating_en = 1;
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka     common->reg032_timeout_threshold = 0x3ffff;
719*437bfbebSnyanmisaka 
720*437bfbebSnyanmisaka     common->reg011.dec_clkgate_e = 1;
721*437bfbebSnyanmisaka 
722*437bfbebSnyanmisaka     //highpoc_t205
723*437bfbebSnyanmisaka     memset(&highpoc->reg205, 0, sizeof(RK_U32));
724*437bfbebSnyanmisaka 
725*437bfbebSnyanmisaka 
726*437bfbebSnyanmisaka     return MPP_OK;
727*437bfbebSnyanmisaka }
728*437bfbebSnyanmisaka 
vdpu382_h264d_init(void * hal,MppHalCfg * cfg)729*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_init(void *hal, MppHalCfg *cfg)
730*437bfbebSnyanmisaka {
731*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
732*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
733*437bfbebSnyanmisaka 
734*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
735*437bfbebSnyanmisaka 
736*437bfbebSnyanmisaka     MEM_CHECK(ret, p_hal->reg_ctx = mpp_calloc_size(void, sizeof(Vdpu382H264dRegCtx)));
737*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *reg_ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
738*437bfbebSnyanmisaka     RK_U32 max_cnt = p_hal->fast_mode ? VDPU382_FAST_REG_SET_CNT : 1;
739*437bfbebSnyanmisaka     RK_U32 i = 0;
740*437bfbebSnyanmisaka 
741*437bfbebSnyanmisaka     //!< malloc buffers
742*437bfbebSnyanmisaka     FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group, &reg_ctx->bufs,
743*437bfbebSnyanmisaka                                    VDPU382_INFO_BUFFER_SIZE(max_cnt)));
744*437bfbebSnyanmisaka     reg_ctx->bufs_fd = mpp_buffer_get_fd(reg_ctx->bufs);
745*437bfbebSnyanmisaka     reg_ctx->bufs_ptr = mpp_buffer_get_ptr(reg_ctx->bufs);
746*437bfbebSnyanmisaka     reg_ctx->offset_cabac = VDPU382_CABAC_TAB_OFFSET;
747*437bfbebSnyanmisaka     reg_ctx->offset_errinfo = VDPU382_ERROR_INFO_OFFSET;
748*437bfbebSnyanmisaka     for (i = 0; i < max_cnt; i++) {
749*437bfbebSnyanmisaka         reg_ctx->reg_buf[i].regs = mpp_calloc(Vdpu382H264dRegSet, 1);
750*437bfbebSnyanmisaka         init_common_regs(reg_ctx->reg_buf[i].regs);
751*437bfbebSnyanmisaka         reg_ctx->offset_spspps[i] = VDPU382_SPSPPS_OFFSET(i);
752*437bfbebSnyanmisaka         reg_ctx->offset_rps[i] = VDPU382_RPS_OFFSET(i);
753*437bfbebSnyanmisaka         reg_ctx->offset_sclst[i] = VDPU382_SCALING_LIST_OFFSET(i);
754*437bfbebSnyanmisaka     }
755*437bfbebSnyanmisaka 
756*437bfbebSnyanmisaka     if (!p_hal->fast_mode) {
757*437bfbebSnyanmisaka         reg_ctx->regs = reg_ctx->reg_buf[0].regs;
758*437bfbebSnyanmisaka         reg_ctx->spspps_offset = reg_ctx->offset_spspps[0];
759*437bfbebSnyanmisaka         reg_ctx->rps_offset = reg_ctx->offset_rps[0];
760*437bfbebSnyanmisaka         reg_ctx->sclst_offset = reg_ctx->offset_sclst[0];
761*437bfbebSnyanmisaka     }
762*437bfbebSnyanmisaka 
763*437bfbebSnyanmisaka     //!< copy cabac table bytes
764*437bfbebSnyanmisaka     memcpy((char *)reg_ctx->bufs_ptr + reg_ctx->offset_cabac,
765*437bfbebSnyanmisaka            (void *)rkv_cabac_table_v382, sizeof(rkv_cabac_table_v382));
766*437bfbebSnyanmisaka 
767*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->frame_slots, SLOTS_HOR_ALIGN, rkv_hor_align);
768*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->frame_slots, SLOTS_VER_ALIGN, rkv_ver_align);
769*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->frame_slots, SLOTS_LEN_ALIGN, rkv_len_align);
770*437bfbebSnyanmisaka 
771*437bfbebSnyanmisaka     {
772*437bfbebSnyanmisaka         /* check kernel support err ref hack process */
773*437bfbebSnyanmisaka         const MppServiceCmdCap *cap = mpp_get_mpp_service_cmd_cap();
774*437bfbebSnyanmisaka 
775*437bfbebSnyanmisaka         reg_ctx->err_ref_hack = cap->ctrl_cmd > MPP_CMD_SET_ERR_REF_HACK;
776*437bfbebSnyanmisaka         if (reg_ctx->err_ref_hack)
777*437bfbebSnyanmisaka             mpp_dev_ioctl(p_hal->dev, MPP_DEV_SET_ERR_REF_HACK, &reg_ctx->err_ref_hack);
778*437bfbebSnyanmisaka     }
779*437bfbebSnyanmisaka     if (cfg->hal_fbc_adj_cfg) {
780*437bfbebSnyanmisaka         cfg->hal_fbc_adj_cfg->func = vdpu382_afbc_align_calc;
781*437bfbebSnyanmisaka         cfg->hal_fbc_adj_cfg->expand = 16;
782*437bfbebSnyanmisaka     }
783*437bfbebSnyanmisaka 
784*437bfbebSnyanmisaka __RETURN:
785*437bfbebSnyanmisaka     return MPP_OK;
786*437bfbebSnyanmisaka __FAILED:
787*437bfbebSnyanmisaka     vdpu382_h264d_deinit(hal);
788*437bfbebSnyanmisaka 
789*437bfbebSnyanmisaka     return ret;
790*437bfbebSnyanmisaka }
791*437bfbebSnyanmisaka 
vdpu382_h264d_deinit(void * hal)792*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_deinit(void *hal)
793*437bfbebSnyanmisaka {
794*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
795*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *reg_ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
796*437bfbebSnyanmisaka 
797*437bfbebSnyanmisaka     RK_U32 i = 0;
798*437bfbebSnyanmisaka     RK_U32 loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
799*437bfbebSnyanmisaka 
800*437bfbebSnyanmisaka     mpp_buffer_put(reg_ctx->bufs);
801*437bfbebSnyanmisaka 
802*437bfbebSnyanmisaka     for (i = 0; i < loop; i++)
803*437bfbebSnyanmisaka         MPP_FREE(reg_ctx->reg_buf[i].regs);
804*437bfbebSnyanmisaka 
805*437bfbebSnyanmisaka     loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->rcb_buf) : 1;
806*437bfbebSnyanmisaka     for (i = 0; i < loop; i++) {
807*437bfbebSnyanmisaka         if (reg_ctx->rcb_buf[i]) {
808*437bfbebSnyanmisaka             mpp_buffer_put(reg_ctx->rcb_buf[i]);
809*437bfbebSnyanmisaka             reg_ctx->rcb_buf[i] = NULL;
810*437bfbebSnyanmisaka         }
811*437bfbebSnyanmisaka     }
812*437bfbebSnyanmisaka 
813*437bfbebSnyanmisaka     if (p_hal->cmv_bufs) {
814*437bfbebSnyanmisaka         hal_bufs_deinit(p_hal->cmv_bufs);
815*437bfbebSnyanmisaka         p_hal->cmv_bufs = NULL;
816*437bfbebSnyanmisaka     }
817*437bfbebSnyanmisaka 
818*437bfbebSnyanmisaka     MPP_FREE(p_hal->reg_ctx);
819*437bfbebSnyanmisaka 
820*437bfbebSnyanmisaka     return MPP_OK;
821*437bfbebSnyanmisaka }
822*437bfbebSnyanmisaka 
h264d_refine_rcb_size(H264dHalCtx_t * p_hal,Vdpu382RcbInfo * rcb_info,Vdpu382H264dRegSet * regs,RK_S32 width,RK_S32 height)823*437bfbebSnyanmisaka static void h264d_refine_rcb_size(H264dHalCtx_t *p_hal, Vdpu382RcbInfo *rcb_info,
824*437bfbebSnyanmisaka                                   Vdpu382H264dRegSet *regs,
825*437bfbebSnyanmisaka                                   RK_S32 width, RK_S32 height)
826*437bfbebSnyanmisaka {
827*437bfbebSnyanmisaka     RK_U32 rcb_bits = 0;
828*437bfbebSnyanmisaka     RK_U32 mbaff = p_hal->pp->MbaffFrameFlag;
829*437bfbebSnyanmisaka     RK_U32 bit_depth = p_hal->pp->bit_depth_luma_minus8 + 8;
830*437bfbebSnyanmisaka     RK_U32 chroma_format_idc = p_hal->pp->chroma_format_idc;
831*437bfbebSnyanmisaka 
832*437bfbebSnyanmisaka     width = MPP_ALIGN(width, H264_CTU_SIZE);
833*437bfbebSnyanmisaka     height = MPP_ALIGN(height, H264_CTU_SIZE);
834*437bfbebSnyanmisaka 
835*437bfbebSnyanmisaka     /* RCB_STRMD_ROW */
836*437bfbebSnyanmisaka     if (width >= 4096)
837*437bfbebSnyanmisaka         rcb_bits = ((width + 15) / 16) * 154 * (mbaff ? 2 : 1);
838*437bfbebSnyanmisaka     else
839*437bfbebSnyanmisaka         rcb_bits = 0;
840*437bfbebSnyanmisaka     rcb_info[RCB_STRMD_ROW].size = MPP_RCB_BYTES(rcb_bits);
841*437bfbebSnyanmisaka 
842*437bfbebSnyanmisaka     /* RCB_TRANSD_ROW */
843*437bfbebSnyanmisaka     if (width >= 8192)
844*437bfbebSnyanmisaka         rcb_bits = ((width - 8192 + 3) / 4) * 2;
845*437bfbebSnyanmisaka     else
846*437bfbebSnyanmisaka         rcb_bits = 0;
847*437bfbebSnyanmisaka     rcb_info[RCB_TRANSD_ROW].size = MPP_RCB_BYTES(rcb_bits);
848*437bfbebSnyanmisaka 
849*437bfbebSnyanmisaka     /* RCB_TRANSD_COL */
850*437bfbebSnyanmisaka     rcb_info[RCB_TRANSD_COL].size = 0;
851*437bfbebSnyanmisaka 
852*437bfbebSnyanmisaka     /* RCB_INTER_ROW */
853*437bfbebSnyanmisaka     rcb_bits = width * 42;
854*437bfbebSnyanmisaka     rcb_info[RCB_INTER_ROW].size = MPP_RCB_BYTES(rcb_bits);
855*437bfbebSnyanmisaka 
856*437bfbebSnyanmisaka     /* RCB_INTER_COL */
857*437bfbebSnyanmisaka     rcb_info[RCB_INTER_COL].size = 0;
858*437bfbebSnyanmisaka 
859*437bfbebSnyanmisaka     /* RCB_INTRA_ROW */
860*437bfbebSnyanmisaka     if (mbaff)
861*437bfbebSnyanmisaka         rcb_bits = width * 44;
862*437bfbebSnyanmisaka     else
863*437bfbebSnyanmisaka         rcb_bits = width *  ((chroma_format_idc ? 1 : 0) + 1) * 11;
864*437bfbebSnyanmisaka     rcb_info[RCB_INTRA_ROW].size = MPP_RCB_BYTES(rcb_bits);
865*437bfbebSnyanmisaka 
866*437bfbebSnyanmisaka     /* RCB_DBLK_ROW */
867*437bfbebSnyanmisaka     rcb_bits = width * (2 + (mbaff ? 12 : 6) * bit_depth);
868*437bfbebSnyanmisaka     rcb_info[RCB_DBLK_ROW].size = MPP_RCB_BYTES(rcb_bits);
869*437bfbebSnyanmisaka 
870*437bfbebSnyanmisaka     /* RCB_SAO_ROW */
871*437bfbebSnyanmisaka     rcb_info[RCB_SAO_ROW].size = 0;
872*437bfbebSnyanmisaka 
873*437bfbebSnyanmisaka     /* RCB_FBC_ROW */
874*437bfbebSnyanmisaka     if (regs->common.reg012.fbc_e) {
875*437bfbebSnyanmisaka         rcb_bits = (chroma_format_idc > 1) ? (2 * width * bit_depth) : 0;
876*437bfbebSnyanmisaka     } else
877*437bfbebSnyanmisaka         rcb_bits = 0;
878*437bfbebSnyanmisaka     rcb_info[RCB_FBC_ROW].size = MPP_RCB_BYTES(rcb_bits);
879*437bfbebSnyanmisaka 
880*437bfbebSnyanmisaka     /* RCB_FILT_COL */
881*437bfbebSnyanmisaka     rcb_info[RCB_FILT_COL].size = 0;
882*437bfbebSnyanmisaka }
883*437bfbebSnyanmisaka 
hal_h264d_rcb_info_update(void * hal,Vdpu382H264dRegSet * regs)884*437bfbebSnyanmisaka static void hal_h264d_rcb_info_update(void *hal, Vdpu382H264dRegSet *regs)
885*437bfbebSnyanmisaka {
886*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t*)hal;
887*437bfbebSnyanmisaka     RK_U32 mbaff = p_hal->pp->MbaffFrameFlag;
888*437bfbebSnyanmisaka     RK_U32 bit_depth = p_hal->pp->bit_depth_luma_minus8 + 8;
889*437bfbebSnyanmisaka     RK_U32 chroma_format_idc = p_hal->pp->chroma_format_idc;
890*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
891*437bfbebSnyanmisaka     RK_S32 width = MPP_ALIGN((p_hal->pp->wFrameWidthInMbsMinus1 + 1) << 4, 64);
892*437bfbebSnyanmisaka     RK_S32 height = MPP_ALIGN((p_hal->pp->wFrameHeightInMbsMinus1 + 1) << 4, 64);
893*437bfbebSnyanmisaka 
894*437bfbebSnyanmisaka     if ( ctx->bit_depth != bit_depth ||
895*437bfbebSnyanmisaka          ctx->chroma_format_idc != chroma_format_idc ||
896*437bfbebSnyanmisaka          ctx->mbaff != mbaff ||
897*437bfbebSnyanmisaka          ctx->width != width ||
898*437bfbebSnyanmisaka          ctx->height != height) {
899*437bfbebSnyanmisaka         RK_U32 i;
900*437bfbebSnyanmisaka         RK_U32 loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(ctx->reg_buf) : 1;
901*437bfbebSnyanmisaka 
902*437bfbebSnyanmisaka         ctx->rcb_buf_size = vdpu382_get_rcb_buf_size(ctx->rcb_info, width, height);
903*437bfbebSnyanmisaka         h264d_refine_rcb_size(hal, ctx->rcb_info, regs, width, height);
904*437bfbebSnyanmisaka         for (i = 0; i < loop; i++) {
905*437bfbebSnyanmisaka             MppBuffer rcb_buf = ctx->rcb_buf[i];
906*437bfbebSnyanmisaka 
907*437bfbebSnyanmisaka             if (rcb_buf) {
908*437bfbebSnyanmisaka                 mpp_buffer_put(rcb_buf);
909*437bfbebSnyanmisaka                 ctx->rcb_buf[i] = NULL;
910*437bfbebSnyanmisaka             }
911*437bfbebSnyanmisaka             mpp_buffer_get(p_hal->buf_group, &rcb_buf, ctx->rcb_buf_size);
912*437bfbebSnyanmisaka             ctx->rcb_buf[i] = rcb_buf;
913*437bfbebSnyanmisaka         }
914*437bfbebSnyanmisaka         ctx->bit_depth      = bit_depth;
915*437bfbebSnyanmisaka         ctx->width          = width;
916*437bfbebSnyanmisaka         ctx->height         = height;
917*437bfbebSnyanmisaka         ctx->mbaff          = mbaff;
918*437bfbebSnyanmisaka         ctx->chroma_format_idc = chroma_format_idc;
919*437bfbebSnyanmisaka     }
920*437bfbebSnyanmisaka }
921*437bfbebSnyanmisaka 
vdpu382_h264d_setup_colmv_buf(void * hal)922*437bfbebSnyanmisaka static MPP_RET vdpu382_h264d_setup_colmv_buf(void *hal)
923*437bfbebSnyanmisaka {
924*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
925*437bfbebSnyanmisaka     RK_S32 width = MPP_ALIGN((p_hal->pp->wFrameWidthInMbsMinus1 + 1) << 4, 64);
926*437bfbebSnyanmisaka     RK_S32 height = MPP_ALIGN((p_hal->pp->wFrameHeightInMbsMinus1 + 1) << 4, 64);
927*437bfbebSnyanmisaka     RK_U32 ctu_size = 16, colmv_size = 4, colmv_byte = 16;
928*437bfbebSnyanmisaka     RK_S32 mv_size;
929*437bfbebSnyanmisaka 
930*437bfbebSnyanmisaka     mv_size = vdpu382_get_colmv_size(width, height, ctu_size, colmv_byte, colmv_size, 1);
931*437bfbebSnyanmisaka     if (p_hal->cmv_bufs == NULL || p_hal->mv_size < mv_size) {
932*437bfbebSnyanmisaka         size_t size = mv_size;
933*437bfbebSnyanmisaka 
934*437bfbebSnyanmisaka         if (p_hal->cmv_bufs) {
935*437bfbebSnyanmisaka             hal_bufs_deinit(p_hal->cmv_bufs);
936*437bfbebSnyanmisaka             p_hal->cmv_bufs = NULL;
937*437bfbebSnyanmisaka         }
938*437bfbebSnyanmisaka 
939*437bfbebSnyanmisaka         hal_bufs_init(&p_hal->cmv_bufs);
940*437bfbebSnyanmisaka         if (p_hal->cmv_bufs == NULL) {
941*437bfbebSnyanmisaka             mpp_err_f("colmv bufs init fail");
942*437bfbebSnyanmisaka             return MPP_OK;
943*437bfbebSnyanmisaka         }
944*437bfbebSnyanmisaka         p_hal->mv_size = mv_size;
945*437bfbebSnyanmisaka         p_hal->mv_count = mpp_buf_slot_get_count(p_hal->frame_slots);
946*437bfbebSnyanmisaka         hal_bufs_setup(p_hal->cmv_bufs, p_hal->mv_count, 1, &size);
947*437bfbebSnyanmisaka     }
948*437bfbebSnyanmisaka 
949*437bfbebSnyanmisaka     return MPP_OK;
950*437bfbebSnyanmisaka }
951*437bfbebSnyanmisaka 
vdpu382_h264d_gen_regs(void * hal,HalTaskInfo * task)952*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_gen_regs(void *hal, HalTaskInfo *task)
953*437bfbebSnyanmisaka {
954*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
955*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
956*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
957*437bfbebSnyanmisaka     Vdpu382H264dRegSet *regs = ctx->regs;
958*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
959*437bfbebSnyanmisaka 
960*437bfbebSnyanmisaka     if (task->dec.flags.parse_err ||
961*437bfbebSnyanmisaka         (task->dec.flags.ref_err && !p_hal->cfg->base.disable_error)) {
962*437bfbebSnyanmisaka         goto __RETURN;
963*437bfbebSnyanmisaka     }
964*437bfbebSnyanmisaka 
965*437bfbebSnyanmisaka     task->dec.reg_index = 0;
966*437bfbebSnyanmisaka     if (p_hal->fast_mode) {
967*437bfbebSnyanmisaka         RK_U32 i = 0;
968*437bfbebSnyanmisaka         for (i = 0; i <  MPP_ARRAY_ELEMS(ctx->reg_buf); i++) {
969*437bfbebSnyanmisaka             if (!ctx->reg_buf[i].valid) {
970*437bfbebSnyanmisaka                 task->dec.reg_index = i;
971*437bfbebSnyanmisaka                 regs = ctx->reg_buf[i].regs;
972*437bfbebSnyanmisaka 
973*437bfbebSnyanmisaka                 ctx->spspps_offset = ctx->offset_spspps[i];
974*437bfbebSnyanmisaka                 ctx->rps_offset = ctx->offset_rps[i];
975*437bfbebSnyanmisaka                 ctx->sclst_offset = ctx->offset_sclst[i];
976*437bfbebSnyanmisaka                 ctx->reg_buf[i].valid = 1;
977*437bfbebSnyanmisaka                 break;
978*437bfbebSnyanmisaka             }
979*437bfbebSnyanmisaka         }
980*437bfbebSnyanmisaka     }
981*437bfbebSnyanmisaka     if (vdpu382_h264d_setup_colmv_buf(hal))
982*437bfbebSnyanmisaka         goto __RETURN;
983*437bfbebSnyanmisaka     prepare_spspps(p_hal, (RK_U64 *)&ctx->spspps, sizeof(ctx->spspps));
984*437bfbebSnyanmisaka     prepare_framerps(p_hal, (RK_U64 *)&ctx->rps, sizeof(ctx->rps));
985*437bfbebSnyanmisaka     prepare_scanlist(p_hal, ctx->sclst, sizeof(ctx->sclst));
986*437bfbebSnyanmisaka     set_registers(p_hal, regs, task);
987*437bfbebSnyanmisaka 
988*437bfbebSnyanmisaka     //!< copy datas
989*437bfbebSnyanmisaka     RK_U32 i = 0;
990*437bfbebSnyanmisaka     if (!p_hal->fast_mode && !p_hal->pp->spspps_update) {
991*437bfbebSnyanmisaka         RK_U32 offset = 0;
992*437bfbebSnyanmisaka         RK_U32 len = VDPU382_SPS_PPS_LEN; //!< sps+pps data length
993*437bfbebSnyanmisaka         for (i = 0; i < 256; i++) {
994*437bfbebSnyanmisaka             offset = ctx->spspps_offset + (sizeof(ctx->spspps) * i) + len;
995*437bfbebSnyanmisaka             memcpy((char *)ctx->bufs_ptr + offset, (char *)ctx->spspps + len, sizeof(ctx->spspps) - len);
996*437bfbebSnyanmisaka         }
997*437bfbebSnyanmisaka     } else {
998*437bfbebSnyanmisaka         RK_U32 offset = 0;
999*437bfbebSnyanmisaka         for (i = 0; i < 256; i++) {
1000*437bfbebSnyanmisaka             offset = ctx->spspps_offset + (sizeof(ctx->spspps) * i);
1001*437bfbebSnyanmisaka             memcpy((char *)ctx->bufs_ptr + offset, (void *)ctx->spspps, sizeof(ctx->spspps));
1002*437bfbebSnyanmisaka         }
1003*437bfbebSnyanmisaka     }
1004*437bfbebSnyanmisaka 
1005*437bfbebSnyanmisaka     regs->h264d_addr.pps_base = ctx->bufs_fd;
1006*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(p_hal->dev, 161, ctx->spspps_offset);
1007*437bfbebSnyanmisaka 
1008*437bfbebSnyanmisaka     memcpy((char *)ctx->bufs_ptr + ctx->rps_offset, (void *)ctx->rps, sizeof(ctx->rps));
1009*437bfbebSnyanmisaka     regs->h264d_addr.rps_base = ctx->bufs_fd;
1010*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(p_hal->dev, 163, ctx->rps_offset);
1011*437bfbebSnyanmisaka 
1012*437bfbebSnyanmisaka     regs->common.reg012.scanlist_addr_valid_en = 1;
1013*437bfbebSnyanmisaka     if (p_hal->pp->scaleing_list_enable_flag) {
1014*437bfbebSnyanmisaka         memcpy((char *)ctx->bufs_ptr + ctx->sclst_offset, (void *)ctx->sclst, sizeof(ctx->sclst));
1015*437bfbebSnyanmisaka         regs->h264d_addr.scanlist_addr = ctx->bufs_fd;
1016*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 180, ctx->sclst_offset);
1017*437bfbebSnyanmisaka     } else {
1018*437bfbebSnyanmisaka         regs->h264d_addr.scanlist_addr = 0;
1019*437bfbebSnyanmisaka     }
1020*437bfbebSnyanmisaka 
1021*437bfbebSnyanmisaka     hal_h264d_rcb_info_update(p_hal, regs);
1022*437bfbebSnyanmisaka     vdpu382_setup_rcb(&regs->common_addr, p_hal->dev, p_hal->fast_mode ?
1023*437bfbebSnyanmisaka                       ctx->rcb_buf[task->dec.reg_index] : ctx->rcb_buf[0],
1024*437bfbebSnyanmisaka                       ctx->rcb_info);
1025*437bfbebSnyanmisaka     {
1026*437bfbebSnyanmisaka         MppFrame mframe = NULL;
1027*437bfbebSnyanmisaka         DXVA_PicParams_H264_MVC *pp = p_hal->pp;
1028*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p_hal->frame_slots, pp->CurrPic.Index7Bits, SLOT_FRAME_PTR, &mframe);
1029*437bfbebSnyanmisaka 
1030*437bfbebSnyanmisaka         if (mpp_frame_get_thumbnail_en(mframe)) {
1031*437bfbebSnyanmisaka             regs->h264d_addr.reg198_scale_down_luma_base =
1032*437bfbebSnyanmisaka                 regs->common_addr.reg130_decout_base;
1033*437bfbebSnyanmisaka             regs->h264d_addr.reg199_scale_down_chorme_base =
1034*437bfbebSnyanmisaka                 regs->common_addr.reg130_decout_base;
1035*437bfbebSnyanmisaka             vdpu382_setup_down_scale(mframe, p_hal->dev, &regs->common);
1036*437bfbebSnyanmisaka         } else {
1037*437bfbebSnyanmisaka             regs->h264d_addr.reg198_scale_down_luma_base = 0;
1038*437bfbebSnyanmisaka             regs->h264d_addr.reg199_scale_down_chorme_base = 0;
1039*437bfbebSnyanmisaka             regs->common.reg012.scale_down_en = 0;
1040*437bfbebSnyanmisaka         }
1041*437bfbebSnyanmisaka     }
1042*437bfbebSnyanmisaka     /* back up ref infos */
1043*437bfbebSnyanmisaka     {
1044*437bfbebSnyanmisaka         DXVA_PicParams_H264_MVC *pp = p_hal->pp;
1045*437bfbebSnyanmisaka         RK_S32 index = task->dec.reg_index;
1046*437bfbebSnyanmisaka 
1047*437bfbebSnyanmisaka         memcpy(ctx->reg_buf[index].RefFrameList, pp->RefFrameList, sizeof(pp->RefFrameList));
1048*437bfbebSnyanmisaka         memcpy(ctx->reg_buf[index].RefPicList, p_hal->slice_long->RefPicList,
1049*437bfbebSnyanmisaka                sizeof(p_hal->slice_long->RefPicList));
1050*437bfbebSnyanmisaka     }
1051*437bfbebSnyanmisaka     vdpu382_setup_statistic(&regs->common, &regs->statistic);
1052*437bfbebSnyanmisaka     mpp_buffer_sync_end(ctx->bufs);
1053*437bfbebSnyanmisaka 
1054*437bfbebSnyanmisaka __RETURN:
1055*437bfbebSnyanmisaka     return ret = MPP_OK;
1056*437bfbebSnyanmisaka }
1057*437bfbebSnyanmisaka 
vdpu382_h264d_start(void * hal,HalTaskInfo * task)1058*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_start(void *hal, HalTaskInfo *task)
1059*437bfbebSnyanmisaka {
1060*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
1061*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
1062*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
1063*437bfbebSnyanmisaka 
1064*437bfbebSnyanmisaka     if (task->dec.flags.parse_err ||
1065*437bfbebSnyanmisaka         (task->dec.flags.ref_err && !p_hal->cfg->base.disable_error)) {
1066*437bfbebSnyanmisaka         goto __RETURN;
1067*437bfbebSnyanmisaka     }
1068*437bfbebSnyanmisaka 
1069*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *reg_ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
1070*437bfbebSnyanmisaka     Vdpu382H264dRegSet *regs = p_hal->fast_mode ?
1071*437bfbebSnyanmisaka                                reg_ctx->reg_buf[task->dec.reg_index].regs :
1072*437bfbebSnyanmisaka                                reg_ctx->regs;
1073*437bfbebSnyanmisaka     MppDev dev = p_hal->dev;
1074*437bfbebSnyanmisaka 
1075*437bfbebSnyanmisaka     do {
1076*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
1077*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
1078*437bfbebSnyanmisaka 
1079*437bfbebSnyanmisaka         wr_cfg.reg = &regs->common;
1080*437bfbebSnyanmisaka         wr_cfg.size = sizeof(regs->common);
1081*437bfbebSnyanmisaka         wr_cfg.offset = OFFSET_COMMON_REGS;
1082*437bfbebSnyanmisaka 
1083*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &wr_cfg);
1084*437bfbebSnyanmisaka         if (ret) {
1085*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1086*437bfbebSnyanmisaka             break;
1087*437bfbebSnyanmisaka         }
1088*437bfbebSnyanmisaka 
1089*437bfbebSnyanmisaka         wr_cfg.reg = &regs->h264d_param;
1090*437bfbebSnyanmisaka         wr_cfg.size = sizeof(regs->h264d_param);
1091*437bfbebSnyanmisaka         wr_cfg.offset = OFFSET_CODEC_PARAMS_REGS;
1092*437bfbebSnyanmisaka 
1093*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &wr_cfg);
1094*437bfbebSnyanmisaka         if (ret) {
1095*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1096*437bfbebSnyanmisaka             break;
1097*437bfbebSnyanmisaka         }
1098*437bfbebSnyanmisaka 
1099*437bfbebSnyanmisaka         wr_cfg.reg = &regs->common_addr;
1100*437bfbebSnyanmisaka         wr_cfg.size = sizeof(regs->common_addr);
1101*437bfbebSnyanmisaka         wr_cfg.offset = OFFSET_COMMON_ADDR_REGS;
1102*437bfbebSnyanmisaka 
1103*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &wr_cfg);
1104*437bfbebSnyanmisaka         if (ret) {
1105*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1106*437bfbebSnyanmisaka             break;
1107*437bfbebSnyanmisaka         }
1108*437bfbebSnyanmisaka 
1109*437bfbebSnyanmisaka         wr_cfg.reg = &regs->h264d_addr;
1110*437bfbebSnyanmisaka         wr_cfg.size = sizeof(regs->h264d_addr);
1111*437bfbebSnyanmisaka         wr_cfg.offset = OFFSET_CODEC_ADDR_REGS;
1112*437bfbebSnyanmisaka 
1113*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &wr_cfg);
1114*437bfbebSnyanmisaka         if (ret) {
1115*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1116*437bfbebSnyanmisaka             break;
1117*437bfbebSnyanmisaka         }
1118*437bfbebSnyanmisaka 
1119*437bfbebSnyanmisaka         wr_cfg.reg = &regs->h264d_highpoc;
1120*437bfbebSnyanmisaka         wr_cfg.size = sizeof(regs->h264d_highpoc);
1121*437bfbebSnyanmisaka         wr_cfg.offset = OFFSET_POC_HIGHBIT_REGS;
1122*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &wr_cfg);
1123*437bfbebSnyanmisaka         if (ret) {
1124*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1125*437bfbebSnyanmisaka             break;
1126*437bfbebSnyanmisaka         }
1127*437bfbebSnyanmisaka 
1128*437bfbebSnyanmisaka         wr_cfg.reg = &regs->statistic;
1129*437bfbebSnyanmisaka         wr_cfg.size = sizeof(regs->statistic);
1130*437bfbebSnyanmisaka         wr_cfg.offset = OFFSET_STATISTIC_REGS;
1131*437bfbebSnyanmisaka 
1132*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &wr_cfg);
1133*437bfbebSnyanmisaka         if (ret) {
1134*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1135*437bfbebSnyanmisaka             break;
1136*437bfbebSnyanmisaka         }
1137*437bfbebSnyanmisaka 
1138*437bfbebSnyanmisaka         rd_cfg.reg = &regs->irq_status;
1139*437bfbebSnyanmisaka         rd_cfg.size = sizeof(regs->irq_status);
1140*437bfbebSnyanmisaka         rd_cfg.offset = OFFSET_INTERRUPT_REGS;
1141*437bfbebSnyanmisaka 
1142*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_RD, &rd_cfg);
1143*437bfbebSnyanmisaka         if (ret) {
1144*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
1145*437bfbebSnyanmisaka             break;
1146*437bfbebSnyanmisaka         }
1147*437bfbebSnyanmisaka 
1148*437bfbebSnyanmisaka         rd_cfg.reg = &regs->statistic;
1149*437bfbebSnyanmisaka         rd_cfg.size = sizeof(regs->statistic);
1150*437bfbebSnyanmisaka         rd_cfg.offset = OFFSET_STATISTIC_REGS;
1151*437bfbebSnyanmisaka 
1152*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_RD, &rd_cfg);
1153*437bfbebSnyanmisaka         if (ret) {
1154*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
1155*437bfbebSnyanmisaka             break;
1156*437bfbebSnyanmisaka         }
1157*437bfbebSnyanmisaka 
1158*437bfbebSnyanmisaka         /* rcb info for sram */
1159*437bfbebSnyanmisaka         vdpu382_set_rcbinfo(dev, reg_ctx->rcb_info);
1160*437bfbebSnyanmisaka         /* send request to hardware */
1161*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_CMD_SEND, NULL);
1162*437bfbebSnyanmisaka         if (ret) {
1163*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
1164*437bfbebSnyanmisaka             break;
1165*437bfbebSnyanmisaka         }
1166*437bfbebSnyanmisaka     } while (0);
1167*437bfbebSnyanmisaka 
1168*437bfbebSnyanmisaka __RETURN:
1169*437bfbebSnyanmisaka     return ret = MPP_OK;
1170*437bfbebSnyanmisaka }
1171*437bfbebSnyanmisaka 
vdpu382_h264_get_ref_used(void * hal,HalTaskInfo * task)1172*437bfbebSnyanmisaka RK_U32 vdpu382_h264_get_ref_used(void *hal, HalTaskInfo *task)
1173*437bfbebSnyanmisaka {
1174*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
1175*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *reg_ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
1176*437bfbebSnyanmisaka     Vdpu382H264dRegSet *p_regs = p_hal->fast_mode ?
1177*437bfbebSnyanmisaka                                  reg_ctx->reg_buf[task->dec.reg_index].regs :
1178*437bfbebSnyanmisaka                                  reg_ctx->regs;
1179*437bfbebSnyanmisaka     RK_U32 hw_ref_used;
1180*437bfbebSnyanmisaka     RK_U32 ref_used = 0;;
1181*437bfbebSnyanmisaka 
1182*437bfbebSnyanmisaka     memcpy(&hw_ref_used, &p_regs->statistic.reg265, sizeof(RK_U32));
1183*437bfbebSnyanmisaka 
1184*437bfbebSnyanmisaka     {
1185*437bfbebSnyanmisaka         H264dRkvBuf_t *cur_buf = &reg_ctx->reg_buf[task->dec.reg_index];
1186*437bfbebSnyanmisaka         RK_U32 i, j;
1187*437bfbebSnyanmisaka         MppFrame cur_frame = NULL;
1188*437bfbebSnyanmisaka         MppFrameStatus *status;
1189*437bfbebSnyanmisaka 
1190*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output,
1191*437bfbebSnyanmisaka                               SLOT_FRAME_PTR, &cur_frame);
1192*437bfbebSnyanmisaka         status = mpp_frame_get_status(cur_frame);
1193*437bfbebSnyanmisaka 
1194*437bfbebSnyanmisaka         if (status->is_intra)
1195*437bfbebSnyanmisaka             return ref_used;
1196*437bfbebSnyanmisaka 
1197*437bfbebSnyanmisaka         for (i = 0; i < 32; i++) {
1198*437bfbebSnyanmisaka             RK_U32 mask = 1 << i;
1199*437bfbebSnyanmisaka             RK_U32 dpb_idx;
1200*437bfbebSnyanmisaka 
1201*437bfbebSnyanmisaka             if (!(hw_ref_used & mask))
1202*437bfbebSnyanmisaka                 continue;
1203*437bfbebSnyanmisaka 
1204*437bfbebSnyanmisaka             if (status->is_b_frame) {
1205*437bfbebSnyanmisaka                 for (j = 1; j < 3; j++) {
1206*437bfbebSnyanmisaka                     dpb_idx = cur_buf->RefPicList[j][i].Index7Bits;
1207*437bfbebSnyanmisaka                     if (cur_buf->RefPicList[j][i].bPicEntry != 0xff && dpb_idx < 16)
1208*437bfbebSnyanmisaka                         ref_used |= (1 << dpb_idx);
1209*437bfbebSnyanmisaka                 }
1210*437bfbebSnyanmisaka             } else {
1211*437bfbebSnyanmisaka                 j = 1;
1212*437bfbebSnyanmisaka                 dpb_idx = cur_buf->RefPicList[j][i].Index7Bits;
1213*437bfbebSnyanmisaka                 if (cur_buf->RefPicList[j][i].bPicEntry != 0xff && dpb_idx < 16)
1214*437bfbebSnyanmisaka                     ref_used |= (1 << dpb_idx);
1215*437bfbebSnyanmisaka             }
1216*437bfbebSnyanmisaka         }
1217*437bfbebSnyanmisaka     }
1218*437bfbebSnyanmisaka     H264D_LOG("hw_ref_used 0x%08x ref_used %08x\n", hw_ref_used, ref_used);
1219*437bfbebSnyanmisaka 
1220*437bfbebSnyanmisaka     return ref_used;
1221*437bfbebSnyanmisaka }
1222*437bfbebSnyanmisaka 
vdpu382_h264d_wait(void * hal,HalTaskInfo * task)1223*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_wait(void *hal, HalTaskInfo *task)
1224*437bfbebSnyanmisaka {
1225*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
1226*437bfbebSnyanmisaka     RK_S32 index = task->dec.reg_index;
1227*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
1228*437bfbebSnyanmisaka     RK_U32 hw_err = 0;
1229*437bfbebSnyanmisaka     RK_U32 ref_used = 0;
1230*437bfbebSnyanmisaka 
1231*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
1232*437bfbebSnyanmisaka     Vdpu382H264dRegCtx *reg_ctx = (Vdpu382H264dRegCtx *)p_hal->reg_ctx;
1233*437bfbebSnyanmisaka     Vdpu382H264dRegSet *p_regs = p_hal->fast_mode ?
1234*437bfbebSnyanmisaka                                  reg_ctx->reg_buf[index].regs :
1235*437bfbebSnyanmisaka                                  reg_ctx->regs;
1236*437bfbebSnyanmisaka 
1237*437bfbebSnyanmisaka     if (task->dec.flags.parse_err ||
1238*437bfbebSnyanmisaka         (task->dec.flags.ref_err && !p_hal->cfg->base.disable_error)) {
1239*437bfbebSnyanmisaka         goto __SKIP_HARD;
1240*437bfbebSnyanmisaka     }
1241*437bfbebSnyanmisaka 
1242*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(p_hal->dev, MPP_DEV_CMD_POLL, NULL);
1243*437bfbebSnyanmisaka     if (ret)
1244*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
1245*437bfbebSnyanmisaka 
1246*437bfbebSnyanmisaka     hw_err = p_regs->irq_status.reg224.dec_error_sta ||
1247*437bfbebSnyanmisaka              (!p_regs->irq_status.reg224.dec_rdy_sta) ||
1248*437bfbebSnyanmisaka              p_regs->irq_status.reg224.buf_empty_sta ||
1249*437bfbebSnyanmisaka              p_regs->irq_status.reg226.strmd_error_status ||
1250*437bfbebSnyanmisaka              p_regs->irq_status.reg227.colmv_error_ref_picidx ||
1251*437bfbebSnyanmisaka              p_regs->irq_status.reg226.strmd_detect_error_flag;
1252*437bfbebSnyanmisaka 
1253*437bfbebSnyanmisaka     /* the hw ref may not correct*/
1254*437bfbebSnyanmisaka     ref_used = reg_ctx->err_ref_hack ? 0 : vdpu382_h264_get_ref_used(hal, task);
1255*437bfbebSnyanmisaka     task->dec.flags.ref_info_valid = 1;
1256*437bfbebSnyanmisaka     task->dec.flags.ref_used = ref_used;
1257*437bfbebSnyanmisaka 
1258*437bfbebSnyanmisaka __SKIP_HARD:
1259*437bfbebSnyanmisaka     if (p_hal->dec_cb) {
1260*437bfbebSnyanmisaka         DecCbHalDone param;
1261*437bfbebSnyanmisaka 
1262*437bfbebSnyanmisaka         param.task = (void *)&task->dec;
1263*437bfbebSnyanmisaka         param.regs = (RK_U32 *)p_regs;
1264*437bfbebSnyanmisaka         param.hard_err = hw_err;
1265*437bfbebSnyanmisaka 
1266*437bfbebSnyanmisaka         mpp_callback(p_hal->dec_cb, &param);
1267*437bfbebSnyanmisaka     }
1268*437bfbebSnyanmisaka 
1269*437bfbebSnyanmisaka     if (p_hal->fast_mode)
1270*437bfbebSnyanmisaka         reg_ctx->reg_buf[index].valid = 0;
1271*437bfbebSnyanmisaka 
1272*437bfbebSnyanmisaka     (void)task;
1273*437bfbebSnyanmisaka __RETURN:
1274*437bfbebSnyanmisaka     return ret = MPP_OK;
1275*437bfbebSnyanmisaka }
1276*437bfbebSnyanmisaka 
vdpu382_h264d_reset(void * hal)1277*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_reset(void *hal)
1278*437bfbebSnyanmisaka {
1279*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
1280*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
1281*437bfbebSnyanmisaka 
1282*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
1283*437bfbebSnyanmisaka 
1284*437bfbebSnyanmisaka __RETURN:
1285*437bfbebSnyanmisaka     return ret = MPP_OK;
1286*437bfbebSnyanmisaka }
1287*437bfbebSnyanmisaka 
vdpu382_h264d_flush(void * hal)1288*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_flush(void *hal)
1289*437bfbebSnyanmisaka {
1290*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
1291*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
1292*437bfbebSnyanmisaka 
1293*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
1294*437bfbebSnyanmisaka 
1295*437bfbebSnyanmisaka __RETURN:
1296*437bfbebSnyanmisaka     return ret = MPP_OK;
1297*437bfbebSnyanmisaka }
1298*437bfbebSnyanmisaka 
vdpu382_h264d_control(void * hal,MpiCmd cmd_type,void * param)1299*437bfbebSnyanmisaka MPP_RET vdpu382_h264d_control(void *hal, MpiCmd cmd_type, void *param)
1300*437bfbebSnyanmisaka {
1301*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
1302*437bfbebSnyanmisaka     H264dHalCtx_t *p_hal = (H264dHalCtx_t *)hal;
1303*437bfbebSnyanmisaka 
1304*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
1305*437bfbebSnyanmisaka 
1306*437bfbebSnyanmisaka     switch ((MpiCmd)cmd_type) {
1307*437bfbebSnyanmisaka     case MPP_DEC_SET_FRAME_INFO: {
1308*437bfbebSnyanmisaka         MppFrameFormat fmt = mpp_frame_get_fmt((MppFrame)param);
1309*437bfbebSnyanmisaka         RK_U32 imgwidth = mpp_frame_get_width((MppFrame)param);
1310*437bfbebSnyanmisaka         RK_U32 imgheight = mpp_frame_get_height((MppFrame)param);
1311*437bfbebSnyanmisaka 
1312*437bfbebSnyanmisaka         mpp_log("control info: fmt %d, w %d, h %d\n", fmt, imgwidth, imgheight);
1313*437bfbebSnyanmisaka         if (fmt == MPP_FMT_YUV422SP) {
1314*437bfbebSnyanmisaka             mpp_slots_set_prop(p_hal->frame_slots, SLOTS_LEN_ALIGN, rkv_len_align_422);
1315*437bfbebSnyanmisaka         }
1316*437bfbebSnyanmisaka         if (MPP_FRAME_FMT_IS_FBC(fmt)) {
1317*437bfbebSnyanmisaka             vdpu382_afbc_align_calc(p_hal->frame_slots, (MppFrame)param, 16);
1318*437bfbebSnyanmisaka         } else if (imgwidth > 1920 || imgheight > 1088) {
1319*437bfbebSnyanmisaka             mpp_slots_set_prop(p_hal->frame_slots, SLOTS_HOR_ALIGN, rkv_hor_align_256_odds);
1320*437bfbebSnyanmisaka         }
1321*437bfbebSnyanmisaka         break;
1322*437bfbebSnyanmisaka     }
1323*437bfbebSnyanmisaka     case MPP_DEC_SET_OUTPUT_FORMAT: {
1324*437bfbebSnyanmisaka 
1325*437bfbebSnyanmisaka     } break;
1326*437bfbebSnyanmisaka     default:
1327*437bfbebSnyanmisaka         break;
1328*437bfbebSnyanmisaka     }
1329*437bfbebSnyanmisaka 
1330*437bfbebSnyanmisaka __RETURN:
1331*437bfbebSnyanmisaka     return ret = MPP_OK;
1332*437bfbebSnyanmisaka }
1333*437bfbebSnyanmisaka 
1334*437bfbebSnyanmisaka const MppHalApi hal_h264d_vdpu382 = {
1335*437bfbebSnyanmisaka     .name     = "h264d_vdpu382",
1336*437bfbebSnyanmisaka     .type     = MPP_CTX_DEC,
1337*437bfbebSnyanmisaka     .coding   = MPP_VIDEO_CodingAVC,
1338*437bfbebSnyanmisaka     .ctx_size = sizeof(Vdpu382H264dRegCtx),
1339*437bfbebSnyanmisaka     .flag     = 0,
1340*437bfbebSnyanmisaka     .init     = vdpu382_h264d_init,
1341*437bfbebSnyanmisaka     .deinit   = vdpu382_h264d_deinit,
1342*437bfbebSnyanmisaka     .reg_gen  = vdpu382_h264d_gen_regs,
1343*437bfbebSnyanmisaka     .start    = vdpu382_h264d_start,
1344*437bfbebSnyanmisaka     .wait     = vdpu382_h264d_wait,
1345*437bfbebSnyanmisaka     .reset    = vdpu382_h264d_reset,
1346*437bfbebSnyanmisaka     .flush    = vdpu382_h264d_flush,
1347*437bfbebSnyanmisaka     .control  = vdpu382_h264d_control,
1348*437bfbebSnyanmisaka };
1349