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