1/*
2 * Copyright (c) 2014 Tim Walker <tdskywalker@gmail.com>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include "libavcodec/get_bits.h"
22#include "libavcodec/golomb.h"
23#include "libavcodec/hevc.h"
24#include "libavutil/intreadwrite.h"
25#include "avc.h"
26#include "avio.h"
27#include "hevc.h"
28
29#define MAX_SPATIAL_SEGMENTATION 4096 // max. value of u(12) field
30
31typedef struct HVCCNALUnitArray {
32    uint8_t  array_completeness;
33    uint8_t  NAL_unit_type;
34    uint16_t numNalus;
35    uint16_t *nalUnitLength;
36    uint8_t  **nalUnit;
37} HVCCNALUnitArray;
38
39typedef struct HEVCDecoderConfigurationRecord {
40    uint8_t  configurationVersion;
41    uint8_t  general_profile_space;
42    uint8_t  general_tier_flag;
43    uint8_t  general_profile_idc;
44    uint32_t general_profile_compatibility_flags;
45    uint64_t general_constraint_indicator_flags;
46    uint8_t  general_level_idc;
47    uint16_t min_spatial_segmentation_idc;
48    uint8_t  parallelismType;
49    uint8_t  chromaFormat;
50    uint8_t  bitDepthLumaMinus8;
51    uint8_t  bitDepthChromaMinus8;
52    uint16_t avgFrameRate;
53    uint8_t  constantFrameRate;
54    uint8_t  numTemporalLayers;
55    uint8_t  temporalIdNested;
56    uint8_t  lengthSizeMinusOne;
57    uint8_t  numOfArrays;
58    HVCCNALUnitArray *array;
59} HEVCDecoderConfigurationRecord;
60
61typedef struct HVCCProfileTierLevel {
62    uint8_t  profile_space;
63    uint8_t  tier_flag;
64    uint8_t  profile_idc;
65    uint32_t profile_compatibility_flags;
66    uint64_t constraint_indicator_flags;
67    uint8_t  level_idc;
68} HVCCProfileTierLevel;
69
70static void hvcc_update_ptl(HEVCDecoderConfigurationRecord *hvcc,
71                            HVCCProfileTierLevel *ptl)
72{
73    /*
74     * The value of general_profile_space in all the parameter sets must be
75     * identical.
76     */
77    hvcc->general_profile_space = ptl->profile_space;
78
79    /*
80     * The level indication general_level_idc must indicate a level of
81     * capability equal to or greater than the highest level indicated for the
82     * highest tier in all the parameter sets.
83     */
84    if (hvcc->general_tier_flag < ptl->tier_flag)
85        hvcc->general_level_idc = ptl->level_idc;
86    else
87        hvcc->general_level_idc = FFMAX(hvcc->general_level_idc, ptl->level_idc);
88
89    /*
90     * The tier indication general_tier_flag must indicate a tier equal to or
91     * greater than the highest tier indicated in all the parameter sets.
92     */
93    hvcc->general_tier_flag = FFMAX(hvcc->general_tier_flag, ptl->tier_flag);
94
95    /*
96     * The profile indication general_profile_idc must indicate a profile to
97     * which the stream associated with this configuration record conforms.
98     *
99     * If the sequence parameter sets are marked with different profiles, then
100     * the stream may need examination to determine which profile, if any, the
101     * entire stream conforms to. If the entire stream is not examined, or the
102     * examination reveals that there is no profile to which the entire stream
103     * conforms, then the entire stream must be split into two or more
104     * sub-streams with separate configuration records in which these rules can
105     * be met.
106     *
107     * Note: set the profile to the highest value for the sake of simplicity.
108     */
109    hvcc->general_profile_idc = FFMAX(hvcc->general_profile_idc, ptl->profile_idc);
110
111    /*
112     * Each bit in general_profile_compatibility_flags may only be set if all
113     * the parameter sets set that bit.
114     */
115    hvcc->general_profile_compatibility_flags &= ptl->profile_compatibility_flags;
116
117    /*
118     * Each bit in general_constraint_indicator_flags may only be set if all
119     * the parameter sets set that bit.
120     */
121    hvcc->general_constraint_indicator_flags &= ptl->constraint_indicator_flags;
122}
123
124static void hvcc_parse_ptl(GetBitContext *gb,
125                           HEVCDecoderConfigurationRecord *hvcc,
126                           unsigned int max_sub_layers_minus1)
127{
128    unsigned int i;
129    HVCCProfileTierLevel general_ptl;
130    uint8_t sub_layer_profile_present_flag[MAX_SUB_LAYERS];
131    uint8_t sub_layer_level_present_flag[MAX_SUB_LAYERS];
132
133    general_ptl.profile_space               = get_bits(gb, 2);
134    general_ptl.tier_flag                   = get_bits1(gb);
135    general_ptl.profile_idc                 = get_bits(gb, 5);
136    general_ptl.profile_compatibility_flags = get_bits_long(gb, 32);
137    general_ptl.constraint_indicator_flags  = get_bits64(gb, 48);
138    general_ptl.level_idc                   = get_bits(gb, 8);
139    hvcc_update_ptl(hvcc, &general_ptl);
140
141    for (i = 0; i < max_sub_layers_minus1; i++) {
142        sub_layer_profile_present_flag[i] = get_bits1(gb);
143        sub_layer_level_present_flag[i]   = get_bits1(gb);
144    }
145
146    if (max_sub_layers_minus1 > 0)
147        for (i = max_sub_layers_minus1; i < 8; i++)
148            skip_bits(gb, 2); // reserved_zero_2bits[i]
149
150    for (i = 0; i < max_sub_layers_minus1; i++) {
151        if (sub_layer_profile_present_flag[i]) {
152            /*
153             * sub_layer_profile_space[i]                     u(2)
154             * sub_layer_tier_flag[i]                         u(1)
155             * sub_layer_profile_idc[i]                       u(5)
156             * sub_layer_profile_compatibility_flag[i][0..31] u(32)
157             * sub_layer_progressive_source_flag[i]           u(1)
158             * sub_layer_interlaced_source_flag[i]            u(1)
159             * sub_layer_non_packed_constraint_flag[i]        u(1)
160             * sub_layer_frame_only_constraint_flag[i]        u(1)
161             * sub_layer_reserved_zero_44bits[i]              u(44)
162             */
163            skip_bits_long(gb, 32);
164            skip_bits_long(gb, 32);
165            skip_bits     (gb, 24);
166        }
167
168        if (sub_layer_level_present_flag[i])
169            skip_bits(gb, 8);
170    }
171}
172
173static void skip_sub_layer_hrd_parameters(GetBitContext *gb,
174                                          unsigned int cpb_cnt_minus1,
175                                          uint8_t sub_pic_hrd_params_present_flag)
176{
177    unsigned int i;
178
179    for (i = 0; i <= cpb_cnt_minus1; i++) {
180        get_ue_golomb_long(gb); // bit_rate_value_minus1
181        get_ue_golomb_long(gb); // cpb_size_value_minus1
182
183        if (sub_pic_hrd_params_present_flag) {
184            get_ue_golomb_long(gb); // cpb_size_du_value_minus1
185            get_ue_golomb_long(gb); // bit_rate_du_value_minus1
186        }
187
188        skip_bits1(gb); // cbr_flag
189    }
190}
191
192static void skip_hrd_parameters(GetBitContext *gb, uint8_t cprms_present_flag,
193                                unsigned int max_sub_layers_minus1)
194{
195    unsigned int i;
196    uint8_t sub_pic_hrd_params_present_flag = 0;
197    uint8_t nal_hrd_parameters_present_flag = 0;
198    uint8_t vcl_hrd_parameters_present_flag = 0;
199
200    if (cprms_present_flag) {
201        nal_hrd_parameters_present_flag = get_bits1(gb);
202        vcl_hrd_parameters_present_flag = get_bits1(gb);
203
204        if (nal_hrd_parameters_present_flag ||
205            vcl_hrd_parameters_present_flag) {
206            sub_pic_hrd_params_present_flag = get_bits1(gb);
207
208            if (sub_pic_hrd_params_present_flag)
209                /*
210                 * tick_divisor_minus2                          u(8)
211                 * du_cpb_removal_delay_increment_length_minus1 u(5)
212                 * sub_pic_cpb_params_in_pic_timing_sei_flag    u(1)
213                 * dpb_output_delay_du_length_minus1            u(5)
214                 */
215                skip_bits(gb, 19);
216
217            /*
218             * bit_rate_scale u(4)
219             * cpb_size_scale u(4)
220             */
221            skip_bits(gb, 8);
222
223            if (sub_pic_hrd_params_present_flag)
224                skip_bits(gb, 4); // cpb_size_du_scale
225
226            /*
227             * initial_cpb_removal_delay_length_minus1 u(5)
228             * au_cpb_removal_delay_length_minus1      u(5)
229             * dpb_output_delay_length_minus1          u(5)
230             */
231            skip_bits(gb, 15);
232        }
233    }
234
235    for (i = 0; i <= max_sub_layers_minus1; i++) {
236        unsigned int cpb_cnt_minus1            = 0;
237        uint8_t low_delay_hrd_flag             = 0;
238        uint8_t fixed_pic_rate_within_cvs_flag = 0;
239        uint8_t fixed_pic_rate_general_flag    = get_bits1(gb);
240
241        if (!fixed_pic_rate_general_flag)
242            fixed_pic_rate_within_cvs_flag = get_bits1(gb);
243
244        if (fixed_pic_rate_within_cvs_flag)
245            get_ue_golomb_long(gb); // elemental_duration_in_tc_minus1
246        else
247            low_delay_hrd_flag = get_bits1(gb);
248
249        if (!low_delay_hrd_flag)
250            cpb_cnt_minus1 = get_ue_golomb_long(gb);
251
252        if (nal_hrd_parameters_present_flag)
253            skip_sub_layer_hrd_parameters(gb, cpb_cnt_minus1,
254                                          sub_pic_hrd_params_present_flag);
255
256        if (vcl_hrd_parameters_present_flag)
257            skip_sub_layer_hrd_parameters(gb, cpb_cnt_minus1,
258                                          sub_pic_hrd_params_present_flag);
259    }
260}
261
262static void skip_timing_info(GetBitContext *gb)
263{
264    skip_bits_long(gb, 32); // num_units_in_tick
265    skip_bits_long(gb, 32); // time_scale
266
267    if (get_bits1(gb))          // poc_proportional_to_timing_flag
268        get_ue_golomb_long(gb); // num_ticks_poc_diff_one_minus1
269}
270
271static void hvcc_parse_vui(GetBitContext *gb,
272                           HEVCDecoderConfigurationRecord *hvcc,
273                           unsigned int max_sub_layers_minus1)
274{
275    unsigned int min_spatial_segmentation_idc;
276
277    if (get_bits1(gb))              // aspect_ratio_info_present_flag
278        if (get_bits(gb, 8) == 255) // aspect_ratio_idc
279            skip_bits_long(gb, 32); // sar_width u(16), sar_height u(16)
280
281    if (get_bits1(gb))  // overscan_info_present_flag
282        skip_bits1(gb); // overscan_appropriate_flag
283
284    if (get_bits1(gb)) {  // video_signal_type_present_flag
285        skip_bits(gb, 4); // video_format u(3), video_full_range_flag u(1)
286
287        if (get_bits1(gb)) // colour_description_present_flag
288            /*
289             * colour_primaries         u(8)
290             * transfer_characteristics u(8)
291             * matrix_coeffs            u(8)
292             */
293            skip_bits(gb, 24);
294    }
295
296    if (get_bits1(gb)) {        // chroma_loc_info_present_flag
297        get_ue_golomb_long(gb); // chroma_sample_loc_type_top_field
298        get_ue_golomb_long(gb); // chroma_sample_loc_type_bottom_field
299    }
300
301    /*
302     * neutral_chroma_indication_flag u(1)
303     * field_seq_flag                 u(1)
304     * frame_field_info_present_flag  u(1)
305     */
306    skip_bits(gb, 3);
307
308    if (get_bits1(gb)) {        // default_display_window_flag
309        get_ue_golomb_long(gb); // def_disp_win_left_offset
310        get_ue_golomb_long(gb); // def_disp_win_right_offset
311        get_ue_golomb_long(gb); // def_disp_win_top_offset
312        get_ue_golomb_long(gb); // def_disp_win_bottom_offset
313    }
314
315    if (get_bits1(gb)) { // vui_timing_info_present_flag
316        skip_timing_info(gb);
317
318        if (get_bits1(gb)) // vui_hrd_parameters_present_flag
319            skip_hrd_parameters(gb, 1, max_sub_layers_minus1);
320    }
321
322    if (get_bits1(gb)) { // bitstream_restriction_flag
323        /*
324         * tiles_fixed_structure_flag              u(1)
325         * motion_vectors_over_pic_boundaries_flag u(1)
326         * restricted_ref_pic_lists_flag           u(1)
327         */
328        skip_bits(gb, 3);
329
330        min_spatial_segmentation_idc = get_ue_golomb_long(gb);
331
332        /*
333         * unsigned int(12) min_spatial_segmentation_idc;
334         *
335         * The min_spatial_segmentation_idc indication must indicate a level of
336         * spatial segmentation equal to or less than the lowest level of
337         * spatial segmentation indicated in all the parameter sets.
338         */
339        hvcc->min_spatial_segmentation_idc = FFMIN(hvcc->min_spatial_segmentation_idc,
340                                                   min_spatial_segmentation_idc);
341
342        get_ue_golomb_long(gb); // max_bytes_per_pic_denom
343        get_ue_golomb_long(gb); // max_bits_per_min_cu_denom
344        get_ue_golomb_long(gb); // log2_max_mv_length_horizontal
345        get_ue_golomb_long(gb); // log2_max_mv_length_vertical
346    }
347}
348
349static void skip_sub_layer_ordering_info(GetBitContext *gb)
350{
351    get_ue_golomb_long(gb); // max_dec_pic_buffering_minus1
352    get_ue_golomb_long(gb); // max_num_reorder_pics
353    get_ue_golomb_long(gb); // max_latency_increase_plus1
354}
355
356static int hvcc_parse_vps(GetBitContext *gb,
357                          HEVCDecoderConfigurationRecord *hvcc)
358{
359    unsigned int vps_max_sub_layers_minus1;
360
361    /*
362     * vps_video_parameter_set_id u(4)
363     * vps_reserved_three_2bits   u(2)
364     * vps_max_layers_minus1      u(6)
365     */
366    skip_bits(gb, 12);
367
368    vps_max_sub_layers_minus1 = get_bits(gb, 3);
369
370    /*
371     * numTemporalLayers greater than 1 indicates that the stream to which this
372     * configuration record applies is temporally scalable and the contained
373     * number of temporal layers (also referred to as temporal sub-layer or
374     * sub-layer in ISO/IEC 23008-2) is equal to numTemporalLayers. Value 1
375     * indicates that the stream is not temporally scalable. Value 0 indicates
376     * that it is unknown whether the stream is temporally scalable.
377     */
378    hvcc->numTemporalLayers = FFMAX(hvcc->numTemporalLayers,
379                                    vps_max_sub_layers_minus1 + 1);
380
381    /*
382     * vps_temporal_id_nesting_flag u(1)
383     * vps_reserved_0xffff_16bits   u(16)
384     */
385    skip_bits(gb, 17);
386
387    hvcc_parse_ptl(gb, hvcc, vps_max_sub_layers_minus1);
388
389    /* nothing useful for hvcC past this point */
390    return 0;
391}
392
393static void skip_scaling_list_data(GetBitContext *gb)
394{
395    int i, j, k, num_coeffs;
396
397    for (i = 0; i < 4; i++)
398        for (j = 0; j < (i == 3 ? 2 : 6); j++)
399            if (!get_bits1(gb))         // scaling_list_pred_mode_flag[i][j]
400                get_ue_golomb_long(gb); // scaling_list_pred_matrix_id_delta[i][j]
401            else {
402                num_coeffs = FFMIN(64, 1 << (4 + (i << 1)));
403
404                if (i > 1)
405                    get_se_golomb_long(gb); // scaling_list_dc_coef_minus8[i-2][j]
406
407                for (k = 0; k < num_coeffs; k++)
408                    get_se_golomb_long(gb); // scaling_list_delta_coef
409            }
410}
411
412static int parse_rps(GetBitContext *gb, unsigned int rps_idx,
413                     unsigned int num_rps,
414                     unsigned int num_delta_pocs[MAX_SHORT_TERM_RPS_COUNT])
415{
416    unsigned int i;
417
418    if (rps_idx && get_bits1(gb)) { // inter_ref_pic_set_prediction_flag
419        /* this should only happen for slice headers, and this isn't one */
420        if (rps_idx >= num_rps)
421            return AVERROR_INVALIDDATA;
422
423        skip_bits1        (gb); // delta_rps_sign
424        get_ue_golomb_long(gb); // abs_delta_rps_minus1
425
426        num_delta_pocs[rps_idx] = 0;
427
428        /*
429         * From libavcodec/hevc_ps.c:
430         *
431         * if (is_slice_header) {
432         *    //foo
433         * } else
434         *     rps_ridx = &sps->st_rps[rps - sps->st_rps - 1];
435         *
436         * where:
437         * rps:             &sps->st_rps[rps_idx]
438         * sps->st_rps:     &sps->st_rps[0]
439         * is_slice_header: rps_idx == num_rps
440         *
441         * thus:
442         * if (num_rps != rps_idx)
443         *     rps_ridx = &sps->st_rps[rps_idx - 1];
444         *
445         * NumDeltaPocs[RefRpsIdx]: num_delta_pocs[rps_idx - 1]
446         */
447        for (i = 0; i < num_delta_pocs[rps_idx - 1]; i++) {
448            uint8_t use_delta_flag = 0;
449            uint8_t used_by_curr_pic_flag = get_bits1(gb);
450            if (!used_by_curr_pic_flag)
451                use_delta_flag = get_bits1(gb);
452
453            if (used_by_curr_pic_flag || use_delta_flag)
454                num_delta_pocs[rps_idx]++;
455        }
456    } else {
457        unsigned int num_negative_pics = get_ue_golomb_long(gb);
458        unsigned int num_positive_pics = get_ue_golomb_long(gb);
459
460        num_delta_pocs[rps_idx] = num_negative_pics + num_positive_pics;
461
462        for (i = 0; i < num_negative_pics; i++) {
463            get_ue_golomb_long(gb); // delta_poc_s0_minus1[rps_idx]
464            skip_bits1        (gb); // used_by_curr_pic_s0_flag[rps_idx]
465        }
466
467        for (i = 0; i < num_positive_pics; i++) {
468            get_ue_golomb_long(gb); // delta_poc_s1_minus1[rps_idx]
469            skip_bits1        (gb); // used_by_curr_pic_s1_flag[rps_idx]
470        }
471    }
472
473    return 0;
474}
475
476static int hvcc_parse_sps(GetBitContext *gb,
477                          HEVCDecoderConfigurationRecord *hvcc)
478{
479    unsigned int i, sps_max_sub_layers_minus1, log2_max_pic_order_cnt_lsb_minus4;
480    unsigned int num_short_term_ref_pic_sets, num_delta_pocs[MAX_SHORT_TERM_RPS_COUNT];
481
482    skip_bits(gb, 4); // sps_video_parameter_set_id
483
484    sps_max_sub_layers_minus1 = get_bits (gb, 3);
485
486    /*
487     * numTemporalLayers greater than 1 indicates that the stream to which this
488     * configuration record applies is temporally scalable and the contained
489     * number of temporal layers (also referred to as temporal sub-layer or
490     * sub-layer in ISO/IEC 23008-2) is equal to numTemporalLayers. Value 1
491     * indicates that the stream is not temporally scalable. Value 0 indicates
492     * that it is unknown whether the stream is temporally scalable.
493     */
494    hvcc->numTemporalLayers = FFMAX(hvcc->numTemporalLayers,
495                                    sps_max_sub_layers_minus1 + 1);
496
497    hvcc->temporalIdNested = get_bits1(gb);
498
499    hvcc_parse_ptl(gb, hvcc, sps_max_sub_layers_minus1);
500
501    get_ue_golomb_long(gb); // sps_seq_parameter_set_id
502
503    hvcc->chromaFormat = get_ue_golomb_long(gb);
504
505    if (hvcc->chromaFormat == 3)
506        skip_bits1(gb); // separate_colour_plane_flag
507
508    get_ue_golomb_long(gb); // pic_width_in_luma_samples
509    get_ue_golomb_long(gb); // pic_height_in_luma_samples
510
511    if (get_bits1(gb)) {        // conformance_window_flag
512        get_ue_golomb_long(gb); // conf_win_left_offset
513        get_ue_golomb_long(gb); // conf_win_right_offset
514        get_ue_golomb_long(gb); // conf_win_top_offset
515        get_ue_golomb_long(gb); // conf_win_bottom_offset
516    }
517
518    hvcc->bitDepthLumaMinus8          = get_ue_golomb_long(gb);
519    hvcc->bitDepthChromaMinus8        = get_ue_golomb_long(gb);
520    log2_max_pic_order_cnt_lsb_minus4 = get_ue_golomb_long(gb);
521
522    /* sps_sub_layer_ordering_info_present_flag */
523    i = get_bits1(gb) ? 0 : sps_max_sub_layers_minus1;
524    for (; i <= sps_max_sub_layers_minus1; i++)
525        skip_sub_layer_ordering_info(gb);
526
527    get_ue_golomb_long(gb); // log2_min_luma_coding_block_size_minus3
528    get_ue_golomb_long(gb); // log2_diff_max_min_luma_coding_block_size
529    get_ue_golomb_long(gb); // log2_min_transform_block_size_minus2
530    get_ue_golomb_long(gb); // log2_diff_max_min_transform_block_size
531    get_ue_golomb_long(gb); // max_transform_hierarchy_depth_inter
532    get_ue_golomb_long(gb); // max_transform_hierarchy_depth_intra
533
534    if (get_bits1(gb) && // scaling_list_enabled_flag
535        get_bits1(gb))   // sps_scaling_list_data_present_flag
536        skip_scaling_list_data(gb);
537
538    skip_bits1(gb); // amp_enabled_flag
539    skip_bits1(gb); // sample_adaptive_offset_enabled_flag
540
541    if (get_bits1(gb)) {           // pcm_enabled_flag
542        skip_bits         (gb, 4); // pcm_sample_bit_depth_luma_minus1
543        skip_bits         (gb, 4); // pcm_sample_bit_depth_chroma_minus1
544        get_ue_golomb_long(gb);    // log2_min_pcm_luma_coding_block_size_minus3
545        get_ue_golomb_long(gb);    // log2_diff_max_min_pcm_luma_coding_block_size
546        skip_bits1        (gb);    // pcm_loop_filter_disabled_flag
547    }
548
549    num_short_term_ref_pic_sets = get_ue_golomb_long(gb);
550    if (num_short_term_ref_pic_sets > MAX_SHORT_TERM_RPS_COUNT)
551        return AVERROR_INVALIDDATA;
552
553    for (i = 0; i < num_short_term_ref_pic_sets; i++) {
554        int ret = parse_rps(gb, i, num_short_term_ref_pic_sets, num_delta_pocs);
555        if (ret < 0)
556            return ret;
557    }
558
559    if (get_bits1(gb)) {                               // long_term_ref_pics_present_flag
560        for (i = 0; i < get_ue_golomb_long(gb); i++) { // num_long_term_ref_pics_sps
561            int len = FFMIN(log2_max_pic_order_cnt_lsb_minus4 + 4, 16);
562            skip_bits (gb, len); // lt_ref_pic_poc_lsb_sps[i]
563            skip_bits1(gb);      // used_by_curr_pic_lt_sps_flag[i]
564        }
565    }
566
567    skip_bits1(gb); // sps_temporal_mvp_enabled_flag
568    skip_bits1(gb); // strong_intra_smoothing_enabled_flag
569
570    if (get_bits1(gb)) // vui_parameters_present_flag
571        hvcc_parse_vui(gb, hvcc, sps_max_sub_layers_minus1);
572
573    /* nothing useful for hvcC past this point */
574    return 0;
575}
576
577static int hvcc_parse_pps(GetBitContext *gb,
578                          HEVCDecoderConfigurationRecord *hvcc)
579{
580    uint8_t tiles_enabled_flag, entropy_coding_sync_enabled_flag;
581
582    get_ue_golomb_long(gb); // pps_pic_parameter_set_id
583    get_ue_golomb_long(gb); // pps_seq_parameter_set_id
584
585    /*
586     * dependent_slice_segments_enabled_flag u(1)
587     * output_flag_present_flag              u(1)
588     * num_extra_slice_header_bits           u(3)
589     * sign_data_hiding_enabled_flag         u(1)
590     * cabac_init_present_flag               u(1)
591     */
592    skip_bits(gb, 7);
593
594    get_ue_golomb_long(gb); // num_ref_idx_l0_default_active_minus1
595    get_ue_golomb_long(gb); // num_ref_idx_l1_default_active_minus1
596    get_se_golomb_long(gb); // init_qp_minus26
597
598    /*
599     * constrained_intra_pred_flag u(1)
600     * transform_skip_enabled_flag u(1)
601     */
602    skip_bits(gb, 2);
603
604    if (get_bits1(gb))          // cu_qp_delta_enabled_flag
605        get_ue_golomb_long(gb); // diff_cu_qp_delta_depth
606
607    get_se_golomb_long(gb); // pps_cb_qp_offset
608    get_se_golomb_long(gb); // pps_cr_qp_offset
609
610    /*
611     * weighted_pred_flag               u(1)
612     * weighted_bipred_flag             u(1)
613     * transquant_bypass_enabled_flag   u(1)
614     */
615    skip_bits(gb, 3);
616
617    tiles_enabled_flag               = get_bits1(gb);
618    entropy_coding_sync_enabled_flag = get_bits1(gb);
619
620    if (entropy_coding_sync_enabled_flag && tiles_enabled_flag)
621        hvcc->parallelismType = 0; // mixed-type parallel decoding
622    else if (entropy_coding_sync_enabled_flag)
623        hvcc->parallelismType = 3; // wavefront-based parallel decoding
624    else if (tiles_enabled_flag)
625        hvcc->parallelismType = 2; // tile-based parallel decoding
626    else
627        hvcc->parallelismType = 1; // slice-based parallel decoding
628
629    /* nothing useful for hvcC past this point */
630    return 0;
631}
632
633static uint8_t *nal_unit_extract_rbsp(const uint8_t *src, uint32_t src_len,
634                                      uint32_t *dst_len)
635{
636    uint8_t *dst;
637    uint32_t i, len;
638
639    dst = av_malloc(src_len);
640    if (!dst)
641        return NULL;
642
643    /* NAL unit header (2 bytes) */
644    i = len = 0;
645    while (i < 2 && i < src_len)
646        dst[len++] = src[i++];
647
648    while (i + 2 < src_len)
649        if (!src[i] && !src[i + 1] && src[i + 2] == 3) {
650            dst[len++] = src[i++];
651            dst[len++] = src[i++];
652            i++; // remove emulation_prevention_three_byte
653        } else
654            dst[len++] = src[i++];
655
656    while (i < src_len)
657        dst[len++] = src[i++];
658
659    *dst_len = len;
660    return dst;
661}
662
663
664
665static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type)
666{
667    skip_bits1(gb); // forbidden_zero_bit
668
669    *nal_type = get_bits(gb, 6);
670
671    /*
672     * nuh_layer_id          u(6)
673     * nuh_temporal_id_plus1 u(3)
674     */
675    skip_bits(gb, 9);
676}
677
678static int hvcc_array_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size,
679                                   uint8_t nal_type, int ps_array_completeness,
680                                   HEVCDecoderConfigurationRecord *hvcc)
681{
682    int ret;
683    uint8_t index;
684    uint16_t numNalus;
685    HVCCNALUnitArray *array;
686
687    for (index = 0; index < hvcc->numOfArrays; index++)
688        if (hvcc->array[index].NAL_unit_type == nal_type)
689            break;
690
691    if (index >= hvcc->numOfArrays) {
692        uint8_t i;
693
694        ret = av_reallocp_array(&hvcc->array, index + 1, sizeof(HVCCNALUnitArray));
695        if (ret < 0)
696            return ret;
697
698        for (i = hvcc->numOfArrays; i <= index; i++)
699            memset(&hvcc->array[i], 0, sizeof(HVCCNALUnitArray));
700        hvcc->numOfArrays = index + 1;
701    }
702
703    array    = &hvcc->array[index];
704    numNalus = array->numNalus;
705
706    ret = av_reallocp_array(&array->nalUnit, numNalus + 1, sizeof(uint8_t*));
707    if (ret < 0)
708        return ret;
709
710    ret = av_reallocp_array(&array->nalUnitLength, numNalus + 1, sizeof(uint16_t));
711    if (ret < 0)
712        return ret;
713
714    array->nalUnit      [numNalus] = nal_buf;
715    array->nalUnitLength[numNalus] = nal_size;
716    array->NAL_unit_type           = nal_type;
717    array->numNalus++;
718
719    /*
720     * When the sample entry name is ���hvc1���, the default and mandatory value of
721     * array_completeness is 1 for arrays of all types of parameter sets, and 0
722     * for all other arrays. When the sample entry name is ���hev1���, the default
723     * value of array_completeness is 0 for all arrays.
724     */
725    if (nal_type == NAL_VPS || nal_type == NAL_SPS || nal_type == NAL_PPS)
726        array->array_completeness = ps_array_completeness;
727
728    return 0;
729}
730
731static int hvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size,
732                             int ps_array_completeness,
733                             HEVCDecoderConfigurationRecord *hvcc)
734{
735    int ret = 0;
736    GetBitContext gbc;
737    uint8_t nal_type;
738    uint8_t *rbsp_buf;
739    uint32_t rbsp_size;
740
741    rbsp_buf = nal_unit_extract_rbsp(nal_buf, nal_size, &rbsp_size);
742    if (!rbsp_buf) {
743        ret = AVERROR(ENOMEM);
744        goto end;
745    }
746
747    ret = init_get_bits8(&gbc, rbsp_buf, rbsp_size);
748    if (ret < 0)
749        goto end;
750
751    nal_unit_parse_header(&gbc, &nal_type);
752
753    /*
754     * Note: only 'declarative' SEI messages are allowed in
755     * hvcC. Perhaps the SEI playload type should be checked
756     * and non-declarative SEI messages discarded?
757     */
758    switch (nal_type) {
759    case NAL_VPS:
760    case NAL_SPS:
761    case NAL_PPS:
762    case NAL_SEI_PREFIX:
763    case NAL_SEI_SUFFIX:
764        ret = hvcc_array_add_nal_unit(nal_buf, nal_size, nal_type,
765                                      ps_array_completeness, hvcc);
766        if (ret < 0)
767            goto end;
768        else if (nal_type == NAL_VPS)
769            ret = hvcc_parse_vps(&gbc, hvcc);
770        else if (nal_type == NAL_SPS)
771            ret = hvcc_parse_sps(&gbc, hvcc);
772        else if (nal_type == NAL_PPS)
773            ret = hvcc_parse_pps(&gbc, hvcc);
774        if (ret < 0)
775            goto end;
776        break;
777    default:
778        ret = AVERROR_INVALIDDATA;
779        goto end;
780    }
781
782end:
783    av_free(rbsp_buf);
784    return ret;
785}
786
787static void hvcc_init(HEVCDecoderConfigurationRecord *hvcc)
788{
789    memset(hvcc, 0, sizeof(HEVCDecoderConfigurationRecord));
790    hvcc->configurationVersion = 1;
791    hvcc->lengthSizeMinusOne   = 3; // 4 bytes
792
793    /*
794     * The following fields have all their valid bits set by default,
795     * the ProfileTierLevel parsing code will unset them when needed.
796     */
797    hvcc->general_profile_compatibility_flags = 0xffffffff;
798    hvcc->general_constraint_indicator_flags  = 0xffffffffffff;
799
800    /*
801     * Initialize this field with an invalid value which can be used to detect
802     * whether we didn't see any VUI (in which case it should be reset to zero).
803     */
804    hvcc->min_spatial_segmentation_idc = MAX_SPATIAL_SEGMENTATION + 1;
805}
806
807static void hvcc_close(HEVCDecoderConfigurationRecord *hvcc)
808{
809    uint8_t i;
810
811    for (i = 0; i < hvcc->numOfArrays; i++) {
812        hvcc->array[i].numNalus = 0;
813        av_freep(&hvcc->array[i].nalUnit);
814        av_freep(&hvcc->array[i].nalUnitLength);
815    }
816
817    hvcc->numOfArrays = 0;
818    av_freep(&hvcc->array);
819}
820
821static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
822{
823    uint8_t i;
824    uint16_t j, vps_count = 0, sps_count = 0, pps_count = 0;
825
826    /*
827     * We only support writing HEVCDecoderConfigurationRecord version 1.
828     */
829    hvcc->configurationVersion = 1;
830
831    /*
832     * If min_spatial_segmentation_idc is invalid, reset to 0 (unspecified).
833     */
834    if (hvcc->min_spatial_segmentation_idc > MAX_SPATIAL_SEGMENTATION)
835        hvcc->min_spatial_segmentation_idc = 0;
836
837    /*
838     * parallelismType indicates the type of parallelism that is used to meet
839     * the restrictions imposed by min_spatial_segmentation_idc when the value
840     * of min_spatial_segmentation_idc is greater than 0.
841     */
842    if (!hvcc->min_spatial_segmentation_idc)
843        hvcc->parallelismType = 0;
844
845    /*
846     * It's unclear how to properly compute these fields, so
847     * let's always set them to values meaning 'unspecified'.
848     */
849    hvcc->avgFrameRate      = 0;
850    hvcc->constantFrameRate = 0;
851
852    av_dlog(NULL,  "configurationVersion:                %"PRIu8"\n",
853            hvcc->configurationVersion);
854    av_dlog(NULL,  "general_profile_space:               %"PRIu8"\n",
855            hvcc->general_profile_space);
856    av_dlog(NULL,  "general_tier_flag:                   %"PRIu8"\n",
857            hvcc->general_tier_flag);
858    av_dlog(NULL,  "general_profile_idc:                 %"PRIu8"\n",
859            hvcc->general_profile_idc);
860    av_dlog(NULL, "general_profile_compatibility_flags: 0x%08"PRIx32"\n",
861            hvcc->general_profile_compatibility_flags);
862    av_dlog(NULL, "general_constraint_indicator_flags:  0x%012"PRIx64"\n",
863            hvcc->general_constraint_indicator_flags);
864    av_dlog(NULL,  "general_level_idc:                   %"PRIu8"\n",
865            hvcc->general_level_idc);
866    av_dlog(NULL,  "min_spatial_segmentation_idc:        %"PRIu16"\n",
867            hvcc->min_spatial_segmentation_idc);
868    av_dlog(NULL,  "parallelismType:                     %"PRIu8"\n",
869            hvcc->parallelismType);
870    av_dlog(NULL,  "chromaFormat:                        %"PRIu8"\n",
871            hvcc->chromaFormat);
872    av_dlog(NULL,  "bitDepthLumaMinus8:                  %"PRIu8"\n",
873            hvcc->bitDepthLumaMinus8);
874    av_dlog(NULL,  "bitDepthChromaMinus8:                %"PRIu8"\n",
875            hvcc->bitDepthChromaMinus8);
876    av_dlog(NULL,  "avgFrameRate:                        %"PRIu16"\n",
877            hvcc->avgFrameRate);
878    av_dlog(NULL,  "constantFrameRate:                   %"PRIu8"\n",
879            hvcc->constantFrameRate);
880    av_dlog(NULL,  "numTemporalLayers:                   %"PRIu8"\n",
881            hvcc->numTemporalLayers);
882    av_dlog(NULL,  "temporalIdNested:                    %"PRIu8"\n",
883            hvcc->temporalIdNested);
884    av_dlog(NULL,  "lengthSizeMinusOne:                  %"PRIu8"\n",
885            hvcc->lengthSizeMinusOne);
886    av_dlog(NULL,  "numOfArrays:                         %"PRIu8"\n",
887            hvcc->numOfArrays);
888    for (i = 0; i < hvcc->numOfArrays; i++) {
889        av_dlog(NULL, "array_completeness[%"PRIu8"]:               %"PRIu8"\n",
890                i, hvcc->array[i].array_completeness);
891        av_dlog(NULL, "NAL_unit_type[%"PRIu8"]:                    %"PRIu8"\n",
892                i, hvcc->array[i].NAL_unit_type);
893        av_dlog(NULL, "numNalus[%"PRIu8"]:                         %"PRIu16"\n",
894                i, hvcc->array[i].numNalus);
895        for (j = 0; j < hvcc->array[i].numNalus; j++)
896            av_dlog(NULL,
897                    "nalUnitLength[%"PRIu8"][%"PRIu16"]:                 %"PRIu16"\n",
898                    i, j, hvcc->array[i].nalUnitLength[j]);
899    }
900
901    /*
902     * We need at least one of each: VPS, SPS and PPS.
903     */
904    for (i = 0; i < hvcc->numOfArrays; i++)
905        switch (hvcc->array[i].NAL_unit_type) {
906        case NAL_VPS:
907            vps_count += hvcc->array[i].numNalus;
908            break;
909        case NAL_SPS:
910            sps_count += hvcc->array[i].numNalus;
911            break;
912        case NAL_PPS:
913            pps_count += hvcc->array[i].numNalus;
914            break;
915        default:
916            break;
917        }
918    if (!vps_count || vps_count > MAX_VPS_COUNT ||
919        !sps_count || sps_count > MAX_SPS_COUNT ||
920        !pps_count || pps_count > MAX_PPS_COUNT)
921        return AVERROR_INVALIDDATA;
922
923    /* unsigned int(8) configurationVersion = 1; */
924    avio_w8(pb, hvcc->configurationVersion);
925
926    /*
927     * unsigned int(2) general_profile_space;
928     * unsigned int(1) general_tier_flag;
929     * unsigned int(5) general_profile_idc;
930     */
931    avio_w8(pb, hvcc->general_profile_space << 6 |
932                hvcc->general_tier_flag     << 5 |
933                hvcc->general_profile_idc);
934
935    /* unsigned int(32) general_profile_compatibility_flags; */
936    avio_wb32(pb, hvcc->general_profile_compatibility_flags);
937
938    /* unsigned int(48) general_constraint_indicator_flags; */
939    avio_wb32(pb, hvcc->general_constraint_indicator_flags >> 16);
940    avio_wb16(pb, hvcc->general_constraint_indicator_flags);
941
942    /* unsigned int(8) general_level_idc; */
943    avio_w8(pb, hvcc->general_level_idc);
944
945    /*
946     * bit(4) reserved = ���1111���b;
947     * unsigned int(12) min_spatial_segmentation_idc;
948     */
949    avio_wb16(pb, hvcc->min_spatial_segmentation_idc | 0xf000);
950
951    /*
952     * bit(6) reserved = ���111111���b;
953     * unsigned int(2) parallelismType;
954     */
955    avio_w8(pb, hvcc->parallelismType | 0xfc);
956
957    /*
958     * bit(6) reserved = ���111111���b;
959     * unsigned int(2) chromaFormat;
960     */
961    avio_w8(pb, hvcc->chromaFormat | 0xfc);
962
963    /*
964     * bit(5) reserved = ���11111���b;
965     * unsigned int(3) bitDepthLumaMinus8;
966     */
967    avio_w8(pb, hvcc->bitDepthLumaMinus8 | 0xf8);
968
969    /*
970     * bit(5) reserved = ���11111���b;
971     * unsigned int(3) bitDepthChromaMinus8;
972     */
973    avio_w8(pb, hvcc->bitDepthChromaMinus8 | 0xf8);
974
975    /* bit(16) avgFrameRate; */
976    avio_wb16(pb, hvcc->avgFrameRate);
977
978    /*
979     * bit(2) constantFrameRate;
980     * bit(3) numTemporalLayers;
981     * bit(1) temporalIdNested;
982     * unsigned int(2) lengthSizeMinusOne;
983     */
984    avio_w8(pb, hvcc->constantFrameRate << 6 |
985                hvcc->numTemporalLayers << 3 |
986                hvcc->temporalIdNested  << 2 |
987                hvcc->lengthSizeMinusOne);
988
989    /* unsigned int(8) numOfArrays; */
990    avio_w8(pb, hvcc->numOfArrays);
991
992    for (i = 0; i < hvcc->numOfArrays; i++) {
993        /*
994         * bit(1) array_completeness;
995         * unsigned int(1) reserved = 0;
996         * unsigned int(6) NAL_unit_type;
997         */
998        avio_w8(pb, hvcc->array[i].array_completeness << 7 |
999                    hvcc->array[i].NAL_unit_type & 0x3f);
1000
1001        /* unsigned int(16) numNalus; */
1002        avio_wb16(pb, hvcc->array[i].numNalus);
1003
1004        for (j = 0; j < hvcc->array[i].numNalus; j++) {
1005            /* unsigned int(16) nalUnitLength; */
1006            avio_wb16(pb, hvcc->array[i].nalUnitLength[j]);
1007
1008            /* bit(8*nalUnitLength) nalUnit; */
1009            avio_write(pb, hvcc->array[i].nalUnit[j],
1010                       hvcc->array[i].nalUnitLength[j]);
1011        }
1012    }
1013
1014    return 0;
1015}
1016
1017int ff_hevc_annexb2mp4(AVIOContext *pb, const uint8_t *buf_in,
1018                       int size, int filter_ps, int *ps_count)
1019{
1020    int num_ps = 0, ret = 0;
1021    uint8_t *buf, *end, *start = NULL;
1022
1023    if (!filter_ps) {
1024        ret = ff_avc_parse_nal_units(pb, buf_in, size);
1025        goto end;
1026    }
1027
1028    ret = ff_avc_parse_nal_units_buf(buf_in, &start, &size);
1029    if (ret < 0)
1030        goto end;
1031
1032    ret = 0;
1033    buf = start;
1034    end = start + size;
1035
1036    while (end - buf > 4) {
1037        uint32_t len = FFMIN(AV_RB32(buf), end - buf - 4);
1038        uint8_t type = (buf[4] >> 1) & 0x3f;
1039
1040        buf += 4;
1041
1042        switch (type) {
1043        case NAL_VPS:
1044        case NAL_SPS:
1045        case NAL_PPS:
1046            num_ps++;
1047            break;
1048        default:
1049            ret += 4 + len;
1050            avio_wb32(pb, len);
1051            avio_write(pb, buf, len);
1052            break;
1053        }
1054
1055        buf += len;
1056    }
1057
1058end:
1059    av_free(start);
1060    if (ps_count)
1061        *ps_count = num_ps;
1062    return ret;
1063}
1064
1065int ff_hevc_annexb2mp4_buf(const uint8_t *buf_in, uint8_t **buf_out,
1066                           int *size, int filter_ps, int *ps_count)
1067{
1068    AVIOContext *pb;
1069    int ret;
1070
1071    ret = avio_open_dyn_buf(&pb);
1072    if (ret < 0)
1073        return ret;
1074
1075    ret   = ff_hevc_annexb2mp4(pb, buf_in, *size, filter_ps, ps_count);
1076    *size = avio_close_dyn_buf(pb, buf_out);
1077
1078    return ret;
1079}
1080
1081int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
1082                       int size, int ps_array_completeness)
1083{
1084    int ret = 0;
1085    uint8_t *buf, *end, *start = NULL;
1086    HEVCDecoderConfigurationRecord hvcc;
1087
1088    hvcc_init(&hvcc);
1089
1090    if (size < 6) {
1091        /* We can't write a valid hvcC from the provided data */
1092        ret = AVERROR_INVALIDDATA;
1093        goto end;
1094    } else if (*data == 1) {
1095        /* Data is already hvcC-formatted */
1096        avio_write(pb, data, size);
1097        goto end;
1098    } else if (!(AV_RB24(data) == 1 || AV_RB32(data) == 1)) {
1099        /* Not a valid Annex B start code prefix */
1100        ret = AVERROR_INVALIDDATA;
1101        goto end;
1102    }
1103
1104    ret = ff_avc_parse_nal_units_buf(data, &start, &size);
1105    if (ret < 0)
1106        goto end;
1107
1108    buf = start;
1109    end = start + size;
1110
1111    while (end - buf > 4) {
1112        uint32_t len = FFMIN(AV_RB32(buf), end - buf - 4);
1113        uint8_t type = (buf[4] >> 1) & 0x3f;
1114
1115        buf += 4;
1116
1117        switch (type) {
1118        case NAL_VPS:
1119        case NAL_SPS:
1120        case NAL_PPS:
1121        case NAL_SEI_PREFIX:
1122        case NAL_SEI_SUFFIX:
1123            ret = hvcc_add_nal_unit(buf, len, ps_array_completeness, &hvcc);
1124            if (ret < 0)
1125                goto end;
1126            break;
1127        default:
1128            break;
1129        }
1130
1131        buf += len;
1132    }
1133
1134    ret = hvcc_write(pb, &hvcc);
1135
1136end:
1137    hvcc_close(&hvcc);
1138    av_free(start);
1139    return ret;
1140}
1141