mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge commit 'f6e2f8a9ffda2247bffba991450990d075ea68e3'
* commit 'f6e2f8a9ffda2247bffba991450990d075ea68e3': hevcdec: move parameter set parsing into a separate header Merged-by: James Almer <jamrial@gmail.com>
This commit is contained in:
commit
4a5810b659
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
347
libavcodec/hevc_ps.h
Normal file
347
libavcodec/hevc_ps.h
Normal file
@ -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 <stdint.h>
|
||||
|
||||
#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 */
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user