Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/hevc/hevcdec.c
Line
Count
Source
1
/*
2
 * HEVC video Decoder
3
 *
4
 * Copyright (C) 2012 - 2013 Guillaume Martres
5
 * Copyright (C) 2012 - 2013 Mickael Raulet
6
 * Copyright (C) 2012 - 2013 Gildas Cocherel
7
 * Copyright (C) 2012 - 2013 Wassim Hamidouche
8
 *
9
 * This file is part of FFmpeg.
10
 *
11
 * FFmpeg is free software; you can redistribute it and/or
12
 * modify it under the terms of the GNU Lesser General Public
13
 * License as published by the Free Software Foundation; either
14
 * version 2.1 of the License, or (at your option) any later version.
15
 *
16
 * FFmpeg is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19
 * Lesser General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU Lesser General Public
22
 * License along with FFmpeg; if not, write to the Free Software
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
 */
25
26
#include "config_components.h"
27
28
#include "libavutil/attributes.h"
29
#include "libavutil/avstring.h"
30
#include "libavutil/common.h"
31
#include "libavutil/container_fifo.h"
32
#include "libavutil/film_grain_params.h"
33
#include "libavutil/internal.h"
34
#include "libavutil/md5.h"
35
#include "libavutil/mem.h"
36
#include "libavutil/opt.h"
37
#include "libavutil/pixdesc.h"
38
#include "libavutil/stereo3d.h"
39
#include "libavutil/tdrdi.h"
40
#include "libavutil/timecode.h"
41
#include "libavutil/refstruct.h"
42
43
#include "libavcodec/aom_film_grain.h"
44
#include "libavcodec/bswapdsp.h"
45
#include "libavcodec/cabac_functions.h"
46
#include "libavcodec/codec_internal.h"
47
#include "libavcodec/decode.h"
48
#include "libavcodec/golomb.h"
49
#include "libavcodec/h274.h"
50
#include "libavcodec/hwaccel_internal.h"
51
#include "libavcodec/hwconfig.h"
52
#include "libavcodec/internal.h"
53
#include "libavcodec/profiles.h"
54
#include "libavcodec/progressframe.h"
55
#include "libavcodec/thread.h"
56
#include "libavcodec/threadprogress.h"
57
58
#include "hevc.h"
59
#include "parse.h"
60
#include "hevcdec.h"
61
62
static const uint8_t hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
63
64
/**
65
 * NOTE: Each function hls_foo correspond to the function foo in the
66
 * specification (HLS stands for High Level Syntax).
67
 */
68
69
/**
70
 * Section 5.7
71
 */
72
73
/* free everything allocated  by pic_arrays_init() */
74
static void pic_arrays_free(HEVCLayerContext *l)
75
107k
{
76
107k
    av_freep(&l->sao);
77
107k
    av_freep(&l->deblock);
78
79
107k
    av_freep(&l->skip_flag);
80
107k
    av_freep(&l->tab_ct_depth);
81
82
107k
    av_freep(&l->tab_ipm);
83
107k
    av_freep(&l->cbf_luma);
84
107k
    av_freep(&l->is_pcm);
85
86
107k
    av_freep(&l->qp_y_tab);
87
107k
    av_freep(&l->tab_slice_address);
88
107k
    av_freep(&l->filter_slice_edges);
89
90
107k
    av_freep(&l->horizontal_bs);
91
107k
    av_freep(&l->vertical_bs);
92
93
428k
    for (int i = 0; i < 3; i++) {
94
321k
        av_freep(&l->sao_pixel_buffer_h[i]);
95
321k
        av_freep(&l->sao_pixel_buffer_v[i]);
96
321k
    }
97
98
107k
    av_refstruct_pool_uninit(&l->tab_mvf_pool);
99
107k
    av_refstruct_pool_uninit(&l->rpl_tab_pool);
100
107k
}
101
102
/* allocate arrays that depend on frame dimensions */
103
static int pic_arrays_init(HEVCLayerContext *l, const HEVCSPS *sps)
104
24.0k
{
105
24.0k
    int log2_min_cb_size = sps->log2_min_cb_size;
106
24.0k
    int width            = sps->width;
107
24.0k
    int height           = sps->height;
108
24.0k
    int pic_size_in_ctb  = ((width  >> log2_min_cb_size) + 1) *
109
24.0k
                           ((height >> log2_min_cb_size) + 1);
110
24.0k
    int ctb_count        = sps->ctb_width * sps->ctb_height;
111
24.0k
    int min_pu_size      = sps->min_pu_width * sps->min_pu_height;
112
113
24.0k
    l->bs_width  = (width  >> 2) + 1;
114
24.0k
    l->bs_height = (height >> 2) + 1;
115
116
24.0k
    l->sao           = av_calloc(ctb_count, sizeof(*l->sao));
117
24.0k
    l->deblock       = av_calloc(ctb_count, sizeof(*l->deblock));
118
24.0k
    if (!l->sao || !l->deblock)
119
0
        goto fail;
120
121
24.0k
    l->skip_flag    = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
122
24.0k
    l->tab_ct_depth = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
123
24.0k
    if (!l->skip_flag || !l->tab_ct_depth)
124
0
        goto fail;
125
126
24.0k
    l->cbf_luma = av_malloc_array(sps->min_tb_width, sps->min_tb_height);
127
24.0k
    l->tab_ipm  = av_mallocz(min_pu_size);
128
24.0k
    l->is_pcm   = av_malloc_array(sps->min_pu_width + 1, sps->min_pu_height + 1);
129
24.0k
    if (!l->tab_ipm || !l->cbf_luma || !l->is_pcm)
130
0
        goto fail;
131
132
24.0k
    l->filter_slice_edges = av_mallocz(ctb_count);
133
24.0k
    l->tab_slice_address  = av_malloc_array(pic_size_in_ctb,
134
24.0k
                                      sizeof(*l->tab_slice_address));
135
24.0k
    l->qp_y_tab           = av_calloc(pic_size_in_ctb,
136
24.0k
                                      sizeof(*l->qp_y_tab));
137
24.0k
    if (!l->qp_y_tab || !l->filter_slice_edges || !l->tab_slice_address)
138
0
        goto fail;
139
140
24.0k
    l->horizontal_bs = av_calloc(l->bs_width, l->bs_height);
141
24.0k
    l->vertical_bs   = av_calloc(l->bs_width, l->bs_height);
142
24.0k
    if (!l->horizontal_bs || !l->vertical_bs)
143
0
        goto fail;
144
145
24.0k
    l->tab_mvf_pool = av_refstruct_pool_alloc(min_pu_size * sizeof(MvField), 0);
146
24.0k
    l->rpl_tab_pool = av_refstruct_pool_alloc(ctb_count   * sizeof(RefPicListTab), 0);
147
24.0k
    if (!l->tab_mvf_pool || !l->rpl_tab_pool)
148
0
        goto fail;
149
150
24.0k
    if (sps->sao_enabled) {
151
20.3k
        int c_count = (sps->chroma_format_idc != 0) ? 3 : 1;
152
153
77.8k
        for (int c_idx = 0; c_idx < c_count; c_idx++) {
154
57.4k
            int w = sps->width >> sps->hshift[c_idx];
155
57.4k
            int h = sps->height >> sps->vshift[c_idx];
156
57.4k
            l->sao_pixel_buffer_h[c_idx] =
157
57.4k
                av_mallocz((w * 2 * sps->ctb_height) <<
158
57.4k
                          sps->pixel_shift);
159
57.4k
            l->sao_pixel_buffer_v[c_idx] =
160
57.4k
                av_mallocz((h * 2 * sps->ctb_width) <<
161
57.4k
                          sps->pixel_shift);
162
57.4k
            if (!l->sao_pixel_buffer_h[c_idx] ||
163
57.4k
                !l->sao_pixel_buffer_v[c_idx])
164
0
                goto fail;
165
57.4k
        }
166
20.3k
    }
167
168
24.0k
    return 0;
169
170
0
fail:
171
0
    pic_arrays_free(l);
172
0
    return AVERROR(ENOMEM);
173
24.0k
}
174
175
static int pred_weight_table(SliceHeader *sh, void *logctx,
176
                             const HEVCSPS *sps, GetBitContext *gb)
177
38.9k
{
178
38.9k
    int i = 0;
179
38.9k
    int j = 0;
180
38.9k
    int luma_log2_weight_denom;
181
38.9k
    unsigned luma_weight_flags, chroma_weight_flags;
182
183
38.9k
    luma_log2_weight_denom = get_ue_golomb_long(gb);
184
38.9k
    if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
185
5.02k
        av_log(logctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
186
5.02k
        return AVERROR_INVALIDDATA;
187
5.02k
    }
188
33.8k
    sh->luma_log2_weight_denom = luma_log2_weight_denom;
189
33.8k
    if (sps->chroma_format_idc != 0) {
190
32.6k
        int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)get_se_golomb(gb);
191
32.6k
        if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
192
3.46k
            av_log(logctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom);
193
3.46k
            return AVERROR_INVALIDDATA;
194
3.46k
        }
195
29.2k
        sh->chroma_log2_weight_denom = chroma_log2_weight_denom;
196
29.2k
    }
197
198
30.4k
    luma_weight_flags   = get_bits(gb, sh->nb_refs[L0]);
199
30.4k
    chroma_weight_flags = sps->chroma_format_idc != 0 ? get_bits(gb, sh->nb_refs[L0]) : 0;
200
105k
    for (i = 0; i < sh->nb_refs[L0]; i++) {
201
77.3k
        unsigned flag_bit = 1 << (sh->nb_refs[L0] - 1 - i);
202
203
77.3k
        if (luma_weight_flags & flag_bit) {
204
40.6k
            int delta_luma_weight_l0 = get_se_golomb(gb);
205
40.6k
            if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
206
1.22k
                return AVERROR_INVALIDDATA;
207
39.4k
            sh->luma_weight_l0[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l0;
208
39.4k
            sh->luma_offset_l0[i] = get_se_golomb(gb);
209
39.4k
        } else {
210
36.6k
            sh->luma_weight_l0[i] = 1 << sh->luma_log2_weight_denom;
211
36.6k
            sh->luma_offset_l0[i] = 0;
212
36.6k
        }
213
76.1k
        if (chroma_weight_flags & flag_bit) {
214
91.9k
            for (j = 0; j < 2; j++) {
215
61.7k
                int delta_chroma_weight_l0 = get_se_golomb(gb);
216
61.7k
                int delta_chroma_offset_l0 = get_se_golomb(gb);
217
218
61.7k
                if (   (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
219
61.0k
                    || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
220
899
                    return AVERROR_INVALIDDATA;
221
899
                }
222
223
60.8k
                sh->chroma_weight_l0[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l0;
224
60.8k
                sh->chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * sh->chroma_weight_l0[i][j])
225
60.8k
                                                                                    >> sh->chroma_log2_weight_denom) + 128), -128, 127);
226
60.8k
            }
227
44.9k
        } else {
228
44.9k
            sh->chroma_weight_l0[i][0] = 1 << sh->chroma_log2_weight_denom;
229
44.9k
            sh->chroma_offset_l0[i][0] = 0;
230
44.9k
            sh->chroma_weight_l0[i][1] = 1 << sh->chroma_log2_weight_denom;
231
44.9k
            sh->chroma_offset_l0[i][1] = 0;
232
44.9k
        }
233
76.1k
    }
234
28.2k
    if (sh->slice_type == HEVC_SLICE_B) {
235
24.0k
        luma_weight_flags   = get_bits(gb, sh->nb_refs[L1]);
236
24.0k
        chroma_weight_flags = sps->chroma_format_idc != 0 ? get_bits(gb, sh->nb_refs[L1]) : 0;
237
73.7k
        for (i = 0; i < sh->nb_refs[L1]; i++) {
238
50.7k
            unsigned flag_bit = 1 << (sh->nb_refs[L1] - 1 - i);
239
240
50.7k
            if (luma_weight_flags & flag_bit) {
241
28.1k
                int delta_luma_weight_l1 = get_se_golomb(gb);
242
28.1k
                if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
243
227
                    return AVERROR_INVALIDDATA;
244
27.8k
                sh->luma_weight_l1[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l1;
245
27.8k
                sh->luma_offset_l1[i] = get_se_golomb(gb);
246
27.8k
            } else {
247
22.6k
                sh->luma_weight_l1[i] = 1 << sh->luma_log2_weight_denom;
248
22.6k
                sh->luma_offset_l1[i] = 0;
249
22.6k
            }
250
50.5k
            if (chroma_weight_flags & flag_bit) {
251
49.0k
                for (j = 0; j < 2; j++) {
252
33.1k
                    int delta_chroma_weight_l1 = get_se_golomb(gb);
253
33.1k
                    int delta_chroma_offset_l1 = get_se_golomb(gb);
254
255
33.1k
                    if (   (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
256
32.4k
                        || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
257
788
                        return AVERROR_INVALIDDATA;
258
788
                    }
259
260
32.3k
                    sh->chroma_weight_l1[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l1;
261
32.3k
                    sh->chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * sh->chroma_weight_l1[i][j])
262
32.3k
                                                                                        >> sh->chroma_log2_weight_denom) + 128), -128, 127);
263
32.3k
                }
264
33.7k
            } else {
265
33.7k
                sh->chroma_weight_l1[i][0] = 1 << sh->chroma_log2_weight_denom;
266
33.7k
                sh->chroma_offset_l1[i][0] = 0;
267
33.7k
                sh->chroma_weight_l1[i][1] = 1 << sh->chroma_log2_weight_denom;
268
33.7k
                sh->chroma_offset_l1[i][1] = 0;
269
33.7k
            }
270
50.5k
        }
271
24.0k
    }
272
27.2k
    return 0;
273
28.2k
}
274
275
static int decode_lt_rps(const HEVCSPS *sps, LongTermRPS *rps,
276
                         GetBitContext *gb, int cur_poc, int poc_lsb)
277
105k
{
278
105k
    int max_poc_lsb    = 1 << sps->log2_max_poc_lsb;
279
105k
    int prev_delta_msb = 0;
280
105k
    unsigned int nb_sps = 0, nb_sh;
281
105k
    int i;
282
283
105k
    rps->nb_refs = 0;
284
105k
    if (!sps->long_term_ref_pics_present)
285
63.8k
        return 0;
286
287
41.4k
    if (sps->num_long_term_ref_pics_sps > 0)
288
15.8k
        nb_sps = get_ue_golomb_long(gb);
289
41.4k
    nb_sh = get_ue_golomb_long(gb);
290
291
41.4k
    if (nb_sps > sps->num_long_term_ref_pics_sps)
292
3.12k
        return AVERROR_INVALIDDATA;
293
38.3k
    if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
294
2.67k
        return AVERROR_INVALIDDATA;
295
296
35.6k
    rps->nb_refs = nb_sh + nb_sps;
297
298
127k
    for (i = 0; i < rps->nb_refs; i++) {
299
300
92.3k
        if (i < nb_sps) {
301
7.38k
            uint8_t lt_idx_sps = 0;
302
303
7.38k
            if (sps->num_long_term_ref_pics_sps > 1)
304
6.13k
                lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
305
306
7.38k
            rps->poc[i]  = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
307
7.38k
            rps->used[i] = !!(sps->used_by_curr_pic_lt & (1U << lt_idx_sps));
308
85.0k
        } else {
309
85.0k
            rps->poc[i]  = get_bits(gb, sps->log2_max_poc_lsb);
310
85.0k
            rps->used[i] = get_bits1(gb);
311
85.0k
        }
312
313
92.3k
        rps->poc_msb_present[i] = get_bits1(gb);
314
92.3k
        if (rps->poc_msb_present[i]) {
315
38.7k
            int64_t delta = get_ue_golomb_long(gb);
316
38.7k
            int64_t poc;
317
318
38.7k
            if (i && i != nb_sps)
319
27.6k
                delta += prev_delta_msb;
320
321
38.7k
            poc = rps->poc[i] + cur_poc - delta * max_poc_lsb - poc_lsb;
322
38.7k
            if (poc != (int32_t)poc)
323
638
                return AVERROR_INVALIDDATA;
324
38.0k
            rps->poc[i] = poc;
325
38.0k
            prev_delta_msb = delta;
326
38.0k
        }
327
92.3k
    }
328
329
34.9k
    return 0;
330
35.6k
}
331
332
static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
333
24.0k
{
334
24.0k
    AVCodecContext *avctx = s->avctx;
335
24.0k
    const HEVCVPS    *vps = sps->vps;
336
24.0k
    const HEVCWindow *ow = &sps->output_window;
337
24.0k
    unsigned int num = 0, den = 0;
338
339
24.0k
    avctx->pix_fmt             = sps->pix_fmt;
340
24.0k
    avctx->coded_width         = sps->width;
341
24.0k
    avctx->coded_height        = sps->height;
342
24.0k
    avctx->width               = sps->width  - ow->left_offset - ow->right_offset;
343
24.0k
    avctx->height              = sps->height - ow->top_offset  - ow->bottom_offset;
344
24.0k
    avctx->has_b_frames        = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
345
24.0k
    avctx->profile             = sps->ptl.general_ptl.profile_idc;
346
24.0k
    avctx->level               = sps->ptl.general_ptl.level_idc;
347
348
24.0k
    ff_set_sar(avctx, sps->vui.common.sar);
349
350
24.0k
    if (sps->vui.common.video_signal_type_present_flag)
351
4.24k
        avctx->color_range = sps->vui.common.video_full_range_flag ? AVCOL_RANGE_JPEG
352
4.24k
                                                                   : AVCOL_RANGE_MPEG;
353
19.7k
    else
354
19.7k
        avctx->color_range = AVCOL_RANGE_MPEG;
355
356
24.0k
    if (sps->vui.common.colour_description_present_flag) {
357
3.80k
        avctx->color_primaries = sps->vui.common.colour_primaries;
358
3.80k
        avctx->color_trc       = sps->vui.common.transfer_characteristics;
359
3.80k
        avctx->colorspace      = sps->vui.common.matrix_coeffs;
360
20.2k
    } else {
361
20.2k
        avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
362
20.2k
        avctx->color_trc       = AVCOL_TRC_UNSPECIFIED;
363
20.2k
        avctx->colorspace      = AVCOL_SPC_UNSPECIFIED;
364
20.2k
    }
365
366
24.0k
    avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED;
367
24.0k
    if (sps->chroma_format_idc == 1) {
368
14.4k
        if (sps->vui.common.chroma_loc_info_present_flag) {
369
1.60k
            if (sps->vui.common.chroma_sample_loc_type_top_field <= 5)
370
1.52k
                avctx->chroma_sample_location = sps->vui.common.chroma_sample_loc_type_top_field + 1;
371
1.60k
        } else
372
12.8k
            avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
373
14.4k
    }
374
375
24.0k
    if (vps->vps_timing_info_present_flag) {
376
6.61k
        num = vps->vps_num_units_in_tick;
377
6.61k
        den = vps->vps_time_scale;
378
17.4k
    } else if (sps->vui.vui_timing_info_present_flag) {
379
853
        num = sps->vui.vui_num_units_in_tick;
380
853
        den = sps->vui.vui_time_scale;
381
853
    }
382
383
24.0k
    if (num > 0 && den > 0)
384
7.42k
        av_reduce(&avctx->framerate.den, &avctx->framerate.num,
385
7.42k
                  num, den, 1 << 30);
386
24.0k
}
387
388
static int export_stream_params_from_sei(HEVCContext *s)
389
70.1k
{
390
70.1k
    AVCodecContext *avctx = s->avctx;
391
392
70.1k
    if (s->sei.common.alternative_transfer.present &&
393
967
        av_color_transfer_name(s->sei.common.alternative_transfer.preferred_transfer_characteristics) &&
394
271
        s->sei.common.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
395
181
        avctx->color_trc = s->sei.common.alternative_transfer.preferred_transfer_characteristics;
396
181
    }
397
398
70.1k
    return 0;
399
70.1k
}
400
401
static int export_multilayer(HEVCContext *s, const HEVCVPS *vps)
402
24.0k
{
403
24.0k
    const HEVCSEITDRDI *tdrdi = &s->sei.tdrdi;
404
405
24.0k
    av_freep(&s->view_ids_available);
406
24.0k
    s->nb_view_ids_available = 0;
407
24.0k
    av_freep(&s->view_pos_available);
408
24.0k
    s->nb_view_pos_available = 0;
409
410
    // don't export anything in the trivial case (1 layer, view id=0)
411
24.0k
    if (vps->nb_layers < 2 && !vps->view_id[0])
412
23.4k
        return 0;
413
414
628
    s->view_ids_available = av_calloc(vps->nb_layers, sizeof(*s->view_ids_available));
415
628
    if (!s->view_ids_available)
416
0
        return AVERROR(ENOMEM);
417
418
628
    if (tdrdi->num_ref_displays) {
419
61
        s->view_pos_available = av_calloc(vps->nb_layers, sizeof(*s->view_pos_available));
420
61
        if (!s->view_pos_available)
421
0
            return AVERROR(ENOMEM);
422
61
    }
423
424
1.55k
    for (int i = 0; i < vps->nb_layers; i++) {
425
922
        s->view_ids_available[i] = vps->view_id[i];
426
427
922
        if (s->view_pos_available) {
428
74
            s->view_pos_available[i] = vps->view_id[i] == tdrdi->left_view_id[0]  ?
429
16
                                       AV_STEREO3D_VIEW_LEFT                      :
430
74
                                       vps->view_id[i] == tdrdi->right_view_id[0] ?
431
39
                                       AV_STEREO3D_VIEW_RIGHT : AV_STEREO3D_VIEW_UNSPEC;
432
74
        }
433
922
    }
434
628
    s->nb_view_ids_available = vps->nb_layers;
435
628
    s->nb_view_pos_available = s->view_pos_available ? vps->nb_layers : 0;
436
437
628
    return 0;
438
628
}
439
440
int ff_hevc_is_alpha_video(const HEVCContext *s)
441
142k
{
442
142k
    const HEVCVPS *vps = s->vps;
443
142k
    int ret = 0;
444
445
142k
    if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
446
140k
        return 0;
447
448
    /* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
449
     * than alpha cannot reach here.
450
     */
451
1.34k
    ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
452
453
1.34k
    av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
454
1.34k
           ret ? "is" : "not");
455
456
1.34k
    return ret;
457
142k
}
458
459
static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
460
24.0k
{
461
24.0k
    unsigned layers_active_output = 0, highest_layer;
462
463
24.0k
    s->layers_active_output = 1;
464
24.0k
    s->layers_active_decode = 1;
465
466
24.0k
    if (ff_hevc_is_alpha_video(s)) {
467
225
        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
468
469
225
        if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
470
48
            return 0;
471
472
177
        s->layers_active_decode = (1 << vps->nb_layers) - 1;
473
177
        s->layers_active_output = 1;
474
475
177
        return 0;
476
225
    }
477
478
    // nothing requested - decode base layer only
479
23.7k
    if (!s->nb_view_ids)
480
23.7k
        return 0;
481
482
0
    if (s->nb_view_ids == 1 && s->view_ids[0] == -1) {
483
0
        layers_active_output = (1 << vps->nb_layers) - 1;
484
0
    } else {
485
0
        for (int i = 0; i < s->nb_view_ids; i++) {
486
0
            int view_id   = s->view_ids[i];
487
0
            int layer_idx = -1;
488
489
0
            if (view_id < 0) {
490
0
                av_log(s->avctx, AV_LOG_ERROR,
491
0
                       "Invalid view ID requested: %d\n", view_id);
492
0
                return AVERROR(EINVAL);
493
0
            }
494
495
0
            for (int j = 0; j < vps->nb_layers; j++) {
496
0
                if (vps->view_id[j] == view_id) {
497
0
                    layer_idx = j;
498
0
                    break;
499
0
                }
500
0
            }
501
0
            if (layer_idx < 0) {
502
0
                av_log(s->avctx, AV_LOG_ERROR,
503
0
                       "View ID %d not present in VPS\n", view_id);
504
0
                return AVERROR(EINVAL);
505
0
            }
506
0
            layers_active_output |= 1 << layer_idx;
507
0
        }
508
0
    }
509
510
0
    if (!layers_active_output) {
511
0
        av_log(s->avctx, AV_LOG_ERROR, "No layers selected\n");
512
0
        return AVERROR_BUG;
513
0
    }
514
515
0
    highest_layer = ff_log2(layers_active_output);
516
0
    if (highest_layer >= FF_ARRAY_ELEMS(s->layers)) {
517
0
        av_log(s->avctx, AV_LOG_ERROR,
518
0
               "Too many layers requested: %u\n", layers_active_output);
519
0
        return AVERROR(EINVAL);
520
0
    }
521
522
    /* Assume a higher layer depends on all the lower ones.
523
     * This is enforced in VPS parsing currently, this logic will need
524
     * to be changed if we want to support more complex dependency structures.
525
     */
526
0
    s->layers_active_decode = (1 << (highest_layer + 1)) - 1;
527
0
    s->layers_active_output = layers_active_output;
528
529
0
    av_log(s->avctx, AV_LOG_DEBUG, "decode/output layers: %x/%x\n",
530
0
           s->layers_active_decode, s->layers_active_output);
531
532
0
    return 0;
533
0
}
534
535
static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
536
                                              enum AVPixelFormat pix_fmt)
537
225
{
538
225
    switch (pix_fmt) {
539
80
    case AV_PIX_FMT_YUV420P:
540
83
    case AV_PIX_FMT_YUVJ420P:
541
83
        return AV_PIX_FMT_YUVA420P;
542
34
    case AV_PIX_FMT_YUV420P10:
543
34
        return AV_PIX_FMT_YUVA420P10;
544
19
    case AV_PIX_FMT_YUV444P:
545
19
        return AV_PIX_FMT_YUVA444P;
546
10
    case AV_PIX_FMT_YUV422P:
547
10
        return AV_PIX_FMT_YUVA422P;
548
7
    case AV_PIX_FMT_YUV422P10LE:
549
7
        return AV_PIX_FMT_YUVA422P10LE;
550
4
    case AV_PIX_FMT_YUV444P10:
551
4
        return AV_PIX_FMT_YUVA444P10;
552
20
    case AV_PIX_FMT_YUV444P12:
553
20
        return AV_PIX_FMT_YUVA444P12;
554
0
    case AV_PIX_FMT_YUV422P12:
555
0
        return AV_PIX_FMT_YUVA422P12;
556
48
    default:
557
48
        av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
558
48
               av_get_pix_fmt_name(pix_fmt));
559
48
        return AV_PIX_FMT_NONE;
560
225
    }
561
225
}
562
563
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
564
24.0k
{
565
24.0k
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
566
24.0k
                     CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
567
24.0k
                     CONFIG_HEVC_D3D12VA_HWACCEL + \
568
24.0k
                     CONFIG_HEVC_NVDEC_HWACCEL + \
569
24.0k
                     CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL + \
570
24.0k
                     CONFIG_HEVC_VAAPI_HWACCEL + \
571
24.0k
                     CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
572
24.0k
                     CONFIG_HEVC_VDPAU_HWACCEL + \
573
24.0k
                     CONFIG_HEVC_VULKAN_HWACCEL)
574
24.0k
    enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
575
24.0k
    enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
576
24.0k
    int ret;
577
578
24.0k
    if (ff_hevc_is_alpha_video(s))
579
225
        alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
580
581
24.0k
    switch (sps->pix_fmt) {
582
5.48k
    case AV_PIX_FMT_YUV420P:
583
5.69k
    case AV_PIX_FMT_YUVJ420P:
584
#if CONFIG_HEVC_DXVA2_HWACCEL
585
        *fmt++ = AV_PIX_FMT_DXVA2_VLD;
586
#endif
587
#if CONFIG_HEVC_D3D11VA_HWACCEL
588
        *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
589
        *fmt++ = AV_PIX_FMT_D3D11;
590
#endif
591
#if CONFIG_HEVC_D3D12VA_HWACCEL
592
        *fmt++ = AV_PIX_FMT_D3D12;
593
#endif
594
#if CONFIG_HEVC_VAAPI_HWACCEL
595
        *fmt++ = AV_PIX_FMT_VAAPI;
596
#endif
597
#if CONFIG_HEVC_VDPAU_HWACCEL
598
        *fmt++ = AV_PIX_FMT_VDPAU;
599
#endif
600
#if CONFIG_HEVC_NVDEC_HWACCEL
601
        *fmt++ = AV_PIX_FMT_CUDA;
602
#endif
603
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
604
        *fmt++ = AV_PIX_FMT_CUARRAY;
605
#endif
606
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
607
        *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
608
#endif
609
#if CONFIG_HEVC_VULKAN_HWACCEL
610
        *fmt++ = AV_PIX_FMT_VULKAN;
611
#endif
612
5.69k
        break;
613
5.93k
    case AV_PIX_FMT_YUV420P10:
614
#if CONFIG_HEVC_DXVA2_HWACCEL
615
        *fmt++ = AV_PIX_FMT_DXVA2_VLD;
616
#endif
617
#if CONFIG_HEVC_D3D11VA_HWACCEL
618
        *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
619
        *fmt++ = AV_PIX_FMT_D3D11;
620
#endif
621
#if CONFIG_HEVC_D3D12VA_HWACCEL
622
        *fmt++ = AV_PIX_FMT_D3D12;
623
#endif
624
#if CONFIG_HEVC_VAAPI_HWACCEL
625
        *fmt++ = AV_PIX_FMT_VAAPI;
626
#endif
627
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
628
        *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
629
#endif
630
#if CONFIG_HEVC_VULKAN_HWACCEL
631
        *fmt++ = AV_PIX_FMT_VULKAN;
632
#endif
633
#if CONFIG_HEVC_VDPAU_HWACCEL
634
        *fmt++ = AV_PIX_FMT_VDPAU;
635
#endif
636
#if CONFIG_HEVC_NVDEC_HWACCEL
637
        *fmt++ = AV_PIX_FMT_CUDA;
638
#endif
639
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
640
        *fmt++ = AV_PIX_FMT_CUARRAY;
641
#endif
642
5.93k
        break;
643
423
    case AV_PIX_FMT_YUV444P:
644
#if CONFIG_HEVC_VAAPI_HWACCEL
645
        *fmt++ = AV_PIX_FMT_VAAPI;
646
#endif
647
#if CONFIG_HEVC_VDPAU_HWACCEL
648
        *fmt++ = AV_PIX_FMT_VDPAU;
649
#endif
650
#if CONFIG_HEVC_NVDEC_HWACCEL
651
        *fmt++ = AV_PIX_FMT_CUDA;
652
#endif
653
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
654
        *fmt++ = AV_PIX_FMT_CUARRAY;
655
#endif
656
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
657
        *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
658
#endif
659
#if CONFIG_HEVC_VULKAN_HWACCEL
660
        *fmt++ = AV_PIX_FMT_VULKAN;
661
#endif
662
423
        break;
663
635
    case AV_PIX_FMT_YUV422P:
664
1.81k
    case AV_PIX_FMT_YUV422P10LE:
665
#if CONFIG_HEVC_VAAPI_HWACCEL
666
       *fmt++ = AV_PIX_FMT_VAAPI;
667
#endif
668
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
669
        *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
670
#endif
671
#if CONFIG_HEVC_VULKAN_HWACCEL
672
        *fmt++ = AV_PIX_FMT_VULKAN;
673
#endif
674
#if CONFIG_HEVC_NVDEC_HWACCEL
675
        *fmt++ = AV_PIX_FMT_CUDA;
676
#endif
677
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
678
        *fmt++ = AV_PIX_FMT_CUARRAY;
679
#endif
680
1.81k
        break;
681
24
    case AV_PIX_FMT_YUV444P10:
682
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
683
        *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
684
#endif
685
24
        av_fallthrough;
686
948
    case AV_PIX_FMT_YUV420P12:
687
3.44k
    case AV_PIX_FMT_YUV444P12:
688
#if CONFIG_HEVC_VAAPI_HWACCEL
689
       *fmt++ = AV_PIX_FMT_VAAPI;
690
#endif
691
#if CONFIG_HEVC_VDPAU_HWACCEL
692
        *fmt++ = AV_PIX_FMT_VDPAU;
693
#endif
694
#if CONFIG_HEVC_VULKAN_HWACCEL
695
        *fmt++ = AV_PIX_FMT_VULKAN;
696
#endif
697
#if CONFIG_HEVC_NVDEC_HWACCEL
698
        *fmt++ = AV_PIX_FMT_CUDA;
699
#endif
700
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
701
        *fmt++ = AV_PIX_FMT_CUARRAY;
702
#endif
703
3.44k
        break;
704
144
    case AV_PIX_FMT_YUV422P12:
705
#if CONFIG_HEVC_VAAPI_HWACCEL
706
       *fmt++ = AV_PIX_FMT_VAAPI;
707
#endif
708
#if CONFIG_HEVC_VULKAN_HWACCEL
709
        *fmt++ = AV_PIX_FMT_VULKAN;
710
#endif
711
#if CONFIG_HEVC_NVDEC_HWACCEL
712
        *fmt++ = AV_PIX_FMT_CUDA;
713
#endif
714
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
715
        *fmt++ = AV_PIX_FMT_CUARRAY;
716
#endif
717
144
        break;
718
24.0k
    }
719
720
24.0k
    if (alpha_fmt != AV_PIX_FMT_NONE)
721
177
        *fmt++ = alpha_fmt;
722
24.0k
    *fmt++ = sps->pix_fmt;
723
24.0k
    *fmt = AV_PIX_FMT_NONE;
724
725
    // export multilayer information from active VPS to the caller,
726
    // so it is available in get_format()
727
24.0k
    ret = export_multilayer(s, sps->vps);
728
24.0k
    if (ret < 0)
729
0
        return ret;
730
731
24.0k
    ret = ff_get_format(s->avctx, pix_fmts);
732
24.0k
    if (ret < 0)
733
0
        return ret;
734
24.0k
    s->avctx->pix_fmt = ret;
735
736
    // set up multilayer decoding, if requested by caller
737
24.0k
    ret = setup_multilayer(s, sps->vps);
738
24.0k
    if (ret < 0)
739
0
        return ret;
740
741
24.0k
    return 0;
742
24.0k
}
743
744
static int set_sps(HEVCContext *s, HEVCLayerContext *l, const HEVCSPS *sps)
745
24.0k
{
746
24.0k
    int ret;
747
748
24.0k
    pic_arrays_free(l);
749
24.0k
    av_refstruct_unref(&l->sps);
750
24.0k
    av_refstruct_unref(&s->vps);
751
752
24.0k
    if (!sps)
753
10
        return 0;
754
755
24.0k
    ret = pic_arrays_init(l, sps);
756
24.0k
    if (ret < 0)
757
0
        goto fail;
758
759
24.0k
    ff_hevc_pred_init(&s->hpc,     sps->bit_depth);
760
24.0k
    ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
761
24.0k
    ff_videodsp_init (&s->vdsp,    sps->bit_depth);
762
763
24.0k
    l->sps    = av_refstruct_ref_c(sps);
764
24.0k
    s->vps    = av_refstruct_ref_c(sps->vps);
765
766
24.0k
    return 0;
767
768
0
fail:
769
0
    pic_arrays_free(l);
770
0
    av_refstruct_unref(&l->sps);
771
0
    return ret;
772
24.0k
}
773
774
static int hls_slice_header(SliceHeader *sh, const HEVCContext *s, GetBitContext *gb)
775
353k
{
776
353k
    const HEVCPPS *pps;
777
353k
    const HEVCSPS *sps;
778
353k
    const HEVCVPS *vps;
779
353k
    unsigned pps_id, layer_idx;
780
353k
    int i, ret;
781
782
    // Coded parameters
783
353k
    sh->first_slice_in_pic_flag = get_bits1(gb);
784
785
353k
    sh->no_output_of_prior_pics_flag = 0;
786
353k
    if (IS_IRAP(s))
787
126k
        sh->no_output_of_prior_pics_flag = get_bits1(gb);
788
789
353k
    pps_id = get_ue_golomb_long(gb);
790
353k
    if (pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[pps_id]) {
791
145k
        av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id);
792
145k
        return AVERROR_INVALIDDATA;
793
145k
    }
794
208k
    if (!sh->first_slice_in_pic_flag && s->ps.pps_list[pps_id] != s->pps) {
795
8.60k
        av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
796
8.60k
        return AVERROR_INVALIDDATA;
797
8.60k
    }
798
200k
    sh->pps_id = pps_id;
799
800
200k
    pps = s->ps.pps_list[pps_id];
801
200k
    sps = pps->sps;
802
200k
    vps = sps->vps;
803
200k
    layer_idx = vps->layer_idx[s->nuh_layer_id];
804
805
200k
    if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1)
806
743
        sh->no_output_of_prior_pics_flag = 1;
807
808
200k
    sh->dependent_slice_segment_flag = 0;
809
200k
    if (!sh->first_slice_in_pic_flag) {
810
45.7k
        int slice_address_length;
811
812
45.7k
        if (pps->dependent_slice_segments_enabled_flag)
813
16.6k
            sh->dependent_slice_segment_flag = get_bits1(gb);
814
45.7k
        if (sh->dependent_slice_segment_flag && !s->slice_initialized) {
815
4.87k
            av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
816
4.87k
            return AVERROR_INVALIDDATA;
817
4.87k
        }
818
819
40.8k
        slice_address_length = av_ceil_log2(sps->ctb_width *
820
40.8k
                                            sps->ctb_height);
821
40.8k
        sh->slice_segment_addr = get_bitsz(gb, slice_address_length);
822
40.8k
        if (sh->slice_segment_addr >= sps->ctb_width * sps->ctb_height) {
823
2.42k
            av_log(s->avctx, AV_LOG_ERROR,
824
2.42k
                   "Invalid slice segment address: %u.\n",
825
2.42k
                   sh->slice_segment_addr);
826
2.42k
            return AVERROR_INVALIDDATA;
827
2.42k
        }
828
829
38.4k
        if (!sh->dependent_slice_segment_flag) {
830
30.1k
            sh->slice_addr = sh->slice_segment_addr;
831
30.1k
        }
832
154k
    } else {
833
154k
        sh->slice_segment_addr = sh->slice_addr = 0;
834
154k
    }
835
836
192k
    if (!sh->dependent_slice_segment_flag) {
837
350k
        for (i = 0; i < pps->num_extra_slice_header_bits; i++)
838
165k
            skip_bits(gb, 1);  // slice_reserved_undetermined_flag[]
839
840
184k
        sh->slice_type = get_ue_golomb_long(gb);
841
184k
        if (!(sh->slice_type == HEVC_SLICE_I ||
842
108k
              sh->slice_type == HEVC_SLICE_P ||
843
95.4k
              sh->slice_type == HEVC_SLICE_B)) {
844
4.75k
            av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
845
4.75k
                   sh->slice_type);
846
4.75k
            return AVERROR_INVALIDDATA;
847
4.75k
        }
848
179k
        if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I &&
849
8.39k
            !pps->pps_curr_pic_ref_enabled_flag &&
850
1.50k
            s->nuh_layer_id == 0) {
851
1.48k
            av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
852
1.48k
            return AVERROR_INVALIDDATA;
853
1.48k
        }
854
855
        // when flag is not present, picture is inferred to be output
856
178k
        sh->pic_output_flag = 1;
857
178k
        if (pps->output_flag_present_flag)
858
6.34k
            sh->pic_output_flag = get_bits1(gb);
859
860
178k
        if (sps->separate_colour_plane)
861
13.6k
            sh->colour_plane_id = get_bits(gb, 2);
862
863
178k
        if (!IS_IDR(s) ||
864
64.5k
            (s->nuh_layer_id > 0 &&
865
113k
             !(vps->poc_lsb_not_present & (1 << layer_idx)))) {
866
113k
            int poc;
867
868
113k
            sh->pic_order_cnt_lsb = get_bits(gb, sps->log2_max_poc_lsb);
869
113k
            poc = ff_hevc_compute_poc(sps, s->poc_tid0, sh->pic_order_cnt_lsb, s->nal_unit_type);
870
113k
            if (!sh->first_slice_in_pic_flag && poc != sh->poc) {
871
21.2k
                av_log(s->avctx, AV_LOG_WARNING,
872
21.2k
                       "Ignoring POC change between slices: %d -> %d\n", poc, sh->poc);
873
21.2k
                if (s->avctx->err_recognition & AV_EF_EXPLODE)
874
26
                    return AVERROR_INVALIDDATA;
875
21.1k
                poc = sh->poc;
876
21.1k
            }
877
113k
            sh->poc = poc;
878
113k
        }
879
880
178k
        if (!IS_IDR(s)) {
881
113k
            int pos;
882
883
113k
            sh->short_term_ref_pic_set_sps_flag = get_bits1(gb);
884
113k
            pos = get_bits_left(gb);
885
113k
            if (!sh->short_term_ref_pic_set_sps_flag) {
886
53.2k
                ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, sps, 1);
887
53.2k
                if (ret < 0)
888
7.17k
                    return ret;
889
890
46.0k
                sh->short_term_rps = &sh->slice_rps;
891
60.5k
            } else {
892
60.5k
                int numbits, rps_idx;
893
894
60.5k
                if (!sps->nb_st_rps) {
895
1.36k
                    av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
896
1.36k
                    return AVERROR_INVALIDDATA;
897
1.36k
                }
898
899
59.1k
                numbits = av_ceil_log2(sps->nb_st_rps);
900
59.1k
                rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
901
59.1k
                sh->short_term_rps = &sps->st_rps[rps_idx];
902
59.1k
            }
903
105k
            sh->short_term_ref_pic_set_size = pos - get_bits_left(gb);
904
905
105k
            pos = get_bits_left(gb);
906
105k
            ret = decode_lt_rps(sps, &sh->long_term_rps, gb, sh->poc, sh->pic_order_cnt_lsb);
907
105k
            if (ret < 0) {
908
6.44k
                av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
909
6.44k
                if (s->avctx->err_recognition & AV_EF_EXPLODE)
910
423
                    return AVERROR_INVALIDDATA;
911
6.44k
            }
912
104k
            sh->long_term_ref_pic_set_size = pos - get_bits_left(gb);
913
914
104k
            if (sps->temporal_mvp_enabled)
915
47.0k
                sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
916
57.8k
            else
917
57.8k
                sh->slice_temporal_mvp_enabled_flag = 0;
918
104k
        } else {
919
64.5k
            sh->poc                             = 0;
920
64.5k
            sh->pic_order_cnt_lsb               = 0;
921
64.5k
            sh->short_term_ref_pic_set_sps_flag = 0;
922
64.5k
            sh->short_term_ref_pic_set_size     = 0;
923
64.5k
            sh->short_term_rps                  = NULL;
924
64.5k
            sh->long_term_ref_pic_set_size      = 0;
925
64.5k
            sh->long_term_rps.nb_refs           = 0;
926
64.5k
            sh->slice_temporal_mvp_enabled_flag = 0;
927
64.5k
        }
928
929
169k
        sh->inter_layer_pred = 0;
930
169k
        if (s->nuh_layer_id > 0) {
931
29
            int num_direct_ref_layers = vps->num_direct_ref_layers[layer_idx];
932
933
29
            if (vps->default_ref_layers_active)
934
9
                sh->inter_layer_pred = !!num_direct_ref_layers;
935
20
            else if (num_direct_ref_layers) {
936
8
                sh->inter_layer_pred = get_bits1(gb);
937
938
8
                if (sh->inter_layer_pred && num_direct_ref_layers > 1) {
939
0
                    av_log(s->avctx, AV_LOG_ERROR,
940
0
                           "NumDirectRefLayers>1 not supported\n");
941
0
                    return AVERROR_PATCHWELCOME;
942
0
                }
943
8
            }
944
29
        }
945
946
169k
        if (sps->sao_enabled) {
947
141k
            sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
948
141k
            if (sps->chroma_format_idc) {
949
128k
                sh->slice_sample_adaptive_offset_flag[1] =
950
128k
                sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
951
128k
            }
952
141k
        } else {
953
27.4k
            sh->slice_sample_adaptive_offset_flag[0] = 0;
954
27.4k
            sh->slice_sample_adaptive_offset_flag[1] = 0;
955
27.4k
            sh->slice_sample_adaptive_offset_flag[2] = 0;
956
27.4k
        }
957
958
169k
        sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
959
169k
        if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) {
960
95.6k
            int nb_refs;
961
962
95.6k
            sh->nb_refs[L0] = pps->num_ref_idx_l0_default_active;
963
95.6k
            if (sh->slice_type == HEVC_SLICE_B)
964
83.9k
                sh->nb_refs[L1] = pps->num_ref_idx_l1_default_active;
965
966
95.6k
            if (get_bits1(gb)) { // num_ref_idx_active_override_flag
967
48.1k
                sh->nb_refs[L0] = get_ue_golomb_31(gb) + 1;
968
48.1k
                if (sh->slice_type == HEVC_SLICE_B)
969
43.1k
                    sh->nb_refs[L1] = get_ue_golomb_31(gb) + 1;
970
48.1k
            }
971
95.6k
            if (sh->nb_refs[L0] >= HEVC_MAX_REFS || sh->nb_refs[L1] >= HEVC_MAX_REFS) {
972
4.57k
                av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
973
4.57k
                       sh->nb_refs[L0], sh->nb_refs[L1]);
974
4.57k
                return AVERROR_INVALIDDATA;
975
4.57k
            }
976
977
91.0k
            sh->rpl_modification_flag[0] = 0;
978
91.0k
            sh->rpl_modification_flag[1] = 0;
979
91.0k
            nb_refs = ff_hevc_frame_nb_refs(sh, pps, layer_idx);
980
91.0k
            if (!nb_refs) {
981
9.76k
                av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
982
9.76k
                return AVERROR_INVALIDDATA;
983
9.76k
            }
984
985
81.3k
            if (pps->lists_modification_present_flag && nb_refs > 1) {
986
11.2k
                sh->rpl_modification_flag[0] = get_bits1(gb);
987
11.2k
                if (sh->rpl_modification_flag[0]) {
988
19.0k
                    for (i = 0; i < sh->nb_refs[L0]; i++)
989
12.8k
                        sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
990
6.15k
                }
991
992
11.2k
                if (sh->slice_type == HEVC_SLICE_B) {
993
9.60k
                    sh->rpl_modification_flag[1] = get_bits1(gb);
994
9.60k
                    if (sh->rpl_modification_flag[1] == 1)
995
12.1k
                        for (i = 0; i < sh->nb_refs[L1]; i++)
996
7.50k
                            sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
997
9.60k
                }
998
11.2k
            }
999
1000
81.3k
            if (sh->slice_type == HEVC_SLICE_B)
1001
70.6k
                sh->mvd_l1_zero_flag = get_bits1(gb);
1002
1003
81.3k
            if (pps->cabac_init_present_flag)
1004
75.3k
                sh->cabac_init_flag = get_bits1(gb);
1005
5.99k
            else
1006
5.99k
                sh->cabac_init_flag = 0;
1007
1008
81.3k
            sh->collocated_ref_idx = 0;
1009
81.3k
            if (sh->slice_temporal_mvp_enabled_flag) {
1010
21.2k
                sh->collocated_list = L0;
1011
21.2k
                if (sh->slice_type == HEVC_SLICE_B)
1012
17.5k
                    sh->collocated_list = !get_bits1(gb);
1013
1014
21.2k
                if (sh->nb_refs[sh->collocated_list] > 1) {
1015
14.2k
                    sh->collocated_ref_idx = get_ue_golomb_long(gb);
1016
14.2k
                    if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
1017
1.00k
                        av_log(s->avctx, AV_LOG_ERROR,
1018
1.00k
                               "Invalid collocated_ref_idx: %d.\n",
1019
1.00k
                               sh->collocated_ref_idx);
1020
1.00k
                        return AVERROR_INVALIDDATA;
1021
1.00k
                    }
1022
14.2k
                }
1023
21.2k
            }
1024
1025
80.3k
            if ((pps->weighted_pred_flag   && sh->slice_type == HEVC_SLICE_P) ||
1026
73.8k
                (pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) {
1027
38.9k
                ret = pred_weight_table(sh, s->avctx, sps, gb);
1028
38.9k
                if (ret < 0)
1029
11.6k
                    return ret;
1030
38.9k
            }
1031
1032
68.6k
            sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
1033
68.6k
            if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
1034
10.0k
                av_log(s->avctx, AV_LOG_ERROR,
1035
10.0k
                       "Invalid number of merging MVP candidates: %d.\n",
1036
10.0k
                       sh->max_num_merge_cand);
1037
10.0k
                return AVERROR_INVALIDDATA;
1038
10.0k
            }
1039
1040
            // Syntax in 7.3.6.1
1041
58.6k
            if (sps->motion_vector_resolution_control_idc == 2)
1042
1.55k
                sh->use_integer_mv_flag = get_bits1(gb);
1043
57.0k
            else
1044
                // Inferred to be equal to motion_vector_resolution_control_idc if not present
1045
57.0k
                sh->use_integer_mv_flag = sps->motion_vector_resolution_control_idc;
1046
1047
58.6k
        }
1048
1049
132k
        sh->slice_qp_delta = get_se_golomb(gb);
1050
1051
132k
        if (pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1052
31.3k
            sh->slice_cb_qp_offset = get_se_golomb(gb);
1053
31.3k
            sh->slice_cr_qp_offset = get_se_golomb(gb);
1054
31.3k
            if (sh->slice_cb_qp_offset < -12 || sh->slice_cb_qp_offset > 12 ||
1055
30.0k
                sh->slice_cr_qp_offset < -12 || sh->slice_cr_qp_offset > 12) {
1056
2.04k
                av_log(s->avctx, AV_LOG_ERROR, "Invalid slice cx qp offset.\n");
1057
2.04k
                return AVERROR_INVALIDDATA;
1058
2.04k
            }
1059
100k
        } else {
1060
100k
            sh->slice_cb_qp_offset = 0;
1061
100k
            sh->slice_cr_qp_offset = 0;
1062
100k
        }
1063
1064
130k
        if (pps->pps_slice_act_qp_offsets_present_flag) {
1065
14.9k
            sh->slice_act_y_qp_offset  = get_se_golomb(gb);
1066
14.9k
            sh->slice_act_cb_qp_offset = get_se_golomb(gb);
1067
14.9k
            sh->slice_act_cr_qp_offset = get_se_golomb(gb);
1068
14.9k
        }
1069
1070
130k
        if (pps->chroma_qp_offset_list_enabled_flag)
1071
11.6k
            sh->cu_chroma_qp_offset_enabled_flag = get_bits1(gb);
1072
118k
        else
1073
118k
            sh->cu_chroma_qp_offset_enabled_flag = 0;
1074
1075
130k
        if (pps->deblocking_filter_control_present_flag) {
1076
33.0k
            int deblocking_filter_override_flag = 0;
1077
1078
33.0k
            if (pps->deblocking_filter_override_enabled_flag)
1079
25.9k
                deblocking_filter_override_flag = get_bits1(gb);
1080
1081
33.0k
            if (deblocking_filter_override_flag) {
1082
16.6k
                sh->disable_deblocking_filter_flag = get_bits1(gb);
1083
16.6k
                if (!sh->disable_deblocking_filter_flag) {
1084
7.55k
                    int beta_offset_div2 = get_se_golomb(gb);
1085
7.55k
                    int tc_offset_div2   = get_se_golomb(gb) ;
1086
7.55k
                    if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1087
7.20k
                        tc_offset_div2   < -6 || tc_offset_div2   > 6) {
1088
1.96k
                        av_log(s->avctx, AV_LOG_ERROR,
1089
1.96k
                            "Invalid deblock filter offsets: %d, %d\n",
1090
1.96k
                            beta_offset_div2, tc_offset_div2);
1091
1.96k
                        return AVERROR_INVALIDDATA;
1092
1.96k
                    }
1093
5.59k
                    sh->beta_offset = beta_offset_div2 * 2;
1094
5.59k
                    sh->tc_offset   =   tc_offset_div2 * 2;
1095
5.59k
                }
1096
16.6k
            } else {
1097
16.3k
                sh->disable_deblocking_filter_flag = pps->disable_dbf;
1098
16.3k
                sh->beta_offset                    = pps->beta_offset;
1099
16.3k
                sh->tc_offset                      = pps->tc_offset;
1100
16.3k
            }
1101
97.2k
        } else {
1102
97.2k
            sh->disable_deblocking_filter_flag = 0;
1103
97.2k
            sh->beta_offset                    = 0;
1104
97.2k
            sh->tc_offset                      = 0;
1105
97.2k
        }
1106
1107
128k
        if (pps->seq_loop_filter_across_slices_enabled_flag &&
1108
99.6k
            (sh->slice_sample_adaptive_offset_flag[0] ||
1109
41.2k
             sh->slice_sample_adaptive_offset_flag[1] ||
1110
93.2k
             !sh->disable_deblocking_filter_flag)) {
1111
93.2k
            sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
1112
93.2k
        } else {
1113
35.0k
            sh->slice_loop_filter_across_slices_enabled_flag = pps->seq_loop_filter_across_slices_enabled_flag;
1114
35.0k
        }
1115
128k
    }
1116
1117
136k
    sh->num_entry_point_offsets = 0;
1118
136k
    if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) {
1119
60.3k
        unsigned num_entry_point_offsets = get_ue_golomb_long(gb);
1120
        // It would be possible to bound this tighter but this here is simpler
1121
60.3k
        if (num_entry_point_offsets > get_bits_left(gb) || num_entry_point_offsets > UINT16_MAX) {
1122
2.58k
            av_log(s->avctx, AV_LOG_ERROR, "num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1123
2.58k
            return AVERROR_INVALIDDATA;
1124
2.58k
        }
1125
1126
57.7k
        sh->num_entry_point_offsets = num_entry_point_offsets;
1127
57.7k
        if (sh->num_entry_point_offsets > 0) {
1128
27.4k
            int offset_len = get_ue_golomb_long(gb) + 1;
1129
1130
27.4k
            if (offset_len < 1 || offset_len > 32) {
1131
1.04k
                sh->num_entry_point_offsets = 0;
1132
1.04k
                av_log(s->avctx, AV_LOG_ERROR, "offset_len %d is invalid\n", offset_len);
1133
1.04k
                return AVERROR_INVALIDDATA;
1134
1.04k
            }
1135
1136
26.3k
            av_freep(&sh->entry_point_offset);
1137
26.3k
            av_freep(&sh->offset);
1138
26.3k
            av_freep(&sh->size);
1139
26.3k
            sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(unsigned));
1140
26.3k
            sh->offset             = av_malloc_array(sh->num_entry_point_offsets + 1, sizeof(int));
1141
26.3k
            sh->size               = av_malloc_array(sh->num_entry_point_offsets + 1, sizeof(int));
1142
26.3k
            if (!sh->entry_point_offset || !sh->offset || !sh->size) {
1143
0
                sh->num_entry_point_offsets = 0;
1144
0
                av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
1145
0
                return AVERROR(ENOMEM);
1146
0
            }
1147
259k
            for (i = 0; i < sh->num_entry_point_offsets; i++) {
1148
233k
                unsigned val = get_bits_long(gb, offset_len);
1149
233k
                sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
1150
233k
            }
1151
26.3k
        }
1152
57.7k
    }
1153
1154
133k
    if (pps->slice_header_extension_present_flag) {
1155
29.4k
        unsigned int length = get_ue_golomb_long(gb);
1156
29.4k
        if (length*8LL > get_bits_left(gb)) {
1157
1.74k
            av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
1158
1.74k
            return AVERROR_INVALIDDATA;
1159
1.74k
        }
1160
138k
        for (i = 0; i < length; i++)
1161
110k
            skip_bits(gb, 8);  // slice_header_extension_data_byte
1162
27.6k
    }
1163
1164
131k
    ret = get_bits1(gb);
1165
131k
    if (!ret && get_bits_left(gb) >= 0) {
1166
20.6k
        av_log(s->avctx, AV_LOG_ERROR, "alignment_bit_equal_to_one=0\n");
1167
20.6k
        return AVERROR_INVALIDDATA;
1168
20.6k
    }
1169
110k
    sh->data_offset = align_get_bits(gb) - gb->buffer;
1170
1171
110k
    if (get_bits_left(gb) < 0) {
1172
1.86k
        av_log(s->avctx, AV_LOG_ERROR,
1173
1.86k
               "Overread slice header by %d bits\n", -get_bits_left(gb));
1174
1.86k
        return AVERROR_INVALIDDATA;
1175
1.86k
    }
1176
1177
    // Inferred parameters
1178
108k
    sh->slice_qp = 26U + pps->pic_init_qp_minus26 + sh->slice_qp_delta;
1179
108k
    if (sh->slice_qp > 51 ||
1180
108k
        sh->slice_qp < -sps->qp_bd_offset) {
1181
8.06k
        av_log(s->avctx, AV_LOG_ERROR,
1182
8.06k
               "The slice_qp %d is outside the valid range "
1183
8.06k
               "[%d, 51].\n",
1184
8.06k
               sh->slice_qp,
1185
8.06k
               -sps->qp_bd_offset);
1186
8.06k
        return AVERROR_INVALIDDATA;
1187
8.06k
    }
1188
1189
100k
    sh->slice_ctb_addr_rs = sh->slice_segment_addr;
1190
1191
100k
    if (sh->dependent_slice_segment_flag &&
1192
8.22k
        (!sh->slice_ctb_addr_rs || !pps->ctb_addr_rs_to_ts[sh->slice_ctb_addr_rs])) {
1193
3
        av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
1194
3
        return AVERROR_INVALIDDATA;
1195
3
    }
1196
1197
100k
    return 0;
1198
100k
}
1199
1200
9.78M
#define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1201
1202
45.5M
#define SET_SAO(elem, value)                            \
1203
45.5M
do {                                                    \
1204
39.0M
    if (!sao_merge_up_flag && !sao_merge_left_flag)     \
1205
39.0M
        sao->elem = value;                              \
1206
39.0M
    else if (sao_merge_left_flag)                       \
1207
5.97M
        sao->elem = CTB(l->sao, rx-1, ry).elem;         \
1208
5.97M
    else if (sao_merge_up_flag)                         \
1209
1.40M
        sao->elem = CTB(l->sao, rx, ry-1).elem;         \
1210
1.40M
    else                                                \
1211
1.40M
        sao->elem = 0;                                  \
1212
39.0M
} while (0)
1213
1214
static void hls_sao_param(HEVCLocalContext *lc, const HEVCLayerContext *l,
1215
                          const HEVCPPS *pps, const HEVCSPS *sps,
1216
                          int rx, int ry)
1217
3.80M
{
1218
3.80M
    const HEVCContext *const s = lc->parent;
1219
3.80M
    int sao_merge_left_flag = 0;
1220
3.80M
    int sao_merge_up_flag   = 0;
1221
3.80M
    SAOParams *sao          = &CTB(l->sao, rx, ry);
1222
3.80M
    int c_idx, i;
1223
1224
3.80M
    if (s->sh.slice_sample_adaptive_offset_flag[0] ||
1225
2.73M
        s->sh.slice_sample_adaptive_offset_flag[1]) {
1226
2.73M
        if (rx > 0) {
1227
2.56M
            if (lc->ctb_left_flag)
1228
2.52M
                sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(lc);
1229
2.56M
        }
1230
2.73M
        if (ry > 0 && !sao_merge_left_flag) {
1231
2.13M
            if (lc->ctb_up_flag)
1232
2.07M
                sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(lc);
1233
2.13M
        }
1234
2.73M
    }
1235
1236
15.1M
    for (c_idx = 0; c_idx < (sps->chroma_format_idc ? 3 : 1); c_idx++) {
1237
11.3M
        int log2_sao_offset_scale = c_idx == 0 ? pps->log2_sao_offset_scale_luma :
1238
11.3M
                                                 pps->log2_sao_offset_scale_chroma;
1239
1240
11.3M
        if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1241
3.60M
            sao->type_idx[c_idx] = SAO_NOT_APPLIED;
1242
3.60M
            continue;
1243
3.60M
        }
1244
1245
7.70M
        if (c_idx == 2) {
1246
2.52M
            sao->type_idx[2] = sao->type_idx[1];
1247
2.52M
            sao->eo_class[2] = sao->eo_class[1];
1248
5.18M
        } else {
1249
5.18M
            SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(lc));
1250
5.18M
        }
1251
1252
7.70M
        if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
1253
1.24M
            continue;
1254
1255
32.3M
        for (i = 0; i < 4; i++)
1256
25.8M
            SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(lc, sps->bit_depth));
1257
1258
6.46M
        if (sao->type_idx[c_idx] == SAO_BAND) {
1259
27.1M
            for (i = 0; i < 4; i++) {
1260
21.7M
                if (sao->offset_abs[c_idx][i]) {
1261
1.90M
                    SET_SAO(offset_sign[c_idx][i],
1262
1.90M
                            ff_hevc_sao_offset_sign_decode(lc));
1263
19.8M
                } else {
1264
19.8M
                    sao->offset_sign[c_idx][i] = 0;
1265
19.8M
                }
1266
21.7M
            }
1267
5.42M
            SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(lc));
1268
5.42M
        } else if (c_idx != 2) {
1269
705k
            SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(lc));
1270
705k
        }
1271
1272
        // Inferred parameters
1273
6.46M
        sao->offset_val[c_idx][0] = 0;
1274
32.3M
        for (i = 0; i < 4; i++) {
1275
25.8M
            sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
1276
25.8M
            if (sao->type_idx[c_idx] == SAO_EDGE) {
1277
4.09M
                if (i > 1)
1278
2.04M
                    sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1279
21.7M
            } else if (sao->offset_sign[c_idx][i]) {
1280
953k
                sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1281
953k
            }
1282
25.8M
            sao->offset_val[c_idx][i + 1] *= 1 << log2_sao_offset_scale;
1283
25.8M
        }
1284
6.46M
    }
1285
3.80M
}
1286
1287
#undef SET_SAO
1288
#undef CTB
1289
1290
static int hls_cross_component_pred(HEVCLocalContext *lc, int idx)
1291
11.9M
{
1292
11.9M
    int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(lc, idx);
1293
1294
11.9M
    if (log2_res_scale_abs_plus1 !=  0) {
1295
6.76M
        int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(lc, idx);
1296
6.76M
        lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
1297
6.76M
                               (1 - 2 * res_scale_sign_flag);
1298
6.76M
    } else {
1299
5.23M
        lc->tu.res_scale_val = 0;
1300
5.23M
    }
1301
1302
1303
11.9M
    return 0;
1304
11.9M
}
1305
1306
static int hls_transform_unit(HEVCLocalContext *lc,
1307
                              const HEVCLayerContext *l,
1308
                              const HEVCPPS *pps, const HEVCSPS *sps,
1309
                              int x0, int y0,
1310
                              int xBase, int yBase, int cb_xBase, int cb_yBase,
1311
                              int log2_cb_size, int log2_trafo_size,
1312
                              int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
1313
114M
{
1314
114M
    const HEVCContext *const s = lc->parent;
1315
114M
    const int log2_trafo_size_c = log2_trafo_size - sps->hshift[1];
1316
114M
    int i;
1317
1318
114M
    if (lc->cu.pred_mode == MODE_INTRA) {
1319
109M
        int trafo_size = 1 << log2_trafo_size;
1320
109M
        ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size, sps->log2_ctb_size);
1321
1322
109M
        s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, x0, y0, 0);
1323
109M
    }
1324
1325
114M
    if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1326
99.3M
        (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1327
99.3M
        int scan_idx   = SCAN_DIAG;
1328
99.3M
        int scan_idx_c = SCAN_DIAG;
1329
99.3M
        int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1330
55.2M
                         (sps->chroma_format_idc == 2 &&
1331
16.4M
                         (cbf_cb[1] || cbf_cr[1]));
1332
1333
99.3M
        if (pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
1334
4.59M
            lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(lc);
1335
4.59M
            if (lc->tu.cu_qp_delta != 0)
1336
2.74M
                if (ff_hevc_cu_qp_delta_sign_flag(lc) == 1)
1337
352k
                    lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1338
4.59M
            lc->tu.is_cu_qp_delta_coded = 1;
1339
1340
4.59M
            if (lc->tu.cu_qp_delta < -(26 + sps->qp_bd_offset / 2) ||
1341
4.59M
                lc->tu.cu_qp_delta >  (25 + sps->qp_bd_offset / 2)) {
1342
2.68k
                av_log(s->avctx, AV_LOG_ERROR,
1343
2.68k
                       "The cu_qp_delta %d is outside the valid range "
1344
2.68k
                       "[%d, %d].\n",
1345
2.68k
                       lc->tu.cu_qp_delta,
1346
2.68k
                       -(26 + sps->qp_bd_offset / 2),
1347
2.68k
                        (25 + sps->qp_bd_offset / 2));
1348
2.68k
                return AVERROR_INVALIDDATA;
1349
2.68k
            }
1350
1351
4.59M
            ff_hevc_set_qPy(lc, l, pps, cb_xBase, cb_yBase, log2_cb_size);
1352
4.59M
        }
1353
1354
99.3M
        if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1355
3.76M
            !lc->cu.cu_transquant_bypass_flag  &&  !lc->tu.is_cu_chroma_qp_offset_coded) {
1356
1.03M
            int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(lc);
1357
1.03M
            if (cu_chroma_qp_offset_flag) {
1358
393k
                int cu_chroma_qp_offset_idx  = 0;
1359
393k
                if (pps->chroma_qp_offset_list_len_minus1 > 0) {
1360
3.96k
                    cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(lc, pps->chroma_qp_offset_list_len_minus1);
1361
3.96k
                    av_log(s->avctx, AV_LOG_ERROR,
1362
3.96k
                        "cu_chroma_qp_offset_idx not yet tested.\n");
1363
3.96k
                }
1364
393k
                lc->tu.cu_qp_offset_cb = pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
1365
393k
                lc->tu.cu_qp_offset_cr = pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
1366
645k
            } else {
1367
645k
                lc->tu.cu_qp_offset_cb = 0;
1368
645k
                lc->tu.cu_qp_offset_cr = 0;
1369
645k
            }
1370
1.03M
            lc->tu.is_cu_chroma_qp_offset_coded = 1;
1371
1.03M
        }
1372
1373
99.3M
        if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1374
92.8M
            if (lc->tu.intra_pred_mode >= 6 &&
1375
23.3M
                lc->tu.intra_pred_mode <= 14) {
1376
5.72M
                scan_idx = SCAN_VERT;
1377
87.1M
            } else if (lc->tu.intra_pred_mode >= 22 &&
1378
13.2M
                       lc->tu.intra_pred_mode <= 30) {
1379
10.8M
                scan_idx = SCAN_HORIZ;
1380
10.8M
            }
1381
1382
92.8M
            if (lc->tu.intra_pred_mode_c >=  6 &&
1383
28.6M
                lc->tu.intra_pred_mode_c <= 14) {
1384
5.98M
                scan_idx_c = SCAN_VERT;
1385
86.9M
            } else if (lc->tu.intra_pred_mode_c >= 22 &&
1386
19.7M
                       lc->tu.intra_pred_mode_c <= 30) {
1387
10.6M
                scan_idx_c = SCAN_HORIZ;
1388
10.6M
            }
1389
92.8M
        }
1390
1391
99.3M
        lc->tu.cross_pf = 0;
1392
1393
99.3M
        if (cbf_luma)
1394
90.1M
            ff_hevc_hls_residual_coding(lc, pps, x0, y0, log2_trafo_size, scan_idx, 0);
1395
99.3M
        if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) {
1396
42.3M
            int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]);
1397
42.3M
            int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]);
1398
42.3M
            lc->tu.cross_pf  = (pps->cross_component_prediction_enabled_flag && cbf_luma &&
1399
7.44M
                                (lc->cu.pred_mode == MODE_INTER ||
1400
7.14M
                                 (lc->tu.chroma_mode_c ==  4)));
1401
1402
42.3M
            if (lc->tu.cross_pf) {
1403
5.99M
                hls_cross_component_pred(lc, 0);
1404
5.99M
            }
1405
95.8M
            for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1406
53.5M
                if (lc->cu.pred_mode == MODE_INTRA) {
1407
52.4M
                    ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c),
1408
52.4M
                                                    trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1409
52.4M
                    s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 1);
1410
52.4M
                }
1411
53.5M
                if (cbf_cb[i])
1412
10.5M
                    ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c),
1413
10.5M
                                                log2_trafo_size_c, scan_idx_c, 1);
1414
42.9M
                else
1415
42.9M
                    if (lc->tu.cross_pf) {
1416
4.78M
                        ptrdiff_t stride = s->cur_frame->f->linesize[1];
1417
4.78M
                        int hshift = sps->hshift[1];
1418
4.78M
                        int vshift = sps->vshift[1];
1419
4.78M
                        const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1420
4.78M
                        int16_t *coeffs   = (int16_t*)lc->edge_emu_buffer2;
1421
4.78M
                        int size = 1 << log2_trafo_size_c;
1422
1423
4.78M
                        uint8_t *dst = &s->cur_frame->f->data[1][(y0 >> vshift) * stride +
1424
4.78M
                                                              ((x0 >> hshift) << sps->pixel_shift)];
1425
247M
                        for (i = 0; i < (size * size); i++) {
1426
242M
                            coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1427
242M
                        }
1428
4.78M
                        s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1429
4.78M
                    }
1430
53.5M
            }
1431
1432
42.3M
            if (lc->tu.cross_pf) {
1433
5.99M
                hls_cross_component_pred(lc, 1);
1434
5.99M
            }
1435
95.8M
            for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1436
53.5M
                if (lc->cu.pred_mode == MODE_INTRA) {
1437
52.4M
                    ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c),
1438
52.4M
                                                    trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1439
52.4M
                    s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 2);
1440
52.4M
                }
1441
53.5M
                if (cbf_cr[i])
1442
10.5M
                    ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c),
1443
10.5M
                                                log2_trafo_size_c, scan_idx_c, 2);
1444
42.9M
                else
1445
42.9M
                    if (lc->tu.cross_pf) {
1446
4.78M
                        ptrdiff_t stride = s->cur_frame->f->linesize[2];
1447
4.78M
                        int hshift = sps->hshift[2];
1448
4.78M
                        int vshift = sps->vshift[2];
1449
4.78M
                        const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1450
4.78M
                        int16_t *coeffs   = (int16_t*)lc->edge_emu_buffer2;
1451
4.78M
                        int size = 1 << log2_trafo_size_c;
1452
1453
4.78M
                        uint8_t *dst = &s->cur_frame->f->data[2][(y0 >> vshift) * stride +
1454
4.78M
                                                          ((x0 >> hshift) << sps->pixel_shift)];
1455
247M
                        for (i = 0; i < (size * size); i++) {
1456
242M
                            coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1457
242M
                        }
1458
4.78M
                        s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1459
4.78M
                    }
1460
53.5M
            }
1461
56.9M
        } else if (sps->chroma_format_idc && blk_idx == 3) {
1462
13.7M
            int trafo_size_h = 1 << (log2_trafo_size + 1);
1463
13.7M
            int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]);
1464
32.3M
            for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1465
18.5M
                if (lc->cu.pred_mode == MODE_INTRA) {
1466
18.4M
                    ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size),
1467
18.4M
                                                    trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1468
18.4M
                    s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 1);
1469
18.4M
                }
1470
18.5M
                if (cbf_cb[i])
1471
10.9M
                    ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size),
1472
10.9M
                                                log2_trafo_size, scan_idx_c, 1);
1473
18.5M
            }
1474
32.3M
            for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1475
18.5M
                if (lc->cu.pred_mode == MODE_INTRA) {
1476
18.4M
                    ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size),
1477
18.4M
                                                trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1478
18.4M
                    s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 2);
1479
18.4M
                }
1480
18.5M
                if (cbf_cr[i])
1481
10.9M
                    ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size),
1482
10.9M
                                                log2_trafo_size, scan_idx_c, 2);
1483
18.5M
            }
1484
13.7M
        }
1485
99.3M
    } else if (sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) {
1486
11.7M
        if (log2_trafo_size > 2 || sps->chroma_format_idc == 3) {
1487
3.70M
            int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]);
1488
3.70M
            int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]);
1489
3.70M
            ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v,
1490
3.70M
                                            sps->log2_ctb_size);
1491
3.70M
            s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 1);
1492
3.70M
            s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 2);
1493
3.70M
            if (sps->chroma_format_idc == 2) {
1494
676k
                ff_hevc_set_neighbour_available(lc, x0, y0 + (1 << log2_trafo_size_c),
1495
676k
                                                trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1496
676k
                s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1497
676k
                s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1498
676k
            }
1499
8.07M
        } else if (blk_idx == 3) {
1500
2.01M
            int trafo_size_h = 1 << (log2_trafo_size + 1);
1501
2.01M
            int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]);
1502
2.01M
            ff_hevc_set_neighbour_available(lc, xBase, yBase,
1503
2.01M
                                            trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1504
2.01M
            s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 1);
1505
2.01M
            s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 2);
1506
2.01M
            if (sps->chroma_format_idc == 2) {
1507
907k
                ff_hevc_set_neighbour_available(lc, xBase, yBase + (1 << log2_trafo_size),
1508
907k
                                                trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1509
907k
                s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 1);
1510
907k
                s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 2);
1511
907k
            }
1512
2.01M
        }
1513
11.7M
    }
1514
1515
114M
    return 0;
1516
114M
}
1517
1518
static void set_deblocking_bypass(uint8_t *is_pcm, const HEVCSPS *sps,
1519
                                  int x0, int y0, int log2_cb_size)
1520
9.85M
{
1521
9.85M
    int cb_size          = 1 << log2_cb_size;
1522
9.85M
    int log2_min_pu_size = sps->log2_min_pu_size;
1523
1524
9.85M
    int min_pu_width     = sps->min_pu_width;
1525
9.85M
    int x_end = FFMIN(x0 + cb_size, sps->width);
1526
9.85M
    int y_end = FFMIN(y0 + cb_size, sps->height);
1527
9.85M
    int i, j;
1528
1529
28.3M
    for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1530
83.3M
        for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1531
64.8M
            is_pcm[i + j * min_pu_width] = 2;
1532
9.85M
}
1533
1534
static int hls_transform_tree(HEVCLocalContext *lc,
1535
                              const HEVCLayerContext *l,
1536
                              const HEVCPPS *pps, const HEVCSPS *sps,
1537
                              int x0, int y0,
1538
                              int xBase, int yBase, int cb_xBase, int cb_yBase,
1539
                              int log2_cb_size, int log2_trafo_size,
1540
                              int trafo_depth, int blk_idx,
1541
                              const int *base_cbf_cb, const int *base_cbf_cr)
1542
135M
{
1543
135M
    const HEVCContext *const s = lc->parent;
1544
135M
    uint8_t split_transform_flag;
1545
135M
    int cbf_cb[2];
1546
135M
    int cbf_cr[2];
1547
135M
    int ret;
1548
1549
135M
    cbf_cb[0] = base_cbf_cb[0];
1550
135M
    cbf_cb[1] = base_cbf_cb[1];
1551
135M
    cbf_cr[0] = base_cbf_cr[0];
1552
135M
    cbf_cr[1] = base_cbf_cr[1];
1553
1554
135M
    if (lc->cu.intra_split_flag) {
1555
76.3M
        if (trafo_depth == 1) {
1556
59.7M
            lc->tu.intra_pred_mode   = lc->pu.intra_pred_mode[blk_idx];
1557
59.7M
            if (sps->chroma_format_idc == 3) {
1558
8.18M
                lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1559
8.18M
                lc->tu.chroma_mode_c     = lc->pu.chroma_mode_c[blk_idx];
1560
51.5M
            } else {
1561
51.5M
                lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1562
51.5M
                lc->tu.chroma_mode_c     = lc->pu.chroma_mode_c[0];
1563
51.5M
            }
1564
59.7M
        }
1565
76.3M
    } else {
1566
58.9M
        lc->tu.intra_pred_mode   = lc->pu.intra_pred_mode[0];
1567
58.9M
        lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1568
58.9M
        lc->tu.chroma_mode_c     = lc->pu.chroma_mode_c[0];
1569
58.9M
    }
1570
1571
135M
    if (log2_trafo_size <= sps->log2_max_trafo_size &&
1572
132M
        log2_trafo_size >  sps->log2_min_tb_size    &&
1573
56.6M
        trafo_depth     < lc->cu.max_trafo_depth       &&
1574
45.3M
        !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1575
30.5M
        split_transform_flag = ff_hevc_split_transform_flag_decode(lc, log2_trafo_size);
1576
104M
    } else {
1577
104M
        int inter_split = sps->max_transform_hierarchy_depth_inter == 0 &&
1578
32.4M
                          lc->cu.pred_mode == MODE_INTER &&
1579
3.34M
                          lc->cu.part_mode != PART_2Nx2N &&
1580
872k
                          trafo_depth == 0;
1581
1582
104M
        split_transform_flag = log2_trafo_size > sps->log2_max_trafo_size ||
1583
102M
                               (lc->cu.intra_split_flag && trafo_depth == 0) ||
1584
87.5M
                               inter_split;
1585
104M
    }
1586
1587
135M
    if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) {
1588
66.9M
        if (trafo_depth == 0 || cbf_cb[0]) {
1589
57.6M
            cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1590
57.6M
            if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1591
16.8M
                cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1592
16.8M
            }
1593
57.6M
        }
1594
1595
66.9M
        if (trafo_depth == 0 || cbf_cr[0]) {
1596
57.6M
            cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1597
57.6M
            if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1598
16.8M
                cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1599
16.8M
            }
1600
57.6M
        }
1601
66.9M
    }
1602
1603
135M
    if (split_transform_flag) {
1604
20.9M
        const int trafo_size_split = 1 << (log2_trafo_size - 1);
1605
20.9M
        const int x1 = x0 + trafo_size_split;
1606
20.9M
        const int y1 = y0 + trafo_size_split;
1607
1608
83.6M
#define SUBDIVIDE(x, y, idx)                                                    \
1609
83.6M
do {                                                                            \
1610
83.6M
    ret = hls_transform_tree(lc, l, pps, sps,                                   \
1611
83.6M
                             x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size,    \
1612
83.6M
                             log2_trafo_size - 1, trafo_depth + 1, idx,         \
1613
83.6M
                             cbf_cb, cbf_cr);                                   \
1614
83.6M
    if (ret < 0)                                                                \
1615
83.6M
        return ret;                                                             \
1616
83.6M
} while (0)
1617
1618
20.9M
        SUBDIVIDE(x0, y0, 0);
1619
20.9M
        SUBDIVIDE(x1, y0, 1);
1620
20.9M
        SUBDIVIDE(x0, y1, 2);
1621
20.9M
        SUBDIVIDE(x1, y1, 3);
1622
1623
20.9M
#undef SUBDIVIDE
1624
114M
    } else {
1625
114M
        int min_tu_size      = 1 << sps->log2_min_tb_size;
1626
114M
        int log2_min_tu_size = sps->log2_min_tb_size;
1627
114M
        int min_tu_width     = sps->min_tb_width;
1628
114M
        int cbf_luma         = 1;
1629
1630
114M
        if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1631
703k
            cbf_cb[0] || cbf_cr[0] ||
1632
113M
            (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1633
113M
            cbf_luma = ff_hevc_cbf_luma_decode(lc, trafo_depth);
1634
113M
        }
1635
1636
114M
        ret = hls_transform_unit(lc, l, pps, sps,
1637
114M
                                 x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1638
114M
                                 log2_cb_size, log2_trafo_size,
1639
114M
                                 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1640
114M
        if (ret < 0)
1641
2.68k
            return ret;
1642
        // TODO: store cbf_luma somewhere else
1643
114M
        if (cbf_luma) {
1644
90.1M
            int i, j;
1645
230M
            for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1646
468M
                for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1647
327M
                    int x_tu = (x0 + j) >> log2_min_tu_size;
1648
327M
                    int y_tu = (y0 + i) >> log2_min_tu_size;
1649
327M
                    l->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1650
327M
                }
1651
90.1M
        }
1652
114M
        if (!s->sh.disable_deblocking_filter_flag) {
1653
102M
            ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_trafo_size);
1654
102M
            if (pps->transquant_bypass_enable_flag &&
1655
10.7M
                lc->cu.cu_transquant_bypass_flag)
1656
6.48M
                set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_trafo_size);
1657
102M
        }
1658
114M
    }
1659
135M
    return 0;
1660
135M
}
1661
1662
static int hls_pcm_sample(HEVCLocalContext *lc, const HEVCLayerContext *l,
1663
                          const HEVCPPS *pps, int x0, int y0, int log2_cb_size)
1664
3.99k
{
1665
3.99k
    const HEVCContext *const s = lc->parent;
1666
3.99k
    const HEVCSPS   *const sps = pps->sps;
1667
3.99k
    GetBitContext gb;
1668
3.99k
    int cb_size   = 1 << log2_cb_size;
1669
3.99k
    ptrdiff_t stride0 = s->cur_frame->f->linesize[0];
1670
3.99k
    uint8_t *dst0 = &s->cur_frame->f->data[0][y0 * stride0 + (x0 << sps->pixel_shift)];
1671
1672
3.99k
    int length         = cb_size * cb_size * sps->pcm.bit_depth + (sps->chroma_format_idc != 0 ?
1673
3.88k
                         (((cb_size >> sps->hshift[1]) * (cb_size >> sps->vshift[1])) +
1674
3.88k
                          ((cb_size >> sps->hshift[2]) * (cb_size >> sps->vshift[2]))) *
1675
3.88k
                          sps->pcm.bit_depth_chroma : 0);
1676
3.99k
    const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1677
3.99k
    int ret;
1678
1679
3.99k
    if (!s->sh.disable_deblocking_filter_flag)
1680
3.76k
        ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
1681
1682
3.99k
    ret = init_get_bits(&gb, pcm, length);
1683
3.99k
    if (ret < 0)
1684
2.16k
        return ret;
1685
1686
1.83k
    s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, sps->pcm.bit_depth);
1687
1.83k
    if (sps->chroma_format_idc) {
1688
1.74k
        ptrdiff_t stride1 = s->cur_frame->f->linesize[1];
1689
1.74k
        ptrdiff_t stride2 = s->cur_frame->f->linesize[2];
1690
1.74k
        uint8_t *dst1 = &s->cur_frame->f->data[1][(y0 >> sps->vshift[1]) * stride1 + ((x0 >> sps->hshift[1]) << sps->pixel_shift)];
1691
1.74k
        uint8_t *dst2 = &s->cur_frame->f->data[2][(y0 >> sps->vshift[2]) * stride2 + ((x0 >> sps->hshift[2]) << sps->pixel_shift)];
1692
1693
1.74k
        s->hevcdsp.put_pcm(dst1, stride1,
1694
1.74k
                           cb_size >> sps->hshift[1],
1695
1.74k
                           cb_size >> sps->vshift[1],
1696
1.74k
                           &gb, sps->pcm.bit_depth_chroma);
1697
1.74k
        s->hevcdsp.put_pcm(dst2, stride2,
1698
1.74k
                           cb_size >> sps->hshift[2],
1699
1.74k
                           cb_size >> sps->vshift[2],
1700
1.74k
                           &gb, sps->pcm.bit_depth_chroma);
1701
1.74k
    }
1702
1703
1.83k
    return 0;
1704
3.99k
}
1705
1706
/**
1707
 * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1708
 *
1709
 * @param s HEVC decoding context
1710
 * @param dst target buffer for block data at block position
1711
 * @param dststride stride of the dst buffer
1712
 * @param ref reference picture buffer at origin (0, 0)
1713
 * @param mv motion vector (relative to block position) to get pixel data from
1714
 * @param x_off horizontal position of block from origin (0, 0)
1715
 * @param y_off vertical position of block from origin (0, 0)
1716
 * @param block_w width of block
1717
 * @param block_h height of block
1718
 * @param luma_weight weighting factor applied to the luma prediction
1719
 * @param luma_offset additive offset applied to the luma prediction value
1720
 */
1721
1722
static void luma_mc_uni(HEVCLocalContext *lc,
1723
                        const HEVCPPS *pps, const HEVCSPS *sps,
1724
                        uint8_t *dst, ptrdiff_t dststride,
1725
                        const AVFrame *ref, const Mv *mv, int x_off, int y_off,
1726
                        int block_w, int block_h, int luma_weight, int luma_offset)
1727
3.49M
{
1728
3.49M
    const HEVCContext *const s = lc->parent;
1729
3.49M
    const uint8_t *src   = ref->data[0];
1730
3.49M
    ptrdiff_t srcstride  = ref->linesize[0];
1731
3.49M
    int pic_width        = sps->width;
1732
3.49M
    int pic_height       = sps->height;
1733
3.49M
    int mx               = mv->x & 3;
1734
3.49M
    int my               = mv->y & 3;
1735
3.49M
    int weight_flag      = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1736
2.68M
                           (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1737
3.49M
    int idx              = hevc_pel_weight[block_w];
1738
1739
3.49M
    x_off += mv->x >> 2;
1740
3.49M
    y_off += mv->y >> 2;
1741
3.49M
    src   += y_off * srcstride + (x_off * (1 << sps->pixel_shift));
1742
1743
3.49M
    if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1744
3.35M
        x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1745
3.28M
        y_off >= pic_height - block_h - QPEL_EXTRA_AFTER ||
1746
3.11M
        ref == s->cur_frame->f) {
1747
1.83M
        const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1748
1.83M
        int offset     = QPEL_EXTRA_BEFORE * srcstride       + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1749
1.83M
        int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1750
1751
1.83M
        s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1752
1.83M
                                 edge_emu_stride, srcstride,
1753
1.83M
                                 block_w + QPEL_EXTRA,
1754
1.83M
                                 block_h + QPEL_EXTRA,
1755
1.83M
                                 x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1756
1.83M
                                 pic_width, pic_height);
1757
1.83M
        src = lc->edge_emu_buffer + buf_offset;
1758
1.83M
        srcstride = edge_emu_stride;
1759
1.83M
    }
1760
1761
3.49M
    if (!weight_flag)
1762
2.20M
        s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1763
2.20M
                                                      block_h, mx, my, block_w);
1764
1.29M
    else
1765
1.29M
        s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1766
1.29M
                                                        block_h, s->sh.luma_log2_weight_denom,
1767
1.29M
                                                        luma_weight, luma_offset, mx, my, block_w);
1768
3.49M
}
1769
1770
/**
1771
 * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1772
 *
1773
 * @param s HEVC decoding context
1774
 * @param dst target buffer for block data at block position
1775
 * @param dststride stride of the dst buffer
1776
 * @param ref0 reference picture0 buffer at origin (0, 0)
1777
 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1778
 * @param x_off horizontal position of block from origin (0, 0)
1779
 * @param y_off vertical position of block from origin (0, 0)
1780
 * @param block_w width of block
1781
 * @param block_h height of block
1782
 * @param ref1 reference picture1 buffer at origin (0, 0)
1783
 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1784
 * @param current_mv current motion vector structure
1785
 */
1786
static void luma_mc_bi(HEVCLocalContext *lc,
1787
                       const HEVCPPS *pps, const HEVCSPS *sps,
1788
                       uint8_t *dst, ptrdiff_t dststride,
1789
                        const AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1790
                        int block_w, int block_h, const AVFrame *ref1,
1791
                        const Mv *mv1, struct MvField *current_mv)
1792
2.86M
{
1793
2.86M
    const HEVCContext *const s = lc->parent;
1794
2.86M
    ptrdiff_t src0stride  = ref0->linesize[0];
1795
2.86M
    ptrdiff_t src1stride  = ref1->linesize[0];
1796
2.86M
    int pic_width        = sps->width;
1797
2.86M
    int pic_height       = sps->height;
1798
2.86M
    int mx0              = mv0->x & 3;
1799
2.86M
    int my0              = mv0->y & 3;
1800
2.86M
    int mx1              = mv1->x & 3;
1801
2.86M
    int my1              = mv1->y & 3;
1802
2.86M
    int weight_flag      = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1803
2.86M
                           (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1804
2.86M
    int x_off0           = x_off + (mv0->x >> 2);
1805
2.86M
    int y_off0           = y_off + (mv0->y >> 2);
1806
2.86M
    int x_off1           = x_off + (mv1->x >> 2);
1807
2.86M
    int y_off1           = y_off + (mv1->y >> 2);
1808
2.86M
    int idx              = hevc_pel_weight[block_w];
1809
1810
2.86M
    const uint8_t *src0  = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << sps->pixel_shift);
1811
2.86M
    const uint8_t *src1  = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << sps->pixel_shift);
1812
1813
2.86M
    if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1814
2.67M
        x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1815
2.59M
        y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1816
469k
        const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1817
469k
        int offset     = QPEL_EXTRA_BEFORE * src0stride      + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1818
469k
        int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1819
1820
469k
        s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1821
469k
                                 edge_emu_stride, src0stride,
1822
469k
                                 block_w + QPEL_EXTRA,
1823
469k
                                 block_h + QPEL_EXTRA,
1824
469k
                                 x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1825
469k
                                 pic_width, pic_height);
1826
469k
        src0 = lc->edge_emu_buffer + buf_offset;
1827
469k
        src0stride = edge_emu_stride;
1828
469k
    }
1829
1830
2.86M
    if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1831
2.67M
        x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1832
2.59M
        y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1833
470k
        const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1834
470k
        int offset     = QPEL_EXTRA_BEFORE * src1stride      + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1835
470k
        int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1836
1837
470k
        s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1838
470k
                                 edge_emu_stride, src1stride,
1839
470k
                                 block_w + QPEL_EXTRA,
1840
470k
                                 block_h + QPEL_EXTRA,
1841
470k
                                 x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1842
470k
                                 pic_width, pic_height);
1843
470k
        src1 = lc->edge_emu_buffer2 + buf_offset;
1844
470k
        src1stride = edge_emu_stride;
1845
470k
    }
1846
1847
2.86M
    s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->tmp, src0, src0stride,
1848
2.86M
                                                block_h, mx0, my0, block_w);
1849
2.86M
    if (!weight_flag)
1850
1.97M
        s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1851
1.97M
                                                       block_h, mx1, my1, block_w);
1852
893k
    else
1853
893k
        s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1854
893k
                                                         block_h, s->sh.luma_log2_weight_denom,
1855
893k
                                                         s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1856
893k
                                                         s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1857
893k
                                                         s->sh.luma_offset_l0[current_mv->ref_idx[0]] +
1858
893k
                                                         s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1859
893k
                                                         mx1, my1, block_w);
1860
1861
2.86M
}
1862
1863
/**
1864
 * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1865
 *
1866
 * @param s HEVC decoding context
1867
 * @param dst1 target buffer for block data at block position (U plane)
1868
 * @param dst2 target buffer for block data at block position (V plane)
1869
 * @param dststride stride of the dst1 and dst2 buffers
1870
 * @param ref reference picture buffer at origin (0, 0)
1871
 * @param mv motion vector (relative to block position) to get pixel data from
1872
 * @param x_off horizontal position of block from origin (0, 0)
1873
 * @param y_off vertical position of block from origin (0, 0)
1874
 * @param block_w width of block
1875
 * @param block_h height of block
1876
 * @param chroma_weight weighting factor applied to the chroma prediction
1877
 * @param chroma_offset additive offset applied to the chroma prediction value
1878
 */
1879
1880
static void chroma_mc_uni(HEVCLocalContext *lc,
1881
                          const HEVCPPS *pps, const HEVCSPS *sps,
1882
                          uint8_t *dst0,
1883
                          ptrdiff_t dststride, const uint8_t *src0, ptrdiff_t srcstride, int reflist,
1884
                          int x_off, int y_off, int block_w, int block_h,
1885
                          const struct MvField *current_mv, int chroma_weight, int chroma_offset)
1886
6.96M
{
1887
6.96M
    const HEVCContext *const s = lc->parent;
1888
6.96M
    int pic_width        = sps->width >> sps->hshift[1];
1889
6.96M
    int pic_height       = sps->height >> sps->vshift[1];
1890
6.96M
    const Mv *mv         = &current_mv->mv[reflist];
1891
6.96M
    int weight_flag      = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1892
5.34M
                           (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1893
6.96M
    int idx              = hevc_pel_weight[block_w];
1894
6.96M
    int hshift           = sps->hshift[1];
1895
6.96M
    int vshift           = sps->vshift[1];
1896
6.96M
    intptr_t mx          = av_zero_extend(mv->x, 2 + hshift);
1897
6.96M
    intptr_t my          = av_zero_extend(mv->y, 2 + vshift);
1898
6.96M
    intptr_t _mx         = mx << (1 - hshift);
1899
6.96M
    intptr_t _my         = my << (1 - vshift);
1900
6.96M
    int emu              = src0 == s->cur_frame->f->data[1] || src0 == s->cur_frame->f->data[2];
1901
1902
6.96M
    x_off += mv->x >> (2 + hshift);
1903
6.96M
    y_off += mv->y >> (2 + vshift);
1904
6.96M
    src0  += y_off * srcstride + (x_off * (1 << sps->pixel_shift));
1905
1906
6.96M
    if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1907
6.67M
        x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1908
6.53M
        y_off >= pic_height - block_h - EPEL_EXTRA_AFTER ||
1909
6.21M
        emu) {
1910
3.62M
        const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1911
3.62M
        int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << sps->pixel_shift));
1912
3.62M
        int buf_offset0 = EPEL_EXTRA_BEFORE *
1913
3.62M
                          (edge_emu_stride + (1 << sps->pixel_shift));
1914
3.62M
        s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1915
3.62M
                                 edge_emu_stride, srcstride,
1916
3.62M
                                 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1917
3.62M
                                 x_off - EPEL_EXTRA_BEFORE,
1918
3.62M
                                 y_off - EPEL_EXTRA_BEFORE,
1919
3.62M
                                 pic_width, pic_height);
1920
1921
3.62M
        src0 = lc->edge_emu_buffer + buf_offset0;
1922
3.62M
        srcstride = edge_emu_stride;
1923
3.62M
    }
1924
6.96M
    if (!weight_flag)
1925
4.40M
        s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1926
4.40M
                                                  block_h, _mx, _my, block_w);
1927
2.55M
    else
1928
2.55M
        s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1929
2.55M
                                                        block_h, s->sh.chroma_log2_weight_denom,
1930
2.55M
                                                        chroma_weight, chroma_offset, _mx, _my, block_w);
1931
6.96M
}
1932
1933
/**
1934
 * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1935
 *
1936
 * @param s HEVC decoding context
1937
 * @param dst target buffer for block data at block position
1938
 * @param dststride stride of the dst buffer
1939
 * @param ref0 reference picture0 buffer at origin (0, 0)
1940
 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1941
 * @param x_off horizontal position of block from origin (0, 0)
1942
 * @param y_off vertical position of block from origin (0, 0)
1943
 * @param block_w width of block
1944
 * @param block_h height of block
1945
 * @param ref1 reference picture1 buffer at origin (0, 0)
1946
 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1947
 * @param current_mv current motion vector structure
1948
 * @param cidx chroma component(cb, cr)
1949
 */
1950
static void chroma_mc_bi(HEVCLocalContext *lc,
1951
                         const HEVCPPS *pps, const HEVCSPS *sps,
1952
                         uint8_t *dst0, ptrdiff_t dststride,
1953
                         const AVFrame *ref0, const AVFrame *ref1,
1954
                         int x_off, int y_off, int block_w, int block_h, const MvField *current_mv, int cidx)
1955
5.67M
{
1956
5.67M
    const HEVCContext *const s = lc->parent;
1957
5.67M
    const uint8_t *src1  = ref0->data[cidx+1];
1958
5.67M
    const uint8_t *src2  = ref1->data[cidx+1];
1959
5.67M
    ptrdiff_t src1stride = ref0->linesize[cidx+1];
1960
5.67M
    ptrdiff_t src2stride = ref1->linesize[cidx+1];
1961
5.67M
    int weight_flag      = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1962
5.67M
                           (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1963
5.67M
    int pic_width        = sps->width >> sps->hshift[1];
1964
5.67M
    int pic_height       = sps->height >> sps->vshift[1];
1965
5.67M
    const Mv *const mv0  = &current_mv->mv[0];
1966
5.67M
    const Mv *const mv1  = &current_mv->mv[1];
1967
5.67M
    int hshift = sps->hshift[1];
1968
5.67M
    int vshift = sps->vshift[1];
1969
1970
5.67M
    intptr_t mx0 = av_zero_extend(mv0->x, 2 + hshift);
1971
5.67M
    intptr_t my0 = av_zero_extend(mv0->y, 2 + vshift);
1972
5.67M
    intptr_t mx1 = av_zero_extend(mv1->x, 2 + hshift);
1973
5.67M
    intptr_t my1 = av_zero_extend(mv1->y, 2 + vshift);
1974
5.67M
    intptr_t _mx0 = mx0 << (1 - hshift);
1975
5.67M
    intptr_t _my0 = my0 << (1 - vshift);
1976
5.67M
    intptr_t _mx1 = mx1 << (1 - hshift);
1977
5.67M
    intptr_t _my1 = my1 << (1 - vshift);
1978
1979
5.67M
    int x_off0 = x_off + (mv0->x >> (2 + hshift));
1980
5.67M
    int y_off0 = y_off + (mv0->y >> (2 + vshift));
1981
5.67M
    int x_off1 = x_off + (mv1->x >> (2 + hshift));
1982
5.67M
    int y_off1 = y_off + (mv1->y >> (2 + vshift));
1983
5.67M
    int idx = hevc_pel_weight[block_w];
1984
5.67M
    src1  += y_off0 * src1stride + (int)((unsigned)x_off0 << sps->pixel_shift);
1985
5.67M
    src2  += y_off1 * src2stride + (int)((unsigned)x_off1 << sps->pixel_shift);
1986
1987
5.67M
    if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
1988
5.30M
        x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1989
5.14M
        y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1990
919k
        const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1991
919k
        int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << sps->pixel_shift));
1992
919k
        int buf_offset1 = EPEL_EXTRA_BEFORE *
1993
919k
                          (edge_emu_stride + (1 << sps->pixel_shift));
1994
1995
919k
        s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1996
919k
                                 edge_emu_stride, src1stride,
1997
919k
                                 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1998
919k
                                 x_off0 - EPEL_EXTRA_BEFORE,
1999
919k
                                 y_off0 - EPEL_EXTRA_BEFORE,
2000
919k
                                 pic_width, pic_height);
2001
2002
919k
        src1 = lc->edge_emu_buffer + buf_offset1;
2003
919k
        src1stride = edge_emu_stride;
2004
919k
    }
2005
2006
5.67M
    if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
2007
5.29M
        x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
2008
5.14M
        y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
2009
922k
        const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
2010
922k
        int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << sps->pixel_shift));
2011
922k
        int buf_offset1 = EPEL_EXTRA_BEFORE *
2012
922k
                          (edge_emu_stride + (1 << sps->pixel_shift));
2013
2014
922k
        s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
2015
922k
                                 edge_emu_stride, src2stride,
2016
922k
                                 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
2017
922k
                                 x_off1 - EPEL_EXTRA_BEFORE,
2018
922k
                                 y_off1 - EPEL_EXTRA_BEFORE,
2019
922k
                                 pic_width, pic_height);
2020
2021
922k
        src2 = lc->edge_emu_buffer2 + buf_offset1;
2022
922k
        src2stride = edge_emu_stride;
2023
922k
    }
2024
2025
5.67M
    s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->tmp, src1, src1stride,
2026
5.67M
                                                block_h, _mx0, _my0, block_w);
2027
5.67M
    if (!weight_flag)
2028
3.93M
        s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->cur_frame->f->linesize[cidx+1],
2029
3.93M
                                                       src2, src2stride, lc->tmp,
2030
3.93M
                                                       block_h, _mx1, _my1, block_w);
2031
1.74M
    else
2032
1.74M
        s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->cur_frame->f->linesize[cidx+1],
2033
1.74M
                                                         src2, src2stride, lc->tmp,
2034
1.74M
                                                         block_h,
2035
1.74M
                                                         s->sh.chroma_log2_weight_denom,
2036
1.74M
                                                         s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
2037
1.74M
                                                         s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
2038
1.74M
                                                         s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx] +
2039
1.74M
                                                         s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
2040
1.74M
                                                         _mx1, _my1, block_w);
2041
5.67M
}
2042
2043
static void hevc_await_progress(const HEVCContext *s, const HEVCFrame *ref,
2044
                                const Mv *mv, int y0, int height)
2045
9.22M
{
2046
9.22M
    if (s->avctx->active_thread_type == FF_THREAD_FRAME ) {
2047
0
        int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
2048
2049
0
        ff_progress_frame_await(&ref->tf, y);
2050
0
    }
2051
9.22M
}
2052
2053
static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc,
2054
                                  const HEVCPPS *pps, const HEVCSPS *sps,
2055
                                  int x0, int y0, int nPbW,
2056
                                  int nPbH, int log2_cb_size, int part_idx,
2057
                                  int merge_idx, MvField *mv)
2058
1.20M
{
2059
1.20M
    const HEVCContext *const s = lc->parent;
2060
1.20M
    enum InterPredIdc inter_pred_idc = PRED_L0;
2061
1.20M
    int mvp_flag;
2062
2063
1.20M
    ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH, sps->log2_ctb_size);
2064
1.20M
    mv->pred_flag = 0;
2065
1.20M
    if (s->sh.slice_type == HEVC_SLICE_B)
2066
1.03M
        inter_pred_idc = ff_hevc_inter_pred_idc_decode(lc, nPbW, nPbH);
2067
2068
1.20M
    if (inter_pred_idc != PRED_L1) {
2069
1.04M
        if (s->sh.nb_refs[L0])
2070
1.04M
            mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(lc, s->sh.nb_refs[L0]);
2071
2072
1.04M
        mv->pred_flag = PF_L0;
2073
1.04M
        ff_hevc_hls_mvd_coding(lc, x0, y0, 0);
2074
1.04M
        mvp_flag = ff_hevc_mvp_lx_flag_decode(lc);
2075
1.04M
        ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2076
1.04M
                                 part_idx, merge_idx, mv, mvp_flag, 0);
2077
1.04M
        mv->mv[0].x += lc->pu.mvd.x;
2078
1.04M
        mv->mv[0].y += lc->pu.mvd.y;
2079
1.04M
    }
2080
2081
1.20M
    if (inter_pred_idc != PRED_L0) {
2082
357k
        if (s->sh.nb_refs[L1])
2083
357k
            mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(lc, s->sh.nb_refs[L1]);
2084
2085
357k
        if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
2086
94.0k
            AV_ZERO32(&lc->pu.mvd);
2087
263k
        } else {
2088
263k
            ff_hevc_hls_mvd_coding(lc, x0, y0, 1);
2089
263k
        }
2090
2091
357k
        mv->pred_flag += PF_L1;
2092
357k
        mvp_flag = ff_hevc_mvp_lx_flag_decode(lc);
2093
357k
        ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2094
357k
                                 part_idx, merge_idx, mv, mvp_flag, 1);
2095
357k
        mv->mv[1].x += lc->pu.mvd.x;
2096
357k
        mv->mv[1].y += lc->pu.mvd.y;
2097
357k
    }
2098
1.20M
}
2099
2100
static void hls_prediction_unit(HEVCLocalContext *lc,
2101
                                const HEVCLayerContext *l,
2102
                                const HEVCPPS *pps, const HEVCSPS *sps,
2103
                                int x0, int y0, int nPbW, int nPbH,
2104
                                int log2_cb_size, int partIdx, int idx)
2105
6.36M
{
2106
6.36M
#define POS(c_idx, x, y)                                                          \
2107
12.7M
    s->cur_frame->f->data[c_idx] ?                                                \
2108
12.7M
    &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2109
12.6M
                           (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2110
6.36M
    const HEVCContext *const s = lc->parent;
2111
6.36M
    int merge_idx = 0;
2112
6.36M
    struct MvField current_mv = {{{ 0 }}};
2113
2114
6.36M
    int min_pu_width = sps->min_pu_width;
2115
2116
6.36M
    MvField *tab_mvf = s->cur_frame->tab_mvf;
2117
6.36M
    const RefPicList *refPicList = s->cur_frame->refPicList;
2118
6.36M
    const HEVCFrame *ref0 = NULL, *ref1 = NULL;
2119
6.36M
    const int *linesize = s->cur_frame->f->linesize;
2120
6.36M
    uint8_t *dst0 = s->cur_frame->f->data[0] + y0 * linesize[0] + (x0 << sps->pixel_shift);
2121
6.36M
    uint8_t *dst1 = POS(1, x0, y0);
2122
6.36M
    uint8_t *dst2 = POS(2, x0, y0);
2123
6.36M
    int log2_min_cb_size = sps->log2_min_cb_size;
2124
6.36M
    int min_cb_width     = sps->min_cb_width;
2125
6.36M
    int x_cb             = x0 >> log2_min_cb_size;
2126
6.36M
    int y_cb             = y0 >> log2_min_cb_size;
2127
6.36M
    int x_pu, y_pu;
2128
6.36M
    int i, j;
2129
2130
6.36M
    int skip_flag = SAMPLE_CTB(l->skip_flag, x_cb, y_cb);
2131
2132
6.36M
    if (!skip_flag)
2133
2.93M
        lc->pu.merge_flag = ff_hevc_merge_flag_decode(lc);
2134
2135
6.36M
    if (skip_flag || lc->pu.merge_flag) {
2136
5.15M
        if (s->sh.max_num_merge_cand > 1)
2137
5.00M
            merge_idx = ff_hevc_merge_idx_decode(lc);
2138
157k
        else
2139
157k
            merge_idx = 0;
2140
2141
5.15M
        ff_hevc_luma_mv_merge_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2142
5.15M
                                   partIdx, merge_idx, &current_mv);
2143
5.15M
    } else {
2144
1.20M
        hevc_luma_mv_mvp_mode(lc, pps, sps, x0, y0, nPbW, nPbH, log2_cb_size,
2145
1.20M
                              partIdx, merge_idx, &current_mv);
2146
1.20M
    }
2147
2148
6.36M
    x_pu = x0 >> sps->log2_min_pu_size;
2149
6.36M
    y_pu = y0 >> sps->log2_min_pu_size;
2150
2151
23.9M
    for (j = 0; j < nPbH >> sps->log2_min_pu_size; j++)
2152
97.8M
        for (i = 0; i < nPbW >> sps->log2_min_pu_size; i++)
2153
80.2M
            tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
2154
2155
6.36M
    if (current_mv.pred_flag & PF_L0) {
2156
6.08M
        ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
2157
6.08M
        if (!ref0 || !ref0->f)
2158
0
            return;
2159
6.08M
        hevc_await_progress(s, ref0, &current_mv.mv[0], y0, nPbH);
2160
6.08M
    }
2161
6.36M
    if (current_mv.pred_flag & PF_L1) {
2162
3.14M
        ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
2163
3.14M
        if (!ref1 || !ref1->f)
2164
0
            return;
2165
3.14M
        hevc_await_progress(s, ref1, &current_mv.mv[1], y0, nPbH);
2166
3.14M
    }
2167
2168
6.36M
    if (current_mv.pred_flag == PF_L0) {
2169
3.22M
        int x0_c = x0 >> sps->hshift[1];
2170
3.22M
        int y0_c = y0 >> sps->vshift[1];
2171
3.22M
        int nPbW_c = nPbW >> sps->hshift[1];
2172
3.22M
        int nPbH_c = nPbH >> sps->vshift[1];
2173
2174
3.22M
        luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref0->f,
2175
3.22M
                    &current_mv.mv[0], x0, y0, nPbW, nPbH,
2176
3.22M
                    s->sh.luma_weight_l0[current_mv.ref_idx[0]],
2177
3.22M
                    s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
2178
2179
3.22M
        if (sps->chroma_format_idc) {
2180
3.20M
            chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref0->f->data[1], ref0->f->linesize[1],
2181
3.20M
                          0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2182
3.20M
                          s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
2183
3.20M
            chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref0->f->data[2], ref0->f->linesize[2],
2184
3.20M
                          0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2185
3.20M
                          s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
2186
3.20M
        }
2187
3.22M
    } else if (current_mv.pred_flag == PF_L1) {
2188
278k
        int x0_c = x0 >> sps->hshift[1];
2189
278k
        int y0_c = y0 >> sps->vshift[1];
2190
278k
        int nPbW_c = nPbW >> sps->hshift[1];
2191
278k
        int nPbH_c = nPbH >> sps->vshift[1];
2192
2193
278k
        luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref1->f,
2194
278k
                    &current_mv.mv[1], x0, y0, nPbW, nPbH,
2195
278k
                    s->sh.luma_weight_l1[current_mv.ref_idx[1]],
2196
278k
                    s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
2197
2198
278k
        if (sps->chroma_format_idc) {
2199
276k
            chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref1->f->data[1], ref1->f->linesize[1],
2200
276k
                          1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2201
276k
                          s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
2202
2203
276k
            chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref1->f->data[2], ref1->f->linesize[2],
2204
276k
                          1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2205
276k
                          s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
2206
276k
        }
2207
2.86M
    } else if (current_mv.pred_flag == PF_BI) {
2208
2.86M
        int x0_c = x0 >> sps->hshift[1];
2209
2.86M
        int y0_c = y0 >> sps->vshift[1];
2210
2.86M
        int nPbW_c = nPbW >> sps->hshift[1];
2211
2.86M
        int nPbH_c = nPbH >> sps->vshift[1];
2212
2213
2.86M
        luma_mc_bi(lc, pps, sps, dst0, linesize[0], ref0->f,
2214
2.86M
                   &current_mv.mv[0], x0, y0, nPbW, nPbH,
2215
2.86M
                   ref1->f, &current_mv.mv[1], &current_mv);
2216
2217
2.86M
        if (sps->chroma_format_idc) {
2218
2.83M
            chroma_mc_bi(lc, pps, sps, dst1, linesize[1], ref0->f, ref1->f,
2219
2.83M
                         x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 0);
2220
2221
2.83M
            chroma_mc_bi(lc, pps, sps, dst2, linesize[2], ref0->f, ref1->f,
2222
2.83M
                         x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 1);
2223
2.83M
        }
2224
2.86M
    }
2225
6.36M
}
2226
2227
/**
2228
 * 8.4.1
2229
 */
2230
static int luma_intra_pred_mode(HEVCLocalContext *lc, const HEVCLayerContext *l,
2231
                                const HEVCSPS *sps,
2232
                                int x0, int y0, int pu_size,
2233
                                int prev_intra_luma_pred_flag)
2234
95.3M
{
2235
95.3M
    const HEVCContext *const s = lc->parent;
2236
95.3M
    int x_pu             = x0 >> sps->log2_min_pu_size;
2237
95.3M
    int y_pu             = y0 >> sps->log2_min_pu_size;
2238
95.3M
    int min_pu_width     = sps->min_pu_width;
2239
95.3M
    int size_in_pus      = pu_size >> sps->log2_min_pu_size;
2240
95.3M
    int x0b              = av_zero_extend(x0, sps->log2_ctb_size);
2241
95.3M
    int y0b              = av_zero_extend(y0, sps->log2_ctb_size);
2242
2243
95.3M
    int cand_up   = (lc->ctb_up_flag || y0b) ?
2244
93.8M
                    l->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
2245
95.3M
    int cand_left = (lc->ctb_left_flag || x0b) ?
2246
94.5M
                    l->tab_ipm[y_pu * min_pu_width + x_pu - 1]   : INTRA_DC;
2247
2248
95.3M
    int y_ctb = (y0 >> (sps->log2_ctb_size)) << (sps->log2_ctb_size);
2249
2250
95.3M
    MvField *tab_mvf = s->cur_frame->tab_mvf;
2251
95.3M
    int intra_pred_mode;
2252
95.3M
    int candidate[3];
2253
95.3M
    int i, j;
2254
2255
    // intra_pred_mode prediction does not cross vertical CTB boundaries
2256
95.3M
    if ((y0 - 1) < y_ctb)
2257
12.1M
        cand_up = INTRA_DC;
2258
2259
95.3M
    if (cand_left == cand_up) {
2260
32.3M
        if (cand_left < 2) {
2261
19.9M
            candidate[0] = INTRA_PLANAR;
2262
19.9M
            candidate[1] = INTRA_DC;
2263
19.9M
            candidate[2] = INTRA_ANGULAR_26;
2264
19.9M
        } else {
2265
12.3M
            candidate[0] = cand_left;
2266
12.3M
            candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2267
12.3M
            candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2268
12.3M
        }
2269
63.0M
    } else {
2270
63.0M
        candidate[0] = cand_left;
2271
63.0M
        candidate[1] = cand_up;
2272
63.0M
        if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
2273
27.3M
            candidate[2] = INTRA_PLANAR;
2274
35.6M
        } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
2275
7.01M
            candidate[2] = INTRA_DC;
2276
28.6M
        } else {
2277
28.6M
            candidate[2] = INTRA_ANGULAR_26;
2278
28.6M
        }
2279
63.0M
    }
2280
2281
95.3M
    if (prev_intra_luma_pred_flag) {
2282
54.3M
        intra_pred_mode = candidate[lc->pu.mpm_idx];
2283
54.3M
    } else {
2284
40.9M
        if (candidate[0] > candidate[1])
2285
14.2M
            FFSWAP(uint8_t, candidate[0], candidate[1]);
2286
40.9M
        if (candidate[0] > candidate[2])
2287
18.4M
            FFSWAP(uint8_t, candidate[0], candidate[2]);
2288
40.9M
        if (candidate[1] > candidate[2])
2289
29.2M
            FFSWAP(uint8_t, candidate[1], candidate[2]);
2290
2291
40.9M
        intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
2292
163M
        for (i = 0; i < 3; i++)
2293
122M
            if (intra_pred_mode >= candidate[i])
2294
65.6M
                intra_pred_mode++;
2295
40.9M
    }
2296
2297
    /* write the intra prediction units into the mv array */
2298
95.3M
    if (!size_in_pus)
2299
0
        size_in_pus = 1;
2300
239M
    for (i = 0; i < size_in_pus; i++) {
2301
144M
        memset(&l->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
2302
144M
               intra_pred_mode, size_in_pus);
2303
2304
492M
        for (j = 0; j < size_in_pus; j++) {
2305
348M
            tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
2306
348M
        }
2307
144M
    }
2308
2309
95.3M
    return intra_pred_mode;
2310
95.3M
}
2311
2312
static av_always_inline void set_ct_depth(const HEVCSPS *sps, uint8_t *tab_ct_depth,
2313
                                          int x0, int y0,
2314
                                          int log2_cb_size, int ct_depth)
2315
55.9M
{
2316
55.9M
    int length = (1 << log2_cb_size) >> sps->log2_min_cb_size;
2317
55.9M
    int x_cb   = x0 >> sps->log2_min_cb_size;
2318
55.9M
    int y_cb   = y0 >> sps->log2_min_cb_size;
2319
55.9M
    int y;
2320
2321
121M
    for (y = 0; y < length; y++)
2322
65.3M
        memset(&tab_ct_depth[(y_cb + y) * sps->min_cb_width + x_cb],
2323
65.3M
               ct_depth, length);
2324
55.9M
}
2325
2326
static const uint8_t tab_mode_idx[] = {
2327
     0,  1,  2,  2,  2,  2,  3,  5,  7,  8, 10, 12, 13, 15, 17, 18, 19, 20,
2328
    21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2329
2330
static void intra_prediction_unit(HEVCLocalContext *lc,
2331
                                  const HEVCLayerContext *l, const HEVCSPS *sps,
2332
                                  int x0, int y0,
2333
                                  int log2_cb_size)
2334
50.5M
{
2335
50.5M
    static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2336
50.5M
    uint8_t prev_intra_luma_pred_flag[4];
2337
50.5M
    int split   = lc->cu.part_mode == PART_NxN;
2338
50.5M
    int pb_size = (1 << log2_cb_size) >> split;
2339
50.5M
    int side    = split + 1;
2340
50.5M
    int chroma_mode;
2341
50.5M
    int i, j;
2342
2343
115M
    for (i = 0; i < side; i++)
2344
160M
        for (j = 0; j < side; j++)
2345
95.3M
            prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(lc);
2346
2347
115M
    for (i = 0; i < side; i++) {
2348
160M
        for (j = 0; j < side; j++) {
2349
95.3M
            if (prev_intra_luma_pred_flag[2 * i + j])
2350
54.3M
                lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(lc);
2351
40.9M
            else
2352
40.9M
                lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(lc);
2353
2354
95.3M
            lc->pu.intra_pred_mode[2 * i + j] =
2355
95.3M
                luma_intra_pred_mode(lc, l, sps,
2356
95.3M
                                     x0 + pb_size * j, y0 + pb_size * i, pb_size,
2357
95.3M
                                     prev_intra_luma_pred_flag[2 * i + j]);
2358
95.3M
        }
2359
65.4M
    }
2360
2361
50.5M
    if (sps->chroma_format_idc == 3) {
2362
12.6M
        for (i = 0; i < side; i++) {
2363
18.7M
            for (j = 0; j < side; j++) {
2364
11.4M
                lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2365
11.4M
                if (chroma_mode != 4) {
2366
2.75M
                    if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
2367
767k
                        lc->pu.intra_pred_mode_c[2 * i + j] = 34;
2368
1.98M
                    else
2369
1.98M
                        lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
2370
8.67M
                } else {
2371
8.67M
                    lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
2372
8.67M
                }
2373
11.4M
            }
2374
7.33M
        }
2375
45.2M
    } else if (sps->chroma_format_idc == 2) {
2376
16.6M
        int mode_idx;
2377
16.6M
        lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2378
16.6M
        if (chroma_mode != 4) {
2379
2.95M
            if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2380
792k
                mode_idx = 34;
2381
2.16M
            else
2382
2.16M
                mode_idx = intra_chroma_table[chroma_mode];
2383
13.7M
        } else {
2384
13.7M
            mode_idx = lc->pu.intra_pred_mode[0];
2385
13.7M
        }
2386
16.6M
        lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
2387
28.5M
    } else if (sps->chroma_format_idc != 0) {
2388
28.0M
        chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2389
28.0M
        if (chroma_mode != 4) {
2390
4.18M
            if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2391
1.42M
                lc->pu.intra_pred_mode_c[0] = 34;
2392
2.76M
            else
2393
2.76M
                lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
2394
23.8M
        } else {
2395
23.8M
            lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
2396
23.8M
        }
2397
28.0M
    }
2398
50.5M
}
2399
2400
static void intra_prediction_unit_default_value(HEVCLocalContext *lc,
2401
                                                const HEVCLayerContext *l,
2402
                                                const HEVCSPS *sps,
2403
                                                int x0, int y0,
2404
                                                int log2_cb_size)
2405
5.44M
{
2406
5.44M
    const HEVCContext *const s = lc->parent;
2407
5.44M
    int pb_size          = 1 << log2_cb_size;
2408
5.44M
    int size_in_pus      = pb_size >> sps->log2_min_pu_size;
2409
5.44M
    int min_pu_width     = sps->min_pu_width;
2410
5.44M
    MvField *tab_mvf     = s->cur_frame->tab_mvf;
2411
5.44M
    int x_pu             = x0 >> sps->log2_min_pu_size;
2412
5.44M
    int y_pu             = y0 >> sps->log2_min_pu_size;
2413
5.44M
    int j, k;
2414
2415
5.44M
    if (size_in_pus == 0)
2416
0
        size_in_pus = 1;
2417
21.5M
    for (j = 0; j < size_in_pus; j++)
2418
16.1M
        memset(&l->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2419
5.44M
    if (lc->cu.pred_mode == MODE_INTRA)
2420
13.9k
        for (j = 0; j < size_in_pus; j++)
2421
39.4k
            for (k = 0; k < size_in_pus; k++)
2422
29.4k
                tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
2423
5.44M
}
2424
2425
static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s,
2426
                           const HEVCLayerContext *l,
2427
                           const HEVCPPS *pps, const HEVCSPS *sps,
2428
                           int x0, int y0, int log2_cb_size)
2429
55.9M
{
2430
55.9M
    int cb_size          = 1 << log2_cb_size;
2431
55.9M
    int log2_min_cb_size = sps->log2_min_cb_size;
2432
55.9M
    int length           = cb_size >> log2_min_cb_size;
2433
55.9M
    int min_cb_width     = sps->min_cb_width;
2434
55.9M
    int x_cb             = x0 >> log2_min_cb_size;
2435
55.9M
    int y_cb             = y0 >> log2_min_cb_size;
2436
55.9M
    int idx              = log2_cb_size - 2;
2437
55.9M
    int qp_block_mask    = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1;
2438
55.9M
    int x, y, ret;
2439
2440
55.9M
    lc->cu.x                = x0;
2441
55.9M
    lc->cu.y                = y0;
2442
55.9M
    lc->cu.pred_mode        = MODE_INTRA;
2443
55.9M
    lc->cu.part_mode        = PART_2Nx2N;
2444
55.9M
    lc->cu.intra_split_flag = 0;
2445
2446
55.9M
    SAMPLE_CTB(l->skip_flag, x_cb, y_cb) = 0;
2447
279M
    for (x = 0; x < 4; x++)
2448
223M
        lc->pu.intra_pred_mode[x] = 1;
2449
55.9M
    if (pps->transquant_bypass_enable_flag) {
2450
6.46M
        lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(lc);
2451
6.46M
        if (lc->cu.cu_transquant_bypass_flag)
2452
3.36M
            set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_cb_size);
2453
6.46M
    } else
2454
49.4M
        lc->cu.cu_transquant_bypass_flag = 0;
2455
2456
55.9M
    if (s->sh.slice_type != HEVC_SLICE_I) {
2457
5.89M
        const int x0b = av_zero_extend(x0, sps->log2_ctb_size);
2458
5.89M
        const int y0b = av_zero_extend(y0, sps->log2_ctb_size);
2459
5.89M
        uint8_t skip_flag = ff_hevc_skip_flag_decode(lc, l->skip_flag,
2460
5.89M
                                                     x0b, y0b, x_cb, y_cb,
2461
5.89M
                                                     min_cb_width);
2462
2463
5.89M
        x = y_cb * min_cb_width + x_cb;
2464
14.5M
        for (y = 0; y < length; y++) {
2465
8.67M
            memset(&l->skip_flag[x], skip_flag, length);
2466
8.67M
            x += min_cb_width;
2467
8.67M
        }
2468
5.89M
        lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2469
50.0M
    } else {
2470
50.0M
        x = y_cb * min_cb_width + x_cb;
2471
106M
        for (y = 0; y < length; y++) {
2472
56.6M
            memset(&l->skip_flag[x], 0, length);
2473
56.6M
            x += min_cb_width;
2474
56.6M
        }
2475
50.0M
    }
2476
2477
55.9M
    if (SAMPLE_CTB(l->skip_flag, x_cb, y_cb)) {
2478
3.43M
        hls_prediction_unit(lc, l, pps, sps,
2479
3.43M
                            x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2480
3.43M
        intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2481
2482
3.43M
        if (!s->sh.disable_deblocking_filter_flag)
2483
2.97M
            ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
2484
52.5M
    } else {
2485
52.5M
        int pcm_flag = 0;
2486
2487
52.5M
        if (s->sh.slice_type != HEVC_SLICE_I)
2488
2.46M
            lc->cu.pred_mode = ff_hevc_pred_mode_decode(lc);
2489
52.5M
        if (lc->cu.pred_mode != MODE_INTRA ||
2490
50.5M
            log2_cb_size == sps->log2_min_cb_size) {
2491
49.1M
            lc->cu.part_mode        = ff_hevc_part_mode_decode(lc, sps, log2_cb_size);
2492
49.1M
            lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2493
14.9M
                                      lc->cu.pred_mode == MODE_INTRA;
2494
49.1M
        }
2495
2496
52.5M
        if (lc->cu.pred_mode == MODE_INTRA) {
2497
50.5M
            if (lc->cu.part_mode == PART_2Nx2N && sps->pcm_enabled &&
2498
5.13M
                log2_cb_size >= sps->pcm.log2_min_pcm_cb_size &&
2499
3.97M
                log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2500
3.86M
                pcm_flag = ff_hevc_pcm_flag_decode(lc);
2501
3.86M
            }
2502
50.5M
            if (pcm_flag) {
2503
3.99k
                intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2504
3.99k
                ret = hls_pcm_sample(lc, l, pps, x0, y0, log2_cb_size);
2505
3.99k
                if (sps->pcm_loop_filter_disabled)
2506
738
                    set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_cb_size);
2507
2508
3.99k
                if (ret < 0)
2509
2.16k
                    return ret;
2510
50.5M
            } else {
2511
50.5M
                intra_prediction_unit(lc, l, sps, x0, y0, log2_cb_size);
2512
50.5M
            }
2513
50.5M
        } else {
2514
2.00M
            intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2515
2.00M
            switch (lc->cu.part_mode) {
2516
1.09M
            case PART_2Nx2N:
2517
1.09M
                hls_prediction_unit(lc, l, pps, sps,
2518
1.09M
                                    x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2519
1.09M
                break;
2520
383k
            case PART_2NxN:
2521
383k
                hls_prediction_unit(lc, l, pps, sps,
2522
383k
                                    x0, y0,               cb_size, cb_size / 2, log2_cb_size, 0, idx);
2523
383k
                hls_prediction_unit(lc, l, pps, sps,
2524
383k
                                    x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2525
383k
                break;
2526
436k
            case PART_Nx2N:
2527
436k
                hls_prediction_unit(lc, l, pps, sps,
2528
436k
                                    x0,               y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2529
436k
                hls_prediction_unit(lc, l, pps, sps,
2530
436k
                                    x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2531
436k
                break;
2532
24.6k
            case PART_2NxnU:
2533
24.6k
                hls_prediction_unit(lc, l, pps, sps,
2534
24.6k
                                    x0, y0,               cb_size, cb_size     / 4, log2_cb_size, 0, idx);
2535
24.6k
                hls_prediction_unit(lc, l, pps, sps,
2536
24.6k
                                    x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2537
24.6k
                break;
2538
14.0k
            case PART_2NxnD:
2539
14.0k
                hls_prediction_unit(lc, l, pps, sps,
2540
14.0k
                                    x0, y0,                   cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2541
14.0k
                hls_prediction_unit(lc, l, pps, sps,
2542
14.0k
                                    x0, y0 + cb_size * 3 / 4, cb_size, cb_size     / 4, log2_cb_size, 1, idx);
2543
14.0k
                break;
2544
33.0k
            case PART_nLx2N:
2545
33.0k
                hls_prediction_unit(lc, l, pps, sps,
2546
33.0k
                                    x0,               y0, cb_size     / 4, cb_size, log2_cb_size, 0, idx - 2);
2547
33.0k
                hls_prediction_unit(lc, l, pps, sps,
2548
33.0k
                                    x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2549
33.0k
                break;
2550
17.8k
            case PART_nRx2N:
2551
17.8k
                hls_prediction_unit(lc, l, pps, sps,
2552
17.8k
                                    x0,                   y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2553
17.8k
                hls_prediction_unit(lc, l, pps, sps,
2554
17.8k
                                    x0 + cb_size * 3 / 4, y0, cb_size     / 4, cb_size, log2_cb_size, 1, idx - 2);
2555
17.8k
                break;
2556
4.96k
            case PART_NxN:
2557
4.96k
                hls_prediction_unit(lc, l, pps, sps,
2558
4.96k
                                    x0,               y0,               cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2559
4.96k
                hls_prediction_unit(lc, l, pps, sps,
2560
4.96k
                                    x0 + cb_size / 2, y0,               cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2561
4.96k
                hls_prediction_unit(lc, l, pps, sps,
2562
4.96k
                                    x0,               y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2563
4.96k
                hls_prediction_unit(lc, l, pps, sps,
2564
4.96k
                                    x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2565
4.96k
                break;
2566
2.00M
            }
2567
2.00M
        }
2568
2569
52.5M
        if (!pcm_flag) {
2570
52.5M
            int rqt_root_cbf = 1;
2571
2572
52.5M
            if (lc->cu.pred_mode != MODE_INTRA &&
2573
2.00M
                !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2574
1.39M
                rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(lc);
2575
1.39M
            }
2576
52.5M
            if (rqt_root_cbf) {
2577
51.6M
                const static int cbf[2] = { 0 };
2578
51.6M
                lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2579
50.5M
                                         sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2580
51.6M
                                         sps->max_transform_hierarchy_depth_inter;
2581
51.6M
                ret = hls_transform_tree(lc, l, pps, sps, x0, y0, x0, y0, x0, y0,
2582
51.6M
                                         log2_cb_size,
2583
51.6M
                                         log2_cb_size, 0, 0, cbf, cbf);
2584
51.6M
                if (ret < 0)
2585
2.68k
                    return ret;
2586
51.6M
            } else {
2587
826k
                if (!s->sh.disable_deblocking_filter_flag)
2588
723k
                    ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
2589
826k
            }
2590
52.5M
        }
2591
52.5M
    }
2592
2593
55.9M
    if (pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2594
1.58M
        ff_hevc_set_qPy(lc, l, pps, x0, y0, log2_cb_size);
2595
2596
55.9M
    x = y_cb * min_cb_width + x_cb;
2597
121M
    for (y = 0; y < length; y++) {
2598
65.3M
        memset(&l->qp_y_tab[x], lc->qp_y, length);
2599
65.3M
        x += min_cb_width;
2600
65.3M
    }
2601
2602
55.9M
    if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2603
14.3M
       ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2604
7.21M
        lc->qPy_pred = lc->qp_y;
2605
7.21M
    }
2606
2607
55.9M
    set_ct_depth(sps, l->tab_ct_depth, x0, y0, log2_cb_size, lc->ct_depth);
2608
2609
55.9M
    return 0;
2610
55.9M
}
2611
2612
static int hls_coding_quadtree(HEVCLocalContext *lc,
2613
                               const HEVCLayerContext *l,
2614
                               const HEVCPPS *pps, const HEVCSPS *sps,
2615
                               int x0, int y0,
2616
                               int log2_cb_size, int cb_depth)
2617
73.7M
{
2618
73.7M
    const HEVCContext *const s = lc->parent;
2619
73.7M
    const int cb_size    = 1 << log2_cb_size;
2620
73.7M
    int ret;
2621
73.7M
    int split_cu;
2622
2623
73.7M
    lc->ct_depth = cb_depth;
2624
73.7M
    if (x0 + cb_size <= sps->width  &&
2625
73.6M
        y0 + cb_size <= sps->height &&
2626
72.8M
        log2_cb_size > sps->log2_min_cb_size) {
2627
21.5M
        split_cu = ff_hevc_split_coding_unit_flag_decode(lc, l->tab_ct_depth,
2628
21.5M
                                                         sps, cb_depth, x0, y0);
2629
52.2M
    } else {
2630
52.2M
        split_cu = (log2_cb_size > sps->log2_min_cb_size);
2631
52.2M
    }
2632
73.7M
    if (pps->cu_qp_delta_enabled_flag &&
2633
21.2M
        log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_qp_delta_depth) {
2634
6.26M
        lc->tu.is_cu_qp_delta_coded = 0;
2635
6.26M
        lc->tu.cu_qp_delta          = 0;
2636
6.26M
    }
2637
2638
73.7M
    if (s->sh.cu_chroma_qp_offset_enabled_flag &&
2639
4.00M
        log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_chroma_qp_offset_depth) {
2640
2.55M
        lc->tu.is_cu_chroma_qp_offset_coded = 0;
2641
2.55M
    }
2642
2643
73.7M
    if (split_cu) {
2644
17.8M
        int qp_block_mask = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1;
2645
17.8M
        const int cb_size_split = cb_size >> 1;
2646
17.8M
        const int x1 = x0 + cb_size_split;
2647
17.8M
        const int y1 = y0 + cb_size_split;
2648
2649
17.8M
        int more_data = 0;
2650
2651
17.8M
        more_data = hls_coding_quadtree(lc, l, pps, sps,
2652
17.8M
                                        x0, y0, log2_cb_size - 1, cb_depth + 1);
2653
17.8M
        if (more_data < 0)
2654
3.63k
            return more_data;
2655
2656
17.8M
        if (more_data && x1 < sps->width) {
2657
17.6M
            more_data = hls_coding_quadtree(lc, l, pps, sps,
2658
17.6M
                                            x1, y0, log2_cb_size - 1, cb_depth + 1);
2659
17.6M
            if (more_data < 0)
2660
3.21k
                return more_data;
2661
17.6M
        }
2662
17.8M
        if (more_data && y1 < sps->height) {
2663
17.3M
            more_data = hls_coding_quadtree(lc, l, pps, sps,
2664
17.3M
                                            x0, y1, log2_cb_size - 1, cb_depth + 1);
2665
17.3M
            if (more_data < 0)
2666
2.18k
                return more_data;
2667
17.3M
        }
2668
17.8M
        if (more_data && x1 < sps->width &&
2669
17.6M
            y1 < sps->height) {
2670
17.1M
            more_data = hls_coding_quadtree(lc, l, pps, sps,
2671
17.1M
                                            x1, y1, log2_cb_size - 1, cb_depth + 1);
2672
17.1M
            if (more_data < 0)
2673
2.22k
                return more_data;
2674
17.1M
        }
2675
2676
17.8M
        if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2677
8.58M
            ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2678
5.63M
            lc->qPy_pred = lc->qp_y;
2679
2680
17.8M
        if (more_data)
2681
17.7M
            return ((x1 + cb_size_split) < sps->width ||
2682
609k
                    (y1 + cb_size_split) < sps->height);
2683
53.8k
        else
2684
53.8k
            return 0;
2685
55.9M
    } else {
2686
55.9M
        ret = hls_coding_unit(lc, s, l, pps, sps, x0, y0, log2_cb_size);
2687
55.9M
        if (ret < 0)
2688
4.85k
            return ret;
2689
55.9M
        if ((!((x0 + cb_size) %
2690
55.9M
               (1 << (sps->log2_ctb_size))) ||
2691
45.0M
             (x0 + cb_size >= sps->width)) &&
2692
11.4M
            (!((y0 + cb_size) %
2693
11.4M
               (1 << (sps->log2_ctb_size))) ||
2694
7.89M
             (y0 + cb_size >= sps->height))) {
2695
3.80M
            int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(lc);
2696
3.80M
            return !end_of_slice_flag;
2697
52.1M
        } else {
2698
52.1M
            return 1;
2699
52.1M
        }
2700
55.9M
    }
2701
2702
0
    return 0;
2703
73.7M
}
2704
2705
static void hls_decode_neighbour(HEVCLocalContext *lc,
2706
                                 const HEVCLayerContext *l,
2707
                                 const HEVCPPS *pps, const HEVCSPS *sps,
2708
                                 int x_ctb, int y_ctb, int ctb_addr_ts)
2709
3.81M
{
2710
3.81M
    const HEVCContext *const s = lc->parent;
2711
3.81M
    int ctb_size          = 1 << sps->log2_ctb_size;
2712
3.81M
    int ctb_addr_rs       = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2713
3.81M
    int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2714
2715
3.81M
    l->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2716
2717
3.81M
    if (pps->entropy_coding_sync_enabled_flag) {
2718
187k
        if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2719
32.5k
            lc->first_qp_group = 1;
2720
187k
        lc->end_of_tiles_x = sps->width;
2721
3.62M
    } else if (pps->tiles_enabled_flag) {
2722
1.34M
        if (ctb_addr_ts && pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) {
2723
13.1k
            int idxX = pps->col_idxX[x_ctb >> sps->log2_ctb_size];
2724
13.1k
            lc->end_of_tiles_x   = x_ctb + (pps->column_width[idxX] << sps->log2_ctb_size);
2725
13.1k
            lc->first_qp_group   = 1;
2726
13.1k
        }
2727
2.28M
    } else {
2728
2.28M
        lc->end_of_tiles_x = sps->width;
2729
2.28M
    }
2730
2731
3.81M
    lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, sps->height);
2732
2733
3.81M
    lc->boundary_flags = 0;
2734
3.81M
    if (pps->tiles_enabled_flag) {
2735
1.35M
        if (x_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2736
33.9k
            lc->boundary_flags |= BOUNDARY_LEFT_TILE;
2737
1.35M
        if (x_ctb > 0 && l->tab_slice_address[ctb_addr_rs] != l->tab_slice_address[ctb_addr_rs - 1])
2738
2.51k
            lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2739
1.35M
        if (y_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - sps->ctb_width]])
2740
63.5k
            lc->boundary_flags |= BOUNDARY_UPPER_TILE;
2741
1.35M
        if (y_ctb > 0 && l->tab_slice_address[ctb_addr_rs] != l->tab_slice_address[ctb_addr_rs - sps->ctb_width])
2742
36.2k
            lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2743
2.45M
    } else {
2744
2.45M
        if (ctb_addr_in_slice <= 0)
2745
36.7k
            lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2746
2.45M
        if (ctb_addr_in_slice < sps->ctb_width)
2747
339k
            lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2748
2.45M
    }
2749
2750
3.81M
    lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2751
3.81M
    lc->ctb_up_flag   = ((y_ctb > 0) && (ctb_addr_in_slice >= sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2752
3.81M
    lc->ctb_up_right_flag = ((y_ctb > 0)  && (ctb_addr_in_slice+1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - sps->ctb_width]]));
2753
3.81M
    lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0)  && (ctb_addr_in_slice-1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - sps->ctb_width]]));
2754
3.81M
}
2755
2756
static int hls_decode_entry(HEVCContext *s, GetBitContext *gb)
2757
60.1k
{
2758
60.1k
    HEVCLocalContext *const lc = &s->local_ctx[0];
2759
60.1k
    const HEVCLayerContext *const l = &s->layers[s->cur_layer];
2760
60.1k
    const HEVCPPS   *const pps = s->pps;
2761
60.1k
    const HEVCSPS   *const sps = pps->sps;
2762
60.1k
    const uint8_t *slice_data = gb->buffer + s->sh.data_offset;
2763
60.1k
    const size_t   slice_size = get_bits_bytesize(gb, 1) - s->sh.data_offset;
2764
60.1k
    int ctb_size    = 1 << sps->log2_ctb_size;
2765
60.1k
    int more_data   = 1;
2766
60.1k
    int x_ctb       = 0;
2767
60.1k
    int y_ctb       = 0;
2768
60.1k
    int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2769
60.1k
    int ret;
2770
2771
3.86M
    while (more_data && ctb_addr_ts < sps->ctb_size) {
2772
3.81M
        int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2773
2774
3.81M
        x_ctb = (ctb_addr_rs % ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size;
2775
3.81M
        y_ctb = (ctb_addr_rs / ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size;
2776
3.81M
        hls_decode_neighbour(lc, l, pps, sps, x_ctb, y_ctb, ctb_addr_ts);
2777
2778
3.81M
        ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, slice_data, slice_size, 0);
2779
3.81M
        if (ret < 0) {
2780
10.8k
            l->tab_slice_address[ctb_addr_rs] = -1;
2781
10.8k
            return ret;
2782
10.8k
        }
2783
2784
3.80M
        hls_sao_param(lc, l, pps, sps,
2785
3.80M
                      x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size);
2786
2787
3.80M
        l->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2788
3.80M
        l->deblock[ctb_addr_rs].tc_offset   = s->sh.tc_offset;
2789
3.80M
        l->filter_slice_edges[ctb_addr_rs]  = s->sh.slice_loop_filter_across_slices_enabled_flag;
2790
2791
3.80M
        more_data = hls_coding_quadtree(lc, l, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0);
2792
3.80M
        if (more_data < 0) {
2793
4.85k
            l->tab_slice_address[ctb_addr_rs] = -1;
2794
4.85k
            return more_data;
2795
4.85k
        }
2796
2797
2798
3.80M
        ctb_addr_ts++;
2799
3.80M
        ff_hevc_save_states(lc, pps, ctb_addr_ts);
2800
3.80M
        ff_hevc_hls_filters(lc, l, pps, x_ctb, y_ctb, ctb_size);
2801
3.80M
    }
2802
2803
44.4k
    if (x_ctb + ctb_size >= sps->width &&
2804
38.6k
        y_ctb + ctb_size >= sps->height)
2805
37.8k
        ff_hevc_hls_filter(lc, l, pps, x_ctb, y_ctb, ctb_size);
2806
2807
44.4k
    return ctb_addr_ts;
2808
60.1k
}
2809
2810
static int hls_decode_entry_wpp(AVCodecContext *avctx, void *hevc_lclist,
2811
                                int job, int thread)
2812
0
{
2813
0
    HEVCLocalContext *lc = &((HEVCLocalContext*)hevc_lclist)[thread];
2814
0
    const HEVCContext *const s = lc->parent;
2815
0
    const HEVCLayerContext *const l = &s->layers[s->cur_layer];
2816
0
    const HEVCPPS   *const pps = s->pps;
2817
0
    const HEVCSPS   *const sps = pps->sps;
2818
0
    int ctb_size    = 1 << sps->log2_ctb_size;
2819
0
    int more_data   = 1;
2820
0
    int ctb_row = job;
2821
0
    int ctb_addr_rs = s->sh.slice_ctb_addr_rs + ctb_row * ((sps->width + ctb_size - 1) >> sps->log2_ctb_size);
2822
0
    int ctb_addr_ts = pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2823
2824
0
    const uint8_t *data      = s->data + s->sh.offset[ctb_row];
2825
0
    const size_t   data_size = s->sh.size[ctb_row];
2826
2827
0
    int progress = 0;
2828
2829
0
    int ret;
2830
2831
0
    if (ctb_row)
2832
0
        ff_init_cabac_decoder(&lc->cc, data, data_size);
2833
2834
0
    while(more_data && ctb_addr_ts < sps->ctb_size) {
2835
0
        int x_ctb = (ctb_addr_rs % sps->ctb_width) << sps->log2_ctb_size;
2836
0
        int y_ctb = (ctb_addr_rs / sps->ctb_width) << sps->log2_ctb_size;
2837
2838
0
        hls_decode_neighbour(lc, l, pps, sps, x_ctb, y_ctb, ctb_addr_ts);
2839
2840
0
        if (ctb_row)
2841
0
            ff_thread_progress_await(&s->wpp_progress[ctb_row - 1],
2842
0
                                     progress + SHIFT_CTB_WPP + 1);
2843
2844
        /* atomic_load's prototype requires a pointer to non-const atomic variable
2845
         * (due to implementations via mutexes, where reads involve writes).
2846
         * Of course, casting const away here is nevertheless safe. */
2847
0
        if (atomic_load((atomic_int*)&s->wpp_err)) {
2848
0
            ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2849
0
            return 0;
2850
0
        }
2851
2852
0
        ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, data, data_size, 1);
2853
0
        if (ret < 0)
2854
0
            goto error;
2855
0
        hls_sao_param(lc, l, pps, sps,
2856
0
                      x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size);
2857
2858
0
        l->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2859
0
        l->deblock[ctb_addr_rs].tc_offset   = s->sh.tc_offset;
2860
0
        l->filter_slice_edges[ctb_addr_rs]  = s->sh.slice_loop_filter_across_slices_enabled_flag;
2861
2862
0
        more_data = hls_coding_quadtree(lc, l, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0);
2863
2864
0
        if (more_data < 0) {
2865
0
            ret = more_data;
2866
0
            goto error;
2867
0
        }
2868
2869
0
        ctb_addr_ts++;
2870
2871
0
        ff_hevc_save_states(lc, pps, ctb_addr_ts);
2872
0
        ff_thread_progress_report(&s->wpp_progress[ctb_row], ++progress);
2873
0
        ff_hevc_hls_filters(lc, l, pps, x_ctb, y_ctb, ctb_size);
2874
2875
0
        if (!more_data && (x_ctb+ctb_size) < sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2876
            /* Casting const away here is safe, because it is an atomic operation. */
2877
0
            atomic_store((atomic_int*)&s->wpp_err, 1);
2878
0
            ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2879
0
            return 0;
2880
0
        }
2881
2882
0
        if ((x_ctb+ctb_size) >= sps->width && (y_ctb+ctb_size) >= sps->height ) {
2883
0
            ff_hevc_hls_filter(lc, l, pps, x_ctb, y_ctb, ctb_size);
2884
0
            ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2885
0
            return ctb_addr_ts;
2886
0
        }
2887
0
        ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2888
0
        x_ctb+=ctb_size;
2889
2890
0
        if(x_ctb >= sps->width) {
2891
0
            break;
2892
0
        }
2893
0
    }
2894
0
    ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2895
2896
0
    return 0;
2897
0
error:
2898
0
    l->tab_slice_address[ctb_addr_rs] = -1;
2899
    /* Casting const away here is safe, because it is an atomic operation. */
2900
0
    atomic_store((atomic_int*)&s->wpp_err, 1);
2901
0
    ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2902
0
    return ret;
2903
0
}
2904
2905
static int wpp_progress_init(HEVCContext *s, unsigned count)
2906
0
{
2907
0
    if (s->nb_wpp_progress < count) {
2908
0
        void *tmp = av_realloc_array(s->wpp_progress, count,
2909
0
                                     sizeof(*s->wpp_progress));
2910
0
        if (!tmp)
2911
0
            return AVERROR(ENOMEM);
2912
2913
0
        s->wpp_progress = tmp;
2914
0
        memset(s->wpp_progress + s->nb_wpp_progress, 0,
2915
0
               (count - s->nb_wpp_progress) * sizeof(*s->wpp_progress));
2916
2917
0
        for (int i = s->nb_wpp_progress; i < count; i++) {
2918
0
            int ret = ff_thread_progress_init(&s->wpp_progress[i], 1);
2919
0
            if (ret < 0)
2920
0
                return ret;
2921
0
            s->nb_wpp_progress = i + 1;
2922
0
        }
2923
0
    }
2924
2925
0
    for (int i = 0; i < count; i++)
2926
0
        ff_thread_progress_reset(&s->wpp_progress[i]);
2927
2928
0
    return 0;
2929
0
}
2930
2931
static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
2932
0
{
2933
0
    const HEVCPPS *const pps = s->pps;
2934
0
    const HEVCSPS *const sps = pps->sps;
2935
0
    const uint8_t *data = nal->data;
2936
0
    int length          = nal->size;
2937
0
    int *ret;
2938
0
    int64_t offset;
2939
0
    int64_t startheader, cmpt = 0;
2940
0
    int j, res = 0;
2941
2942
0
    if (s->sh.slice_ctb_addr_rs + s->sh.num_entry_point_offsets * (int64_t)sps->ctb_width >= sps->ctb_width * (int64_t)sps->ctb_height) {
2943
0
        av_log(s->avctx, AV_LOG_ERROR, "WPP ctb addresses are wrong (%d %d %d %d)\n",
2944
0
            s->sh.slice_ctb_addr_rs, s->sh.num_entry_point_offsets,
2945
0
            sps->ctb_width, sps->ctb_height
2946
0
        );
2947
0
        return AVERROR_INVALIDDATA;
2948
0
    }
2949
2950
0
    if (s->avctx->thread_count > s->nb_local_ctx) {
2951
0
        HEVCLocalContext *tmp = av_malloc_array(s->avctx->thread_count, sizeof(*s->local_ctx));
2952
2953
0
        if (!tmp)
2954
0
            return AVERROR(ENOMEM);
2955
2956
0
        memcpy(tmp, s->local_ctx, sizeof(*s->local_ctx) * s->nb_local_ctx);
2957
0
        av_free(s->local_ctx);
2958
0
        s->local_ctx = tmp;
2959
2960
0
        for (unsigned i = s->nb_local_ctx; i < s->avctx->thread_count; i++) {
2961
0
            tmp = &s->local_ctx[i];
2962
2963
0
            memset(tmp, 0, sizeof(*tmp));
2964
2965
0
            tmp->logctx             = s->avctx;
2966
0
            tmp->parent             = s;
2967
0
            tmp->common_cabac_state = &s->cabac;
2968
0
        }
2969
2970
0
        s->nb_local_ctx = s->avctx->thread_count;
2971
0
    }
2972
2973
0
    offset = s->sh.data_offset;
2974
2975
0
    for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2976
0
        if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2977
0
            startheader--;
2978
0
            cmpt++;
2979
0
        }
2980
0
    }
2981
2982
0
    for (int i = 1; i < s->sh.num_entry_point_offsets; i++) {
2983
0
        offset += (s->sh.entry_point_offset[i - 1] - cmpt);
2984
0
        for (j = 0, cmpt = 0, startheader = offset
2985
0
             + s->sh.entry_point_offset[i]; j < nal->skipped_bytes; j++) {
2986
0
            if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2987
0
                startheader--;
2988
0
                cmpt++;
2989
0
            }
2990
0
        }
2991
0
        s->sh.size[i]   = s->sh.entry_point_offset[i] - cmpt;
2992
0
        s->sh.offset[i] = offset;
2993
2994
0
    }
2995
2996
0
    offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
2997
0
    if (length < offset) {
2998
0
        av_log(s->avctx, AV_LOG_ERROR, "entry_point_offset table is corrupted\n");
2999
0
        return AVERROR_INVALIDDATA;
3000
0
    }
3001
0
    s->sh.size  [s->sh.num_entry_point_offsets] = length - offset;
3002
0
    s->sh.offset[s->sh.num_entry_point_offsets] = offset;
3003
3004
0
    s->sh.offset[0] = s->sh.data_offset;
3005
0
    s->sh.size[0]   = s->sh.offset[1] - s->sh.offset[0];
3006
3007
0
    s->data = data;
3008
3009
0
    for (unsigned i = 1; i < s->nb_local_ctx; i++) {
3010
0
        s->local_ctx[i].first_qp_group = 1;
3011
0
        s->local_ctx[i].qp_y = s->local_ctx[0].qp_y;
3012
0
    }
3013
3014
0
    atomic_store(&s->wpp_err, 0);
3015
0
    res = wpp_progress_init(s, s->sh.num_entry_point_offsets + 1);
3016
0
    if (res < 0)
3017
0
        return res;
3018
3019
0
    ret = av_calloc(s->sh.num_entry_point_offsets + 1, sizeof(*ret));
3020
0
    if (!ret)
3021
0
        return AVERROR(ENOMEM);
3022
3023
0
    if (pps->entropy_coding_sync_enabled_flag)
3024
0
        s->avctx->execute2(s->avctx, hls_decode_entry_wpp, s->local_ctx, ret, s->sh.num_entry_point_offsets + 1);
3025
3026
0
    for (int i = 0; i <= s->sh.num_entry_point_offsets; i++)
3027
0
        res += ret[i];
3028
3029
0
    av_free(ret);
3030
0
    return res;
3031
0
}
3032
3033
static int decode_slice_data(HEVCContext *s, const HEVCLayerContext *l,
3034
                             const H2645NAL *nal, GetBitContext *gb)
3035
60.7k
{
3036
60.7k
    const HEVCPPS *pps = s->pps;
3037
60.7k
    int ret;
3038
3039
60.7k
    if (!s->sh.first_slice_in_pic_flag)
3040
12.3k
        s->slice_idx += !s->sh.dependent_slice_segment_flag;
3041
3042
60.7k
    if (!s->sh.dependent_slice_segment_flag && s->sh.slice_type != HEVC_SLICE_I) {
3043
13.8k
        ret = ff_hevc_slice_rpl(s);
3044
13.8k
        if (ret < 0) {
3045
102
            av_log(s->avctx, AV_LOG_WARNING,
3046
102
                   "Error constructing the reference lists for the current slice.\n");
3047
102
            return ret;
3048
102
        }
3049
13.8k
    }
3050
3051
60.6k
    s->slice_initialized = 1;
3052
3053
60.6k
    if (s->avctx->hwaccel)
3054
0
        return FF_HW_CALL(s->avctx, decode_slice, nal->raw_data, nal->raw_size);
3055
3056
60.6k
    if (s->avctx->profile == AV_PROFILE_HEVC_SCC) {
3057
74
        av_log(s->avctx, AV_LOG_ERROR,
3058
74
               "SCC profile is not yet implemented in hevc native decoder.\n");
3059
74
        return AVERROR_PATCHWELCOME;
3060
74
    }
3061
3062
60.6k
    if (s->sh.dependent_slice_segment_flag) {
3063
8.16k
        int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
3064
8.16k
        int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3065
8.16k
        if (l->tab_slice_address[prev_rs] != s->sh.slice_addr) {
3066
449
            av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
3067
449
            return AVERROR_INVALIDDATA;
3068
449
        }
3069
8.16k
    }
3070
3071
60.1k
    s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag;
3072
3073
60.1k
    if (!pps->cu_qp_delta_enabled_flag)
3074
37.0k
        s->local_ctx[0].qp_y = s->sh.slice_qp;
3075
3076
60.1k
    s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3077
60.1k
    s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3078
3079
60.1k
    if (s->avctx->active_thread_type == FF_THREAD_SLICE  &&
3080
0
        s->sh.num_entry_point_offsets > 0                &&
3081
0
        pps->num_tile_rows == 1 && pps->num_tile_columns == 1)
3082
0
        return hls_slice_data_wpp(s, nal);
3083
3084
60.1k
    return hls_decode_entry(s, gb);
3085
60.1k
}
3086
3087
static int set_side_data(HEVCContext *s)
3088
48.4k
{
3089
48.4k
    const HEVCSPS *sps = s->cur_frame->pps->sps;
3090
48.4k
    AVFrame *out = s->cur_frame->f;
3091
48.4k
    int ret;
3092
3093
    // Decrement the mastering display and content light level flag when IRAP
3094
    // frame has no_rasl_output_flag=1 so the side data persists for the entire
3095
    // coded video sequence.
3096
48.4k
    if (IS_IRAP(s) && s->no_rasl_output_flag) {
3097
39.8k
        if (s->sei.common.mastering_display.present > 0)
3098
1.17k
            s->sei.common.mastering_display.present--;
3099
3100
39.8k
        if (s->sei.common.content_light.present > 0)
3101
383
            s->sei.common.content_light.present--;
3102
39.8k
    }
3103
3104
48.4k
    ret = ff_h2645_sei_to_frame(out, &s->sei.common, AV_CODEC_ID_HEVC, s->avctx,
3105
48.4k
                                &sps->vui.common,
3106
48.4k
                                sps->bit_depth, sps->bit_depth_chroma,
3107
48.4k
                                s->cur_frame->poc /* no poc_offset in HEVC */);
3108
48.4k
    if (ret < 0)
3109
0
        return ret;
3110
3111
48.4k
    if (s->sei.timecode.present) {
3112
1.34k
        uint32_t *tc_sd;
3113
1.34k
        char tcbuf[AV_TIMECODE_STR_SIZE];
3114
1.34k
        AVFrameSideData *tcside;
3115
1.34k
        ret = ff_frame_new_side_data(s->avctx, out, AV_FRAME_DATA_S12M_TIMECODE,
3116
1.34k
                                     sizeof(uint32_t) * 4, &tcside);
3117
1.34k
        if (ret < 0)
3118
0
            return ret;
3119
3120
1.34k
        if (tcside) {
3121
1.34k
            tc_sd = (uint32_t*)tcside->data;
3122
1.34k
            tc_sd[0] = s->sei.timecode.num_clock_ts;
3123
3124
3.46k
            for (int i = 0; i < tc_sd[0]; i++) {
3125
2.11k
                int drop = s->sei.timecode.cnt_dropped_flag[i];
3126
2.11k
                int   hh = s->sei.timecode.hours_value[i];
3127
2.11k
                int   mm = s->sei.timecode.minutes_value[i];
3128
2.11k
                int   ss = s->sei.timecode.seconds_value[i];
3129
2.11k
                int   ff = s->sei.timecode.n_frames[i];
3130
3131
2.11k
                tc_sd[i + 1] = av_timecode_get_smpte(s->avctx->framerate, drop, hh, mm, ss, ff);
3132
2.11k
                av_timecode_make_smpte_tc_string2(tcbuf, s->avctx->framerate, tc_sd[i + 1], 0, 0);
3133
2.11k
                av_dict_set(&out->metadata, "timecode", tcbuf, 0);
3134
2.11k
            }
3135
1.34k
        }
3136
3137
1.34k
        s->sei.timecode.num_clock_ts = 0;
3138
1.34k
    }
3139
3140
48.4k
    if (s->sei.common.itut_t35.hdr_plus) {
3141
1.38k
        AVBufferRef *info_ref = av_buffer_ref(s->sei.common.itut_t35.hdr_plus);
3142
1.38k
        if (!info_ref)
3143
0
            return AVERROR(ENOMEM);
3144
3145
1.38k
        ret = ff_frame_new_side_data_from_buf(s->avctx, out, AV_FRAME_DATA_DYNAMIC_HDR_PLUS, &info_ref);
3146
1.38k
        if (ret < 0)
3147
0
            return ret;
3148
1.38k
    }
3149
3150
48.4k
    if (s->sei.common.itut_t35.hdr_smpte2094_app5) {
3151
6
        AVBufferRef *info_ref = av_buffer_ref(s->sei.common.itut_t35.hdr_smpte2094_app5);
3152
6
        if (!info_ref)
3153
0
            return AVERROR(ENOMEM);
3154
3155
6
        ret = ff_frame_new_side_data_from_buf(s->avctx, out, AV_FRAME_DATA_DYNAMIC_HDR_SMPTE_2094_APP5, &info_ref);
3156
6
        if (ret < 0)
3157
0
            return ret;
3158
6
    }
3159
3160
48.4k
    if (s->rpu_buf) {
3161
68
        AVFrameSideData *rpu = av_frame_new_side_data_from_buf(out, AV_FRAME_DATA_DOVI_RPU_BUFFER, s->rpu_buf);
3162
68
        if (!rpu)
3163
0
            return AVERROR(ENOMEM);
3164
3165
68
        s->rpu_buf = NULL;
3166
68
    }
3167
3168
48.4k
    if ((ret = ff_dovi_attach_side_data(&s->dovi_ctx, out)) < 0)
3169
0
        return ret;
3170
3171
48.4k
    if (s->sei.common.itut_t35.hdr_vivid) {
3172
120
        if (!av_frame_side_data_add(&out->side_data, &out->nb_side_data,
3173
120
                                    AV_FRAME_DATA_DYNAMIC_HDR_VIVID,
3174
120
                                    &s->sei.common.itut_t35.hdr_vivid,
3175
120
                                    AV_FRAME_SIDE_DATA_FLAG_NEW_REF))
3176
0
            return AVERROR(ENOMEM);
3177
120
    }
3178
3179
48.4k
    return 0;
3180
48.4k
}
3181
3182
static int find_finish_setup_nal(const HEVCContext *s)
3183
48.3k
{
3184
48.3k
    int nal_idx = 0;
3185
3186
586k
    for (int i = nal_idx; i < s->pkt.nb_nals; i++) {
3187
537k
        const H2645NAL *nal = &s->pkt.nals[i];
3188
537k
        const int  layer_id = nal->nuh_layer_id;
3189
537k
        GetBitContext    gb = nal->gb;
3190
3191
537k
        if (layer_id > HEVC_MAX_NUH_LAYER_ID || s->vps->layer_idx[layer_id] < 0 ||
3192
405k
            !(s->layers_active_decode & (1 << s->vps->layer_idx[layer_id])))
3193
133k
            continue;
3194
3195
404k
        switch (nal->type) {
3196
19.8k
        case HEVC_NAL_TRAIL_R:
3197
34.5k
        case HEVC_NAL_TRAIL_N:
3198
34.9k
        case HEVC_NAL_TSA_N:
3199
42.2k
        case HEVC_NAL_TSA_R:
3200
42.7k
        case HEVC_NAL_STSA_N:
3201
51.4k
        case HEVC_NAL_STSA_R:
3202
52.3k
        case HEVC_NAL_BLA_W_LP:
3203
53.5k
        case HEVC_NAL_BLA_W_RADL:
3204
56.8k
        case HEVC_NAL_BLA_N_LP:
3205
128k
        case HEVC_NAL_IDR_W_RADL:
3206
128k
        case HEVC_NAL_IDR_N_LP:
3207
129k
        case HEVC_NAL_CRA_NUT:
3208
133k
        case HEVC_NAL_RADL_N:
3209
138k
        case HEVC_NAL_RADL_R:
3210
139k
        case HEVC_NAL_RASL_N:
3211
141k
        case HEVC_NAL_RASL_R:
3212
141k
            if (!get_bits1(&gb)) // first_slice_segment_in_pic_flag
3213
37.3k
                continue;
3214
103k
            av_fallthrough;
3215
148k
        case HEVC_NAL_VPS:
3216
230k
        case HEVC_NAL_SPS:
3217
309k
        case HEVC_NAL_PPS:
3218
309k
            nal_idx = i;
3219
309k
            break;
3220
404k
        }
3221
404k
    }
3222
3223
48.3k
    return nal_idx;
3224
48.3k
}
3225
3226
static int hevc_frame_start(HEVCContext *s, HEVCLayerContext *l,
3227
                            unsigned nal_idx)
3228
69.9k
{
3229
69.9k
    const HEVCPPS *const pps = s->ps.pps_list[s->sh.pps_id];
3230
69.9k
    const HEVCSPS *const sps = pps->sps;
3231
69.9k
    int pic_size_in_ctb  = ((sps->width  >> sps->log2_min_cb_size) + 1) *
3232
69.9k
                           ((sps->height >> sps->log2_min_cb_size) + 1);
3233
69.9k
    int new_sequence = (l == &s->layers[0]) &&
3234
68.8k
                       (IS_IDR(s) || IS_BLA(s) || s->last_eos);
3235
69.9k
    int prev_layers_active_decode = s->layers_active_decode;
3236
69.9k
    int prev_layers_active_output = s->layers_active_output;
3237
69.9k
    int ret;
3238
3239
69.9k
    if (sps->vps != s->vps && l != &s->layers[0]) {
3240
10
        av_log(s->avctx, AV_LOG_ERROR, "VPS changed in a non-base layer\n");
3241
10
        set_sps(s, l, NULL);
3242
10
        return AVERROR_INVALIDDATA;
3243
10
    }
3244
3245
69.9k
    av_refstruct_replace(&s->pps, pps);
3246
69.9k
    if (l->sps != sps) {
3247
24.1k
        const HEVCSPS *sps_base = s->layers[0].sps;
3248
24.1k
        enum AVPixelFormat pix_fmt = sps->pix_fmt;
3249
3250
24.1k
        if (l != &s->layers[0]) {
3251
190
            if (!sps_base) {
3252
0
                av_log(s->avctx, AV_LOG_ERROR,
3253
0
                       "Access unit starts with a non-base layer frame\n");
3254
0
                return AVERROR_INVALIDDATA;
3255
0
            }
3256
3257
            // Files produced by Vision Pro lack VPS extension VUI,
3258
            // so the secondary layer has no range information.
3259
            // This check avoids failing in such a case.
3260
190
            if (sps_base->pix_fmt == AV_PIX_FMT_YUVJ420P &&
3261
13
                sps->pix_fmt == AV_PIX_FMT_YUV420P       &&
3262
0
                !sps->vui.common.video_signal_type_present_flag)
3263
0
                pix_fmt = sps_base->pix_fmt;
3264
3265
            // Ignore range mismatch between base layer and alpha layer
3266
190
            if (ff_hevc_is_alpha_video(s) &&
3267
2
                sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
3268
2
                pix_fmt == AV_PIX_FMT_YUVJ420P)
3269
0
                pix_fmt = sps_base->pix_fmt;
3270
3271
190
            if (pix_fmt     != sps_base->pix_fmt ||
3272
97
                sps->width  != sps_base->width   ||
3273
137
                sps->height != sps_base->height) {
3274
137
                av_log(s->avctx, AV_LOG_ERROR,
3275
137
                       "Base/non-base layer SPS have unsupported parameter combination\n");
3276
137
                return AVERROR(ENOSYS);
3277
137
            }
3278
190
        }
3279
3280
24.0k
        ff_hevc_clear_refs(l);
3281
3282
24.0k
        ret = set_sps(s, l, sps);
3283
24.0k
        if (ret < 0)
3284
0
            return ret;
3285
3286
24.0k
        if (l == &s->layers[0]) {
3287
24.0k
            export_stream_params(s, sps);
3288
3289
24.0k
            ret = get_format(s, sps);
3290
24.0k
            if (ret < 0) {
3291
0
                set_sps(s, l, NULL);
3292
0
                return ret;
3293
0
            }
3294
3295
24.0k
            new_sequence = 1;
3296
24.0k
        }
3297
24.0k
    }
3298
3299
69.8k
    memset(l->horizontal_bs, 0, l->bs_width * l->bs_height);
3300
69.8k
    memset(l->vertical_bs,   0, l->bs_width * l->bs_height);
3301
69.8k
    memset(l->cbf_luma,      0, sps->min_tb_width * sps->min_tb_height);
3302
69.8k
    memset(l->is_pcm,        0, (sps->min_pu_width + 1) * (sps->min_pu_height + 1));
3303
69.8k
    memset(l->tab_slice_address, -1, pic_size_in_ctb * sizeof(*l->tab_slice_address));
3304
3305
69.8k
    if (IS_IDR(s))
3306
37.9k
        ff_hevc_clear_refs(l);
3307
3308
69.8k
    s->slice_idx         = 0;
3309
69.8k
    s->first_nal_type    = s->nal_unit_type;
3310
69.8k
    s->poc               = s->sh.poc;
3311
3312
69.8k
    if (IS_IRAP(s)) {
3313
41.8k
        s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) ||
3314
276
                                 (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos);
3315
41.8k
        s->recovery_poc = HEVC_RECOVERY_END;
3316
41.8k
    }
3317
3318
69.8k
    if (s->recovery_poc != HEVC_RECOVERY_END &&
3319
22.2k
        s->sei.recovery_point.has_recovery_poc) {
3320
2.19k
        if (s->recovery_poc == HEVC_RECOVERY_UNSPECIFIED)
3321
2.00k
            s->recovery_poc = s->poc + s->sei.recovery_point.recovery_poc_cnt;
3322
190
        else if (s->poc >= s->recovery_poc)
3323
71
            s->recovery_poc = HEVC_RECOVERY_END;
3324
2.19k
    }
3325
3326
    /* 8.3.1 */
3327
69.8k
    if (s->temporal_id == 0 &&
3328
68.6k
        s->nal_unit_type != HEVC_NAL_TRAIL_N &&
3329
64.1k
        s->nal_unit_type != HEVC_NAL_TSA_N   &&
3330
64.0k
        s->nal_unit_type != HEVC_NAL_STSA_N  &&
3331
63.9k
        s->nal_unit_type != HEVC_NAL_RADL_N  &&
3332
63.6k
        s->nal_unit_type != HEVC_NAL_RADL_R  &&
3333
62.3k
        s->nal_unit_type != HEVC_NAL_RASL_N  &&
3334
61.2k
        s->nal_unit_type != HEVC_NAL_RASL_R)
3335
60.4k
        s->poc_tid0 = s->poc;
3336
3337
69.8k
    if (pps->tiles_enabled_flag)
3338
16.4k
        s->local_ctx[0].end_of_tiles_x = pps->column_width[0] << sps->log2_ctb_size;
3339
3340
69.8k
    if (new_sequence) {
3341
58.2k
        ret = ff_hevc_output_frames(s, prev_layers_active_decode, prev_layers_active_output,
3342
58.2k
                                    0, 0, s->sh.no_output_of_prior_pics_flag);
3343
58.2k
        if (ret < 0)
3344
0
            return ret;
3345
58.2k
    }
3346
3347
69.8k
    ret = export_stream_params_from_sei(s);
3348
69.8k
    if (ret < 0)
3349
0
        return ret;
3350
3351
69.8k
    ret = ff_hevc_set_new_ref(s, l, s->poc);
3352
69.8k
    if (ret < 0)
3353
3.07k
        goto fail;
3354
3355
66.7k
    ret = ff_hevc_frame_rps(s, l);
3356
66.7k
    if (ret < 0) {
3357
18.3k
        av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
3358
18.3k
        goto fail;
3359
18.3k
    }
3360
3361
48.4k
    if (IS_IRAP(s))
3362
40.0k
        s->cur_frame->f->flags |= AV_FRAME_FLAG_KEY;
3363
8.40k
    else
3364
8.40k
        s->cur_frame->f->flags &= ~AV_FRAME_FLAG_KEY;
3365
3366
48.4k
    s->cur_frame->needs_fg = ((s->sei.common.film_grain_characteristics &&
3367
1.89k
                               s->sei.common.film_grain_characteristics->present) ||
3368
47.0k
                              s->sei.common.itut_t35.aom_film_grain.enable) &&
3369
1.39k
        !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
3370
1.39k
        !s->avctx->hwaccel;
3371
3372
48.4k
    ret = set_side_data(s);
3373
48.4k
    if (ret < 0)
3374
0
        goto fail;
3375
3376
48.4k
    if (s->cur_frame->needs_fg &&
3377
1.39k
        (s->sei.common.film_grain_characteristics && s->sei.common.film_grain_characteristics->present &&
3378
581
         !ff_h274_film_grain_params_supported(s->sei.common.film_grain_characteristics->model_id,
3379
581
                                              s->cur_frame->f->format) ||
3380
1.10k
         !av_film_grain_params_select(s->cur_frame->f))) {
3381
406
        av_log_once(s->avctx, AV_LOG_WARNING, AV_LOG_DEBUG, &s->film_grain_warning_shown,
3382
406
                    "Unsupported film grain parameters. Ignoring film grain.\n");
3383
406
        s->cur_frame->needs_fg = 0;
3384
406
    }
3385
3386
48.4k
    if (s->cur_frame->needs_fg) {
3387
984
        s->cur_frame->frame_grain->format = s->cur_frame->f->format;
3388
984
        s->cur_frame->frame_grain->width  = s->cur_frame->f->width;
3389
984
        s->cur_frame->frame_grain->height = s->cur_frame->f->height;
3390
984
        if ((ret = ff_thread_get_buffer(s->avctx, s->cur_frame->frame_grain, 0)) < 0)
3391
4
            goto fail;
3392
3393
980
        ret = av_frame_copy_props(s->cur_frame->frame_grain, s->cur_frame->f);
3394
980
        if (ret < 0)
3395
0
            goto fail;
3396
980
    }
3397
3398
48.4k
    s->cur_frame->f->pict_type = 3 - s->sh.slice_type;
3399
3400
48.4k
    ret = ff_hevc_output_frames(s, s->layers_active_decode, s->layers_active_output,
3401
48.4k
                                sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics,
3402
48.4k
                                sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3403
48.4k
    if (ret < 0)
3404
0
        goto fail;
3405
3406
48.4k
    if (s->avctx->hwaccel) {
3407
0
        AVCodecInternal *avci = s->avctx->internal;
3408
0
        AVPacket *avpkt = avci->in_pkt;
3409
0
        ret = FF_HW_CALL(s->avctx, start_frame,
3410
0
                         avpkt->buf, NULL, 0);
3411
0
        if (ret < 0)
3412
0
            goto fail;
3413
0
    }
3414
3415
    // after starting the base-layer frame we know which layers will be decoded,
3416
    // so we can now figure out which NALUs to wait for before we can call
3417
    // ff_thread_finish_setup()
3418
48.4k
    if (l == &s->layers[0])
3419
48.3k
        s->finish_setup_nal_idx = find_finish_setup_nal(s);
3420
3421
48.4k
    if (nal_idx >= s->finish_setup_nal_idx)
3422
42.3k
        ff_thread_finish_setup(s->avctx);
3423
3424
48.4k
    return 0;
3425
3426
21.3k
fail:
3427
21.3k
    if (l->cur_frame)
3428
18.3k
        ff_hevc_unref_frame(l->cur_frame, ~0);
3429
21.3k
    l->cur_frame = NULL;
3430
21.3k
    s->cur_frame = s->collocated_ref = NULL;
3431
21.3k
    return ret;
3432
48.4k
}
3433
3434
static int verify_md5(HEVCContext *s, AVFrame *frame)
3435
2.05k
{
3436
2.05k
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
3437
2.05k
    char msg_buf[4 * (50 + 2 * 2 * 16 /* MD5-size */)];
3438
2.05k
    int pixel_shift;
3439
2.05k
    int err = 0;
3440
2.05k
    int i, j;
3441
3442
2.05k
    if (!desc)
3443
0
        return AVERROR(EINVAL);
3444
3445
2.05k
    pixel_shift = desc->comp[0].depth > 8;
3446
3447
    /* the checksums are LE, so we have to byteswap for >8bpp formats
3448
     * on BE arches */
3449
#if HAVE_BIGENDIAN
3450
    if (pixel_shift && !s->checksum_buf) {
3451
        av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
3452
                       FFMAX3(frame->linesize[0], frame->linesize[1],
3453
                              frame->linesize[2]));
3454
        if (!s->checksum_buf)
3455
            return AVERROR(ENOMEM);
3456
    }
3457
#endif
3458
3459
2.05k
    msg_buf[0] = '\0';
3460
8.21k
    for (i = 0; frame->data[i]; i++) {
3461
6.15k
        int width  = s->avctx->coded_width;
3462
6.15k
        int height = s->avctx->coded_height;
3463
6.15k
        int w = (i == 1 || i == 2) ? (width  >> desc->log2_chroma_w) : width;
3464
6.15k
        int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3465
6.15k
        uint8_t md5[16];
3466
3467
6.15k
        av_md5_init(s->md5_ctx);
3468
1.07M
        for (j = 0; j < h; j++) {
3469
1.06M
            const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3470
#if HAVE_BIGENDIAN
3471
            if (pixel_shift) {
3472
                s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3473
                                    (const uint16_t *) src, w);
3474
                src = s->checksum_buf;
3475
            }
3476
#endif
3477
1.06M
            av_md5_update(s->md5_ctx, src, w << pixel_shift);
3478
1.06M
        }
3479
6.15k
        av_md5_final(s->md5_ctx, md5);
3480
3481
6.15k
#define MD5_PRI "%016" PRIx64 "%016" PRIx64
3482
11.8k
#define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3483
3484
6.15k
        if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) {
3485
498
            av_strlcatf(msg_buf, sizeof(msg_buf),
3486
498
                        "plane %d - correct " MD5_PRI "; ",
3487
498
                        i, MD5_PRI_ARG(md5));
3488
5.65k
        } else {
3489
5.65k
            av_strlcatf(msg_buf, sizeof(msg_buf),
3490
5.65k
                       "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3491
5.65k
                        i, MD5_PRI_ARG(md5), MD5_PRI_ARG(s->sei.picture_hash.md5[i]));
3492
5.65k
            err = AVERROR_INVALIDDATA;
3493
5.65k
        }
3494
6.15k
    }
3495
3496
2.05k
    av_log(s->avctx, err < 0 ? AV_LOG_ERROR : AV_LOG_DEBUG,
3497
2.05k
           "Verifying checksum for frame with POC %d: %s\n",
3498
2.05k
           s->poc, msg_buf);
3499
3500
2.05k
    return err;
3501
2.05k
    }
3502
3503
static int hevc_frame_end(HEVCContext *s, HEVCLayerContext *l)
3504
44.9k
{
3505
44.9k
    HEVCFrame *out = l->cur_frame;
3506
44.9k
    const AVFilmGrainParams *fgp;
3507
44.9k
    av_unused int ret;
3508
3509
44.9k
    if (out->needs_fg) {
3510
958
        av_assert0(out->frame_grain->buf[0]);
3511
958
        fgp = av_film_grain_params_select(out->f);
3512
958
        switch (fgp->type) {
3513
0
        case AV_FILM_GRAIN_PARAMS_NONE:
3514
0
            av_assert0(0);
3515
0
            return AVERROR_BUG;
3516
958
        case AV_FILM_GRAIN_PARAMS_H274:
3517
958
            ret = ff_h274_apply_film_grain(out->frame_grain, out->f, fgp);
3518
958
            break;
3519
0
        case AV_FILM_GRAIN_PARAMS_AV1:
3520
0
            ret = ff_aom_apply_film_grain(out->frame_grain, out->f, fgp);
3521
0
            break;
3522
958
        }
3523
958
        av_assert1(ret >= 0);
3524
958
    }
3525
3526
44.9k
    if (s->avctx->hwaccel) {
3527
0
        ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame);
3528
0
        if (ret < 0) {
3529
0
            av_log(s->avctx, AV_LOG_ERROR,
3530
0
                   "hardware accelerator failed to decode picture\n");
3531
0
            return ret;
3532
0
        }
3533
44.9k
    } else {
3534
44.9k
        if (s->avctx->err_recognition & AV_EF_CRCCHECK &&
3535
11.8k
            s->sei.picture_hash.is_md5) {
3536
2.05k
            ret = verify_md5(s, out->f);
3537
2.05k
            if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE)
3538
479
                return ret;
3539
2.05k
        }
3540
44.9k
    }
3541
44.4k
    s->sei.picture_hash.is_md5 = 0;
3542
3543
44.4k
    av_log(s->avctx, AV_LOG_DEBUG, "Decoded frame with POC %zu/%d.\n",
3544
44.4k
           l - s->layers, s->poc);
3545
3546
44.4k
    return 0;
3547
44.9k
}
3548
3549
static int decode_slice(HEVCContext *s, unsigned nal_idx, GetBitContext *gb)
3550
682k
{
3551
682k
    const int layer_idx = s->vps ? s->vps->layer_idx[s->nuh_layer_id] : 0;
3552
682k
    HEVCLayerContext *l;
3553
682k
    int ret;
3554
3555
    // skip layers not requested to be decoded
3556
    // layers_active_decode can only change while decoding a base-layer frame,
3557
    // so we can check it for non-base layers
3558
682k
    if (layer_idx < 0 ||
3559
645k
        (s->nuh_layer_id > 0 && !(s->layers_active_decode & (1 << layer_idx))))
3560
328k
        return 0;
3561
3562
    // the first slice of this picture was skipped, so drop the remaining
3563
    // slices before parsing, the context is stale for them
3564
354k
    if (s->skipping_frame && !show_bits1(gb))
3565
936
        return 0;
3566
3567
353k
    ret = hls_slice_header(&s->sh, s, gb);
3568
    // Once hls_slice_header has been called, the context is inconsistent with the slice header
3569
    // until the context is reinitialized according to the contents of the new slice header
3570
    // at the start of decode_slice_data.
3571
353k
    s->slice_initialized = 0;
3572
353k
    if (ret < 0) {
3573
253k
        return ret;
3574
253k
    }
3575
3576
100k
    if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
3577
99.3k
        (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) ||
3578
99.1k
        (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) ||
3579
99.0k
        ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) &&
3580
2.70k
         s->no_rasl_output_flag)) {
3581
2.43k
        if (s->sh.first_slice_in_pic_flag)
3582
2.43k
            s->skipping_frame = 1;
3583
2.43k
        return 0;
3584
2.43k
    }
3585
98.2k
    if (s->sh.first_slice_in_pic_flag)
3586
82.7k
        s->skipping_frame = 0;
3587
3588
    // switching to a new layer, mark previous layer's frame (if any) as done
3589
98.2k
    if (s->cur_layer != layer_idx &&
3590
84
        s->layers[s->cur_layer].cur_frame &&
3591
21
        s->avctx->active_thread_type == FF_THREAD_FRAME)
3592
0
        ff_progress_frame_report(&s->layers[s->cur_layer].cur_frame->tf, INT_MAX);
3593
3594
98.2k
    s->cur_layer = layer_idx;
3595
98.2k
    l = &s->layers[s->cur_layer];
3596
3597
98.2k
    if (s->sh.first_slice_in_pic_flag) {
3598
82.7k
        if (l->cur_frame) {
3599
12.8k
            av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
3600
12.8k
            return AVERROR_INVALIDDATA;
3601
12.8k
        }
3602
3603
69.9k
        ret = hevc_frame_start(s, l, nal_idx);
3604
69.9k
        if (ret < 0)
3605
21.5k
            return ret;
3606
69.9k
    } else if (!l->cur_frame) {
3607
2.56k
        av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
3608
2.56k
        return AVERROR_INVALIDDATA;
3609
2.56k
    }
3610
3611
61.3k
    if (s->nal_unit_type != s->first_nal_type) {
3612
536
        av_log(s->avctx, AV_LOG_ERROR,
3613
536
               "Non-matching NAL types of the VCL NALUs: %d %d\n",
3614
536
               s->first_nal_type, s->nal_unit_type);
3615
536
        return AVERROR_INVALIDDATA;
3616
536
    }
3617
3618
60.7k
    ret = decode_slice_data(s, l, &s->pkt.nals[nal_idx], gb);
3619
60.7k
    if (ret < 0)
3620
16.2k
        return ret;
3621
3622
44.4k
    return 0;
3623
60.7k
}
3624
3625
static int decode_nal_unit(HEVCContext *s, unsigned nal_idx)
3626
1.58M
{
3627
1.58M
    H2645NAL *nal = &s->pkt.nals[nal_idx];
3628
1.58M
    GetBitContext     gb = nal->gb;
3629
1.58M
    int ret;
3630
3631
1.58M
    s->nal_unit_type = nal->type;
3632
1.58M
    s->nuh_layer_id  = nal->nuh_layer_id;
3633
1.58M
    s->temporal_id   = nal->temporal_id;
3634
3635
1.58M
    if (FF_HW_HAS_CB(s->avctx, decode_params) &&
3636
0
        (s->nal_unit_type == HEVC_NAL_VPS ||
3637
0
         s->nal_unit_type == HEVC_NAL_SPS ||
3638
0
         s->nal_unit_type == HEVC_NAL_PPS ||
3639
0
         s->nal_unit_type == HEVC_NAL_SEI_PREFIX ||
3640
0
         s->nal_unit_type == HEVC_NAL_SEI_SUFFIX)) {
3641
0
        ret = FF_HW_CALL(s->avctx, decode_params,
3642
0
                         nal->type, nal->raw_data, nal->raw_size);
3643
0
        if (ret < 0)
3644
0
            goto fail;
3645
0
    }
3646
3647
1.58M
    switch (s->nal_unit_type) {
3648
128k
    case HEVC_NAL_VPS:
3649
128k
        ret = ff_hevc_decode_nal_vps(&gb, s->avctx, &s->ps);
3650
128k
        if (ret < 0)
3651
62.6k
            goto fail;
3652
65.4k
        break;
3653
167k
    case HEVC_NAL_SPS:
3654
167k
        ret = ff_hevc_decode_nal_sps(&gb, s->avctx, &s->ps,
3655
167k
                                     nal->nuh_layer_id, s->apply_defdispwin);
3656
167k
        if (ret < 0)
3657
100k
            goto fail;
3658
66.8k
        break;
3659
208k
    case HEVC_NAL_PPS:
3660
208k
        ret = ff_hevc_decode_nal_pps(&gb, s->avctx, &s->ps);
3661
208k
        if (ret < 0)
3662
108k
            goto fail;
3663
99.5k
        break;
3664
243k
    case HEVC_NAL_SEI_PREFIX:
3665
263k
    case HEVC_NAL_SEI_SUFFIX:
3666
263k
        ret = ff_hevc_decode_nal_sei(&gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type);
3667
263k
        if (ret < 0)
3668
240k
            goto fail;
3669
22.3k
        break;
3670
80.6k
    case HEVC_NAL_TRAIL_R:
3671
140k
    case HEVC_NAL_TRAIL_N:
3672
143k
    case HEVC_NAL_TSA_N:
3673
158k
    case HEVC_NAL_TSA_R:
3674
163k
    case HEVC_NAL_STSA_N:
3675
226k
    case HEVC_NAL_STSA_R:
3676
260k
    case HEVC_NAL_BLA_W_LP:
3677
264k
    case HEVC_NAL_BLA_W_RADL:
3678
273k
    case HEVC_NAL_BLA_N_LP:
3679
392k
    case HEVC_NAL_IDR_W_RADL:
3680
412k
    case HEVC_NAL_IDR_N_LP:
3681
415k
    case HEVC_NAL_CRA_NUT:
3682
426k
    case HEVC_NAL_RADL_N:
3683
665k
    case HEVC_NAL_RADL_R:
3684
675k
    case HEVC_NAL_RASL_N:
3685
682k
    case HEVC_NAL_RASL_R:
3686
682k
        ret = decode_slice(s, nal_idx, &gb);
3687
682k
        if (ret < 0)
3688
307k
            goto fail;
3689
375k
        break;
3690
375k
    case HEVC_NAL_EOS_NUT:
3691
7.56k
    case HEVC_NAL_EOB_NUT:
3692
31.9k
    case HEVC_NAL_AUD:
3693
32.5k
    case HEVC_NAL_FD_NUT:
3694
48.8k
    case HEVC_NAL_UNSPEC62: // Dolby Vision RPU
3695
49.3k
    case HEVC_NAL_UNSPEC63: // Dolby Vision EL
3696
49.3k
        break;
3697
88.1k
    default:
3698
88.1k
        av_log(s->avctx, AV_LOG_VERBOSE,
3699
88.1k
               "Skipping NAL unit %d\n", s->nal_unit_type);
3700
1.58M
    }
3701
3702
767k
    return 0;
3703
819k
fail:
3704
819k
    if (ret == AVERROR_INVALIDDATA &&
3705
806k
        !(s->avctx->err_recognition & AV_EF_EXPLODE)) {
3706
782k
        av_log(s->avctx, AV_LOG_WARNING,
3707
782k
               "Skipping invalid undecodable NALU: %d\n", s->nal_unit_type);
3708
782k
        return 0;
3709
782k
    }
3710
36.6k
    return ret;
3711
819k
}
3712
3713
static void decode_reset_recovery_point(HEVCContext *s)
3714
107k
{
3715
107k
    s->recovery_poc = HEVC_RECOVERY_UNSPECIFIED;
3716
107k
    s->sei.recovery_point.has_recovery_poc = 0;
3717
107k
}
3718
3719
static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
3720
243k
{
3721
243k
    int ret = 0;
3722
243k
    int eos_at_start = 1;
3723
243k
    int flags = (H2645_FLAG_IS_NALFF * !!s->is_nalff) | H2645_FLAG_SMALL_PADDING;
3724
3725
243k
    s->cur_frame = s->collocated_ref = NULL;
3726
243k
    s->last_eos = s->eos;
3727
243k
    s->eos = 0;
3728
243k
    s->slice_initialized = 0;
3729
243k
    if (s->last_eos)
3730
105k
        decode_reset_recovery_point(s);
3731
3732
730k
    for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3733
486k
        HEVCLayerContext *l = &s->layers[i];
3734
486k
        l->cur_frame = NULL;
3735
486k
    }
3736
3737
    /* split the input packet into NAL units, so we know the upper bound on the
3738
     * number of slices in the frame */
3739
243k
    ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx,
3740
243k
                                s->nal_length_size, s->avctx->codec_id, flags);
3741
243k
    if (ret < 0) {
3742
15.8k
        av_log(s->avctx, AV_LOG_ERROR,
3743
15.8k
               "Error splitting the input into NAL units.\n");
3744
15.8k
        return ret;
3745
15.8k
    }
3746
3747
2.16M
    for (int i = 0; i < s->pkt.nb_nals; i++) {
3748
1.93M
        if (s->pkt.nals[i].type == HEVC_NAL_EOB_NUT ||
3749
1.93M
            s->pkt.nals[i].type == HEVC_NAL_EOS_NUT) {
3750
11.2k
            if (eos_at_start) {
3751
1.84k
                s->last_eos = 1;
3752
1.84k
                decode_reset_recovery_point(s);
3753
9.41k
            } else {
3754
9.41k
                s->eos = 1;
3755
9.41k
            }
3756
1.92M
        } else {
3757
1.92M
            eos_at_start = 0;
3758
1.92M
        }
3759
1.93M
    }
3760
3761
    /*
3762
     * Check for RPU delimiter.
3763
     *
3764
     * Dolby Vision RPUs masquerade as unregistered NALs of type 62.
3765
     *
3766
     * We have to do this check here an create the rpu buffer, since RPUs are appended
3767
     * to the end of an AU; they are normally the last non-EOB/EOS NAL in the AU.
3768
     */
3769
227k
    H2645NAL *rpu_nal = NULL;
3770
1.91M
    for (int i = s->pkt.nb_nals - 1; i > 0 ; i--) {
3771
1.69M
        if (s->pkt.nals[i].type == HEVC_NAL_UNSPEC62 && s->pkt.nals[i].size > 2
3772
13.7k
            && !s->pkt.nals[i].nuh_layer_id && !s->pkt.nals[i].temporal_id) {
3773
13.0k
                rpu_nal = &s->pkt.nals[i];
3774
13.0k
                break;
3775
13.0k
        }
3776
1.69M
    }
3777
3778
227k
    if (rpu_nal) {
3779
13.0k
        if (s->rpu_buf) {
3780
626
            av_buffer_unref(&s->rpu_buf);
3781
626
            av_log(s->avctx, AV_LOG_WARNING, "Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3782
626
        }
3783
3784
13.0k
        s->rpu_buf = av_buffer_alloc(rpu_nal->raw_size - 2);
3785
13.0k
        if (!s->rpu_buf) {
3786
0
            ret = AVERROR(ENOMEM);
3787
0
            goto fail;
3788
0
        }
3789
13.0k
        memcpy(s->rpu_buf->data, rpu_nal->raw_data + 2, rpu_nal->raw_size - 2);
3790
3791
13.0k
        ret = ff_dovi_rpu_parse(&s->dovi_ctx, rpu_nal->data + 2, rpu_nal->size - 2,
3792
13.0k
                                s->avctx->err_recognition);
3793
13.0k
        if (ret < 0) {
3794
12.0k
            av_buffer_unref(&s->rpu_buf);
3795
12.0k
            av_log(s->avctx, AV_LOG_WARNING, "Error parsing DOVI NAL unit.\n");
3796
            /* ignore */
3797
12.0k
        }
3798
13.0k
    }
3799
3800
    /* decode the NAL units */
3801
1.80M
    for (int i = 0; i < s->pkt.nb_nals; i++) {
3802
1.61M
        H2645NAL *nal = &s->pkt.nals[i];
3803
3804
1.61M
        if (s->avctx->skip_frame >= AVDISCARD_ALL ||
3805
1.59M
            (s->avctx->skip_frame >= AVDISCARD_NONREF && ff_hevc_nal_is_nonref(nal->type)))
3806
22.9k
            continue;
3807
3808
1.58M
        ret = decode_nal_unit(s, i);
3809
1.58M
        if (ret < 0) {
3810
36.6k
            av_log(s->avctx, AV_LOG_WARNING,
3811
36.6k
                   "Error parsing NAL unit #%d.\n", i);
3812
36.6k
            goto fail;
3813
36.6k
        }
3814
1.58M
    }
3815
3816
227k
fail:
3817
682k
    for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3818
455k
        HEVCLayerContext *l = &s->layers[i];
3819
3820
455k
        if (!l->cur_frame)
3821
406k
            continue;
3822
3823
48.4k
        if (ret >= 0)
3824
44.9k
            ret = hevc_frame_end(s, l);
3825
3826
48.4k
        if (s->avctx->active_thread_type == FF_THREAD_FRAME)
3827
0
            ff_progress_frame_report(&l->cur_frame->tf, INT_MAX);
3828
48.4k
    }
3829
3830
227k
    return ret;
3831
227k
}
3832
3833
static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
3834
380
{
3835
380
    int ret, i;
3836
3837
380
    ret = ff_hevc_decode_extradata(buf, length, &s->ps, &s->sei, &s->is_nalff,
3838
380
                                   &s->nal_length_size, s->avctx->err_recognition,
3839
380
                                   s->apply_defdispwin, s->avctx);
3840
380
    if (ret < 0)
3841
47
        return ret;
3842
3843
    /* export stream parameters from the first SPS */
3844
5.23k
    for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3845
4.92k
        if (first && s->ps.sps_list[i]) {
3846
27
            const HEVCSPS *sps = s->ps.sps_list[i];
3847
27
            export_stream_params(s, sps);
3848
3849
27
            ret = export_multilayer(s, sps->vps);
3850
27
            if (ret < 0)
3851
0
                return ret;
3852
3853
27
            break;
3854
27
        }
3855
4.92k
    }
3856
3857
    /* export stream parameters from SEI */
3858
333
    ret = export_stream_params_from_sei(s);
3859
333
    if (ret < 0)
3860
0
        return ret;
3861
3862
333
    return 0;
3863
333
}
3864
3865
static int hevc_receive_frame(AVCodecContext *avctx, AVFrame *frame)
3866
452k
{
3867
452k
    HEVCContext        *s = avctx->priv_data;
3868
452k
    AVCodecInternal *avci = avctx->internal;
3869
452k
    AVPacket       *avpkt = avci->in_pkt;
3870
3871
452k
    int ret;
3872
452k
    uint8_t *sd;
3873
452k
    size_t sd_size;
3874
3875
452k
    s->pkt_dts = AV_NOPTS_VALUE;
3876
3877
452k
    if (av_container_fifo_can_read(s->output_fifo))
3878
3.64k
        goto do_output;
3879
3880
448k
    av_packet_unref(avpkt);
3881
448k
    ret = ff_decode_get_packet(avctx, avpkt);
3882
448k
    if (ret == AVERROR_EOF) {
3883
19.4k
        ret = ff_hevc_output_frames(s, s->layers_active_decode,
3884
19.4k
                                    s->layers_active_output, 0, 0, 0);
3885
19.4k
        if (ret < 0)
3886
0
            return ret;
3887
19.4k
        goto do_output;
3888
429k
    } else if (ret < 0)
3889
185k
        return ret;
3890
3891
243k
    s->pkt_dts = avpkt->dts;
3892
3893
243k
    sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, &sd_size);
3894
243k
    if (sd && sd_size > 0) {
3895
0
        ret = hevc_decode_extradata(s, sd, sd_size, 0);
3896
0
        if (ret < 0)
3897
0
            return ret;
3898
0
    }
3899
3900
243k
    sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
3901
243k
    if (sd && sd_size >= sizeof(s->dovi_ctx.cfg)) {
3902
0
        int old = s->dovi_ctx.cfg.dv_profile;
3903
0
        s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd;
3904
0
        if (old)
3905
0
            av_log(avctx, AV_LOG_DEBUG,
3906
0
                   "New DOVI configuration record from input packet (profile %d -> %u).\n",
3907
0
                   old, s->dovi_ctx.cfg.dv_profile);
3908
0
    }
3909
3910
243k
    ret    = decode_nal_units(s, avpkt->data, avpkt->size);
3911
243k
    if (ret < 0)
3912
53.7k
        return ret;
3913
3914
212k
do_output:
3915
212k
    if (av_container_fifo_read(s->output_fifo, frame, 0) >= 0) {
3916
43.0k
        if (!(avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN))
3917
43.0k
            av_frame_remove_side_data(frame, AV_FRAME_DATA_FILM_GRAIN_PARAMS);
3918
3919
43.0k
        return 0;
3920
43.0k
    }
3921
3922
169k
    return avci->draining ? AVERROR_EOF : AVERROR(EAGAIN);
3923
212k
}
3924
3925
static int hevc_ref_frame(HEVCFrame *dst, const HEVCFrame *src)
3926
0
{
3927
0
    int ret;
3928
3929
0
    ff_progress_frame_ref(&dst->tf, &src->tf);
3930
3931
0
    if (src->needs_fg) {
3932
0
        ret = av_frame_ref(dst->frame_grain, src->frame_grain);
3933
0
        if (ret < 0) {
3934
0
            ff_hevc_unref_frame(dst, ~0);
3935
0
            return ret;
3936
0
        }
3937
0
        dst->needs_fg = 1;
3938
0
    }
3939
3940
0
    dst->pps     = av_refstruct_ref_c(src->pps);
3941
0
    dst->tab_mvf = av_refstruct_ref(src->tab_mvf);
3942
0
    dst->rpl_tab = av_refstruct_ref(src->rpl_tab);
3943
0
    dst->rpl = av_refstruct_ref(src->rpl);
3944
0
    dst->nb_rpl_elems = src->nb_rpl_elems;
3945
3946
0
    dst->poc        = src->poc;
3947
0
    dst->ctb_count  = src->ctb_count;
3948
0
    dst->flags      = src->flags;
3949
3950
0
    dst->base_layer_frame = src->base_layer_frame;
3951
3952
0
    av_refstruct_replace(&dst->hwaccel_picture_private,
3953
0
                          src->hwaccel_picture_private);
3954
3955
0
    return 0;
3956
0
}
3957
3958
static av_cold int hevc_decode_free(AVCodecContext *avctx)
3959
41.5k
{
3960
41.5k
    HEVCContext       *s = avctx->priv_data;
3961
3962
124k
    for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3963
83.0k
        pic_arrays_free(&s->layers[i]);
3964
83.0k
        av_refstruct_unref(&s->layers[i].sps);
3965
83.0k
    }
3966
3967
41.5k
    av_refstruct_unref(&s->vps);
3968
41.5k
    av_refstruct_unref(&s->pps);
3969
3970
41.5k
    ff_dovi_ctx_unref(&s->dovi_ctx);
3971
41.5k
    av_buffer_unref(&s->rpu_buf);
3972
3973
41.5k
    av_freep(&s->md5_ctx);
3974
3975
41.5k
    av_container_fifo_free(&s->output_fifo);
3976
3977
124k
    for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
3978
83.0k
        HEVCLayerContext *l = &s->layers[layer];
3979
2.74M
        for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
3980
2.65M
            ff_hevc_unref_frame(&l->DPB[i], ~0);
3981
2.65M
            av_frame_free(&l->DPB[i].frame_grain);
3982
2.65M
        }
3983
83.0k
    }
3984
3985
41.5k
    ff_hevc_ps_uninit(&s->ps);
3986
3987
41.5k
    for (int i = 0; i < s->nb_wpp_progress; i++)
3988
0
        ff_thread_progress_destroy(&s->wpp_progress[i]);
3989
41.5k
    av_freep(&s->wpp_progress);
3990
3991
41.5k
    av_freep(&s->sh.entry_point_offset);
3992
41.5k
    av_freep(&s->sh.offset);
3993
41.5k
    av_freep(&s->sh.size);
3994
3995
41.5k
    av_freep(&s->local_ctx);
3996
3997
41.5k
    ff_h2645_packet_uninit(&s->pkt);
3998
3999
41.5k
    ff_hevc_reset_sei(&s->sei);
4000
4001
41.5k
    return 0;
4002
41.5k
}
4003
4004
static av_cold int hevc_init_context(AVCodecContext *avctx)
4005
41.5k
{
4006
41.5k
    HEVCContext *s = avctx->priv_data;
4007
4008
41.5k
    s->avctx = avctx;
4009
4010
41.5k
    s->local_ctx = av_mallocz(sizeof(*s->local_ctx));
4011
41.5k
    if (!s->local_ctx)
4012
0
        return AVERROR(ENOMEM);
4013
41.5k
    s->nb_local_ctx = 1;
4014
4015
41.5k
    s->local_ctx[0].parent = s;
4016
41.5k
    s->local_ctx[0].logctx = avctx;
4017
41.5k
    s->local_ctx[0].common_cabac_state = &s->cabac;
4018
4019
41.5k
    s->output_fifo = av_container_fifo_alloc_avframe(0);
4020
41.5k
    if (!s->output_fifo)
4021
0
        return AVERROR(ENOMEM);
4022
4023
124k
    for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
4024
83.0k
        HEVCLayerContext *l = &s->layers[layer];
4025
2.74M
        for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
4026
2.65M
            l->DPB[i].frame_grain = av_frame_alloc();
4027
2.65M
            if (!l->DPB[i].frame_grain)
4028
0
                return AVERROR(ENOMEM);
4029
2.65M
        }
4030
83.0k
    }
4031
4032
41.5k
    s->md5_ctx = av_md5_alloc();
4033
41.5k
    if (!s->md5_ctx)
4034
0
        return AVERROR(ENOMEM);
4035
4036
41.5k
    ff_bswapdsp_init(&s->bdsp);
4037
4038
41.5k
    s->dovi_ctx.logctx = avctx;
4039
41.5k
    s->eos = 0;
4040
4041
41.5k
    ff_hevc_reset_sei(&s->sei);
4042
4043
41.5k
    return 0;
4044
41.5k
}
4045
4046
#if HAVE_THREADS
4047
static int hevc_update_thread_context(AVCodecContext *dst,
4048
                                      const AVCodecContext *src)
4049
0
{
4050
0
    HEVCContext *s  = dst->priv_data;
4051
0
    HEVCContext *s0 = src->priv_data;
4052
0
    int ret;
4053
4054
0
    for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
4055
0
        HEVCLayerContext        *l = &s->layers[layer];
4056
0
        const HEVCLayerContext *l0 = &s0->layers[layer];
4057
0
        for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
4058
0
            ff_hevc_unref_frame(&l->DPB[i], ~0);
4059
0
            if (l0->DPB[i].f) {
4060
0
                ret = hevc_ref_frame(&l->DPB[i], &l0->DPB[i]);
4061
0
                if (ret < 0)
4062
0
                    return ret;
4063
0
            }
4064
0
        }
4065
4066
0
        if (l->sps != l0->sps) {
4067
0
            ret = set_sps(s, l, l0->sps);
4068
0
            if (ret < 0)
4069
0
                return ret;
4070
0
        }
4071
0
    }
4072
4073
0
    for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++)
4074
0
        av_refstruct_replace(&s->ps.vps_list[i], s0->ps.vps_list[i]);
4075
4076
0
    for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++)
4077
0
        av_refstruct_replace(&s->ps.sps_list[i], s0->ps.sps_list[i]);
4078
4079
0
    for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++)
4080
0
        av_refstruct_replace(&s->ps.pps_list[i], s0->ps.pps_list[i]);
4081
4082
    // PPS do not persist between frames
4083
0
    av_refstruct_unref(&s->pps);
4084
4085
0
    s->poc_tid0   = s0->poc_tid0;
4086
0
    s->eos        = s0->eos;
4087
0
    s->no_rasl_output_flag = s0->no_rasl_output_flag;
4088
0
    s->skipping_frame = s0->skipping_frame;
4089
4090
0
    s->is_nalff        = s0->is_nalff;
4091
0
    s->nal_length_size = s0->nal_length_size;
4092
0
    s->layers_active_decode = s0->layers_active_decode;
4093
0
    s->layers_active_output = s0->layers_active_output;
4094
4095
0
    s->film_grain_warning_shown = s0->film_grain_warning_shown;
4096
4097
0
    if (s->nb_view_ids != s0->nb_view_ids ||
4098
0
        memcmp(s->view_ids, s0->view_ids, sizeof(*s->view_ids) * s->nb_view_ids)) {
4099
0
        av_freep(&s->view_ids);
4100
0
        s->nb_view_ids = 0;
4101
4102
0
        if (s0->nb_view_ids) {
4103
0
            s->view_ids = av_memdup(s0->view_ids, s0->nb_view_ids * sizeof(*s0->view_ids));
4104
0
            if (!s->view_ids)
4105
0
                return AVERROR(ENOMEM);
4106
0
            s->nb_view_ids = s0->nb_view_ids;
4107
0
        }
4108
0
    }
4109
4110
0
    ret = ff_h2645_sei_ctx_replace(&s->sei.common, &s0->sei.common);
4111
0
    if (ret < 0)
4112
0
        return ret;
4113
4114
0
    ret = av_buffer_replace(&s->sei.common.itut_t35.hdr_plus,
4115
0
                            s0->sei.common.itut_t35.hdr_plus);
4116
0
    if (ret < 0)
4117
0
        return ret;
4118
4119
0
    ret = av_buffer_replace(&s->rpu_buf, s0->rpu_buf);
4120
0
    if (ret < 0)
4121
0
        return ret;
4122
4123
0
    ff_dovi_ctx_replace(&s->dovi_ctx, &s0->dovi_ctx);
4124
4125
0
    ret = av_buffer_replace(&s->sei.common.itut_t35.hdr_vivid,
4126
0
                            s0->sei.common.itut_t35.hdr_vivid);
4127
0
    if (ret < 0)
4128
0
        return ret;
4129
4130
0
    s->sei.common.frame_packing        = s0->sei.common.frame_packing;
4131
0
    s->sei.common.display_orientation  = s0->sei.common.display_orientation;
4132
0
    s->sei.common.alternative_transfer = s0->sei.common.alternative_transfer;
4133
0
    s->sei.tdrdi                       = s0->sei.tdrdi;
4134
0
    s->sei.recovery_point              = s0->sei.recovery_point;
4135
0
    s->recovery_poc                    = s0->recovery_poc;
4136
4137
0
    return 0;
4138
0
}
4139
#endif
4140
4141
static int hevc_sei_to_context(AVCodecContext *avctx, HEVCSEI *sei)
4142
333
{
4143
333
    int ret;
4144
4145
333
    if (sei->tdrdi.present) {
4146
19
        AVBufferRef *buf;
4147
19
        size_t size;
4148
19
        AV3DReferenceDisplaysInfo *tdrdi = av_tdrdi_alloc(sei->tdrdi.num_ref_displays, &size);
4149
4150
19
        if (!tdrdi)
4151
0
            return AVERROR(ENOMEM);
4152
4153
19
        buf = av_buffer_create((uint8_t *)tdrdi, size, NULL, NULL, 0);
4154
19
        if (!buf) {
4155
0
            av_free(tdrdi);
4156
0
            return AVERROR(ENOMEM);
4157
0
        }
4158
4159
19
        tdrdi->prec_ref_display_width = sei->tdrdi.prec_ref_display_width;
4160
19
        tdrdi->ref_viewing_distance_flag = sei->tdrdi.ref_viewing_distance_flag;
4161
19
        tdrdi->prec_ref_viewing_dist = sei->tdrdi.prec_ref_viewing_dist;
4162
19
        tdrdi->num_ref_displays = sei->tdrdi.num_ref_displays;
4163
115
        for (int i = 0; i < sei->tdrdi.num_ref_displays; i++) {
4164
96
            AV3DReferenceDisplay *display = av_tdrdi_get_display(tdrdi, i);
4165
4166
96
            display->left_view_id                  = sei->tdrdi.left_view_id[i];
4167
96
            display->right_view_id                 = sei->tdrdi.right_view_id[i];
4168
96
            display->exponent_ref_display_width    = sei->tdrdi.exponent_ref_display_width[i];
4169
96
            display->mantissa_ref_display_width    = sei->tdrdi.mantissa_ref_display_width[i];
4170
96
            display->exponent_ref_viewing_distance = sei->tdrdi.exponent_ref_viewing_distance[i];
4171
96
            display->mantissa_ref_viewing_distance = sei->tdrdi.mantissa_ref_viewing_distance[i];
4172
96
            display->additional_shift_present_flag = sei->tdrdi.additional_shift_present_flag[i];
4173
96
            display->num_sample_shift              = sei->tdrdi.num_sample_shift[i];
4174
96
        }
4175
19
        ret = ff_frame_new_side_data_from_buf_ext(avctx, &avctx->decoded_side_data, &avctx->nb_decoded_side_data,
4176
19
                                                  AV_FRAME_DATA_3D_REFERENCE_DISPLAYS, &buf);
4177
19
        if (ret < 0) {
4178
0
            av_buffer_unref(&buf);
4179
0
            return ret;
4180
0
        }
4181
19
    }
4182
4183
333
    ret = ff_h2645_sei_to_context(avctx, &sei->common);
4184
333
    if (ret < 0)
4185
0
        return ret;
4186
4187
333
    return 0;
4188
333
}
4189
4190
static av_cold int hevc_decode_init(AVCodecContext *avctx)
4191
41.5k
{
4192
41.5k
    HEVCContext *s = avctx->priv_data;
4193
41.5k
    int ret;
4194
4195
41.5k
    ret = hevc_init_context(avctx);
4196
41.5k
    if (ret < 0)
4197
0
        return ret;
4198
4199
41.5k
    s->sei.picture_timing.picture_struct = 0;
4200
41.5k
    s->eos = 1;
4201
4202
41.5k
    atomic_init(&s->wpp_err, 0);
4203
4204
41.5k
    if (!avctx->internal->is_copy) {
4205
41.5k
        const AVPacketSideData *sd;
4206
4207
41.5k
        if (avctx->extradata_size > 0 && avctx->extradata) {
4208
380
            ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
4209
380
            if (ret < 0) {
4210
47
                return ret;
4211
47
            }
4212
4213
333
            ret = hevc_sei_to_context(avctx, &s->sei);
4214
333
            if (ret < 0)
4215
0
                return ret;
4216
333
        }
4217
4218
41.4k
        sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF);
4219
41.4k
        if (sd && sd->size >= sizeof(s->dovi_ctx.cfg))
4220
0
            s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data;
4221
41.4k
    }
4222
4223
41.4k
    return 0;
4224
41.5k
}
4225
4226
static av_cold void hevc_decode_flush(AVCodecContext *avctx)
4227
384k
{
4228
384k
    HEVCContext *s = avctx->priv_data;
4229
384k
    ff_hevc_flush_dpb(s);
4230
384k
    ff_hevc_reset_sei(&s->sei);
4231
384k
    ff_dovi_ctx_flush(&s->dovi_ctx);
4232
384k
    av_buffer_unref(&s->rpu_buf);
4233
384k
    s->eos = 1;
4234
384k
    s->skipping_frame = 0;
4235
4236
384k
    if (FF_HW_HAS_CB(avctx, flush))
4237
0
        FF_HW_SIMPLE_CALL(avctx, flush);
4238
384k
}
4239
4240
#define OFFSET(x) offsetof(HEVCContext, x)
4241
#define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4242
4243
static const AVOption options[] = {
4244
    { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
4245
        AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
4246
    { "strict-displaywin", "strictly apply default display window size", OFFSET(apply_defdispwin),
4247
        AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
4248
    { "view_ids", "Array of view IDs that should be decoded and output; a single -1 to decode all views",
4249
        .offset = OFFSET(view_ids), .type = AV_OPT_TYPE_INT | AV_OPT_TYPE_FLAG_ARRAY,
4250
        .min = -1, .max = INT_MAX, .flags = PAR },
4251
    { "view_ids_available", "Array of available view IDs is exported here",
4252
        .offset = OFFSET(view_ids_available), .type = AV_OPT_TYPE_UINT | AV_OPT_TYPE_FLAG_ARRAY,
4253
        .flags = PAR | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY },
4254
    { "view_pos_available", "Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4255
        .offset = OFFSET(view_pos_available), .type = AV_OPT_TYPE_UINT | AV_OPT_TYPE_FLAG_ARRAY,
4256
        .flags = PAR | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY, .unit = "view_pos" },
4257
        { "unspecified", .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_UNSPEC }, .unit = "view_pos" },
4258
        { "left",        .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_LEFT },   .unit = "view_pos" },
4259
        { "right",       .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_RIGHT },  .unit = "view_pos" },
4260
4261
    { NULL },
4262
};
4263
4264
static const AVClass hevc_decoder_class = {
4265
    .class_name = "HEVC decoder",
4266
    .item_name  = av_default_item_name,
4267
    .option     = options,
4268
    .version    = LIBAVUTIL_VERSION_INT,
4269
};
4270
4271
const FFCodec ff_hevc_decoder = {
4272
    .p.name                = "hevc",
4273
    CODEC_LONG_NAME("HEVC (High Efficiency Video Coding)"),
4274
    .p.type                = AVMEDIA_TYPE_VIDEO,
4275
    .p.id                  = AV_CODEC_ID_HEVC,
4276
    .priv_data_size        = sizeof(HEVCContext),
4277
    .p.priv_class          = &hevc_decoder_class,
4278
    .init                  = hevc_decode_init,
4279
    .close                 = hevc_decode_free,
4280
    FF_CODEC_RECEIVE_FRAME_CB(hevc_receive_frame),
4281
    .flush                 = hevc_decode_flush,
4282
    UPDATE_THREAD_CONTEXT(hevc_update_thread_context),
4283
    .p.capabilities        = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
4284
                             AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
4285
    .caps_internal         = FF_CODEC_CAP_EXPORTS_CROPPING |
4286
                             FF_CODEC_CAP_USES_PROGRESSFRAMES |
4287
                             FF_CODEC_CAP_INIT_CLEANUP,
4288
    .p.profiles            = NULL_IF_CONFIG_SMALL(ff_hevc_profiles),
4289
    .hw_configs            = (const AVCodecHWConfigInternal *const []) {
4290
#if CONFIG_HEVC_DXVA2_HWACCEL
4291
                               HWACCEL_DXVA2(hevc),
4292
#endif
4293
#if CONFIG_HEVC_D3D11VA_HWACCEL
4294
                               HWACCEL_D3D11VA(hevc),
4295
#endif
4296
#if CONFIG_HEVC_D3D11VA2_HWACCEL
4297
                               HWACCEL_D3D11VA2(hevc),
4298
#endif
4299
#if CONFIG_HEVC_D3D12VA_HWACCEL
4300
                               HWACCEL_D3D12VA(hevc),
4301
#endif
4302
#if CONFIG_HEVC_NVDEC_HWACCEL
4303
                               HWACCEL_NVDEC(hevc),
4304
#endif
4305
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
4306
                               HWACCEL_NVDEC_CUARRAY(hevc),
4307
#endif
4308
#if CONFIG_HEVC_VAAPI_HWACCEL
4309
                               HWACCEL_VAAPI(hevc),
4310
#endif
4311
#if CONFIG_HEVC_VDPAU_HWACCEL
4312
                               HWACCEL_VDPAU(hevc),
4313
#endif
4314
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4315
                               HWACCEL_VIDEOTOOLBOX(hevc),
4316
#endif
4317
#if CONFIG_HEVC_VULKAN_HWACCEL
4318
                               HWACCEL_VULKAN(hevc),
4319
#endif
4320
                               NULL
4321
                           },
4322
};