| /****************************************************************************** |
| * |
| * 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_ */ |