/****************************************************************************** * * 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_parse_structs.h * * \brief * Contains the definitions of structures used in the * bitstream extraction module * Detailed_description * * \date * * * \author : Kishore ************************************************************************** */ #ifndef _SVCD_NAL_PARSE_STRUCTS_H_ #define _SVCD_NAL_PARSE_STRUCTS_H_ /*****************************************************************************/ /* File Includes */ /*****************************************************************************/ /*****************************************************************************/ /* Constant Macros */ /*****************************************************************************/ #define HEADER_BUFFER_LEN_BEFORE_EP 32 #define MAX_NAL_HEADER_SIZE 4 #define UP_ALIGN_8(x) (((((UWORD64) x) + 7) >> 3) << 3) #define ALIGN_4(x) (((x) + 3) & (~3)) /*--------------------------------------------------------------------------*/ /* The start address of any VCL or NON VCL internal buffers (input to */ /* emulation prevention should be aligned to 4 byte boundary */ /*--------------------------------------------------------------------------*/ #define BUFFER_ALIGN_4 4 #define FIRST_PASS 0 #define SECOND_PASS 1 /*****************************************************************************/ /* Function Macros */ /*****************************************************************************/ static __inline UWORD32 GET_NAL_BUF_INC(WORD32 i4_derived_nal_type) { UWORD32 u4_buf_inc; if(VCL_NAL == i4_derived_nal_type) { u4_buf_inc = sizeof(vcl_buf_hdr_t); } else { u4_buf_inc = sizeof(non_vcl_buf_hdr_t); } u4_buf_inc = UP_ALIGN_8(u4_buf_inc); return (u4_buf_inc); } static __inline void UPDATE_NAL_BUF_PTR(UWORD8 **ppu1_buf, WORD32 i4_derived_nal_type, UWORD32 *pu4_bytes_left) { UWORD8 *pu1_buf_ptr; UWORD64 u4_inc; /* Align the start of the structure */ pu1_buf_ptr = *ppu1_buf; /* Account for the vcl or non-vcl header */ u4_inc = GET_NAL_BUF_INC(i4_derived_nal_type); u4_inc = UP_ALIGN_8(u4_inc); pu1_buf_ptr += u4_inc; /* Update the pointers */ if(*pu4_bytes_left >= u4_inc) { *pu4_bytes_left -= u4_inc; } *ppu1_buf = pu1_buf_ptr; } /*****************************************************************************/ /* Typedefs */ /*****************************************************************************/ /*****************************************************************************/ /* Enums */ /*****************************************************************************/ typedef enum { NAL_PARSE_HANDLE = 0, NAL_PARSE_DQID_LIST_MEM, NAL_PARSE_CMN_MEM, NAL_PARSE_NAL_UNIT_MEM, NAL_PARSE_NUM_MEM_TABS } BITSTREAM_EXTRACT_MEMTABS_T; typedef enum { PIC_BOUND_DQID = 0, /* Second slice has lower DQID than the first slice */ PIC_BOUND_SLICE_PRMS = 1 /* Second slice has different slice prms as */ /* as compared to first slice */ } PIC_BOUNDARY_TYPES_T; /*****************************************************************************/ /* Structure */ /*****************************************************************************/ typedef struct { vcl_node_t *ps_vcl_node; /*!< The pointer to VCL NAL node buffer. */ UWORD8 u1_valid_flag; /*!< This flag shall indicate that the occupancy of vcl node buffer. SVCD_TRUE shall indicate that the vcl node buffer is occupied. @sa SVCD_BOOL_T */ UWORD8 u1_dqid; /*!< The value of DQID assigned for this structure. The range is [0,127] and is computed as (Dependency id * 16 + Quality id ) */ WORD32 i4_poc_lsb; /*!< It shall have the value of "picture order cnt lsb" when picture order count type is 0 for the layer. When not present in the bitstream, it shall be set to 0*/ WORD32 i4_delta_poc_bot; /*!< It shall have the value of "delta picture order cnt bottom" when picture order count type is 0 for VCL NAL unit. When not present in the bitstream, it shall be set to 0*/ WORD32 ai4_delta_poc[2]; /*!< It shall have the value of "delta picture order cnt bottom" when picture order count type is 1 for VCL NAL unit. When not present in the bitstream, itshall be set to 0 */ } dqid_node_t; typedef struct { WORD32 i4_max_num_lyrs; /*!< Maximum number of layers that will be present in a access unit. This will determine the length of the VCL NAL node buffer. This parameter is configurable during instance creation time */ dqid_node_t *ps_dqid_node; /*!< Pointer to start of VCL NAL node buffer. */ } dqid_ctxt_t; typedef struct { WORD32 i4_valid_flag; /*!< It shall indicate the validity of contents of this buffer structure. SVCD_TRUE shall indicate that the contents of this structure is valid. @sa SVCD_BOOL_T */ UWORD8 *pu1_buf; /*!< It shall point to start of SODB data of the NAL. It should be 8 byte aligned. */ UWORD32 u4_max_bits; /*!< The length of SODB data of NAL in bits. This should be set properly by taking care of whether NAL is coded in CAVLC or CABAC or NAL is a NON VCL NAL */ WORD32 i4_buf_size; /*!< The size of SODB data of NAL in bytes */ } nal_buf_t; typedef struct { /*----------------------------------------------------*/ /*---------- Mode of operation -----------------------*/ /*----------------------------------------------------*/ WORD32 i4_input_bitstream_mode; /*!< RFC or Annex B */ /*----------------------------------------------------*/ /*---------- NAL boundary detection ------------------*/ /*----------------------------------------------------*/ WORD32 i4_find_nal_state; /*!< state of NAL boundary detection logic */ WORD32 i4_zero_byte_cnt; /*< Number of zero bytes consumed */ WORD32 i4_dec_frst_sc_flag; /*!< A flag to decode the start code only. A value of SVCD_TRUE shall indicate that start code shall be decoded.@sa SVCD_BOOL_T */ /*----------------------------------------------------*/ /*--------- Emulation prevention info ----------------*/ /*----------------------------------------------------*/ emulation_prevent_ctxt_t s_emulation_ctxt; /*----------------------------------------------------*/ /*--------- Picture boundary detetction info ---------*/ /*----------------------------------------------------*/ WORD32 i4_is_frst_vcl_nal_in_au; /*!< Indicates whether current NAL is first NAL in the current Access unit. This is needed for detecting picture boundary in partial input mode of operation */ UWORD32 u4_time_stamp_lsb; /*!< Holds the LSB of time stamp of the first NAL unit in the access unit. Used for RFC based bitstreams */ WORD32 i4_time_stamp_msb; /*!< Holds the MSB of time stamp of the first NAL unit in the access unit. Used for RFC based bitstreams */ WORD32 i4_prev_dq_id; /*!< Holds the value of DQID of last NAL unit parsed. this is used for detetecting the picture boundary. in Annex B mode of input bitstream */ WORD32 i4_idr_pic_err_flag; /*!< place to hold the IDR status of current AU */ /*----------------------------------------------------*/ /*-------- DQID node context -------------------------*/ /*----------------------------------------------------*/ dqid_ctxt_t s_dqid_ctxt; /*----------------------------------------------------*/ /*-------- VCL and NON VCL buf info ------------------*/ /*----------------------------------------------------*/ void *pv_non_vcl_nal_buf; /*!< Start address of NON VCL NAL buffer */ void *pv_vcl_nal_buf; /*!< Start address of VCL NAL buffer */ UWORD32 u4_bytes_left_vcl; /*!< number of bytes left in the VCL buffer */ UWORD32 u4_bytes_left_non_vcl; /*!< number of bytes left in the NON VCL buffer */ UWORD8 *pu1_non_vcl_nal_buf; /*!< Current position of non VCL NAL buffer pointer */ UWORD8 *pu1_vcl_nal_buf; /*!< Current position of VCL NAL buffer pointer */ WORD32 i4_num_non_vcl_nals; /*!< Number of non vcl nals */ nal_buf_t s_prefix_nal_buf; /*!< NAL buffer structure of prefix NAL unit */ nal_buf_t s_nal_buf; /*!< NAL buffer structure of . active NAL unit ( which is not a prefix NAL unit) */ nal_buf_t *ps_nal_buf; /*!< It shall point to active NAL buffer structure. It shall point to either "s_prefix_nal_buf" or "s_nal_buf"*/ vcl_buf_hdr_t *ps_prev_vcl_buf; /*!< It shall point to vcl buffer header of the previous slice of a layer */ non_vcl_buf_hdr_t *ps_prev_non_vcl_buf; /*!< It shall point to buffer header of the previous non vcl nal present in the bitstream */ /*----------------------------------------------------*/ /*-------- NAL structure and NAL buffer --------------*/ /*----------------------------------------------------*/ void *pv_nal_unit; void *pv_nal_header_buf; nal_prms_t s_nal_prms; nal_prms_t s_prefix_nal_prms; /*----------------------------------------------------*/ /*-------------- Target layer info -------------------*/ /*----------------------------------------------------*/ target_lyr_attr_t s_app_attr; /*!< This structure shall have the target layer attributes set by the application */ target_lyr_attr_t s_int_attr; /*!< This structure shall have the target layer attributes set by the module. At any state, the module tries to attain the values of application attributes at the IDR pictures */ WORD32 i4_tgt_lyr_update; /*!< It is a flag which indicates whether the internal target layer attributes has to be updated or not. A value of SVCD_TRUE shall indicate that the target layer attributes shall be updated. @sa SVCD_BOOL_T */ /*----------------------------------------------------*/ /*-------- other NAL info ----------------------------*/ /*----------------------------------------------------*/ WORD32 i4_discard_nal_flag; WORD32 i4_nal_type; /*----------------------------------------------------*/ /*---------- Seq, pic prms buffers -------------------*/ /*----------------------------------------------------*/ void *pv_seq_prms; void *pv_pic_prms; /*----------------------------------------------------*/ /*---------- Others ------------------*/ /*----------------------------------------------------*/ WORD32 i4_eos_flag; /*!< Flush mode related parameter. This is used by the module during the flush call. SVCD_TRUE shall indicate that current end of bitstream has occurred. @sa SVCD_BOOL_T; */ UWORD32 u4_bytes_left; /*!< This field has number of bytes not consumed by the NAL parse module in the previous call because of insufficient bitstream to decode the slice and NAL header. */ UWORD8 u1_pic_boundary_aud_flag; } nal_parse_ctxt_t; /*****************************************************************************/ /* Extern Variable Declarations */ /*****************************************************************************/ /*****************************************************************************/ /* Extern Function Declarations */ /*****************************************************************************/ #endif /* _SVCD_NAL_PARSE_STRUCTS_H_ */