xref: /aosp_15_r20/external/libdav1d/src/internal.h (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
1*c0909341SAndroid Build Coastguard Worker /*
2*c0909341SAndroid Build Coastguard Worker  * Copyright © 2018-2021, VideoLAN and dav1d authors
3*c0909341SAndroid Build Coastguard Worker  * Copyright © 2018, Two Orioles, LLC
4*c0909341SAndroid Build Coastguard Worker  * All rights reserved.
5*c0909341SAndroid Build Coastguard Worker  *
6*c0909341SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
7*c0909341SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
8*c0909341SAndroid Build Coastguard Worker  *
9*c0909341SAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright notice, this
10*c0909341SAndroid Build Coastguard Worker  *    list of conditions and the following disclaimer.
11*c0909341SAndroid Build Coastguard Worker  *
12*c0909341SAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright notice,
13*c0909341SAndroid Build Coastguard Worker  *    this list of conditions and the following disclaimer in the documentation
14*c0909341SAndroid Build Coastguard Worker  *    and/or other materials provided with the distribution.
15*c0909341SAndroid Build Coastguard Worker  *
16*c0909341SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17*c0909341SAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*c0909341SAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*c0909341SAndroid Build Coastguard Worker  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20*c0909341SAndroid Build Coastguard Worker  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*c0909341SAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*c0909341SAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23*c0909341SAndroid Build Coastguard Worker  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*c0909341SAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*c0909341SAndroid Build Coastguard Worker  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*c0909341SAndroid Build Coastguard Worker  */
27*c0909341SAndroid Build Coastguard Worker 
28*c0909341SAndroid Build Coastguard Worker #ifndef DAV1D_SRC_INTERNAL_H
29*c0909341SAndroid Build Coastguard Worker #define DAV1D_SRC_INTERNAL_H
30*c0909341SAndroid Build Coastguard Worker 
31*c0909341SAndroid Build Coastguard Worker #include <stdatomic.h>
32*c0909341SAndroid Build Coastguard Worker 
33*c0909341SAndroid Build Coastguard Worker #include "dav1d/data.h"
34*c0909341SAndroid Build Coastguard Worker 
35*c0909341SAndroid Build Coastguard Worker typedef struct Dav1dFrameContext Dav1dFrameContext;
36*c0909341SAndroid Build Coastguard Worker typedef struct Dav1dTileState Dav1dTileState;
37*c0909341SAndroid Build Coastguard Worker typedef struct Dav1dTaskContext Dav1dTaskContext;
38*c0909341SAndroid Build Coastguard Worker typedef struct Dav1dTask Dav1dTask;
39*c0909341SAndroid Build Coastguard Worker 
40*c0909341SAndroid Build Coastguard Worker #include "common/attributes.h"
41*c0909341SAndroid Build Coastguard Worker 
42*c0909341SAndroid Build Coastguard Worker #include "src/cdef.h"
43*c0909341SAndroid Build Coastguard Worker #include "src/cdf.h"
44*c0909341SAndroid Build Coastguard Worker #include "src/data.h"
45*c0909341SAndroid Build Coastguard Worker #include "src/env.h"
46*c0909341SAndroid Build Coastguard Worker #include "src/filmgrain.h"
47*c0909341SAndroid Build Coastguard Worker #include "src/intra_edge.h"
48*c0909341SAndroid Build Coastguard Worker #include "src/ipred.h"
49*c0909341SAndroid Build Coastguard Worker #include "src/itx.h"
50*c0909341SAndroid Build Coastguard Worker #include "src/levels.h"
51*c0909341SAndroid Build Coastguard Worker #include "src/lf_mask.h"
52*c0909341SAndroid Build Coastguard Worker #include "src/loopfilter.h"
53*c0909341SAndroid Build Coastguard Worker #include "src/looprestoration.h"
54*c0909341SAndroid Build Coastguard Worker #include "src/mc.h"
55*c0909341SAndroid Build Coastguard Worker #include "src/msac.h"
56*c0909341SAndroid Build Coastguard Worker #include "src/pal.h"
57*c0909341SAndroid Build Coastguard Worker #include "src/picture.h"
58*c0909341SAndroid Build Coastguard Worker #include "src/recon.h"
59*c0909341SAndroid Build Coastguard Worker #include "src/refmvs.h"
60*c0909341SAndroid Build Coastguard Worker #include "src/thread.h"
61*c0909341SAndroid Build Coastguard Worker 
62*c0909341SAndroid Build Coastguard Worker typedef struct Dav1dDSPContext {
63*c0909341SAndroid Build Coastguard Worker     Dav1dFilmGrainDSPContext fg;
64*c0909341SAndroid Build Coastguard Worker     Dav1dIntraPredDSPContext ipred;
65*c0909341SAndroid Build Coastguard Worker     Dav1dMCDSPContext mc;
66*c0909341SAndroid Build Coastguard Worker     Dav1dInvTxfmDSPContext itx;
67*c0909341SAndroid Build Coastguard Worker     Dav1dLoopFilterDSPContext lf;
68*c0909341SAndroid Build Coastguard Worker     Dav1dCdefDSPContext cdef;
69*c0909341SAndroid Build Coastguard Worker     Dav1dLoopRestorationDSPContext lr;
70*c0909341SAndroid Build Coastguard Worker } Dav1dDSPContext;
71*c0909341SAndroid Build Coastguard Worker 
72*c0909341SAndroid Build Coastguard Worker struct Dav1dTileGroup {
73*c0909341SAndroid Build Coastguard Worker     Dav1dData data;
74*c0909341SAndroid Build Coastguard Worker     int start, end;
75*c0909341SAndroid Build Coastguard Worker };
76*c0909341SAndroid Build Coastguard Worker 
77*c0909341SAndroid Build Coastguard Worker enum TaskType {
78*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_INIT,
79*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_INIT_CDF,
80*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_TILE_ENTROPY,
81*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_ENTROPY_PROGRESS,
82*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_TILE_RECONSTRUCTION,
83*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_DEBLOCK_COLS,
84*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_DEBLOCK_ROWS,
85*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_CDEF,
86*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_SUPER_RESOLUTION,
87*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_LOOP_RESTORATION,
88*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_RECONSTRUCTION_PROGRESS,
89*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_FG_PREP,
90*c0909341SAndroid Build Coastguard Worker     DAV1D_TASK_TYPE_FG_APPLY,
91*c0909341SAndroid Build Coastguard Worker };
92*c0909341SAndroid Build Coastguard Worker 
93*c0909341SAndroid Build Coastguard Worker struct Dav1dContext {
94*c0909341SAndroid Build Coastguard Worker     Dav1dFrameContext *fc;
95*c0909341SAndroid Build Coastguard Worker     unsigned n_fc;
96*c0909341SAndroid Build Coastguard Worker 
97*c0909341SAndroid Build Coastguard Worker     Dav1dTaskContext *tc;
98*c0909341SAndroid Build Coastguard Worker     unsigned n_tc;
99*c0909341SAndroid Build Coastguard Worker 
100*c0909341SAndroid Build Coastguard Worker     // cache of OBUs that make up a single frame before we submit them
101*c0909341SAndroid Build Coastguard Worker     // to a frame worker to be decoded
102*c0909341SAndroid Build Coastguard Worker     struct Dav1dTileGroup *tile;
103*c0909341SAndroid Build Coastguard Worker     int n_tile_data_alloc;
104*c0909341SAndroid Build Coastguard Worker     int n_tile_data;
105*c0909341SAndroid Build Coastguard Worker     int n_tiles;
106*c0909341SAndroid Build Coastguard Worker     Dav1dMemPool *seq_hdr_pool;
107*c0909341SAndroid Build Coastguard Worker     Dav1dRef *seq_hdr_ref;
108*c0909341SAndroid Build Coastguard Worker     Dav1dSequenceHeader *seq_hdr;
109*c0909341SAndroid Build Coastguard Worker     Dav1dMemPool *frame_hdr_pool;
110*c0909341SAndroid Build Coastguard Worker     Dav1dRef *frame_hdr_ref;
111*c0909341SAndroid Build Coastguard Worker     Dav1dFrameHeader *frame_hdr;
112*c0909341SAndroid Build Coastguard Worker 
113*c0909341SAndroid Build Coastguard Worker     Dav1dRef *content_light_ref;
114*c0909341SAndroid Build Coastguard Worker     Dav1dContentLightLevel *content_light;
115*c0909341SAndroid Build Coastguard Worker     Dav1dRef *mastering_display_ref;
116*c0909341SAndroid Build Coastguard Worker     Dav1dMasteringDisplay *mastering_display;
117*c0909341SAndroid Build Coastguard Worker     Dav1dRef *itut_t35_ref;
118*c0909341SAndroid Build Coastguard Worker     Dav1dITUTT35 *itut_t35;
119*c0909341SAndroid Build Coastguard Worker     int n_itut_t35;
120*c0909341SAndroid Build Coastguard Worker 
121*c0909341SAndroid Build Coastguard Worker     // decoded output picture queue
122*c0909341SAndroid Build Coastguard Worker     Dav1dData in;
123*c0909341SAndroid Build Coastguard Worker     Dav1dThreadPicture out, cache;
124*c0909341SAndroid Build Coastguard Worker     // dummy is a pointer to prevent compiler errors about atomic_load()
125*c0909341SAndroid Build Coastguard Worker     // not taking const arguments
126*c0909341SAndroid Build Coastguard Worker     atomic_int flush_mem, *flush;
127*c0909341SAndroid Build Coastguard Worker     struct {
128*c0909341SAndroid Build Coastguard Worker         Dav1dThreadPicture *out_delayed;
129*c0909341SAndroid Build Coastguard Worker         unsigned next;
130*c0909341SAndroid Build Coastguard Worker     } frame_thread;
131*c0909341SAndroid Build Coastguard Worker 
132*c0909341SAndroid Build Coastguard Worker     // task threading (refer to tc[] for per_thread thingies)
133*c0909341SAndroid Build Coastguard Worker     struct TaskThreadData {
134*c0909341SAndroid Build Coastguard Worker         pthread_mutex_t lock;
135*c0909341SAndroid Build Coastguard Worker         pthread_cond_t cond;
136*c0909341SAndroid Build Coastguard Worker         atomic_uint first;
137*c0909341SAndroid Build Coastguard Worker         unsigned cur;
138*c0909341SAndroid Build Coastguard Worker         // This is used for delayed reset of the task cur pointer when
139*c0909341SAndroid Build Coastguard Worker         // such operation is needed but the thread doesn't enter a critical
140*c0909341SAndroid Build Coastguard Worker         // section (typically when executing the next sbrow task locklessly).
141*c0909341SAndroid Build Coastguard Worker         // See src/thread_task.c:reset_task_cur().
142*c0909341SAndroid Build Coastguard Worker         atomic_uint reset_task_cur;
143*c0909341SAndroid Build Coastguard Worker         atomic_int cond_signaled;
144*c0909341SAndroid Build Coastguard Worker         struct {
145*c0909341SAndroid Build Coastguard Worker             int exec, finished;
146*c0909341SAndroid Build Coastguard Worker             pthread_cond_t cond;
147*c0909341SAndroid Build Coastguard Worker             const Dav1dPicture *in;
148*c0909341SAndroid Build Coastguard Worker             Dav1dPicture *out;
149*c0909341SAndroid Build Coastguard Worker             enum TaskType type;
150*c0909341SAndroid Build Coastguard Worker             atomic_int progress[2]; /* [0]=started, [1]=completed */
151*c0909341SAndroid Build Coastguard Worker             union {
152*c0909341SAndroid Build Coastguard Worker                 struct {
153*c0909341SAndroid Build Coastguard Worker                     ALIGN(int8_t grain_lut_8bpc[3][GRAIN_HEIGHT + 1][GRAIN_WIDTH], 16);
154*c0909341SAndroid Build Coastguard Worker                     ALIGN(uint8_t scaling_8bpc[3][256], 64);
155*c0909341SAndroid Build Coastguard Worker                 };
156*c0909341SAndroid Build Coastguard Worker                 struct {
157*c0909341SAndroid Build Coastguard Worker                     ALIGN(int16_t grain_lut_16bpc[3][GRAIN_HEIGHT + 1][GRAIN_WIDTH], 16);
158*c0909341SAndroid Build Coastguard Worker                     ALIGN(uint8_t scaling_16bpc[3][4096], 64);
159*c0909341SAndroid Build Coastguard Worker                 };
160*c0909341SAndroid Build Coastguard Worker             };
161*c0909341SAndroid Build Coastguard Worker         } delayed_fg;
162*c0909341SAndroid Build Coastguard Worker         int inited;
163*c0909341SAndroid Build Coastguard Worker     } task_thread;
164*c0909341SAndroid Build Coastguard Worker 
165*c0909341SAndroid Build Coastguard Worker     // reference/entropy state
166*c0909341SAndroid Build Coastguard Worker     Dav1dMemPool *segmap_pool;
167*c0909341SAndroid Build Coastguard Worker     Dav1dMemPool *refmvs_pool;
168*c0909341SAndroid Build Coastguard Worker     struct {
169*c0909341SAndroid Build Coastguard Worker         Dav1dThreadPicture p;
170*c0909341SAndroid Build Coastguard Worker         Dav1dRef *segmap;
171*c0909341SAndroid Build Coastguard Worker         Dav1dRef *refmvs;
172*c0909341SAndroid Build Coastguard Worker         unsigned refpoc[7];
173*c0909341SAndroid Build Coastguard Worker     } refs[8];
174*c0909341SAndroid Build Coastguard Worker     Dav1dMemPool *cdf_pool;
175*c0909341SAndroid Build Coastguard Worker     CdfThreadContext cdf[8];
176*c0909341SAndroid Build Coastguard Worker 
177*c0909341SAndroid Build Coastguard Worker     Dav1dDSPContext dsp[3 /* 8, 10, 12 bits/component */];
178*c0909341SAndroid Build Coastguard Worker     Dav1dPalDSPContext pal_dsp;
179*c0909341SAndroid Build Coastguard Worker     Dav1dRefmvsDSPContext refmvs_dsp;
180*c0909341SAndroid Build Coastguard Worker 
181*c0909341SAndroid Build Coastguard Worker     Dav1dPicAllocator allocator;
182*c0909341SAndroid Build Coastguard Worker     int apply_grain;
183*c0909341SAndroid Build Coastguard Worker     int operating_point;
184*c0909341SAndroid Build Coastguard Worker     unsigned operating_point_idc;
185*c0909341SAndroid Build Coastguard Worker     int all_layers;
186*c0909341SAndroid Build Coastguard Worker     int max_spatial_id;
187*c0909341SAndroid Build Coastguard Worker     unsigned frame_size_limit;
188*c0909341SAndroid Build Coastguard Worker     int strict_std_compliance;
189*c0909341SAndroid Build Coastguard Worker     int output_invisible_frames;
190*c0909341SAndroid Build Coastguard Worker     enum Dav1dInloopFilterType inloop_filters;
191*c0909341SAndroid Build Coastguard Worker     enum Dav1dDecodeFrameType decode_frame_type;
192*c0909341SAndroid Build Coastguard Worker     int drain;
193*c0909341SAndroid Build Coastguard Worker     enum PictureFlags frame_flags;
194*c0909341SAndroid Build Coastguard Worker     enum Dav1dEventFlags event_flags;
195*c0909341SAndroid Build Coastguard Worker     Dav1dDataProps cached_error_props;
196*c0909341SAndroid Build Coastguard Worker     int cached_error;
197*c0909341SAndroid Build Coastguard Worker 
198*c0909341SAndroid Build Coastguard Worker     Dav1dLogger logger;
199*c0909341SAndroid Build Coastguard Worker 
200*c0909341SAndroid Build Coastguard Worker     Dav1dMemPool *picture_pool;
201*c0909341SAndroid Build Coastguard Worker     Dav1dMemPool *pic_ctx_pool;
202*c0909341SAndroid Build Coastguard Worker };
203*c0909341SAndroid Build Coastguard Worker 
204*c0909341SAndroid Build Coastguard Worker struct Dav1dTask {
205*c0909341SAndroid Build Coastguard Worker     unsigned frame_idx;         // frame thread id
206*c0909341SAndroid Build Coastguard Worker     enum TaskType type;         // task work
207*c0909341SAndroid Build Coastguard Worker     int sby;                    // sbrow
208*c0909341SAndroid Build Coastguard Worker 
209*c0909341SAndroid Build Coastguard Worker     // task dependencies
210*c0909341SAndroid Build Coastguard Worker     int recon_progress, deblock_progress;
211*c0909341SAndroid Build Coastguard Worker     int deps_skip;
212*c0909341SAndroid Build Coastguard Worker     struct Dav1dTask *next; // only used in task queue
213*c0909341SAndroid Build Coastguard Worker };
214*c0909341SAndroid Build Coastguard Worker 
215*c0909341SAndroid Build Coastguard Worker struct Dav1dFrameContext {
216*c0909341SAndroid Build Coastguard Worker     Dav1dRef *seq_hdr_ref;
217*c0909341SAndroid Build Coastguard Worker     Dav1dSequenceHeader *seq_hdr;
218*c0909341SAndroid Build Coastguard Worker     Dav1dRef *frame_hdr_ref;
219*c0909341SAndroid Build Coastguard Worker     Dav1dFrameHeader *frame_hdr;
220*c0909341SAndroid Build Coastguard Worker     Dav1dThreadPicture refp[7];
221*c0909341SAndroid Build Coastguard Worker     Dav1dPicture cur; // during block coding / reconstruction
222*c0909341SAndroid Build Coastguard Worker     Dav1dThreadPicture sr_cur; // after super-resolution upscaling
223*c0909341SAndroid Build Coastguard Worker     Dav1dRef *mvs_ref;
224*c0909341SAndroid Build Coastguard Worker     refmvs_temporal_block *mvs, *ref_mvs[7];
225*c0909341SAndroid Build Coastguard Worker     Dav1dRef *ref_mvs_ref[7];
226*c0909341SAndroid Build Coastguard Worker     Dav1dRef *cur_segmap_ref, *prev_segmap_ref;
227*c0909341SAndroid Build Coastguard Worker     uint8_t *cur_segmap;
228*c0909341SAndroid Build Coastguard Worker     const uint8_t *prev_segmap;
229*c0909341SAndroid Build Coastguard Worker     unsigned refpoc[7], refrefpoc[7][7];
230*c0909341SAndroid Build Coastguard Worker     uint8_t gmv_warp_allowed[7];
231*c0909341SAndroid Build Coastguard Worker     CdfThreadContext in_cdf, out_cdf;
232*c0909341SAndroid Build Coastguard Worker     struct Dav1dTileGroup *tile;
233*c0909341SAndroid Build Coastguard Worker     int n_tile_data_alloc;
234*c0909341SAndroid Build Coastguard Worker     int n_tile_data;
235*c0909341SAndroid Build Coastguard Worker 
236*c0909341SAndroid Build Coastguard Worker     // for scalable references
237*c0909341SAndroid Build Coastguard Worker     struct ScalableMotionParams {
238*c0909341SAndroid Build Coastguard Worker         int scale; // if no scaling, this is 0
239*c0909341SAndroid Build Coastguard Worker         int step;
240*c0909341SAndroid Build Coastguard Worker     } svc[7][2 /* x, y */];
241*c0909341SAndroid Build Coastguard Worker     int resize_step[2 /* y, uv */], resize_start[2 /* y, uv */];
242*c0909341SAndroid Build Coastguard Worker 
243*c0909341SAndroid Build Coastguard Worker     const Dav1dContext *c;
244*c0909341SAndroid Build Coastguard Worker     Dav1dTileState *ts;
245*c0909341SAndroid Build Coastguard Worker     int n_ts;
246*c0909341SAndroid Build Coastguard Worker     const Dav1dDSPContext *dsp;
247*c0909341SAndroid Build Coastguard Worker     struct {
248*c0909341SAndroid Build Coastguard Worker         recon_b_intra_fn recon_b_intra;
249*c0909341SAndroid Build Coastguard Worker         recon_b_inter_fn recon_b_inter;
250*c0909341SAndroid Build Coastguard Worker         filter_sbrow_fn filter_sbrow;
251*c0909341SAndroid Build Coastguard Worker         filter_sbrow_fn filter_sbrow_deblock_cols;
252*c0909341SAndroid Build Coastguard Worker         filter_sbrow_fn filter_sbrow_deblock_rows;
253*c0909341SAndroid Build Coastguard Worker         void (*filter_sbrow_cdef)(Dav1dTaskContext *tc, int sby);
254*c0909341SAndroid Build Coastguard Worker         filter_sbrow_fn filter_sbrow_resize;
255*c0909341SAndroid Build Coastguard Worker         filter_sbrow_fn filter_sbrow_lr;
256*c0909341SAndroid Build Coastguard Worker         backup_ipred_edge_fn backup_ipred_edge;
257*c0909341SAndroid Build Coastguard Worker         read_coef_blocks_fn read_coef_blocks;
258*c0909341SAndroid Build Coastguard Worker         copy_pal_block_fn copy_pal_block_y;
259*c0909341SAndroid Build Coastguard Worker         copy_pal_block_fn copy_pal_block_uv;
260*c0909341SAndroid Build Coastguard Worker         read_pal_plane_fn read_pal_plane;
261*c0909341SAndroid Build Coastguard Worker         read_pal_uv_fn read_pal_uv;
262*c0909341SAndroid Build Coastguard Worker     } bd_fn;
263*c0909341SAndroid Build Coastguard Worker 
264*c0909341SAndroid Build Coastguard Worker     int ipred_edge_sz;
265*c0909341SAndroid Build Coastguard Worker     pixel *ipred_edge[3];
266*c0909341SAndroid Build Coastguard Worker     ptrdiff_t b4_stride;
267*c0909341SAndroid Build Coastguard Worker     int w4, h4, bw, bh, sb128w, sb128h, sbh, sb_shift, sb_step, sr_sb128w;
268*c0909341SAndroid Build Coastguard Worker     uint16_t dq[DAV1D_MAX_SEGMENTS][3 /* plane */][2 /* dc/ac */];
269*c0909341SAndroid Build Coastguard Worker     const uint8_t *qm[N_RECT_TX_SIZES][3 /* plane */];
270*c0909341SAndroid Build Coastguard Worker     BlockContext *a;
271*c0909341SAndroid Build Coastguard Worker     int a_sz /* w*tile_rows */;
272*c0909341SAndroid Build Coastguard Worker     refmvs_frame rf;
273*c0909341SAndroid Build Coastguard Worker     uint8_t jnt_weights[7][7];
274*c0909341SAndroid Build Coastguard Worker     int bitdepth_max;
275*c0909341SAndroid Build Coastguard Worker 
276*c0909341SAndroid Build Coastguard Worker     struct {
277*c0909341SAndroid Build Coastguard Worker         int next_tile_row[2 /* 0: reconstruction, 1: entropy */];
278*c0909341SAndroid Build Coastguard Worker         atomic_int entropy_progress;
279*c0909341SAndroid Build Coastguard Worker         atomic_int deblock_progress; // in sby units
280*c0909341SAndroid Build Coastguard Worker         atomic_uint *frame_progress, *copy_lpf_progress;
281*c0909341SAndroid Build Coastguard Worker         // indexed using t->by * f->b4_stride + t->bx
282*c0909341SAndroid Build Coastguard Worker         Av1Block *b;
283*c0909341SAndroid Build Coastguard Worker         int16_t *cbi; /* bits 0-4: txtp, bits 5-15: eob */
284*c0909341SAndroid Build Coastguard Worker         // indexed using (t->by >> 1) * (f->b4_stride >> 1) + (t->bx >> 1)
285*c0909341SAndroid Build Coastguard Worker         pixel (*pal)[3 /* plane */][8 /* idx */];
286*c0909341SAndroid Build Coastguard Worker         // iterated over inside tile state
287*c0909341SAndroid Build Coastguard Worker         uint8_t *pal_idx;
288*c0909341SAndroid Build Coastguard Worker         coef *cf;
289*c0909341SAndroid Build Coastguard Worker         int prog_sz;
290*c0909341SAndroid Build Coastguard Worker         int cbi_sz, pal_sz, pal_idx_sz, cf_sz;
291*c0909341SAndroid Build Coastguard Worker         // start offsets per tile
292*c0909341SAndroid Build Coastguard Worker         unsigned *tile_start_off;
293*c0909341SAndroid Build Coastguard Worker     } frame_thread;
294*c0909341SAndroid Build Coastguard Worker 
295*c0909341SAndroid Build Coastguard Worker     // loopfilter
296*c0909341SAndroid Build Coastguard Worker     struct {
297*c0909341SAndroid Build Coastguard Worker         uint8_t (*level)[4];
298*c0909341SAndroid Build Coastguard Worker         Av1Filter *mask;
299*c0909341SAndroid Build Coastguard Worker         Av1Restoration *lr_mask;
300*c0909341SAndroid Build Coastguard Worker         int mask_sz /* w*h */, lr_mask_sz;
301*c0909341SAndroid Build Coastguard Worker         int cdef_buf_plane_sz[2]; /* stride*sbh*4 */
302*c0909341SAndroid Build Coastguard Worker         int cdef_buf_sbh;
303*c0909341SAndroid Build Coastguard Worker         int lr_buf_plane_sz[2]; /* (stride*sbh*4) << sb128 if n_tc > 1, else stride*4 */
304*c0909341SAndroid Build Coastguard Worker         int re_sz /* h */;
305*c0909341SAndroid Build Coastguard Worker         ALIGN(Av1FilterLUT lim_lut, 16);
306*c0909341SAndroid Build Coastguard Worker         ALIGN(uint8_t lvl[8 /* seg_id */][4 /* dir */][8 /* ref */][2 /* is_gmv */], 16);
307*c0909341SAndroid Build Coastguard Worker         int last_sharpness;
308*c0909341SAndroid Build Coastguard Worker         uint8_t *tx_lpf_right_edge[2];
309*c0909341SAndroid Build Coastguard Worker         uint8_t *cdef_line_buf, *lr_line_buf;
310*c0909341SAndroid Build Coastguard Worker         pixel *cdef_line[2 /* pre, post */][3 /* plane */];
311*c0909341SAndroid Build Coastguard Worker         pixel *cdef_lpf_line[3 /* plane */];
312*c0909341SAndroid Build Coastguard Worker         pixel *lr_lpf_line[3 /* plane */];
313*c0909341SAndroid Build Coastguard Worker 
314*c0909341SAndroid Build Coastguard Worker         // in-loop filter per-frame state keeping
315*c0909341SAndroid Build Coastguard Worker         uint8_t *start_of_tile_row;
316*c0909341SAndroid Build Coastguard Worker         int start_of_tile_row_sz;
317*c0909341SAndroid Build Coastguard Worker         int need_cdef_lpf_copy;
318*c0909341SAndroid Build Coastguard Worker         pixel *p[3], *sr_p[3];
319*c0909341SAndroid Build Coastguard Worker         int restore_planes; // enum LrRestorePlanes
320*c0909341SAndroid Build Coastguard Worker     } lf;
321*c0909341SAndroid Build Coastguard Worker 
322*c0909341SAndroid Build Coastguard Worker     struct {
323*c0909341SAndroid Build Coastguard Worker         pthread_mutex_t lock;
324*c0909341SAndroid Build Coastguard Worker         pthread_cond_t cond;
325*c0909341SAndroid Build Coastguard Worker         struct TaskThreadData *ttd;
326*c0909341SAndroid Build Coastguard Worker         struct Dav1dTask *tasks, *tile_tasks[2], init_task;
327*c0909341SAndroid Build Coastguard Worker         int num_tasks, num_tile_tasks;
328*c0909341SAndroid Build Coastguard Worker         atomic_int init_done;
329*c0909341SAndroid Build Coastguard Worker         atomic_int done[2];
330*c0909341SAndroid Build Coastguard Worker         int retval;
331*c0909341SAndroid Build Coastguard Worker         int update_set; // whether we need to update CDF reference
332*c0909341SAndroid Build Coastguard Worker         atomic_int error;
333*c0909341SAndroid Build Coastguard Worker         atomic_int task_counter;
334*c0909341SAndroid Build Coastguard Worker         struct Dav1dTask *task_head, *task_tail;
335*c0909341SAndroid Build Coastguard Worker         // Points to the task directly before the cur pointer in the queue.
336*c0909341SAndroid Build Coastguard Worker         // This cur pointer is theoretical here, we actually keep track of the
337*c0909341SAndroid Build Coastguard Worker         // "prev_t" variable. This is needed to not loose the tasks in
338*c0909341SAndroid Build Coastguard Worker         // [head;cur-1] when picking one for execution.
339*c0909341SAndroid Build Coastguard Worker         struct Dav1dTask *task_cur_prev;
340*c0909341SAndroid Build Coastguard Worker         struct { // async task insertion
341*c0909341SAndroid Build Coastguard Worker             atomic_int merge;
342*c0909341SAndroid Build Coastguard Worker             pthread_mutex_t lock;
343*c0909341SAndroid Build Coastguard Worker             Dav1dTask *head, *tail;
344*c0909341SAndroid Build Coastguard Worker         } pending_tasks;
345*c0909341SAndroid Build Coastguard Worker     } task_thread;
346*c0909341SAndroid Build Coastguard Worker 
347*c0909341SAndroid Build Coastguard Worker     // threading (refer to tc[] for per-thread things)
348*c0909341SAndroid Build Coastguard Worker     struct FrameTileThreadData {
349*c0909341SAndroid Build Coastguard Worker         int (*lowest_pixel_mem)[7][2];
350*c0909341SAndroid Build Coastguard Worker         int lowest_pixel_mem_sz;
351*c0909341SAndroid Build Coastguard Worker     } tile_thread;
352*c0909341SAndroid Build Coastguard Worker };
353*c0909341SAndroid Build Coastguard Worker 
354*c0909341SAndroid Build Coastguard Worker struct Dav1dTileState {
355*c0909341SAndroid Build Coastguard Worker     CdfContext cdf;
356*c0909341SAndroid Build Coastguard Worker     MsacContext msac;
357*c0909341SAndroid Build Coastguard Worker 
358*c0909341SAndroid Build Coastguard Worker     struct {
359*c0909341SAndroid Build Coastguard Worker         int col_start, col_end, row_start, row_end; // in 4px units
360*c0909341SAndroid Build Coastguard Worker         int col, row; // in tile units
361*c0909341SAndroid Build Coastguard Worker     } tiling;
362*c0909341SAndroid Build Coastguard Worker 
363*c0909341SAndroid Build Coastguard Worker     // in sby units, TILE_ERROR after a decoding error
364*c0909341SAndroid Build Coastguard Worker     atomic_int progress[2 /* 0: reconstruction, 1: entropy */];
365*c0909341SAndroid Build Coastguard Worker     struct {
366*c0909341SAndroid Build Coastguard Worker         uint8_t *pal_idx;
367*c0909341SAndroid Build Coastguard Worker         int16_t *cbi;
368*c0909341SAndroid Build Coastguard Worker         coef *cf;
369*c0909341SAndroid Build Coastguard Worker     } frame_thread[2 /* 0: reconstruction, 1: entropy */];
370*c0909341SAndroid Build Coastguard Worker 
371*c0909341SAndroid Build Coastguard Worker     // in fullpel units, [0] = Y, [1] = UV, used for progress requirements
372*c0909341SAndroid Build Coastguard Worker     // each entry is one tile-sbrow; middle index is refidx
373*c0909341SAndroid Build Coastguard Worker     int (*lowest_pixel)[7][2];
374*c0909341SAndroid Build Coastguard Worker 
375*c0909341SAndroid Build Coastguard Worker     uint16_t dqmem[DAV1D_MAX_SEGMENTS][3 /* plane */][2 /* dc/ac */];
376*c0909341SAndroid Build Coastguard Worker     const uint16_t (*dq)[3][2];
377*c0909341SAndroid Build Coastguard Worker     int last_qidx;
378*c0909341SAndroid Build Coastguard Worker 
379*c0909341SAndroid Build Coastguard Worker     union {
380*c0909341SAndroid Build Coastguard Worker         int8_t i8[4];
381*c0909341SAndroid Build Coastguard Worker         uint32_t u32;
382*c0909341SAndroid Build Coastguard Worker     } last_delta_lf;
383*c0909341SAndroid Build Coastguard Worker     ALIGN(uint8_t lflvlmem[8 /* seg_id */][4 /* dir */][8 /* ref */][2 /* is_gmv */], 16);
384*c0909341SAndroid Build Coastguard Worker     const uint8_t (*lflvl)[4][8][2];
385*c0909341SAndroid Build Coastguard Worker 
386*c0909341SAndroid Build Coastguard Worker     Av1RestorationUnit *lr_ref[3];
387*c0909341SAndroid Build Coastguard Worker };
388*c0909341SAndroid Build Coastguard Worker 
389*c0909341SAndroid Build Coastguard Worker struct Dav1dTaskContext {
390*c0909341SAndroid Build Coastguard Worker     const Dav1dContext *c;
391*c0909341SAndroid Build Coastguard Worker     const Dav1dFrameContext *f;
392*c0909341SAndroid Build Coastguard Worker     Dav1dTileState *ts;
393*c0909341SAndroid Build Coastguard Worker     int bx, by;
394*c0909341SAndroid Build Coastguard Worker     BlockContext l, *a;
395*c0909341SAndroid Build Coastguard Worker     refmvs_tile rt;
396*c0909341SAndroid Build Coastguard Worker     ALIGN(union, 64) {
397*c0909341SAndroid Build Coastguard Worker         int16_t cf_8bpc [32 * 32];
398*c0909341SAndroid Build Coastguard Worker         int32_t cf_16bpc[32 * 32];
399*c0909341SAndroid Build Coastguard Worker     };
400*c0909341SAndroid Build Coastguard Worker     union {
401*c0909341SAndroid Build Coastguard Worker         uint8_t  al_pal_8bpc [2 /* a/l */][32 /* bx/y4 */][3 /* plane */][8 /* palette_idx */];
402*c0909341SAndroid Build Coastguard Worker         uint16_t al_pal_16bpc[2 /* a/l */][32 /* bx/y4 */][3 /* plane */][8 /* palette_idx */];
403*c0909341SAndroid Build Coastguard Worker     };
404*c0909341SAndroid Build Coastguard Worker     uint8_t pal_sz_uv[2 /* a/l */][32 /* bx4/by4 */];
405*c0909341SAndroid Build Coastguard Worker     ALIGN(union, 64) {
406*c0909341SAndroid Build Coastguard Worker         struct {
407*c0909341SAndroid Build Coastguard Worker             union {
408*c0909341SAndroid Build Coastguard Worker                 uint8_t  lap_8bpc [128 * 32];
409*c0909341SAndroid Build Coastguard Worker                 uint16_t lap_16bpc[128 * 32];
410*c0909341SAndroid Build Coastguard Worker                 struct {
411*c0909341SAndroid Build Coastguard Worker                     int16_t compinter[2][128 * 128];
412*c0909341SAndroid Build Coastguard Worker                     uint8_t seg_mask[128 * 128];
413*c0909341SAndroid Build Coastguard Worker                 };
414*c0909341SAndroid Build Coastguard Worker             };
415*c0909341SAndroid Build Coastguard Worker             union {
416*c0909341SAndroid Build Coastguard Worker                 // stride=192 for non-SVC, or 320 for SVC
417*c0909341SAndroid Build Coastguard Worker                 uint8_t  emu_edge_8bpc [320 * (256 + 7)];
418*c0909341SAndroid Build Coastguard Worker                 uint16_t emu_edge_16bpc[320 * (256 + 7)];
419*c0909341SAndroid Build Coastguard Worker             };
420*c0909341SAndroid Build Coastguard Worker         };
421*c0909341SAndroid Build Coastguard Worker         struct {
422*c0909341SAndroid Build Coastguard Worker             union {
423*c0909341SAndroid Build Coastguard Worker                 uint8_t levels[32 * 34];
424*c0909341SAndroid Build Coastguard Worker                 struct {
425*c0909341SAndroid Build Coastguard Worker                     uint8_t pal_order[64][8];
426*c0909341SAndroid Build Coastguard Worker                     uint8_t pal_ctx[64];
427*c0909341SAndroid Build Coastguard Worker                 };
428*c0909341SAndroid Build Coastguard Worker             };
429*c0909341SAndroid Build Coastguard Worker             union {
430*c0909341SAndroid Build Coastguard Worker                 int16_t ac[32 * 32]; // intra-only
431*c0909341SAndroid Build Coastguard Worker                 uint8_t txtp_map[32 * 32]; // inter-only
432*c0909341SAndroid Build Coastguard Worker             };
433*c0909341SAndroid Build Coastguard Worker             uint8_t pal_idx_y[32 * 64];
434*c0909341SAndroid Build Coastguard Worker             uint8_t pal_idx_uv[64 * 64]; /* also used as pre-pack scratch buffer */
435*c0909341SAndroid Build Coastguard Worker             union {
436*c0909341SAndroid Build Coastguard Worker                 struct {
437*c0909341SAndroid Build Coastguard Worker                     uint8_t interintra_8bpc[64 * 64];
438*c0909341SAndroid Build Coastguard Worker                     uint8_t edge_8bpc[257];
439*c0909341SAndroid Build Coastguard Worker                     ALIGN(uint8_t pal_8bpc[3 /* plane */][8 /* palette_idx */], 8);
440*c0909341SAndroid Build Coastguard Worker                 };
441*c0909341SAndroid Build Coastguard Worker                 struct {
442*c0909341SAndroid Build Coastguard Worker                     uint16_t interintra_16bpc[64 * 64];
443*c0909341SAndroid Build Coastguard Worker                     uint16_t edge_16bpc[257];
444*c0909341SAndroid Build Coastguard Worker                     ALIGN(uint16_t pal_16bpc[3 /* plane */][8 /* palette_idx */], 16);
445*c0909341SAndroid Build Coastguard Worker                 };
446*c0909341SAndroid Build Coastguard Worker             };
447*c0909341SAndroid Build Coastguard Worker         };
448*c0909341SAndroid Build Coastguard Worker     } scratch;
449*c0909341SAndroid Build Coastguard Worker 
450*c0909341SAndroid Build Coastguard Worker     Dav1dWarpedMotionParams warpmv;
451*c0909341SAndroid Build Coastguard Worker     Av1Filter *lf_mask;
452*c0909341SAndroid Build Coastguard Worker     int top_pre_cdef_toggle;
453*c0909341SAndroid Build Coastguard Worker     int8_t *cur_sb_cdef_idx_ptr;
454*c0909341SAndroid Build Coastguard Worker     // for chroma sub8x8, we need to know the filter for all 4 subblocks in
455*c0909341SAndroid Build Coastguard Worker     // a 4x4 area, but the top/left one can go out of cache already, so this
456*c0909341SAndroid Build Coastguard Worker     // keeps it accessible
457*c0909341SAndroid Build Coastguard Worker     enum Filter2d tl_4x4_filter;
458*c0909341SAndroid Build Coastguard Worker 
459*c0909341SAndroid Build Coastguard Worker     struct {
460*c0909341SAndroid Build Coastguard Worker         int pass;
461*c0909341SAndroid Build Coastguard Worker     } frame_thread;
462*c0909341SAndroid Build Coastguard Worker     struct {
463*c0909341SAndroid Build Coastguard Worker         struct thread_data td;
464*c0909341SAndroid Build Coastguard Worker         struct TaskThreadData *ttd;
465*c0909341SAndroid Build Coastguard Worker         struct FrameTileThreadData *fttd;
466*c0909341SAndroid Build Coastguard Worker         int flushed;
467*c0909341SAndroid Build Coastguard Worker         int die;
468*c0909341SAndroid Build Coastguard Worker     } task_thread;
469*c0909341SAndroid Build Coastguard Worker };
470*c0909341SAndroid Build Coastguard Worker 
471*c0909341SAndroid Build Coastguard Worker #endif /* DAV1D_SRC_INTERNAL_H */
472