hevc_ps.c 67.3 KB
Newer Older
1
/*
Guillaume Martres's avatar
Guillaume Martres committed
2
 * HEVC Parameter Set decoding
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * Copyright (C) 2012 - 2103 Guillaume Martres
 * Copyright (C) 2012 - 2103 Mickael Raulet
 * Copyright (C) 2012 - 2013 Gildas Cocherel
 * Copyright (C) 2013 Vittorio Giovara
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "libavutil/imgutils.h"
Guillaume Martres's avatar
Guillaume Martres committed
27
#include "golomb.h"
28
#include "hevc_data.h"
29
#include "hevc_ps.h"
30 31 32 33 34 35 36 37 38

static const uint8_t default_scaling_list_intra[] = {
    16, 16, 16, 16, 17, 18, 21, 24,
    16, 16, 16, 16, 17, 19, 22, 25,
    16, 16, 17, 18, 20, 22, 25, 29,
    16, 16, 18, 21, 24, 27, 31, 36,
    17, 17, 20, 24, 30, 35, 41, 47,
    18, 19, 22, 27, 35, 44, 54, 65,
    21, 22, 25, 31, 41, 54, 70, 88,
Guillaume Martres's avatar
Guillaume Martres committed
39
    24, 25, 29, 36, 47, 65, 88, 115
40 41 42 43 44 45 46 47 48 49 50 51 52 53
};

static const uint8_t default_scaling_list_inter[] = {
    16, 16, 16, 16, 17, 18, 20, 24,
    16, 16, 16, 17, 18, 20, 24, 25,
    16, 16, 17, 18, 20, 24, 25, 28,
    16, 17, 18, 20, 24, 25, 28, 33,
    17, 18, 20, 24, 25, 28, 33, 41,
    18, 20, 24, 25, 28, 33, 41, 54,
    20, 24, 25, 28, 33, 41, 54, 71,
    24, 25, 28, 33, 41, 54, 71, 91
};

static const AVRational vui_sar[] = {
Guillaume Martres's avatar
Guillaume Martres committed
54 55
    {  0,   1 },
    {  1,   1 },
56 57 58 59 60 61 62 63 64 65 66 67
    { 12,  11 },
    { 10,  11 },
    { 16,  11 },
    { 40,  33 },
    { 24,  11 },
    { 20,  11 },
    { 32,  11 },
    { 80,  33 },
    { 18,  11 },
    { 15,  11 },
    { 64,  33 },
    { 160, 99 },
Guillaume Martres's avatar
Guillaume Martres committed
68 69 70
    {  4,   3 },
    {  3,   2 },
    {  2,   1 },
71 72
};

73 74 75 76 77 78 79 80
static const uint8_t hevc_sub_width_c[] = {
    1, 2, 2, 1
};

static const uint8_t hevc_sub_height_c[] = {
    1, 2, 1, 1
};

81
static void remove_pps(HEVCParamSets *s, int id)
82 83 84 85 86 87
{
    if (s->pps_list[id] && s->pps == (const HEVCPPS*)s->pps_list[id]->data)
        s->pps = NULL;
    av_buffer_unref(&s->pps_list[id]);
}

88
static void remove_sps(HEVCParamSets *s, int id)
89 90 91 92 93 94 95 96 97 98
{
    int i;
    if (s->sps_list[id]) {
        if (s->sps == (const HEVCSPS*)s->sps_list[id]->data)
            s->sps = NULL;

        /* drop all PPS that depend on this SPS */
        for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
            if (s->pps_list[i] && ((HEVCPPS*)s->pps_list[i]->data)->sps_id == id)
                remove_pps(s, i);
99

100
        av_assert0(!(s->sps_list[id] && s->sps == (HEVCSPS*)s->sps_list[id]->data));
101 102 103 104
    }
    av_buffer_unref(&s->sps_list[id]);
}

105
static void remove_vps(HEVCParamSets *s, int id)
106 107 108 109 110 111 112 113 114 115 116 117 118
{
    int i;
    if (s->vps_list[id]) {
        if (s->vps == (const HEVCVPS*)s->vps_list[id]->data)
            s->vps = NULL;

        for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
            if (s->sps_list[i] && ((HEVCSPS*)s->sps_list[i]->data)->vps_id == id)
                remove_sps(s, i);
    }
    av_buffer_unref(&s->vps_list[id]);
}

119 120
int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
                                  ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header)
121 122 123 124 125 126 127 128 129
{
    uint8_t rps_predict = 0;
    int delta_poc;
    int k0 = 0;
    int k1 = 0;
    int k  = 0;
    int i;

    if (rps != sps->st_rps && sps->nb_st_rps)
Guillaume Martres's avatar
Guillaume Martres committed
130
        rps_predict = get_bits1(gb);
131 132 133

    if (rps_predict) {
        const ShortTermRPS *rps_ridx;
134 135
        int delta_rps;
        unsigned abs_delta_rps;
136 137 138 139
        uint8_t use_delta_flag = 0;
        uint8_t delta_rps_sign;

        if (is_slice_header) {
140
            unsigned int delta_idx = get_ue_golomb_long(gb) + 1;
141
            if (delta_idx > sps->nb_st_rps) {
142
                av_log(avctx, AV_LOG_ERROR,
Guillaume Martres's avatar
Guillaume Martres committed
143 144
                       "Invalid value of delta_idx in slice header RPS: %d > %d.\n",
                       delta_idx, sps->nb_st_rps);
145 146 147
                return AVERROR_INVALIDDATA;
            }
            rps_ridx = &sps->st_rps[sps->nb_st_rps - delta_idx];
148
            rps->rps_idx_num_delta_pocs = rps_ridx->num_delta_pocs;
149 150 151 152
        } else
            rps_ridx = &sps->st_rps[rps - sps->st_rps - 1];

        delta_rps_sign = get_bits1(gb);
153
        abs_delta_rps  = get_ue_golomb_long(gb) + 1;
154
        if (abs_delta_rps < 1 || abs_delta_rps > 32768) {
155
            av_log(avctx, AV_LOG_ERROR,
156 157 158 159
                   "Invalid value of abs_delta_rps: %d\n",
                   abs_delta_rps);
            return AVERROR_INVALIDDATA;
        }
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
        delta_rps      = (1 - (delta_rps_sign << 1)) * abs_delta_rps;
        for (i = 0; i <= rps_ridx->num_delta_pocs; i++) {
            int used = rps->used[k] = get_bits1(gb);

            if (!used)
                use_delta_flag = get_bits1(gb);

            if (used || use_delta_flag) {
                if (i < rps_ridx->num_delta_pocs)
                    delta_poc = delta_rps + rps_ridx->delta_poc[i];
                else
                    delta_poc = delta_rps;
                rps->delta_poc[k] = delta_poc;
                if (delta_poc < 0)
                    k0++;
                else
                    k1++;
                k++;
            }
        }

181 182 183 184 185 186
        if (k >= FF_ARRAY_ELEMS(rps->used)) {
            av_log(avctx, AV_LOG_ERROR,
                   "Invalid num_delta_pocs: %d\n", k);
            return AVERROR_INVALIDDATA;
        }

187 188 189 190 191 192 193 194
        rps->num_delta_pocs    = k;
        rps->num_negative_pics = k0;
        // sort in increasing order (smallest first)
        if (rps->num_delta_pocs != 0) {
            int used, tmp;
            for (i = 1; i < rps->num_delta_pocs; i++) {
                delta_poc = rps->delta_poc[i];
                used      = rps->used[i];
Guillaume Martres's avatar
Guillaume Martres committed
195
                for (k = i - 1; k >= 0; k--) {
196
                    tmp = rps->delta_poc[k];
Guillaume Martres's avatar
Guillaume Martres committed
197 198 199 200 201
                    if (delta_poc < tmp) {
                        rps->delta_poc[k + 1] = tmp;
                        rps->used[k + 1]      = rps->used[k];
                        rps->delta_poc[k]     = delta_poc;
                        rps->used[k]          = used;
202 203 204 205 206 207 208 209
                    }
                }
            }
        }
        if ((rps->num_negative_pics >> 1) != 0) {
            int used;
            k = rps->num_negative_pics - 1;
            // flip the negative values to largest first
Guillaume Martres's avatar
Guillaume Martres committed
210 211 212 213 214 215 216
            for (i = 0; i < rps->num_negative_pics >> 1; i++) {
                delta_poc         = rps->delta_poc[i];
                used              = rps->used[i];
                rps->delta_poc[i] = rps->delta_poc[k];
                rps->used[i]      = rps->used[k];
                rps->delta_poc[k] = delta_poc;
                rps->used[k]      = used;
217 218 219 220 221
                k--;
            }
        }
    } else {
        unsigned int prev, nb_positive_pics;
222 223
        rps->num_negative_pics = get_ue_golomb_long(gb);
        nb_positive_pics       = get_ue_golomb_long(gb);
224

225 226
        if (rps->num_negative_pics >= HEVC_MAX_REFS ||
            nb_positive_pics >= HEVC_MAX_REFS) {
227
            av_log(avctx, AV_LOG_ERROR, "Too many refs in a short term RPS.\n");
228 229 230 231 232 233 234
            return AVERROR_INVALIDDATA;
        }

        rps->num_delta_pocs = rps->num_negative_pics + nb_positive_pics;
        if (rps->num_delta_pocs) {
            prev = 0;
            for (i = 0; i < rps->num_negative_pics; i++) {
235
                delta_poc = get_ue_golomb_long(gb) + 1;
236 237 238 239 240 241
                if (delta_poc < 1 || delta_poc > 32768) {
                    av_log(avctx, AV_LOG_ERROR,
                        "Invalid value of delta_poc: %d\n",
                        delta_poc);
                    return AVERROR_INVALIDDATA;
                }
242 243
                prev -= delta_poc;
                rps->delta_poc[i] = prev;
Guillaume Martres's avatar
Guillaume Martres committed
244
                rps->used[i]      = get_bits1(gb);
245 246 247
            }
            prev = 0;
            for (i = 0; i < nb_positive_pics; i++) {
248
                delta_poc = get_ue_golomb_long(gb) + 1;
249 250 251 252 253 254
                if (delta_poc < 1 || delta_poc > 32768) {
                    av_log(avctx, AV_LOG_ERROR,
                        "Invalid value of delta_poc: %d\n",
                        delta_poc);
                    return AVERROR_INVALIDDATA;
                }
255 256
                prev += delta_poc;
                rps->delta_poc[rps->num_negative_pics + i] = prev;
Guillaume Martres's avatar
Guillaume Martres committed
257
                rps->used[rps->num_negative_pics + i]      = get_bits1(gb);
258 259 260 261 262 263
            }
        }
    }
    return 0;
}

gcocherel's avatar
gcocherel committed
264

265
static int decode_profile_tier_level(GetBitContext *gb, AVCodecContext *avctx,
266
                                      PTLCommon *ptl)
267
{
gcocherel's avatar
gcocherel committed
268
    int i;
269

270
    if (get_bits_left(gb) < 2+1+5 + 32 + 4 + 43 + 1)
271 272
        return -1;

gcocherel's avatar
gcocherel committed
273 274 275
    ptl->profile_space = get_bits(gb, 2);
    ptl->tier_flag     = get_bits1(gb);
    ptl->profile_idc   = get_bits(gb, 5);
276
    if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN)
277
        av_log(avctx, AV_LOG_DEBUG, "Main profile bitstream\n");
278
    else if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN_10)
279
        av_log(avctx, AV_LOG_DEBUG, "Main 10 profile bitstream\n");
280
    else if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN_STILL_PICTURE)
281
        av_log(avctx, AV_LOG_DEBUG, "Main Still Picture profile bitstream\n");
282
    else if (ptl->profile_idc == FF_PROFILE_HEVC_REXT)
283
        av_log(avctx, AV_LOG_DEBUG, "Range Extension profile bitstream\n");
284
    else
285
        av_log(avctx, AV_LOG_WARNING, "Unknown HEVC profile: %d\n", ptl->profile_idc);
286

287
    for (i = 0; i < 32; i++) {
gcocherel's avatar
gcocherel committed
288
        ptl->profile_compatibility_flag[i] = get_bits1(gb);
289 290 291 292

        if (ptl->profile_idc == 0 && i > 0 && ptl->profile_compatibility_flag[i])
            ptl->profile_idc = i;
    }
gcocherel's avatar
gcocherel committed
293 294 295 296
    ptl->progressive_source_flag    = get_bits1(gb);
    ptl->interlaced_source_flag     = get_bits1(gb);
    ptl->non_packed_constraint_flag = get_bits1(gb);
    ptl->frame_only_constraint_flag = get_bits1(gb);
297

298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
#define check_profile_idc(idc) \
        ptl->profile_idc == idc || ptl->profile_compatibility_flag[idc]

    if (check_profile_idc(4) || check_profile_idc(5) || check_profile_idc(6) ||
        check_profile_idc(7) || check_profile_idc(8) || check_profile_idc(9) ||
        check_profile_idc(10)) {

        ptl->max_12bit_constraint_flag        = get_bits1(gb);
        ptl->max_10bit_constraint_flag        = get_bits1(gb);
        ptl->max_8bit_constraint_flag         = get_bits1(gb);
        ptl->max_422chroma_constraint_flag    = get_bits1(gb);
        ptl->max_420chroma_constraint_flag    = get_bits1(gb);
        ptl->max_monochrome_constraint_flag   = get_bits1(gb);
        ptl->intra_constraint_flag            = get_bits1(gb);
        ptl->one_picture_only_constraint_flag = get_bits1(gb);
        ptl->lower_bit_rate_constraint_flag   = get_bits1(gb);

        if (check_profile_idc(5) || check_profile_idc(9) || check_profile_idc(10)) {
            ptl->max_14bit_constraint_flag    = get_bits1(gb);
            skip_bits_long(gb, 33); // XXX_reserved_zero_33bits[0..32]
        } else {
            skip_bits_long(gb, 34); // XXX_reserved_zero_34bits[0..33]
        }
    } else if (check_profile_idc(2)) {
        skip_bits(gb, 7);
        ptl->one_picture_only_constraint_flag = get_bits1(gb);
        skip_bits_long(gb, 35); // XXX_reserved_zero_35bits[0..34]
    } else {
        skip_bits_long(gb, 43); // XXX_reserved_zero_43bits[0..42]
    }

    if (check_profile_idc(1) || check_profile_idc(2) || check_profile_idc(3) ||
        check_profile_idc(4) || check_profile_idc(5) || check_profile_idc(9))
        ptl->inbld_flag = get_bits1(gb);
    else
        skip_bits1(gb);
#undef check_profile_idc
335 336

    return 0;
gcocherel's avatar
gcocherel committed
337 338
}

339
static int parse_ptl(GetBitContext *gb, AVCodecContext *avctx,
340
                      PTL *ptl, int max_num_sub_layers)
gcocherel's avatar
gcocherel committed
341 342
{
    int i;
343
    if (decode_profile_tier_level(gb, avctx, &ptl->general_ptl) < 0 ||
344
        get_bits_left(gb) < 8 + (8*2 * (max_num_sub_layers - 1 > 0))) {
345
        av_log(avctx, AV_LOG_ERROR, "PTL information too short\n");
346 347 348
        return -1;
    }

349
    ptl->general_ptl.level_idc = get_bits(gb, 8);
350 351 352

    for (i = 0; i < max_num_sub_layers - 1; i++) {
        ptl->sub_layer_profile_present_flag[i] = get_bits1(gb);
Guillaume Martres's avatar
Guillaume Martres committed
353
        ptl->sub_layer_level_present_flag[i]   = get_bits1(gb);
354
    }
355

gcocherel's avatar
gcocherel committed
356
    if (max_num_sub_layers - 1> 0)
357
        for (i = max_num_sub_layers - 1; i < 8; i++)
gcocherel's avatar
gcocherel committed
358
            skip_bits(gb, 2); // reserved_zero_2bits[i]
359
    for (i = 0; i < max_num_sub_layers - 1; i++) {
360
        if (ptl->sub_layer_profile_present_flag[i] &&
361 362
            decode_profile_tier_level(gb, avctx, &ptl->sub_layer_ptl[i]) < 0) {
            av_log(avctx, AV_LOG_ERROR,
363 364 365 366 367
                   "PTL information for sublayer %i too short\n", i);
            return -1;
        }
        if (ptl->sub_layer_level_present_flag[i]) {
            if (get_bits_left(gb) < 8) {
368
                av_log(avctx, AV_LOG_ERROR,
369 370 371 372 373
                       "Not enough data for sublayer %i level_idc\n", i);
                return -1;
            } else
                ptl->sub_layer_ptl[i].level_idc = get_bits(gb, 8);
        }
374
    }
375 376

    return 0;
377 378
}

379
static void decode_sublayer_hrd(GetBitContext *gb, unsigned int nb_cpb,
Guillaume Martres's avatar
Guillaume Martres committed
380
                                int subpic_params_present)
381
{
Mickaël Raulet's avatar
Mickaël Raulet committed
382 383 384 385 386 387 388 389 390 391 392 393 394 395
    int i;

    for (i = 0; i < nb_cpb; i++) {
        get_ue_golomb_long(gb); // bit_rate_value_minus1
        get_ue_golomb_long(gb); // cpb_size_value_minus1

        if (subpic_params_present) {
            get_ue_golomb_long(gb); // cpb_size_du_value_minus1
            get_ue_golomb_long(gb); // bit_rate_du_value_minus1
        }
        skip_bits1(gb); // cbr_flag
    }
}

396
static int decode_hrd(GetBitContext *gb, int common_inf_present,
397
                       int max_sublayers)
Mickaël Raulet's avatar
Mickaël Raulet committed
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
{
    int nal_params_present = 0, vcl_params_present = 0;
    int subpic_params_present = 0;
    int i;

    if (common_inf_present) {
        nal_params_present = get_bits1(gb);
        vcl_params_present = get_bits1(gb);

        if (nal_params_present || vcl_params_present) {
            subpic_params_present = get_bits1(gb);

            if (subpic_params_present) {
                skip_bits(gb, 8); // tick_divisor_minus2
                skip_bits(gb, 5); // du_cpb_removal_delay_increment_length_minus1
                skip_bits(gb, 1); // sub_pic_cpb_params_in_pic_timing_sei_flag
                skip_bits(gb, 5); // dpb_output_delay_du_length_minus1
            }

            skip_bits(gb, 4); // bit_rate_scale
            skip_bits(gb, 4); // cpb_size_scale

            if (subpic_params_present)
421
                skip_bits(gb, 4);  // cpb_size_du_scale
Mickaël Raulet's avatar
Mickaël Raulet committed
422 423 424 425 426 427 428 429 430

            skip_bits(gb, 5); // initial_cpb_removal_delay_length_minus1
            skip_bits(gb, 5); // au_cpb_removal_delay_length_minus1
            skip_bits(gb, 5); // dpb_output_delay_length_minus1
        }
    }

    for (i = 0; i < max_sublayers; i++) {
        int low_delay = 0;
431
        unsigned int nb_cpb = 1;
Mickaël Raulet's avatar
Mickaël Raulet committed
432 433 434 435 436 437
        int fixed_rate = get_bits1(gb);

        if (!fixed_rate)
            fixed_rate = get_bits1(gb);

        if (fixed_rate)
438
            get_ue_golomb_long(gb);  // elemental_duration_in_tc_minus1
Mickaël Raulet's avatar
Mickaël Raulet committed
439 440 441
        else
            low_delay = get_bits1(gb);

442
        if (!low_delay) {
Mickaël Raulet's avatar
Mickaël Raulet committed
443
            nb_cpb = get_ue_golomb_long(gb) + 1;
444
            if (nb_cpb < 1 || nb_cpb > 32) {
445
                av_log(NULL, AV_LOG_ERROR, "nb_cpb %d invalid\n", nb_cpb);
446 447 448
                return AVERROR_INVALIDDATA;
            }
        }
Mickaël Raulet's avatar
Mickaël Raulet committed
449 450

        if (nal_params_present)
451
            decode_sublayer_hrd(gb, nb_cpb, subpic_params_present);
Mickaël Raulet's avatar
Mickaël Raulet committed
452
        if (vcl_params_present)
453
            decode_sublayer_hrd(gb, nb_cpb, subpic_params_present);
Mickaël Raulet's avatar
Mickaël Raulet committed
454
    }
455
    return 0;
456 457
}

458 459
int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx,
                           HEVCParamSets *ps)
460 461 462
{
    int i,j;
    int vps_id = 0;
463
    ptrdiff_t nal_size;
Guillaume Martres's avatar
Guillaume Martres committed
464
    HEVCVPS *vps;
gcocherel's avatar
gcocherel committed
465 466 467 468 469
    AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps));

    if (!vps_buf)
        return AVERROR(ENOMEM);
    vps = (HEVCVPS*)vps_buf->data;
470

471
    av_log(avctx, AV_LOG_DEBUG, "Decoding VPS\n");
472

473 474 475 476 477 478 479 480 481 482 483
    nal_size = gb->buffer_end - gb->buffer;
    if (nal_size > sizeof(vps->data)) {
        av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized VPS "
               "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n",
               nal_size, sizeof(vps->data));
        vps->data_size = sizeof(vps->data);
    } else {
        vps->data_size = nal_size;
    }
    memcpy(vps->data, gb->buffer, vps->data_size);

484 485 486
    vps_id = get_bits(gb, 4);

    if (get_bits(gb, 2) != 3) { // vps_reserved_three_2bits
487
        av_log(avctx, AV_LOG_ERROR, "vps_reserved_three_2bits is not three\n");
488 489 490 491 492 493 494 495
        goto err;
    }

    vps->vps_max_layers               = get_bits(gb, 6) + 1;
    vps->vps_max_sub_layers           = get_bits(gb, 3) + 1;
    vps->vps_temporal_id_nesting_flag = get_bits1(gb);

    if (get_bits(gb, 16) != 0xffff) { // vps_reserved_ffff_16bits
496
        av_log(avctx, AV_LOG_ERROR, "vps_reserved_ffff_16bits is not 0xffff\n");
497 498 499
        goto err;
    }

500
    if (vps->vps_max_sub_layers > HEVC_MAX_SUB_LAYERS) {
501
        av_log(avctx, AV_LOG_ERROR, "vps_max_sub_layers out of range: %d\n",
502 503 504 505
               vps->vps_max_sub_layers);
        goto err;
    }

506
    if (parse_ptl(gb, avctx, &vps->ptl, vps->vps_max_sub_layers) < 0)
507
        goto err;
508

509 510 511 512
    vps->vps_sub_layer_ordering_info_present_flag = get_bits1(gb);

    i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_sub_layers - 1;
    for (; i < vps->vps_max_sub_layers; i++) {
513 514 515
        vps->vps_max_dec_pic_buffering[i] = get_ue_golomb_long(gb) + 1;
        vps->vps_num_reorder_pics[i]      = get_ue_golomb_long(gb);
        vps->vps_max_latency_increase[i]  = get_ue_golomb_long(gb) - 1;
516

James Almer's avatar
James Almer committed
517
        if (vps->vps_max_dec_pic_buffering[i] > HEVC_MAX_DPB_SIZE || !vps->vps_max_dec_pic_buffering[i]) {
518
            av_log(avctx, AV_LOG_ERROR, "vps_max_dec_pic_buffering_minus1 out of range: %d\n",
519 520 521
                   vps->vps_max_dec_pic_buffering[i] - 1);
            goto err;
        }
522
        if (vps->vps_num_reorder_pics[i] > vps->vps_max_dec_pic_buffering[i] - 1) {
523
            av_log(avctx, AV_LOG_WARNING, "vps_max_num_reorder_pics out of range: %d\n",
524
                   vps->vps_num_reorder_pics[i]);
525
            if (avctx->err_recognition & AV_EF_EXPLODE)
Kieran's avatar
Kieran committed
526
                goto err;
527 528 529 530
        }
    }

    vps->vps_max_layer_id   = get_bits(gb, 6);
531
    vps->vps_num_layer_sets = get_ue_golomb_long(gb) + 1;
532 533
    if (vps->vps_num_layer_sets < 1 || vps->vps_num_layer_sets > 1024 ||
        (vps->vps_num_layer_sets - 1LL) * (vps->vps_max_layer_id + 1LL) > get_bits_left(gb)) {
534
        av_log(avctx, AV_LOG_ERROR, "too many layer_id_included_flags\n");
535 536 537
        goto err;
    }

538 539
    for (i = 1; i < vps->vps_num_layer_sets; i++)
        for (j = 0; j <= vps->vps_max_layer_id; j++)
540
            skip_bits(gb, 1);  // layer_id_included_flag[i][j]
541 542 543 544 545 546 547

    vps->vps_timing_info_present_flag = get_bits1(gb);
    if (vps->vps_timing_info_present_flag) {
        vps->vps_num_units_in_tick               = get_bits_long(gb, 32);
        vps->vps_time_scale                      = get_bits_long(gb, 32);
        vps->vps_poc_proportional_to_timing_flag = get_bits1(gb);
        if (vps->vps_poc_proportional_to_timing_flag)
548 549
            vps->vps_num_ticks_poc_diff_one = get_ue_golomb_long(gb) + 1;
        vps->vps_num_hrd_parameters = get_ue_golomb_long(gb);
550
        if (vps->vps_num_hrd_parameters > (unsigned)vps->vps_num_layer_sets) {
551
            av_log(avctx, AV_LOG_ERROR,
552 553 554
                   "vps_num_hrd_parameters %d is invalid\n", vps->vps_num_hrd_parameters);
            goto err;
        }
Mickaël Raulet's avatar
Mickaël Raulet committed
555 556 557 558 559 560
        for (i = 0; i < vps->vps_num_hrd_parameters; i++) {
            int common_inf_present = 1;

            get_ue_golomb_long(gb); // hrd_layer_set_idx
            if (i)
                common_inf_present = get_bits1(gb);
561
            decode_hrd(gb, common_inf_present, vps->vps_max_sub_layers);
562 563
        }
    }
564
    get_bits1(gb); /* vps_extension_flag */
gcocherel's avatar
gcocherel committed
565

566
    if (get_bits_left(gb) < 0) {
567
        av_log(avctx, AV_LOG_ERROR,
568
               "Overread VPS by %d bits\n", -get_bits_left(gb));
569
        if (ps->vps_list[vps_id])
570
            goto err;
571 572
    }

573 574
    if (ps->vps_list[vps_id] &&
        !memcmp(ps->vps_list[vps_id]->data, vps_buf->data, vps_buf->size)) {
575 576
        av_buffer_unref(&vps_buf);
    } else {
577 578
        remove_vps(ps, vps_id);
        ps->vps_list[vps_id] = vps_buf;
579 580
    }

581 582 583
    return 0;

err:
gcocherel's avatar
gcocherel committed
584
    av_buffer_unref(&vps_buf);
585 586 587
    return AVERROR_INVALIDDATA;
}

588 589
static void decode_vui(GetBitContext *gb, AVCodecContext *avctx,
                       int apply_defdispwin, HEVCSPS *sps)
590
{
591
    VUI backup_vui, *vui = &sps->vui;
592
    GetBitContext backup;
593
    int sar_present, alt = 0;
594

595
    av_log(avctx, AV_LOG_DEBUG, "Decoding VUI\n");
596 597 598 599 600 601 602 603 604 605

    sar_present = get_bits1(gb);
    if (sar_present) {
        uint8_t sar_idx = get_bits(gb, 8);
        if (sar_idx < FF_ARRAY_ELEMS(vui_sar))
            vui->sar = vui_sar[sar_idx];
        else if (sar_idx == 255) {
            vui->sar.num = get_bits(gb, 16);
            vui->sar.den = get_bits(gb, 16);
        } else
606
            av_log(avctx, AV_LOG_WARNING,
Guillaume Martres's avatar
Guillaume Martres committed
607
                   "Unknown SAR index: %u.\n", sar_idx);
608 609 610 611 612 613 614 615 616 617 618
    }

    vui->overscan_info_present_flag = get_bits1(gb);
    if (vui->overscan_info_present_flag)
        vui->overscan_appropriate_flag = get_bits1(gb);

    vui->video_signal_type_present_flag = get_bits1(gb);
    if (vui->video_signal_type_present_flag) {
        vui->video_format                    = get_bits(gb, 3);
        vui->video_full_range_flag           = get_bits1(gb);
        vui->colour_description_present_flag = get_bits1(gb);
619 620
        if (vui->video_full_range_flag && sps->pix_fmt == AV_PIX_FMT_YUV420P)
            sps->pix_fmt = AV_PIX_FMT_YUVJ420P;
621 622 623 624
        if (vui->colour_description_present_flag) {
            vui->colour_primaries        = get_bits(gb, 8);
            vui->transfer_characteristic = get_bits(gb, 8);
            vui->matrix_coeffs           = get_bits(gb, 8);
625 626

            // Set invalid values to "unspecified"
627
            if (!av_color_primaries_name(vui->colour_primaries))
628
                vui->colour_primaries = AVCOL_PRI_UNSPECIFIED;
629
            if (!av_color_transfer_name(vui->transfer_characteristic))
630
                vui->transfer_characteristic = AVCOL_TRC_UNSPECIFIED;
631
            if (!av_color_space_name(vui->matrix_coeffs))
632
                vui->matrix_coeffs = AVCOL_SPC_UNSPECIFIED;
633 634 635 636 637 638 639 640 641 642 643 644 645
            if (vui->matrix_coeffs == AVCOL_SPC_RGB) {
                switch (sps->pix_fmt) {
                case AV_PIX_FMT_YUV444P:
                    sps->pix_fmt = AV_PIX_FMT_GBRP;
                    break;
                case AV_PIX_FMT_YUV444P10:
                    sps->pix_fmt = AV_PIX_FMT_GBRP10;
                    break;
                case AV_PIX_FMT_YUV444P12:
                    sps->pix_fmt = AV_PIX_FMT_GBRP12;
                    break;
                }
            }
646 647 648 649 650
        }
    }

    vui->chroma_loc_info_present_flag = get_bits1(gb);
    if (vui->chroma_loc_info_present_flag) {
651 652
        vui->chroma_sample_loc_type_top_field    = get_ue_golomb_long(gb);
        vui->chroma_sample_loc_type_bottom_field = get_ue_golomb_long(gb);
653 654 655 656 657 658
    }

    vui->neutra_chroma_indication_flag = get_bits1(gb);
    vui->field_seq_flag                = get_bits1(gb);
    vui->frame_field_info_present_flag = get_bits1(gb);

659 660 661
    // Backup context in case an alternate header is detected
    memcpy(&backup, gb, sizeof(backup));
    memcpy(&backup_vui, vui, sizeof(backup_vui));
662 663
    if (get_bits_left(gb) >= 68 && show_bits_long(gb, 21) == 0x100000) {
        vui->default_display_window_flag = 0;
664
        av_log(avctx, AV_LOG_WARNING, "Invalid default display window\n");
665 666
    } else
        vui->default_display_window_flag = get_bits1(gb);
667

668
    if (vui->default_display_window_flag) {
669 670
        int vert_mult  = hevc_sub_height_c[sps->chroma_format_idc];
        int horiz_mult = hevc_sub_width_c[sps->chroma_format_idc];
671 672 673 674
        vui->def_disp_win.left_offset   = get_ue_golomb_long(gb) * horiz_mult;
        vui->def_disp_win.right_offset  = get_ue_golomb_long(gb) * horiz_mult;
        vui->def_disp_win.top_offset    = get_ue_golomb_long(gb) *  vert_mult;
        vui->def_disp_win.bottom_offset = get_ue_golomb_long(gb) *  vert_mult;
675

676
        if (apply_defdispwin &&
677
            avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) {
678
            av_log(avctx, AV_LOG_DEBUG,
679 680 681 682 683 684 685 686 687 688 689 690 691 692
                   "discarding vui default display window, "
                   "original values are l:%u r:%u t:%u b:%u\n",
                   vui->def_disp_win.left_offset,
                   vui->def_disp_win.right_offset,
                   vui->def_disp_win.top_offset,
                   vui->def_disp_win.bottom_offset);

            vui->def_disp_win.left_offset   =
            vui->def_disp_win.right_offset  =
            vui->def_disp_win.top_offset    =
            vui->def_disp_win.bottom_offset = 0;
        }
    }

693
timing_info:
694
    vui->vui_timing_info_present_flag = get_bits1(gb);
gcocherel's avatar
gcocherel committed
695

696
    if (vui->vui_timing_info_present_flag) {
697
        if( get_bits_left(gb) < 66 && !alt) {
698 699
            // The alternate syntax seem to have timing info located
            // at where def_disp_win is normally located
700
            av_log(avctx, AV_LOG_WARNING,
701
                   "Strange VUI timing information, retrying...\n");
702
            memcpy(vui, &backup_vui, sizeof(backup_vui));
703 704
            memcpy(gb, &backup, sizeof(backup));
            alt = 1;
705
            goto timing_info;
706
        }
707 708
        vui->vui_num_units_in_tick               = get_bits_long(gb, 32);
        vui->vui_time_scale                      = get_bits_long(gb, 32);
709
        if (alt) {
710
            av_log(avctx, AV_LOG_INFO, "Retry got %"PRIu32"/%"PRIu32" fps\n",
711 712
                   vui->vui_time_scale, vui->vui_num_units_in_tick);
        }
713 714
        vui->vui_poc_proportional_to_timing_flag = get_bits1(gb);
        if (vui->vui_poc_proportional_to_timing_flag)
715
            vui->vui_num_ticks_poc_diff_one_minus1 = get_ue_golomb_long(gb);
716 717
        vui->vui_hrd_parameters_present_flag = get_bits1(gb);
        if (vui->vui_hrd_parameters_present_flag)
718
            decode_hrd(gb, 1, sps->max_sub_layers);
719 720 721 722
    }

    vui->bitstream_restriction_flag = get_bits1(gb);
    if (vui->bitstream_restriction_flag) {
723 724 725 726 727 728 729 730 731
        if (get_bits_left(gb) < 8 && !alt) {
            av_log(avctx, AV_LOG_WARNING,
                   "Strange VUI bitstream restriction information, retrying"
                   " from timing information...\n");
            memcpy(vui, &backup_vui, sizeof(backup_vui));
            memcpy(gb, &backup, sizeof(backup));
            alt = 1;
            goto timing_info;
        }
732 733 734
        vui->tiles_fixed_structure_flag              = get_bits1(gb);
        vui->motion_vectors_over_pic_boundaries_flag = get_bits1(gb);
        vui->restricted_ref_pic_lists_flag           = get_bits1(gb);
735 736 737 738 739
        vui->min_spatial_segmentation_idc            = get_ue_golomb_long(gb);
        vui->max_bytes_per_pic_denom                 = get_ue_golomb_long(gb);
        vui->max_bits_per_min_cu_denom               = get_ue_golomb_long(gb);
        vui->log2_max_mv_length_horizontal           = get_ue_golomb_long(gb);
        vui->log2_max_mv_length_vertical             = get_ue_golomb_long(gb);
740
    }
741 742 743 744 745 746 747 748 749 750

    if (get_bits_left(gb) < 1 && !alt) {
        // XXX: Alternate syntax when sps_range_extension_flag != 0?
        av_log(avctx, AV_LOG_WARNING,
               "Overread in VUI, retrying from timing information...\n");
        memcpy(vui, &backup_vui, sizeof(backup_vui));
        memcpy(gb, &backup, sizeof(backup));
        alt = 1;
        goto timing_info;
    }
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775
}

static void set_default_scaling_list_data(ScalingList *sl)
{
    int matrixId;

    for (matrixId = 0; matrixId < 6; matrixId++) {
        // 4x4 default is 16
        memset(sl->sl[0][matrixId], 16, 16);
        sl->sl_dc[0][matrixId] = 16; // default for 16x16
        sl->sl_dc[1][matrixId] = 16; // default for 32x32
    }
    memcpy(sl->sl[1][0], default_scaling_list_intra, 64);
    memcpy(sl->sl[1][1], default_scaling_list_intra, 64);
    memcpy(sl->sl[1][2], default_scaling_list_intra, 64);
    memcpy(sl->sl[1][3], default_scaling_list_inter, 64);
    memcpy(sl->sl[1][4], default_scaling_list_inter, 64);
    memcpy(sl->sl[1][5], default_scaling_list_inter, 64);
    memcpy(sl->sl[2][0], default_scaling_list_intra, 64);
    memcpy(sl->sl[2][1], default_scaling_list_intra, 64);
    memcpy(sl->sl[2][2], default_scaling_list_intra, 64);
    memcpy(sl->sl[2][3], default_scaling_list_inter, 64);
    memcpy(sl->sl[2][4], default_scaling_list_inter, 64);
    memcpy(sl->sl[2][5], default_scaling_list_inter, 64);
    memcpy(sl->sl[3][0], default_scaling_list_intra, 64);
776 777 778 779 780
    memcpy(sl->sl[3][1], default_scaling_list_intra, 64);
    memcpy(sl->sl[3][2], default_scaling_list_intra, 64);
    memcpy(sl->sl[3][3], default_scaling_list_inter, 64);
    memcpy(sl->sl[3][4], default_scaling_list_inter, 64);
    memcpy(sl->sl[3][5], default_scaling_list_inter, 64);
781 782
}

783
static int scaling_list_data(GetBitContext *gb, AVCodecContext *avctx, ScalingList *sl, HEVCSPS *sps)
784
{
785
    uint8_t scaling_list_pred_mode_flag;
786
    int32_t scaling_list_dc_coef[2][6];
787 788
    int size_id, matrix_id, pos;
    int i;
Guillaume Martres's avatar
Guillaume Martres committed
789

790
    for (size_id = 0; size_id < 4; size_id++)
791 792 793
        for (matrix_id = 0; matrix_id < 6; matrix_id += ((size_id == 3) ? 3 : 1)) {
            scaling_list_pred_mode_flag = get_bits1(gb);
            if (!scaling_list_pred_mode_flag) {
794
                unsigned int delta = get_ue_golomb_long(gb);
Guillaume Martres's avatar
Guillaume Martres committed
795 796
                /* Only need to handle non-zero delta. Zero means default,
                 * which should already be in the arrays. */
797 798
                if (delta) {
                    // Copy from previous array.
799
                    delta *= (size_id == 3) ? 3 : 1;
800
                    if (matrix_id < delta) {
801
                        av_log(avctx, AV_LOG_ERROR,
802 803 804 805 806 807 808 809 810 811 812
                               "Invalid delta in scaling list data: %d.\n", delta);
                        return AVERROR_INVALIDDATA;
                    }

                    memcpy(sl->sl[size_id][matrix_id],
                           sl->sl[size_id][matrix_id - delta],
                           size_id > 0 ? 64 : 16);
                    if (size_id > 1)
                        sl->sl_dc[size_id - 2][matrix_id] = sl->sl_dc[size_id - 2][matrix_id - delta];
                }
            } else {
Guillaume Martres's avatar
Guillaume Martres committed
813
                int next_coef, coef_num;
814 815 816
                int32_t scaling_list_delta_coef;

                next_coef = 8;
817
                coef_num  = FFMIN(64, 1 << (4 + (size_id << 1)));
818 819 820 821 822 823 824
                if (size_id > 1) {
                    scaling_list_dc_coef[size_id - 2][matrix_id] = get_se_golomb(gb) + 8;
                    next_coef = scaling_list_dc_coef[size_id - 2][matrix_id];
                    sl->sl_dc[size_id - 2][matrix_id] = next_coef;
                }
                for (i = 0; i < coef_num; i++) {
                    if (size_id == 0)
Guillaume Martres's avatar
Guillaume Martres committed
825 826
                        pos = 4 * ff_hevc_diag_scan4x4_y[i] +
                                  ff_hevc_diag_scan4x4_x[i];
827
                    else
Guillaume Martres's avatar
Guillaume Martres committed
828 829
                        pos = 8 * ff_hevc_diag_scan8x8_y[i] +
                                  ff_hevc_diag_scan8x8_x[i];
830 831

                    scaling_list_delta_coef = get_se_golomb(gb);
832
                    next_coef = (next_coef + 256U + scaling_list_delta_coef) % 256;
833 834 835 836 837
                    sl->sl[size_id][matrix_id][pos] = next_coef;
                }
            }
        }

838 839 840 841 842 843 844 845 846 847 848 849 850 851
    if (sps->chroma_format_idc == 3) {
        for (i = 0; i < 64; i++) {
            sl->sl[3][1][i] = sl->sl[2][1][i];
            sl->sl[3][2][i] = sl->sl[2][2][i];
            sl->sl[3][4][i] = sl->sl[2][4][i];
            sl->sl[3][5][i] = sl->sl[2][5][i];
        }
        sl->sl_dc[1][1] = sl->sl_dc[0][1];
        sl->sl_dc[1][2] = sl->sl_dc[0][2];
        sl->sl_dc[1][4] = sl->sl_dc[0][4];
        sl->sl_dc[1][5] = sl->sl_dc[0][5];
    }


852 853 854
    return 0;
}

855 856 857
static int map_pixel_format(AVCodecContext *avctx, HEVCSPS *sps)
{
    const AVPixFmtDescriptor *desc;
858 859 860 861 862 863 864 865
    switch (sps->bit_depth) {
    case 8:
        if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY8;
        if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P;
        if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P;
        if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P;
       break;
    case 9:
866
        if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY9;
867 868 869 870 871
        if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P9;
        if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P9;
        if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P9;
        break;
    case 10:
872
        if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY10;
873 874 875 876 877
        if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P10;
        if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P10;
        if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P10;
        break;
    case 12:
878
        if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY12;
879 880 881 882 883
        if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P12;
        if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P12;
        if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P12;
        break;
    default:
884
        av_log(avctx, AV_LOG_ERROR,
885 886
               "The following bit-depths are currently specified: 8, 9, 10 and 12 bits, "
               "chroma_format_idc is %d, depth is %d\n",
887
               sps->chroma_format_idc, sps->bit_depth);
888
        return AVERROR_INVALIDDATA;
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
    }

    desc = av_pix_fmt_desc_get(sps->pix_fmt);
    if (!desc)
        return AVERROR(EINVAL);

    sps->hshift[0] = sps->vshift[0] = 0;
    sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w;
    sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h;

    sps->pixel_shift = sps->bit_depth > 8;

    return 0;
}

904 905
int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
                      int apply_defdispwin, AVBufferRef **vps_list, AVCodecContext *avctx)
906
{
907
    HEVCWindow *ow;
908
    int ret = 0;
909 910 911 912 913 914 915 916
    int log2_diff_max_min_transform_block_size;
    int bit_depth_chroma, start, vui_present, sublayer_ordering_info;
    int i;

    // Coded parameters

    sps->vps_id = get_bits(gb, 4);

917 918
    if (vps_list && !vps_list[sps->vps_id]) {
        av_log(avctx, AV_LOG_ERROR, "VPS %d does not exist\n",
919
               sps->vps_id);
920
        return AVERROR_INVALIDDATA;
921 922
    }

923
    sps->max_sub_layers = get_bits(gb, 3) + 1;
924
    if (sps->max_sub_layers > HEVC_MAX_SUB_LAYERS) {
925
        av_log(avctx, AV_LOG_ERROR, "sps_max_sub_layers out of range: %d\n",
926
               sps->max_sub_layers);
927
        return AVERROR_INVALIDDATA;
928 929
    }

930
    sps->temporal_id_nesting_flag = get_bits(gb, 1);
gcocherel's avatar
gcocherel committed
931

932
    if ((ret = parse_ptl(gb, avctx, &sps->ptl, sps->max_sub_layers)) < 0)
933
        return ret;
934

935
    *sps_id = get_ue_golomb_long(gb);
936
    if (*sps_id >= HEVC_MAX_SPS_COUNT) {
937
        av_log(avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", *sps_id);
938
        return AVERROR_INVALIDDATA;
939 940
    }

941
    sps->chroma_format_idc = get_ue_golomb_long(gb);
942 943 944 945
    if (sps->chroma_format_idc > 3U) {
        av_log(avctx, AV_LOG_ERROR, "chroma_format_idc %d is invalid\n", sps->chroma_format_idc);
        return AVERROR_INVALIDDATA;
    }
946 947 948 949

    if (sps->chroma_format_idc == 3)
        sps->separate_colour_plane_flag = get_bits1(gb);

950 951 952
    if (sps->separate_colour_plane_flag)
        sps->chroma_format_idc = 0;

953 954
    sps->width  = get_ue_golomb_long(gb);
    sps->height = get_ue_golomb_long(gb);
955
    if ((ret = av_image_check_size(sps->width,
956
                                   sps->height, 0, avctx)) < 0)
957
        return ret;
958 959

    if (get_bits1(gb)) { // pic_conformance_flag
960 961
        int vert_mult  = hevc_sub_height_c[sps->chroma_format_idc];
        int horiz_mult = hevc_sub_width_c[sps->chroma_format_idc];
962 963 964 965
        sps->pic_conf_win.left_offset   = get_ue_golomb_long(gb) * horiz_mult;
        sps->pic_conf_win.right_offset  = get_ue_golomb_long(gb) * horiz_mult;
        sps->pic_conf_win.top_offset    = get_ue_golomb_long(gb) *  vert_mult;
        sps->pic_conf_win.bottom_offset = get_ue_golomb_long(gb) *  vert_mult;
966

967
        if (avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) {
968
            av_log(avctx, AV_LOG_DEBUG,
969 970 971 972 973 974 975 976 977 978 979 980 981 982 983
                   "discarding sps conformance window, "
                   "original values are l:%u r:%u t:%u b:%u\n",
                   sps->pic_conf_win.left_offset,
                   sps->pic_conf_win.right_offset,
                   sps->pic_conf_win.top_offset,
                   sps->pic_conf_win.bottom_offset);

            sps->pic_conf_win.left_offset   =
            sps->pic_conf_win.right_offset  =
            sps->pic_conf_win.top_offset    =
            sps->pic_conf_win.bottom_offset = 0;
        }
        sps->output_window = sps->pic_conf_win;
    }

984 985
    sps->bit_depth   = get_ue_golomb_long(gb) + 8;
    bit_depth_chroma = get_ue_golomb_long(gb) + 8;
986
    if (sps->chroma_format_idc && bit_depth_chroma != sps->bit_depth) {
987
        av_log(avctx, AV_LOG_ERROR,
Guillaume Martres's avatar
Guillaume Martres committed
988 989
               "Luma bit depth (%d) is different from chroma bit depth (%d), "
               "this is unsupported.\n",
990
               sps->bit_depth, bit_depth_chroma);
991
        return AVERROR_INVALIDDATA;
992
    }
993
    sps->bit_depth_chroma = bit_depth_chroma;
994

995 996
    ret = map_pixel_format(avctx, sps);
    if (ret < 0)
997
        return ret;
998

999
    sps->log2_max_poc_lsb = get_ue_golomb_long(gb) + 4;
1000
    if (sps->log2_max_poc_lsb > 16) {
1001
        av_log(avctx, AV_LOG_ERROR, "log2_max_pic_order_cnt_lsb_minus4 out range: %d\n",
1002
               sps->log2_max_poc_lsb - 4);
1003
        return AVERROR_INVALIDDATA;
1004 1005 1006 1007 1008
    }

    sublayer_ordering_info = get_bits1(gb);
    start = sublayer_ordering_info ? 0 : sps->max_sub_layers - 1;
    for (i = start; i < sps->max_sub_layers; i++) {
1009 1010 1011
        sps->temporal_layer[i].max_dec_pic_buffering = get_ue_golomb_long(gb) + 1;
        sps->temporal_layer[i].num_reorder_pics      = get_ue_golomb_long(gb);
        sps->temporal_layer[i].max_latency_increase  = get_ue_golomb_long(gb) - 1;
1012
        if (sps->temporal_layer[i].max_dec_pic_buffering > (unsigned)HEVC_MAX_DPB_SIZE) {
1013
            av_log(avctx, AV_LOG_ERROR, "sps_max_dec_pic_buffering_minus1 out of range: %d\n",
1014
                   sps->temporal_layer[i].max_dec_pic_buffering - 1U);
1015
            return AVERROR_INVALIDDATA;
1016
        }
1017
        if (sps->temporal_layer[i].num_reorder_pics > sps->temporal_layer[i].max_dec_pic_buffering - 1) {
1018
            av_log(avctx, AV_LOG_WARNING, "sps_max_num_reorder_pics out of range: %d\n",
1019
                   sps->temporal_layer[i].num_reorder_pics);
1020
            if (avctx->err_recognition & AV_EF_EXPLODE ||
1021
                sps->temporal_layer[i].num_reorder_pics > HEVC_MAX_DPB_SIZE - 1) {
1022
                return AVERROR_INVALIDDATA;
1023 1024
            }
            sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[i].num_reorder_pics + 1;
1025 1026 1027 1028
        }
    }

    if (!sublayer_ordering_info) {
Guillaume Martres's avatar
Guillaume Martres committed
1029
        for (i = 0; i < start; i++) {
1030 1031 1032 1033 1034 1035
            sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[start].max_dec_pic_buffering;
            sps->temporal_layer[i].num_reorder_pics      = sps->temporal_layer[start].num_reorder_pics;
            sps->temporal_layer[i].max_latency_increase  = sps->temporal_layer[start].max_latency_increase;
        }
    }

Guillaume Martres's avatar
Guillaume Martres committed
1036 1037 1038 1039 1040 1041
    sps->log2_min_cb_size                    = get_ue_golomb_long(gb) + 3;
    sps->log2_diff_max_min_coding_block_size = get_ue_golomb_long(gb);
    sps->log2_min_tb_size                    = get_ue_golomb_long(gb) + 2;
    log2_diff_max_min_transform_block_size   = get_ue_golomb_long(gb);
    sps->log2_max_trafo_size                 = log2_diff_max_min_transform_block_size +
                                               sps->log2_min_tb_size;
1042

1043
    if (sps->log2_min_cb_size < 3 || sps->log2_min_cb_size > 30) {
1044
        av_log(avctx, AV_LOG_ERROR, "Invalid value %d for log2_min_cb_size", sps->log2_min_cb_size);
1045
        return AVERROR_INVALIDDATA;
1046 1047 1048
    }

    if (sps->log2_diff_max_min_coding_block_size > 30) {
1049
        av_log(avctx, AV_LOG_ERROR, "Invalid value %d for log2_diff_max_min_coding_block_size", sps->log2_diff_max_min_coding_block_size);
1050
        return AVERROR_INVALIDDATA;
1051 1052 1053
    }

    if (sps->log2_min_tb_size >= sps->log2_min_cb_size || sps->log2_min_tb_size < 2) {
1054
        av_log(avctx, AV_LOG_ERROR, "Invalid value for log2_min_tb_size");
1055
        return AVERROR_INVALIDDATA;
1056
    }
1057 1058

    if (log2_diff_max_min_transform_block_size < 0 || log2_diff_max_min_transform_block_size > 30) {
1059
        av_log(avctx, AV_LOG_ERROR, "Invalid value %d for log2_diff_max_min_transform_block_size", log2_diff_max_min_transform_block_size);
1060
        return AVERROR_INVALIDDATA;
1061 1062
    }

1063 1064
    sps->max_transform_hierarchy_depth_inter = get_ue_golomb_long(gb);
    sps->max_transform_hierarchy_depth_intra = get_ue_golomb_long(gb);
1065 1066 1067 1068 1069 1070

    sps->scaling_list_enable_flag = get_bits1(gb);
    if (sps->scaling_list_enable_flag) {
        set_default_scaling_list_data(&sps->scaling_list);

        if (get_bits1(gb)) {
1071
            ret = scaling_list_data(gb, avctx, &sps->scaling_list, sps);
1072
            if (ret < 0)
1073
                return ret;
1074 1075 1076 1077 1078 1079 1080 1081 1082
        }
    }

    sps->amp_enabled_flag = get_bits1(gb);
    sps->sao_enabled      = get_bits1(gb);

    sps->pcm_enabled_flag = get_bits1(gb);
    if (sps->pcm_enabled_flag) {
        sps->pcm.bit_depth   = get_bits(gb, 4) + 1;
1083
        sps->pcm.bit_depth_chroma = get_bits(gb, 4) + 1;
1084
        sps->pcm.log2_min_pcm_cb_size = get_ue_golomb_long(gb) + 3;
1085
        sps->pcm.log2_max_pcm_cb_size = sps->pcm.log2_min_pcm_cb_size +
1086
                                        get_ue_golomb_long(gb);
1087
        if (FFMAX(sps->pcm.bit_depth, sps->pcm.bit_depth_chroma) > sps->bit_depth) {
1088
            av_log(avctx, AV_LOG_ERROR,
1089 1090
                   "PCM bit depth (%d, %d) is greater than normal bit depth (%d)\n",
                   sps->pcm.bit_depth, sps->pcm.bit_depth_chroma, sps->bit_depth);
1091
            return AVERROR_INVALIDDATA;
1092 1093 1094 1095 1096
        }

        sps->pcm.loop_filter_disable_flag = get_bits1(gb);
    }

1097
    sps->nb_st_rps = get_ue_golomb_long(gb);
1098
    if (sps->nb_st_rps > HEVC_MAX_SHORT_TERM_REF_PIC_SETS) {
1099
        av_log(avctx, AV_LOG_ERROR, "Too many short term RPS: %d.\n",
1100
               sps->nb_st_rps);
1101
        return AVERROR_INVALIDDATA;
1102
    }
1103
    for (i = 0; i < sps->nb_st_rps; i++) {
1104
        if ((ret = ff_hevc_decode_short_term_rps(gb, avctx, &sps->st_rps[i],
1105
                                                 sps, 0)) < 0)
1106
            return ret;
1107 1108 1109 1110
    }

    sps->long_term_ref_pics_present_flag = get_bits1(gb);
    if (sps->long_term_ref_pics_present_flag) {
1111
        sps->num_long_term_ref_pics_sps = get_ue_golomb_long(gb);
1112 1113
        if (sps->num_long_term_ref_pics_sps > HEVC_MAX_LONG_TERM_REF_PICS) {
            av_log(avctx, AV_LOG_ERROR, "Too many long term ref pics: %d.\n",
1114
                   sps->num_long_term_ref_pics_sps);
1115
            return AVERROR_INVALIDDATA;
1116
        }
1117 1118 1119 1120 1121 1122 1123 1124
        for (i = 0; i < sps->num_long_term_ref_pics_sps; i++) {
            sps->lt_ref_pic_poc_lsb_sps[i]       = get_bits(gb, sps->log2_max_poc_lsb);
            sps->used_by_curr_pic_lt_sps_flag[i] = get_bits1(gb);
        }
    }

    sps->sps_temporal_mvp_enabled_flag          = get_bits1(gb);
    sps->sps_strong_intra_smoothing_enable_flag = get_bits1(gb);
Mickaël Raulet's avatar
Mickaël Raulet committed
1125
    sps->vui.sar = (AVRational){0, 1};
1126 1127
    vui_present = get_bits1(gb);
    if (vui_present)
1128
        decode_vui(gb, avctx, apply_defdispwin, sps);
1129

1130
    if (get_bits1(gb)) { // sps_extension_flag
1131
        sps->sps_range_extension_flag = get_bits1(gb);
1132
        skip_bits(gb, 7); //sps_extension_7bits = get_bits(gb, 7);
1133
        if (sps->sps_range_extension_flag) {
1134 1135 1136 1137 1138 1139
            sps->transform_skip_rotation_enabled_flag = get_bits1(gb);
            sps->transform_skip_context_enabled_flag  = get_bits1(gb);
            sps->implicit_rdpcm_enabled_flag = get_bits1(gb);

            sps->explicit_rdpcm_enabled_flag = get_bits1(gb);

1140 1141
            sps->extended_precision_processing_flag = get_bits1(gb);
            if (sps->extended_precision_processing_flag)
1142
                av_log(avctx, AV_LOG_WARNING,
1143 1144 1145
                   "extended_precision_processing_flag not yet implemented\n");

            sps->intra_smoothing_disabled_flag       = get_bits1(gb);
1146 1147
            sps->high_precision_offsets_enabled_flag = get_bits1(gb);
            if (sps->high_precision_offsets_enabled_flag)
1148
                av_log(avctx, AV_LOG_WARNING,
1149 1150 1151 1152
                   "high_precision_offsets_enabled_flag not yet implemented\n");

            sps->persistent_rice_adaptation_enabled_flag = get_bits1(gb);

1153 1154
            sps->cabac_bypass_alignment_enabled_flag  = get_bits1(gb);
            if (sps->cabac_bypass_alignment_enabled_flag)
1155
                av_log(avctx, AV_LOG_WARNING,
1156 1157 1158
                   "cabac_bypass_alignment_enabled_flag not yet implemented\n");
        }
    }
1159
    if (apply_defdispwin) {
1160 1161 1162 1163 1164
        sps->output_window.left_offset   += sps->vui.def_disp_win.left_offset;
        sps->output_window.right_offset  += sps->vui.def_disp_win.right_offset;
        sps->output_window.top_offset    += sps->vui.def_disp_win.top_offset;
        sps->output_window.bottom_offset += sps->vui.def_disp_win.bottom_offset;
    }
1165 1166 1167 1168 1169 1170 1171 1172

    ow = &sps->output_window;
    if (ow->left_offset >= INT_MAX - ow->right_offset     ||
        ow->top_offset  >= INT_MAX - ow->bottom_offset    ||
        ow->left_offset + ow->right_offset  >= sps->width ||
        ow->top_offset  + ow->bottom_offset >= sps->height) {
        av_log(avctx, AV_LOG_WARNING, "Invalid cropping offsets: %u/%u/%u/%u\n",
               ow->left_offset, ow->right_offset, ow->top_offset, ow->bottom_offset);
1173
        if (avctx->err_recognition & AV_EF_EXPLODE) {
1174
            return AVERROR_INVALIDDATA;
1175
        }
1176
        av_log(avctx, AV_LOG_WARNING,
1177
               "Displaying the whole video surface.\n");
1178
        memset(ow, 0, sizeof(*ow));
1179
        memset(&sps->pic_conf_win, 0, sizeof(sps->pic_conf_win));
1180 1181 1182
    }

    // Inferred parameters
Guillaume Martres's avatar
Guillaume Martres committed
1183 1184 1185
    sps->log2_ctb_size = sps->log2_min_cb_size +
                         sps->log2_diff_max_min_coding_block_size;
    sps->log2_min_pu_size = sps->log2_min_cb_size - 1;
1186

James Almer's avatar
James Almer committed
1187
    if (sps->log2_ctb_size > HEVC_MAX_LOG2_CTB_SIZE) {
1188
        av_log(avctx, AV_LOG_ERROR, "CTB size out of range: 2^%d\n", sps->log2_ctb_size);
1189
        return AVERROR_INVALIDDATA;
1190 1191
    }
    if (sps->log2_ctb_size < 4) {
1192
        av_log(avctx,
1193 1194 1195
               AV_LOG_ERROR,
               "log2_ctb_size %d differs from the bounds of any known profile\n",
               sps->log2_ctb_size);
1196
        avpriv_request_sample(avctx, "log2_ctb_size %d", sps->log2_ctb_size);
1197
        return AVERROR_INVALIDDATA;
1198 1199
    }

Guillaume Martres's avatar
Guillaume Martres committed
1200 1201 1202
    sps->ctb_width  = (sps->width  + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size;
    sps->ctb_height = (sps->height + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size;
    sps->ctb_size   = sps->ctb_width * sps->ctb_height;
1203

Guillaume Martres's avatar
Guillaume Martres committed
1204 1205 1206 1207 1208 1209
    sps->min_cb_width  = sps->width  >> sps->log2_min_cb_size;
    sps->min_cb_height = sps->height >> sps->log2_min_cb_size;
    sps->min_tb_width  = sps->width  >> sps->log2_min_tb_size;
    sps->min_tb_height = sps->height >> sps->log2_min_tb_size;
    sps->min_pu_width  = sps->width  >> sps->log2_min_pu_size;
    sps->min_pu_height = sps->height >> sps->log2_min_pu_size;
1210
    sps->tb_mask       = (1 << (sps->log2_ctb_size - sps->log2_min_tb_size)) - 1;
1211

Guillaume Martres's avatar
Guillaume Martres committed
1212
    sps->qp_bd_offset = 6 * (sps->bit_depth - 8);
1213

1214 1215
    if (av_mod_uintp2(sps->width, sps->log2_min_cb_size) ||
        av_mod_uintp2(sps->height, sps->log2_min_cb_size)) {
1216
        av_log(avctx, AV_LOG_ERROR, "Invalid coded frame dimensions.\n");
1217
        return AVERROR_INVALIDDATA;
1218 1219
    }

1220
    if (sps->max_transform_hierarchy_depth_inter > sps->log2_ctb_size - sps->log2_min_tb_size) {
1221
        av_log(avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_inter out of range: %d\n",
1222
               sps->max_transform_hierarchy_depth_inter);
1223
        return AVERROR_INVALIDDATA;
1224
    }
1225
    if (sps->max_transform_hierarchy_depth_intra > sps->log2_ctb_size - sps->log2_min_tb_size) {
1226
        av_log(avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_intra out of range: %d\n",
1227
               sps->max_transform_hierarchy_depth_intra);
1228
        return AVERROR_INVALIDDATA;
1229 1230
    }
    if (sps->log2_max_trafo_size > FFMIN(sps->log2_ctb_size, 5)) {
1231
        av_log(avctx, AV_LOG_ERROR,
Guillaume Martres's avatar
Guillaume Martres committed
1232
               "max transform block size out of range: %d\n",
1233
               sps->log2_max_trafo_size);
1234
        return AVERROR_INVALIDDATA;
1235 1236
    }

1237
    if (get_bits_left(gb) < 0) {
1238
        av_log(avctx, AV_LOG_ERROR,
1239
               "Overread SPS by %d bits\n", -get_bits_left(gb));
1240
        return AVERROR_INVALIDDATA;
1241 1242
    }

1243 1244 1245
    return 0;
}

1246 1247
int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx,
                           HEVCParamSets *ps, int apply_defdispwin)
1248 1249 1250 1251 1252
{
    HEVCSPS *sps;
    AVBufferRef *sps_buf = av_buffer_allocz(sizeof(*sps));
    unsigned int sps_id;
    int ret;
1253
    ptrdiff_t nal_size;
1254 1255 1256 1257 1258

    if (!sps_buf)
        return AVERROR(ENOMEM);
    sps = (HEVCSPS*)sps_buf->data;

1259
    av_log(avctx, AV_LOG_DEBUG, "Decoding SPS\n");
1260

1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271
    nal_size = gb->buffer_end - gb->buffer;
    if (nal_size > sizeof(sps->data)) {
        av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized SPS "
               "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n",
               nal_size, sizeof(sps->data));
        sps->data_size = sizeof(sps->data);
    } else {
        sps->data_size = nal_size;
    }
    memcpy(sps->data, gb->buffer, sps->data_size);

1272 1273 1274
    ret = ff_hevc_parse_sps(sps, gb, &sps_id,
                            apply_defdispwin,
                            ps->vps_list, avctx);
1275 1276 1277 1278 1279
    if (ret < 0) {
        av_buffer_unref(&sps_buf);
        return ret;
    }

1280 1281
    if (avctx->debug & FF_DEBUG_BITSTREAM) {
        av_log(avctx, AV_LOG_DEBUG,
Guillaume Martres's avatar
Guillaume Martres committed
1282
               "Parsed SPS: id %d; coded wxh: %dx%d; "
1283 1284
               "cropped wxh: %dx%d; pix_fmt: %s.\n",
               sps_id, sps->width, sps->height,
1285 1286
               sps->width - (sps->output_window.left_offset + sps->output_window.right_offset),
               sps->height - (sps->output_window.top_offset + sps->output_window.bottom_offset),
1287 1288 1289
               av_get_pix_fmt_name(sps->pix_fmt));
    }

1290 1291 1292
    /* check if this is a repeat of an already parsed SPS, then keep the
     * original one.
     * otherwise drop all PPSes that depend on it */
1293 1294
    if (ps->sps_list[sps_id] &&
        !memcmp(ps->sps_list[sps_id]->data, sps_buf->data, sps_buf->size)) {
1295 1296
        av_buffer_unref(&sps_buf);
    } else {
1297 1298
        remove_sps(ps, sps_id);
        ps->sps_list[sps_id] = sps_buf;
1299 1300
    }

1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
    return 0;
}

static void hevc_pps_free(void *opaque, uint8_t *data)
{
    HEVCPPS *pps = (HEVCPPS*)data;

    av_freep(&pps->column_width);
    av_freep(&pps->row_height);
    av_freep(&pps->col_bd);
    av_freep(&pps->row_bd);
    av_freep(&pps->col_idxX);
    av_freep(&pps->ctb_addr_rs_to_ts);
    av_freep(&pps->ctb_addr_ts_to_rs);
    av_freep(&pps->tile_pos_rs);
    av_freep(&pps->tile_id);
1317
    av_freep(&pps->min_tb_addr_zs_tab);
1318 1319 1320 1321

    av_freep(&pps);
}

1322 1323
static int pps_range_extensions(GetBitContext *gb, AVCodecContext *avctx,
                                HEVCPPS *pps, HEVCSPS *sps) {
1324 1325 1326 1327 1328 1329 1330 1331 1332 1333
    int i;

    if (pps->transform_skip_enabled_flag) {
        pps->log2_max_transform_skip_block_size = get_ue_golomb_long(gb) + 2;
    }
    pps->cross_component_prediction_enabled_flag = get_bits1(gb);
    pps->chroma_qp_offset_list_enabled_flag = get_bits1(gb);
    if (pps->chroma_qp_offset_list_enabled_flag) {
        pps->diff_cu_chroma_qp_offset_depth = get_ue_golomb_long(gb);
        pps->chroma_qp_offset_list_len_minus1 = get_ue_golomb_long(gb);
1334
        if (pps->chroma_qp_offset_list_len_minus1 > 5) {
1335
            av_log(avctx, AV_LOG_ERROR,
1336 1337 1338 1339 1340 1341
                   "chroma_qp_offset_list_len_minus1 shall be in the range [0, 5].\n");
            return AVERROR_INVALIDDATA;
        }
        for (i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
            pps->cb_qp_offset_list[i] = get_se_golomb_long(gb);
            if (pps->cb_qp_offset_list[i]) {
1342
                av_log(avctx, AV_LOG_WARNING,
1343 1344 1345 1346
                       "cb_qp_offset_list not tested yet.\n");
            }
            pps->cr_qp_offset_list[i] = get_se_golomb_long(gb);
            if (pps->cr_qp_offset_list[i]) {
1347
                av_log(avctx, AV_LOG_WARNING,
1348 1349 1350 1351 1352 1353 1354
                       "cb_qp_offset_list not tested yet.\n");
            }
        }
    }
    pps->log2_sao_offset_scale_luma = get_ue_golomb_long(gb);
    pps->log2_sao_offset_scale_chroma = get_ue_golomb_long(gb);

1355 1356 1357 1358 1359
    if (   pps->log2_sao_offset_scale_luma   > FFMAX(sps->bit_depth        - 10, 0)
        || pps->log2_sao_offset_scale_chroma > FFMAX(sps->bit_depth_chroma - 10, 0)
    )
        return AVERROR_INVALIDDATA;

1360 1361 1362
    return(0);
}

1363 1364 1365 1366
static inline int setup_pps(AVCodecContext *avctx, GetBitContext *gb,
                            HEVCPPS *pps, HEVCSPS *sps)
{
    int log2_diff;
1367
    int pic_area_in_ctbs;
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417
    int i, j, x, y, ctb_addr_rs, tile_id;

    // Inferred parameters
    pps->col_bd   = av_malloc_array(pps->num_tile_columns + 1, sizeof(*pps->col_bd));
    pps->row_bd   = av_malloc_array(pps->num_tile_rows + 1,    sizeof(*pps->row_bd));
    pps->col_idxX = av_malloc_array(sps->ctb_width,    sizeof(*pps->col_idxX));
    if (!pps->col_bd || !pps->row_bd || !pps->col_idxX)
        return AVERROR(ENOMEM);

    if (pps->uniform_spacing_flag) {
        if (!pps->column_width) {
            pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width));
            pps->row_height   = av_malloc_array(pps->num_tile_rows,    sizeof(*pps->row_height));
        }
        if (!pps->column_width || !pps->row_height)
            return AVERROR(ENOMEM);

        for (i = 0; i < pps->num_tile_columns; i++) {
            pps->column_width[i] = ((i + 1) * sps->ctb_width) / pps->num_tile_columns -
                                   (i * sps->ctb_width) / pps->num_tile_columns;
        }

        for (i = 0; i < pps->num_tile_rows; i++) {
            pps->row_height[i] = ((i + 1) * sps->ctb_height) / pps->num_tile_rows -
                                 (i * sps->ctb_height) / pps->num_tile_rows;
        }
    }

    pps->col_bd[0] = 0;
    for (i = 0; i < pps->num_tile_columns; i++)
        pps->col_bd[i + 1] = pps->col_bd[i] + pps->column_width[i];

    pps->row_bd[0] = 0;
    for (i = 0; i < pps->num_tile_rows; i++)
        pps->row_bd[i + 1] = pps->row_bd[i] + pps->row_height[i];

    for (i = 0, j = 0; i < sps->ctb_width; i++) {
        if (i > pps->col_bd[j])
            j++;
        pps->col_idxX[i] = j;
    }

    /**
     * 6.5
     */
    pic_area_in_ctbs     = sps->ctb_width    * sps->ctb_height;

    pps->ctb_addr_rs_to_ts = av_malloc_array(pic_area_in_ctbs,    sizeof(*pps->ctb_addr_rs_to_ts));
    pps->ctb_addr_ts_to_rs = av_malloc_array(pic_area_in_ctbs,    sizeof(*pps->ctb_addr_ts_to_rs));
    pps->tile_id           = av_malloc_array(pic_area_in_ctbs,    sizeof(*pps->tile_id));
1418
    pps->min_tb_addr_zs_tab = av_malloc_array((sps->tb_mask+2) * (sps->tb_mask+2), sizeof(*pps->min_tb_addr_zs_tab));
1419
    if (!pps->ctb_addr_rs_to_ts || !pps->ctb_addr_ts_to_rs ||
1420
        !pps->tile_id || !pps->min_tb_addr_zs_tab) {
1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472
        return AVERROR(ENOMEM);
    }

    for (ctb_addr_rs = 0; ctb_addr_rs < pic_area_in_ctbs; ctb_addr_rs++) {
        int tb_x   = ctb_addr_rs % sps->ctb_width;
        int tb_y   = ctb_addr_rs / sps->ctb_width;
        int tile_x = 0;
        int tile_y = 0;
        int val    = 0;

        for (i = 0; i < pps->num_tile_columns; i++) {
            if (tb_x < pps->col_bd[i + 1]) {
                tile_x = i;
                break;
            }
        }

        for (i = 0; i < pps->num_tile_rows; i++) {
            if (tb_y < pps->row_bd[i + 1]) {
                tile_y = i;
                break;
            }
        }

        for (i = 0; i < tile_x; i++)
            val += pps->row_height[tile_y] * pps->column_width[i];
        for (i = 0; i < tile_y; i++)
            val += sps->ctb_width * pps->row_height[i];

        val += (tb_y - pps->row_bd[tile_y]) * pps->column_width[tile_x] +
               tb_x - pps->col_bd[tile_x];

        pps->ctb_addr_rs_to_ts[ctb_addr_rs] = val;
        pps->ctb_addr_ts_to_rs[val]         = ctb_addr_rs;
    }

    for (j = 0, tile_id = 0; j < pps->num_tile_rows; j++)
        for (i = 0; i < pps->num_tile_columns; i++, tile_id++)
            for (y = pps->row_bd[j]; y < pps->row_bd[j + 1]; y++)
                for (x = pps->col_bd[i]; x < pps->col_bd[i + 1]; x++)
                    pps->tile_id[pps->ctb_addr_rs_to_ts[y * sps->ctb_width + x]] = tile_id;

    pps->tile_pos_rs = av_malloc_array(tile_id, sizeof(*pps->tile_pos_rs));
    if (!pps->tile_pos_rs)
        return AVERROR(ENOMEM);

    for (j = 0; j < pps->num_tile_rows; j++)
        for (i = 0; i < pps->num_tile_columns; i++)
            pps->tile_pos_rs[j * pps->num_tile_columns + i] =
                pps->row_bd[j] * sps->ctb_width + pps->col_bd[i];

    log2_diff = sps->log2_ctb_size - sps->log2_min_tb_size;
1473 1474 1475 1476 1477 1478 1479
    pps->min_tb_addr_zs = &pps->min_tb_addr_zs_tab[1*(sps->tb_mask+2)+1];
    for (y = 0; y < sps->tb_mask+2; y++) {
        pps->min_tb_addr_zs_tab[y*(sps->tb_mask+2)] = -1;
        pps->min_tb_addr_zs_tab[y]    = -1;
    }
    for (y = 0; y < sps->tb_mask+1; y++) {
        for (x = 0; x < sps->tb_mask+1; x++) {
1480 1481 1482 1483 1484 1485 1486 1487
            int tb_x = x >> log2_diff;
            int tb_y = y >> log2_diff;
            int rs   = sps->ctb_width * tb_y + tb_x;
            int val  = pps->ctb_addr_rs_to_ts[rs] << (log2_diff * 2);
            for (i = 0; i < log2_diff; i++) {
                int m = 1 << i;
                val += (m & x ? m * m : 0) + (m & y ? 2 * m * m : 0);
            }
1488
            pps->min_tb_addr_zs[y * (sps->tb_mask+2) + x] = val;
1489 1490 1491 1492 1493 1494
        }
    }

    return 0;
}

1495 1496
int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx,
                           HEVCParamSets *ps)
1497 1498
{
    HEVCSPS      *sps = NULL;
1499
    int i, ret = 0;
1500
    unsigned int pps_id = 0;
1501
    ptrdiff_t nal_size;
1502
    unsigned log2_parallel_merge_level_minus2;
1503 1504 1505 1506 1507 1508 1509

    AVBufferRef *pps_buf;
    HEVCPPS *pps = av_mallocz(sizeof(*pps));

    if (!pps)
        return AVERROR(ENOMEM);

Guillaume Martres's avatar
Guillaume Martres committed
1510 1511
    pps_buf = av_buffer_create((uint8_t *)pps, sizeof(*pps),
                               hevc_pps_free, NULL, 0);
1512 1513 1514 1515 1516
    if (!pps_buf) {
        av_freep(&pps);
        return AVERROR(ENOMEM);
    }

1517
    av_log(avctx, AV_LOG_DEBUG, "Decoding PPS\n");
1518

1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
    nal_size = gb->buffer_end - gb->buffer;
    if (nal_size > sizeof(pps->data)) {
        av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized PPS "
               "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n",
               nal_size, sizeof(pps->data));
        pps->data_size = sizeof(pps->data);
    } else {
        pps->data_size = nal_size;
    }
    memcpy(pps->data, gb->buffer, pps->data_size);

1530 1531 1532 1533 1534
    // Default values
    pps->loop_filter_across_tiles_enabled_flag = 1;
    pps->num_tile_columns                      = 1;
    pps->num_tile_rows                         = 1;
    pps->uniform_spacing_flag                  = 1;
1535
    pps->disable_dbf                           = 0;
1536 1537
    pps->beta_offset                           = 0;
    pps->tc_offset                             = 0;
1538
    pps->log2_max_transform_skip_block_size    = 2;
1539 1540

    // Coded parameters
1541
    pps_id = get_ue_golomb_long(gb);
1542
    if (pps_id >= HEVC_MAX_PPS_COUNT) {
1543
        av_log(avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id);
1544
        ret = AVERROR_INVALIDDATA;
1545 1546
        goto err;
    }
1547
    pps->sps_id = get_ue_golomb_long(gb);
1548
    if (pps->sps_id >= HEVC_MAX_SPS_COUNT) {
1549
        av_log(avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", pps->sps_id);
1550 1551 1552
        ret = AVERROR_INVALIDDATA;
        goto err;
    }
1553 1554
    if (!ps->sps_list[pps->sps_id]) {
        av_log(avctx, AV_LOG_ERROR, "SPS %u does not exist.\n", pps->sps_id);
1555 1556 1557
        ret = AVERROR_INVALIDDATA;
        goto err;
    }
1558
    sps = (HEVCSPS *)ps->sps_list[pps->sps_id]->data;
1559 1560 1561 1562 1563 1564 1565 1566 1567

    pps->dependent_slice_segments_enabled_flag = get_bits1(gb);
    pps->output_flag_present_flag              = get_bits1(gb);
    pps->num_extra_slice_header_bits           = get_bits(gb, 3);

    pps->sign_data_hiding_flag = get_bits1(gb);

    pps->cabac_init_present_flag = get_bits1(gb);

1568 1569
    pps->num_ref_idx_l0_default_active = get_ue_golomb_long(gb) + 1;
    pps->num_ref_idx_l1_default_active = get_ue_golomb_long(gb) + 1;
1570 1571 1572 1573 1574 1575 1576 1577 1578

    pps->pic_init_qp_minus26 = get_se_golomb(gb);

    pps->constrained_intra_pred_flag = get_bits1(gb);
    pps->transform_skip_enabled_flag = get_bits1(gb);

    pps->cu_qp_delta_enabled_flag = get_bits1(gb);
    pps->diff_cu_qp_delta_depth   = 0;
    if (pps->cu_qp_delta_enabled_flag)
1579
        pps->diff_cu_qp_delta_depth = get_ue_golomb_long(gb);
1580

1581 1582
    if (pps->diff_cu_qp_delta_depth < 0 ||
        pps->diff_cu_qp_delta_depth > sps->log2_diff_max_min_coding_block_size) {
1583
        av_log(avctx, AV_LOG_ERROR, "diff_cu_qp_delta_depth %d is invalid\n",
1584 1585 1586 1587 1588
               pps->diff_cu_qp_delta_depth);
        ret = AVERROR_INVALIDDATA;
        goto err;
    }

1589 1590
    pps->cb_qp_offset = get_se_golomb(gb);
    if (pps->cb_qp_offset < -12 || pps->cb_qp_offset > 12) {
1591
        av_log(avctx, AV_LOG_ERROR, "pps_cb_qp_offset out of range: %d\n",
1592 1593 1594 1595 1596 1597
               pps->cb_qp_offset);
        ret = AVERROR_INVALIDDATA;
        goto err;
    }
    pps->cr_qp_offset = get_se_golomb(gb);
    if (pps->cr_qp_offset < -12 || pps->cr_qp_offset > 12) {
1598
        av_log(avctx, AV_LOG_ERROR, "pps_cr_qp_offset out of range: %d\n",
1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612
               pps->cr_qp_offset);
        ret = AVERROR_INVALIDDATA;
        goto err;
    }
    pps->pic_slice_level_chroma_qp_offsets_present_flag = get_bits1(gb);

    pps->weighted_pred_flag   = get_bits1(gb);
    pps->weighted_bipred_flag = get_bits1(gb);

    pps->transquant_bypass_enable_flag    = get_bits1(gb);
    pps->tiles_enabled_flag               = get_bits1(gb);
    pps->entropy_coding_sync_enabled_flag = get_bits1(gb);

    if (pps->tiles_enabled_flag) {
1613 1614 1615 1616
        int num_tile_columns_minus1 = get_ue_golomb(gb);
        int num_tile_rows_minus1    = get_ue_golomb(gb);

        if (num_tile_columns_minus1 < 0 ||
1617
            num_tile_columns_minus1 >= sps->ctb_width) {
1618
            av_log(avctx, AV_LOG_ERROR, "num_tile_columns_minus1 out of range: %d\n",
1619 1620
                   num_tile_columns_minus1);
            ret = num_tile_columns_minus1 < 0 ? num_tile_columns_minus1 : AVERROR_INVALIDDATA;
1621 1622
            goto err;
        }
1623
        if (num_tile_rows_minus1 < 0 ||
1624
            num_tile_rows_minus1 >= sps->ctb_height) {
1625
            av_log(avctx, AV_LOG_ERROR, "num_tile_rows_minus1 out of range: %d\n",
1626 1627
                   num_tile_rows_minus1);
            ret = num_tile_rows_minus1 < 0 ? num_tile_rows_minus1 : AVERROR_INVALIDDATA;
1628 1629
            goto err;
        }
1630 1631
        pps->num_tile_columns = num_tile_columns_minus1 + 1;
        pps->num_tile_rows    = num_tile_rows_minus1    + 1;
1632 1633 1634 1635 1636 1637 1638 1639 1640 1641

        pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width));
        pps->row_height   = av_malloc_array(pps->num_tile_rows,    sizeof(*pps->row_height));
        if (!pps->column_width || !pps->row_height) {
            ret = AVERROR(ENOMEM);
            goto err;
        }

        pps->uniform_spacing_flag = get_bits1(gb);
        if (!pps->uniform_spacing_flag) {
1642
            uint64_t sum = 0;
1643
            for (i = 0; i < pps->num_tile_columns - 1; i++) {
1644
                pps->column_width[i] = get_ue_golomb_long(gb) + 1;
Guillaume Martres's avatar
Guillaume Martres committed
1645
                sum                 += pps->column_width[i];
1646 1647
            }
            if (sum >= sps->ctb_width) {
1648
                av_log(avctx, AV_LOG_ERROR, "Invalid tile widths.\n");
1649
                ret = AVERROR_INVALIDDATA;
1650 1651
                goto err;
            }
1652 1653 1654 1655
            pps->column_width[pps->num_tile_columns - 1] = sps->ctb_width - sum;

            sum = 0;
            for (i = 0; i < pps->num_tile_rows - 1; i++) {
1656
                pps->row_height[i] = get_ue_golomb_long(gb) + 1;
Guillaume Martres's avatar
Guillaume Martres committed
1657
                sum               += pps->row_height[i];
1658 1659
            }
            if (sum >= sps->ctb_height) {
1660
                av_log(avctx, AV_LOG_ERROR, "Invalid tile heights.\n");
1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673
                ret = AVERROR_INVALIDDATA;
                goto err;
            }
            pps->row_height[pps->num_tile_rows - 1] = sps->ctb_height - sum;
        }
        pps->loop_filter_across_tiles_enabled_flag = get_bits1(gb);
    }

    pps->seq_loop_filter_across_slices_enabled_flag = get_bits1(gb);

    pps->deblocking_filter_control_present_flag = get_bits1(gb);
    if (pps->deblocking_filter_control_present_flag) {
        pps->deblocking_filter_override_enabled_flag = get_bits1(gb);
Guillaume Martres's avatar
Guillaume Martres committed
1674
        pps->disable_dbf                             = get_bits1(gb);
1675
        if (!pps->disable_dbf) {
1676 1677 1678
            int beta_offset_div2 = get_se_golomb(gb);
            int tc_offset_div2   = get_se_golomb(gb) ;
            if (beta_offset_div2 < -6 || beta_offset_div2 > 6) {
1679
                av_log(avctx, AV_LOG_ERROR, "pps_beta_offset_div2 out of range: %d\n",
1680
                       beta_offset_div2);
1681 1682 1683
                ret = AVERROR_INVALIDDATA;
                goto err;
            }
1684
            if (tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1685
                av_log(avctx, AV_LOG_ERROR, "pps_tc_offset_div2 out of range: %d\n",
1686
                       tc_offset_div2);
1687 1688 1689
                ret = AVERROR_INVALIDDATA;
                goto err;
            }
1690 1691
            pps->beta_offset = 2 * beta_offset_div2;
            pps->tc_offset   = 2 *   tc_offset_div2;
1692 1693 1694
        }
    }

Guillaume Martres's avatar
Guillaume Martres committed
1695 1696
    pps->scaling_list_data_present_flag = get_bits1(gb);
    if (pps->scaling_list_data_present_flag) {
1697
        set_default_scaling_list_data(&pps->scaling_list);
1698
        ret = scaling_list_data(gb, avctx, &pps->scaling_list, sps);
1699 1700 1701 1702
        if (ret < 0)
            goto err;
    }
    pps->lists_modification_present_flag = get_bits1(gb);
1703 1704
    log2_parallel_merge_level_minus2     = get_ue_golomb_long(gb);
    if (log2_parallel_merge_level_minus2 > sps->log2_ctb_size) {
1705
        av_log(avctx, AV_LOG_ERROR, "log2_parallel_merge_level_minus2 out of range: %d\n",
1706
               log2_parallel_merge_level_minus2);
1707
        ret = AVERROR_INVALIDDATA;
1708 1709
        goto err;
    }
1710
    pps->log2_parallel_merge_level       = log2_parallel_merge_level_minus2 + 2;
1711 1712

    pps->slice_header_extension_present_flag = get_bits1(gb);
1713 1714

    if (get_bits1(gb)) { // pps_extension_present_flag
1715
        pps->pps_range_extensions_flag = get_bits1(gb);
1716
        skip_bits(gb, 7); // pps_extension_7bits
1717
        if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_REXT && pps->pps_range_extensions_flag) {
1718
            if ((ret = pps_range_extensions(gb, avctx, pps, sps)) < 0)
1719
                goto err;
1720 1721
        }
    }
1722

1723 1724
    ret = setup_pps(avctx, gb, pps, sps);
    if (ret < 0)
1725 1726
        goto err;

1727
    if (get_bits_left(gb) < 0) {
1728
        av_log(avctx, AV_LOG_ERROR,
1729 1730 1731 1732
               "Overread PPS by %d bits\n", -get_bits_left(gb));
        goto err;
    }

1733 1734
    remove_pps(ps, pps_id);
    ps->pps_list[pps_id] = pps_buf;
1735 1736 1737 1738 1739 1740 1741

    return 0;

err:
    av_buffer_unref(&pps_buf);
    return ret;
}
1742

1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758
void ff_hevc_ps_uninit(HEVCParamSets *ps)
{
    int i;

    for (i = 0; i < FF_ARRAY_ELEMS(ps->vps_list); i++)
        av_buffer_unref(&ps->vps_list[i]);
    for (i = 0; i < FF_ARRAY_ELEMS(ps->sps_list); i++)
        av_buffer_unref(&ps->sps_list[i]);
    for (i = 0; i < FF_ARRAY_ELEMS(ps->pps_list); i++)
        av_buffer_unref(&ps->pps_list[i]);

    ps->sps = NULL;
    ps->pps = NULL;
    ps->vps = NULL;
}

1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
int ff_hevc_compute_poc(const HEVCSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type)
{
    int max_poc_lsb  = 1 << sps->log2_max_poc_lsb;
    int prev_poc_lsb = pocTid0 % max_poc_lsb;
    int prev_poc_msb = pocTid0 - prev_poc_lsb;
    int poc_msb;

    if (poc_lsb < prev_poc_lsb && prev_poc_lsb - poc_lsb >= max_poc_lsb / 2)
        poc_msb = prev_poc_msb + max_poc_lsb;
    else if (poc_lsb > prev_poc_lsb && poc_lsb - prev_poc_lsb > max_poc_lsb / 2)
        poc_msb = prev_poc_msb - max_poc_lsb;
    else
        poc_msb = prev_poc_msb;

    // For BLA picture types, POCmsb is set to 0.
    if (nal_unit_type == HEVC_NAL_BLA_W_LP   ||
        nal_unit_type == HEVC_NAL_BLA_W_RADL ||
        nal_unit_type == HEVC_NAL_BLA_N_LP)
        poc_msb = 0;

    return poc_msb + poc_lsb;
}