292 lines
14 KiB
C
292 lines
14 KiB
C
/******************************************************************************
|
|
*
|
|
* 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_ */
|