tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

av1dec.c (53330B)


      1 /*
      2 * AV1 video decoder
      3 *
      4 * This file is part of FFmpeg.
      5 *
      6 * FFmpeg is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License as published by the Free Software Foundation; either
      9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * FFmpeg is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with FFmpeg; if not, write to the Free Software
     18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19 */
     20 
     21 #include "config_components.h"
     22 
     23 #include "libavutil/hdr_dynamic_metadata.h"
     24 #include "libavutil/film_grain_params.h"
     25 #include "libavutil/mastering_display_metadata.h"
     26 #include "libavutil/mem.h"
     27 #include "libavutil/pixdesc.h"
     28 #include "libavutil/opt.h"
     29 #include "avcodec.h"
     30 #include "av1_parse.h"
     31 #include "av1dec.h"
     32 #include "atsc_a53.h"
     33 #include "bytestream.h"
     34 #include "codec_internal.h"
     35 #include "decode.h"
     36 #include "hwaccel_internal.h"
     37 #include "internal.h"
     38 #include "itut35.h"
     39 #include "hwconfig.h"
     40 #include "profiles.h"
     41 #include "progressframe.h"
     42 #include "libavutil/refstruct.h"
     43 
     44 /**< same with Div_Lut defined in spec 7.11.3.7 */
     45 static const uint16_t div_lut[AV1_DIV_LUT_NUM] = {
     46  16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,
     47  15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142,
     48  15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564,
     49  14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028,
     50  13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530,
     51  13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066,
     52  13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633,
     53  12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228,
     54  12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848,
     55  11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491,
     56  11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155,
     57  11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838,
     58  10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538,
     59  10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255,
     60  10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986,
     61  9963,  9939,  9916,  9892,  9869,  9846,  9823,  9800,  9777,  9754,  9732,
     62  9709,  9687,  9664,  9642,  9620,  9598,  9576,  9554,  9533,  9511,  9489,
     63  9468,  9447,  9425,  9404,  9383,  9362,  9341,  9321,  9300,  9279,  9259,
     64  9239,  9218,  9198,  9178,  9158,  9138,  9118,  9098,  9079,  9059,  9039,
     65  9020,  9001,  8981,  8962,  8943,  8924,  8905,  8886,  8867,  8849,  8830,
     66  8812,  8793,  8775,  8756,  8738,  8720,  8702,  8684,  8666,  8648,  8630,
     67  8613,  8595,  8577,  8560,  8542,  8525,  8508,  8490,  8473,  8456,  8439,
     68  8422,  8405,  8389,  8372,  8355,  8339,  8322,  8306,  8289,  8273,  8257,
     69  8240,  8224,  8208,  8192
     70 };
     71 
     72 static uint32_t inverse_recenter(int r, uint32_t v)
     73 {
     74    if (v > 2 * r)
     75        return v;
     76    else if (v & 1)
     77        return r - ((v + 1) >> 1);
     78    else
     79        return r + (v >> 1);
     80 }
     81 
     82 static uint32_t decode_unsigned_subexp_with_ref(uint32_t sub_exp,
     83                                                int mx, int r)
     84 {
     85    if ((r << 1) <= mx) {
     86        return inverse_recenter(r, sub_exp);
     87    } else {
     88        return mx - 1 - inverse_recenter(mx - 1 - r, sub_exp);
     89    }
     90 }
     91 
     92 static int32_t decode_signed_subexp_with_ref(uint32_t sub_exp, int low,
     93                                             int high, int r)
     94 {
     95    int32_t x = decode_unsigned_subexp_with_ref(sub_exp, high - low, r - low);
     96    return x + low;
     97 }
     98 
     99 static void read_global_param(AV1DecContext *s, int type, int ref, int idx)
    100 {
    101    uint8_t primary_frame, prev_frame;
    102    uint32_t abs_bits, prec_bits, round, prec_diff, sub, mx;
    103    int32_t r, prev_gm_param;
    104 
    105    primary_frame = s->raw_frame_header->primary_ref_frame;
    106    prev_frame = s->raw_frame_header->ref_frame_idx[primary_frame];
    107    abs_bits = AV1_GM_ABS_ALPHA_BITS;
    108    prec_bits = AV1_GM_ALPHA_PREC_BITS;
    109 
    110    /* setup_past_independence() sets PrevGmParams to default values. We can
    111     * simply point to the current's frame gm_params as they will be initialized
    112     * with defaults at this point.
    113     */
    114    if (s->raw_frame_header->primary_ref_frame == AV1_PRIMARY_REF_NONE)
    115        prev_gm_param = s->cur_frame.gm_params[ref][idx];
    116    else
    117        prev_gm_param = s->ref[prev_frame].gm_params[ref][idx];
    118 
    119    if (idx < 2) {
    120        if (type == AV1_WARP_MODEL_TRANSLATION) {
    121            abs_bits = AV1_GM_ABS_TRANS_ONLY_BITS -
    122                !s->raw_frame_header->allow_high_precision_mv;
    123            prec_bits = AV1_GM_TRANS_ONLY_PREC_BITS -
    124                !s->raw_frame_header->allow_high_precision_mv;
    125        } else {
    126            abs_bits = AV1_GM_ABS_TRANS_BITS;
    127            prec_bits = AV1_GM_TRANS_PREC_BITS;
    128        }
    129    }
    130    round = (idx % 3) == 2 ? (1 << AV1_WARPEDMODEL_PREC_BITS) : 0;
    131    prec_diff = AV1_WARPEDMODEL_PREC_BITS - prec_bits;
    132    sub = (idx % 3) == 2 ? (1 << prec_bits) : 0;
    133    mx = 1 << abs_bits;
    134    r = (prev_gm_param >> prec_diff) - sub;
    135 
    136    s->cur_frame.gm_params[ref][idx] =
    137        (decode_signed_subexp_with_ref(s->raw_frame_header->gm_params[ref][idx],
    138                                       -mx, mx + 1, r) << prec_diff) + round;
    139 }
    140 
    141 static uint64_t round_two(uint64_t x, uint16_t n)
    142 {
    143    if (n == 0)
    144        return x;
    145    return ((x + ((uint64_t)1 << (n - 1))) >> n);
    146 }
    147 
    148 static int64_t round_two_signed(int64_t x, uint16_t n)
    149 {
    150    return ((x<0) ? -((int64_t)round_two(-x, n)) : (int64_t)round_two(x, n));
    151 }
    152 
    153 /**
    154 * Resolve divisor process.
    155 * see spec 7.11.3.7
    156 */
    157 static int16_t resolve_divisor(uint32_t d, uint16_t *shift)
    158 {
    159    int32_t e, f;
    160 
    161    *shift = av_log2(d);
    162    e = d - (1 << (*shift));
    163    if (*shift > AV1_DIV_LUT_BITS)
    164        f = round_two(e, *shift - AV1_DIV_LUT_BITS);
    165    else
    166        f = e << (AV1_DIV_LUT_BITS - (*shift));
    167 
    168    *shift += AV1_DIV_LUT_PREC_BITS;
    169 
    170    return div_lut[f];
    171 }
    172 
    173 /**
    174 * check if global motion params is valid.
    175 * see spec 7.11.3.6
    176 */
    177 static uint8_t get_shear_params_valid(AV1DecContext *s, int idx)
    178 {
    179    int16_t alpha, beta, gamma, delta, divf, divs;
    180    int64_t v, w;
    181    int32_t *param = &s->cur_frame.gm_params[idx][0];
    182    if (param[2] <= 0)
    183        return 0;
    184 
    185    alpha = av_clip_int16(param[2] - (1 << AV1_WARPEDMODEL_PREC_BITS));
    186    beta  = av_clip_int16(param[3]);
    187    divf  = resolve_divisor(abs(param[2]), &divs);
    188    v     = (int64_t)param[4] * (1 << AV1_WARPEDMODEL_PREC_BITS);
    189    w     = (int64_t)param[3] * param[4];
    190    gamma = av_clip_int16((int)round_two_signed((v * divf), divs));
    191    delta = av_clip_int16(param[5] - (int)round_two_signed((w * divf), divs) - (1 << AV1_WARPEDMODEL_PREC_BITS));
    192 
    193    alpha = round_two_signed(alpha, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
    194    beta  = round_two_signed(beta,  AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
    195    gamma = round_two_signed(gamma, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
    196    delta = round_two_signed(delta, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
    197 
    198    if ((4 * abs(alpha) + 7 * abs(beta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS) ||
    199        (4 * abs(gamma) + 4 * abs(delta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS))
    200        return 0;
    201 
    202    return 1;
    203 }
    204 
    205 /**
    206 * update gm type/params, since cbs already implemented part of this function,
    207 * so we don't need to full implement spec.
    208 */
    209 static void global_motion_params(AV1DecContext *s)
    210 {
    211    const AV1RawFrameHeader *header = s->raw_frame_header;
    212    int type, ref;
    213 
    214    for (ref = AV1_REF_FRAME_LAST; ref <= AV1_REF_FRAME_ALTREF; ref++) {
    215        s->cur_frame.gm_type[ref] = AV1_WARP_MODEL_IDENTITY;
    216        for (int i = 0; i < 6; i++)
    217            s->cur_frame.gm_params[ref][i] = (i % 3 == 2) ?
    218                                             1 << AV1_WARPEDMODEL_PREC_BITS : 0;
    219    }
    220    if (header->frame_type == AV1_FRAME_KEY ||
    221        header->frame_type == AV1_FRAME_INTRA_ONLY)
    222        return;
    223 
    224    for (ref = AV1_REF_FRAME_LAST; ref <= AV1_REF_FRAME_ALTREF; ref++) {
    225        if (header->is_global[ref]) {
    226            if (header->is_rot_zoom[ref]) {
    227                type = AV1_WARP_MODEL_ROTZOOM;
    228            } else {
    229                type = header->is_translation[ref] ? AV1_WARP_MODEL_TRANSLATION
    230                                                   : AV1_WARP_MODEL_AFFINE;
    231            }
    232        } else {
    233            type = AV1_WARP_MODEL_IDENTITY;
    234        }
    235        s->cur_frame.gm_type[ref] = type;
    236 
    237        if (type >= AV1_WARP_MODEL_ROTZOOM) {
    238            read_global_param(s, type, ref, 2);
    239            read_global_param(s, type, ref, 3);
    240            if (type == AV1_WARP_MODEL_AFFINE) {
    241                read_global_param(s, type, ref, 4);
    242                read_global_param(s, type, ref, 5);
    243            } else {
    244                s->cur_frame.gm_params[ref][4] = -s->cur_frame.gm_params[ref][3];
    245                s->cur_frame.gm_params[ref][5] = s->cur_frame.gm_params[ref][2];
    246            }
    247        }
    248        if (type >= AV1_WARP_MODEL_TRANSLATION) {
    249            read_global_param(s, type, ref, 0);
    250            read_global_param(s, type, ref, 1);
    251        }
    252        if (type <= AV1_WARP_MODEL_AFFINE) {
    253            s->cur_frame.gm_invalid[ref] = !get_shear_params_valid(s, ref);
    254        }
    255    }
    256 }
    257 
    258 static int get_relative_dist(const AV1RawSequenceHeader *seq,
    259                             unsigned int a, unsigned int b)
    260 {
    261    unsigned int diff = a - b;
    262    unsigned int m = 1 << seq->order_hint_bits_minus_1;
    263    return (diff & (m - 1)) - (diff & m);
    264 }
    265 
    266 static void skip_mode_params(AV1DecContext *s)
    267 {
    268    const AV1RawFrameHeader *header = s->raw_frame_header;
    269    const AV1RawSequenceHeader *seq = s->raw_seq;
    270 
    271    int forward_idx,  backward_idx;
    272    int forward_hint, backward_hint;
    273    int second_forward_idx, second_forward_hint;
    274    int ref_hint, dist, i;
    275 
    276    if (header->frame_type == AV1_FRAME_KEY ||
    277        header->frame_type == AV1_FRAME_INTRA_ONLY ||
    278        !header->reference_select || !seq->enable_order_hint)
    279        return;
    280 
    281    forward_idx  = -1;
    282    backward_idx = -1;
    283    for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
    284        if (!s->ref[header->ref_frame_idx[i]].raw_frame_header)
    285            return;
    286        ref_hint = s->ref[header->ref_frame_idx[i]].raw_frame_header->order_hint;
    287        dist = get_relative_dist(seq, ref_hint, header->order_hint);
    288        if (dist < 0) {
    289            if (forward_idx < 0 ||
    290                get_relative_dist(seq, ref_hint, forward_hint) > 0) {
    291                forward_idx  = i;
    292                forward_hint = ref_hint;
    293            }
    294        } else if (dist > 0) {
    295            if (backward_idx < 0 ||
    296                get_relative_dist(seq, ref_hint, backward_hint) < 0) {
    297                backward_idx  = i;
    298                backward_hint = ref_hint;
    299            }
    300        }
    301    }
    302 
    303    if (forward_idx < 0) {
    304        return;
    305    } else if (backward_idx >= 0) {
    306        s->cur_frame.skip_mode_frame_idx[0] =
    307            AV1_REF_FRAME_LAST + FFMIN(forward_idx, backward_idx);
    308        s->cur_frame.skip_mode_frame_idx[1] =
    309            AV1_REF_FRAME_LAST + FFMAX(forward_idx, backward_idx);
    310        return;
    311    }
    312 
    313    second_forward_idx = -1;
    314    for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
    315        ref_hint = s->ref[header->ref_frame_idx[i]].raw_frame_header->order_hint;
    316        if (get_relative_dist(seq, ref_hint, forward_hint) < 0) {
    317            if (second_forward_idx < 0 ||
    318                get_relative_dist(seq, ref_hint, second_forward_hint) > 0) {
    319                second_forward_idx  = i;
    320                second_forward_hint = ref_hint;
    321            }
    322        }
    323    }
    324 
    325    if (second_forward_idx < 0)
    326        return;
    327 
    328    s->cur_frame.skip_mode_frame_idx[0] =
    329        AV1_REF_FRAME_LAST + FFMIN(forward_idx, second_forward_idx);
    330    s->cur_frame.skip_mode_frame_idx[1] =
    331        AV1_REF_FRAME_LAST + FFMAX(forward_idx, second_forward_idx);
    332 }
    333 
    334 static void coded_lossless_param(AV1DecContext *s)
    335 {
    336    const AV1RawFrameHeader *header = s->raw_frame_header;
    337    int i;
    338 
    339    if (header->delta_q_y_dc || header->delta_q_u_ac ||
    340        header->delta_q_u_dc || header->delta_q_v_ac ||
    341        header->delta_q_v_dc) {
    342        s->cur_frame.coded_lossless = 0;
    343        return;
    344    }
    345 
    346    s->cur_frame.coded_lossless = 1;
    347    for (i = 0; i < AV1_MAX_SEGMENTS; i++) {
    348        int qindex;
    349        if (header->feature_enabled[i][AV1_SEG_LVL_ALT_Q]) {
    350            qindex = (header->base_q_idx +
    351                      header->feature_value[i][AV1_SEG_LVL_ALT_Q]);
    352        } else {
    353            qindex = header->base_q_idx;
    354        }
    355        qindex = av_clip_uintp2(qindex, 8);
    356 
    357        if (qindex) {
    358            s->cur_frame.coded_lossless = 0;
    359            return;
    360        }
    361    }
    362 }
    363 
    364 static void order_hint_info(AV1DecContext *s)
    365 {
    366    const AV1RawFrameHeader *header = s->raw_frame_header;
    367    const AV1RawSequenceHeader *seq = s->raw_seq;
    368    AV1Frame *frame = &s->cur_frame;
    369 
    370    frame->order_hint = header->order_hint;
    371 
    372    for (int i = 0; i < AV1_REFS_PER_FRAME; i++) {
    373        int ref_name = i + AV1_REF_FRAME_LAST;
    374        int ref_slot = header->ref_frame_idx[i];
    375        int ref_order_hint = s->ref[ref_slot].order_hint;
    376 
    377        frame->order_hints[ref_name] = ref_order_hint;
    378        if (!seq->enable_order_hint) {
    379            frame->ref_frame_sign_bias[ref_name] = 0;
    380        } else {
    381            frame->ref_frame_sign_bias[ref_name] =
    382                get_relative_dist(seq, ref_order_hint,
    383                                  frame->order_hint) > 0;
    384        }
    385    }
    386 }
    387 
    388 static void load_grain_params(AV1DecContext *s)
    389 {
    390    const AV1RawFrameHeader *header = s->raw_frame_header;
    391    const AV1RawFilmGrainParams *film_grain = &header->film_grain, *src;
    392    AV1RawFilmGrainParams *dst = &s->cur_frame.film_grain;
    393 
    394    if (!film_grain->apply_grain)
    395        return;
    396 
    397    if (film_grain->update_grain) {
    398        memcpy(dst, film_grain, sizeof(*dst));
    399        return;
    400    }
    401 
    402    src = &s->ref[film_grain->film_grain_params_ref_idx].film_grain;
    403 
    404    memcpy(dst, src, sizeof(*dst));
    405    dst->grain_seed = film_grain->grain_seed;
    406 }
    407 
    408 static int init_tile_data(AV1DecContext *s)
    409 
    410 {
    411    int cur_tile_num =
    412        s->raw_frame_header->tile_cols * s->raw_frame_header->tile_rows;
    413    if (s->tile_num < cur_tile_num) {
    414        int ret = av_reallocp_array(&s->tile_group_info, cur_tile_num,
    415                                    sizeof(TileGroupInfo));
    416        if (ret < 0) {
    417            s->tile_num = 0;
    418            return ret;
    419        }
    420    }
    421    s->tile_num = cur_tile_num;
    422 
    423    return 0;
    424 }
    425 
    426 static int get_tiles_info(AVCodecContext *avctx, const AV1RawTileGroup *tile_group)
    427 {
    428    AV1DecContext *s = avctx->priv_data;
    429    GetByteContext gb;
    430    uint16_t tile_num, tile_row, tile_col;
    431    uint32_t size = 0, size_bytes = 0;
    432 
    433    bytestream2_init(&gb, tile_group->tile_data.data,
    434                     tile_group->tile_data.data_size);
    435    s->tg_start = tile_group->tg_start;
    436    s->tg_end = tile_group->tg_end;
    437 
    438    for (tile_num = tile_group->tg_start; tile_num <= tile_group->tg_end; tile_num++) {
    439        tile_row = tile_num / s->raw_frame_header->tile_cols;
    440        tile_col = tile_num % s->raw_frame_header->tile_cols;
    441 
    442        if (tile_num == tile_group->tg_end) {
    443            s->tile_group_info[tile_num].tile_size = bytestream2_get_bytes_left(&gb);
    444            s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
    445            s->tile_group_info[tile_num].tile_row = tile_row;
    446            s->tile_group_info[tile_num].tile_column = tile_col;
    447            return 0;
    448        }
    449        size_bytes = s->raw_frame_header->tile_size_bytes_minus1 + 1;
    450        if (bytestream2_get_bytes_left(&gb) < size_bytes)
    451            return AVERROR_INVALIDDATA;
    452        size = 0;
    453        for (int i = 0; i < size_bytes; i++)
    454            size |= bytestream2_get_byteu(&gb) << 8 * i;
    455        if (bytestream2_get_bytes_left(&gb) <= size)
    456            return AVERROR_INVALIDDATA;
    457        size++;
    458 
    459        s->tile_group_info[tile_num].tile_size = size;
    460        s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
    461        s->tile_group_info[tile_num].tile_row = tile_row;
    462        s->tile_group_info[tile_num].tile_column = tile_col;
    463 
    464        bytestream2_skipu(&gb, size);
    465    }
    466 
    467    return 0;
    468 
    469 }
    470 
    471 static enum AVPixelFormat get_sw_pixel_format(void *logctx,
    472                                              const AV1RawSequenceHeader *seq)
    473 {
    474    int bit_depth;
    475    enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE;
    476 
    477    if (seq->seq_profile == 2 && seq->color_config.high_bitdepth)
    478        bit_depth = seq->color_config.twelve_bit ? 12 : 10;
    479    else if (seq->seq_profile <= 2)
    480        bit_depth = seq->color_config.high_bitdepth ? 10 : 8;
    481    else {
    482        av_log(logctx, AV_LOG_ERROR,
    483               "Unknown AV1 profile %d.\n", seq->seq_profile);
    484        return AV_PIX_FMT_NONE;
    485    }
    486 
    487    if (!seq->color_config.mono_chrome) {
    488        // 4:4:4 x:0 y:0, 4:2:2 x:1 y:0, 4:2:0 x:1 y:1
    489        if (seq->color_config.subsampling_x == 0 &&
    490            seq->color_config.subsampling_y == 0) {
    491            if (bit_depth == 8)
    492                pix_fmt = AV_PIX_FMT_YUV444P;
    493            else if (bit_depth == 10)
    494                pix_fmt = AV_PIX_FMT_YUV444P10;
    495            else if (bit_depth == 12)
    496                pix_fmt = AV_PIX_FMT_YUV444P12;
    497            else
    498                av_assert0(0);
    499        } else if (seq->color_config.subsampling_x == 1 &&
    500                   seq->color_config.subsampling_y == 0) {
    501            if (bit_depth == 8)
    502                pix_fmt = AV_PIX_FMT_YUV422P;
    503            else if (bit_depth == 10)
    504                pix_fmt = AV_PIX_FMT_YUV422P10;
    505            else if (bit_depth == 12)
    506                pix_fmt = AV_PIX_FMT_YUV422P12;
    507            else
    508                av_assert0(0);
    509        } else if (seq->color_config.subsampling_x == 1 &&
    510                   seq->color_config.subsampling_y == 1) {
    511            if (bit_depth == 8)
    512                pix_fmt = AV_PIX_FMT_YUV420P;
    513            else if (bit_depth == 10)
    514                pix_fmt = AV_PIX_FMT_YUV420P10;
    515            else if (bit_depth == 12)
    516                pix_fmt = AV_PIX_FMT_YUV420P12;
    517            else
    518                av_assert0(0);
    519        }
    520    } else {
    521        if (bit_depth == 8)
    522            pix_fmt = AV_PIX_FMT_GRAY8;
    523        else if (bit_depth == 10)
    524            pix_fmt = AV_PIX_FMT_GRAY10;
    525        else if (bit_depth == 12)
    526            pix_fmt = AV_PIX_FMT_GRAY12;
    527        else
    528            av_assert0(0);
    529    }
    530 
    531    return pix_fmt;
    532 }
    533 
    534 static int get_pixel_format(AVCodecContext *avctx)
    535 {
    536    AV1DecContext *s = avctx->priv_data;
    537    const AV1RawSequenceHeader *seq = s->raw_seq;
    538    int ret;
    539    enum AVPixelFormat pix_fmt = get_sw_pixel_format(avctx, seq);
    540 #define HWACCEL_MAX (CONFIG_AV1_DXVA2_HWACCEL + \
    541                     CONFIG_AV1_D3D11VA_HWACCEL * 2 + \
    542                     CONFIG_AV1_D3D12VA_HWACCEL + \
    543                     CONFIG_AV1_NVDEC_HWACCEL + \
    544                     CONFIG_AV1_VAAPI_HWACCEL + \
    545                     CONFIG_AV1_VDPAU_HWACCEL + \
    546                     CONFIG_AV1_VIDEOTOOLBOX_HWACCEL + \
    547                     CONFIG_AV1_VULKAN_HWACCEL)
    548    enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmtp = pix_fmts;
    549 
    550    if (pix_fmt == AV_PIX_FMT_NONE)
    551        return -1;
    552 
    553    switch (pix_fmt) {
    554    case AV_PIX_FMT_YUV420P:
    555 #if CONFIG_AV1_DXVA2_HWACCEL
    556        *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
    557 #endif
    558 #if CONFIG_AV1_D3D11VA_HWACCEL
    559        *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
    560        *fmtp++ = AV_PIX_FMT_D3D11;
    561 #endif
    562 #if CONFIG_AV1_D3D12VA_HWACCEL
    563        *fmtp++ = AV_PIX_FMT_D3D12;
    564 #endif
    565 #if CONFIG_AV1_NVDEC_HWACCEL
    566        *fmtp++ = AV_PIX_FMT_CUDA;
    567 #endif
    568 #if CONFIG_AV1_VAAPI_HWACCEL
    569        *fmtp++ = AV_PIX_FMT_VAAPI;
    570 #endif
    571 #if CONFIG_AV1_VDPAU_HWACCEL
    572        *fmtp++ = AV_PIX_FMT_VDPAU;
    573 #endif
    574 #if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
    575        *fmtp++ = AV_PIX_FMT_VIDEOTOOLBOX;
    576 #endif
    577 #if CONFIG_AV1_VULKAN_HWACCEL
    578        *fmtp++ = AV_PIX_FMT_VULKAN;
    579 #endif
    580        break;
    581    case AV_PIX_FMT_YUV420P10:
    582 #if CONFIG_AV1_DXVA2_HWACCEL
    583        *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
    584 #endif
    585 #if CONFIG_AV1_D3D11VA_HWACCEL
    586        *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
    587        *fmtp++ = AV_PIX_FMT_D3D11;
    588 #endif
    589 #if CONFIG_AV1_D3D12VA_HWACCEL
    590        *fmtp++ = AV_PIX_FMT_D3D12;
    591 #endif
    592 #if CONFIG_AV1_NVDEC_HWACCEL
    593        *fmtp++ = AV_PIX_FMT_CUDA;
    594 #endif
    595 #if CONFIG_AV1_VAAPI_HWACCEL
    596        *fmtp++ = AV_PIX_FMT_VAAPI;
    597 #endif
    598 #if CONFIG_AV1_VDPAU_HWACCEL
    599        *fmtp++ = AV_PIX_FMT_VDPAU;
    600 #endif
    601 #if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
    602        *fmtp++ = AV_PIX_FMT_VIDEOTOOLBOX;
    603 #endif
    604 #if CONFIG_AV1_VULKAN_HWACCEL
    605        *fmtp++ = AV_PIX_FMT_VULKAN;
    606 #endif
    607        break;
    608    case AV_PIX_FMT_YUV420P12:
    609 #if CONFIG_AV1_VULKAN_HWACCEL
    610        *fmtp++ = AV_PIX_FMT_VULKAN;
    611 #endif
    612        break;
    613    case AV_PIX_FMT_YUV422P:
    614 #if CONFIG_AV1_VULKAN_HWACCEL
    615        *fmtp++ = AV_PIX_FMT_VULKAN;
    616 #endif
    617        break;
    618    case AV_PIX_FMT_YUV422P10:
    619 #if CONFIG_AV1_VULKAN_HWACCEL
    620        *fmtp++ = AV_PIX_FMT_VULKAN;
    621 #endif
    622        break;
    623    case AV_PIX_FMT_YUV422P12:
    624 #if CONFIG_AV1_VULKAN_HWACCEL
    625        *fmtp++ = AV_PIX_FMT_VULKAN;
    626 #endif
    627        break;
    628    case AV_PIX_FMT_YUV444P:
    629 #if CONFIG_AV1_VULKAN_HWACCEL
    630        *fmtp++ = AV_PIX_FMT_VULKAN;
    631 #endif
    632        break;
    633    case AV_PIX_FMT_YUV444P10:
    634 #if CONFIG_AV1_VULKAN_HWACCEL
    635        *fmtp++ = AV_PIX_FMT_VULKAN;
    636 #endif
    637        break;
    638    case AV_PIX_FMT_YUV444P12:
    639 #if CONFIG_AV1_VULKAN_HWACCEL
    640        *fmtp++ = AV_PIX_FMT_VULKAN;
    641 #endif
    642        break;
    643    case AV_PIX_FMT_GRAY8:
    644 #if CONFIG_AV1_NVDEC_HWACCEL
    645        *fmtp++ = AV_PIX_FMT_CUDA;
    646 #endif
    647        break;
    648    case AV_PIX_FMT_GRAY10:
    649 #if CONFIG_AV1_NVDEC_HWACCEL
    650        *fmtp++ = AV_PIX_FMT_CUDA;
    651 #endif
    652        break;
    653    }
    654 
    655    *fmtp++ = pix_fmt;
    656    *fmtp = AV_PIX_FMT_NONE;
    657 
    658    for (int i = 0; pix_fmts[i] != pix_fmt; i++)
    659        if (pix_fmts[i] == avctx->pix_fmt) {
    660            s->pix_fmt = pix_fmt;
    661            return 1;
    662        }
    663 
    664    ret = ff_get_format(avctx, pix_fmts);
    665 
    666    /**
    667     * check if the HW accel is inited correctly. If not, return un-implemented.
    668     * Since now the av1 decoder doesn't support native decode, if it will be
    669     * implemented in the future, need remove this check.
    670     */
    671    if (!avctx->hwaccel) {
    672        av_log(avctx, AV_LOG_ERROR, "Your platform doesn't support"
    673               " hardware accelerated AV1 decoding.\n");
    674        avctx->pix_fmt = AV_PIX_FMT_NONE;
    675        return AVERROR(ENOSYS);
    676    }
    677 
    678    s->pix_fmt = pix_fmt;
    679    avctx->pix_fmt = ret;
    680 
    681    av_log(avctx, AV_LOG_DEBUG, "AV1 decode get format: %s.\n",
    682           av_get_pix_fmt_name(avctx->pix_fmt));
    683 
    684    return 0;
    685 }
    686 
    687 static void av1_frame_unref(AV1Frame *f)
    688 {
    689    ff_progress_frame_unref(&f->pf);
    690    av_refstruct_unref(&f->hwaccel_picture_private);
    691    av_refstruct_unref(&f->header_ref);
    692    f->raw_frame_header = NULL;
    693    f->spatial_id = f->temporal_id = 0;
    694    memset(f->skip_mode_frame_idx, 0,
    695           2 * sizeof(uint8_t));
    696    memset(&f->film_grain, 0, sizeof(f->film_grain));
    697    f->coded_lossless = 0;
    698 }
    699 
    700 static void av1_frame_replace(AV1Frame *dst, const AV1Frame *src)
    701 {
    702    av_assert1(dst != src);
    703 
    704    av_refstruct_replace(&dst->header_ref, src->header_ref);
    705 
    706    dst->raw_frame_header = src->raw_frame_header;
    707 
    708    ff_progress_frame_replace(&dst->pf, &src->pf);
    709 
    710    av_refstruct_replace(&dst->hwaccel_picture_private,
    711                          src->hwaccel_picture_private);
    712 
    713    dst->spatial_id = src->spatial_id;
    714    dst->temporal_id = src->temporal_id;
    715    memcpy(dst->gm_invalid,
    716           src->gm_invalid,
    717           AV1_NUM_REF_FRAMES * sizeof(uint8_t));
    718    memcpy(dst->gm_type,
    719           src->gm_type,
    720           AV1_NUM_REF_FRAMES * sizeof(uint8_t));
    721    memcpy(dst->gm_params,
    722           src->gm_params,
    723           AV1_NUM_REF_FRAMES * 6 * sizeof(int32_t));
    724    memcpy(dst->skip_mode_frame_idx,
    725           src->skip_mode_frame_idx,
    726           2 * sizeof(uint8_t));
    727    memcpy(&dst->film_grain,
    728           &src->film_grain,
    729           sizeof(dst->film_grain));
    730    dst->coded_lossless = src->coded_lossless;
    731 
    732    dst->order_hint = src->order_hint;
    733    memcpy(dst->ref_frame_sign_bias, src->ref_frame_sign_bias,
    734           sizeof(dst->ref_frame_sign_bias));
    735    memcpy(dst->order_hints, src->order_hints,
    736           sizeof(dst->order_hints));
    737 
    738    dst->force_integer_mv = src->force_integer_mv;
    739 }
    740 
    741 static av_cold int av1_decode_free(AVCodecContext *avctx)
    742 {
    743    AV1DecContext *s = avctx->priv_data;
    744    AV1RawMetadataITUTT35 itut_t35;
    745 
    746    for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++)
    747        av1_frame_unref(&s->ref[i]);
    748    av1_frame_unref(&s->cur_frame);
    749    av_buffer_unref(&s->seq_data_ref);
    750    av_refstruct_unref(&s->seq_ref);
    751    av_refstruct_unref(&s->header_ref);
    752    av_refstruct_unref(&s->cll_ref);
    753    av_refstruct_unref(&s->mdcv_ref);
    754    av_freep(&s->tile_group_info);
    755 
    756    while (s->itut_t35_fifo && av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0)
    757        av_buffer_unref(&itut_t35.payload_ref);
    758    av_fifo_freep2(&s->itut_t35_fifo);
    759 
    760    ff_cbs_fragment_free(&s->current_obu);
    761    ff_cbs_close(&s->cbc);
    762    ff_dovi_ctx_unref(&s->dovi);
    763 
    764    return 0;
    765 }
    766 
    767 static int set_context_with_sequence(AVCodecContext *avctx,
    768                                     const AV1RawSequenceHeader *seq)
    769 {
    770    int width = seq->max_frame_width_minus_1 + 1;
    771    int height = seq->max_frame_height_minus_1 + 1;
    772 
    773    avctx->profile = seq->seq_profile;
    774    avctx->level = seq->seq_level_idx[0];
    775 
    776    avctx->color_range =
    777        seq->color_config.color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
    778    avctx->color_primaries = seq->color_config.color_primaries;
    779    avctx->colorspace = seq->color_config.matrix_coefficients;
    780    avctx->color_trc = seq->color_config.transfer_characteristics;
    781 
    782    switch (seq->color_config.chroma_sample_position) {
    783    case AV1_CSP_VERTICAL:
    784        avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
    785        break;
    786    case AV1_CSP_COLOCATED:
    787        avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
    788        break;
    789    }
    790 
    791 #if FF_API_CODEC_PROPS
    792 FF_DISABLE_DEPRECATION_WARNINGS
    793    if (seq->film_grain_params_present)
    794        avctx->properties |= FF_CODEC_PROPERTY_FILM_GRAIN;
    795    else
    796        avctx->properties &= ~FF_CODEC_PROPERTY_FILM_GRAIN;
    797 FF_ENABLE_DEPRECATION_WARNINGS
    798 #endif
    799 
    800    if (avctx->width != width || avctx->height != height) {
    801        int ret = ff_set_dimensions(avctx, width, height);
    802        if (ret < 0)
    803            return ret;
    804    }
    805 
    806    if (seq->timing_info_present_flag)
    807        avctx->framerate = ff_av1_framerate(1LL + seq->timing_info.num_ticks_per_picture_minus_1,
    808                                            seq->timing_info.num_units_in_display_tick,
    809                                            seq->timing_info.time_scale);
    810 
    811    if (avctx->pix_fmt == AV_PIX_FMT_NONE)
    812        avctx->pix_fmt = get_sw_pixel_format(avctx, seq);
    813 
    814    return 0;
    815 }
    816 
    817 static int update_context_with_frame_header(AVCodecContext *avctx,
    818                                            const AV1RawFrameHeader *header)
    819 {
    820    AVRational aspect_ratio;
    821    int width = header->frame_width_minus_1 + 1;
    822    int height = header->frame_height_minus_1 + 1;
    823    int r_width = header->render_width_minus_1 + 1;
    824    int r_height = header->render_height_minus_1 + 1;
    825    int ret;
    826 
    827    if (avctx->width != width || avctx->height != height) {
    828        ret = ff_set_dimensions(avctx, width, height);
    829        if (ret < 0)
    830            return ret;
    831    }
    832 
    833    av_reduce(&aspect_ratio.num, &aspect_ratio.den,
    834              (int64_t)height * r_width,
    835              (int64_t)width * r_height,
    836              INT_MAX);
    837 
    838    if (av_cmp_q(avctx->sample_aspect_ratio, aspect_ratio)) {
    839        ret = ff_set_sar(avctx, aspect_ratio);
    840        if (ret < 0)
    841            return ret;
    842    }
    843 
    844    return 0;
    845 }
    846 
    847 static const CodedBitstreamUnitType decompose_unit_types[] = {
    848    AV1_OBU_FRAME,
    849    AV1_OBU_FRAME_HEADER,
    850    AV1_OBU_METADATA,
    851    AV1_OBU_REDUNDANT_FRAME_HEADER,
    852    AV1_OBU_SEQUENCE_HEADER,
    853    AV1_OBU_TEMPORAL_DELIMITER,
    854    AV1_OBU_TILE_GROUP,
    855 };
    856 
    857 static av_cold int av1_decode_init(AVCodecContext *avctx)
    858 {
    859    AV1DecContext *s = avctx->priv_data;
    860    AV1RawSequenceHeader *seq;
    861    const AVPacketSideData *sd;
    862    int ret;
    863 
    864    s->avctx = avctx;
    865    s->pkt = avctx->internal->in_pkt;
    866    s->pix_fmt = AV_PIX_FMT_NONE;
    867 
    868    ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, avctx);
    869    if (ret < 0)
    870        return ret;
    871 
    872    s->cbc->decompose_unit_types    = decompose_unit_types;
    873    s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
    874 
    875    s->itut_t35_fifo = av_fifo_alloc2(1, sizeof(AV1RawMetadataITUTT35),
    876                                      AV_FIFO_FLAG_AUTO_GROW);
    877    if (!s->itut_t35_fifo)
    878        return AVERROR(ENOMEM);
    879 
    880    av_opt_set_int(s->cbc->priv_data, "operating_point", s->operating_point, 0);
    881 
    882    if (avctx->extradata && avctx->extradata_size) {
    883        ret = ff_cbs_read_extradata_from_codec(s->cbc,
    884                                               &s->current_obu,
    885                                               avctx);
    886        if (ret < 0) {
    887            av_log(avctx, AV_LOG_WARNING, "Failed to read extradata.\n");
    888            goto end;
    889        }
    890 
    891        seq = ((CodedBitstreamAV1Context *)(s->cbc->priv_data))->sequence_header;
    892        if (!seq) {
    893            av_log(avctx, AV_LOG_WARNING, "No sequence header available.\n");
    894            goto end;
    895        }
    896 
    897        ret = set_context_with_sequence(avctx, seq);
    898        if (ret < 0) {
    899            av_log(avctx, AV_LOG_WARNING, "Failed to set decoder context.\n");
    900            goto end;
    901        }
    902 
    903        end:
    904        ff_cbs_fragment_reset(&s->current_obu);
    905    }
    906 
    907    s->dovi.logctx = avctx;
    908    s->dovi.cfg.dv_profile = 10; // default for AV1
    909    sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF);
    910    if (sd && sd->size >= sizeof(s->dovi.cfg))
    911        s->dovi.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data;
    912 
    913    return ret;
    914 }
    915 
    916 static int av1_frame_alloc(AVCodecContext *avctx, AV1Frame *f)
    917 {
    918    AV1DecContext *s = avctx->priv_data;
    919    AV1RawFrameHeader *header= s->raw_frame_header;
    920    AVFrame *frame;
    921    int ret;
    922 
    923    ret = update_context_with_frame_header(avctx, header);
    924    if (ret < 0) {
    925        av_log(avctx, AV_LOG_ERROR, "Failed to update context with frame header\n");
    926        return ret;
    927    }
    928 
    929    ret = ff_progress_frame_get_buffer(avctx, &f->pf, AV_GET_BUFFER_FLAG_REF);
    930    if (ret < 0)
    931        goto fail;
    932 
    933    frame = f->f;
    934    if (header->frame_type == AV1_FRAME_KEY)
    935        frame->flags |= AV_FRAME_FLAG_KEY;
    936    else
    937        frame->flags &= ~AV_FRAME_FLAG_KEY;
    938 
    939    switch (header->frame_type) {
    940    case AV1_FRAME_KEY:
    941    case AV1_FRAME_INTRA_ONLY:
    942        frame->pict_type = AV_PICTURE_TYPE_I;
    943        break;
    944    case AV1_FRAME_INTER:
    945        frame->pict_type = AV_PICTURE_TYPE_P;
    946        break;
    947    case AV1_FRAME_SWITCH:
    948        frame->pict_type = AV_PICTURE_TYPE_SP;
    949        break;
    950    }
    951 
    952    ret = ff_hwaccel_frame_priv_alloc(avctx, &f->hwaccel_picture_private);
    953    if (ret < 0)
    954        goto fail;
    955 
    956    return 0;
    957 
    958 fail:
    959    av1_frame_unref(f);
    960    return ret;
    961 }
    962 
    963 static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame,
    964                           const AV1RawMetadataITUTT35 *itut_t35)
    965 {
    966    GetByteContext gb;
    967    AV1DecContext *s = avctx->priv_data;
    968    int ret, provider_code;
    969 
    970    bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size);
    971 
    972    provider_code = bytestream2_get_be16(&gb);
    973    switch (provider_code) {
    974    case ITU_T_T35_PROVIDER_CODE_ATSC: {
    975        uint32_t user_identifier = bytestream2_get_be32(&gb);
    976        switch (user_identifier) {
    977        case MKBETAG('G', 'A', '9', '4'): { // closed captions
    978            AVBufferRef *buf = NULL;
    979 
    980            ret = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb));
    981            if (ret < 0)
    982                return ret;
    983            if (!ret)
    984                break;
    985 
    986            ret = ff_frame_new_side_data_from_buf(avctx, frame, AV_FRAME_DATA_A53_CC, &buf);
    987            if (ret < 0)
    988                return ret;
    989 
    990 #if FF_API_CODEC_PROPS
    991 FF_DISABLE_DEPRECATION_WARNINGS
    992            avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
    993 FF_ENABLE_DEPRECATION_WARNINGS
    994 #endif
    995            break;
    996        }
    997        default: // ignore unsupported identifiers
    998            break;
    999        }
   1000        break;
   1001    }
   1002    case ITU_T_T35_PROVIDER_CODE_SMTPE: {
   1003        AVDynamicHDRPlus *hdrplus;
   1004        int provider_oriented_code = bytestream2_get_be16(&gb);
   1005        int application_identifier = bytestream2_get_byte(&gb);
   1006 
   1007        if (itut_t35->itu_t_t35_country_code != ITU_T_T35_COUNTRY_CODE_US ||
   1008            provider_oriented_code != 1 || application_identifier != 4)
   1009            break;
   1010 
   1011        hdrplus = av_dynamic_hdr_plus_create_side_data(frame);
   1012        if (!hdrplus)
   1013            return AVERROR(ENOMEM);
   1014 
   1015        ret = av_dynamic_hdr_plus_from_t35(hdrplus, gb.buffer,
   1016                                           bytestream2_get_bytes_left(&gb));
   1017        if (ret < 0)
   1018            return ret;
   1019        break;
   1020    }
   1021    case ITU_T_T35_PROVIDER_CODE_DOLBY: {
   1022        int provider_oriented_code = bytestream2_get_be32(&gb);
   1023        if (itut_t35->itu_t_t35_country_code != ITU_T_T35_COUNTRY_CODE_US ||
   1024            provider_oriented_code != 0x800)
   1025            break;
   1026 
   1027        ret = ff_dovi_rpu_parse(&s->dovi, gb.buffer, gb.buffer_end - gb.buffer,
   1028                                avctx->err_recognition);
   1029        if (ret < 0) {
   1030            av_log(avctx, AV_LOG_WARNING, "Error parsing DOVI OBU.\n");
   1031            break; // ignore
   1032        }
   1033 
   1034        ret = ff_dovi_attach_side_data(&s->dovi, frame);
   1035        if (ret < 0)
   1036            return ret;
   1037        break;
   1038    }
   1039    default: // ignore unsupported provider codes
   1040        break;
   1041    }
   1042 
   1043    return 0;
   1044 }
   1045 
   1046 static int export_metadata(AVCodecContext *avctx, AVFrame *frame)
   1047 {
   1048    AV1DecContext *s = avctx->priv_data;
   1049    AV1RawMetadataITUTT35 itut_t35;
   1050    int ret = 0;
   1051 
   1052    if (s->mdcv) {
   1053        AVMasteringDisplayMetadata *mastering;
   1054 
   1055        ret = ff_decode_mastering_display_new(avctx, frame, &mastering);
   1056        if (ret < 0)
   1057            return ret;
   1058 
   1059        if (mastering) {
   1060            for (int i = 0; i < 3; i++) {
   1061                mastering->display_primaries[i][0] = av_make_q(s->mdcv->primary_chromaticity_x[i], 1 << 16);
   1062                mastering->display_primaries[i][1] = av_make_q(s->mdcv->primary_chromaticity_y[i], 1 << 16);
   1063            }
   1064            mastering->white_point[0] = av_make_q(s->mdcv->white_point_chromaticity_x, 1 << 16);
   1065            mastering->white_point[1] = av_make_q(s->mdcv->white_point_chromaticity_y, 1 << 16);
   1066 
   1067            mastering->max_luminance = av_make_q(s->mdcv->luminance_max, 1 << 8);
   1068            mastering->min_luminance = av_make_q(s->mdcv->luminance_min, 1 << 14);
   1069 
   1070            mastering->has_primaries = 1;
   1071            mastering->has_luminance = 1;
   1072        }
   1073    }
   1074 
   1075    if (s->cll) {
   1076        AVContentLightMetadata *light;
   1077 
   1078        ret = ff_decode_content_light_new(avctx, frame, &light);
   1079        if (ret < 0)
   1080            return ret;
   1081 
   1082        if (light) {
   1083            light->MaxCLL = s->cll->max_cll;
   1084            light->MaxFALL = s->cll->max_fall;
   1085        }
   1086    }
   1087 
   1088    while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0) {
   1089        if (ret >= 0)
   1090            ret = export_itut_t35(avctx, frame, &itut_t35);
   1091        av_buffer_unref(&itut_t35.payload_ref);
   1092    }
   1093 
   1094    return ret;
   1095 }
   1096 
   1097 static int export_film_grain(AVCodecContext *avctx, AVFrame *frame)
   1098 {
   1099    AV1DecContext *s = avctx->priv_data;
   1100    const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain;
   1101    const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(frame->format);
   1102    AVFilmGrainParams *fgp;
   1103    AVFilmGrainAOMParams *aom;
   1104 
   1105    av_assert0(pixdesc);
   1106    if (!film_grain->apply_grain)
   1107        return 0;
   1108 
   1109    fgp = av_film_grain_params_create_side_data(frame);
   1110    if (!fgp)
   1111        return AVERROR(ENOMEM);
   1112 
   1113    fgp->type = AV_FILM_GRAIN_PARAMS_AV1;
   1114    fgp->seed = film_grain->grain_seed;
   1115    fgp->width = frame->width;
   1116    fgp->height = frame->height;
   1117    fgp->color_range = frame->color_range;
   1118    fgp->color_primaries = frame->color_primaries;
   1119    fgp->color_trc = frame->color_trc;
   1120    fgp->color_space = frame->colorspace;
   1121    fgp->subsampling_x = pixdesc->log2_chroma_w;
   1122    fgp->subsampling_y = pixdesc->log2_chroma_h;
   1123 
   1124    aom = &fgp->codec.aom;
   1125    aom->chroma_scaling_from_luma = film_grain->chroma_scaling_from_luma;
   1126    aom->scaling_shift = film_grain->grain_scaling_minus_8 + 8;
   1127    aom->ar_coeff_lag = film_grain->ar_coeff_lag;
   1128    aom->ar_coeff_shift = film_grain->ar_coeff_shift_minus_6 + 6;
   1129    aom->grain_scale_shift = film_grain->grain_scale_shift;
   1130    aom->overlap_flag = film_grain->overlap_flag;
   1131    aom->limit_output_range = film_grain->clip_to_restricted_range;
   1132 
   1133    aom->num_y_points = film_grain->num_y_points;
   1134    for (int i = 0; i < film_grain->num_y_points; i++) {
   1135        aom->y_points[i][0] = film_grain->point_y_value[i];
   1136        aom->y_points[i][1] = film_grain->point_y_scaling[i];
   1137    }
   1138    aom->num_uv_points[0] = film_grain->num_cb_points;
   1139    for (int i = 0; i < film_grain->num_cb_points; i++) {
   1140        aom->uv_points[0][i][0] = film_grain->point_cb_value[i];
   1141        aom->uv_points[0][i][1] = film_grain->point_cb_scaling[i];
   1142    }
   1143    aom->num_uv_points[1] = film_grain->num_cr_points;
   1144    for (int i = 0; i < film_grain->num_cr_points; i++) {
   1145        aom->uv_points[1][i][0] = film_grain->point_cr_value[i];
   1146        aom->uv_points[1][i][1] = film_grain->point_cr_scaling[i];
   1147    }
   1148 
   1149    for (int i = 0; i < 24; i++) {
   1150        aom->ar_coeffs_y[i] = film_grain->ar_coeffs_y_plus_128[i] - 128;
   1151    }
   1152    for (int i = 0; i < 25; i++) {
   1153        aom->ar_coeffs_uv[0][i] = film_grain->ar_coeffs_cb_plus_128[i] - 128;
   1154        aom->ar_coeffs_uv[1][i] = film_grain->ar_coeffs_cr_plus_128[i] - 128;
   1155    }
   1156 
   1157    aom->uv_mult[0] = film_grain->cb_mult;
   1158    aom->uv_mult[1] = film_grain->cr_mult;
   1159    aom->uv_mult_luma[0] = film_grain->cb_luma_mult;
   1160    aom->uv_mult_luma[1] = film_grain->cr_luma_mult;
   1161    aom->uv_offset[0] = film_grain->cb_offset;
   1162    aom->uv_offset[1] = film_grain->cr_offset;
   1163 
   1164    return 0;
   1165 }
   1166 
   1167 static int set_output_frame(AVCodecContext *avctx, AVFrame *frame)
   1168 {
   1169    AV1DecContext *s = avctx->priv_data;
   1170    const AVFrame *srcframe = s->cur_frame.f;
   1171    AVPacket *pkt = s->pkt;
   1172    int ret;
   1173 
   1174    // TODO: all layers
   1175    if (s->operating_point_idc &&
   1176        av_log2(s->operating_point_idc >> 8) > s->cur_frame.spatial_id)
   1177        return 0;
   1178 
   1179    ret = av_frame_ref(frame, srcframe);
   1180    if (ret < 0)
   1181        return ret;
   1182 
   1183    ret = export_metadata(avctx, frame);
   1184    if (ret < 0) {
   1185        av_frame_unref(frame);
   1186        return ret;
   1187    }
   1188 
   1189    if (avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) {
   1190        ret = export_film_grain(avctx, frame);
   1191        if (ret < 0) {
   1192            av_frame_unref(frame);
   1193            return ret;
   1194        }
   1195    }
   1196 
   1197    frame->pts = pkt->pts;
   1198    frame->pkt_dts = pkt->dts;
   1199 #if FF_API_FRAME_PKT
   1200 FF_DISABLE_DEPRECATION_WARNINGS
   1201    frame->pkt_size = pkt->size;
   1202    frame->pkt_pos = pkt->pos;
   1203 FF_ENABLE_DEPRECATION_WARNINGS
   1204 #endif
   1205 
   1206    av_packet_unref(pkt);
   1207 
   1208    return 0;
   1209 }
   1210 
   1211 static void update_reference_list(AVCodecContext *avctx)
   1212 {
   1213    AV1DecContext *s = avctx->priv_data;
   1214    const AV1RawFrameHeader *header = s->raw_frame_header;
   1215 
   1216    for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) {
   1217        if (header->refresh_frame_flags & (1 << i))
   1218            av1_frame_replace(&s->ref[i], &s->cur_frame);
   1219    }
   1220 }
   1221 
   1222 static int get_current_frame(AVCodecContext *avctx)
   1223 {
   1224    AV1DecContext *s = avctx->priv_data;
   1225    int ret;
   1226 
   1227    av1_frame_unref(&s->cur_frame);
   1228 
   1229    s->cur_frame.header_ref = av_refstruct_ref(s->header_ref);
   1230 
   1231    s->cur_frame.raw_frame_header = s->raw_frame_header;
   1232 
   1233    ret = init_tile_data(s);
   1234    if (ret < 0) {
   1235        av_log(avctx, AV_LOG_ERROR, "Failed to init tile data.\n");
   1236        return ret;
   1237    }
   1238 
   1239    if ((avctx->skip_frame >= AVDISCARD_NONINTRA &&
   1240            (s->raw_frame_header->frame_type != AV1_FRAME_KEY &&
   1241             s->raw_frame_header->frame_type != AV1_FRAME_INTRA_ONLY)) ||
   1242        (avctx->skip_frame >= AVDISCARD_NONKEY   &&
   1243             s->raw_frame_header->frame_type != AV1_FRAME_KEY) ||
   1244        avctx->skip_frame >= AVDISCARD_ALL)
   1245        return 0;
   1246 
   1247    if (s->pix_fmt == AV_PIX_FMT_NONE) {
   1248        ret = get_pixel_format(avctx);
   1249        if (ret < 0) {
   1250            av_log(avctx, AV_LOG_ERROR, "Failed to get pixel format.\n");
   1251            return ret;
   1252        }
   1253 
   1254        if (!ret && FF_HW_HAS_CB(avctx, decode_params)) {
   1255            ret = FF_HW_CALL(avctx, decode_params, AV1_OBU_SEQUENCE_HEADER,
   1256                             s->seq_data_ref->data, s->seq_data_ref->size);
   1257            if (ret < 0) {
   1258                av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n");
   1259                return ret;
   1260            }
   1261        }
   1262    }
   1263 
   1264    ret = av1_frame_alloc(avctx, &s->cur_frame);
   1265    if (ret < 0) {
   1266        av_log(avctx, AV_LOG_ERROR,
   1267               "Failed to allocate space for current frame.\n");
   1268        return ret;
   1269    }
   1270 
   1271    global_motion_params(s);
   1272    skip_mode_params(s);
   1273    coded_lossless_param(s);
   1274    order_hint_info(s);
   1275    load_grain_params(s);
   1276 
   1277    s->cur_frame.force_integer_mv =
   1278        s->raw_frame_header->force_integer_mv ||
   1279        s->raw_frame_header->frame_type == AV1_FRAME_KEY ||
   1280        s->raw_frame_header->frame_type == AV1_FRAME_INTRA_ONLY;
   1281 
   1282    return ret;
   1283 }
   1284 
   1285 static int av1_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
   1286 {
   1287    AV1DecContext *s = avctx->priv_data;
   1288    AV1RawTileGroup *raw_tile_group = NULL;
   1289    int i = 0, ret;
   1290 
   1291    for (i = s->nb_unit; i < s->current_obu.nb_units; i++) {
   1292        CodedBitstreamUnit *unit = &s->current_obu.units[i];
   1293        AV1RawOBU *obu = unit->content;
   1294        const AV1RawOBUHeader *header;
   1295 
   1296        av_log(avctx, AV_LOG_DEBUG, "OBU idx:%d, type:%d, content available:%d.\n", i, unit->type, !!obu);
   1297 
   1298        if (unit->type == AV1_OBU_TILE_LIST) {
   1299            av_log(avctx, AV_LOG_ERROR, "Large scale tile decoding is unsupported.\n");
   1300            ret = AVERROR_PATCHWELCOME;
   1301            goto end;
   1302        }
   1303 
   1304        if (!obu)
   1305            continue;
   1306 
   1307        header = &obu->header;
   1308 
   1309        switch (unit->type) {
   1310        case AV1_OBU_SEQUENCE_HEADER:
   1311            ret = av_buffer_replace(&s->seq_data_ref, unit->data_ref);
   1312            if (ret < 0)
   1313                goto end;
   1314 
   1315            s->seq_data_ref->data = unit->data;
   1316            s->seq_data_ref->size = unit->data_size;
   1317            av_refstruct_replace(&s->seq_ref, unit->content_ref);
   1318 
   1319            s->raw_seq = &obu->obu.sequence_header;
   1320 
   1321            ret = set_context_with_sequence(avctx, s->raw_seq);
   1322            if (ret < 0) {
   1323                av_log(avctx, AV_LOG_ERROR, "Failed to set context.\n");
   1324                s->raw_seq = NULL;
   1325                goto end;
   1326            }
   1327 
   1328            s->operating_point_idc = s->raw_seq->operating_point_idc[s->operating_point];
   1329 
   1330            s->pix_fmt = AV_PIX_FMT_NONE;
   1331 
   1332            break;
   1333        case AV1_OBU_REDUNDANT_FRAME_HEADER:
   1334            if (s->raw_frame_header)
   1335                break;
   1336        // fall-through
   1337        case AV1_OBU_FRAME:
   1338        case AV1_OBU_FRAME_HEADER:
   1339            if (!s->raw_seq) {
   1340                av_log(avctx, AV_LOG_ERROR, "Missing Sequence Header.\n");
   1341                ret = AVERROR_INVALIDDATA;
   1342                goto end;
   1343            }
   1344 
   1345            av_refstruct_replace(&s->header_ref, unit->content_ref);
   1346 
   1347            if (unit->type == AV1_OBU_FRAME)
   1348                s->raw_frame_header = &obu->obu.frame.header;
   1349            else
   1350                s->raw_frame_header = &obu->obu.frame_header;
   1351 
   1352            if (s->raw_frame_header->show_existing_frame) {
   1353                av1_frame_replace(&s->cur_frame,
   1354                                  &s->ref[s->raw_frame_header->frame_to_show_map_idx]);
   1355 
   1356                update_reference_list(avctx);
   1357 
   1358                if (s->cur_frame.f) {
   1359                    ret = set_output_frame(avctx, frame);
   1360                    if (ret < 0) {
   1361                        av_log(avctx, AV_LOG_ERROR, "Set output frame error.\n");
   1362                        goto end;
   1363                    }
   1364                }
   1365 
   1366                s->raw_frame_header = NULL;
   1367                i++;
   1368                ret = 0;
   1369 
   1370                goto end;
   1371            }
   1372 
   1373            ret = get_current_frame(avctx);
   1374            if (ret < 0) {
   1375                av_log(avctx, AV_LOG_ERROR, "Get current frame error\n");
   1376                goto end;
   1377            }
   1378 
   1379            s->cur_frame.spatial_id  = header->spatial_id;
   1380            s->cur_frame.temporal_id = header->temporal_id;
   1381 
   1382            if (avctx->hwaccel && s->cur_frame.f) {
   1383                ret = FF_HW_CALL(avctx, start_frame, unit->data, unit->data_size);
   1384                if (ret < 0) {
   1385                    av_log(avctx, AV_LOG_ERROR, "HW accel start frame fail.\n");
   1386                    goto end;
   1387                }
   1388            }
   1389            if (unit->type != AV1_OBU_FRAME)
   1390                break;
   1391        // fall-through
   1392        case AV1_OBU_TILE_GROUP:
   1393            if (!s->raw_frame_header) {
   1394                av_log(avctx, AV_LOG_ERROR, "Missing Frame Header.\n");
   1395                ret = AVERROR_INVALIDDATA;
   1396                goto end;
   1397            }
   1398 
   1399            if (unit->type == AV1_OBU_FRAME)
   1400                raw_tile_group = &obu->obu.frame.tile_group;
   1401            else
   1402                raw_tile_group = &obu->obu.tile_group;
   1403 
   1404            ret = get_tiles_info(avctx, raw_tile_group);
   1405            if (ret < 0)
   1406                goto end;
   1407 
   1408            if (avctx->hwaccel && s->cur_frame.f) {
   1409                ret = FF_HW_CALL(avctx, decode_slice, raw_tile_group->tile_data.data,
   1410                                 raw_tile_group->tile_data.data_size);
   1411                if (ret < 0) {
   1412                    av_log(avctx, AV_LOG_ERROR,
   1413                           "HW accel decode slice fail.\n");
   1414                    goto end;
   1415                }
   1416            }
   1417            break;
   1418        case AV1_OBU_TILE_LIST:
   1419        case AV1_OBU_TEMPORAL_DELIMITER:
   1420        case AV1_OBU_PADDING:
   1421            break;
   1422        case AV1_OBU_METADATA:
   1423            switch (obu->obu.metadata.metadata_type) {
   1424            case AV1_METADATA_TYPE_HDR_CLL:
   1425                av_refstruct_replace(&s->cll_ref, unit->content_ref);
   1426                s->cll = &obu->obu.metadata.metadata.hdr_cll;
   1427                break;
   1428            case AV1_METADATA_TYPE_HDR_MDCV:
   1429                av_refstruct_replace(&s->mdcv_ref, unit->content_ref);
   1430                s->mdcv = &obu->obu.metadata.metadata.hdr_mdcv;
   1431                break;
   1432            case AV1_METADATA_TYPE_ITUT_T35: {
   1433                AV1RawMetadataITUTT35 itut_t35;
   1434                memcpy(&itut_t35, &obu->obu.metadata.metadata.itut_t35, sizeof(itut_t35));
   1435                itut_t35.payload_ref = av_buffer_ref(obu->obu.metadata.metadata.itut_t35.payload_ref);
   1436                if (!itut_t35.payload_ref) {
   1437                    ret = AVERROR(ENOMEM);
   1438                    goto end;
   1439                }
   1440                ret = av_fifo_write(s->itut_t35_fifo, &itut_t35, 1);
   1441                if (ret < 0) {
   1442                    av_buffer_unref(&itut_t35.payload_ref);
   1443                    goto end;
   1444                }
   1445                break;
   1446            }
   1447            default:
   1448                break;
   1449            }
   1450            break;
   1451        default:
   1452            av_log(avctx, AV_LOG_DEBUG,
   1453                   "Unknown obu type: %d (%"SIZE_SPECIFIER" bits).\n",
   1454                   unit->type, unit->data_size);
   1455        }
   1456 
   1457        if (raw_tile_group && (s->tile_num == raw_tile_group->tg_end + 1)) {
   1458            int show_frame = s->raw_frame_header->show_frame;
   1459            // Set nb_unit to point at the next OBU, to indicate which
   1460            // OBUs have been processed for this current frame. (If this
   1461            // frame gets output, we set nb_unit to this value later too.)
   1462            s->nb_unit = i + 1;
   1463            if (avctx->hwaccel && s->cur_frame.f) {
   1464                ret = FF_HW_SIMPLE_CALL(avctx, end_frame);
   1465                if (ret < 0) {
   1466                    av_log(avctx, AV_LOG_ERROR, "HW accel end frame fail.\n");
   1467                    goto end;
   1468                }
   1469            }
   1470 
   1471            update_reference_list(avctx);
   1472 
   1473            // Set start_unit to indicate the first OBU of the next frame.
   1474            s->start_unit       = s->nb_unit;
   1475            raw_tile_group      = NULL;
   1476            s->raw_frame_header = NULL;
   1477 
   1478            if (show_frame) {
   1479                // cur_frame.f needn't exist due to skip_frame.
   1480                if (s->cur_frame.f) {
   1481                    ret = set_output_frame(avctx, frame);
   1482                    if (ret < 0) {
   1483                        av_log(avctx, AV_LOG_ERROR, "Set output frame error\n");
   1484                        goto end;
   1485                    }
   1486                }
   1487                i++;
   1488                ret = 0;
   1489                goto end;
   1490            }
   1491        }
   1492    }
   1493 
   1494    ret = AVERROR(EAGAIN);
   1495 end:
   1496    av_assert0(i <= s->current_obu.nb_units);
   1497    s->nb_unit = i;
   1498 
   1499    if ((ret < 0 && ret != AVERROR(EAGAIN)) || s->current_obu.nb_units == i) {
   1500        if (ret < 0)
   1501            s->raw_frame_header = NULL;
   1502        av_packet_unref(s->pkt);
   1503        ff_cbs_fragment_reset(&s->current_obu);
   1504        s->nb_unit = s->start_unit = 0;
   1505    }
   1506    if (!ret && !frame->buf[0])
   1507        ret = AVERROR(EAGAIN);
   1508 
   1509    return ret;
   1510 }
   1511 
   1512 static int av1_receive_frame(AVCodecContext *avctx, AVFrame *frame)
   1513 {
   1514    AV1DecContext *s = avctx->priv_data;
   1515    int ret;
   1516 
   1517    do {
   1518        if (!s->current_obu.nb_units) {
   1519            ret = ff_decode_get_packet(avctx, s->pkt);
   1520            if (ret < 0)
   1521                return ret;
   1522 
   1523            ret = ff_cbs_read_packet(s->cbc, &s->current_obu, s->pkt);
   1524            if (ret < 0) {
   1525                ff_cbs_fragment_reset(&s->current_obu);
   1526                av_packet_unref(s->pkt);
   1527                av_log(avctx, AV_LOG_ERROR, "Failed to read packet.\n");
   1528                return ret;
   1529            }
   1530 
   1531            s->nb_unit = s->start_unit = 0;
   1532            av_log(avctx, AV_LOG_DEBUG, "Total OBUs on this packet: %d.\n",
   1533                   s->current_obu.nb_units);
   1534        }
   1535 
   1536        ret = av1_receive_frame_internal(avctx, frame);
   1537    } while (ret == AVERROR(EAGAIN));
   1538 
   1539    return ret;
   1540 }
   1541 
   1542 static void av1_decode_flush(AVCodecContext *avctx)
   1543 {
   1544    AV1DecContext *s = avctx->priv_data;
   1545    AV1RawMetadataITUTT35 itut_t35;
   1546 
   1547    for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++)
   1548        av1_frame_unref(&s->ref[i]);
   1549 
   1550    av1_frame_unref(&s->cur_frame);
   1551    s->operating_point_idc = 0;
   1552    s->nb_unit = s->start_unit = 0;
   1553    s->raw_frame_header = NULL;
   1554    s->raw_seq = NULL;
   1555    s->cll = NULL;
   1556    s->mdcv = NULL;
   1557    while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0)
   1558        av_buffer_unref(&itut_t35.payload_ref);
   1559 
   1560    ff_cbs_fragment_reset(&s->current_obu);
   1561    ff_cbs_flush(s->cbc);
   1562 
   1563    if (FF_HW_HAS_CB(avctx, flush))
   1564        FF_HW_SIMPLE_CALL(avctx, flush);
   1565 }
   1566 
   1567 #define OFFSET(x) offsetof(AV1DecContext, x)
   1568 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
   1569 static const AVOption av1_options[] = {
   1570    { "operating_point",  "Select an operating point of the scalable bitstream",
   1571                          OFFSET(operating_point), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, AV1_MAX_OPERATING_POINTS - 1, VD },
   1572    { NULL }
   1573 };
   1574 
   1575 static const AVClass av1_class = {
   1576    .class_name = "AV1 decoder",
   1577    .item_name  = av_default_item_name,
   1578    .option     = av1_options,
   1579    .version    = LIBAVUTIL_VERSION_INT,
   1580 };
   1581 
   1582 const FFCodec ff_av1_decoder = {
   1583    .p.name                = "av1",
   1584    CODEC_LONG_NAME("Alliance for Open Media AV1"),
   1585    .p.type                = AVMEDIA_TYPE_VIDEO,
   1586    .p.id                  = AV_CODEC_ID_AV1,
   1587    .priv_data_size        = sizeof(AV1DecContext),
   1588    .init                  = av1_decode_init,
   1589    .close                 = av1_decode_free,
   1590    FF_CODEC_RECEIVE_FRAME_CB(av1_receive_frame),
   1591    .p.capabilities        = AV_CODEC_CAP_DR1,
   1592    .caps_internal         = FF_CODEC_CAP_INIT_CLEANUP |
   1593                             FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
   1594                             FF_CODEC_CAP_USES_PROGRESSFRAMES,
   1595    .flush                 = av1_decode_flush,
   1596    .p.profiles            = NULL_IF_CONFIG_SMALL(ff_av1_profiles),
   1597    .p.priv_class          = &av1_class,
   1598    .hw_configs            = (const AVCodecHWConfigInternal *const []) {
   1599 #if CONFIG_AV1_DXVA2_HWACCEL
   1600        HWACCEL_DXVA2(av1),
   1601 #endif
   1602 #if CONFIG_AV1_D3D11VA_HWACCEL
   1603        HWACCEL_D3D11VA(av1),
   1604 #endif
   1605 #if CONFIG_AV1_D3D11VA2_HWACCEL
   1606        HWACCEL_D3D11VA2(av1),
   1607 #endif
   1608 #if CONFIG_AV1_D3D12VA_HWACCEL
   1609        HWACCEL_D3D12VA(av1),
   1610 #endif
   1611 #if CONFIG_AV1_NVDEC_HWACCEL
   1612        HWACCEL_NVDEC(av1),
   1613 #endif
   1614 #if CONFIG_AV1_VAAPI_HWACCEL
   1615        HWACCEL_VAAPI(av1),
   1616 #endif
   1617 #if CONFIG_AV1_VDPAU_HWACCEL
   1618        HWACCEL_VDPAU(av1),
   1619 #endif
   1620 #if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
   1621        HWACCEL_VIDEOTOOLBOX(av1),
   1622 #endif
   1623 #if CONFIG_AV1_VULKAN_HWACCEL
   1624        HWACCEL_VULKAN(av1),
   1625 #endif
   1626 
   1627        NULL
   1628    },
   1629 };