/****************************************************************************** * * Copyright (C) 2015 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 * ih264e_cabac_structs.h * * @brief * This file contains cabac related macros, enums, tables and function declarations. * * @author * Doney Alex * * @remarks * none * ******************************************************************************* */ #ifndef IH264E_CABAC_H_ #define IH264E_CABAC_H_ /******************************************************************************* @brief Bit precision of cabac engine; ******************************************************************************* */ #define CABAC_BITS 9 /** ****************************************************************************** * @macro Reverse bits in an unsigned integer ****************************************************************************** */ #define REV(u4_input, u4_output) \ { \ UWORD32 u4_temp = (u4_input); \ WORD8 i; \ u4_output = 0; \ for (i = 0; i < 32; i++) \ { \ u4_output = (u4_output << 1) + \ ((u4_temp >> i) & 0x01); \ } \ } /** ****************************************************************************** *! Bit manipulation macros ****************************************************************************** */ #define SETBIT(a, i) ((a) |= (1 << (i))) #define CLEARBIT(a, i) ((a) &= ~(1 << (i))) /** ****************************************************************************** *! Cabac module expect atlesat MIN_STREAM_SIZE_MB bytes left in stream buffer *! for encoding an MB ****************************************************************************** */ #define MIN_STREAM_SIZE_MB 1024 /*****************************************************************************/ /* Function Declarations */ /*****************************************************************************/ /** ******************************************************************************* * * @brief * Initialize default context values and pointers. * * @param[in] ps_ent_ctxt * Pointer to entropy context structure * * @returns * * @remarks * None * ******************************************************************************* */ void ih264e_init_cabac_table(entropy_ctxt_t *ps_ent_ctxt); /** ******************************************************************************* * * @brief * Initialize cabac context: Intitalize all contest with init values given in the spec. * Called at the beginning of entropy coding of each slice for CABAC encoding. * * @param[in] ps_ent_ctxt * Pointer to entropy context structure * * @returns * * @remarks * None * ******************************************************************************* */ void ih264e_init_cabac_ctxt(entropy_ctxt_t *ps_ent_ctxt); /** ******************************************************************************* * * @brief * k-th order Exp-Golomb (UEGk) binarization process: Implements concatenated * unary/ k-th order Exp-Golomb (UEGk) binarization process, * where k = 0 as defined in 9.3.2.3 of ITU_T_H264-201402 * * @param[in] i2_sufs * Suffix bit string * * @param[in] pi1_bins_len * Pointer to length of the string * * @returns Binarized value * * @remarks * None * ******************************************************************************* */ UWORD32 ih264e_cabac_UEGk0_binarization(WORD16 i2_sufs, WORD8 *pi1_bins_len); /** ******************************************************************************* * * @brief * Get cabac context for the MB :calculates the pointers to Top and left * cabac neighbor context depending upon neighbor availability. * * @param[in] ps_ent_ctxt * Pointer to entropy context structure * * @param[in] u4_mb_type * Type of MB * * @returns * * @remarks * None * ******************************************************************************* */ void ih264e_get_cabac_context(entropy_ctxt_t *ps_ent_ctxt, WORD32 u4_mb_type); /** ******************************************************************************* * @brief * flushing at termination: Explained in flowchart 9-12(ITU_T_H264-201402). * * @param[in] ps_cabac_ctxt * pointer to cabac context (handle) * * @returns none * * @remarks * None * ******************************************************************************* */ void ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt); /** ****************************************************************************** * * @brief Puts new byte (and outstanding bytes) into bitstream after cabac * renormalization * * @par Description * 1. Extract the leading byte of low(L) * 2. If leading byte=0xff increment outstanding bytes and return * (as the actual bits depend on carry propogation later) * 3. If leading byte is not 0xff check for any carry propogation * 4. Insert the carry (propogated in previous byte) along with outstanding * bytes (if any) and leading byte * * * @param[inout] ps_cabac_ctxt * pointer to cabac context (handle) * * @return * ****************************************************************************** */ void ih264e_cabac_put_byte(cabac_ctxt_t *ps_cabac_ctxt); /** ****************************************************************************** * * @brief Codes a bin based on probablilty and mps packed context model * * @par Description * 1. Apart from encoding bin, context model is updated as per state transition * 2. Range and Low renormalization is done based on bin and original state * 3. After renorm bistream is updated (if required) * * @param[inout] ps_cabac * pointer to cabac context (handle) * * @param[in] bin * bin(boolean) to be encoded * * @param[in] pu1_bin_ctxts * index of cabac context model containing pState[bits 5-0] | MPS[bit6] * * @return * ****************************************************************************** */ void ih264e_cabac_encode_bin(cabac_ctxt_t *ps_cabac, WORD32 bin, bin_ctxt_model *pu1_bin_ctxts); /** ******************************************************************************* * * @brief * Encoding process for a binary decision :implements encoding process of a decision * as defined in 9.3.4.2 . This function encodes multiple bins, of a symbol. Implements * flowchart Figure 9-7( ITU_T_H264-201402) * * @param[in] u4_bins * array of bin values * * @param[in] i1_bins_len * Length of bins, maximum 32 * * @param[in] u4_ctx_inc * CtxInc, byte0- bin0, byte1-bin1 .. * * @param[in] i1_valid_len * valid length of bins, after that CtxInc is constant * * @param[in] pu1_bin_ctxt_type * Pointer to binary contexts * @param[in] ps_cabac * Pointer to cabac_context_structure * * @returns * * @remarks * None * ******************************************************************************* */ void ih264e_encode_decision_bins(UWORD32 u4_bins, WORD8 i1_bins_len, UWORD32 u4_ctx_inc, WORD8 i1_valid_len, bin_ctxt_model *pu1_bin_ctxt_type, cabac_ctxt_t *ps_cabac); /** ******************************************************************************* * @brief * Encoding process for a binary decision before termination:Encoding process * of a termination(9.3.4.5 :ITU_T_H264-201402) . Explained in flowchart 9-11. * * @param[in] ps_cabac * Pointer to cabac structure * * @param[in] term_bin * Symbol value, end of slice or not, term_bin is binary * * @returns * * @remarks * None * ******************************************************************************* */ void ih264e_cabac_encode_terminate(cabac_ctxt_t *ps_cabac, WORD32 term_bin); /** ******************************************************************************* * @brief * Bypass encoding process for binary decisions: Explained (9.3.4.4 :ITU_T_H264-201402) * , flowchart 9-10. * * @param[in] ps_cabac : pointer to cabac context (handle) * * @param[in] bin : bypass bin(0/1) to be encoded * * @returns * * @remarks * None * ******************************************************************************* */ void ih264e_cabac_encode_bypass_bin(cabac_ctxt_t *ps_cabac, WORD32 bin); /** ****************************************************************************** * * @brief Encodes a series of bypass bins (FLC bypass bins) * * @par Description * This function is more optimal than calling ih264e_cabac_encode_bypass_bin() * in a loop as cabac low, renorm and generating the stream (8bins at a time) * can be done in one operation * * @param[inout]ps_cabac * pointer to cabac context (handle) * * @param[in] u4_bins * syntax element to be coded (as FLC bins) * * @param[in] num_bins * This is the FLC length for u4_sym * * @return * ****************************************************************************** */ void ih264e_cabac_encode_bypass_bins(cabac_ctxt_t *ps_cabac, UWORD32 u4_bins, WORD32 num_bins); /** ******************************************************************************* * * @brief * This function generates CABAC coded bit stream for an Intra Slice. * * @description * The mb syntax layer for intra slices constitutes luma mb mode, luma sub modes * (if present), mb qp delta, coded block pattern, chroma mb mode and * luma/chroma residue. These syntax elements are written as directed by table * 7.3.5 of h264 specification. * * @param[in] ps_ent_ctxt * pointer to entropy context * * @returns error code * * @remarks none * ******************************************************************************* */ IH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt); /** ******************************************************************************* * * @brief * This function generates CABAC coded bit stream for Inter slices * * @description * The mb syntax layer for inter slices constitutes luma mb mode, luma sub modes * (if present), mb qp delta, coded block pattern, chroma mb mode and * luma/chroma residue. These syntax elements are written as directed by table * 7.3.5 of h264 specification * * @param[in] ps_ent_ctxt * pointer to entropy context * * @returns error code * * @remarks none * ******************************************************************************* */ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt); /** ******************************************************************************* * * @brief * This function generates CABAC coded bit stream for B slices * * @description * The mb syntax layer for inter slices constitutes luma mb mode, * mb qp delta, coded block pattern, chroma mb mode and * luma/chroma residue. These syntax elements are written as directed by table * 7.3.5 of h264 specification * * @param[in] ps_ent_ctxt * pointer to entropy context * * @returns error code * * @remarks none * ******************************************************************************* */ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt); #endif /* IH264E_CABAC_H_ */