xref: /rockchip-linux_mpp/mpp/codec/dec/av1/av1d_cbs.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2021 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 #define MODULE_TAG "av1d_cbs"
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #include <string.h>
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "mpp_mem.h"
21*437bfbebSnyanmisaka #include "mpp_debug.h"
22*437bfbebSnyanmisaka #include "mpp_bitread.h"
23*437bfbebSnyanmisaka #include "mpp_bitwrite.h"
24*437bfbebSnyanmisaka #include "rk_hdr_meta_com.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "av1d_parser.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #ifndef UINT32_MAX
29*437bfbebSnyanmisaka #define UINT32_MAX 0xFFFFFFFF
30*437bfbebSnyanmisaka #endif
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka #ifndef INT_MAX
33*437bfbebSnyanmisaka #define INT_MAX       2147483647      /* maximum (signed) int value */
34*437bfbebSnyanmisaka #endif
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka #define BUFFER_PADDING_SIZE 64
37*437bfbebSnyanmisaka #define MAX_UINT_BITS(length) ((UINT64_C(1) << (length)) - 1)
38*437bfbebSnyanmisaka #define MAX_INT_BITS(length) ((INT64_C(1) << ((length) - 1)) - 1)
39*437bfbebSnyanmisaka #define MIN_INT_BITS(length) (-(INT64_C(1) << ((length) - 1)))
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka /**
42*437bfbebSnyanmisaka  * Clip a signed integer into the -(2^p),(2^p-1) range.
43*437bfbebSnyanmisaka  * @param  a value to clip
44*437bfbebSnyanmisaka  * @param  p bit position to clip at
45*437bfbebSnyanmisaka  * @return clipped value
46*437bfbebSnyanmisaka  */
mpp_clip_uintp2(RK_S32 a,RK_S32 p)47*437bfbebSnyanmisaka static   RK_U32 mpp_clip_uintp2(RK_S32 a, RK_S32 p)
48*437bfbebSnyanmisaka {
49*437bfbebSnyanmisaka     if (a & ~((1 << p) - 1)) return -a >> 31 & ((1 << p) - 1);
50*437bfbebSnyanmisaka     else                   return  a;
51*437bfbebSnyanmisaka }
52*437bfbebSnyanmisaka 
mpp_av1_read_uvlc(BitReadCtx_t * gbc,const char * name,RK_U32 * write_to,RK_U32 range_min,RK_U32 range_max)53*437bfbebSnyanmisaka static RK_S32 mpp_av1_read_uvlc(BitReadCtx_t *gbc, const char *name, RK_U32 *write_to,
54*437bfbebSnyanmisaka                                 RK_U32 range_min, RK_U32 range_max)
55*437bfbebSnyanmisaka {
56*437bfbebSnyanmisaka     RK_U32 value;
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka     mpp_read_ue(gbc, &value);
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka     if (value < range_min || value > range_max) {
61*437bfbebSnyanmisaka         mpp_err_f("%s out of range: "
62*437bfbebSnyanmisaka                   "%d, but must be in [%d,%d].\n",
63*437bfbebSnyanmisaka                   name, value, range_min, range_max);
64*437bfbebSnyanmisaka         return MPP_NOK;
65*437bfbebSnyanmisaka     }
66*437bfbebSnyanmisaka     *write_to = value;
67*437bfbebSnyanmisaka     return MPP_OK;
68*437bfbebSnyanmisaka }
69*437bfbebSnyanmisaka 
70*437bfbebSnyanmisaka 
mpp_av1_read_leb128(BitReadCtx_t * gbc,RK_U64 * write_to)71*437bfbebSnyanmisaka static RK_S32 mpp_av1_read_leb128(BitReadCtx_t *gbc, RK_U64 *write_to)
72*437bfbebSnyanmisaka {
73*437bfbebSnyanmisaka     RK_U64 value;
74*437bfbebSnyanmisaka     RK_S32 err = 0, i;
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     value = 0;
77*437bfbebSnyanmisaka     for (i = 0; i < 8; i++) {
78*437bfbebSnyanmisaka         RK_U32 byte;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka         READ_BITS(gbc, 8, &byte);
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka         if (err < 0)
83*437bfbebSnyanmisaka             return err;
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka         value |= (RK_U64)(byte & 0x7f) << (i * 7);
86*437bfbebSnyanmisaka         if (!(byte & 0x80))
87*437bfbebSnyanmisaka             break;
88*437bfbebSnyanmisaka     }
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     if (value > UINT32_MAX)
91*437bfbebSnyanmisaka         return MPP_NOK;
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     *write_to = value;
95*437bfbebSnyanmisaka     return MPP_OK;
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka __bitread_error:
98*437bfbebSnyanmisaka     return MPP_NOK;
99*437bfbebSnyanmisaka 
100*437bfbebSnyanmisaka }
101*437bfbebSnyanmisaka 
mpp_av1_read_ns(BitReadCtx_t * gbc,const char * name,RK_U32 n,RK_U32 * write_to)102*437bfbebSnyanmisaka static RK_S32 mpp_av1_read_ns(BitReadCtx_t *gbc, const char *name,
103*437bfbebSnyanmisaka                               RK_U32 n, RK_U32 *write_to)
104*437bfbebSnyanmisaka {
105*437bfbebSnyanmisaka     RK_U32 m, v, extra_bit, value;
106*437bfbebSnyanmisaka     RK_S32 w;
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     w = mpp_log2(n) + 1;
109*437bfbebSnyanmisaka     m = (1 << w) - n;
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka     if (mpp_get_bits_left(gbc) < w) {
112*437bfbebSnyanmisaka         mpp_err_f("Invalid non-symmetric value at "
113*437bfbebSnyanmisaka                   "%s: bitstream ended.\n", name);
114*437bfbebSnyanmisaka         return MPP_NOK;
115*437bfbebSnyanmisaka     }
116*437bfbebSnyanmisaka     if (w - 1 > 0)
117*437bfbebSnyanmisaka         READ_BITS(gbc, w - 1, &v);
118*437bfbebSnyanmisaka     else
119*437bfbebSnyanmisaka         v = 0;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     if (v < m) {
122*437bfbebSnyanmisaka         value = v;
123*437bfbebSnyanmisaka     } else {
124*437bfbebSnyanmisaka         READ_ONEBIT(gbc, &extra_bit);
125*437bfbebSnyanmisaka         value = (v << 1) - m + extra_bit;
126*437bfbebSnyanmisaka     }
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka     *write_to = value;
129*437bfbebSnyanmisaka     return MPP_OK;
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka __bitread_error:
132*437bfbebSnyanmisaka     return MPP_NOK;
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka }
135*437bfbebSnyanmisaka 
mpp_av1_read_increment(BitReadCtx_t * gbc,RK_U32 range_min,RK_U32 range_max,const char * name,RK_U32 * write_to)136*437bfbebSnyanmisaka static RK_S32 mpp_av1_read_increment(BitReadCtx_t *gbc, RK_U32 range_min,
137*437bfbebSnyanmisaka                                      RK_U32 range_max, const char *name,
138*437bfbebSnyanmisaka                                      RK_U32 *write_to)
139*437bfbebSnyanmisaka {
140*437bfbebSnyanmisaka     RK_U32 value;
141*437bfbebSnyanmisaka     RK_S32 i;
142*437bfbebSnyanmisaka     RK_S8 bits[33];
143*437bfbebSnyanmisaka 
144*437bfbebSnyanmisaka     mpp_assert(range_min <= range_max && range_max - range_min < sizeof(bits) - 1);
145*437bfbebSnyanmisaka 
146*437bfbebSnyanmisaka     for (i = 0, value = range_min; value < range_max;) {
147*437bfbebSnyanmisaka         RK_U8 tmp = 0;
148*437bfbebSnyanmisaka         if (mpp_get_bits_left(gbc) < 1) {
149*437bfbebSnyanmisaka             mpp_err_f("Invalid increment value at "
150*437bfbebSnyanmisaka                       "%s: bitstream ended.\n", name);
151*437bfbebSnyanmisaka             return MPP_NOK;
152*437bfbebSnyanmisaka         }
153*437bfbebSnyanmisaka         READ_ONEBIT(gbc, &tmp);
154*437bfbebSnyanmisaka         if (tmp) {
155*437bfbebSnyanmisaka             bits[i++] = '1';
156*437bfbebSnyanmisaka             ++value;
157*437bfbebSnyanmisaka         } else {
158*437bfbebSnyanmisaka             bits[i++] = '0';
159*437bfbebSnyanmisaka             break;
160*437bfbebSnyanmisaka         }
161*437bfbebSnyanmisaka     }
162*437bfbebSnyanmisaka     *write_to = value;
163*437bfbebSnyanmisaka     return MPP_OK;
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka __bitread_error:
166*437bfbebSnyanmisaka     return MPP_NOK;
167*437bfbebSnyanmisaka }
168*437bfbebSnyanmisaka 
mpp_av1_read_unsigned(BitReadCtx_t * gbc,RK_S32 width,const char * name,RK_U32 * write_to,RK_U32 range_min,RK_U32 range_max)169*437bfbebSnyanmisaka RK_S32 mpp_av1_read_unsigned(BitReadCtx_t *gbc,
170*437bfbebSnyanmisaka                              RK_S32 width, const char *name,
171*437bfbebSnyanmisaka                              RK_U32 *write_to, RK_U32 range_min,
172*437bfbebSnyanmisaka                              RK_U32 range_max)
173*437bfbebSnyanmisaka {
174*437bfbebSnyanmisaka     RK_U32 value;
175*437bfbebSnyanmisaka 
176*437bfbebSnyanmisaka     mpp_assert(width > 0 && width <= 32);
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     if (mpp_get_bits_left(gbc) < width) {
179*437bfbebSnyanmisaka         mpp_err_f("Invalid value at "
180*437bfbebSnyanmisaka                   "%s: bitstream ended.\n", name);
181*437bfbebSnyanmisaka         return MPP_NOK;
182*437bfbebSnyanmisaka     }
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka     READ_BITS_LONG(gbc, width, &value);
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka     if (value < range_min || value > range_max) {
187*437bfbebSnyanmisaka         mpp_err_f("%s out of range: "
188*437bfbebSnyanmisaka                   "%d, but must be in [%d,%d].\n",
189*437bfbebSnyanmisaka                   name, value, range_min, range_max);
190*437bfbebSnyanmisaka         return MPP_NOK;
191*437bfbebSnyanmisaka     }
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     *write_to = value;
194*437bfbebSnyanmisaka     return 0;
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka __bitread_error:
197*437bfbebSnyanmisaka     return MPP_NOK;
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka }
200*437bfbebSnyanmisaka 
sign_extend(RK_S32 val,RK_U8 bits)201*437bfbebSnyanmisaka static RK_S32 sign_extend(RK_S32 val, RK_U8 bits)
202*437bfbebSnyanmisaka {
203*437bfbebSnyanmisaka     RK_U8 shift = 8 * sizeof(RK_S32) - bits;
204*437bfbebSnyanmisaka     RK_S32 v = { (RK_U8) val << shift };
205*437bfbebSnyanmisaka     return v >> shift;
206*437bfbebSnyanmisaka }
207*437bfbebSnyanmisaka 
mpp_av1_read_signed(BitReadCtx_t * gbc,RK_S32 width,const char * name,RK_S32 * write_to,RK_S32 range_min,RK_S32 range_max)208*437bfbebSnyanmisaka RK_S32 mpp_av1_read_signed(BitReadCtx_t *gbc,
209*437bfbebSnyanmisaka                            RK_S32 width, const char *name,
210*437bfbebSnyanmisaka                            RK_S32 *write_to, RK_S32 range_min,
211*437bfbebSnyanmisaka                            RK_S32 range_max)
212*437bfbebSnyanmisaka {
213*437bfbebSnyanmisaka     RK_S32 value;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka     mpp_assert(width > 0 && width <= 32);
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka     if (mpp_get_bits_left(gbc) < width) {
218*437bfbebSnyanmisaka         mpp_err_f("Invalid value at "
219*437bfbebSnyanmisaka                   "%s: bitstream ended.\n", name);
220*437bfbebSnyanmisaka         return MPP_NOK;
221*437bfbebSnyanmisaka     }
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka     READ_BITS_LONG(gbc, width, &value);
224*437bfbebSnyanmisaka     value = sign_extend(value, width);
225*437bfbebSnyanmisaka     if (value < range_min || value > range_max) {
226*437bfbebSnyanmisaka         mpp_err_f("%s out of range: "
227*437bfbebSnyanmisaka                   "%d, but must be in [%d,%d].\n",
228*437bfbebSnyanmisaka                   name, value, range_min, range_max);
229*437bfbebSnyanmisaka         return MPP_NOK;
230*437bfbebSnyanmisaka     }
231*437bfbebSnyanmisaka 
232*437bfbebSnyanmisaka     *write_to = value;
233*437bfbebSnyanmisaka     return 0;
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka __bitread_error:
236*437bfbebSnyanmisaka     return MPP_NOK;
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka }
239*437bfbebSnyanmisaka 
mpp_av1_read_subexp(BitReadCtx_t * gbc,RK_U32 range_max,RK_U32 * write_to)240*437bfbebSnyanmisaka static RK_S32 mpp_av1_read_subexp(BitReadCtx_t *gbc,
241*437bfbebSnyanmisaka                                   RK_U32 range_max, RK_U32 *write_to)
242*437bfbebSnyanmisaka {
243*437bfbebSnyanmisaka     RK_U32 value;
244*437bfbebSnyanmisaka     RK_S32 err;
245*437bfbebSnyanmisaka     RK_U32 max_len, len, range_offset, range_bits;
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka     max_len = mpp_log2(range_max - 1) - 3;
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka     err = mpp_av1_read_increment(gbc, 0, max_len, "subexp_more_bits", &len);
250*437bfbebSnyanmisaka     if (err < 0)
251*437bfbebSnyanmisaka         return err;
252*437bfbebSnyanmisaka 
253*437bfbebSnyanmisaka     if (len) {
254*437bfbebSnyanmisaka         range_bits   = 2 + len;
255*437bfbebSnyanmisaka         range_offset = 1 << range_bits;
256*437bfbebSnyanmisaka     } else {
257*437bfbebSnyanmisaka         range_bits   = 3;
258*437bfbebSnyanmisaka         range_offset = 0;
259*437bfbebSnyanmisaka     }
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka     if (len < max_len) {
262*437bfbebSnyanmisaka         err = mpp_av1_read_unsigned(gbc, range_bits,
263*437bfbebSnyanmisaka                                     "subexp_bits", &value,
264*437bfbebSnyanmisaka                                     0, MAX_UINT_BITS(range_bits));
265*437bfbebSnyanmisaka         if (err < 0)
266*437bfbebSnyanmisaka             return err;
267*437bfbebSnyanmisaka 
268*437bfbebSnyanmisaka     } else {
269*437bfbebSnyanmisaka         err = mpp_av1_read_ns(gbc, "subexp_final_bits", range_max - range_offset,
270*437bfbebSnyanmisaka                               &value);
271*437bfbebSnyanmisaka         if (err < 0)
272*437bfbebSnyanmisaka             return err;
273*437bfbebSnyanmisaka     }
274*437bfbebSnyanmisaka     value += range_offset;
275*437bfbebSnyanmisaka 
276*437bfbebSnyanmisaka     *write_to = value;
277*437bfbebSnyanmisaka     return err;
278*437bfbebSnyanmisaka }
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka 
mpp_av1_tile_log2(RK_S32 blksize,RK_S32 target)281*437bfbebSnyanmisaka static RK_S32 mpp_av1_tile_log2(RK_S32 blksize, RK_S32 target)
282*437bfbebSnyanmisaka {
283*437bfbebSnyanmisaka     RK_S32 k;
284*437bfbebSnyanmisaka     for (k = 0; (blksize << k) < target; k++);
285*437bfbebSnyanmisaka     return k;
286*437bfbebSnyanmisaka }
287*437bfbebSnyanmisaka 
mpp_av1_get_relative_dist(const AV1RawSequenceHeader * seq,RK_U32 a,RK_U32 b)288*437bfbebSnyanmisaka static RK_S32 mpp_av1_get_relative_dist(const AV1RawSequenceHeader *seq,
289*437bfbebSnyanmisaka                                         RK_U32 a, RK_U32 b)
290*437bfbebSnyanmisaka {
291*437bfbebSnyanmisaka     RK_U32 diff, m;
292*437bfbebSnyanmisaka     if (!seq->enable_order_hint)
293*437bfbebSnyanmisaka         return 0;
294*437bfbebSnyanmisaka     diff = a - b;
295*437bfbebSnyanmisaka     m = 1 << seq->order_hint_bits_minus_1;
296*437bfbebSnyanmisaka     diff = (diff & (m - 1)) - (diff & m);
297*437bfbebSnyanmisaka     return diff;
298*437bfbebSnyanmisaka }
299*437bfbebSnyanmisaka 
mpp_av1_get_payload_bytes_left(BitReadCtx_t * gbc)300*437bfbebSnyanmisaka static size_t mpp_av1_get_payload_bytes_left(BitReadCtx_t *gbc)
301*437bfbebSnyanmisaka {
302*437bfbebSnyanmisaka     size_t size = 0;
303*437bfbebSnyanmisaka     RK_U8 value = 0;
304*437bfbebSnyanmisaka     RK_S32 i = 0;
305*437bfbebSnyanmisaka 
306*437bfbebSnyanmisaka     for (i = 0; mpp_get_bits_left(gbc) >= 8; i++) {
307*437bfbebSnyanmisaka         READ_BITS(gbc, 8, &value);
308*437bfbebSnyanmisaka         if (value)
309*437bfbebSnyanmisaka             size = i;
310*437bfbebSnyanmisaka     }
311*437bfbebSnyanmisaka     return size;
312*437bfbebSnyanmisaka 
313*437bfbebSnyanmisaka __bitread_error:
314*437bfbebSnyanmisaka     return MPP_NOK;
315*437bfbebSnyanmisaka 
316*437bfbebSnyanmisaka }
317*437bfbebSnyanmisaka 
318*437bfbebSnyanmisaka #define CHECK(call) do { \
319*437bfbebSnyanmisaka         err = (call); \
320*437bfbebSnyanmisaka         if (err < 0) \
321*437bfbebSnyanmisaka             return err; \
322*437bfbebSnyanmisaka     } while (0)
323*437bfbebSnyanmisaka 
324*437bfbebSnyanmisaka 
325*437bfbebSnyanmisaka #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((RK_S32[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
326*437bfbebSnyanmisaka #define fb(width, name) \
327*437bfbebSnyanmisaka         xf(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
328*437bfbebSnyanmisaka #define fc(width, name, range_min, range_max) \
329*437bfbebSnyanmisaka         xf(width, name, current->name, range_min, range_max, 0, )
330*437bfbebSnyanmisaka #define flag(name) fb(1, name)
331*437bfbebSnyanmisaka #define su(width, name) \
332*437bfbebSnyanmisaka         xsu(width, name, current->name, 0, )
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka #define fbs(width, name, subs, ...) \
335*437bfbebSnyanmisaka         xf(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
336*437bfbebSnyanmisaka #define fcs(width, name, range_min, range_max, subs, ...) \
337*437bfbebSnyanmisaka         xf(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
338*437bfbebSnyanmisaka #define flags(name, subs, ...) \
339*437bfbebSnyanmisaka         xf(1, name, current->name, 0, 1, subs, __VA_ARGS__)
340*437bfbebSnyanmisaka #define sus(width, name, subs, ...) \
341*437bfbebSnyanmisaka         xsu(width, name, current->name, subs, __VA_ARGS__)
342*437bfbebSnyanmisaka 
343*437bfbebSnyanmisaka #define xf(width, name, var, range_min, range_max, subs, ...) do { \
344*437bfbebSnyanmisaka         RK_U32 value; \
345*437bfbebSnyanmisaka         CHECK(mpp_av1_read_unsigned(gb, width, #name, \
346*437bfbebSnyanmisaka                                    &value, range_min, range_max)); \
347*437bfbebSnyanmisaka         var = value; \
348*437bfbebSnyanmisaka     } while (0)
349*437bfbebSnyanmisaka 
350*437bfbebSnyanmisaka #define xsu(width, name, var, subs, ...) do { \
351*437bfbebSnyanmisaka         RK_S32 value; \
352*437bfbebSnyanmisaka         CHECK(mpp_av1_read_signed(gb, width, #name, \
353*437bfbebSnyanmisaka                                  &value, \
354*437bfbebSnyanmisaka                                  MIN_INT_BITS(width), \
355*437bfbebSnyanmisaka                                  MAX_INT_BITS(width))); \
356*437bfbebSnyanmisaka         var = value; \
357*437bfbebSnyanmisaka     } while (0)
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka #define uvlc(name, range_min, range_max) do { \
360*437bfbebSnyanmisaka         RK_U32 value; \
361*437bfbebSnyanmisaka         CHECK(mpp_av1_read_uvlc(gb, #name, \
362*437bfbebSnyanmisaka                                 &value, range_min, range_max)); \
363*437bfbebSnyanmisaka         current->name = value; \
364*437bfbebSnyanmisaka     } while (0)
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka #define ns(max_value, name) do { \
367*437bfbebSnyanmisaka         RK_U32 value; \
368*437bfbebSnyanmisaka         CHECK(mpp_av1_read_ns(gb, #name, max_value, \
369*437bfbebSnyanmisaka                                &value)); \
370*437bfbebSnyanmisaka         current->name = value; \
371*437bfbebSnyanmisaka     } while (0)
372*437bfbebSnyanmisaka 
373*437bfbebSnyanmisaka #define increment(name, min, max) do { \
374*437bfbebSnyanmisaka         RK_U32 value; \
375*437bfbebSnyanmisaka         CHECK(mpp_av1_read_increment(gb, min, max, #name, &value)); \
376*437bfbebSnyanmisaka         current->name = value; \
377*437bfbebSnyanmisaka     } while (0)
378*437bfbebSnyanmisaka 
379*437bfbebSnyanmisaka #define subexp(name, max) do { \
380*437bfbebSnyanmisaka         RK_U32 value = 0; \
381*437bfbebSnyanmisaka         CHECK(mpp_av1_read_subexp(gb, max, \
382*437bfbebSnyanmisaka                                   &value)); \
383*437bfbebSnyanmisaka         current->name = value; \
384*437bfbebSnyanmisaka     } while (0)
385*437bfbebSnyanmisaka 
386*437bfbebSnyanmisaka #define delta_q(name) do { \
387*437bfbebSnyanmisaka         RK_U8 delta_coded; \
388*437bfbebSnyanmisaka         RK_S8 delta_q; \
389*437bfbebSnyanmisaka         xf(1, name.delta_coded, delta_coded, 0, 1, 0, ); \
390*437bfbebSnyanmisaka         if (delta_coded) \
391*437bfbebSnyanmisaka             xsu(1 + 6, name.delta_q, delta_q, 0, ); \
392*437bfbebSnyanmisaka         else \
393*437bfbebSnyanmisaka             delta_q = 0; \
394*437bfbebSnyanmisaka         current->name = delta_q; \
395*437bfbebSnyanmisaka     } while (0)
396*437bfbebSnyanmisaka 
397*437bfbebSnyanmisaka #define leb128(name) do { \
398*437bfbebSnyanmisaka         RK_U64 value; \
399*437bfbebSnyanmisaka         CHECK(mpp_av1_read_leb128(gb, &value)); \
400*437bfbebSnyanmisaka         current->name = value; \
401*437bfbebSnyanmisaka     } while (0)
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka #define infer(name, value) do { \
404*437bfbebSnyanmisaka         current->name = value; \
405*437bfbebSnyanmisaka     } while (0)
406*437bfbebSnyanmisaka 
407*437bfbebSnyanmisaka #define byte_alignment(gb) (mpp_get_bits_count(gb) % 8)
408*437bfbebSnyanmisaka 
mpp_av1_read_obu_header(AV1Context * ctx,BitReadCtx_t * gb,AV1RawOBUHeader * current)409*437bfbebSnyanmisaka static RK_S32 mpp_av1_read_obu_header(AV1Context *ctx, BitReadCtx_t *gb,
410*437bfbebSnyanmisaka                                       AV1RawOBUHeader *current)
411*437bfbebSnyanmisaka {
412*437bfbebSnyanmisaka     RK_S32 err;
413*437bfbebSnyanmisaka 
414*437bfbebSnyanmisaka     fc(1, obu_forbidden_bit, 0, 0);
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka     fc(4, obu_type, 0, AV1_OBU_PADDING);
417*437bfbebSnyanmisaka     flag(obu_extension_flag);
418*437bfbebSnyanmisaka     flag(obu_has_size_field);
419*437bfbebSnyanmisaka 
420*437bfbebSnyanmisaka     fc(1, obu_reserved_1bit, 0, 0);
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka     if (current->obu_extension_flag) {
423*437bfbebSnyanmisaka         fb(3, temporal_id);
424*437bfbebSnyanmisaka         fb(2, spatial_id);
425*437bfbebSnyanmisaka         fc(3, extension_header_reserved_3bits, 0, 0);
426*437bfbebSnyanmisaka     } else {
427*437bfbebSnyanmisaka         infer(temporal_id, 0);
428*437bfbebSnyanmisaka         infer(spatial_id, 0);
429*437bfbebSnyanmisaka     }
430*437bfbebSnyanmisaka 
431*437bfbebSnyanmisaka     ctx->temporal_id = current->temporal_id;
432*437bfbebSnyanmisaka     ctx->spatial_id  = current->spatial_id;
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka     return 0;
435*437bfbebSnyanmisaka }
436*437bfbebSnyanmisaka 
mpp_av1_trailing_bits(AV1Context * ctx,BitReadCtx_t * gb,RK_S32 nb_bits)437*437bfbebSnyanmisaka static RK_S32 mpp_av1_trailing_bits(AV1Context *ctx, BitReadCtx_t *gb, RK_S32 nb_bits)
438*437bfbebSnyanmisaka {
439*437bfbebSnyanmisaka     (void)ctx;
440*437bfbebSnyanmisaka     mpp_assert(nb_bits > 0);
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka     // fixed(1, trailing_one_bit, 1);
443*437bfbebSnyanmisaka     mpp_skip_bits(gb, 1);
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka     --nb_bits;
446*437bfbebSnyanmisaka 
447*437bfbebSnyanmisaka     while (nb_bits > 0) {
448*437bfbebSnyanmisaka         // fixed(1, trailing_zero_bit, 0);
449*437bfbebSnyanmisaka         mpp_skip_bits(gb, 1);
450*437bfbebSnyanmisaka         --nb_bits;
451*437bfbebSnyanmisaka     }
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka     return 0;
454*437bfbebSnyanmisaka }
455*437bfbebSnyanmisaka 
mpp_av1_byte_alignment(AV1Context * ctx,BitReadCtx_t * gb)456*437bfbebSnyanmisaka static RK_S32 mpp_av1_byte_alignment(AV1Context *ctx, BitReadCtx_t *gb)
457*437bfbebSnyanmisaka {
458*437bfbebSnyanmisaka 
459*437bfbebSnyanmisaka     (void)ctx;
460*437bfbebSnyanmisaka 
461*437bfbebSnyanmisaka     while (byte_alignment(gb) != 0)
462*437bfbebSnyanmisaka         mpp_skip_bits(gb, 1);
463*437bfbebSnyanmisaka     //fixed(1, zero_bit, 0);
464*437bfbebSnyanmisaka 
465*437bfbebSnyanmisaka     return 0;
466*437bfbebSnyanmisaka }
467*437bfbebSnyanmisaka 
mpp_av1_color_config(AV1Context * ctx,BitReadCtx_t * gb,AV1RawColorConfig * current,RK_S32 seq_profile)468*437bfbebSnyanmisaka static RK_S32 mpp_av1_color_config(AV1Context *ctx, BitReadCtx_t *gb,
469*437bfbebSnyanmisaka                                    AV1RawColorConfig *current, RK_S32 seq_profile)
470*437bfbebSnyanmisaka {
471*437bfbebSnyanmisaka     RK_S32 err;
472*437bfbebSnyanmisaka 
473*437bfbebSnyanmisaka     flag(high_bitdepth);
474*437bfbebSnyanmisaka 
475*437bfbebSnyanmisaka     if (seq_profile == PROFILE_AV1_PROFESSIONAL &&
476*437bfbebSnyanmisaka         current->high_bitdepth) {
477*437bfbebSnyanmisaka         flag(twelve_bit);
478*437bfbebSnyanmisaka         ctx->bit_depth = current->twelve_bit ? 12 : 10;
479*437bfbebSnyanmisaka     } else {
480*437bfbebSnyanmisaka         ctx->bit_depth = current->high_bitdepth ? 10 : 8;
481*437bfbebSnyanmisaka     }
482*437bfbebSnyanmisaka 
483*437bfbebSnyanmisaka     if (seq_profile == PROFILE_AV1_HIGH)
484*437bfbebSnyanmisaka         infer(mono_chrome, 0);
485*437bfbebSnyanmisaka     else
486*437bfbebSnyanmisaka         flag(mono_chrome);
487*437bfbebSnyanmisaka     ctx->num_planes = current->mono_chrome ? 1 : 3;
488*437bfbebSnyanmisaka 
489*437bfbebSnyanmisaka     flag(color_description_present_flag);
490*437bfbebSnyanmisaka     if (current->color_description_present_flag) {
491*437bfbebSnyanmisaka         fb(8, color_primaries);
492*437bfbebSnyanmisaka         fb(8, transfer_characteristics);
493*437bfbebSnyanmisaka         fb(8, matrix_coefficients);
494*437bfbebSnyanmisaka         if (current->transfer_characteristics == MPP_FRAME_TRC_BT2020_10 ||
495*437bfbebSnyanmisaka             current->transfer_characteristics == MPP_FRAME_TRC_SMPTEST2084)
496*437bfbebSnyanmisaka             ctx->is_hdr = 1;
497*437bfbebSnyanmisaka     } else {
498*437bfbebSnyanmisaka         infer(color_primaries,          MPP_FRAME_PRI_UNSPECIFIED);
499*437bfbebSnyanmisaka         infer(transfer_characteristics, MPP_FRAME_TRC_UNSPECIFIED);
500*437bfbebSnyanmisaka         infer(matrix_coefficients,      MPP_FRAME_SPC_UNSPECIFIED);
501*437bfbebSnyanmisaka     }
502*437bfbebSnyanmisaka 
503*437bfbebSnyanmisaka     if (current->mono_chrome) {
504*437bfbebSnyanmisaka         flag(color_range);
505*437bfbebSnyanmisaka 
506*437bfbebSnyanmisaka         infer(subsampling_x, 1);
507*437bfbebSnyanmisaka         infer(subsampling_y, 1);
508*437bfbebSnyanmisaka         infer(chroma_sample_position, AV1_CSP_UNKNOWN);
509*437bfbebSnyanmisaka         infer(separate_uv_delta_q, 0);
510*437bfbebSnyanmisaka 
511*437bfbebSnyanmisaka     } else if (current->color_primaries          == MPP_FRAME_PRI_BT709 &&
512*437bfbebSnyanmisaka                current->transfer_characteristics == MPP_FRAME_TRC_IEC61966_2_1 &&
513*437bfbebSnyanmisaka                current->matrix_coefficients      == MPP_FRAME_SPC_RGB) {
514*437bfbebSnyanmisaka         infer(color_range,   1);
515*437bfbebSnyanmisaka         infer(subsampling_x, 0);
516*437bfbebSnyanmisaka         infer(subsampling_y, 0);
517*437bfbebSnyanmisaka         flag(separate_uv_delta_q);
518*437bfbebSnyanmisaka 
519*437bfbebSnyanmisaka     } else {
520*437bfbebSnyanmisaka         flag(color_range);
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka         if (seq_profile == PROFILE_AV1_MAIN) {
523*437bfbebSnyanmisaka             infer(subsampling_x, 1);
524*437bfbebSnyanmisaka             infer(subsampling_y, 1);
525*437bfbebSnyanmisaka         } else if (seq_profile == PROFILE_AV1_HIGH) {
526*437bfbebSnyanmisaka             infer(subsampling_x, 0);
527*437bfbebSnyanmisaka             infer(subsampling_y, 0);
528*437bfbebSnyanmisaka         } else {
529*437bfbebSnyanmisaka             if (ctx->bit_depth == 12) {
530*437bfbebSnyanmisaka                 fb(1, subsampling_x);
531*437bfbebSnyanmisaka                 if (current->subsampling_x)
532*437bfbebSnyanmisaka                     fb(1, subsampling_y);
533*437bfbebSnyanmisaka                 else
534*437bfbebSnyanmisaka                     infer(subsampling_y, 0);
535*437bfbebSnyanmisaka             } else {
536*437bfbebSnyanmisaka                 infer(subsampling_x, 1);
537*437bfbebSnyanmisaka                 infer(subsampling_y, 0);
538*437bfbebSnyanmisaka             }
539*437bfbebSnyanmisaka         }
540*437bfbebSnyanmisaka         if (current->subsampling_x && current->subsampling_y) {
541*437bfbebSnyanmisaka             fc(2, chroma_sample_position, AV1_CSP_UNKNOWN,
542*437bfbebSnyanmisaka                AV1_CSP_COLOCATED);
543*437bfbebSnyanmisaka         }
544*437bfbebSnyanmisaka 
545*437bfbebSnyanmisaka         flag(separate_uv_delta_q);
546*437bfbebSnyanmisaka     }
547*437bfbebSnyanmisaka 
548*437bfbebSnyanmisaka     return 0;
549*437bfbebSnyanmisaka }
550*437bfbebSnyanmisaka 
mpp_av1_timing_info(AV1Context * ctx,BitReadCtx_t * gb,AV1RawTimingInfo * current)551*437bfbebSnyanmisaka static RK_S32 mpp_av1_timing_info(AV1Context *ctx, BitReadCtx_t *gb,
552*437bfbebSnyanmisaka                                   AV1RawTimingInfo *current)
553*437bfbebSnyanmisaka {
554*437bfbebSnyanmisaka     (void)ctx;
555*437bfbebSnyanmisaka     RK_S32 err;
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka     fc(32, num_units_in_display_tick, 1, MAX_UINT_BITS(32));
558*437bfbebSnyanmisaka     fc(32, time_scale,                1, MAX_UINT_BITS(32));
559*437bfbebSnyanmisaka 
560*437bfbebSnyanmisaka     flag(equal_picture_interval);
561*437bfbebSnyanmisaka     if (current->equal_picture_interval)
562*437bfbebSnyanmisaka         uvlc(num_ticks_per_picture_minus_1, 0, MAX_UINT_BITS(32) - 1);
563*437bfbebSnyanmisaka 
564*437bfbebSnyanmisaka     return 0;
565*437bfbebSnyanmisaka }
566*437bfbebSnyanmisaka 
mpp_av1_decoder_model_info(AV1Context * ctx,BitReadCtx_t * gb,AV1RawDecoderModelInfo * current)567*437bfbebSnyanmisaka static RK_S32 mpp_av1_decoder_model_info(AV1Context *ctx, BitReadCtx_t *gb,
568*437bfbebSnyanmisaka                                          AV1RawDecoderModelInfo *current)
569*437bfbebSnyanmisaka {
570*437bfbebSnyanmisaka     RK_S32 err;
571*437bfbebSnyanmisaka     (void)ctx;
572*437bfbebSnyanmisaka     fb(5, buffer_delay_length_minus_1);
573*437bfbebSnyanmisaka     fb(32, num_units_in_decoding_tick);
574*437bfbebSnyanmisaka     fb(5,  buffer_removal_time_length_minus_1);
575*437bfbebSnyanmisaka     fb(5,  frame_presentation_time_length_minus_1);
576*437bfbebSnyanmisaka 
577*437bfbebSnyanmisaka     return 0;
578*437bfbebSnyanmisaka }
579*437bfbebSnyanmisaka 
mpp_av1_sequence_header_obu(AV1Context * ctx,BitReadCtx_t * gb,AV1RawSequenceHeader * current)580*437bfbebSnyanmisaka static RK_S32 mpp_av1_sequence_header_obu(AV1Context *ctx, BitReadCtx_t *gb,
581*437bfbebSnyanmisaka                                           AV1RawSequenceHeader *current)
582*437bfbebSnyanmisaka {
583*437bfbebSnyanmisaka     RK_S32 i, err;
584*437bfbebSnyanmisaka 
585*437bfbebSnyanmisaka     fc(3, seq_profile, PROFILE_AV1_MAIN,
586*437bfbebSnyanmisaka        PROFILE_AV1_PROFESSIONAL);
587*437bfbebSnyanmisaka     flag(still_picture);
588*437bfbebSnyanmisaka     flag(reduced_still_picture_header);
589*437bfbebSnyanmisaka 
590*437bfbebSnyanmisaka     if (current->reduced_still_picture_header) {
591*437bfbebSnyanmisaka         infer(timing_info_present_flag,           0);
592*437bfbebSnyanmisaka         infer(decoder_model_info_present_flag,    0);
593*437bfbebSnyanmisaka         infer(initial_display_delay_present_flag, 0);
594*437bfbebSnyanmisaka         infer(operating_points_cnt_minus_1,       0);
595*437bfbebSnyanmisaka         infer(operating_point_idc[0],             0);
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka         fb(5, seq_level_idx[0]);
598*437bfbebSnyanmisaka 
599*437bfbebSnyanmisaka         infer(seq_tier[0], 0);
600*437bfbebSnyanmisaka         infer(decoder_model_present_for_this_op[0],         0);
601*437bfbebSnyanmisaka         infer(initial_display_delay_present_for_this_op[0], 0);
602*437bfbebSnyanmisaka 
603*437bfbebSnyanmisaka     } else {
604*437bfbebSnyanmisaka         flag(timing_info_present_flag);
605*437bfbebSnyanmisaka         if (current->timing_info_present_flag) {
606*437bfbebSnyanmisaka             CHECK(mpp_av1_timing_info(ctx, gb, &current->timing_info));
607*437bfbebSnyanmisaka 
608*437bfbebSnyanmisaka             flag(decoder_model_info_present_flag);
609*437bfbebSnyanmisaka             if (current->decoder_model_info_present_flag) {
610*437bfbebSnyanmisaka                 CHECK(mpp_av1_decoder_model_info
611*437bfbebSnyanmisaka                       (ctx, gb, &current->decoder_model_info));
612*437bfbebSnyanmisaka             }
613*437bfbebSnyanmisaka         } else {
614*437bfbebSnyanmisaka             infer(decoder_model_info_present_flag, 0);
615*437bfbebSnyanmisaka         }
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka         flag(initial_display_delay_present_flag);
618*437bfbebSnyanmisaka 
619*437bfbebSnyanmisaka         fb(5, operating_points_cnt_minus_1);
620*437bfbebSnyanmisaka         for (i = 0; i <= current->operating_points_cnt_minus_1; i++) {
621*437bfbebSnyanmisaka             fbs(12, operating_point_idc[i], 1, i);
622*437bfbebSnyanmisaka             fbs(5,  seq_level_idx[i], 1, i);
623*437bfbebSnyanmisaka 
624*437bfbebSnyanmisaka             if (current->seq_level_idx[i] > 7)
625*437bfbebSnyanmisaka                 flags(seq_tier[i], 1, i);
626*437bfbebSnyanmisaka             else
627*437bfbebSnyanmisaka                 infer(seq_tier[i], 0);
628*437bfbebSnyanmisaka 
629*437bfbebSnyanmisaka             if (current->decoder_model_info_present_flag) {
630*437bfbebSnyanmisaka                 flags(decoder_model_present_for_this_op[i], 1, i);
631*437bfbebSnyanmisaka                 if (current->decoder_model_present_for_this_op[i]) {
632*437bfbebSnyanmisaka                     RK_S32 n = current->decoder_model_info.buffer_delay_length_minus_1 + 1;
633*437bfbebSnyanmisaka                     fbs(n, decoder_buffer_delay[i], 1, i);
634*437bfbebSnyanmisaka                     fbs(n, encoder_buffer_delay[i], 1, i);
635*437bfbebSnyanmisaka                     flags(low_delay_mode_flag[i], 1, i);
636*437bfbebSnyanmisaka                 }
637*437bfbebSnyanmisaka             } else {
638*437bfbebSnyanmisaka                 infer(decoder_model_present_for_this_op[i], 0);
639*437bfbebSnyanmisaka             }
640*437bfbebSnyanmisaka 
641*437bfbebSnyanmisaka             if (current->initial_display_delay_present_flag) {
642*437bfbebSnyanmisaka                 flags(initial_display_delay_present_for_this_op[i], 1, i);
643*437bfbebSnyanmisaka                 if (current->initial_display_delay_present_for_this_op[i])
644*437bfbebSnyanmisaka                     fbs(4, initial_display_delay_minus_1[i], 1, i);
645*437bfbebSnyanmisaka             }
646*437bfbebSnyanmisaka         }
647*437bfbebSnyanmisaka     }
648*437bfbebSnyanmisaka 
649*437bfbebSnyanmisaka     fb(4, frame_width_bits_minus_1);
650*437bfbebSnyanmisaka     fb(4, frame_height_bits_minus_1);
651*437bfbebSnyanmisaka 
652*437bfbebSnyanmisaka     fb(current->frame_width_bits_minus_1  + 1, max_frame_width_minus_1);
653*437bfbebSnyanmisaka     fb(current->frame_height_bits_minus_1 + 1, max_frame_height_minus_1);
654*437bfbebSnyanmisaka 
655*437bfbebSnyanmisaka     if (current->reduced_still_picture_header)
656*437bfbebSnyanmisaka         infer(frame_id_numbers_present_flag, 0);
657*437bfbebSnyanmisaka     else
658*437bfbebSnyanmisaka         flag(frame_id_numbers_present_flag);
659*437bfbebSnyanmisaka     if (current->frame_id_numbers_present_flag) {
660*437bfbebSnyanmisaka         fb(4, delta_frame_id_length_minus_2);
661*437bfbebSnyanmisaka         fb(3, additional_frame_id_length_minus_1);
662*437bfbebSnyanmisaka     }
663*437bfbebSnyanmisaka 
664*437bfbebSnyanmisaka     flag(use_128x128_superblock);
665*437bfbebSnyanmisaka     flag(enable_filter_intra);
666*437bfbebSnyanmisaka     flag(enable_intra_edge_filter);
667*437bfbebSnyanmisaka 
668*437bfbebSnyanmisaka     if (current->reduced_still_picture_header) {
669*437bfbebSnyanmisaka         infer(enable_interintra_compound, 0);
670*437bfbebSnyanmisaka         infer(enable_masked_compound,     0);
671*437bfbebSnyanmisaka         infer(enable_warped_motion,       0);
672*437bfbebSnyanmisaka         infer(enable_dual_filter,         0);
673*437bfbebSnyanmisaka         infer(enable_order_hint,          0);
674*437bfbebSnyanmisaka         infer(enable_jnt_comp,            0);
675*437bfbebSnyanmisaka         infer(enable_ref_frame_mvs,       0);
676*437bfbebSnyanmisaka 
677*437bfbebSnyanmisaka         infer(seq_force_screen_content_tools,
678*437bfbebSnyanmisaka               AV1_SELECT_SCREEN_CONTENT_TOOLS);
679*437bfbebSnyanmisaka         infer(seq_force_integer_mv,
680*437bfbebSnyanmisaka               AV1_SELECT_INTEGER_MV);
681*437bfbebSnyanmisaka     } else {
682*437bfbebSnyanmisaka         flag(enable_interintra_compound);
683*437bfbebSnyanmisaka         flag(enable_masked_compound);
684*437bfbebSnyanmisaka         flag(enable_warped_motion);
685*437bfbebSnyanmisaka         flag(enable_dual_filter);
686*437bfbebSnyanmisaka 
687*437bfbebSnyanmisaka         flag(enable_order_hint);
688*437bfbebSnyanmisaka         if (current->enable_order_hint) {
689*437bfbebSnyanmisaka             flag(enable_jnt_comp);
690*437bfbebSnyanmisaka             flag(enable_ref_frame_mvs);
691*437bfbebSnyanmisaka         } else {
692*437bfbebSnyanmisaka             infer(enable_jnt_comp,      0);
693*437bfbebSnyanmisaka             infer(enable_ref_frame_mvs, 0);
694*437bfbebSnyanmisaka         }
695*437bfbebSnyanmisaka 
696*437bfbebSnyanmisaka         flag(seq_choose_screen_content_tools);
697*437bfbebSnyanmisaka         if (current->seq_choose_screen_content_tools)
698*437bfbebSnyanmisaka             infer(seq_force_screen_content_tools,
699*437bfbebSnyanmisaka                   AV1_SELECT_SCREEN_CONTENT_TOOLS);
700*437bfbebSnyanmisaka         else
701*437bfbebSnyanmisaka             fb(1, seq_force_screen_content_tools);
702*437bfbebSnyanmisaka         if (current->seq_force_screen_content_tools > 0) {
703*437bfbebSnyanmisaka             flag(seq_choose_integer_mv);
704*437bfbebSnyanmisaka             if (current->seq_choose_integer_mv)
705*437bfbebSnyanmisaka                 infer(seq_force_integer_mv,
706*437bfbebSnyanmisaka                       AV1_SELECT_INTEGER_MV);
707*437bfbebSnyanmisaka             else
708*437bfbebSnyanmisaka                 fb(1, seq_force_integer_mv);
709*437bfbebSnyanmisaka         } else {
710*437bfbebSnyanmisaka             infer(seq_force_integer_mv, AV1_SELECT_INTEGER_MV);
711*437bfbebSnyanmisaka         }
712*437bfbebSnyanmisaka 
713*437bfbebSnyanmisaka         if (current->enable_order_hint)
714*437bfbebSnyanmisaka             fb(3, order_hint_bits_minus_1);
715*437bfbebSnyanmisaka     }
716*437bfbebSnyanmisaka 
717*437bfbebSnyanmisaka     flag(enable_superres);
718*437bfbebSnyanmisaka     flag(enable_cdef);
719*437bfbebSnyanmisaka     flag(enable_restoration);
720*437bfbebSnyanmisaka 
721*437bfbebSnyanmisaka     CHECK(mpp_av1_color_config(ctx, gb, &current->color_config,
722*437bfbebSnyanmisaka                                current->seq_profile));
723*437bfbebSnyanmisaka 
724*437bfbebSnyanmisaka     flag(film_grain_params_present);
725*437bfbebSnyanmisaka 
726*437bfbebSnyanmisaka     return 0;
727*437bfbebSnyanmisaka }
728*437bfbebSnyanmisaka 
mpp_av1_temporal_delimiter_obu(AV1Context * ctx,BitReadCtx_t * gb)729*437bfbebSnyanmisaka static RK_S32 mpp_av1_temporal_delimiter_obu(AV1Context *ctx, BitReadCtx_t *gb)
730*437bfbebSnyanmisaka {
731*437bfbebSnyanmisaka     (void)gb;
732*437bfbebSnyanmisaka     ctx->seen_frame_header = 0;
733*437bfbebSnyanmisaka 
734*437bfbebSnyanmisaka     return 0;
735*437bfbebSnyanmisaka }
736*437bfbebSnyanmisaka 
737*437bfbebSnyanmisaka /* spec 7.8 */
mpp_av1_set_frame_refs(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)738*437bfbebSnyanmisaka static RK_S32 mpp_av1_set_frame_refs(AV1Context *ctx, BitReadCtx_t *gb,
739*437bfbebSnyanmisaka                                      AV1RawFrameHeader *current)
740*437bfbebSnyanmisaka {
741*437bfbebSnyanmisaka     (void)gb;
742*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
743*437bfbebSnyanmisaka     static const RK_U8 ref_frame_list[AV1_NUM_REF_FRAMES - 2] = {
744*437bfbebSnyanmisaka         AV1_REF_FRAME_LAST2, AV1_REF_FRAME_LAST3, AV1_REF_FRAME_BWDREF,
745*437bfbebSnyanmisaka         AV1_REF_FRAME_ALTREF2, AV1_REF_FRAME_ALTREF
746*437bfbebSnyanmisaka     };
747*437bfbebSnyanmisaka     RK_S8 ref_frame_idx[AV1_REFS_PER_FRAME], used_frame[AV1_NUM_REF_FRAMES];
748*437bfbebSnyanmisaka     RK_S8 shifted_order_hints[AV1_NUM_REF_FRAMES];
749*437bfbebSnyanmisaka     RK_S32 cur_frame_hint, latest_order_hint, earliest_order_hint, ref;
750*437bfbebSnyanmisaka     RK_S32 i, j;
751*437bfbebSnyanmisaka 
752*437bfbebSnyanmisaka     for (i = 0; i < AV1_REFS_PER_FRAME; i++)
753*437bfbebSnyanmisaka         ref_frame_idx[i] = -1;
754*437bfbebSnyanmisaka     ref_frame_idx[AV1_REF_FRAME_LAST - AV1_REF_FRAME_LAST] = current->last_frame_idx;
755*437bfbebSnyanmisaka     ref_frame_idx[AV1_REF_FRAME_GOLDEN - AV1_REF_FRAME_LAST] = current->golden_frame_idx;
756*437bfbebSnyanmisaka 
757*437bfbebSnyanmisaka     /*
758*437bfbebSnyanmisaka      * An array usedFrame marking which reference frames
759*437bfbebSnyanmisaka      * have been used is prepared as follows:
760*437bfbebSnyanmisaka      */
761*437bfbebSnyanmisaka     for (i = 0; i < AV1_NUM_REF_FRAMES; i++)
762*437bfbebSnyanmisaka         used_frame[i] = 0;
763*437bfbebSnyanmisaka     used_frame[current->last_frame_idx] = 1;
764*437bfbebSnyanmisaka     used_frame[current->golden_frame_idx] = 1;
765*437bfbebSnyanmisaka 
766*437bfbebSnyanmisaka     /*
767*437bfbebSnyanmisaka      * An array shiftedOrderHints (containing the expected output order shifted
768*437bfbebSnyanmisaka      * such that the current frame has hint equal to curFrameHint) is prepared as follows:
769*437bfbebSnyanmisaka      */
770*437bfbebSnyanmisaka     cur_frame_hint = 1 << (seq->order_hint_bits_minus_1);
771*437bfbebSnyanmisaka     for (i = 0; i < AV1_NUM_REF_FRAMES; i++)
772*437bfbebSnyanmisaka         shifted_order_hints[i] = cur_frame_hint +
773*437bfbebSnyanmisaka                                  mpp_av1_get_relative_dist(seq, ctx->ref_s[i].order_hint,
774*437bfbebSnyanmisaka                                                            ctx->order_hint);
775*437bfbebSnyanmisaka 
776*437bfbebSnyanmisaka     latest_order_hint = shifted_order_hints[current->last_frame_idx];
777*437bfbebSnyanmisaka     earliest_order_hint = shifted_order_hints[current->golden_frame_idx];
778*437bfbebSnyanmisaka 
779*437bfbebSnyanmisaka     /* find_latest_backward */
780*437bfbebSnyanmisaka     ref = -1;
781*437bfbebSnyanmisaka     for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
782*437bfbebSnyanmisaka         RK_S32 hint = shifted_order_hints[i];
783*437bfbebSnyanmisaka         if (!used_frame[i] && hint >= cur_frame_hint &&
784*437bfbebSnyanmisaka             (ref < 0 || hint >= latest_order_hint)) {
785*437bfbebSnyanmisaka             ref = i;
786*437bfbebSnyanmisaka             latest_order_hint = hint;
787*437bfbebSnyanmisaka         }
788*437bfbebSnyanmisaka     }
789*437bfbebSnyanmisaka     /*
790*437bfbebSnyanmisaka      * The ALTREF_FRAME reference is set to be a backward reference to the frame
791*437bfbebSnyanmisaka      * with highest output order as follows:
792*437bfbebSnyanmisaka      */
793*437bfbebSnyanmisaka     if (ref >= 0) {
794*437bfbebSnyanmisaka         ref_frame_idx[AV1_REF_FRAME_ALTREF - AV1_REF_FRAME_LAST] = ref;
795*437bfbebSnyanmisaka         used_frame[ref] = 1;
796*437bfbebSnyanmisaka     }
797*437bfbebSnyanmisaka 
798*437bfbebSnyanmisaka     /* find_earliest_backward */
799*437bfbebSnyanmisaka     ref = -1;
800*437bfbebSnyanmisaka     for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
801*437bfbebSnyanmisaka         RK_S32 hint = shifted_order_hints[i];
802*437bfbebSnyanmisaka         if (!used_frame[i] && hint >= cur_frame_hint &&
803*437bfbebSnyanmisaka             (ref < 0 || hint < earliest_order_hint)) {
804*437bfbebSnyanmisaka             ref = i;
805*437bfbebSnyanmisaka             earliest_order_hint = hint;
806*437bfbebSnyanmisaka         }
807*437bfbebSnyanmisaka     }
808*437bfbebSnyanmisaka     /*
809*437bfbebSnyanmisaka      * The BWDREF_FRAME reference is set to be a backward reference to
810*437bfbebSnyanmisaka      * the closest frame as follows:
811*437bfbebSnyanmisaka      */
812*437bfbebSnyanmisaka     if (ref >= 0) {
813*437bfbebSnyanmisaka         ref_frame_idx[AV1_REF_FRAME_BWDREF - AV1_REF_FRAME_LAST] = ref;
814*437bfbebSnyanmisaka         used_frame[ref] = 1;
815*437bfbebSnyanmisaka     }
816*437bfbebSnyanmisaka 
817*437bfbebSnyanmisaka     ref = -1;
818*437bfbebSnyanmisaka     for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
819*437bfbebSnyanmisaka         RK_S32 hint = shifted_order_hints[i];
820*437bfbebSnyanmisaka         if (!used_frame[i] && hint >= cur_frame_hint &&
821*437bfbebSnyanmisaka             (ref < 0 || hint < earliest_order_hint)) {
822*437bfbebSnyanmisaka             ref = i;
823*437bfbebSnyanmisaka             earliest_order_hint = hint;
824*437bfbebSnyanmisaka         }
825*437bfbebSnyanmisaka     }
826*437bfbebSnyanmisaka 
827*437bfbebSnyanmisaka     /*
828*437bfbebSnyanmisaka      * The ALTREF2_FRAME reference is set to the next closest
829*437bfbebSnyanmisaka      * backward reference as follows:
830*437bfbebSnyanmisaka      */
831*437bfbebSnyanmisaka     if (ref >= 0) {
832*437bfbebSnyanmisaka         ref_frame_idx[AV1_REF_FRAME_ALTREF2 - AV1_REF_FRAME_LAST] = ref;
833*437bfbebSnyanmisaka         used_frame[ref] = 1;
834*437bfbebSnyanmisaka     }
835*437bfbebSnyanmisaka 
836*437bfbebSnyanmisaka     /*
837*437bfbebSnyanmisaka      * The remaining references are set to be forward references
838*437bfbebSnyanmisaka      * in anti-chronological order as follows:
839*437bfbebSnyanmisaka      */
840*437bfbebSnyanmisaka     for (i = 0; i < AV1_REFS_PER_FRAME - 2; i++) {
841*437bfbebSnyanmisaka         RK_S32 ref_frame = ref_frame_list[i];
842*437bfbebSnyanmisaka         if (ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] < 0 ) {
843*437bfbebSnyanmisaka             /* find_latest_forward */
844*437bfbebSnyanmisaka             ref = -1;
845*437bfbebSnyanmisaka             for (j = 0; j < AV1_NUM_REF_FRAMES; j++) {
846*437bfbebSnyanmisaka                 RK_S32 hint = shifted_order_hints[j];
847*437bfbebSnyanmisaka                 if (!used_frame[j] && hint < cur_frame_hint &&
848*437bfbebSnyanmisaka                     (ref < 0 || hint >= latest_order_hint)) {
849*437bfbebSnyanmisaka                     ref = j;
850*437bfbebSnyanmisaka                     latest_order_hint = hint;
851*437bfbebSnyanmisaka                 }
852*437bfbebSnyanmisaka             }
853*437bfbebSnyanmisaka             if (ref >= 0) {
854*437bfbebSnyanmisaka                 ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] = ref;
855*437bfbebSnyanmisaka                 used_frame[ref] = 1;
856*437bfbebSnyanmisaka             }
857*437bfbebSnyanmisaka         }
858*437bfbebSnyanmisaka     }
859*437bfbebSnyanmisaka 
860*437bfbebSnyanmisaka     /*
861*437bfbebSnyanmisaka      * Finally, any remaining references are set to the reference
862*437bfbebSnyanmisaka      * frame with smallest output order as follows:
863*437bfbebSnyanmisaka      */
864*437bfbebSnyanmisaka     ref = -1;
865*437bfbebSnyanmisaka     for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
866*437bfbebSnyanmisaka         RK_S32 hint = shifted_order_hints[i];
867*437bfbebSnyanmisaka         if (ref < 0 || hint < earliest_order_hint) {
868*437bfbebSnyanmisaka             ref = i;
869*437bfbebSnyanmisaka             earliest_order_hint = hint;
870*437bfbebSnyanmisaka         }
871*437bfbebSnyanmisaka     }
872*437bfbebSnyanmisaka     for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
873*437bfbebSnyanmisaka         if (ref_frame_idx[i] < 0)
874*437bfbebSnyanmisaka             ref_frame_idx[i] = ref;
875*437bfbebSnyanmisaka         infer(ref_frame_idx[i], ref_frame_idx[i]);
876*437bfbebSnyanmisaka     }
877*437bfbebSnyanmisaka 
878*437bfbebSnyanmisaka     return 0;
879*437bfbebSnyanmisaka }
880*437bfbebSnyanmisaka 
mpp_av1_superres_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)881*437bfbebSnyanmisaka static RK_S32 mpp_av1_superres_params(AV1Context *ctx, BitReadCtx_t *gb,
882*437bfbebSnyanmisaka                                       AV1RawFrameHeader *current)
883*437bfbebSnyanmisaka {
884*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
885*437bfbebSnyanmisaka     RK_S32 denom, err;
886*437bfbebSnyanmisaka 
887*437bfbebSnyanmisaka     if (seq->enable_superres)
888*437bfbebSnyanmisaka         flag(use_superres);
889*437bfbebSnyanmisaka     else
890*437bfbebSnyanmisaka         infer(use_superres, 0);
891*437bfbebSnyanmisaka 
892*437bfbebSnyanmisaka     if (current->use_superres) {
893*437bfbebSnyanmisaka         fb(3, coded_denom);
894*437bfbebSnyanmisaka         denom = current->coded_denom + AV1_SUPERRES_DENOM_MIN;
895*437bfbebSnyanmisaka     } else {
896*437bfbebSnyanmisaka         denom = AV1_SUPERRES_NUM;
897*437bfbebSnyanmisaka     }
898*437bfbebSnyanmisaka 
899*437bfbebSnyanmisaka     ctx->upscaled_width = ctx->frame_width;
900*437bfbebSnyanmisaka     ctx->frame_width = (ctx->upscaled_width * AV1_SUPERRES_NUM +
901*437bfbebSnyanmisaka                         denom / 2) / denom;
902*437bfbebSnyanmisaka     return 0;
903*437bfbebSnyanmisaka }
904*437bfbebSnyanmisaka 
mpp_av1_frame_size(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)905*437bfbebSnyanmisaka static RK_S32 mpp_av1_frame_size(AV1Context *ctx, BitReadCtx_t *gb,
906*437bfbebSnyanmisaka                                  AV1RawFrameHeader *current)
907*437bfbebSnyanmisaka {
908*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
909*437bfbebSnyanmisaka     RK_S32 err;
910*437bfbebSnyanmisaka 
911*437bfbebSnyanmisaka     if (current->frame_size_override_flag) {
912*437bfbebSnyanmisaka         fb(seq->frame_width_bits_minus_1 + 1,  frame_width_minus_1);
913*437bfbebSnyanmisaka         fb(seq->frame_height_bits_minus_1 + 1, frame_height_minus_1);
914*437bfbebSnyanmisaka     } else {
915*437bfbebSnyanmisaka         infer(frame_width_minus_1,  seq->max_frame_width_minus_1);
916*437bfbebSnyanmisaka         infer(frame_height_minus_1, seq->max_frame_height_minus_1);
917*437bfbebSnyanmisaka     }
918*437bfbebSnyanmisaka 
919*437bfbebSnyanmisaka     ctx->frame_width  = current->frame_width_minus_1  + 1;
920*437bfbebSnyanmisaka     ctx->frame_height = current->frame_height_minus_1 + 1;
921*437bfbebSnyanmisaka 
922*437bfbebSnyanmisaka     CHECK(mpp_av1_superres_params(ctx, gb, current));
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka     return 0;
925*437bfbebSnyanmisaka }
926*437bfbebSnyanmisaka 
mpp_av1_render_size(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)927*437bfbebSnyanmisaka static RK_S32 mpp_av1_render_size(AV1Context *ctx, BitReadCtx_t *gb,
928*437bfbebSnyanmisaka                                   AV1RawFrameHeader *current)
929*437bfbebSnyanmisaka {
930*437bfbebSnyanmisaka     RK_S32 err;
931*437bfbebSnyanmisaka 
932*437bfbebSnyanmisaka     flag(render_and_frame_size_different);
933*437bfbebSnyanmisaka 
934*437bfbebSnyanmisaka     if (current->render_and_frame_size_different) {
935*437bfbebSnyanmisaka         fb(16, render_width_minus_1);
936*437bfbebSnyanmisaka         fb(16, render_height_minus_1);
937*437bfbebSnyanmisaka     } else {
938*437bfbebSnyanmisaka         infer(render_width_minus_1,  current->frame_width_minus_1);
939*437bfbebSnyanmisaka         infer(render_height_minus_1, current->frame_height_minus_1);
940*437bfbebSnyanmisaka     }
941*437bfbebSnyanmisaka 
942*437bfbebSnyanmisaka     ctx->render_width  = current->render_width_minus_1  + 1;
943*437bfbebSnyanmisaka     ctx->render_height = current->render_height_minus_1 + 1;
944*437bfbebSnyanmisaka 
945*437bfbebSnyanmisaka     return 0;
946*437bfbebSnyanmisaka }
947*437bfbebSnyanmisaka 
mpp_av1_frame_size_with_refs(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)948*437bfbebSnyanmisaka static RK_S32 mpp_av1_frame_size_with_refs(AV1Context *ctx, BitReadCtx_t *gb,
949*437bfbebSnyanmisaka                                            AV1RawFrameHeader *current)
950*437bfbebSnyanmisaka {
951*437bfbebSnyanmisaka     RK_S32 i, err;
952*437bfbebSnyanmisaka 
953*437bfbebSnyanmisaka     for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
954*437bfbebSnyanmisaka         flags(found_ref[i], 1, i);
955*437bfbebSnyanmisaka         if (current->found_ref[i]) {
956*437bfbebSnyanmisaka             AV1ReferenceFrameState *ref =
957*437bfbebSnyanmisaka                 &ctx->ref_s[current->ref_frame_idx[i]];
958*437bfbebSnyanmisaka 
959*437bfbebSnyanmisaka             if (!ref->valid) {
960*437bfbebSnyanmisaka                 mpp_err_f("Missing reference frame needed for frame size "
961*437bfbebSnyanmisaka                           "(ref = %d, ref_frame_idx = %d).\n",
962*437bfbebSnyanmisaka                           i, current->ref_frame_idx[i]);
963*437bfbebSnyanmisaka                 return MPP_ERR_PROTOL;
964*437bfbebSnyanmisaka             }
965*437bfbebSnyanmisaka 
966*437bfbebSnyanmisaka             infer(frame_width_minus_1,   ref->upscaled_width - 1);
967*437bfbebSnyanmisaka             infer(frame_height_minus_1,  ref->frame_height - 1);
968*437bfbebSnyanmisaka             infer(render_width_minus_1,  ref->render_width - 1);
969*437bfbebSnyanmisaka             infer(render_height_minus_1, ref->render_height - 1);
970*437bfbebSnyanmisaka 
971*437bfbebSnyanmisaka             ctx->upscaled_width = ref->upscaled_width;
972*437bfbebSnyanmisaka             ctx->frame_width    = ctx->upscaled_width;
973*437bfbebSnyanmisaka             ctx->frame_height   = ref->frame_height;
974*437bfbebSnyanmisaka             ctx->render_width   = ref->render_width;
975*437bfbebSnyanmisaka             ctx->render_height  = ref->render_height;
976*437bfbebSnyanmisaka             break;
977*437bfbebSnyanmisaka         }
978*437bfbebSnyanmisaka     }
979*437bfbebSnyanmisaka 
980*437bfbebSnyanmisaka     if (i >= AV1_REFS_PER_FRAME) {
981*437bfbebSnyanmisaka         CHECK(mpp_av1_frame_size(ctx, gb, current));
982*437bfbebSnyanmisaka         CHECK(mpp_av1_render_size(ctx, gb, current));
983*437bfbebSnyanmisaka     } else {
984*437bfbebSnyanmisaka         CHECK(mpp_av1_superres_params(ctx, gb, current));
985*437bfbebSnyanmisaka     }
986*437bfbebSnyanmisaka 
987*437bfbebSnyanmisaka     return 0;
988*437bfbebSnyanmisaka }
989*437bfbebSnyanmisaka 
mpp_av1_interpolation_filter(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)990*437bfbebSnyanmisaka static RK_S32  mpp_av1_interpolation_filter(AV1Context *ctx, BitReadCtx_t *gb,
991*437bfbebSnyanmisaka                                             AV1RawFrameHeader *current)
992*437bfbebSnyanmisaka {
993*437bfbebSnyanmisaka     RK_S32 err;
994*437bfbebSnyanmisaka     (void)ctx;
995*437bfbebSnyanmisaka     flag(is_filter_switchable);
996*437bfbebSnyanmisaka     if (current->is_filter_switchable)
997*437bfbebSnyanmisaka         infer(interpolation_filter,
998*437bfbebSnyanmisaka               AV1_INTERPOLATION_FILTER_SWITCHABLE);
999*437bfbebSnyanmisaka     else
1000*437bfbebSnyanmisaka         fb(2, interpolation_filter);
1001*437bfbebSnyanmisaka 
1002*437bfbebSnyanmisaka     return 0;
1003*437bfbebSnyanmisaka }
1004*437bfbebSnyanmisaka 
mpp_av1_tile_info(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1005*437bfbebSnyanmisaka static RK_S32 mpp_av1_tile_info(AV1Context *ctx, BitReadCtx_t *gb,
1006*437bfbebSnyanmisaka                                 AV1RawFrameHeader *current)
1007*437bfbebSnyanmisaka {
1008*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
1009*437bfbebSnyanmisaka     RK_S32 mi_cols, mi_rows, sb_cols, sb_rows, sb_shift, sb_size;
1010*437bfbebSnyanmisaka     RK_S32 max_tile_width_sb, max_tile_height_sb, max_tile_area_sb;
1011*437bfbebSnyanmisaka     RK_S32 min_log2_tile_cols, max_log2_tile_cols, max_log2_tile_rows;
1012*437bfbebSnyanmisaka     RK_S32 min_log2_tiles, min_log2_tile_rows;
1013*437bfbebSnyanmisaka     RK_S32 i, err;
1014*437bfbebSnyanmisaka 
1015*437bfbebSnyanmisaka     mi_cols = 2 * ((ctx->frame_width  + 7) >> 3);
1016*437bfbebSnyanmisaka     mi_rows = 2 * ((ctx->frame_height + 7) >> 3);
1017*437bfbebSnyanmisaka 
1018*437bfbebSnyanmisaka     sb_cols = seq->use_128x128_superblock ? ((mi_cols + 31) >> 5)
1019*437bfbebSnyanmisaka               : ((mi_cols + 15) >> 4);
1020*437bfbebSnyanmisaka     sb_rows = seq->use_128x128_superblock ? ((mi_rows + 31) >> 5)
1021*437bfbebSnyanmisaka               : ((mi_rows + 15) >> 4);
1022*437bfbebSnyanmisaka 
1023*437bfbebSnyanmisaka     sb_shift = seq->use_128x128_superblock ? 5 : 4;
1024*437bfbebSnyanmisaka     sb_size  = sb_shift + 2;
1025*437bfbebSnyanmisaka 
1026*437bfbebSnyanmisaka     max_tile_width_sb = AV1_MAX_TILE_WIDTH >> sb_size;
1027*437bfbebSnyanmisaka     max_tile_area_sb  = AV1_MAX_TILE_AREA  >> (2 * sb_size);
1028*437bfbebSnyanmisaka 
1029*437bfbebSnyanmisaka     min_log2_tile_cols = mpp_av1_tile_log2(max_tile_width_sb, sb_cols);
1030*437bfbebSnyanmisaka     max_log2_tile_cols = mpp_av1_tile_log2(1, MPP_MIN(sb_cols, AV1_MAX_TILE_COLS));
1031*437bfbebSnyanmisaka     max_log2_tile_rows = mpp_av1_tile_log2(1, MPP_MIN(sb_rows, AV1_MAX_TILE_ROWS));
1032*437bfbebSnyanmisaka     min_log2_tiles = MPP_MAX(min_log2_tile_cols,
1033*437bfbebSnyanmisaka                              mpp_av1_tile_log2(max_tile_area_sb, sb_rows * sb_cols));
1034*437bfbebSnyanmisaka 
1035*437bfbebSnyanmisaka     flag(uniform_tile_spacing_flag);
1036*437bfbebSnyanmisaka 
1037*437bfbebSnyanmisaka     if (current->uniform_tile_spacing_flag) {
1038*437bfbebSnyanmisaka         RK_S32 tile_width_sb, tile_height_sb;
1039*437bfbebSnyanmisaka 
1040*437bfbebSnyanmisaka         increment(tile_cols_log2, min_log2_tile_cols, max_log2_tile_cols);
1041*437bfbebSnyanmisaka 
1042*437bfbebSnyanmisaka         tile_width_sb = (sb_cols + (1 << current->tile_cols_log2) - 1) >>
1043*437bfbebSnyanmisaka                         current->tile_cols_log2;
1044*437bfbebSnyanmisaka         current->tile_cols = (sb_cols + tile_width_sb - 1) / tile_width_sb;
1045*437bfbebSnyanmisaka 
1046*437bfbebSnyanmisaka         min_log2_tile_rows = MPP_MAX(min_log2_tiles - current->tile_cols_log2, 0);
1047*437bfbebSnyanmisaka 
1048*437bfbebSnyanmisaka         increment(tile_rows_log2, min_log2_tile_rows, max_log2_tile_rows);
1049*437bfbebSnyanmisaka 
1050*437bfbebSnyanmisaka         tile_height_sb = (sb_rows + (1 << current->tile_rows_log2) - 1) >>
1051*437bfbebSnyanmisaka                          current->tile_rows_log2;
1052*437bfbebSnyanmisaka         current->tile_rows = (sb_rows + tile_height_sb - 1) / tile_height_sb;
1053*437bfbebSnyanmisaka 
1054*437bfbebSnyanmisaka         for (i = 0; i < current->tile_cols - 1; i++)
1055*437bfbebSnyanmisaka             infer(width_in_sbs_minus_1[i], tile_width_sb - 1);
1056*437bfbebSnyanmisaka         infer(width_in_sbs_minus_1[i],
1057*437bfbebSnyanmisaka               sb_cols - (current->tile_cols - 1) * tile_width_sb - 1);
1058*437bfbebSnyanmisaka         for (i = 0; i < current->tile_rows - 1; i++)
1059*437bfbebSnyanmisaka             infer(height_in_sbs_minus_1[i], tile_height_sb - 1);
1060*437bfbebSnyanmisaka         infer(height_in_sbs_minus_1[i],
1061*437bfbebSnyanmisaka               sb_rows - (current->tile_rows - 1) * tile_height_sb - 1);
1062*437bfbebSnyanmisaka 
1063*437bfbebSnyanmisaka     } else {
1064*437bfbebSnyanmisaka         RK_S32 widest_tile_sb, start_sb, size_sb, max_width, max_height;
1065*437bfbebSnyanmisaka 
1066*437bfbebSnyanmisaka         widest_tile_sb = 0;
1067*437bfbebSnyanmisaka 
1068*437bfbebSnyanmisaka         start_sb = 0;
1069*437bfbebSnyanmisaka         for (i = 0; start_sb < sb_cols && i < AV1_MAX_TILE_COLS; i++) {
1070*437bfbebSnyanmisaka             max_width = MPP_MIN(sb_cols - start_sb, max_tile_width_sb);
1071*437bfbebSnyanmisaka             ns(max_width, width_in_sbs_minus_1[i]);
1072*437bfbebSnyanmisaka             //ns(max_width, width_in_sbs_minus_1[i]);
1073*437bfbebSnyanmisaka             size_sb = current->width_in_sbs_minus_1[i] + 1;
1074*437bfbebSnyanmisaka             widest_tile_sb = MPP_MAX(size_sb, widest_tile_sb);
1075*437bfbebSnyanmisaka             start_sb += size_sb;
1076*437bfbebSnyanmisaka         }
1077*437bfbebSnyanmisaka         current->tile_cols_log2 = mpp_av1_tile_log2(1, i);
1078*437bfbebSnyanmisaka         current->tile_cols = i;
1079*437bfbebSnyanmisaka 
1080*437bfbebSnyanmisaka         if (min_log2_tiles > 0)
1081*437bfbebSnyanmisaka             max_tile_area_sb = (sb_rows * sb_cols) >> (min_log2_tiles + 1);
1082*437bfbebSnyanmisaka         else
1083*437bfbebSnyanmisaka             max_tile_area_sb = sb_rows * sb_cols;
1084*437bfbebSnyanmisaka         max_tile_height_sb = MPP_MAX(max_tile_area_sb / widest_tile_sb, 1);
1085*437bfbebSnyanmisaka 
1086*437bfbebSnyanmisaka         start_sb = 0;
1087*437bfbebSnyanmisaka         for (i = 0; start_sb < sb_rows && i < AV1_MAX_TILE_ROWS; i++) {
1088*437bfbebSnyanmisaka             max_height = MPP_MIN(sb_rows - start_sb, max_tile_height_sb);
1089*437bfbebSnyanmisaka             ns(max_height, height_in_sbs_minus_1[i]);
1090*437bfbebSnyanmisaka             size_sb = current->height_in_sbs_minus_1[i] + 1;
1091*437bfbebSnyanmisaka             start_sb += size_sb;
1092*437bfbebSnyanmisaka         }
1093*437bfbebSnyanmisaka         current->tile_rows_log2 = mpp_av1_tile_log2(1, i);
1094*437bfbebSnyanmisaka         current->tile_rows = i;
1095*437bfbebSnyanmisaka     }
1096*437bfbebSnyanmisaka 
1097*437bfbebSnyanmisaka     if (current->tile_cols_log2 > 0 ||
1098*437bfbebSnyanmisaka         current->tile_rows_log2 > 0) {
1099*437bfbebSnyanmisaka         fb(current->tile_cols_log2 + current->tile_rows_log2,
1100*437bfbebSnyanmisaka            context_update_tile_id);
1101*437bfbebSnyanmisaka         fb(2, tile_size_bytes_minus1);
1102*437bfbebSnyanmisaka     } else {
1103*437bfbebSnyanmisaka         infer(context_update_tile_id, 0);
1104*437bfbebSnyanmisaka         current->tile_size_bytes_minus1 = 3;
1105*437bfbebSnyanmisaka     }
1106*437bfbebSnyanmisaka 
1107*437bfbebSnyanmisaka     ctx->tile_cols = current->tile_cols;
1108*437bfbebSnyanmisaka     ctx->tile_rows = current->tile_rows;
1109*437bfbebSnyanmisaka 
1110*437bfbebSnyanmisaka     return 0;
1111*437bfbebSnyanmisaka }
1112*437bfbebSnyanmisaka 
mpp_av1_quantization_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1113*437bfbebSnyanmisaka static RK_S32 mpp_av1_quantization_params(AV1Context *ctx, BitReadCtx_t *gb,
1114*437bfbebSnyanmisaka                                           AV1RawFrameHeader *current)
1115*437bfbebSnyanmisaka {
1116*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
1117*437bfbebSnyanmisaka     RK_S32 err;
1118*437bfbebSnyanmisaka 
1119*437bfbebSnyanmisaka     fb(8, base_q_idx);
1120*437bfbebSnyanmisaka 
1121*437bfbebSnyanmisaka     delta_q(delta_q_y_dc);
1122*437bfbebSnyanmisaka 
1123*437bfbebSnyanmisaka     if (ctx->num_planes > 1) {
1124*437bfbebSnyanmisaka         if (seq->color_config.separate_uv_delta_q)
1125*437bfbebSnyanmisaka             flag(diff_uv_delta);
1126*437bfbebSnyanmisaka         else
1127*437bfbebSnyanmisaka             infer(diff_uv_delta, 0);
1128*437bfbebSnyanmisaka 
1129*437bfbebSnyanmisaka         delta_q(delta_q_u_dc);
1130*437bfbebSnyanmisaka         delta_q(delta_q_u_ac);
1131*437bfbebSnyanmisaka 
1132*437bfbebSnyanmisaka         if (current->diff_uv_delta) {
1133*437bfbebSnyanmisaka             delta_q(delta_q_v_dc);
1134*437bfbebSnyanmisaka             delta_q(delta_q_v_ac);
1135*437bfbebSnyanmisaka         } else {
1136*437bfbebSnyanmisaka             infer(delta_q_v_dc, current->delta_q_u_dc);
1137*437bfbebSnyanmisaka             infer(delta_q_v_ac, current->delta_q_u_ac);
1138*437bfbebSnyanmisaka         }
1139*437bfbebSnyanmisaka     } else {
1140*437bfbebSnyanmisaka         infer(delta_q_u_dc, 0);
1141*437bfbebSnyanmisaka         infer(delta_q_u_ac, 0);
1142*437bfbebSnyanmisaka         infer(delta_q_v_dc, 0);
1143*437bfbebSnyanmisaka         infer(delta_q_v_ac, 0);
1144*437bfbebSnyanmisaka     }
1145*437bfbebSnyanmisaka 
1146*437bfbebSnyanmisaka     flag(using_qmatrix);
1147*437bfbebSnyanmisaka     if (current->using_qmatrix) {
1148*437bfbebSnyanmisaka         fb(4, qm_y);
1149*437bfbebSnyanmisaka         fb(4, qm_u);
1150*437bfbebSnyanmisaka         if (seq->color_config.separate_uv_delta_q)
1151*437bfbebSnyanmisaka             fb(4, qm_v);
1152*437bfbebSnyanmisaka         else
1153*437bfbebSnyanmisaka             infer(qm_v, current->qm_u);
1154*437bfbebSnyanmisaka     }
1155*437bfbebSnyanmisaka 
1156*437bfbebSnyanmisaka     return 0;
1157*437bfbebSnyanmisaka }
1158*437bfbebSnyanmisaka 
mpp_av1_segmentation_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1159*437bfbebSnyanmisaka static RK_S32 mpp_av1_segmentation_params(AV1Context *ctx, BitReadCtx_t *gb,
1160*437bfbebSnyanmisaka                                           AV1RawFrameHeader *current)
1161*437bfbebSnyanmisaka {
1162*437bfbebSnyanmisaka     static const RK_U8 bits[AV1_SEG_LVL_MAX] = { 8, 6, 6, 6, 6, 3, 0, 0 };
1163*437bfbebSnyanmisaka     static const RK_U8 sign[AV1_SEG_LVL_MAX] = { 1, 1, 1, 1, 1, 0, 0, 0 };
1164*437bfbebSnyanmisaka     static const RK_U8 default_feature_enabled[AV1_SEG_LVL_MAX] = { 0 };
1165*437bfbebSnyanmisaka     static const RK_S16 default_feature_value[AV1_SEG_LVL_MAX] = { 0 };
1166*437bfbebSnyanmisaka     RK_S32 i, j, err;
1167*437bfbebSnyanmisaka 
1168*437bfbebSnyanmisaka     flag(segmentation_enabled);
1169*437bfbebSnyanmisaka 
1170*437bfbebSnyanmisaka     if (current->segmentation_enabled) {
1171*437bfbebSnyanmisaka         if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) {
1172*437bfbebSnyanmisaka             infer(segmentation_update_map,      1);
1173*437bfbebSnyanmisaka             infer(segmentation_temporal_update, 0);
1174*437bfbebSnyanmisaka             infer(segmentation_update_data,     1);
1175*437bfbebSnyanmisaka         } else {
1176*437bfbebSnyanmisaka             flag(segmentation_update_map);
1177*437bfbebSnyanmisaka             if (current->segmentation_update_map)
1178*437bfbebSnyanmisaka                 flag(segmentation_temporal_update);
1179*437bfbebSnyanmisaka             else
1180*437bfbebSnyanmisaka                 infer(segmentation_temporal_update, 0);
1181*437bfbebSnyanmisaka             flag(segmentation_update_data);
1182*437bfbebSnyanmisaka         }
1183*437bfbebSnyanmisaka 
1184*437bfbebSnyanmisaka         for (i = 0; i < AV1_MAX_SEGMENTS; i++) {
1185*437bfbebSnyanmisaka             const RK_U8 *ref_feature_enabled;
1186*437bfbebSnyanmisaka             const RK_S16 *ref_feature_value;
1187*437bfbebSnyanmisaka 
1188*437bfbebSnyanmisaka             if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) {
1189*437bfbebSnyanmisaka                 ref_feature_enabled = default_feature_enabled;
1190*437bfbebSnyanmisaka                 ref_feature_value = default_feature_value;
1191*437bfbebSnyanmisaka             } else {
1192*437bfbebSnyanmisaka                 ref_feature_enabled =
1193*437bfbebSnyanmisaka                     ctx->ref_s[current->ref_frame_idx[current->primary_ref_frame]].feature_enabled[i];
1194*437bfbebSnyanmisaka                 ref_feature_value =
1195*437bfbebSnyanmisaka                     ctx->ref_s[current->ref_frame_idx[current->primary_ref_frame]].feature_value[i];
1196*437bfbebSnyanmisaka             }
1197*437bfbebSnyanmisaka 
1198*437bfbebSnyanmisaka             for (j = 0; j < AV1_SEG_LVL_MAX; j++) {
1199*437bfbebSnyanmisaka                 if (current->segmentation_update_data) {
1200*437bfbebSnyanmisaka                     flags(feature_enabled[i][j], 2, i, j);
1201*437bfbebSnyanmisaka                     if (current->feature_enabled[i][j] && bits[j] > 0) {
1202*437bfbebSnyanmisaka                         if (sign[j]) {
1203*437bfbebSnyanmisaka                             RK_S32 sign_, data;
1204*437bfbebSnyanmisaka 
1205*437bfbebSnyanmisaka                             READ_ONEBIT(gb, &sign_);
1206*437bfbebSnyanmisaka                             READ_BITS(gb, bits[j], &data);
1207*437bfbebSnyanmisaka                             if (sign_) data -= (1 << bits[j]);
1208*437bfbebSnyanmisaka                             current->feature_value[i][j] = data;
1209*437bfbebSnyanmisaka                         } else
1210*437bfbebSnyanmisaka                             fbs(bits[j], feature_value[i][j], 2, i, j);
1211*437bfbebSnyanmisaka                     } else {
1212*437bfbebSnyanmisaka                         infer(feature_value[i][j], 0);
1213*437bfbebSnyanmisaka                     }
1214*437bfbebSnyanmisaka                 } else {
1215*437bfbebSnyanmisaka                     infer(feature_enabled[i][j], ref_feature_enabled[j]);
1216*437bfbebSnyanmisaka                     infer(feature_value[i][j], ref_feature_value[j]);
1217*437bfbebSnyanmisaka                 }
1218*437bfbebSnyanmisaka             }
1219*437bfbebSnyanmisaka         }
1220*437bfbebSnyanmisaka     } else {
1221*437bfbebSnyanmisaka         for (i = 0; i < AV1_MAX_SEGMENTS; i++) {
1222*437bfbebSnyanmisaka             for (j = 0; j < AV1_SEG_LVL_MAX; j++) {
1223*437bfbebSnyanmisaka                 infer(feature_enabled[i][j], 0);
1224*437bfbebSnyanmisaka                 infer(feature_value[i][j],   0);
1225*437bfbebSnyanmisaka             }
1226*437bfbebSnyanmisaka         }
1227*437bfbebSnyanmisaka     }
1228*437bfbebSnyanmisaka 
1229*437bfbebSnyanmisaka     infer(segmentation_id_last_active, 0);
1230*437bfbebSnyanmisaka     infer(segmentation_id_preskip, 0);
1231*437bfbebSnyanmisaka     for (i = 0; i < AV1_MAX_SEGMENTS; i++) {
1232*437bfbebSnyanmisaka         for (j = 0; j < AV1_SEG_LVL_MAX; j++) {
1233*437bfbebSnyanmisaka             if (current->feature_enabled[i][j]) {
1234*437bfbebSnyanmisaka                 infer(segmentation_id_last_active, i);
1235*437bfbebSnyanmisaka                 if ( j > AV1_SEG_LVL_REF_FRAME)
1236*437bfbebSnyanmisaka                     infer(segmentation_id_preskip, 1);
1237*437bfbebSnyanmisaka             }
1238*437bfbebSnyanmisaka         }
1239*437bfbebSnyanmisaka     }
1240*437bfbebSnyanmisaka 
1241*437bfbebSnyanmisaka     return 0;
1242*437bfbebSnyanmisaka __BITREAD_ERR:
1243*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
1244*437bfbebSnyanmisaka }
1245*437bfbebSnyanmisaka 
mpp_av1_delta_q_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1246*437bfbebSnyanmisaka static RK_S32 mpp_av1_delta_q_params(AV1Context *ctx, BitReadCtx_t *gb,
1247*437bfbebSnyanmisaka                                      AV1RawFrameHeader *current)
1248*437bfbebSnyanmisaka {
1249*437bfbebSnyanmisaka     RK_S32 err;
1250*437bfbebSnyanmisaka     (void)ctx;
1251*437bfbebSnyanmisaka     if (current->base_q_idx > 0)
1252*437bfbebSnyanmisaka         flag(delta_q_present);
1253*437bfbebSnyanmisaka     else
1254*437bfbebSnyanmisaka         infer(delta_q_present, 0);
1255*437bfbebSnyanmisaka 
1256*437bfbebSnyanmisaka     if (current->delta_q_present)
1257*437bfbebSnyanmisaka         fb(2, delta_q_res);
1258*437bfbebSnyanmisaka 
1259*437bfbebSnyanmisaka     return 0;
1260*437bfbebSnyanmisaka }
1261*437bfbebSnyanmisaka 
mpp_av1_delta_lf_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1262*437bfbebSnyanmisaka static RK_S32 mpp_av1_delta_lf_params(AV1Context *ctx, BitReadCtx_t *gb,
1263*437bfbebSnyanmisaka                                       AV1RawFrameHeader *current)
1264*437bfbebSnyanmisaka {
1265*437bfbebSnyanmisaka     RK_S32 err;
1266*437bfbebSnyanmisaka     (void)ctx;
1267*437bfbebSnyanmisaka     if (current->delta_q_present) {
1268*437bfbebSnyanmisaka         if (!current->allow_intrabc)
1269*437bfbebSnyanmisaka             flag(delta_lf_present);
1270*437bfbebSnyanmisaka         else
1271*437bfbebSnyanmisaka             infer(delta_lf_present, 0);
1272*437bfbebSnyanmisaka         if (current->delta_lf_present) {
1273*437bfbebSnyanmisaka             fb(2, delta_lf_res);
1274*437bfbebSnyanmisaka             flag(delta_lf_multi);
1275*437bfbebSnyanmisaka         } else {
1276*437bfbebSnyanmisaka             infer(delta_lf_res,   0);
1277*437bfbebSnyanmisaka             infer(delta_lf_multi, 0);
1278*437bfbebSnyanmisaka         }
1279*437bfbebSnyanmisaka     } else {
1280*437bfbebSnyanmisaka         infer(delta_lf_present, 0);
1281*437bfbebSnyanmisaka         infer(delta_lf_res,     0);
1282*437bfbebSnyanmisaka         infer(delta_lf_multi,   0);
1283*437bfbebSnyanmisaka     }
1284*437bfbebSnyanmisaka 
1285*437bfbebSnyanmisaka     return 0;
1286*437bfbebSnyanmisaka }
1287*437bfbebSnyanmisaka 
mpp_av1_loop_filter_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1288*437bfbebSnyanmisaka static RK_S32 mpp_av1_loop_filter_params(AV1Context *ctx, BitReadCtx_t *gb,
1289*437bfbebSnyanmisaka                                          AV1RawFrameHeader *current)
1290*437bfbebSnyanmisaka {
1291*437bfbebSnyanmisaka     static const RK_S8 default_loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME] =
1292*437bfbebSnyanmisaka     { 1, 0, 0, 0, -1, 0, -1, -1 };
1293*437bfbebSnyanmisaka     static const RK_S8 default_loop_filter_mode_deltas[2] = { 0, 0 };
1294*437bfbebSnyanmisaka     RK_S32 i, err;
1295*437bfbebSnyanmisaka 
1296*437bfbebSnyanmisaka     if (ctx->coded_lossless || current->allow_intrabc) {
1297*437bfbebSnyanmisaka         infer(loop_filter_level[0], 0);
1298*437bfbebSnyanmisaka         infer(loop_filter_level[1], 0);
1299*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_INTRA],    1);
1300*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_LAST],     0);
1301*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_LAST2],    0);
1302*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_LAST3],    0);
1303*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_BWDREF],   0);
1304*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_GOLDEN],  -1);
1305*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_ALTREF],  -1);
1306*437bfbebSnyanmisaka         infer(loop_filter_ref_deltas[AV1_REF_FRAME_ALTREF2], -1);
1307*437bfbebSnyanmisaka         for (i = 0; i < 2; i++)
1308*437bfbebSnyanmisaka             infer(loop_filter_mode_deltas[i], 0);
1309*437bfbebSnyanmisaka         return 0;
1310*437bfbebSnyanmisaka     }
1311*437bfbebSnyanmisaka 
1312*437bfbebSnyanmisaka     fb(6, loop_filter_level[0]);
1313*437bfbebSnyanmisaka     fb(6, loop_filter_level[1]);
1314*437bfbebSnyanmisaka 
1315*437bfbebSnyanmisaka     if (ctx->num_planes > 1) {
1316*437bfbebSnyanmisaka         if (current->loop_filter_level[0] ||
1317*437bfbebSnyanmisaka             current->loop_filter_level[1]) {
1318*437bfbebSnyanmisaka             fb(6, loop_filter_level[2]);
1319*437bfbebSnyanmisaka             fb(6, loop_filter_level[3]);
1320*437bfbebSnyanmisaka         }
1321*437bfbebSnyanmisaka     }
1322*437bfbebSnyanmisaka 
1323*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "orderhint %d loop_filter_level %d %d %d %d\n",
1324*437bfbebSnyanmisaka              current->order_hint,
1325*437bfbebSnyanmisaka              current->loop_filter_level[0], current->loop_filter_level[1],
1326*437bfbebSnyanmisaka              current->loop_filter_level[2], current->loop_filter_level[3]);
1327*437bfbebSnyanmisaka     fb(3, loop_filter_sharpness);
1328*437bfbebSnyanmisaka 
1329*437bfbebSnyanmisaka     flag(loop_filter_delta_enabled);
1330*437bfbebSnyanmisaka     if (current->loop_filter_delta_enabled) {
1331*437bfbebSnyanmisaka         const RK_S8 *ref_loop_filter_ref_deltas, *ref_loop_filter_mode_deltas;
1332*437bfbebSnyanmisaka 
1333*437bfbebSnyanmisaka         if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) {
1334*437bfbebSnyanmisaka             ref_loop_filter_ref_deltas = default_loop_filter_ref_deltas;
1335*437bfbebSnyanmisaka             ref_loop_filter_mode_deltas = default_loop_filter_mode_deltas;
1336*437bfbebSnyanmisaka         } else {
1337*437bfbebSnyanmisaka             ref_loop_filter_ref_deltas =
1338*437bfbebSnyanmisaka                 ctx->ref_s[current->ref_frame_idx[current->primary_ref_frame]].loop_filter_ref_deltas;
1339*437bfbebSnyanmisaka             ref_loop_filter_mode_deltas =
1340*437bfbebSnyanmisaka                 ctx->ref_s[current->ref_frame_idx[current->primary_ref_frame]].loop_filter_mode_deltas;
1341*437bfbebSnyanmisaka         }
1342*437bfbebSnyanmisaka 
1343*437bfbebSnyanmisaka         flag(loop_filter_delta_update);
1344*437bfbebSnyanmisaka         for (i = 0; i < AV1_TOTAL_REFS_PER_FRAME; i++) {
1345*437bfbebSnyanmisaka             if (current->loop_filter_delta_update)
1346*437bfbebSnyanmisaka                 flags(update_ref_delta[i], 1, i);
1347*437bfbebSnyanmisaka             else
1348*437bfbebSnyanmisaka                 infer(update_ref_delta[i], 0);
1349*437bfbebSnyanmisaka             if (current->update_ref_delta[i])
1350*437bfbebSnyanmisaka                 sus(1 + 6, loop_filter_ref_deltas[i], 1, i);
1351*437bfbebSnyanmisaka             else
1352*437bfbebSnyanmisaka                 infer(loop_filter_ref_deltas[i], ref_loop_filter_ref_deltas[i]);
1353*437bfbebSnyanmisaka         }
1354*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) {
1355*437bfbebSnyanmisaka             if (current->loop_filter_delta_update)
1356*437bfbebSnyanmisaka                 flags(update_mode_delta[i], 1, i);
1357*437bfbebSnyanmisaka             else
1358*437bfbebSnyanmisaka                 infer(update_mode_delta[i], 0);
1359*437bfbebSnyanmisaka             if (current->update_mode_delta[i])
1360*437bfbebSnyanmisaka                 sus(1 + 6, loop_filter_mode_deltas[i], 1, i);
1361*437bfbebSnyanmisaka             else
1362*437bfbebSnyanmisaka                 infer(loop_filter_mode_deltas[i], ref_loop_filter_mode_deltas[i]);
1363*437bfbebSnyanmisaka         }
1364*437bfbebSnyanmisaka     } else {
1365*437bfbebSnyanmisaka         for (i = 0; i < AV1_TOTAL_REFS_PER_FRAME; i++)
1366*437bfbebSnyanmisaka             infer(loop_filter_ref_deltas[i], default_loop_filter_ref_deltas[i]);
1367*437bfbebSnyanmisaka         for (i = 0; i < 2; i++)
1368*437bfbebSnyanmisaka             infer(loop_filter_mode_deltas[i], default_loop_filter_mode_deltas[i]);
1369*437bfbebSnyanmisaka     }
1370*437bfbebSnyanmisaka 
1371*437bfbebSnyanmisaka     return 0;
1372*437bfbebSnyanmisaka }
1373*437bfbebSnyanmisaka 
mpp_av1_cdef_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1374*437bfbebSnyanmisaka static RK_S32 mpp_av1_cdef_params(AV1Context *ctx, BitReadCtx_t *gb,
1375*437bfbebSnyanmisaka                                   AV1RawFrameHeader *current)
1376*437bfbebSnyanmisaka {
1377*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
1378*437bfbebSnyanmisaka     RK_S32 i, err;
1379*437bfbebSnyanmisaka     if (ctx->coded_lossless || current->allow_intrabc ||
1380*437bfbebSnyanmisaka         !seq->enable_cdef) {
1381*437bfbebSnyanmisaka         infer(cdef_damping_minus_3, 0);
1382*437bfbebSnyanmisaka         infer(cdef_bits, 0);
1383*437bfbebSnyanmisaka         infer(cdef_y_pri_strength[0],  0);
1384*437bfbebSnyanmisaka         infer(cdef_y_sec_strength[0],  0);
1385*437bfbebSnyanmisaka         infer(cdef_uv_pri_strength[0], 0);
1386*437bfbebSnyanmisaka         infer(cdef_uv_sec_strength[0], 0);
1387*437bfbebSnyanmisaka 
1388*437bfbebSnyanmisaka         return 0;
1389*437bfbebSnyanmisaka     }
1390*437bfbebSnyanmisaka 
1391*437bfbebSnyanmisaka     fb(2, cdef_damping_minus_3);
1392*437bfbebSnyanmisaka     fb(2, cdef_bits);
1393*437bfbebSnyanmisaka 
1394*437bfbebSnyanmisaka     for (i = 0; i < (1 << current->cdef_bits); i++) {
1395*437bfbebSnyanmisaka         fbs(4, cdef_y_pri_strength[i], 1, i);
1396*437bfbebSnyanmisaka         fbs(2, cdef_y_sec_strength[i], 1, i);
1397*437bfbebSnyanmisaka 
1398*437bfbebSnyanmisaka         if (ctx->num_planes > 1) {
1399*437bfbebSnyanmisaka             fbs(4, cdef_uv_pri_strength[i], 1, i);
1400*437bfbebSnyanmisaka             fbs(2, cdef_uv_sec_strength[i], 1, i);
1401*437bfbebSnyanmisaka         }
1402*437bfbebSnyanmisaka     }
1403*437bfbebSnyanmisaka 
1404*437bfbebSnyanmisaka     return 0;
1405*437bfbebSnyanmisaka }
1406*437bfbebSnyanmisaka 
mpp_av1_lr_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1407*437bfbebSnyanmisaka static RK_S32 mpp_av1_lr_params(AV1Context *ctx, BitReadCtx_t *gb,
1408*437bfbebSnyanmisaka                                 AV1RawFrameHeader *current)
1409*437bfbebSnyanmisaka {
1410*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
1411*437bfbebSnyanmisaka     RK_S32 uses_lr,  uses_chroma_lr;
1412*437bfbebSnyanmisaka     RK_S32 i, err;
1413*437bfbebSnyanmisaka 
1414*437bfbebSnyanmisaka     if (ctx->all_lossless || current->allow_intrabc ||
1415*437bfbebSnyanmisaka         !seq->enable_restoration) {
1416*437bfbebSnyanmisaka         return 0;
1417*437bfbebSnyanmisaka     }
1418*437bfbebSnyanmisaka 
1419*437bfbebSnyanmisaka     uses_lr = uses_chroma_lr = 0;
1420*437bfbebSnyanmisaka     for (i = 0; i < ctx->num_planes; i++) {
1421*437bfbebSnyanmisaka         fbs(2, lr_type[i], 1, i);
1422*437bfbebSnyanmisaka 
1423*437bfbebSnyanmisaka         if (current->lr_type[i] != AV1_RESTORE_NONE) {
1424*437bfbebSnyanmisaka             uses_lr = 1;
1425*437bfbebSnyanmisaka             if (i > 0)
1426*437bfbebSnyanmisaka                 uses_chroma_lr = 1;
1427*437bfbebSnyanmisaka         }
1428*437bfbebSnyanmisaka     }
1429*437bfbebSnyanmisaka 
1430*437bfbebSnyanmisaka     if (uses_lr) {
1431*437bfbebSnyanmisaka         if (seq->use_128x128_superblock)
1432*437bfbebSnyanmisaka             increment(lr_unit_shift, 1, 2);
1433*437bfbebSnyanmisaka         else
1434*437bfbebSnyanmisaka             increment(lr_unit_shift, 0, 2);
1435*437bfbebSnyanmisaka 
1436*437bfbebSnyanmisaka         if (seq->color_config.subsampling_x &&
1437*437bfbebSnyanmisaka             seq->color_config.subsampling_y && uses_chroma_lr) {
1438*437bfbebSnyanmisaka             fb(1, lr_uv_shift);
1439*437bfbebSnyanmisaka         } else {
1440*437bfbebSnyanmisaka             infer(lr_uv_shift, 0);
1441*437bfbebSnyanmisaka         }
1442*437bfbebSnyanmisaka     }
1443*437bfbebSnyanmisaka 
1444*437bfbebSnyanmisaka     return 0;
1445*437bfbebSnyanmisaka }
1446*437bfbebSnyanmisaka 
mpp_av1_read_tx_mode(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1447*437bfbebSnyanmisaka static RK_S32 mpp_av1_read_tx_mode(AV1Context *ctx, BitReadCtx_t *gb,
1448*437bfbebSnyanmisaka                                    AV1RawFrameHeader *current)
1449*437bfbebSnyanmisaka {
1450*437bfbebSnyanmisaka     RK_S32 err;
1451*437bfbebSnyanmisaka 
1452*437bfbebSnyanmisaka     if (ctx->coded_lossless)
1453*437bfbebSnyanmisaka         infer(tx_mode, 0);
1454*437bfbebSnyanmisaka     else {
1455*437bfbebSnyanmisaka         flag(tx_mode);
1456*437bfbebSnyanmisaka         current->tx_mode = current->tx_mode ? TX_MODE_SELECT : TX_MODE_LARGEST;
1457*437bfbebSnyanmisaka     }
1458*437bfbebSnyanmisaka 
1459*437bfbebSnyanmisaka     return 0;
1460*437bfbebSnyanmisaka }
1461*437bfbebSnyanmisaka 
mpp_av1_frame_reference_mode(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1462*437bfbebSnyanmisaka static RK_S32 mpp_av1_frame_reference_mode(AV1Context *ctx, BitReadCtx_t *gb,
1463*437bfbebSnyanmisaka                                            AV1RawFrameHeader *current)
1464*437bfbebSnyanmisaka {
1465*437bfbebSnyanmisaka     RK_S32 err;
1466*437bfbebSnyanmisaka     (void)ctx;
1467*437bfbebSnyanmisaka     if (current->frame_type == AV1_FRAME_INTRA_ONLY ||
1468*437bfbebSnyanmisaka         current->frame_type == AV1_FRAME_KEY)
1469*437bfbebSnyanmisaka         infer(reference_select, 0);
1470*437bfbebSnyanmisaka     else
1471*437bfbebSnyanmisaka         flag(reference_select);
1472*437bfbebSnyanmisaka 
1473*437bfbebSnyanmisaka     return 0;
1474*437bfbebSnyanmisaka }
1475*437bfbebSnyanmisaka 
mpp_av1_skip_mode_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1476*437bfbebSnyanmisaka static RK_S32 mpp_av1_skip_mode_params(AV1Context *ctx, BitReadCtx_t *gb,
1477*437bfbebSnyanmisaka                                        AV1RawFrameHeader *current)
1478*437bfbebSnyanmisaka {
1479*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
1480*437bfbebSnyanmisaka     RK_S32 skip_mode_allowed;
1481*437bfbebSnyanmisaka     RK_S32 err;
1482*437bfbebSnyanmisaka 
1483*437bfbebSnyanmisaka     ctx->skip_ref0 = 0;
1484*437bfbebSnyanmisaka     ctx->skip_ref1 = 0;
1485*437bfbebSnyanmisaka 
1486*437bfbebSnyanmisaka     if (current->frame_type == AV1_FRAME_KEY ||
1487*437bfbebSnyanmisaka         current->frame_type == AV1_FRAME_INTRA_ONLY ||
1488*437bfbebSnyanmisaka         !current->reference_select || !seq->enable_order_hint) {
1489*437bfbebSnyanmisaka         skip_mode_allowed = 0;
1490*437bfbebSnyanmisaka     } else {
1491*437bfbebSnyanmisaka         RK_S32 forward_idx,  backward_idx;
1492*437bfbebSnyanmisaka         RK_S32 forward_hint, backward_hint;
1493*437bfbebSnyanmisaka         RK_S32 ref_hint, dist, i;
1494*437bfbebSnyanmisaka 
1495*437bfbebSnyanmisaka         forward_idx  = -1;
1496*437bfbebSnyanmisaka         backward_idx = -1;
1497*437bfbebSnyanmisaka         forward_hint = -1;
1498*437bfbebSnyanmisaka         backward_hint = -1;
1499*437bfbebSnyanmisaka         for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
1500*437bfbebSnyanmisaka             ref_hint = ctx->ref_s[current->ref_frame_idx[i]].order_hint;
1501*437bfbebSnyanmisaka             dist = mpp_av1_get_relative_dist(seq, ref_hint,
1502*437bfbebSnyanmisaka                                              ctx->order_hint);
1503*437bfbebSnyanmisaka             if (dist < 0) {
1504*437bfbebSnyanmisaka                 if (forward_idx < 0 ||
1505*437bfbebSnyanmisaka                     mpp_av1_get_relative_dist(seq, ref_hint,
1506*437bfbebSnyanmisaka                                               forward_hint) > 0) {
1507*437bfbebSnyanmisaka                     forward_idx  = i;
1508*437bfbebSnyanmisaka                     forward_hint = ref_hint;
1509*437bfbebSnyanmisaka                 }
1510*437bfbebSnyanmisaka             } else if (dist > 0) {
1511*437bfbebSnyanmisaka                 if (backward_idx < 0 ||
1512*437bfbebSnyanmisaka                     mpp_av1_get_relative_dist(seq, ref_hint,
1513*437bfbebSnyanmisaka                                               backward_hint) < 0) {
1514*437bfbebSnyanmisaka                     backward_idx  = i;
1515*437bfbebSnyanmisaka                     backward_hint = ref_hint;
1516*437bfbebSnyanmisaka                 }
1517*437bfbebSnyanmisaka             }
1518*437bfbebSnyanmisaka         }
1519*437bfbebSnyanmisaka 
1520*437bfbebSnyanmisaka         if (forward_idx < 0) {
1521*437bfbebSnyanmisaka             skip_mode_allowed = 0;
1522*437bfbebSnyanmisaka         } else if (backward_idx >= 0) {
1523*437bfbebSnyanmisaka             skip_mode_allowed = 1;
1524*437bfbebSnyanmisaka             ctx->skip_ref0 = MPP_MIN(forward_idx, backward_idx) + 1;
1525*437bfbebSnyanmisaka             ctx->skip_ref1 = MPP_MAX(forward_idx, backward_idx) + 1;
1526*437bfbebSnyanmisaka             // Frames for skip mode are forward_idx and backward_idx.
1527*437bfbebSnyanmisaka         } else {
1528*437bfbebSnyanmisaka             RK_S32 second_forward_idx;
1529*437bfbebSnyanmisaka             RK_S32 second_forward_hint;
1530*437bfbebSnyanmisaka             second_forward_idx = -1;
1531*437bfbebSnyanmisaka             for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
1532*437bfbebSnyanmisaka                 ref_hint = ctx->ref_s[current->ref_frame_idx[i]].order_hint;
1533*437bfbebSnyanmisaka                 if (mpp_av1_get_relative_dist(seq, ref_hint,
1534*437bfbebSnyanmisaka                                               forward_hint) < 0) {
1535*437bfbebSnyanmisaka                     if (second_forward_idx < 0 ||
1536*437bfbebSnyanmisaka                         mpp_av1_get_relative_dist(seq, ref_hint,
1537*437bfbebSnyanmisaka                                                   second_forward_hint) > 0) {
1538*437bfbebSnyanmisaka                         second_forward_idx  = i;
1539*437bfbebSnyanmisaka                         second_forward_hint = ref_hint;
1540*437bfbebSnyanmisaka                     }
1541*437bfbebSnyanmisaka                 }
1542*437bfbebSnyanmisaka             }
1543*437bfbebSnyanmisaka 
1544*437bfbebSnyanmisaka             if (second_forward_idx < 0) {
1545*437bfbebSnyanmisaka                 skip_mode_allowed = 0;
1546*437bfbebSnyanmisaka             } else {
1547*437bfbebSnyanmisaka                 ctx->skip_ref0 = MPP_MIN(forward_idx, second_forward_idx) + 1;
1548*437bfbebSnyanmisaka                 ctx->skip_ref1 = MPP_MAX(forward_idx, second_forward_idx) + 1;
1549*437bfbebSnyanmisaka                 skip_mode_allowed = 1;
1550*437bfbebSnyanmisaka                 // Frames for skip mode are forward_idx and second_forward_idx.
1551*437bfbebSnyanmisaka             }
1552*437bfbebSnyanmisaka         }
1553*437bfbebSnyanmisaka     }
1554*437bfbebSnyanmisaka 
1555*437bfbebSnyanmisaka     if (skip_mode_allowed)
1556*437bfbebSnyanmisaka         flag(skip_mode_present);
1557*437bfbebSnyanmisaka     else
1558*437bfbebSnyanmisaka         infer(skip_mode_present, 0);
1559*437bfbebSnyanmisaka 
1560*437bfbebSnyanmisaka     return 0;
1561*437bfbebSnyanmisaka }
1562*437bfbebSnyanmisaka 
mpp_av1_global_motion_param(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current,RK_S32 type,RK_S32 ref,RK_S32 idx)1563*437bfbebSnyanmisaka static RK_S32 mpp_av1_global_motion_param(AV1Context *ctx, BitReadCtx_t *gb,
1564*437bfbebSnyanmisaka                                           AV1RawFrameHeader *current,
1565*437bfbebSnyanmisaka                                           RK_S32 type, RK_S32 ref, RK_S32 idx)
1566*437bfbebSnyanmisaka {
1567*437bfbebSnyanmisaka     RK_U32 abs_bits, prec_bits, num_syms;
1568*437bfbebSnyanmisaka     RK_S32 err;
1569*437bfbebSnyanmisaka     (void)ctx;
1570*437bfbebSnyanmisaka     if (idx < 2) {
1571*437bfbebSnyanmisaka         if (type == AV1_WARP_MODEL_TRANSLATION) {
1572*437bfbebSnyanmisaka             abs_bits  = AV1_GM_ABS_TRANS_ONLY_BITS  - !current->allow_high_precision_mv;
1573*437bfbebSnyanmisaka             prec_bits = AV1_GM_TRANS_ONLY_PREC_BITS - !current->allow_high_precision_mv;
1574*437bfbebSnyanmisaka         } else {
1575*437bfbebSnyanmisaka             abs_bits  = AV1_GM_ABS_TRANS_BITS;
1576*437bfbebSnyanmisaka             prec_bits = AV1_GM_TRANS_PREC_BITS;
1577*437bfbebSnyanmisaka         }
1578*437bfbebSnyanmisaka     } else {
1579*437bfbebSnyanmisaka         abs_bits  = AV1_GM_ABS_ALPHA_BITS;
1580*437bfbebSnyanmisaka         prec_bits = AV1_GM_ALPHA_PREC_BITS;
1581*437bfbebSnyanmisaka     }
1582*437bfbebSnyanmisaka 
1583*437bfbebSnyanmisaka     num_syms = 2 * (1 << abs_bits) + 1;
1584*437bfbebSnyanmisaka     subexp(gm_params[ref][idx], num_syms);// 2, ref, idx);
1585*437bfbebSnyanmisaka 
1586*437bfbebSnyanmisaka     // Actual gm_params value is not reconstructed here.
1587*437bfbebSnyanmisaka     (void)prec_bits;
1588*437bfbebSnyanmisaka 
1589*437bfbebSnyanmisaka     return 0;
1590*437bfbebSnyanmisaka }
1591*437bfbebSnyanmisaka 
1592*437bfbebSnyanmisaka /*
1593*437bfbebSnyanmisaka  * Actual gm_params value is not reconstructed here.
1594*437bfbebSnyanmisaka  * Real gm_params update in av1d_parser.c->global_motion_params()
1595*437bfbebSnyanmisaka  */
mpp_av1_global_motion_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1596*437bfbebSnyanmisaka static RK_S32 mpp_av1_global_motion_params(AV1Context *ctx, BitReadCtx_t *gb,
1597*437bfbebSnyanmisaka                                            AV1RawFrameHeader *current)
1598*437bfbebSnyanmisaka {
1599*437bfbebSnyanmisaka     RK_S32 ref, type;
1600*437bfbebSnyanmisaka     RK_S32 err;
1601*437bfbebSnyanmisaka 
1602*437bfbebSnyanmisaka     if (current->frame_type == AV1_FRAME_KEY ||
1603*437bfbebSnyanmisaka         current->frame_type == AV1_FRAME_INTRA_ONLY)
1604*437bfbebSnyanmisaka         return 0;
1605*437bfbebSnyanmisaka 
1606*437bfbebSnyanmisaka     for (ref = AV1_REF_FRAME_LAST; ref <= AV1_REF_FRAME_ALTREF; ref++) {
1607*437bfbebSnyanmisaka         flags(is_global[ref], 1, ref);
1608*437bfbebSnyanmisaka         if (current->is_global[ref]) {
1609*437bfbebSnyanmisaka             flags(is_rot_zoom[ref], 1, ref);
1610*437bfbebSnyanmisaka             if (current->is_rot_zoom[ref]) {
1611*437bfbebSnyanmisaka                 type = AV1_WARP_MODEL_ROTZOOM;
1612*437bfbebSnyanmisaka             } else {
1613*437bfbebSnyanmisaka                 flags(is_translation[ref], 1, ref);
1614*437bfbebSnyanmisaka                 type = current->is_translation[ref] ? AV1_WARP_MODEL_TRANSLATION
1615*437bfbebSnyanmisaka                        : AV1_WARP_MODEL_AFFINE;
1616*437bfbebSnyanmisaka             }
1617*437bfbebSnyanmisaka         } else {
1618*437bfbebSnyanmisaka             type = AV1_WARP_MODEL_IDENTITY;
1619*437bfbebSnyanmisaka         }
1620*437bfbebSnyanmisaka 
1621*437bfbebSnyanmisaka         if (type >= AV1_WARP_MODEL_ROTZOOM) {
1622*437bfbebSnyanmisaka             CHECK(mpp_av1_global_motion_param(ctx, gb, current, type, ref, 2));
1623*437bfbebSnyanmisaka             CHECK(mpp_av1_global_motion_param(ctx, gb, current, type, ref, 3));
1624*437bfbebSnyanmisaka             if (type == AV1_WARP_MODEL_AFFINE) {
1625*437bfbebSnyanmisaka                 CHECK(mpp_av1_global_motion_param(ctx, gb, current, type, ref, 4));
1626*437bfbebSnyanmisaka                 CHECK(mpp_av1_global_motion_param(ctx, gb, current, type, ref, 5));
1627*437bfbebSnyanmisaka             } else {
1628*437bfbebSnyanmisaka                 current->gm_params[ref][4] =  -current->gm_params[ref][3];
1629*437bfbebSnyanmisaka                 current->gm_params[ref][5] =   current->gm_params[ref][2];
1630*437bfbebSnyanmisaka             }
1631*437bfbebSnyanmisaka         }
1632*437bfbebSnyanmisaka         if (type >= AV1_WARP_MODEL_TRANSLATION) {
1633*437bfbebSnyanmisaka             CHECK(mpp_av1_global_motion_param(ctx, gb, current, type, ref, 0));
1634*437bfbebSnyanmisaka             CHECK(mpp_av1_global_motion_param(ctx, gb, current, type, ref, 1));
1635*437bfbebSnyanmisaka         }
1636*437bfbebSnyanmisaka     }
1637*437bfbebSnyanmisaka 
1638*437bfbebSnyanmisaka     return 0;
1639*437bfbebSnyanmisaka }
1640*437bfbebSnyanmisaka 
mpp_av1_film_grain_params(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFilmGrainParams * current,AV1RawFrameHeader * frame_header)1641*437bfbebSnyanmisaka static RK_S32 mpp_av1_film_grain_params(AV1Context *ctx, BitReadCtx_t *gb,
1642*437bfbebSnyanmisaka                                         AV1RawFilmGrainParams *current,
1643*437bfbebSnyanmisaka                                         AV1RawFrameHeader *frame_header)
1644*437bfbebSnyanmisaka {
1645*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq = ctx->sequence_header;
1646*437bfbebSnyanmisaka     RK_S32 num_pos_luma, num_pos_chroma;
1647*437bfbebSnyanmisaka     RK_S32 i, err;
1648*437bfbebSnyanmisaka 
1649*437bfbebSnyanmisaka     if (!seq->film_grain_params_present ||
1650*437bfbebSnyanmisaka         (!frame_header->show_frame && !frame_header->showable_frame))
1651*437bfbebSnyanmisaka         return 0;
1652*437bfbebSnyanmisaka 
1653*437bfbebSnyanmisaka     flag(apply_grain);
1654*437bfbebSnyanmisaka 
1655*437bfbebSnyanmisaka     if (!current->apply_grain)
1656*437bfbebSnyanmisaka         return 0;
1657*437bfbebSnyanmisaka 
1658*437bfbebSnyanmisaka     fb(16, grain_seed);
1659*437bfbebSnyanmisaka 
1660*437bfbebSnyanmisaka     if (frame_header->frame_type == AV1_FRAME_INTER)
1661*437bfbebSnyanmisaka         flag(update_grain);
1662*437bfbebSnyanmisaka     else
1663*437bfbebSnyanmisaka         infer(update_grain, 1);
1664*437bfbebSnyanmisaka 
1665*437bfbebSnyanmisaka     if (!current->update_grain) {
1666*437bfbebSnyanmisaka         fb(3, film_grain_params_ref_idx);
1667*437bfbebSnyanmisaka         return 0;
1668*437bfbebSnyanmisaka     }
1669*437bfbebSnyanmisaka 
1670*437bfbebSnyanmisaka     fc(4, num_y_points, 0, 14);
1671*437bfbebSnyanmisaka     for (i = 0; i < current->num_y_points; i++) {
1672*437bfbebSnyanmisaka         fcs(8, point_y_value[i],
1673*437bfbebSnyanmisaka             i ? current->point_y_value[i - 1] + 1 : 0,
1674*437bfbebSnyanmisaka             MAX_UINT_BITS(8) - (current->num_y_points - i - 1),
1675*437bfbebSnyanmisaka             1, i);
1676*437bfbebSnyanmisaka         fbs(8, point_y_scaling[i], 1, i);
1677*437bfbebSnyanmisaka     }
1678*437bfbebSnyanmisaka 
1679*437bfbebSnyanmisaka     if (seq->color_config.mono_chrome)
1680*437bfbebSnyanmisaka         infer(chroma_scaling_from_luma, 0);
1681*437bfbebSnyanmisaka     else
1682*437bfbebSnyanmisaka         flag(chroma_scaling_from_luma);
1683*437bfbebSnyanmisaka 
1684*437bfbebSnyanmisaka     if (seq->color_config.mono_chrome ||
1685*437bfbebSnyanmisaka         current->chroma_scaling_from_luma ||
1686*437bfbebSnyanmisaka         (seq->color_config.subsampling_x == 1 &&
1687*437bfbebSnyanmisaka          seq->color_config.subsampling_y == 1 &&
1688*437bfbebSnyanmisaka          current->num_y_points == 0)) {
1689*437bfbebSnyanmisaka         infer(num_cb_points, 0);
1690*437bfbebSnyanmisaka         infer(num_cr_points, 0);
1691*437bfbebSnyanmisaka     } else {
1692*437bfbebSnyanmisaka         fc(4, num_cb_points, 0, 10);
1693*437bfbebSnyanmisaka         for (i = 0; i < current->num_cb_points; i++) {
1694*437bfbebSnyanmisaka             fcs(8, point_cb_value[i],
1695*437bfbebSnyanmisaka                 i ? current->point_cb_value[i - 1] + 1 : 0,
1696*437bfbebSnyanmisaka                 MAX_UINT_BITS(8) - (current->num_cb_points - i - 1),
1697*437bfbebSnyanmisaka                 1, i);
1698*437bfbebSnyanmisaka             fbs(8, point_cb_scaling[i], 1, i);
1699*437bfbebSnyanmisaka         }
1700*437bfbebSnyanmisaka         fc(4, num_cr_points, 0, 10);
1701*437bfbebSnyanmisaka         for (i = 0; i < current->num_cr_points; i++) {
1702*437bfbebSnyanmisaka             fcs(8, point_cr_value[i],
1703*437bfbebSnyanmisaka                 i ? current->point_cr_value[i - 1] + 1 : 0,
1704*437bfbebSnyanmisaka                 MAX_UINT_BITS(8) - (current->num_cr_points - i - 1),
1705*437bfbebSnyanmisaka                 1, i);
1706*437bfbebSnyanmisaka             fbs(8, point_cr_scaling[i], 1, i);
1707*437bfbebSnyanmisaka         }
1708*437bfbebSnyanmisaka     }
1709*437bfbebSnyanmisaka 
1710*437bfbebSnyanmisaka     fb(2, grain_scaling_minus_8);
1711*437bfbebSnyanmisaka     fb(2, ar_coeff_lag);
1712*437bfbebSnyanmisaka     num_pos_luma = 2 * current->ar_coeff_lag * (current->ar_coeff_lag + 1);
1713*437bfbebSnyanmisaka     if (current->num_y_points) {
1714*437bfbebSnyanmisaka         num_pos_chroma = num_pos_luma + 1;
1715*437bfbebSnyanmisaka         for (i = 0; i < num_pos_luma; i++)
1716*437bfbebSnyanmisaka             fbs(8, ar_coeffs_y_plus_128[i], 1, i);
1717*437bfbebSnyanmisaka     } else {
1718*437bfbebSnyanmisaka         num_pos_chroma = num_pos_luma;
1719*437bfbebSnyanmisaka     }
1720*437bfbebSnyanmisaka     if (current->chroma_scaling_from_luma || current->num_cb_points) {
1721*437bfbebSnyanmisaka         for (i = 0; i < num_pos_chroma; i++)
1722*437bfbebSnyanmisaka             fbs(8, ar_coeffs_cb_plus_128[i], 1, i);
1723*437bfbebSnyanmisaka     }
1724*437bfbebSnyanmisaka     if (current->chroma_scaling_from_luma || current->num_cr_points) {
1725*437bfbebSnyanmisaka         for (i = 0; i < num_pos_chroma; i++)
1726*437bfbebSnyanmisaka             fbs(8, ar_coeffs_cr_plus_128[i], 1, i);
1727*437bfbebSnyanmisaka     }
1728*437bfbebSnyanmisaka     fb(2, ar_coeff_shift_minus_6);
1729*437bfbebSnyanmisaka     fb(2, grain_scale_shift);
1730*437bfbebSnyanmisaka     if (current->num_cb_points) {
1731*437bfbebSnyanmisaka         fb(8, cb_mult);
1732*437bfbebSnyanmisaka         fb(8, cb_luma_mult);
1733*437bfbebSnyanmisaka         fb(9, cb_offset);
1734*437bfbebSnyanmisaka     }
1735*437bfbebSnyanmisaka     if (current->num_cr_points) {
1736*437bfbebSnyanmisaka         fb(8, cr_mult);
1737*437bfbebSnyanmisaka         fb(8, cr_luma_mult);
1738*437bfbebSnyanmisaka         fb(9, cr_offset);
1739*437bfbebSnyanmisaka     }
1740*437bfbebSnyanmisaka 
1741*437bfbebSnyanmisaka     flag(overlap_flag);
1742*437bfbebSnyanmisaka     flag(clip_to_restricted_range);
1743*437bfbebSnyanmisaka 
1744*437bfbebSnyanmisaka     return 0;
1745*437bfbebSnyanmisaka }
1746*437bfbebSnyanmisaka 
mpp_av1_uncompressed_header(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current)1747*437bfbebSnyanmisaka static RK_S32 mpp_av1_uncompressed_header(AV1Context *ctx, BitReadCtx_t *gb,
1748*437bfbebSnyanmisaka                                           AV1RawFrameHeader *current)
1749*437bfbebSnyanmisaka {
1750*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq;
1751*437bfbebSnyanmisaka     RK_S32 id_len, diff_len, all_frames, frame_is_intra, order_hint_bits;
1752*437bfbebSnyanmisaka     RK_S32 i, err;
1753*437bfbebSnyanmisaka 
1754*437bfbebSnyanmisaka     if (!ctx->sequence_header) {
1755*437bfbebSnyanmisaka         mpp_err_f("No sequence header available: "
1756*437bfbebSnyanmisaka                   "unable to decode frame header.\n");
1757*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
1758*437bfbebSnyanmisaka     }
1759*437bfbebSnyanmisaka     seq = ctx->sequence_header;
1760*437bfbebSnyanmisaka 
1761*437bfbebSnyanmisaka     id_len = seq->additional_frame_id_length_minus_1 +
1762*437bfbebSnyanmisaka              seq->delta_frame_id_length_minus_2 + 3;
1763*437bfbebSnyanmisaka     all_frames = (1 << AV1_NUM_REF_FRAMES) - 1;
1764*437bfbebSnyanmisaka 
1765*437bfbebSnyanmisaka     if (seq->reduced_still_picture_header) {
1766*437bfbebSnyanmisaka         infer(show_existing_frame, 0);
1767*437bfbebSnyanmisaka         infer(frame_type,     AV1_FRAME_KEY);
1768*437bfbebSnyanmisaka         infer(show_frame,     1);
1769*437bfbebSnyanmisaka         infer(showable_frame, 0);
1770*437bfbebSnyanmisaka         frame_is_intra = 1;
1771*437bfbebSnyanmisaka 
1772*437bfbebSnyanmisaka     } else {
1773*437bfbebSnyanmisaka         flag(show_existing_frame);
1774*437bfbebSnyanmisaka 
1775*437bfbebSnyanmisaka         if (current->show_existing_frame) {
1776*437bfbebSnyanmisaka             AV1ReferenceFrameState *ref;
1777*437bfbebSnyanmisaka 
1778*437bfbebSnyanmisaka             fb(3, frame_to_show_map_idx);
1779*437bfbebSnyanmisaka             ref = &ctx->ref_s[current->frame_to_show_map_idx];
1780*437bfbebSnyanmisaka 
1781*437bfbebSnyanmisaka             if (!ref->valid) {
1782*437bfbebSnyanmisaka                 mpp_err_f("Missing reference frame needed for "
1783*437bfbebSnyanmisaka                           "show_existing_frame (frame_to_show_map_idx = %d).\n",
1784*437bfbebSnyanmisaka                           current->frame_to_show_map_idx);
1785*437bfbebSnyanmisaka                 return MPP_ERR_UNKNOW;
1786*437bfbebSnyanmisaka             }
1787*437bfbebSnyanmisaka 
1788*437bfbebSnyanmisaka             if (seq->decoder_model_info_present_flag &&
1789*437bfbebSnyanmisaka                 !seq->timing_info.equal_picture_interval) {
1790*437bfbebSnyanmisaka                 fb(seq->decoder_model_info.frame_presentation_time_length_minus_1 + 1,
1791*437bfbebSnyanmisaka                    frame_presentation_time);
1792*437bfbebSnyanmisaka             }
1793*437bfbebSnyanmisaka 
1794*437bfbebSnyanmisaka             if (seq->frame_id_numbers_present_flag)
1795*437bfbebSnyanmisaka                 fb(id_len, display_frame_id);
1796*437bfbebSnyanmisaka 
1797*437bfbebSnyanmisaka             infer(frame_type, ref->frame_type);
1798*437bfbebSnyanmisaka             if (current->frame_type == AV1_FRAME_KEY) {
1799*437bfbebSnyanmisaka                 infer(refresh_frame_flags, all_frames);
1800*437bfbebSnyanmisaka 
1801*437bfbebSnyanmisaka                 // Section 7.21
1802*437bfbebSnyanmisaka                 infer(current_frame_id, ref->frame_id);
1803*437bfbebSnyanmisaka                 ctx->upscaled_width  = ref->upscaled_width;
1804*437bfbebSnyanmisaka                 ctx->frame_width     = ref->frame_width;
1805*437bfbebSnyanmisaka                 ctx->frame_height    = ref->frame_height;
1806*437bfbebSnyanmisaka                 ctx->render_width    = ref->render_width;
1807*437bfbebSnyanmisaka                 ctx->render_height   = ref->render_height;
1808*437bfbebSnyanmisaka                 ctx->bit_depth       = ref->bit_depth;
1809*437bfbebSnyanmisaka                 ctx->order_hint      = ref->order_hint;
1810*437bfbebSnyanmisaka             } else
1811*437bfbebSnyanmisaka                 infer(refresh_frame_flags, 0);
1812*437bfbebSnyanmisaka 
1813*437bfbebSnyanmisaka             infer(frame_width_minus_1,   ref->upscaled_width - 1);
1814*437bfbebSnyanmisaka             infer(frame_height_minus_1,  ref->frame_height - 1);
1815*437bfbebSnyanmisaka             infer(render_width_minus_1,  ref->render_width - 1);
1816*437bfbebSnyanmisaka             infer(render_height_minus_1, ref->render_height - 1);
1817*437bfbebSnyanmisaka 
1818*437bfbebSnyanmisaka             return 0;
1819*437bfbebSnyanmisaka         }
1820*437bfbebSnyanmisaka 
1821*437bfbebSnyanmisaka         fb(2, frame_type);
1822*437bfbebSnyanmisaka         frame_is_intra = (current->frame_type == AV1_FRAME_INTRA_ONLY ||
1823*437bfbebSnyanmisaka                           current->frame_type == AV1_FRAME_KEY);
1824*437bfbebSnyanmisaka 
1825*437bfbebSnyanmisaka         ctx->frame_is_intra = frame_is_intra;
1826*437bfbebSnyanmisaka         if (current->frame_type == AV1_FRAME_KEY) {
1827*437bfbebSnyanmisaka             RK_U32 refresh_frame_flags = (1 << NUM_REF_FRAMES) - 1;
1828*437bfbebSnyanmisaka 
1829*437bfbebSnyanmisaka             Av1GetCDFs(ctx, current->frame_to_show_map_idx);
1830*437bfbebSnyanmisaka             Av1StoreCDFs(ctx, refresh_frame_flags);
1831*437bfbebSnyanmisaka         }
1832*437bfbebSnyanmisaka 
1833*437bfbebSnyanmisaka         flag(show_frame);
1834*437bfbebSnyanmisaka         if (current->show_frame &&
1835*437bfbebSnyanmisaka             seq->decoder_model_info_present_flag &&
1836*437bfbebSnyanmisaka             !seq->timing_info.equal_picture_interval) {
1837*437bfbebSnyanmisaka             fb(seq->decoder_model_info.frame_presentation_time_length_minus_1 + 1,
1838*437bfbebSnyanmisaka                frame_presentation_time);
1839*437bfbebSnyanmisaka         }
1840*437bfbebSnyanmisaka         if (current->show_frame)
1841*437bfbebSnyanmisaka             infer(showable_frame, current->frame_type != AV1_FRAME_KEY);
1842*437bfbebSnyanmisaka         else
1843*437bfbebSnyanmisaka             flag(showable_frame);
1844*437bfbebSnyanmisaka 
1845*437bfbebSnyanmisaka         if (current->frame_type == AV1_FRAME_SWITCH ||
1846*437bfbebSnyanmisaka             (current->frame_type == AV1_FRAME_KEY && current->show_frame))
1847*437bfbebSnyanmisaka             infer(error_resilient_mode, 1);
1848*437bfbebSnyanmisaka         else
1849*437bfbebSnyanmisaka             flag(error_resilient_mode);
1850*437bfbebSnyanmisaka     }
1851*437bfbebSnyanmisaka 
1852*437bfbebSnyanmisaka     if (current->frame_type == AV1_FRAME_KEY && current->show_frame) {
1853*437bfbebSnyanmisaka         for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
1854*437bfbebSnyanmisaka             ctx->ref_s[i].valid = 0;
1855*437bfbebSnyanmisaka             ctx->ref_s[i].order_hint = 0;
1856*437bfbebSnyanmisaka         }
1857*437bfbebSnyanmisaka     }
1858*437bfbebSnyanmisaka 
1859*437bfbebSnyanmisaka     flag(disable_cdf_update);
1860*437bfbebSnyanmisaka 
1861*437bfbebSnyanmisaka     if (seq->seq_force_screen_content_tools ==
1862*437bfbebSnyanmisaka         AV1_SELECT_SCREEN_CONTENT_TOOLS) {
1863*437bfbebSnyanmisaka         flag(allow_screen_content_tools);
1864*437bfbebSnyanmisaka     } else {
1865*437bfbebSnyanmisaka         infer(allow_screen_content_tools,
1866*437bfbebSnyanmisaka               seq->seq_force_screen_content_tools);
1867*437bfbebSnyanmisaka     }
1868*437bfbebSnyanmisaka     if (current->allow_screen_content_tools) {
1869*437bfbebSnyanmisaka         if (seq->seq_force_integer_mv == AV1_SELECT_INTEGER_MV)
1870*437bfbebSnyanmisaka             flag(force_integer_mv);
1871*437bfbebSnyanmisaka         else
1872*437bfbebSnyanmisaka             infer(force_integer_mv, seq->seq_force_integer_mv);
1873*437bfbebSnyanmisaka     } else {
1874*437bfbebSnyanmisaka         infer(force_integer_mv, 0);
1875*437bfbebSnyanmisaka     }
1876*437bfbebSnyanmisaka 
1877*437bfbebSnyanmisaka     if (seq->frame_id_numbers_present_flag) {
1878*437bfbebSnyanmisaka         fb(id_len, current_frame_id);
1879*437bfbebSnyanmisaka 
1880*437bfbebSnyanmisaka         diff_len = seq->delta_frame_id_length_minus_2 + 2;
1881*437bfbebSnyanmisaka         for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
1882*437bfbebSnyanmisaka             if (current->current_frame_id > (RK_S32)(1 << diff_len)) {
1883*437bfbebSnyanmisaka                 if (ctx->ref_s[i].frame_id > current->current_frame_id ||
1884*437bfbebSnyanmisaka                     ctx->ref_s[i].frame_id < (current->current_frame_id -
1885*437bfbebSnyanmisaka                                               (RK_S32)(1 << diff_len)))
1886*437bfbebSnyanmisaka                     ctx->ref_s[i].valid = 0;
1887*437bfbebSnyanmisaka             } else {
1888*437bfbebSnyanmisaka                 if (ctx->ref_s[i].frame_id > current->current_frame_id &&
1889*437bfbebSnyanmisaka                     ctx->ref_s[i].frame_id < ((RK_S32)(1 << id_len) +
1890*437bfbebSnyanmisaka                                               current->current_frame_id -
1891*437bfbebSnyanmisaka                                               (RK_S32)(1 << diff_len)))
1892*437bfbebSnyanmisaka                     ctx->ref_s[i].valid = 0;
1893*437bfbebSnyanmisaka             }
1894*437bfbebSnyanmisaka         }
1895*437bfbebSnyanmisaka     } else {
1896*437bfbebSnyanmisaka         infer(current_frame_id, 0);
1897*437bfbebSnyanmisaka     }
1898*437bfbebSnyanmisaka 
1899*437bfbebSnyanmisaka     if (current->frame_type == AV1_FRAME_SWITCH)
1900*437bfbebSnyanmisaka         infer(frame_size_override_flag, 1);
1901*437bfbebSnyanmisaka     else if (seq->reduced_still_picture_header)
1902*437bfbebSnyanmisaka         infer(frame_size_override_flag, 0);
1903*437bfbebSnyanmisaka     else
1904*437bfbebSnyanmisaka         flag(frame_size_override_flag);
1905*437bfbebSnyanmisaka 
1906*437bfbebSnyanmisaka     order_hint_bits =
1907*437bfbebSnyanmisaka         seq->enable_order_hint ? seq->order_hint_bits_minus_1 + 1 : 0;
1908*437bfbebSnyanmisaka     if (order_hint_bits > 0)
1909*437bfbebSnyanmisaka         fb(order_hint_bits, order_hint);
1910*437bfbebSnyanmisaka     else
1911*437bfbebSnyanmisaka         infer(order_hint, 0);
1912*437bfbebSnyanmisaka     ctx->order_hint = current->order_hint;
1913*437bfbebSnyanmisaka 
1914*437bfbebSnyanmisaka     if (frame_is_intra || current->error_resilient_mode)
1915*437bfbebSnyanmisaka         infer(primary_ref_frame, AV1_PRIMARY_REF_NONE);
1916*437bfbebSnyanmisaka     else
1917*437bfbebSnyanmisaka         fb(3, primary_ref_frame);
1918*437bfbebSnyanmisaka 
1919*437bfbebSnyanmisaka     if (seq->decoder_model_info_present_flag) {
1920*437bfbebSnyanmisaka         flag(buffer_removal_time_present_flag);
1921*437bfbebSnyanmisaka         if (current->buffer_removal_time_present_flag) {
1922*437bfbebSnyanmisaka             for (i = 0; i <= seq->operating_points_cnt_minus_1; i++) {
1923*437bfbebSnyanmisaka                 if (seq->decoder_model_present_for_this_op[i]) {
1924*437bfbebSnyanmisaka                     RK_S32 op_pt_idc = seq->operating_point_idc[i];
1925*437bfbebSnyanmisaka                     RK_S32 in_temporal_layer = (op_pt_idc >>  ctx->temporal_id    ) & 1;
1926*437bfbebSnyanmisaka                     RK_S32 in_spatial_layer  = (op_pt_idc >> (ctx->spatial_id + 8)) & 1;
1927*437bfbebSnyanmisaka                     if (seq->operating_point_idc[i] == 0 ||
1928*437bfbebSnyanmisaka                         (in_temporal_layer && in_spatial_layer)) {
1929*437bfbebSnyanmisaka                         fbs(seq->decoder_model_info.buffer_removal_time_length_minus_1 + 1,
1930*437bfbebSnyanmisaka                             buffer_removal_time[i], 1, i);
1931*437bfbebSnyanmisaka                     }
1932*437bfbebSnyanmisaka                 }
1933*437bfbebSnyanmisaka             }
1934*437bfbebSnyanmisaka         }
1935*437bfbebSnyanmisaka     }
1936*437bfbebSnyanmisaka 
1937*437bfbebSnyanmisaka     if (current->frame_type == AV1_FRAME_SWITCH ||
1938*437bfbebSnyanmisaka         (current->frame_type == AV1_FRAME_KEY && current->show_frame))
1939*437bfbebSnyanmisaka         infer(refresh_frame_flags, all_frames);
1940*437bfbebSnyanmisaka     else
1941*437bfbebSnyanmisaka         fb(8, refresh_frame_flags);
1942*437bfbebSnyanmisaka 
1943*437bfbebSnyanmisaka     ctx->refresh_frame_flags = current->refresh_frame_flags;
1944*437bfbebSnyanmisaka     if (!frame_is_intra || current->refresh_frame_flags != all_frames) {
1945*437bfbebSnyanmisaka         if (seq->enable_order_hint) {
1946*437bfbebSnyanmisaka             for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
1947*437bfbebSnyanmisaka                 if (current->error_resilient_mode)
1948*437bfbebSnyanmisaka                     fbs(order_hint_bits, ref_order_hint[i], 1, i);
1949*437bfbebSnyanmisaka                 else
1950*437bfbebSnyanmisaka                     infer(ref_order_hint[i], ctx->ref_s[i].order_hint);
1951*437bfbebSnyanmisaka                 if (current->ref_order_hint[i] != ctx->ref_s[i].order_hint)
1952*437bfbebSnyanmisaka                     ctx->ref_s[i].valid = 0;
1953*437bfbebSnyanmisaka             }
1954*437bfbebSnyanmisaka         }
1955*437bfbebSnyanmisaka     }
1956*437bfbebSnyanmisaka 
1957*437bfbebSnyanmisaka     current->ref_frame_valued = 1;
1958*437bfbebSnyanmisaka     if (current->frame_type == AV1_FRAME_KEY ||
1959*437bfbebSnyanmisaka         current->frame_type == AV1_FRAME_INTRA_ONLY) {
1960*437bfbebSnyanmisaka         CHECK(mpp_av1_frame_size(ctx, gb, current));
1961*437bfbebSnyanmisaka         CHECK(mpp_av1_render_size(ctx, gb, current));
1962*437bfbebSnyanmisaka 
1963*437bfbebSnyanmisaka         if (current->allow_screen_content_tools &&
1964*437bfbebSnyanmisaka             ctx->upscaled_width == ctx->frame_width)
1965*437bfbebSnyanmisaka             flag(allow_intrabc);
1966*437bfbebSnyanmisaka         else
1967*437bfbebSnyanmisaka             infer(allow_intrabc, 0);
1968*437bfbebSnyanmisaka 
1969*437bfbebSnyanmisaka         current->ref_frame_valued = 0;
1970*437bfbebSnyanmisaka     } else {
1971*437bfbebSnyanmisaka         if (!seq->enable_order_hint) {
1972*437bfbebSnyanmisaka             infer(frame_refs_short_signaling, 0);
1973*437bfbebSnyanmisaka         } else {
1974*437bfbebSnyanmisaka             flag(frame_refs_short_signaling);
1975*437bfbebSnyanmisaka             if (current->frame_refs_short_signaling) {
1976*437bfbebSnyanmisaka                 fb(3, last_frame_idx);
1977*437bfbebSnyanmisaka                 fb(3, golden_frame_idx);
1978*437bfbebSnyanmisaka                 CHECK(mpp_av1_set_frame_refs(ctx, gb, current));
1979*437bfbebSnyanmisaka             }
1980*437bfbebSnyanmisaka         }
1981*437bfbebSnyanmisaka 
1982*437bfbebSnyanmisaka         for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
1983*437bfbebSnyanmisaka             if (!current->frame_refs_short_signaling)
1984*437bfbebSnyanmisaka                 fbs(3, ref_frame_idx[i], 1, i);
1985*437bfbebSnyanmisaka             if (seq->frame_id_numbers_present_flag) {
1986*437bfbebSnyanmisaka                 fbs(seq->delta_frame_id_length_minus_2 + 2,
1987*437bfbebSnyanmisaka                     delta_frame_id_minus1[i], 1, i);
1988*437bfbebSnyanmisaka             }
1989*437bfbebSnyanmisaka         }
1990*437bfbebSnyanmisaka 
1991*437bfbebSnyanmisaka         if (current->frame_size_override_flag &&
1992*437bfbebSnyanmisaka             !current->error_resilient_mode) {
1993*437bfbebSnyanmisaka             CHECK(mpp_av1_frame_size_with_refs(ctx, gb, current));
1994*437bfbebSnyanmisaka         } else {
1995*437bfbebSnyanmisaka             CHECK(mpp_av1_frame_size(ctx, gb, current));
1996*437bfbebSnyanmisaka             CHECK(mpp_av1_render_size(ctx, gb, current));
1997*437bfbebSnyanmisaka         }
1998*437bfbebSnyanmisaka 
1999*437bfbebSnyanmisaka         if (current->force_integer_mv)
2000*437bfbebSnyanmisaka             infer(allow_high_precision_mv, 0);
2001*437bfbebSnyanmisaka         else
2002*437bfbebSnyanmisaka             flag(allow_high_precision_mv);
2003*437bfbebSnyanmisaka 
2004*437bfbebSnyanmisaka         CHECK(mpp_av1_interpolation_filter(ctx, gb, current));
2005*437bfbebSnyanmisaka 
2006*437bfbebSnyanmisaka         flag(is_motion_mode_switchable);
2007*437bfbebSnyanmisaka 
2008*437bfbebSnyanmisaka         if (current->error_resilient_mode ||
2009*437bfbebSnyanmisaka             !seq->enable_ref_frame_mvs)
2010*437bfbebSnyanmisaka             infer(use_ref_frame_mvs, 0);
2011*437bfbebSnyanmisaka         else
2012*437bfbebSnyanmisaka             flag(use_ref_frame_mvs);
2013*437bfbebSnyanmisaka 
2014*437bfbebSnyanmisaka         infer(allow_intrabc, 0);
2015*437bfbebSnyanmisaka     }
2016*437bfbebSnyanmisaka 
2017*437bfbebSnyanmisaka     if (!frame_is_intra) {
2018*437bfbebSnyanmisaka         // Derive reference frame sign biases.
2019*437bfbebSnyanmisaka     }
2020*437bfbebSnyanmisaka 
2021*437bfbebSnyanmisaka     if (seq->reduced_still_picture_header || current->disable_cdf_update)
2022*437bfbebSnyanmisaka         infer(disable_frame_end_update_cdf, 1);
2023*437bfbebSnyanmisaka     else
2024*437bfbebSnyanmisaka         flag(disable_frame_end_update_cdf);
2025*437bfbebSnyanmisaka 
2026*437bfbebSnyanmisaka     ctx->disable_frame_end_update_cdf = current->disable_frame_end_update_cdf;
2027*437bfbebSnyanmisaka 
2028*437bfbebSnyanmisaka     if (current->use_ref_frame_mvs) {
2029*437bfbebSnyanmisaka         // Perform motion field estimation process.
2030*437bfbebSnyanmisaka     }
2031*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "ptile_info in %d", mpp_get_bits_count(gb));
2032*437bfbebSnyanmisaka     CHECK(mpp_av1_tile_info(ctx, gb, current));
2033*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "ptile_info out %d", mpp_get_bits_count(gb));
2034*437bfbebSnyanmisaka 
2035*437bfbebSnyanmisaka     CHECK(mpp_av1_quantization_params(ctx, gb, current));
2036*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "quantization out %d", mpp_get_bits_count(gb));
2037*437bfbebSnyanmisaka 
2038*437bfbebSnyanmisaka     CHECK(mpp_av1_segmentation_params(ctx, gb, current));
2039*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "segmentation out %d", mpp_get_bits_count(gb));
2040*437bfbebSnyanmisaka 
2041*437bfbebSnyanmisaka     CHECK(mpp_av1_delta_q_params(ctx, gb, current));
2042*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "delta_q out %d", mpp_get_bits_count(gb));
2043*437bfbebSnyanmisaka 
2044*437bfbebSnyanmisaka     CHECK(mpp_av1_delta_lf_params(ctx, gb, current));
2045*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "lf out %d", mpp_get_bits_count(gb));
2046*437bfbebSnyanmisaka 
2047*437bfbebSnyanmisaka     // Init coeff CDFs / load previous segments.
2048*437bfbebSnyanmisaka     if (current->error_resilient_mode || frame_is_intra || current->primary_ref_frame == AV1_PRIMARY_REF_NONE) {
2049*437bfbebSnyanmisaka         // Init non-coeff CDFs.
2050*437bfbebSnyanmisaka         // Setup past independence.
2051*437bfbebSnyanmisaka         ctx->cdfs = &ctx->default_cdfs;
2052*437bfbebSnyanmisaka         ctx->cdfs_ndvc = &ctx->default_cdfs_ndvc;
2053*437bfbebSnyanmisaka         Av1DefaultCoeffProbs(current->base_q_idx, ctx->cdfs);
2054*437bfbebSnyanmisaka     } else {
2055*437bfbebSnyanmisaka         // Load CDF tables from previous frame.
2056*437bfbebSnyanmisaka         // Load params from previous frame.
2057*437bfbebSnyanmisaka         RK_U32 idx = current->ref_frame_idx[current->primary_ref_frame];
2058*437bfbebSnyanmisaka 
2059*437bfbebSnyanmisaka         Av1GetCDFs(ctx, idx);
2060*437bfbebSnyanmisaka     }
2061*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "show_existing_frame_index %d primary_ref_frame %d %d (%d) refresh_frame_flags %d base_q_idx %d\n",
2062*437bfbebSnyanmisaka              current->frame_to_show_map_idx,
2063*437bfbebSnyanmisaka              current->ref_frame_idx[current->primary_ref_frame],
2064*437bfbebSnyanmisaka              ctx->ref[current->ref_frame_idx[current->primary_ref_frame]].slot_index,
2065*437bfbebSnyanmisaka              current->primary_ref_frame,
2066*437bfbebSnyanmisaka              current->refresh_frame_flags,
2067*437bfbebSnyanmisaka              current->base_q_idx);
2068*437bfbebSnyanmisaka     Av1StoreCDFs(ctx, current->refresh_frame_flags);
2069*437bfbebSnyanmisaka 
2070*437bfbebSnyanmisaka     ctx->coded_lossless = 1;
2071*437bfbebSnyanmisaka     for (i = 0; i < AV1_MAX_SEGMENTS; i++) {
2072*437bfbebSnyanmisaka         RK_S32 qindex;
2073*437bfbebSnyanmisaka         if (current->feature_enabled[i][AV1_SEG_LVL_ALT_Q]) {
2074*437bfbebSnyanmisaka             qindex = (current->base_q_idx +
2075*437bfbebSnyanmisaka                       current->feature_value[i][AV1_SEG_LVL_ALT_Q]);
2076*437bfbebSnyanmisaka         } else {
2077*437bfbebSnyanmisaka             qindex = current->base_q_idx;
2078*437bfbebSnyanmisaka         }
2079*437bfbebSnyanmisaka         qindex = mpp_clip_uintp2(qindex, 8);
2080*437bfbebSnyanmisaka 
2081*437bfbebSnyanmisaka         if (qindex                || current->delta_q_y_dc ||
2082*437bfbebSnyanmisaka             current->delta_q_u_ac || current->delta_q_u_dc ||
2083*437bfbebSnyanmisaka             current->delta_q_v_ac || current->delta_q_v_dc) {
2084*437bfbebSnyanmisaka             ctx->coded_lossless = 0;
2085*437bfbebSnyanmisaka         }
2086*437bfbebSnyanmisaka     }
2087*437bfbebSnyanmisaka     ctx->all_lossless = ctx->coded_lossless &&
2088*437bfbebSnyanmisaka                         ctx->frame_width == ctx->upscaled_width;
2089*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "filter in %d", mpp_get_bits_count(gb));
2090*437bfbebSnyanmisaka 
2091*437bfbebSnyanmisaka     CHECK(mpp_av1_loop_filter_params(ctx, gb, current));
2092*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "cdef in %d", mpp_get_bits_count(gb));
2093*437bfbebSnyanmisaka 
2094*437bfbebSnyanmisaka     CHECK(mpp_av1_cdef_params(ctx, gb, current));
2095*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "lr in %d", mpp_get_bits_count(gb));
2096*437bfbebSnyanmisaka 
2097*437bfbebSnyanmisaka     CHECK(mpp_av1_lr_params(ctx, gb, current));
2098*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "read_tx in %d", mpp_get_bits_count(gb));
2099*437bfbebSnyanmisaka 
2100*437bfbebSnyanmisaka     CHECK(mpp_av1_read_tx_mode(ctx, gb, current));
2101*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "reference in%d", mpp_get_bits_count(gb));
2102*437bfbebSnyanmisaka 
2103*437bfbebSnyanmisaka     CHECK(mpp_av1_frame_reference_mode(ctx, gb, current));
2104*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "kip_mode in %d", mpp_get_bits_count(gb));
2105*437bfbebSnyanmisaka 
2106*437bfbebSnyanmisaka     CHECK(mpp_av1_skip_mode_params(ctx, gb, current));
2107*437bfbebSnyanmisaka 
2108*437bfbebSnyanmisaka     if (frame_is_intra || current->error_resilient_mode ||
2109*437bfbebSnyanmisaka         !seq->enable_warped_motion)
2110*437bfbebSnyanmisaka         infer(allow_warped_motion, 0);
2111*437bfbebSnyanmisaka     else
2112*437bfbebSnyanmisaka         flag(allow_warped_motion);
2113*437bfbebSnyanmisaka 
2114*437bfbebSnyanmisaka     flag(reduced_tx_set);
2115*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "motion in%d", mpp_get_bits_count(gb));
2116*437bfbebSnyanmisaka 
2117*437bfbebSnyanmisaka     CHECK(mpp_av1_global_motion_params(ctx, gb, current));
2118*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "grain in %d", mpp_get_bits_count(gb));
2119*437bfbebSnyanmisaka     CHECK(mpp_av1_film_grain_params(ctx, gb, &current->film_grain, current));
2120*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "film_grain out %d", mpp_get_bits_count(gb));
2121*437bfbebSnyanmisaka 
2122*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_REF, "Frame %d:  size %dx%d  "
2123*437bfbebSnyanmisaka              "upscaled %d  render %dx%d  subsample %dx%d  "
2124*437bfbebSnyanmisaka              "bitdepth %d  tiles %dx%d.\n", ctx->order_hint,
2125*437bfbebSnyanmisaka              ctx->frame_width, ctx->frame_height, ctx->upscaled_width,
2126*437bfbebSnyanmisaka              ctx->render_width, ctx->render_height,
2127*437bfbebSnyanmisaka              seq->color_config.subsampling_x + 1,
2128*437bfbebSnyanmisaka              seq->color_config.subsampling_y + 1, ctx->bit_depth,
2129*437bfbebSnyanmisaka              ctx->tile_rows, ctx->tile_cols);
2130*437bfbebSnyanmisaka 
2131*437bfbebSnyanmisaka     return 0;
2132*437bfbebSnyanmisaka }
2133*437bfbebSnyanmisaka 
mpp_av1_frame_header_obu(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrameHeader * current,RK_S32 redundant,void * rw_buffer_ref)2134*437bfbebSnyanmisaka static RK_S32 mpp_av1_frame_header_obu(AV1Context *ctx, BitReadCtx_t *gb,
2135*437bfbebSnyanmisaka                                        AV1RawFrameHeader *current, RK_S32 redundant,
2136*437bfbebSnyanmisaka                                        void *rw_buffer_ref)
2137*437bfbebSnyanmisaka {
2138*437bfbebSnyanmisaka     RK_S32 start_pos, fh_bits, fh_bytes, err;
2139*437bfbebSnyanmisaka     RK_U8 *fh_start;
2140*437bfbebSnyanmisaka     (void)rw_buffer_ref;
2141*437bfbebSnyanmisaka     if (ctx->seen_frame_header) {
2142*437bfbebSnyanmisaka         if (!redundant) {
2143*437bfbebSnyanmisaka             mpp_err_f("Invalid repeated "
2144*437bfbebSnyanmisaka                       "frame header OBU.\n");
2145*437bfbebSnyanmisaka             return MPP_ERR_UNKNOW;
2146*437bfbebSnyanmisaka         } else {
2147*437bfbebSnyanmisaka             BitReadCtx_t fh;
2148*437bfbebSnyanmisaka             size_t i, b;
2149*437bfbebSnyanmisaka             RK_U32 val;
2150*437bfbebSnyanmisaka 
2151*437bfbebSnyanmisaka //            mpp_assert(ctx->frame_header_ref && ctx->frame_header);
2152*437bfbebSnyanmisaka 
2153*437bfbebSnyanmisaka             mpp_set_bitread_ctx(&fh, ctx->frame_header,
2154*437bfbebSnyanmisaka                                 ctx->frame_header_size);
2155*437bfbebSnyanmisaka 
2156*437bfbebSnyanmisaka             for (i = 0; i < ctx->frame_header_size; i += 8) {
2157*437bfbebSnyanmisaka                 b = MPP_MIN(ctx->frame_header_size - i, 8);
2158*437bfbebSnyanmisaka                 mpp_read_bits(&fh, b, (RK_S32*)&val);
2159*437bfbebSnyanmisaka                 xf(b, frame_header_copy[i],
2160*437bfbebSnyanmisaka                    val, val, val, 1, i / 8);
2161*437bfbebSnyanmisaka             }
2162*437bfbebSnyanmisaka         }
2163*437bfbebSnyanmisaka     } else {
2164*437bfbebSnyanmisaka 
2165*437bfbebSnyanmisaka         start_pos = mpp_get_bits_count(gb);
2166*437bfbebSnyanmisaka 
2167*437bfbebSnyanmisaka         CHECK(mpp_av1_uncompressed_header(ctx, gb, current));
2168*437bfbebSnyanmisaka 
2169*437bfbebSnyanmisaka         ctx->tile_num = 0;
2170*437bfbebSnyanmisaka 
2171*437bfbebSnyanmisaka         if (current->show_existing_frame) {
2172*437bfbebSnyanmisaka             ctx->seen_frame_header = 0;
2173*437bfbebSnyanmisaka         } else {
2174*437bfbebSnyanmisaka             ctx->seen_frame_header = 1;
2175*437bfbebSnyanmisaka 
2176*437bfbebSnyanmisaka             fh_bits  = mpp_get_bits_count(gb) - start_pos;
2177*437bfbebSnyanmisaka             fh_start = (RK_U8*)gb->buf + start_pos / 8;
2178*437bfbebSnyanmisaka 
2179*437bfbebSnyanmisaka             fh_bytes = (fh_bits + 7) / 8;
2180*437bfbebSnyanmisaka             ctx->frame_header_size = fh_bits;
2181*437bfbebSnyanmisaka             MPP_FREE(ctx->frame_header);
2182*437bfbebSnyanmisaka             ctx->frame_header =
2183*437bfbebSnyanmisaka                 mpp_malloc(RK_U8, fh_bytes + BUFFER_PADDING_SIZE);
2184*437bfbebSnyanmisaka             if (!ctx->frame_header) {
2185*437bfbebSnyanmisaka                 mpp_err_f("frame header malloc failed\n");
2186*437bfbebSnyanmisaka                 return MPP_ERR_NOMEM;
2187*437bfbebSnyanmisaka             }
2188*437bfbebSnyanmisaka             memcpy(ctx->frame_header, fh_start, fh_bytes);
2189*437bfbebSnyanmisaka         }
2190*437bfbebSnyanmisaka     }
2191*437bfbebSnyanmisaka 
2192*437bfbebSnyanmisaka     return 0;
2193*437bfbebSnyanmisaka }
2194*437bfbebSnyanmisaka 
mpp_av1_tile_group_obu(AV1Context * ctx,BitReadCtx_t * gb,AV1RawTileGroup * current)2195*437bfbebSnyanmisaka static RK_S32 mpp_av1_tile_group_obu(AV1Context *ctx, BitReadCtx_t *gb,
2196*437bfbebSnyanmisaka                                      AV1RawTileGroup *current)
2197*437bfbebSnyanmisaka {
2198*437bfbebSnyanmisaka     RK_S32 num_tiles, tile_bits;
2199*437bfbebSnyanmisaka     RK_S32 err;
2200*437bfbebSnyanmisaka 
2201*437bfbebSnyanmisaka     num_tiles = ctx->tile_cols * ctx->tile_rows;
2202*437bfbebSnyanmisaka     if (num_tiles > 1)
2203*437bfbebSnyanmisaka         flag(tile_start_and_end_present_flag);
2204*437bfbebSnyanmisaka     else
2205*437bfbebSnyanmisaka         infer(tile_start_and_end_present_flag, 0);
2206*437bfbebSnyanmisaka 
2207*437bfbebSnyanmisaka     if (num_tiles == 1 || !current->tile_start_and_end_present_flag) {
2208*437bfbebSnyanmisaka         infer(tg_start, 0);
2209*437bfbebSnyanmisaka         infer(tg_end, num_tiles - 1);
2210*437bfbebSnyanmisaka     } else {
2211*437bfbebSnyanmisaka         tile_bits = mpp_av1_tile_log2(1, ctx->tile_cols) +
2212*437bfbebSnyanmisaka                     mpp_av1_tile_log2(1, ctx->tile_rows);
2213*437bfbebSnyanmisaka         fc(tile_bits, tg_start, ctx->tile_num, num_tiles - 1);
2214*437bfbebSnyanmisaka         fc(tile_bits, tg_end, current->tg_start, num_tiles - 1);
2215*437bfbebSnyanmisaka     }
2216*437bfbebSnyanmisaka 
2217*437bfbebSnyanmisaka     ctx->tile_num = current->tg_end + 1;
2218*437bfbebSnyanmisaka 
2219*437bfbebSnyanmisaka     CHECK(mpp_av1_byte_alignment(ctx, gb));
2220*437bfbebSnyanmisaka 
2221*437bfbebSnyanmisaka     // Reset header for next frame.
2222*437bfbebSnyanmisaka     if (current->tg_end == num_tiles - 1)
2223*437bfbebSnyanmisaka         ctx->seen_frame_header = 0;
2224*437bfbebSnyanmisaka     // Tile data follows.
2225*437bfbebSnyanmisaka 
2226*437bfbebSnyanmisaka     return 0;
2227*437bfbebSnyanmisaka }
2228*437bfbebSnyanmisaka 
mpp_av1_frame_obu(AV1Context * ctx,BitReadCtx_t * gb,AV1RawFrame * current,void * rw_buffer_ref)2229*437bfbebSnyanmisaka static RK_S32 mpp_av1_frame_obu(AV1Context *ctx, BitReadCtx_t *gb,
2230*437bfbebSnyanmisaka                                 AV1RawFrame *current,
2231*437bfbebSnyanmisaka                                 void *rw_buffer_ref)
2232*437bfbebSnyanmisaka {
2233*437bfbebSnyanmisaka     RK_S32 err;
2234*437bfbebSnyanmisaka     RK_U32 start_pos = mpp_get_bits_count(gb);
2235*437bfbebSnyanmisaka 
2236*437bfbebSnyanmisaka     CHECK(mpp_av1_frame_header_obu(ctx, gb, &current->header,
2237*437bfbebSnyanmisaka                                    0, rw_buffer_ref));
2238*437bfbebSnyanmisaka 
2239*437bfbebSnyanmisaka     CHECK(mpp_av1_byte_alignment(ctx, gb));
2240*437bfbebSnyanmisaka 
2241*437bfbebSnyanmisaka     CHECK(mpp_av1_tile_group_obu(ctx, gb, &current->tile_group));
2242*437bfbebSnyanmisaka     ctx->frame_tag_size += (mpp_get_bits_count(gb) - start_pos + 7) >> 3;
2243*437bfbebSnyanmisaka 
2244*437bfbebSnyanmisaka     return 0;
2245*437bfbebSnyanmisaka }
2246*437bfbebSnyanmisaka 
mpp_av1_tile_list_obu(AV1Context * ctx,BitReadCtx_t * gb,AV1RawTileList * current)2247*437bfbebSnyanmisaka static RK_S32 mpp_av1_tile_list_obu(AV1Context *ctx, BitReadCtx_t *gb,
2248*437bfbebSnyanmisaka                                     AV1RawTileList *current)
2249*437bfbebSnyanmisaka {
2250*437bfbebSnyanmisaka     RK_S32 err;
2251*437bfbebSnyanmisaka     (void)ctx;
2252*437bfbebSnyanmisaka     fb(8, output_frame_width_in_tiles_minus_1);
2253*437bfbebSnyanmisaka     fb(8, output_frame_height_in_tiles_minus_1);
2254*437bfbebSnyanmisaka 
2255*437bfbebSnyanmisaka     fb(16, tile_count_minus_1);
2256*437bfbebSnyanmisaka 
2257*437bfbebSnyanmisaka     // Tile data follows.
2258*437bfbebSnyanmisaka 
2259*437bfbebSnyanmisaka     return 0;
2260*437bfbebSnyanmisaka }
2261*437bfbebSnyanmisaka 
mpp_av1_metadata_hdr_cll(AV1Context * ctx,BitReadCtx_t * gb,AV1RawMetadataHDRCLL * current)2262*437bfbebSnyanmisaka static RK_S32 mpp_av1_metadata_hdr_cll(AV1Context *ctx, BitReadCtx_t *gb,
2263*437bfbebSnyanmisaka                                        AV1RawMetadataHDRCLL *current)
2264*437bfbebSnyanmisaka {
2265*437bfbebSnyanmisaka     RK_S32 err;
2266*437bfbebSnyanmisaka     (void)ctx;
2267*437bfbebSnyanmisaka     fb(16, max_cll);
2268*437bfbebSnyanmisaka     fb(16, max_fall);
2269*437bfbebSnyanmisaka 
2270*437bfbebSnyanmisaka     ctx->content_light.MaxCLL = current->max_cll;
2271*437bfbebSnyanmisaka     ctx->content_light.MaxFALL = current->max_fall;
2272*437bfbebSnyanmisaka 
2273*437bfbebSnyanmisaka     return 0;
2274*437bfbebSnyanmisaka }
2275*437bfbebSnyanmisaka 
mpp_av1_metadata_hdr_mdcv(AV1Context * ctx,BitReadCtx_t * gb,AV1RawMetadataHDRMDCV * current)2276*437bfbebSnyanmisaka static RK_S32 mpp_av1_metadata_hdr_mdcv(AV1Context *ctx, BitReadCtx_t *gb,
2277*437bfbebSnyanmisaka                                         AV1RawMetadataHDRMDCV *current)
2278*437bfbebSnyanmisaka {
2279*437bfbebSnyanmisaka     RK_S32 err, i;
2280*437bfbebSnyanmisaka     (void)ctx;
2281*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
2282*437bfbebSnyanmisaka         fbs(16, primary_chromaticity_x[i], 1, i);
2283*437bfbebSnyanmisaka         fbs(16, primary_chromaticity_y[i], 1, i);
2284*437bfbebSnyanmisaka     }
2285*437bfbebSnyanmisaka 
2286*437bfbebSnyanmisaka     fb(16, white_point_chromaticity_x);
2287*437bfbebSnyanmisaka     fb(16, white_point_chromaticity_y);
2288*437bfbebSnyanmisaka 
2289*437bfbebSnyanmisaka     fc(32, luminance_max, 1, MAX_UINT_BITS(32));
2290*437bfbebSnyanmisaka     // luminance_min must be lower than luminance_max. Convert luminance_max from
2291*437bfbebSnyanmisaka     // 24.8 fixed point to 18.14 fixed point in order to compare them.
2292*437bfbebSnyanmisaka     fc(32, luminance_min, 0, MPP_MIN(((RK_U64)current->luminance_max << 6) - 1,
2293*437bfbebSnyanmisaka                                      MAX_UINT_BITS(32)));
2294*437bfbebSnyanmisaka 
2295*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
2296*437bfbebSnyanmisaka         ctx->mastering_display.display_primaries[i][0] = current->primary_chromaticity_x[i];
2297*437bfbebSnyanmisaka         ctx->mastering_display.display_primaries[i][1] = current->primary_chromaticity_y[i];
2298*437bfbebSnyanmisaka     }
2299*437bfbebSnyanmisaka     ctx->mastering_display.white_point[0] = current->white_point_chromaticity_x;
2300*437bfbebSnyanmisaka     ctx->mastering_display.white_point[1] = current->white_point_chromaticity_y;
2301*437bfbebSnyanmisaka     ctx->mastering_display.max_luminance = current->luminance_max;
2302*437bfbebSnyanmisaka     ctx->mastering_display.min_luminance = current->luminance_min;
2303*437bfbebSnyanmisaka 
2304*437bfbebSnyanmisaka     return 0;
2305*437bfbebSnyanmisaka }
2306*437bfbebSnyanmisaka 
mpp_av1_scalability_structure(AV1Context * ctx,BitReadCtx_t * gb,AV1RawMetadataScalability * current)2307*437bfbebSnyanmisaka static RK_S32 mpp_av1_scalability_structure(AV1Context *ctx, BitReadCtx_t *gb,
2308*437bfbebSnyanmisaka                                             AV1RawMetadataScalability *current)
2309*437bfbebSnyanmisaka {
2310*437bfbebSnyanmisaka     const AV1RawSequenceHeader *seq;
2311*437bfbebSnyanmisaka     RK_S32 err, i, j;
2312*437bfbebSnyanmisaka 
2313*437bfbebSnyanmisaka     if (!ctx->sequence_header) {
2314*437bfbebSnyanmisaka         mpp_err_f("No sequence header available: "
2315*437bfbebSnyanmisaka                   "unable to parse scalability metadata.\n");
2316*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
2317*437bfbebSnyanmisaka     }
2318*437bfbebSnyanmisaka     seq = ctx->sequence_header;
2319*437bfbebSnyanmisaka 
2320*437bfbebSnyanmisaka     fb(2, spatial_layers_cnt_minus_1);
2321*437bfbebSnyanmisaka     flag(spatial_layer_dimensions_present_flag);
2322*437bfbebSnyanmisaka     flag(spatial_layer_description_present_flag);
2323*437bfbebSnyanmisaka     flag(temporal_group_description_present_flag);
2324*437bfbebSnyanmisaka     fc(3, scalability_structure_reserved_3bits, 0, 0);
2325*437bfbebSnyanmisaka     if (current->spatial_layer_dimensions_present_flag) {
2326*437bfbebSnyanmisaka         for (i = 0; i <= current->spatial_layers_cnt_minus_1; i++) {
2327*437bfbebSnyanmisaka             fcs(16, spatial_layer_max_width[i],
2328*437bfbebSnyanmisaka                 0, seq->max_frame_width_minus_1 + 1, 1, i);
2329*437bfbebSnyanmisaka             fcs(16, spatial_layer_max_height[i],
2330*437bfbebSnyanmisaka                 0, seq->max_frame_height_minus_1 + 1, 1, i);
2331*437bfbebSnyanmisaka         }
2332*437bfbebSnyanmisaka     }
2333*437bfbebSnyanmisaka     if (current->spatial_layer_description_present_flag) {
2334*437bfbebSnyanmisaka         for (i = 0; i <= current->spatial_layers_cnt_minus_1; i++)
2335*437bfbebSnyanmisaka             fbs(8, spatial_layer_ref_id[i], 1, i);
2336*437bfbebSnyanmisaka     }
2337*437bfbebSnyanmisaka     if (current->temporal_group_description_present_flag) {
2338*437bfbebSnyanmisaka         fb(8, temporal_group_size);
2339*437bfbebSnyanmisaka         for (i = 0; i < current->temporal_group_size; i++) {
2340*437bfbebSnyanmisaka             fbs(3, temporal_group_temporal_id[i], 1, i);
2341*437bfbebSnyanmisaka             flags(temporal_group_temporal_switching_up_point_flag[i], 1, i);
2342*437bfbebSnyanmisaka             flags(temporal_group_spatial_switching_up_point_flag[i], 1, i);
2343*437bfbebSnyanmisaka             fbs(3, temporal_group_ref_cnt[i], 1, i);
2344*437bfbebSnyanmisaka             for (j = 0; j < current->temporal_group_ref_cnt[i]; j++) {
2345*437bfbebSnyanmisaka                 fbs(8, temporal_group_ref_pic_diff[i][j], 2, i, j);
2346*437bfbebSnyanmisaka             }
2347*437bfbebSnyanmisaka         }
2348*437bfbebSnyanmisaka     }
2349*437bfbebSnyanmisaka 
2350*437bfbebSnyanmisaka     return 0;
2351*437bfbebSnyanmisaka }
2352*437bfbebSnyanmisaka 
mpp_av1_metadata_scalability(AV1Context * ctx,BitReadCtx_t * gb,AV1RawMetadataScalability * current)2353*437bfbebSnyanmisaka static RK_S32 mpp_av1_metadata_scalability(AV1Context *ctx, BitReadCtx_t *gb,
2354*437bfbebSnyanmisaka                                            AV1RawMetadataScalability *current)
2355*437bfbebSnyanmisaka {
2356*437bfbebSnyanmisaka     RK_S32 err;
2357*437bfbebSnyanmisaka 
2358*437bfbebSnyanmisaka     fb(8, scalability_mode_idc);
2359*437bfbebSnyanmisaka 
2360*437bfbebSnyanmisaka     if (current->scalability_mode_idc == AV1_SCALABILITY_SS)
2361*437bfbebSnyanmisaka         CHECK(mpp_av1_scalability_structure(ctx, gb, current));
2362*437bfbebSnyanmisaka 
2363*437bfbebSnyanmisaka     return 0;
2364*437bfbebSnyanmisaka }
2365*437bfbebSnyanmisaka 
mpp_av1_get_dlby_rpu(AV1Context * ctx,BitReadCtx_t * gb)2366*437bfbebSnyanmisaka static RK_S32 mpp_av1_get_dlby_rpu(AV1Context *ctx, BitReadCtx_t *gb)
2367*437bfbebSnyanmisaka {
2368*437bfbebSnyanmisaka     MppFrameHdrDynamicMeta *hdr_dynamic_meta = ctx->hdr_dynamic_meta;
2369*437bfbebSnyanmisaka     RK_U32 emdf_payload_size = 0;
2370*437bfbebSnyanmisaka 
2371*437bfbebSnyanmisaka     /* skip emdf_container{} */
2372*437bfbebSnyanmisaka     SKIP_BITS(gb, 3);
2373*437bfbebSnyanmisaka     SKIP_BITS(gb, 2);
2374*437bfbebSnyanmisaka     SKIP_BITS(gb, 5);
2375*437bfbebSnyanmisaka     SKIP_BITS(gb, 5);
2376*437bfbebSnyanmisaka     SKIP_BITS(gb, 1);
2377*437bfbebSnyanmisaka     SKIP_BITS(gb, 5);
2378*437bfbebSnyanmisaka     SKIP_BITS(gb, 1);
2379*437bfbebSnyanmisaka     /* skip emdf_payload_config{} */
2380*437bfbebSnyanmisaka     SKIP_BITS(gb, 5);
2381*437bfbebSnyanmisaka 
2382*437bfbebSnyanmisaka     /* get payload size */
2383*437bfbebSnyanmisaka #define VARIABLE_BITS8(gb, value)   \
2384*437bfbebSnyanmisaka     for (;;) {                      \
2385*437bfbebSnyanmisaka         RK_U32 tmp, flag;           \
2386*437bfbebSnyanmisaka                                     \
2387*437bfbebSnyanmisaka         READ_BITS(gb, 8, &tmp);     \
2388*437bfbebSnyanmisaka         value += tmp;               \
2389*437bfbebSnyanmisaka         READ_ONEBIT(gb, &flag);     \
2390*437bfbebSnyanmisaka         if (!flag) break;           \
2391*437bfbebSnyanmisaka         value <<= 8;                \
2392*437bfbebSnyanmisaka         value += (1 << 8);          \
2393*437bfbebSnyanmisaka     }
2394*437bfbebSnyanmisaka 
2395*437bfbebSnyanmisaka     VARIABLE_BITS8(gb, emdf_payload_size);
2396*437bfbebSnyanmisaka     if (!hdr_dynamic_meta) {
2397*437bfbebSnyanmisaka         hdr_dynamic_meta = mpp_calloc_size(MppFrameHdrDynamicMeta,
2398*437bfbebSnyanmisaka                                            sizeof(MppFrameHdrDynamicMeta) + SZ_1K);
2399*437bfbebSnyanmisaka         if (!hdr_dynamic_meta) {
2400*437bfbebSnyanmisaka             mpp_err_f("malloc hdr dynamic data failed!\n");
2401*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
2402*437bfbebSnyanmisaka         }
2403*437bfbebSnyanmisaka     }
2404*437bfbebSnyanmisaka 
2405*437bfbebSnyanmisaka     RK_U32 i;
2406*437bfbebSnyanmisaka     MppWriteCtx bit_ctx;
2407*437bfbebSnyanmisaka 
2408*437bfbebSnyanmisaka     mpp_writer_init(&bit_ctx, hdr_dynamic_meta->data, SZ_1K);
2409*437bfbebSnyanmisaka 
2410*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(&bit_ctx, 0, 24);
2411*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(&bit_ctx, 1, 8);
2412*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(&bit_ctx, 0x19, 8);
2413*437bfbebSnyanmisaka     for (i = 0; i < emdf_payload_size; i++) {
2414*437bfbebSnyanmisaka         RK_U8 data;
2415*437bfbebSnyanmisaka 
2416*437bfbebSnyanmisaka         READ_BITS(gb, 8, &data);
2417*437bfbebSnyanmisaka         mpp_writer_put_bits(&bit_ctx, data, 8);
2418*437bfbebSnyanmisaka     }
2419*437bfbebSnyanmisaka 
2420*437bfbebSnyanmisaka     hdr_dynamic_meta->size = mpp_writer_bytes(&bit_ctx);
2421*437bfbebSnyanmisaka     hdr_dynamic_meta->hdr_fmt = DLBY;
2422*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_STRMIN, "dlby rpu size %d -> %d\n",
2423*437bfbebSnyanmisaka              emdf_payload_size, hdr_dynamic_meta->size);
2424*437bfbebSnyanmisaka 
2425*437bfbebSnyanmisaka     ctx->hdr_dynamic_meta = hdr_dynamic_meta;
2426*437bfbebSnyanmisaka     ctx->hdr_dynamic = 1;
2427*437bfbebSnyanmisaka     ctx->is_hdr = 1;
2428*437bfbebSnyanmisaka 
2429*437bfbebSnyanmisaka     if (av1d_debug & AV1D_DBG_DUMP_RPU) {
2430*437bfbebSnyanmisaka         RK_U8 *p = hdr_dynamic_meta->data;
2431*437bfbebSnyanmisaka         char fname[128];
2432*437bfbebSnyanmisaka         FILE *fp_in = NULL;
2433*437bfbebSnyanmisaka         static RK_U32 g_frame_no = 0;
2434*437bfbebSnyanmisaka 
2435*437bfbebSnyanmisaka         sprintf(fname, "/data/video/meta_%d.txt", g_frame_no++);
2436*437bfbebSnyanmisaka         fp_in = fopen(fname, "wb");
2437*437bfbebSnyanmisaka         mpp_err("open %s %p\n", fname, fp_in);
2438*437bfbebSnyanmisaka         if (fp_in)
2439*437bfbebSnyanmisaka             fwrite(p, 1, hdr_dynamic_meta->size, fp_in);
2440*437bfbebSnyanmisaka         fflush(fp_in);
2441*437bfbebSnyanmisaka         fclose(fp_in);
2442*437bfbebSnyanmisaka     }
2443*437bfbebSnyanmisaka 
2444*437bfbebSnyanmisaka     return 0;
2445*437bfbebSnyanmisaka 
2446*437bfbebSnyanmisaka __BITREAD_ERR:
2447*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
2448*437bfbebSnyanmisaka }
2449*437bfbebSnyanmisaka 
mpp_av1_fill_dynamic_meta(AV1Context * ctx,const RK_U8 * data,RK_U32 size,RK_U32 hdr_fmt)2450*437bfbebSnyanmisaka static void mpp_av1_fill_dynamic_meta(AV1Context *ctx, const RK_U8 *data, RK_U32 size, RK_U32 hdr_fmt)
2451*437bfbebSnyanmisaka {
2452*437bfbebSnyanmisaka     MppFrameHdrDynamicMeta *hdr_dynamic_meta = ctx->hdr_dynamic_meta;
2453*437bfbebSnyanmisaka 
2454*437bfbebSnyanmisaka     if (hdr_dynamic_meta && (hdr_dynamic_meta->size < size)) {
2455*437bfbebSnyanmisaka         mpp_free(hdr_dynamic_meta);
2456*437bfbebSnyanmisaka         hdr_dynamic_meta = NULL;
2457*437bfbebSnyanmisaka     }
2458*437bfbebSnyanmisaka 
2459*437bfbebSnyanmisaka     if (!hdr_dynamic_meta) {
2460*437bfbebSnyanmisaka         hdr_dynamic_meta = mpp_calloc_size(MppFrameHdrDynamicMeta,
2461*437bfbebSnyanmisaka                                            sizeof(MppFrameHdrDynamicMeta) + size);
2462*437bfbebSnyanmisaka         if (!hdr_dynamic_meta) {
2463*437bfbebSnyanmisaka             mpp_err_f("malloc hdr dynamic data failed!\n");
2464*437bfbebSnyanmisaka             return;
2465*437bfbebSnyanmisaka         }
2466*437bfbebSnyanmisaka     }
2467*437bfbebSnyanmisaka     if (size && data) {
2468*437bfbebSnyanmisaka         switch (hdr_fmt) {
2469*437bfbebSnyanmisaka         case HDR10PLUS: {
2470*437bfbebSnyanmisaka             memcpy((RK_U8*)hdr_dynamic_meta->data, (RK_U8*)data, size);
2471*437bfbebSnyanmisaka         } break;
2472*437bfbebSnyanmisaka         default: break;
2473*437bfbebSnyanmisaka         }
2474*437bfbebSnyanmisaka         hdr_dynamic_meta->size = size;
2475*437bfbebSnyanmisaka         hdr_dynamic_meta->hdr_fmt = hdr_fmt;
2476*437bfbebSnyanmisaka 
2477*437bfbebSnyanmisaka         ctx->hdr_dynamic_meta = hdr_dynamic_meta;
2478*437bfbebSnyanmisaka         ctx->hdr_dynamic = 1;
2479*437bfbebSnyanmisaka         ctx->is_hdr = 1;
2480*437bfbebSnyanmisaka     }
2481*437bfbebSnyanmisaka }
2482*437bfbebSnyanmisaka 
mpp_av1_metadata_itut_t35(AV1Context * ctx,BitReadCtx_t * gb,AV1RawMetadataITUTT35 * current)2483*437bfbebSnyanmisaka static RK_S32 mpp_av1_metadata_itut_t35(AV1Context *ctx, BitReadCtx_t *gb,
2484*437bfbebSnyanmisaka                                         AV1RawMetadataITUTT35 *current)
2485*437bfbebSnyanmisaka {
2486*437bfbebSnyanmisaka     RK_S32 err;
2487*437bfbebSnyanmisaka 
2488*437bfbebSnyanmisaka     fb(8, itu_t_t35_country_code);
2489*437bfbebSnyanmisaka     if (current->itu_t_t35_country_code == 0xff)
2490*437bfbebSnyanmisaka         fb(8, itu_t_t35_country_code_extension_byte);
2491*437bfbebSnyanmisaka 
2492*437bfbebSnyanmisaka     current->payload_size = mpp_get_bits_left(gb) / 8 - 1;
2493*437bfbebSnyanmisaka 
2494*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_STRMIN, "%s itu_t_t35_country_code %d payload_size %d\n",
2495*437bfbebSnyanmisaka              __func__, current->itu_t_t35_country_code, current->payload_size);
2496*437bfbebSnyanmisaka 
2497*437bfbebSnyanmisaka     fb(16, itu_t_t35_terminal_provider_code);
2498*437bfbebSnyanmisaka 
2499*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_STRMIN, "itu_t_t35_country_code 0x%x\n",
2500*437bfbebSnyanmisaka              current->itu_t_t35_country_code);
2501*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_STRMIN, "itu_t_t35_terminal_provider_code 0x%x\n",
2502*437bfbebSnyanmisaka              current->itu_t_t35_terminal_provider_code);
2503*437bfbebSnyanmisaka 
2504*437bfbebSnyanmisaka     switch (current->itu_t_t35_terminal_provider_code) {
2505*437bfbebSnyanmisaka     case 0x3B: {/* dlby provider_code is 0x3b*/
2506*437bfbebSnyanmisaka         READ_BITS_LONG(gb, 32, &current->itu_t_t35_terminal_provider_oriented_code);
2507*437bfbebSnyanmisaka         av1d_dbg(AV1D_DBG_STRMIN, "itu_t_t35_terminal_provider_oriented_code 0x%x\n",
2508*437bfbebSnyanmisaka                  current->itu_t_t35_terminal_provider_oriented_code);
2509*437bfbebSnyanmisaka         if (current->itu_t_t35_terminal_provider_oriented_code == 0x800)
2510*437bfbebSnyanmisaka             mpp_av1_get_dlby_rpu(ctx, gb);
2511*437bfbebSnyanmisaka     } break;
2512*437bfbebSnyanmisaka     case 0x3C: {/* smpte2094_40 provider_code is 0x3c*/
2513*437bfbebSnyanmisaka         const RK_U16 smpte2094_40_provider_oriented_code = 0x0001;
2514*437bfbebSnyanmisaka         const RK_U8 smpte2094_40_application_identifier = 0x04;
2515*437bfbebSnyanmisaka         RK_U8 application_identifier;
2516*437bfbebSnyanmisaka 
2517*437bfbebSnyanmisaka         fb(16, itu_t_t35_terminal_provider_oriented_code);
2518*437bfbebSnyanmisaka         av1d_dbg(AV1D_DBG_STRMIN, "itu_t_t35_terminal_provider_oriented_code 0x%x\n",
2519*437bfbebSnyanmisaka                  current->itu_t_t35_terminal_provider_oriented_code);
2520*437bfbebSnyanmisaka         READ_BITS(gb, 8, &application_identifier);
2521*437bfbebSnyanmisaka         /* hdr10plus priverder_oriented_code is 0x0001, application_identifier is 0x04 */
2522*437bfbebSnyanmisaka         if (current->itu_t_t35_terminal_provider_oriented_code == smpte2094_40_provider_oriented_code &&
2523*437bfbebSnyanmisaka             application_identifier == smpte2094_40_application_identifier)
2524*437bfbebSnyanmisaka             mpp_av1_fill_dynamic_meta(ctx, gb->data_, mpp_get_bits_left(gb) >> 3, HDR10PLUS);
2525*437bfbebSnyanmisaka     } break;
2526*437bfbebSnyanmisaka     default:
2527*437bfbebSnyanmisaka         break;
2528*437bfbebSnyanmisaka     }
2529*437bfbebSnyanmisaka 
2530*437bfbebSnyanmisaka     return 0;
2531*437bfbebSnyanmisaka __BITREAD_ERR:
2532*437bfbebSnyanmisaka     return 0;
2533*437bfbebSnyanmisaka }
2534*437bfbebSnyanmisaka 
mpp_av1_metadata_timecode(AV1Context * ctx,BitReadCtx_t * gb,AV1RawMetadataTimecode * current)2535*437bfbebSnyanmisaka static RK_S32 mpp_av1_metadata_timecode(AV1Context *ctx, BitReadCtx_t *gb,
2536*437bfbebSnyanmisaka                                         AV1RawMetadataTimecode *current)
2537*437bfbebSnyanmisaka {
2538*437bfbebSnyanmisaka     RK_S32 err;
2539*437bfbebSnyanmisaka     (void)ctx;
2540*437bfbebSnyanmisaka 
2541*437bfbebSnyanmisaka     fb(5, counting_type);
2542*437bfbebSnyanmisaka     flag(full_timestamp_flag);
2543*437bfbebSnyanmisaka     flag(discontinuity_flag);
2544*437bfbebSnyanmisaka     flag(cnt_dropped_flag);
2545*437bfbebSnyanmisaka     fb(9, n_frames);
2546*437bfbebSnyanmisaka 
2547*437bfbebSnyanmisaka     if (current->full_timestamp_flag) {
2548*437bfbebSnyanmisaka         fc(6, seconds_value, 0, 59);
2549*437bfbebSnyanmisaka         fc(6, minutes_value, 0, 59);
2550*437bfbebSnyanmisaka         fc(5, hours_value,   0, 23);
2551*437bfbebSnyanmisaka     } else {
2552*437bfbebSnyanmisaka         flag(seconds_flag);
2553*437bfbebSnyanmisaka         if (current->seconds_flag) {
2554*437bfbebSnyanmisaka             fc(6, seconds_value, 0, 59);
2555*437bfbebSnyanmisaka             flag(minutes_flag);
2556*437bfbebSnyanmisaka             if (current->minutes_flag) {
2557*437bfbebSnyanmisaka                 fc(6, minutes_value, 0, 59);
2558*437bfbebSnyanmisaka                 flag(hours_flag);
2559*437bfbebSnyanmisaka                 if (current->hours_flag)
2560*437bfbebSnyanmisaka                     fc(5, hours_value, 0, 23);
2561*437bfbebSnyanmisaka             }
2562*437bfbebSnyanmisaka         }
2563*437bfbebSnyanmisaka     }
2564*437bfbebSnyanmisaka 
2565*437bfbebSnyanmisaka     fb(5, time_offset_length);
2566*437bfbebSnyanmisaka     if (current->time_offset_length > 0)
2567*437bfbebSnyanmisaka         fb(current->time_offset_length, time_offset_value);
2568*437bfbebSnyanmisaka     else
2569*437bfbebSnyanmisaka         infer(time_offset_length, 0);
2570*437bfbebSnyanmisaka 
2571*437bfbebSnyanmisaka     return 0;
2572*437bfbebSnyanmisaka }
2573*437bfbebSnyanmisaka 
mpp_av1_metadata_obu(AV1Context * ctx,BitReadCtx_t * gb,AV1RawMetadata * current)2574*437bfbebSnyanmisaka static RK_S32 mpp_av1_metadata_obu(AV1Context *ctx, BitReadCtx_t *gb,
2575*437bfbebSnyanmisaka                                    AV1RawMetadata *current)
2576*437bfbebSnyanmisaka {
2577*437bfbebSnyanmisaka     RK_S32 err;
2578*437bfbebSnyanmisaka 
2579*437bfbebSnyanmisaka     leb128(metadata_type);
2580*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_STRMIN, "%s meta type %lld\n", __func__, current->metadata_type);
2581*437bfbebSnyanmisaka     switch (current->metadata_type) {
2582*437bfbebSnyanmisaka     case AV1_METADATA_TYPE_HDR_CLL:
2583*437bfbebSnyanmisaka         CHECK(mpp_av1_metadata_hdr_cll(ctx, gb, &current->metadata.hdr_cll));
2584*437bfbebSnyanmisaka         break;
2585*437bfbebSnyanmisaka     case AV1_METADATA_TYPE_HDR_MDCV:
2586*437bfbebSnyanmisaka         CHECK(mpp_av1_metadata_hdr_mdcv(ctx, gb, &current->metadata.hdr_mdcv));
2587*437bfbebSnyanmisaka         break;
2588*437bfbebSnyanmisaka     case AV1_METADATA_TYPE_SCALABILITY:
2589*437bfbebSnyanmisaka         CHECK(mpp_av1_metadata_scalability(ctx, gb, &current->metadata.scalability));
2590*437bfbebSnyanmisaka         break;
2591*437bfbebSnyanmisaka     case AV1_METADATA_TYPE_ITUT_T35:
2592*437bfbebSnyanmisaka         CHECK(mpp_av1_metadata_itut_t35(ctx, gb, &current->metadata.itut_t35));
2593*437bfbebSnyanmisaka         break;
2594*437bfbebSnyanmisaka     case AV1_METADATA_TYPE_TIMECODE:
2595*437bfbebSnyanmisaka         CHECK(mpp_av1_metadata_timecode(ctx, gb, &current->metadata.timecode));
2596*437bfbebSnyanmisaka         break;
2597*437bfbebSnyanmisaka     default:
2598*437bfbebSnyanmisaka         mpp_err_f("unknown metadata type %lld\n", current->metadata_type);
2599*437bfbebSnyanmisaka         break;
2600*437bfbebSnyanmisaka     }
2601*437bfbebSnyanmisaka 
2602*437bfbebSnyanmisaka     return 0;
2603*437bfbebSnyanmisaka }
2604*437bfbebSnyanmisaka 
mpp_av1_padding_obu(AV1Context * ctx,BitReadCtx_t * gb,AV1RawPadding * current)2605*437bfbebSnyanmisaka static RK_S32 mpp_av1_padding_obu(AV1Context *ctx, BitReadCtx_t *gb,
2606*437bfbebSnyanmisaka                                   AV1RawPadding *current)
2607*437bfbebSnyanmisaka {
2608*437bfbebSnyanmisaka     RK_S32 err;
2609*437bfbebSnyanmisaka     RK_U32 i;
2610*437bfbebSnyanmisaka     (void)ctx;
2611*437bfbebSnyanmisaka     current->payload_size = mpp_av1_get_payload_bytes_left(gb);
2612*437bfbebSnyanmisaka 
2613*437bfbebSnyanmisaka     current->payload  = mpp_malloc(RK_U8, current->payload_size);
2614*437bfbebSnyanmisaka     if (!current->payload )
2615*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
2616*437bfbebSnyanmisaka 
2617*437bfbebSnyanmisaka     for (i = 0; i < current->payload_size; i++)
2618*437bfbebSnyanmisaka         xf(8, obu_padding_byte[i], current->payload[i], 0x00, 0xff, 1, i);
2619*437bfbebSnyanmisaka 
2620*437bfbebSnyanmisaka     return 0;
2621*437bfbebSnyanmisaka }
2622*437bfbebSnyanmisaka 
2623*437bfbebSnyanmisaka 
2624*437bfbebSnyanmisaka 
mpp_insert_unit(Av1UnitFragment * frag,RK_S32 position)2625*437bfbebSnyanmisaka static MPP_RET mpp_insert_unit(Av1UnitFragment *frag, RK_S32 position)
2626*437bfbebSnyanmisaka {
2627*437bfbebSnyanmisaka     Av1ObuUnit *units;
2628*437bfbebSnyanmisaka 
2629*437bfbebSnyanmisaka     if (frag->nb_units < frag->nb_units_allocated) {
2630*437bfbebSnyanmisaka         units = frag->units;
2631*437bfbebSnyanmisaka 
2632*437bfbebSnyanmisaka         if (position < frag->nb_units)
2633*437bfbebSnyanmisaka             memmove(units + position + 1, units + position,
2634*437bfbebSnyanmisaka                     (frag->nb_units - position) * sizeof(*units));
2635*437bfbebSnyanmisaka     } else {
2636*437bfbebSnyanmisaka         units = mpp_malloc(Av1ObuUnit, frag->nb_units * 2 + 1);
2637*437bfbebSnyanmisaka         if (!units)
2638*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
2639*437bfbebSnyanmisaka 
2640*437bfbebSnyanmisaka         frag->nb_units_allocated = 2 * frag->nb_units_allocated + 1;
2641*437bfbebSnyanmisaka 
2642*437bfbebSnyanmisaka         if (position > 0)
2643*437bfbebSnyanmisaka             memcpy(units, frag->units, position * sizeof(*units));
2644*437bfbebSnyanmisaka 
2645*437bfbebSnyanmisaka         if (position < frag->nb_units)
2646*437bfbebSnyanmisaka             memcpy(units + position + 1, frag->units + position,
2647*437bfbebSnyanmisaka                    (frag->nb_units - position) * sizeof(*units));
2648*437bfbebSnyanmisaka     }
2649*437bfbebSnyanmisaka 
2650*437bfbebSnyanmisaka     memset(units + position, 0, sizeof(*units));
2651*437bfbebSnyanmisaka 
2652*437bfbebSnyanmisaka     if (units != frag->units) {
2653*437bfbebSnyanmisaka         mpp_free(frag->units);
2654*437bfbebSnyanmisaka         frag->units = units;
2655*437bfbebSnyanmisaka     }
2656*437bfbebSnyanmisaka 
2657*437bfbebSnyanmisaka     ++frag->nb_units;
2658*437bfbebSnyanmisaka 
2659*437bfbebSnyanmisaka     return MPP_OK;
2660*437bfbebSnyanmisaka }
2661*437bfbebSnyanmisaka 
mpp_insert_unit_data(Av1UnitFragment * frag,RK_S32 position,Av1UnitType type,RK_U8 * data,size_t data_size)2662*437bfbebSnyanmisaka static MPP_RET mpp_insert_unit_data(Av1UnitFragment *frag,
2663*437bfbebSnyanmisaka                                     RK_S32 position,
2664*437bfbebSnyanmisaka                                     Av1UnitType type,
2665*437bfbebSnyanmisaka                                     RK_U8 *data, size_t data_size)
2666*437bfbebSnyanmisaka {
2667*437bfbebSnyanmisaka     Av1ObuUnit *unit;
2668*437bfbebSnyanmisaka     MPP_RET ret;
2669*437bfbebSnyanmisaka 
2670*437bfbebSnyanmisaka     if (position == -1)
2671*437bfbebSnyanmisaka         position = frag->nb_units;
2672*437bfbebSnyanmisaka 
2673*437bfbebSnyanmisaka     mpp_assert(position >= 0 && position <= frag->nb_units);
2674*437bfbebSnyanmisaka     ret = mpp_insert_unit(frag, position);
2675*437bfbebSnyanmisaka     if (ret < 0) {
2676*437bfbebSnyanmisaka         return ret;
2677*437bfbebSnyanmisaka     }
2678*437bfbebSnyanmisaka 
2679*437bfbebSnyanmisaka     unit = &frag->units[position];
2680*437bfbebSnyanmisaka     unit->type      = type;
2681*437bfbebSnyanmisaka     unit->data      = data;
2682*437bfbebSnyanmisaka     unit->data_size = data_size;
2683*437bfbebSnyanmisaka 
2684*437bfbebSnyanmisaka     return MPP_OK;
2685*437bfbebSnyanmisaka }
2686*437bfbebSnyanmisaka 
mpp_av1_split_fragment(AV1Context * ctx,Av1UnitFragment * frag,RK_S32 header_flag)2687*437bfbebSnyanmisaka RK_S32 mpp_av1_split_fragment(AV1Context *ctx, Av1UnitFragment *frag, RK_S32 header_flag)
2688*437bfbebSnyanmisaka {
2689*437bfbebSnyanmisaka     BitReadCtx_t gbc;
2690*437bfbebSnyanmisaka     RK_U8 *data;
2691*437bfbebSnyanmisaka     size_t size;
2692*437bfbebSnyanmisaka     RK_U64 obu_length;
2693*437bfbebSnyanmisaka     RK_S32 pos, err;
2694*437bfbebSnyanmisaka 
2695*437bfbebSnyanmisaka     data = frag->data;
2696*437bfbebSnyanmisaka     size = frag->data_size;
2697*437bfbebSnyanmisaka 
2698*437bfbebSnyanmisaka     if (INT_MAX / 8 < size) {
2699*437bfbebSnyanmisaka         mpp_err( "Invalid fragment: "
2700*437bfbebSnyanmisaka                  "too large (%d bytes).\n", size);
2701*437bfbebSnyanmisaka         err = MPP_NOK;
2702*437bfbebSnyanmisaka         goto fail;
2703*437bfbebSnyanmisaka     }
2704*437bfbebSnyanmisaka 
2705*437bfbebSnyanmisaka     if (header_flag && size && data[0] & 0x80) {
2706*437bfbebSnyanmisaka         // first bit is nonzero, the extradata does not consist purely of
2707*437bfbebSnyanmisaka         // OBUs. Expect MP4/Matroska AV1CodecConfigurationRecord
2708*437bfbebSnyanmisaka         RK_S32 config_record_version = data[0] & 0x7f;
2709*437bfbebSnyanmisaka 
2710*437bfbebSnyanmisaka         if (config_record_version != 1) {
2711*437bfbebSnyanmisaka             mpp_err(
2712*437bfbebSnyanmisaka                 "Unknown version %d of AV1CodecConfigurationRecord "
2713*437bfbebSnyanmisaka                 "found!\n",
2714*437bfbebSnyanmisaka                 config_record_version);
2715*437bfbebSnyanmisaka             err = MPP_NOK;
2716*437bfbebSnyanmisaka             goto fail;
2717*437bfbebSnyanmisaka         }
2718*437bfbebSnyanmisaka 
2719*437bfbebSnyanmisaka         if (size <= 4) {
2720*437bfbebSnyanmisaka             if (size < 4) {
2721*437bfbebSnyanmisaka                 av1d_dbg(AV1D_DBG_STRMIN,
2722*437bfbebSnyanmisaka                          "Undersized AV1CodecConfigurationRecord v%d found!\n",
2723*437bfbebSnyanmisaka                          config_record_version);
2724*437bfbebSnyanmisaka                 err = MPP_NOK;
2725*437bfbebSnyanmisaka                 goto fail;
2726*437bfbebSnyanmisaka             }
2727*437bfbebSnyanmisaka 
2728*437bfbebSnyanmisaka             goto success;
2729*437bfbebSnyanmisaka         }
2730*437bfbebSnyanmisaka 
2731*437bfbebSnyanmisaka         // In AV1CodecConfigurationRecord v1, actual OBUs start after
2732*437bfbebSnyanmisaka         // four bytes. Thus set the offset as required for properly
2733*437bfbebSnyanmisaka         // parsing them.
2734*437bfbebSnyanmisaka         data += 4;
2735*437bfbebSnyanmisaka         size -= 4;
2736*437bfbebSnyanmisaka     }
2737*437bfbebSnyanmisaka 
2738*437bfbebSnyanmisaka     while (size > 0) {
2739*437bfbebSnyanmisaka         AV1RawOBUHeader header;
2740*437bfbebSnyanmisaka         RK_U64 obu_size = 0;
2741*437bfbebSnyanmisaka 
2742*437bfbebSnyanmisaka         mpp_set_bitread_ctx(&gbc, data, size);
2743*437bfbebSnyanmisaka 
2744*437bfbebSnyanmisaka         err = mpp_av1_read_obu_header(ctx, &gbc, &header);
2745*437bfbebSnyanmisaka         if (err < 0)
2746*437bfbebSnyanmisaka             goto fail;
2747*437bfbebSnyanmisaka 
2748*437bfbebSnyanmisaka         if (header.obu_has_size_field) {
2749*437bfbebSnyanmisaka             if (mpp_get_bits_left(&gbc) < 8) {
2750*437bfbebSnyanmisaka                 mpp_err( "Invalid OBU: fragment "
2751*437bfbebSnyanmisaka                          "too short (%d bytes).\n", size);
2752*437bfbebSnyanmisaka                 err = MPP_NOK;
2753*437bfbebSnyanmisaka                 goto fail;
2754*437bfbebSnyanmisaka             }
2755*437bfbebSnyanmisaka             err = mpp_av1_read_leb128(&gbc, &obu_size);
2756*437bfbebSnyanmisaka             if (err < 0)
2757*437bfbebSnyanmisaka                 goto fail;
2758*437bfbebSnyanmisaka         } else
2759*437bfbebSnyanmisaka             obu_size = size - 1 - header.obu_extension_flag;
2760*437bfbebSnyanmisaka 
2761*437bfbebSnyanmisaka         pos = mpp_get_bits_count(&gbc);
2762*437bfbebSnyanmisaka 
2763*437bfbebSnyanmisaka         mpp_assert(pos % 8 == 0 && pos / 8 <= (RK_S32)size);
2764*437bfbebSnyanmisaka         obu_length = pos / 8 + obu_size;
2765*437bfbebSnyanmisaka 
2766*437bfbebSnyanmisaka         if (size < obu_length) {
2767*437bfbebSnyanmisaka             mpp_err( "Invalid OBU length: "
2768*437bfbebSnyanmisaka                      "%lld, but only %d bytes remaining in fragment.\n",
2769*437bfbebSnyanmisaka                      obu_length, size);
2770*437bfbebSnyanmisaka             err = MPP_NOK;
2771*437bfbebSnyanmisaka             goto fail;
2772*437bfbebSnyanmisaka         }
2773*437bfbebSnyanmisaka         err = mpp_insert_unit_data(frag, -1, header.obu_type,
2774*437bfbebSnyanmisaka                                    data, obu_length);
2775*437bfbebSnyanmisaka         if (err < 0)
2776*437bfbebSnyanmisaka             goto fail;
2777*437bfbebSnyanmisaka 
2778*437bfbebSnyanmisaka         data += obu_length;
2779*437bfbebSnyanmisaka         size -= obu_length;
2780*437bfbebSnyanmisaka     }
2781*437bfbebSnyanmisaka 
2782*437bfbebSnyanmisaka success:
2783*437bfbebSnyanmisaka     err = 0;
2784*437bfbebSnyanmisaka fail:
2785*437bfbebSnyanmisaka     return err;
2786*437bfbebSnyanmisaka }
2787*437bfbebSnyanmisaka 
mpp_av1_ref_tile_data(Av1ObuUnit * unit,BitReadCtx_t * gbc,AV1RawTileData * td)2788*437bfbebSnyanmisaka static RK_S32 mpp_av1_ref_tile_data(Av1ObuUnit *unit,
2789*437bfbebSnyanmisaka                                     BitReadCtx_t *gbc,
2790*437bfbebSnyanmisaka                                     AV1RawTileData *td)
2791*437bfbebSnyanmisaka {
2792*437bfbebSnyanmisaka     RK_S32 pos;
2793*437bfbebSnyanmisaka 
2794*437bfbebSnyanmisaka     pos = mpp_get_bits_count(gbc);
2795*437bfbebSnyanmisaka     if (pos >= (RK_S32)(8 * unit->data_size)) {
2796*437bfbebSnyanmisaka         mpp_err( "Bitstream ended before "
2797*437bfbebSnyanmisaka                  "any data in tile group (%d bits read).\n", pos);
2798*437bfbebSnyanmisaka         return MPP_NOK;
2799*437bfbebSnyanmisaka     }
2800*437bfbebSnyanmisaka     // Must be byte-aligned at this point.
2801*437bfbebSnyanmisaka     mpp_assert(pos % 8 == 0);
2802*437bfbebSnyanmisaka 
2803*437bfbebSnyanmisaka     td->offset    = pos / 8;
2804*437bfbebSnyanmisaka     td->data      = unit->data      + pos / 8;
2805*437bfbebSnyanmisaka     td->data_size = unit->data_size - pos / 8;
2806*437bfbebSnyanmisaka 
2807*437bfbebSnyanmisaka     return 0;
2808*437bfbebSnyanmisaka }
2809*437bfbebSnyanmisaka 
mpp_av1_alloc_unit_content(Av1ObuUnit * unit)2810*437bfbebSnyanmisaka static MPP_RET mpp_av1_alloc_unit_content(Av1ObuUnit *unit)
2811*437bfbebSnyanmisaka {
2812*437bfbebSnyanmisaka     (void)unit;
2813*437bfbebSnyanmisaka     MPP_FREE(unit->content);
2814*437bfbebSnyanmisaka     unit->content = mpp_calloc(AV1RawOBU, 1);
2815*437bfbebSnyanmisaka     if (!unit->content) {
2816*437bfbebSnyanmisaka         return MPP_ERR_NOMEM; // drop_obu()
2817*437bfbebSnyanmisaka     }
2818*437bfbebSnyanmisaka     return MPP_OK;
2819*437bfbebSnyanmisaka }
2820*437bfbebSnyanmisaka 
mpp_av1_read_unit(AV1Context * ctx,Av1ObuUnit * unit)2821*437bfbebSnyanmisaka MPP_RET mpp_av1_read_unit(AV1Context *ctx, Av1ObuUnit *unit)
2822*437bfbebSnyanmisaka {
2823*437bfbebSnyanmisaka     AV1RawOBU *obu;
2824*437bfbebSnyanmisaka     BitReadCtx_t gbc;
2825*437bfbebSnyanmisaka     RK_S32 err = 0, start_pos, end_pos, hdr_start_pos;
2826*437bfbebSnyanmisaka 
2827*437bfbebSnyanmisaka     err = mpp_av1_alloc_unit_content(unit);
2828*437bfbebSnyanmisaka 
2829*437bfbebSnyanmisaka     if (err < 0)
2830*437bfbebSnyanmisaka         return err;
2831*437bfbebSnyanmisaka 
2832*437bfbebSnyanmisaka     obu = unit->content;
2833*437bfbebSnyanmisaka 
2834*437bfbebSnyanmisaka     mpp_set_bitread_ctx(&gbc, unit->data, unit->data_size);
2835*437bfbebSnyanmisaka 
2836*437bfbebSnyanmisaka     hdr_start_pos = mpp_get_bits_count(&gbc);
2837*437bfbebSnyanmisaka 
2838*437bfbebSnyanmisaka     err = mpp_av1_read_obu_header(ctx, &gbc, &obu->header);
2839*437bfbebSnyanmisaka     if (err < 0)
2840*437bfbebSnyanmisaka         return err;
2841*437bfbebSnyanmisaka     mpp_assert(obu->header.obu_type == unit->type);
2842*437bfbebSnyanmisaka 
2843*437bfbebSnyanmisaka     if (obu->header.obu_has_size_field) {
2844*437bfbebSnyanmisaka         RK_U64 obu_size = 0;
2845*437bfbebSnyanmisaka         err = mpp_av1_read_leb128(&gbc, &obu_size);
2846*437bfbebSnyanmisaka         if (err < 0)
2847*437bfbebSnyanmisaka             return err;
2848*437bfbebSnyanmisaka         obu->obu_size = obu_size;
2849*437bfbebSnyanmisaka     } else {
2850*437bfbebSnyanmisaka         if (unit->data_size < (RK_U32)(1 + obu->header.obu_extension_flag)) {
2851*437bfbebSnyanmisaka             mpp_err( "Invalid OBU length: "
2852*437bfbebSnyanmisaka                      "unit too short (%d).\n", unit->data_size);
2853*437bfbebSnyanmisaka             return MPP_NOK;
2854*437bfbebSnyanmisaka         }
2855*437bfbebSnyanmisaka         obu->obu_size = unit->data_size - 1 - obu->header.obu_extension_flag;
2856*437bfbebSnyanmisaka     }
2857*437bfbebSnyanmisaka 
2858*437bfbebSnyanmisaka     start_pos = mpp_get_bits_count(&gbc);
2859*437bfbebSnyanmisaka     if (!ctx->fist_tile_group)
2860*437bfbebSnyanmisaka         ctx->frame_tag_size += ((start_pos - hdr_start_pos + 7) >> 3);
2861*437bfbebSnyanmisaka     if (obu->header.obu_extension_flag) {
2862*437bfbebSnyanmisaka         if (obu->header.obu_type != AV1_OBU_SEQUENCE_HEADER &&
2863*437bfbebSnyanmisaka             obu->header.obu_type != AV1_OBU_TEMPORAL_DELIMITER &&
2864*437bfbebSnyanmisaka             ctx->operating_point_idc) {
2865*437bfbebSnyanmisaka             RK_S32 in_temporal_layer =
2866*437bfbebSnyanmisaka                 (ctx->operating_point_idc >>  ctx->temporal_id    ) & 1;
2867*437bfbebSnyanmisaka             RK_S32 in_spatial_layer  =
2868*437bfbebSnyanmisaka                 (ctx->operating_point_idc >> (ctx->spatial_id + 8)) & 1;
2869*437bfbebSnyanmisaka             if (!in_temporal_layer || !in_spatial_layer) {
2870*437bfbebSnyanmisaka                 return MPP_ERR_PROTOL; // drop_obu()
2871*437bfbebSnyanmisaka             }
2872*437bfbebSnyanmisaka         }
2873*437bfbebSnyanmisaka     }
2874*437bfbebSnyanmisaka     av1d_dbg(AV1D_DBG_HEADER, "obu type %d size %d\n",
2875*437bfbebSnyanmisaka              obu->header.obu_type, obu->obu_size);
2876*437bfbebSnyanmisaka     switch (obu->header.obu_type) {
2877*437bfbebSnyanmisaka     case AV1_OBU_SEQUENCE_HEADER: {
2878*437bfbebSnyanmisaka         err = mpp_av1_sequence_header_obu(ctx, &gbc,
2879*437bfbebSnyanmisaka                                           &obu->obu.sequence_header);
2880*437bfbebSnyanmisaka         if (err < 0)
2881*437bfbebSnyanmisaka             return err;
2882*437bfbebSnyanmisaka         ctx->frame_tag_size += obu->obu_size;
2883*437bfbebSnyanmisaka         if (ctx->operating_point >= 0) {
2884*437bfbebSnyanmisaka             AV1RawSequenceHeader *sequence_header = &obu->obu.sequence_header;
2885*437bfbebSnyanmisaka 
2886*437bfbebSnyanmisaka             if (ctx->operating_point > sequence_header->operating_points_cnt_minus_1) {
2887*437bfbebSnyanmisaka                 mpp_err("Invalid Operating Point %d requested. "
2888*437bfbebSnyanmisaka                         "Must not be higher than %u.\n",
2889*437bfbebSnyanmisaka                         ctx->operating_point, sequence_header->operating_points_cnt_minus_1);
2890*437bfbebSnyanmisaka                 return MPP_ERR_PROTOL;
2891*437bfbebSnyanmisaka             }
2892*437bfbebSnyanmisaka             ctx->operating_point_idc = sequence_header->operating_point_idc[ctx->operating_point];
2893*437bfbebSnyanmisaka         }
2894*437bfbebSnyanmisaka 
2895*437bfbebSnyanmisaka         ctx->sequence_header = NULL;
2896*437bfbebSnyanmisaka         ctx->sequence_header = &obu->obu.sequence_header;
2897*437bfbebSnyanmisaka     } break;
2898*437bfbebSnyanmisaka     case AV1_OBU_TEMPORAL_DELIMITER: {
2899*437bfbebSnyanmisaka         err = mpp_av1_temporal_delimiter_obu(ctx, &gbc);
2900*437bfbebSnyanmisaka         if (err < 0)
2901*437bfbebSnyanmisaka             return err;
2902*437bfbebSnyanmisaka     } break;
2903*437bfbebSnyanmisaka     case AV1_OBU_FRAME_HEADER:
2904*437bfbebSnyanmisaka     case AV1_OBU_REDUNDANT_FRAME_HEADER: {
2905*437bfbebSnyanmisaka         err = mpp_av1_frame_header_obu(ctx, &gbc,
2906*437bfbebSnyanmisaka                                        &obu->obu.frame_header,
2907*437bfbebSnyanmisaka                                        obu->header.obu_type ==
2908*437bfbebSnyanmisaka                                        AV1_OBU_REDUNDANT_FRAME_HEADER,
2909*437bfbebSnyanmisaka                                        NULL);
2910*437bfbebSnyanmisaka         if (err < 0)
2911*437bfbebSnyanmisaka             return err;
2912*437bfbebSnyanmisaka         ctx->frame_tag_size += obu->obu_size;
2913*437bfbebSnyanmisaka     } break;
2914*437bfbebSnyanmisaka     case AV1_OBU_TILE_GROUP: {
2915*437bfbebSnyanmisaka         RK_U32 cur_pos = mpp_get_bits_count(&gbc);
2916*437bfbebSnyanmisaka 
2917*437bfbebSnyanmisaka         err = mpp_av1_tile_group_obu(ctx, &gbc, &obu->obu.tile_group);
2918*437bfbebSnyanmisaka         if (err < 0)
2919*437bfbebSnyanmisaka             return err;
2920*437bfbebSnyanmisaka         if (!ctx->fist_tile_group)
2921*437bfbebSnyanmisaka             ctx->frame_tag_size += MPP_ALIGN(mpp_get_bits_count(&gbc) - cur_pos, 8) / 8;
2922*437bfbebSnyanmisaka         ctx->fist_tile_group = 1;
2923*437bfbebSnyanmisaka         err = mpp_av1_ref_tile_data(unit, &gbc,
2924*437bfbebSnyanmisaka                                     &obu->obu.tile_group.tile_data);
2925*437bfbebSnyanmisaka         if (err < 0)
2926*437bfbebSnyanmisaka             return err;
2927*437bfbebSnyanmisaka     } break;
2928*437bfbebSnyanmisaka     case AV1_OBU_FRAME: {
2929*437bfbebSnyanmisaka         err = mpp_av1_frame_obu(ctx, &gbc, &obu->obu.frame,
2930*437bfbebSnyanmisaka                                 NULL);
2931*437bfbebSnyanmisaka         if (err < 0)
2932*437bfbebSnyanmisaka             return err;
2933*437bfbebSnyanmisaka 
2934*437bfbebSnyanmisaka         err = mpp_av1_ref_tile_data(unit, &gbc,
2935*437bfbebSnyanmisaka                                     &obu->obu.frame.tile_group.tile_data);
2936*437bfbebSnyanmisaka         if (err < 0)
2937*437bfbebSnyanmisaka             return err;
2938*437bfbebSnyanmisaka     } break;
2939*437bfbebSnyanmisaka     case AV1_OBU_TILE_LIST: {
2940*437bfbebSnyanmisaka         err = mpp_av1_tile_list_obu(ctx, &gbc, &obu->obu.tile_list);
2941*437bfbebSnyanmisaka         if (err < 0)
2942*437bfbebSnyanmisaka             return err;
2943*437bfbebSnyanmisaka 
2944*437bfbebSnyanmisaka         err = mpp_av1_ref_tile_data(unit, &gbc,
2945*437bfbebSnyanmisaka                                     &obu->obu.tile_list.tile_data);
2946*437bfbebSnyanmisaka         if (err < 0)
2947*437bfbebSnyanmisaka             return err;
2948*437bfbebSnyanmisaka     } break;
2949*437bfbebSnyanmisaka     case AV1_OBU_METADATA: {
2950*437bfbebSnyanmisaka         ctx->frame_tag_size += obu->obu_size;
2951*437bfbebSnyanmisaka         err = mpp_av1_metadata_obu(ctx, &gbc, &obu->obu.metadata);
2952*437bfbebSnyanmisaka         if (err < 0)
2953*437bfbebSnyanmisaka             return err;
2954*437bfbebSnyanmisaka     } break;
2955*437bfbebSnyanmisaka     case AV1_OBU_PADDING: {
2956*437bfbebSnyanmisaka         err = mpp_av1_padding_obu(ctx, &gbc, &obu->obu.padding);
2957*437bfbebSnyanmisaka         if (err < 0)
2958*437bfbebSnyanmisaka             return err;
2959*437bfbebSnyanmisaka     } break;
2960*437bfbebSnyanmisaka     default:
2961*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
2962*437bfbebSnyanmisaka     }
2963*437bfbebSnyanmisaka 
2964*437bfbebSnyanmisaka     end_pos = mpp_get_bits_count(&gbc);
2965*437bfbebSnyanmisaka     mpp_assert(end_pos <= (RK_S32)(unit->data_size * 8));
2966*437bfbebSnyanmisaka 
2967*437bfbebSnyanmisaka     if (obu->obu_size > 0 &&
2968*437bfbebSnyanmisaka         obu->header.obu_type != AV1_OBU_TILE_GROUP &&
2969*437bfbebSnyanmisaka         obu->header.obu_type != AV1_OBU_TILE_LIST &&
2970*437bfbebSnyanmisaka         obu->header.obu_type != AV1_OBU_FRAME) {
2971*437bfbebSnyanmisaka         RK_S32 nb_bits = obu->obu_size * 8 + start_pos - end_pos;
2972*437bfbebSnyanmisaka 
2973*437bfbebSnyanmisaka         if (nb_bits <= 0)
2974*437bfbebSnyanmisaka             return MPP_NOK;
2975*437bfbebSnyanmisaka 
2976*437bfbebSnyanmisaka         err = mpp_av1_trailing_bits(ctx, &gbc, nb_bits);
2977*437bfbebSnyanmisaka         if (err < 0)
2978*437bfbebSnyanmisaka             return err;
2979*437bfbebSnyanmisaka     }
2980*437bfbebSnyanmisaka 
2981*437bfbebSnyanmisaka     return 0;
2982*437bfbebSnyanmisaka }
2983*437bfbebSnyanmisaka 
mpp_av1_read_fragment_content(AV1Context * ctx,Av1UnitFragment * frag)2984*437bfbebSnyanmisaka RK_S32 mpp_av1_read_fragment_content(AV1Context *ctx, Av1UnitFragment *frag)
2985*437bfbebSnyanmisaka {
2986*437bfbebSnyanmisaka     int err, i, j;
2987*437bfbebSnyanmisaka     AV1RawOBU *obu;
2988*437bfbebSnyanmisaka 
2989*437bfbebSnyanmisaka     ctx->frame_tag_size = 0;
2990*437bfbebSnyanmisaka     ctx->fist_tile_group = 0;
2991*437bfbebSnyanmisaka     for (i = 0; i < frag->nb_units; i++) {
2992*437bfbebSnyanmisaka         Av1ObuUnit *unit = &frag->units[i];
2993*437bfbebSnyanmisaka         if (ctx->unit_types) {
2994*437bfbebSnyanmisaka             for (j = 0; j < ctx->nb_unit_types; j++) {
2995*437bfbebSnyanmisaka                 if (ctx->unit_types[j] == unit->type)
2996*437bfbebSnyanmisaka                     break;
2997*437bfbebSnyanmisaka             }
2998*437bfbebSnyanmisaka             if (j >= ctx->nb_unit_types)
2999*437bfbebSnyanmisaka                 continue;
3000*437bfbebSnyanmisaka         }
3001*437bfbebSnyanmisaka         MPP_FREE(unit->content);
3002*437bfbebSnyanmisaka         mpp_assert(unit->data);
3003*437bfbebSnyanmisaka         err = mpp_av1_read_unit(ctx, unit);
3004*437bfbebSnyanmisaka 
3005*437bfbebSnyanmisaka         if (err == MPP_ERR_VALUE) {
3006*437bfbebSnyanmisaka             mpp_err_f("Decomposition unimplemented for unit %d "
3007*437bfbebSnyanmisaka                       "(type %d).\n", i, unit->type);
3008*437bfbebSnyanmisaka         } else if (err == MPP_ERR_PROTOL) {
3009*437bfbebSnyanmisaka             mpp_err_f("Skipping decomposition of"
3010*437bfbebSnyanmisaka                       "unit %d (type %d).\n", i, unit->type);
3011*437bfbebSnyanmisaka             MPP_FREE(unit->content);
3012*437bfbebSnyanmisaka             unit->content = NULL;
3013*437bfbebSnyanmisaka         } else if (err < 0) {
3014*437bfbebSnyanmisaka             mpp_err_f("Failed to read unit %d (type %d).\n", i, unit->type);
3015*437bfbebSnyanmisaka             return err;
3016*437bfbebSnyanmisaka         }
3017*437bfbebSnyanmisaka         obu = unit->content;
3018*437bfbebSnyanmisaka         av1d_dbg(AV1D_DBG_HEADER, "obu->header.obu_type %d, obu->obu_size = %d ctx->frame_tag_size %d",
3019*437bfbebSnyanmisaka                  obu->header.obu_type, obu->obu_size, ctx->frame_tag_size);
3020*437bfbebSnyanmisaka     }
3021*437bfbebSnyanmisaka     return 0;
3022*437bfbebSnyanmisaka }
3023*437bfbebSnyanmisaka 
mpp_av1_set_context_with_sequence(Av1CodecContext * ctx,const AV1RawSequenceHeader * seq)3024*437bfbebSnyanmisaka int mpp_av1_set_context_with_sequence(Av1CodecContext *ctx,
3025*437bfbebSnyanmisaka                                       const AV1RawSequenceHeader *seq)
3026*437bfbebSnyanmisaka {
3027*437bfbebSnyanmisaka     int width = seq->max_frame_width_minus_1 + 1;
3028*437bfbebSnyanmisaka     int height = seq->max_frame_height_minus_1 + 1;
3029*437bfbebSnyanmisaka 
3030*437bfbebSnyanmisaka     ctx->profile = seq->seq_profile;
3031*437bfbebSnyanmisaka     ctx->level = seq->seq_level_idx[0];
3032*437bfbebSnyanmisaka 
3033*437bfbebSnyanmisaka     ctx->color_range =
3034*437bfbebSnyanmisaka         seq->color_config.color_range ? MPP_FRAME_RANGE_JPEG : MPP_FRAME_RANGE_MPEG;
3035*437bfbebSnyanmisaka     ctx->color_primaries = seq->color_config.color_primaries;
3036*437bfbebSnyanmisaka     ctx->colorspace = seq->color_config.matrix_coefficients;
3037*437bfbebSnyanmisaka     ctx->color_trc = seq->color_config.transfer_characteristics;
3038*437bfbebSnyanmisaka 
3039*437bfbebSnyanmisaka     switch (seq->color_config.chroma_sample_position) {
3040*437bfbebSnyanmisaka     case AV1_CSP_VERTICAL:
3041*437bfbebSnyanmisaka         ctx->chroma_sample_location = MPP_CHROMA_LOC_LEFT;
3042*437bfbebSnyanmisaka         break;
3043*437bfbebSnyanmisaka     case AV1_CSP_COLOCATED:
3044*437bfbebSnyanmisaka         ctx->chroma_sample_location =  MPP_CHROMA_LOC_TOPLEFT;
3045*437bfbebSnyanmisaka         break;
3046*437bfbebSnyanmisaka     }
3047*437bfbebSnyanmisaka 
3048*437bfbebSnyanmisaka     if (ctx->width != width || ctx->height != height) {
3049*437bfbebSnyanmisaka         ctx->width = width;
3050*437bfbebSnyanmisaka         ctx->height = height;
3051*437bfbebSnyanmisaka     }
3052*437bfbebSnyanmisaka     return 0;
3053*437bfbebSnyanmisaka }
3054*437bfbebSnyanmisaka 
mpp_av1_fragment_reset(Av1UnitFragment * frag)3055*437bfbebSnyanmisaka void mpp_av1_fragment_reset(Av1UnitFragment *frag)
3056*437bfbebSnyanmisaka {
3057*437bfbebSnyanmisaka     int i;
3058*437bfbebSnyanmisaka 
3059*437bfbebSnyanmisaka     for (i = 0; i < frag->nb_units; i++) {
3060*437bfbebSnyanmisaka         Av1ObuUnit *unit = &frag->units[i];
3061*437bfbebSnyanmisaka         MPP_FREE(unit->content);
3062*437bfbebSnyanmisaka         unit->data             = NULL;
3063*437bfbebSnyanmisaka         unit->data_size        = 0;
3064*437bfbebSnyanmisaka     }
3065*437bfbebSnyanmisaka     frag->nb_units         = 0;
3066*437bfbebSnyanmisaka     frag->data             = NULL;
3067*437bfbebSnyanmisaka     frag->data_size        = 0;
3068*437bfbebSnyanmisaka }
3069*437bfbebSnyanmisaka 
mpp_av1_assemble_fragment(AV1Context * ctx,Av1UnitFragment * frag)3070*437bfbebSnyanmisaka RK_S32 mpp_av1_assemble_fragment(AV1Context *ctx, Av1UnitFragment *frag)
3071*437bfbebSnyanmisaka {
3072*437bfbebSnyanmisaka     size_t size, pos;
3073*437bfbebSnyanmisaka     RK_S32 i;
3074*437bfbebSnyanmisaka     (void)ctx;
3075*437bfbebSnyanmisaka     size = 0;
3076*437bfbebSnyanmisaka     for (i = 0; i < frag->nb_units; i++)
3077*437bfbebSnyanmisaka         size += frag->units[i].data_size;
3078*437bfbebSnyanmisaka 
3079*437bfbebSnyanmisaka     frag->data = mpp_malloc(RK_U8, size + BUFFER_PADDING_SIZE);
3080*437bfbebSnyanmisaka     if (!frag->data)
3081*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
3082*437bfbebSnyanmisaka 
3083*437bfbebSnyanmisaka     memset(frag->data + size, 0, BUFFER_PADDING_SIZE);
3084*437bfbebSnyanmisaka 
3085*437bfbebSnyanmisaka     pos = 0;
3086*437bfbebSnyanmisaka     for (i = 0; i < frag->nb_units; i++) {
3087*437bfbebSnyanmisaka         memcpy(frag->data + pos, frag->units[i].data,
3088*437bfbebSnyanmisaka                frag->units[i].data_size);
3089*437bfbebSnyanmisaka         pos += frag->units[i].data_size;
3090*437bfbebSnyanmisaka     }
3091*437bfbebSnyanmisaka     mpp_assert(pos == size);
3092*437bfbebSnyanmisaka     frag->data_size = size;
3093*437bfbebSnyanmisaka 
3094*437bfbebSnyanmisaka     return 0;
3095*437bfbebSnyanmisaka }
3096*437bfbebSnyanmisaka 
mpp_av1_flush(AV1Context * ctx)3097*437bfbebSnyanmisaka void mpp_av1_flush(AV1Context *ctx)
3098*437bfbebSnyanmisaka {
3099*437bfbebSnyanmisaka     //  ctx->sequencframe_headere_header = NULL;
3100*437bfbebSnyanmisaka     //  ctx-> = NULL;
3101*437bfbebSnyanmisaka 
3102*437bfbebSnyanmisaka     memset(ctx->ref_s, 0, sizeof(ctx->ref_s));
3103*437bfbebSnyanmisaka     ctx->operating_point_idc = 0;
3104*437bfbebSnyanmisaka     ctx->seen_frame_header = 0;
3105*437bfbebSnyanmisaka     ctx->tile_num = 0;
3106*437bfbebSnyanmisaka }
3107*437bfbebSnyanmisaka 
mpp_av1_close(AV1Context * ctx)3108*437bfbebSnyanmisaka void mpp_av1_close(AV1Context *ctx)
3109*437bfbebSnyanmisaka {
3110*437bfbebSnyanmisaka     MPP_FREE(ctx->frame_header);
3111*437bfbebSnyanmisaka     MPP_FREE(ctx->sequence_header);
3112*437bfbebSnyanmisaka     MPP_FREE(ctx->raw_frame_header);
3113*437bfbebSnyanmisaka }
3114*437bfbebSnyanmisaka 
mpp_av1_free_metadata(void * unit,RK_U8 * content)3115*437bfbebSnyanmisaka void mpp_av1_free_metadata(void *unit, RK_U8 *content)
3116*437bfbebSnyanmisaka {
3117*437bfbebSnyanmisaka     AV1RawOBU *obu = (AV1RawOBU*)content;
3118*437bfbebSnyanmisaka     (void)unit;
3119*437bfbebSnyanmisaka     mpp_assert(obu->header.obu_type == AV1_OBU_METADATA);
3120*437bfbebSnyanmisaka     MPP_FREE(content);
3121*437bfbebSnyanmisaka }
3122