/****************************************************************************** * * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ /*! ************************************************************************** * \file isvcd_nal_structs.h * * \brief * Contains the definitions of structures used in NAL processing * * Detailed_description * * \date * * * \author : Kishore ************************************************************************** */ #ifndef _SVCD_NAL_STRUCTS_H_ #define _SVCD_NAL_STRUCTS_H_ /*****************************************************************************/ /* File Includes */ /*****************************************************************************/ /*****************************************************************************/ /* Constant Macros */ /*****************************************************************************/ #define MAX_NUM_SLICE_GRPS_IN_LYR 8 #define MAX_NUM_PACKETS_IN_NAL \ 100 /*! Maximum number of packets that can be \ present in a NAL unit */ /*****************************************************************************/ /* Function Macros */ /*****************************************************************************/ #define SLICE_PARSE_ERR_HDLR(i4_error, u4_err_code, pu4_err_code) \ if(0 != i4_error) \ { \ *pu4_err_code = u4_err_code; \ return (NOT_OK); \ } #define SLICE_PARSE_ERR_HDLR1(i4_error, u4_err_code, pu4_err_code, pi4_sps_pps, i4_sps_pps_err) \ if(0 != i4_error) \ { \ *pu4_err_code = u4_err_code; \ *pi4_sps_pps = i4_sps_pps_err; \ return (NOT_OK); \ } /*****************************************************************************/ /* Typedefs */ /*****************************************************************************/ /*****************************************************************************/ /* Enums */ /*****************************************************************************/ typedef enum { NAL_DISCARD_RESET_STATE, NAL_DISCARD_ACTIVE_STATE } NAL_DISCARD_STATE_MACHINE_T; /*****************************************************************************/ /* Structure */ /*****************************************************************************/ typedef struct { WORD32 i4_dependency_id; /*!< Target dependency id */ WORD32 i4_quality_id; /*!< Target quality id */ WORD32 i4_temporal_id; /*!< Target temporal id */ WORD32 i4_priority_id; /*!< Target priority id */ } target_lyr_attr_t; typedef struct { WORD32 i4_num_bufs; /*!< Number of buffers that comprises this NAL unit. In case of Annex B based input, this value will always be 1. Otherwise (RFC - input), this value indicates number of packets in the NAL unit in the current process call */ UWORD8 *pu1_bufs; /*!< Nal unit buffer pointer */ WORD32 i4_buf_sizes; /*!< Nal unit buffer size */ } nal_unit_t; typedef struct { WORD32 i4_state; /*!< State of emulation prevention in the state machine */ WORD32 i4_zeroes_cnt; /*!< Number of consecutive zeroes counter */ UWORD32 u4_word; /*!< Place holder for WORD - output */ UWORD32 u4_bytes_in_word; /*!< Number of bytes in the WORD */ } emulation_prevent_ctxt_t; typedef struct vcl_buf_hdr_t { struct vcl_buf_hdr_t *ps_next; /*!< Pointer to next VCL NAL buffer header. This will be poiting to next slice in the layer. This field shall be set to NULL for the last slice (VCL NAL) in a layer */ UWORD32 u4_max_bits; /*!< Total number of SODB bits present in the VCL NAL (slice)*/ WORD32 i4_buf_offset; /*!< This is the offset from the start of the VCL NAL header to start of SODB data of VCL NAL. This shall be multiple of 4*/ WORD32 i4_slice_offset; /*!< It is the offset from start of VCL NAL data to start of slice data. A value of 0 shall indicate that prefix NAL unit is not present Note: If prefix NAL unit is present then it will be present between the offsets "i4_buf_offset" to "i4_slice_offset"*/ UWORD32 u4_prefix_nal_bits; /*!< Total number of SODB bits present in the VCL NAL (slice). This shall have valid value when "i4_slice_offset" has non zero value */ WORD32 i4_no_int_lyr_pred; /*!< The value of no inter layer prediction which is decoded from the NAL header */ WORD32 i4_first_mb_addr; /*!< The 'first_mb_address' syntax element value decoded form the slice header present in the VCL NAL */ } vcl_buf_hdr_t; typedef struct non_vcl_buf_hdr_t { struct non_vcl_buf_hdr_t *ps_next; /*!< This shall point to start of next NON VCL buffer header that is extracted from the bitstream. It shall be set to NULL for the last non VCL NAL */ WORD32 i4_nal_unit_type; /*!< NAL unit type that is decoded from the NAL header */ WORD32 i4_buf_offset; /*!< This is the offset from the start of the VCL NAL header to start of SODB data of VCL NAL. This shall be multiple of 4 */ WORD32 i4_buf_size; /*!< Size of the NON VCL SODB data in bytes */ } non_vcl_buf_hdr_t; typedef struct vcl_node_t { struct vcl_node_t *ps_top_node; /*!< Pointer to top node present in the DQID list. This node is actually is a layer using the current layer as a reference layer. Value of NULL shall indicate that no more layers with DQID higher than current layer is present in the current access unit */ struct vcl_node_t *ps_bot_node; /*!< Pointer to bottom node present in the DQID list. This node is actually the reference layer of the current layer. Value of NULL shall indicate that no more layers with DQID lower than current layer is present in the current access unit */ /*------ info part -------*/ WORD32 i4_quality_id; /*!< Quality id of the layer */ WORD32 i4_dependency_id; /*!< Dependency id of the layer */ WORD32 i4_temporal_id; /*!< Temporal id of the layer */ WORD32 i4_priority_id; /*!< Priority id of the layer */ WORD32 i4_idr_pic_flag; /*!< Flag indicating whether current layer is Idr picture or not. SVCD_TRUE shall indicate the idr picture */ WORD32 i4_nal_unit_type; /*!< NAL unit type of all slices in the current picture */ WORD32 i4_nal_ref_idc; /*!< NAL ref idc of all slices in the current picture */ WORD32 i4_use_ref_base; /*!< Use ref base flag of NAL header. */ UWORD8 u1_sps_id; /*!< It shall have the value of SPS id used by this layer. It's range is [0,63] */ UWORD8 u1_pps_id; /*!< It shall have the value of PPS id used by this layer. It's range is [0,255] */ UWORD8 u1_acc_no_int_pred; /*! The value of accumulated no inter layer prediction flag. This value will be "logical and " of no inter layer prediction flag of all the slices in the corresponding DQID */ UWORD16 u2_frm_num; /*!< It is the value of frame number of the layer. */ UWORD32 i4_idr_pic_num; /*!< It shall have the value of IDR picture number when "i4_idr_pic_flag" is SVCD_TRUE */ WORD32 i4_poc_syntax; /*!< It shall have either "picture order cnt lsb" or "delta picture order cnt [0]" that is decoded from the slice header. When picture order coutn type is 0 then this field holds "picture order cnt lsb" and when picture order cnt type is 1 then this field holds "delta picture order cnt [0]". This field will not have a valid value when picture order cnt type is 2 */ WORD32 i4_res_change_flag; /*!< 'SpatialResolutionChangeFlag' for the layer as specified in section G.7.4.3.4 Value 'SVCD_TRUE' indicates that parameter 'SpatialResolutionChangeFlag' is set to 1. Otherwise it shall be set to SVCD_FALSE. @sa SVCD_BOOL_T */ WORD32 i4_ref_dq_id; /*!< reference layer DQid for current layer */ WORD32 i4_num_slices; /*!< Number of slices in the current layer */ WORD32 i4_inter_lyr_dblk_idc; /*!< Deblock filter idc for inter layer deblocking. This shall be valid only for layer with quality id = 0. */ WORD32 i4_inter_lyr_alpha_c0_offset; /*!< Alpha C0 offset for inter layer deblocking. This shall be valid only for layers with quality id = 0. */ WORD32 i4_inter_lyr_beta_offset; /*!< Beta offset for inter layer deblocking. This shall be valid only for layers with quality id = 0. */ vcl_buf_hdr_t *ps_first_vcl_nal; /*!< This shall point to start of the VCL NAL header of the first slice (VCL NAL) in a layer. */ vcl_buf_hdr_t *aps_start_addr_slices[MAX_NUM_SLICE_GRPS_IN_LYR]; /*!< array to hold the start address of first slice of each slice group. the address will be linked to each other within a slice group based on first MB address each entry will be pointing to the slice which will be decoded next in the slice group */ } vcl_node_t; /*****************************************************************************/ /* Extern Variable Declarations */ /*****************************************************************************/ /*****************************************************************************/ /* Extern Function Declarations */ /*****************************************************************************/ #endif /* _SVCD_NAL_STRUCTS_H_ */