diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h index f71cd081ef..4237b80f81 100644 --- a/libavcodec/hevc.h +++ b/libavcodec/hevc.h @@ -62,4 +62,9 @@ enum HEVCNALUnitType { #define HEVC_MAX_SHORT_TERM_RPS_COUNT 64 #define HEVC_MAX_CU_SIZE 128 +#define HEVC_MAX_REFS 16 +#define HEVC_MAX_DPB_SIZE 16 // A.4.1 + +#define HEVC_MAX_LOG2_CTB_SIZE 6 + #endif /* AVCODEC_HEVC_H */ diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index 53ff8b2278..287b24e832 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -25,8 +25,8 @@ #include "libavutil/imgutils.h" #include "golomb.h" -#include "hevcdec.h" #include "hevc_data.h" +#include "hevc_ps.h" static const uint8_t default_scaling_list_intra[] = { 16, 16, 16, 16, 17, 18, 21, 24, @@ -208,8 +208,8 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, rps->num_negative_pics = get_ue_golomb_long(gb); nb_positive_pics = get_ue_golomb_long(gb); - if (rps->num_negative_pics >= MAX_REFS || - nb_positive_pics >= MAX_REFS) { + if (rps->num_negative_pics >= HEVC_MAX_REFS || + nb_positive_pics >= HEVC_MAX_REFS) { av_log(avctx, AV_LOG_ERROR, "Too many refs in a short term RPS.\n"); return AVERROR_INVALIDDATA; } @@ -458,7 +458,7 @@ int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, vps->vps_num_reorder_pics[i] = get_ue_golomb_long(gb); vps->vps_max_latency_increase[i] = get_ue_golomb_long(gb) - 1; - if (vps->vps_max_dec_pic_buffering[i] > MAX_DPB_SIZE || !vps->vps_max_dec_pic_buffering[i]) { + if (vps->vps_max_dec_pic_buffering[i] > HEVC_MAX_DPB_SIZE || !vps->vps_max_dec_pic_buffering[i]) { av_log(avctx, AV_LOG_ERROR, "vps_max_dec_pic_buffering_minus1 out of range: %d\n", vps->vps_max_dec_pic_buffering[i] - 1); goto err; @@ -933,7 +933,7 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, 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; - if (sps->temporal_layer[i].max_dec_pic_buffering > MAX_DPB_SIZE) { + if (sps->temporal_layer[i].max_dec_pic_buffering > HEVC_MAX_DPB_SIZE) { av_log(avctx, AV_LOG_ERROR, "sps_max_dec_pic_buffering_minus1 out of range: %d\n", sps->temporal_layer[i].max_dec_pic_buffering - 1); return AVERROR_INVALIDDATA; @@ -942,7 +942,7 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, av_log(avctx, AV_LOG_WARNING, "sps_max_num_reorder_pics out of range: %d\n", sps->temporal_layer[i].num_reorder_pics); if (avctx->err_recognition & AV_EF_EXPLODE || - sps->temporal_layer[i].num_reorder_pics > MAX_DPB_SIZE - 1) { + sps->temporal_layer[i].num_reorder_pics > HEVC_MAX_DPB_SIZE - 1) { return AVERROR_INVALIDDATA; } sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[i].num_reorder_pics + 1; @@ -1123,7 +1123,7 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, sps->log2_diff_max_min_coding_block_size; sps->log2_min_pu_size = sps->log2_min_cb_size - 1; - if (sps->log2_ctb_size > MAX_LOG2_CTB_SIZE) { + if (sps->log2_ctb_size > HEVC_MAX_LOG2_CTB_SIZE) { av_log(avctx, AV_LOG_ERROR, "CTB size out of range: 2^%d\n", sps->log2_ctb_size); return AVERROR_INVALIDDATA; } diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h new file mode 100644 index 0000000000..b0a17bc8f0 --- /dev/null +++ b/libavcodec/hevc_ps.h @@ -0,0 +1,347 @@ +/* + * HEVC parameter set parsing + * + * 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 + */ + +#ifndef AVCODEC_HEVC_PS_H +#define AVCODEC_HEVC_PS_H + +#include + +#include "libavutil/buffer.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "avcodec.h" +#include "get_bits.h" +#include "hevc.h" + +typedef struct ShortTermRPS { + unsigned int num_negative_pics; + int num_delta_pocs; + int rps_idx_num_delta_pocs; + int32_t delta_poc[32]; + uint8_t used[32]; +} ShortTermRPS; + +typedef struct HEVCWindow { + unsigned int left_offset; + unsigned int right_offset; + unsigned int top_offset; + unsigned int bottom_offset; +} HEVCWindow; + +typedef struct VUI { + AVRational sar; + + int overscan_info_present_flag; + int overscan_appropriate_flag; + + int video_signal_type_present_flag; + int video_format; + int video_full_range_flag; + int colour_description_present_flag; + uint8_t colour_primaries; + uint8_t transfer_characteristic; + uint8_t matrix_coeffs; + + int chroma_loc_info_present_flag; + int chroma_sample_loc_type_top_field; + int chroma_sample_loc_type_bottom_field; + int neutra_chroma_indication_flag; + + int field_seq_flag; + int frame_field_info_present_flag; + + int default_display_window_flag; + HEVCWindow def_disp_win; + + int vui_timing_info_present_flag; + uint32_t vui_num_units_in_tick; + uint32_t vui_time_scale; + int vui_poc_proportional_to_timing_flag; + int vui_num_ticks_poc_diff_one_minus1; + int vui_hrd_parameters_present_flag; + + int bitstream_restriction_flag; + int tiles_fixed_structure_flag; + int motion_vectors_over_pic_boundaries_flag; + int restricted_ref_pic_lists_flag; + int min_spatial_segmentation_idc; + int max_bytes_per_pic_denom; + int max_bits_per_min_cu_denom; + int log2_max_mv_length_horizontal; + int log2_max_mv_length_vertical; +} VUI; + +typedef struct PTLCommon { + uint8_t profile_space; + uint8_t tier_flag; + uint8_t profile_idc; + uint8_t profile_compatibility_flag[32]; + uint8_t level_idc; + uint8_t progressive_source_flag; + uint8_t interlaced_source_flag; + uint8_t non_packed_constraint_flag; + uint8_t frame_only_constraint_flag; +} PTLCommon; + +typedef struct PTL { + PTLCommon general_ptl; + PTLCommon sub_layer_ptl[HEVC_MAX_SUB_LAYERS]; + + uint8_t sub_layer_profile_present_flag[HEVC_MAX_SUB_LAYERS]; + uint8_t sub_layer_level_present_flag[HEVC_MAX_SUB_LAYERS]; +} PTL; + +typedef struct HEVCVPS { + uint8_t vps_temporal_id_nesting_flag; + int vps_max_layers; + int vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1 + + PTL ptl; + int vps_sub_layer_ordering_info_present_flag; + unsigned int vps_max_dec_pic_buffering[HEVC_MAX_SUB_LAYERS]; + unsigned int vps_num_reorder_pics[HEVC_MAX_SUB_LAYERS]; + unsigned int vps_max_latency_increase[HEVC_MAX_SUB_LAYERS]; + int vps_max_layer_id; + int vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1 + uint8_t vps_timing_info_present_flag; + uint32_t vps_num_units_in_tick; + uint32_t vps_time_scale; + uint8_t vps_poc_proportional_to_timing_flag; + int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1 + int vps_num_hrd_parameters; + + uint8_t data[4096]; + int data_size; +} HEVCVPS; + +typedef struct ScalingList { + /* This is a little wasteful, since sizeID 0 only needs 8 coeffs, + * and size ID 3 only has 2 arrays, not 6. */ + uint8_t sl[4][6][64]; + uint8_t sl_dc[2][6]; +} ScalingList; + +typedef struct HEVCSPS { + unsigned vps_id; + int chroma_format_idc; + uint8_t separate_colour_plane_flag; + + ///< output (i.e. cropped) values + int output_width, output_height; + HEVCWindow output_window; + + HEVCWindow pic_conf_win; + + int bit_depth; + int pixel_shift; + enum AVPixelFormat pix_fmt; + + unsigned int log2_max_poc_lsb; + int pcm_enabled_flag; + + int max_sub_layers; + struct { + int max_dec_pic_buffering; + int num_reorder_pics; + int max_latency_increase; + } temporal_layer[HEVC_MAX_SUB_LAYERS]; + + VUI vui; + PTL ptl; + + uint8_t scaling_list_enable_flag; + ScalingList scaling_list; + + unsigned int nb_st_rps; + ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_RPS_COUNT]; + + uint8_t amp_enabled_flag; + uint8_t sao_enabled; + + uint8_t long_term_ref_pics_present_flag; + uint16_t lt_ref_pic_poc_lsb_sps[32]; + uint8_t used_by_curr_pic_lt_sps_flag[32]; + uint8_t num_long_term_ref_pics_sps; + + struct { + uint8_t bit_depth; + uint8_t bit_depth_chroma; + unsigned int log2_min_pcm_cb_size; + unsigned int log2_max_pcm_cb_size; + uint8_t loop_filter_disable_flag; + } pcm; + uint8_t sps_temporal_mvp_enabled_flag; + uint8_t sps_strong_intra_smoothing_enable_flag; + + unsigned int log2_min_cb_size; + unsigned int log2_diff_max_min_coding_block_size; + unsigned int log2_min_tb_size; + unsigned int log2_max_trafo_size; + unsigned int log2_ctb_size; + unsigned int log2_min_pu_size; + + int max_transform_hierarchy_depth_inter; + int max_transform_hierarchy_depth_intra; + + int transform_skip_rotation_enabled_flag; + int transform_skip_context_enabled_flag; + int implicit_rdpcm_enabled_flag; + int explicit_rdpcm_enabled_flag; + int intra_smoothing_disabled_flag; + int persistent_rice_adaptation_enabled_flag; + + ///< coded frame dimension in various units + int width; + int height; + int ctb_width; + int ctb_height; + int ctb_size; + int min_cb_width; + int min_cb_height; + int min_tb_width; + int min_tb_height; + int min_pu_width; + int min_pu_height; + int tb_mask; + + int hshift[3]; + int vshift[3]; + + int qp_bd_offset; + + uint8_t data[4096]; + int data_size; +} HEVCSPS; + +typedef struct HEVCPPS { + unsigned int sps_id; ///< seq_parameter_set_id + + uint8_t sign_data_hiding_flag; + + uint8_t cabac_init_present_flag; + + int num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1 + int num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1 + int pic_init_qp_minus26; + + uint8_t constrained_intra_pred_flag; + uint8_t transform_skip_enabled_flag; + + uint8_t cu_qp_delta_enabled_flag; + int diff_cu_qp_delta_depth; + + int cb_qp_offset; + int cr_qp_offset; + uint8_t pic_slice_level_chroma_qp_offsets_present_flag; + uint8_t weighted_pred_flag; + uint8_t weighted_bipred_flag; + uint8_t output_flag_present_flag; + uint8_t transquant_bypass_enable_flag; + + uint8_t dependent_slice_segments_enabled_flag; + uint8_t tiles_enabled_flag; + uint8_t entropy_coding_sync_enabled_flag; + + int num_tile_columns; ///< num_tile_columns_minus1 + 1 + int num_tile_rows; ///< num_tile_rows_minus1 + 1 + uint8_t uniform_spacing_flag; + uint8_t loop_filter_across_tiles_enabled_flag; + + uint8_t seq_loop_filter_across_slices_enabled_flag; + + uint8_t deblocking_filter_control_present_flag; + uint8_t deblocking_filter_override_enabled_flag; + uint8_t disable_dbf; + int beta_offset; ///< beta_offset_div2 * 2 + int tc_offset; ///< tc_offset_div2 * 2 + + uint8_t scaling_list_data_present_flag; + ScalingList scaling_list; + + uint8_t lists_modification_present_flag; + int log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2 + int num_extra_slice_header_bits; + uint8_t slice_header_extension_present_flag; + uint8_t log2_max_transform_skip_block_size; + uint8_t cross_component_prediction_enabled_flag; + uint8_t chroma_qp_offset_list_enabled_flag; + uint8_t diff_cu_chroma_qp_offset_depth; + uint8_t chroma_qp_offset_list_len_minus1; + int8_t cb_qp_offset_list[5]; + int8_t cr_qp_offset_list[5]; + uint8_t log2_sao_offset_scale_luma; + uint8_t log2_sao_offset_scale_chroma; + + // Inferred parameters + unsigned int *column_width; ///< ColumnWidth + unsigned int *row_height; ///< RowHeight + unsigned int *col_bd; ///< ColBd + unsigned int *row_bd; ///< RowBd + int *col_idxX; + + int *ctb_addr_rs_to_ts; ///< CtbAddrRSToTS + int *ctb_addr_ts_to_rs; ///< CtbAddrTSToRS + int *tile_id; ///< TileId + int *tile_pos_rs; ///< TilePosRS + int *min_tb_addr_zs; ///< MinTbAddrZS + int *min_tb_addr_zs_tab;///< MinTbAddrZS + + uint8_t data[4096]; + int data_size; +} HEVCPPS; + +typedef struct HEVCParamSets { + AVBufferRef *vps_list[HEVC_MAX_VPS_COUNT]; + AVBufferRef *sps_list[HEVC_MAX_SPS_COUNT]; + AVBufferRef *pps_list[HEVC_MAX_PPS_COUNT]; + + /* currently active parameter sets */ + const HEVCVPS *vps; + const HEVCSPS *sps; + const HEVCPPS *pps; +} HEVCParamSets; + +/** + * Parse the SPS from the bitstream into the provided HEVCSPS struct. + * + * @param sps_id the SPS id will be written here + * @param apply_defdispwin if set 1, the default display window from the VUI + * will be applied to the video dimensions + * @param vps_list if non-NULL, this function will validate that the SPS refers + * to an existing VPS + */ +int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, + int apply_defdispwin, AVBufferRef **vps_list, AVCodecContext *avctx); + +int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, + HEVCParamSets *ps); +int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, + HEVCParamSets *ps, int apply_defdispwin); +int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, + HEVCParamSets *ps); + +int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, + ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header); + +int ff_hevc_encode_nal_vps(HEVCVPS *vps, unsigned int id, + uint8_t *buf, int buf_size); + +#endif /* AVCODEC_HEVC_PS_H */ diff --git a/libavcodec/hevc_ps_enc.c b/libavcodec/hevc_ps_enc.c index edff3e75e2..ea06ec7207 100644 --- a/libavcodec/hevc_ps_enc.c +++ b/libavcodec/hevc_ps_enc.c @@ -19,7 +19,7 @@ */ #include "golomb.h" -#include "hevcdec.h" +#include "hevc_ps.h" #include "put_bits.h" static void write_ptl_layer(PutBitContext *pb, PTLCommon *ptl) diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index db1ac2bf90..935e388653 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -329,7 +329,7 @@ int ff_hevc_slice_rpl(HEVCContext *s) while (rpl_tmp.nb_refs < sh->nb_refs[list_idx]) { for (i = 0; i < FF_ARRAY_ELEMS(cand_lists); i++) { RefPicList *rps = &s->rps[cand_lists[i]]; - for (j = 0; j < rps->nb_refs && rpl_tmp.nb_refs < MAX_REFS; j++) { + for (j = 0; j < rps->nb_refs && rpl_tmp.nb_refs < HEVC_MAX_REFS; j++) { rpl_tmp.list[rpl_tmp.nb_refs] = rps->list[j]; rpl_tmp.ref[rpl_tmp.nb_refs] = rps->ref[j]; rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = i == 2; diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 257eebc2b6..92897f42f8 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -620,7 +620,7 @@ static int hls_slice_header(HEVCContext *s) if (sh->slice_type == B_SLICE) sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1; } - if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) { + if (sh->nb_refs[L0] > HEVC_MAX_REFS || sh->nb_refs[L1] > HEVC_MAX_REFS) { av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n", sh->nb_refs[L0], sh->nb_refs[L1]); return AVERROR_INVALIDDATA; diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index bad4fb2622..b6391eace8 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -35,14 +35,12 @@ #include "hevcpred.h" #include "h2645_parse.h" #include "hevc.h" +#include "hevc_ps.h" #include "hevcdsp.h" #include "internal.h" #include "thread.h" #include "videodsp.h" -#define MAX_DPB_SIZE 16 // A.4.1 -#define MAX_REFS 16 - #define MAX_NB_THREADS 16 #define SHIFT_CTB_WPP 2 @@ -50,7 +48,6 @@ #define MAX_TRANSFORM_DEPTH 5 #define MAX_TB_SIZE 32 -#define MAX_LOG2_CTB_SIZE 6 #define MAX_QP 51 #define DEFAULT_INTRA_TC_OFFSET 2 @@ -236,14 +233,6 @@ enum ScanType { SCAN_VERT, }; -typedef struct ShortTermRPS { - unsigned int num_negative_pics; - int num_delta_pocs; - int rps_idx_num_delta_pocs; - int32_t delta_poc[32]; - uint8_t used[32]; -} ShortTermRPS; - typedef struct LongTermRPS { int poc[32]; uint8_t used[32]; @@ -251,9 +240,9 @@ typedef struct LongTermRPS { } LongTermRPS; typedef struct RefPicList { - struct HEVCFrame *ref[MAX_REFS]; - int list[MAX_REFS]; - int isLongTerm[MAX_REFS]; + struct HEVCFrame *ref[HEVC_MAX_REFS]; + int list[HEVC_MAX_REFS]; + int isLongTerm[HEVC_MAX_REFS]; int nb_refs; } RefPicList; @@ -261,286 +250,6 @@ typedef struct RefPicListTab { RefPicList refPicList[2]; } RefPicListTab; -typedef struct HEVCWindow { - unsigned int left_offset; - unsigned int right_offset; - unsigned int top_offset; - unsigned int bottom_offset; -} HEVCWindow; - -typedef struct VUI { - AVRational sar; - - int overscan_info_present_flag; - int overscan_appropriate_flag; - - int video_signal_type_present_flag; - int video_format; - int video_full_range_flag; - int colour_description_present_flag; - uint8_t colour_primaries; - uint8_t transfer_characteristic; - uint8_t matrix_coeffs; - - int chroma_loc_info_present_flag; - int chroma_sample_loc_type_top_field; - int chroma_sample_loc_type_bottom_field; - int neutra_chroma_indication_flag; - - int field_seq_flag; - int frame_field_info_present_flag; - - int default_display_window_flag; - HEVCWindow def_disp_win; - - int vui_timing_info_present_flag; - uint32_t vui_num_units_in_tick; - uint32_t vui_time_scale; - int vui_poc_proportional_to_timing_flag; - int vui_num_ticks_poc_diff_one_minus1; - int vui_hrd_parameters_present_flag; - - int bitstream_restriction_flag; - int tiles_fixed_structure_flag; - int motion_vectors_over_pic_boundaries_flag; - int restricted_ref_pic_lists_flag; - int min_spatial_segmentation_idc; - int max_bytes_per_pic_denom; - int max_bits_per_min_cu_denom; - int log2_max_mv_length_horizontal; - int log2_max_mv_length_vertical; -} VUI; - -typedef struct PTLCommon { - uint8_t profile_space; - uint8_t tier_flag; - uint8_t profile_idc; - uint8_t profile_compatibility_flag[32]; - uint8_t level_idc; - uint8_t progressive_source_flag; - uint8_t interlaced_source_flag; - uint8_t non_packed_constraint_flag; - uint8_t frame_only_constraint_flag; -} PTLCommon; - -typedef struct PTL { - PTLCommon general_ptl; - PTLCommon sub_layer_ptl[HEVC_MAX_SUB_LAYERS]; - - uint8_t sub_layer_profile_present_flag[HEVC_MAX_SUB_LAYERS]; - uint8_t sub_layer_level_present_flag[HEVC_MAX_SUB_LAYERS]; -} PTL; - -typedef struct HEVCVPS { - uint8_t vps_temporal_id_nesting_flag; - int vps_max_layers; - int vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1 - - PTL ptl; - int vps_sub_layer_ordering_info_present_flag; - unsigned int vps_max_dec_pic_buffering[HEVC_MAX_SUB_LAYERS]; - unsigned int vps_num_reorder_pics[HEVC_MAX_SUB_LAYERS]; - unsigned int vps_max_latency_increase[HEVC_MAX_SUB_LAYERS]; - int vps_max_layer_id; - int vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1 - uint8_t vps_timing_info_present_flag; - uint32_t vps_num_units_in_tick; - uint32_t vps_time_scale; - uint8_t vps_poc_proportional_to_timing_flag; - int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1 - int vps_num_hrd_parameters; - - uint8_t data[4096]; - int data_size; -} HEVCVPS; - -typedef struct ScalingList { - /* This is a little wasteful, since sizeID 0 only needs 8 coeffs, - * and size ID 3 only has 2 arrays, not 6. */ - uint8_t sl[4][6][64]; - uint8_t sl_dc[2][6]; -} ScalingList; - -typedef struct HEVCSPS { - unsigned vps_id; - int chroma_format_idc; - uint8_t separate_colour_plane_flag; - - ///< output (i.e. cropped) values - int output_width, output_height; - HEVCWindow output_window; - - HEVCWindow pic_conf_win; - - int bit_depth; - int pixel_shift; - enum AVPixelFormat pix_fmt; - - unsigned int log2_max_poc_lsb; - int pcm_enabled_flag; - - int max_sub_layers; - struct { - int max_dec_pic_buffering; - int num_reorder_pics; - int max_latency_increase; - } temporal_layer[HEVC_MAX_SUB_LAYERS]; - - VUI vui; - PTL ptl; - - uint8_t scaling_list_enable_flag; - ScalingList scaling_list; - - unsigned int nb_st_rps; - ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_RPS_COUNT]; - - uint8_t amp_enabled_flag; - uint8_t sao_enabled; - - uint8_t long_term_ref_pics_present_flag; - uint16_t lt_ref_pic_poc_lsb_sps[32]; - uint8_t used_by_curr_pic_lt_sps_flag[32]; - uint8_t num_long_term_ref_pics_sps; - - struct { - uint8_t bit_depth; - uint8_t bit_depth_chroma; - unsigned int log2_min_pcm_cb_size; - unsigned int log2_max_pcm_cb_size; - uint8_t loop_filter_disable_flag; - } pcm; - uint8_t sps_temporal_mvp_enabled_flag; - uint8_t sps_strong_intra_smoothing_enable_flag; - - unsigned int log2_min_cb_size; - unsigned int log2_diff_max_min_coding_block_size; - unsigned int log2_min_tb_size; - unsigned int log2_max_trafo_size; - unsigned int log2_ctb_size; - unsigned int log2_min_pu_size; - - int max_transform_hierarchy_depth_inter; - int max_transform_hierarchy_depth_intra; - - int transform_skip_rotation_enabled_flag; - int transform_skip_context_enabled_flag; - int implicit_rdpcm_enabled_flag; - int explicit_rdpcm_enabled_flag; - int intra_smoothing_disabled_flag; - int persistent_rice_adaptation_enabled_flag; - - ///< coded frame dimension in various units - int width; - int height; - int ctb_width; - int ctb_height; - int ctb_size; - int min_cb_width; - int min_cb_height; - int min_tb_width; - int min_tb_height; - int min_pu_width; - int min_pu_height; - int tb_mask; - - int hshift[3]; - int vshift[3]; - - int qp_bd_offset; - - uint8_t data[4096]; - int data_size; -} HEVCSPS; - -typedef struct HEVCPPS { - unsigned int sps_id; ///< seq_parameter_set_id - - uint8_t sign_data_hiding_flag; - - uint8_t cabac_init_present_flag; - - int num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1 - int num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1 - int pic_init_qp_minus26; - - uint8_t constrained_intra_pred_flag; - uint8_t transform_skip_enabled_flag; - - uint8_t cu_qp_delta_enabled_flag; - int diff_cu_qp_delta_depth; - - int cb_qp_offset; - int cr_qp_offset; - uint8_t pic_slice_level_chroma_qp_offsets_present_flag; - uint8_t weighted_pred_flag; - uint8_t weighted_bipred_flag; - uint8_t output_flag_present_flag; - uint8_t transquant_bypass_enable_flag; - - uint8_t dependent_slice_segments_enabled_flag; - uint8_t tiles_enabled_flag; - uint8_t entropy_coding_sync_enabled_flag; - - int num_tile_columns; ///< num_tile_columns_minus1 + 1 - int num_tile_rows; ///< num_tile_rows_minus1 + 1 - uint8_t uniform_spacing_flag; - uint8_t loop_filter_across_tiles_enabled_flag; - - uint8_t seq_loop_filter_across_slices_enabled_flag; - - uint8_t deblocking_filter_control_present_flag; - uint8_t deblocking_filter_override_enabled_flag; - uint8_t disable_dbf; - int beta_offset; ///< beta_offset_div2 * 2 - int tc_offset; ///< tc_offset_div2 * 2 - - uint8_t scaling_list_data_present_flag; - ScalingList scaling_list; - - uint8_t lists_modification_present_flag; - int log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2 - int num_extra_slice_header_bits; - uint8_t slice_header_extension_present_flag; - uint8_t log2_max_transform_skip_block_size; - uint8_t cross_component_prediction_enabled_flag; - uint8_t chroma_qp_offset_list_enabled_flag; - uint8_t diff_cu_chroma_qp_offset_depth; - uint8_t chroma_qp_offset_list_len_minus1; - int8_t cb_qp_offset_list[5]; - int8_t cr_qp_offset_list[5]; - uint8_t log2_sao_offset_scale_luma; - uint8_t log2_sao_offset_scale_chroma; - - // Inferred parameters - unsigned int *column_width; ///< ColumnWidth - unsigned int *row_height; ///< RowHeight - unsigned int *col_bd; ///< ColBd - unsigned int *row_bd; ///< RowBd - int *col_idxX; - - int *ctb_addr_rs_to_ts; ///< CtbAddrRSToTS - int *ctb_addr_ts_to_rs; ///< CtbAddrTSToRS - int *tile_id; ///< TileId - int *tile_pos_rs; ///< TilePosRS - int *min_tb_addr_zs; ///< MinTbAddrZS - int *min_tb_addr_zs_tab;///< MinTbAddrZS - - uint8_t data[4096]; - int data_size; -} HEVCPPS; - -typedef struct HEVCParamSets { - AVBufferRef *vps_list[HEVC_MAX_VPS_COUNT]; - AVBufferRef *sps_list[HEVC_MAX_SPS_COUNT]; - AVBufferRef *pps_list[HEVC_MAX_PPS_COUNT]; - - /* currently active parameter sets */ - const HEVCVPS *vps; - const HEVCSPS *sps; - const HEVCPPS *pps; -} HEVCParamSets; - typedef struct SliceHeader { unsigned int pps_id; @@ -895,27 +604,6 @@ typedef struct HEVCContext { } HEVCContext; -int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, - ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header); - -/** - * Parse the SPS from the bitstream into the provided HEVCSPS struct. - * - * @param sps_id the SPS id will be written here - * @param apply_defdispwin if set 1, the default display window from the VUI - * will be applied to the video dimensions - * @param vps_list if non-NULL, this function will validate that the SPS refers - * to an existing VPS - */ -int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, - int apply_defdispwin, AVBufferRef **vps_list, AVCodecContext *avctx); - -int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, - HEVCParamSets *ps); -int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, - HEVCParamSets *ps, int apply_defdispwin); -int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, - HEVCParamSets *ps); int ff_hevc_decode_nal_sei(HEVCContext *s); /** @@ -1021,10 +709,6 @@ void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0, void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size); - -int ff_hevc_encode_nal_vps(HEVCVPS *vps, unsigned int id, - uint8_t *buf, int buf_size); - /** * Reset SEI values that are stored on the Context. * e.g. Caption data that was extracted during NAL