Home | History | Annotate | Download | only in encoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 
     21 /**
     22 ******************************************************************************
     23 * @file
     24 *  ih264e_encode_header.h
     25 *
     26 * @brief
     27 *  This file contains structures and interface prototypes for h264 bitstream
     28 *  header encoding
     29 *
     30 * @author
     31 *  ittiam
     32 *
     33 * @remarks
     34 *  None
     35 *
     36 *******************************************************************************
     37 */
     38 
     39 #ifndef IH264E_ENCODE_HEADER_H_
     40 #define IH264E_ENCODE_HEADER_H_
     41 
     42 /*****************************************************************************/
     43 /* Function Macros                                                           */
     44 /*****************************************************************************/
     45 
     46 /**
     47 ******************************************************************************
     48  *  @brief   Macro to put a code with specified number of bits into the
     49  *           bitstream
     50 ******************************************************************************
     51  */
     52 #define PUT_BITS(ps_bitstrm, code_val, code_len, ret_val, syntax_string) \
     53          ENTROPY_TRACE(syntax_string, code_val);\
     54         ret_val |= ih264e_put_bits((ps_bitstrm), (code_val), (code_len))
     55 
     56 /**
     57 ******************************************************************************
     58  *  @brief   Macro to put a code with specified number of bits into the
     59  *           bitstream using 0th order exponential Golomb encoding for
     60  *           signed numbers
     61 ******************************************************************************
     62  */
     63 #define PUT_BITS_UEV(ps_bitstrm, code_val, ret_val, syntax_string) \
     64         ENTROPY_TRACE(syntax_string, code_val);\
     65         ret_val |= ih264e_put_uev((ps_bitstrm), (code_val))
     66 
     67 /**
     68 ******************************************************************************
     69  *  @brief   Macro to put a code with specified number of bits into the
     70  *           bitstream using 0th order exponential Golomb encoding for
     71  *           signed numbers
     72 ******************************************************************************
     73  */
     74 #define PUT_BITS_SEV(ps_bitstrm, code_val, ret_val, syntax_string) \
     75         ENTROPY_TRACE(syntax_string, code_val);\
     76         ret_val |= ih264e_put_sev((ps_bitstrm), (code_val))
     77 
     78 
     79 /*****************************************************************************/
     80 /* Extern Function Declarations                                              */
     81 /*****************************************************************************/
     82 
     83 /**
     84 ******************************************************************************
     85 *
     86 * @brief Generates SPS (Sequence Parameter Set)
     87 *
     88 * @par   Description
     89 *  This function generates Sequence Parameter Set header as per the spec
     90 *
     91 * @param[in]   ps_bitstrm
     92 *  pointer to bitstream context (handle)
     93 *
     94 * @param[in]   ps_sps
     95 *  pointer to structure containing SPS data
     96 *
     97 * @return      success or failure error code
     98 *
     99 ******************************************************************************
    100 */
    101 WORD32      ih264e_generate_sps
    102     (
    103         bitstrm_t   *ps_bitstrm,
    104         sps_t       *ps_sps,
    105         vui_t       *ps_vui
    106     );
    107 
    108 /**
    109 ******************************************************************************
    110 *
    111 * @brief Generates PPS (Picture Parameter Set)
    112 *
    113 * @par   Description
    114 *  Generate Picture Parameter Set as per Section 7.3.2.2
    115 *
    116 * @param[in]   ps_bitstrm
    117 *  pointer to bitstream context (handle)
    118 *
    119 * @param[in]   ps_pps
    120 *  pointer to structure containing PPS data
    121 *
    122 * @return      success or failure error code
    123 *
    124 ******************************************************************************
    125 */
    126 WORD32      ih264e_generate_pps
    127     (
    128         bitstrm_t   *ps_bitstrm,
    129         pps_t       *ps_pps,
    130         sps_t       *ps_sps
    131     );
    132 
    133 /**
    134 ******************************************************************************
    135 *
    136 * @brief Generates Slice Header
    137 *
    138 * @par   Description
    139 *  Generate Slice Header as per Section 7.3.5.1
    140 *
    141 * @param[inout]   ps_bitstrm
    142 *  pointer to bitstream context for generating slice header
    143 *
    144 * @param[in]   ps_slice_hdr
    145 *  pointer to slice header params
    146 *
    147 * @param[in]   ps_pps
    148 *  pointer to pps params referred by slice
    149 *
    150 * @param[in]   ps_sps
    151 *  pointer to sps params referred by slice
    152 *
    153 * @param[out]   ps_dup_bit_strm_ent_offset
    154 *  Bitstream struct to store bitstream state
    155 *
    156 * @param[out]   pu4_first_slice_start_offset
    157 *  first slice offset is returned
    158 *
    159 * @return      success or failure error code
    160 *
    161 ******************************************************************************
    162 */
    163 WORD32      ih264e_generate_slice_header
    164     (
    165         bitstrm_t       *ps_bitstrm,
    166         slice_header_t  *ps_slice_hdr,
    167         pps_t           *ps_pps,
    168         sps_t           *ps_sps
    169     );
    170 
    171 /**
    172 ******************************************************************************
    173 *
    174 * @brief Populates sps structure
    175 *
    176 * @par   Description
    177 *  Populates sps structure for its use in header generation
    178 *
    179 * @param[in]   ps_codec
    180 *  pointer to encoder context
    181 *
    182 * @param[out]  ps_sps
    183 *  pointer to sps params that needs to be populated
    184 *
    185 * @return      success or failure error code
    186 *
    187 ******************************************************************************
    188 */
    189 IH264E_ERROR_T      ih264e_populate_sps
    190         (
    191             codec_t *ps_codec,
    192             sps_t   *ps_sps
    193         );
    194 
    195 /**
    196 ******************************************************************************
    197 *
    198 * @brief Populates pps structure
    199 *
    200 * @par   Description
    201 *  Populates pps structure for its use in header generation
    202 *
    203 * @param[in]   ps_codec
    204 *  pointer to encoder context
    205 *
    206 * @param[out]  ps_pps
    207 *  pointer to pps params that needs to be populated
    208 *
    209 * @return      success or failure error code
    210 *
    211 ******************************************************************************
    212 */
    213 IH264E_ERROR_T ih264e_populate_pps
    214         (
    215             codec_t *ps_codec,
    216             pps_t *ps_pps
    217         );
    218 
    219 
    220 /**
    221 ******************************************************************************
    222 *
    223 * @brief Populates slice header structure
    224 *
    225 * @par   Description
    226 *  Populates slice header structure for its use in header generation
    227 *
    228 * @param[in]  ps_proc
    229 *  pointer to proc context
    230 *
    231 * @param[out]  ps_slice_hdr
    232 *  pointer to slice header structure that needs to be populated
    233 *
    234 * @param[in]  ps_pps
    235 *  pointer to pps params structure referred by the slice
    236 *
    237 * @param[in]   ps_sps
    238 *  pointer to sps params referred by the pps
    239 *
    240 * @return      success or failure error code
    241 *
    242 ******************************************************************************
    243 */
    244 WORD32 ih264e_populate_slice_header
    245         (
    246             process_ctxt_t *ps_proc,
    247             slice_header_t *ps_slice_hdr,
    248             pps_t *ps_pps,
    249             sps_t *ps_sps
    250         );
    251 
    252 
    253 /**
    254 ******************************************************************************
    255 *
    256 * @brief inserts FILLER Nal Unit.
    257 *
    258 * @par   Description
    259 *  In constant bit rate rc mode, when the bits generated by the codec is
    260 *  underflowing the target bit rate, the encoder library inserts filler nal unit.
    261 *
    262 * @param[in]    ps_bitstrm
    263 *  pointer to bitstream context (handle)
    264 *
    265 * @param[in]    insert_fill_bytes
    266 *  Number of fill bytes to be inserted
    267 *
    268 * @return      success or failure error code
    269 *
    270 ******************************************************************************
    271 */
    272 IH264E_ERROR_T ih264e_add_filler_nal_unit
    273         (
    274             bitstrm_t   *ps_bitstrm,
    275             WORD32      insert_fill_bytes
    276         );
    277 
    278 
    279 #endif //IH264E_ENCODE_HEADER_H_
    280