Home | History | Annotate | Download | only in encoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2018 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 * @file ihevce_cabac.c
     23 *
     24 * @brief
     25 *  This file contains function definitions related to bitstream generation
     26 *
     27 * @author
     28 *  ittiam
     29 *
     30 * @List of Functions
     31 *  ihevce_cabac_reset()
     32 *  ihevce_cabac_init()
     33 *  ihevce_cabac_put_byte()
     34 *  ihevce_cabac_encode_bin()
     35 *  ihevce_cabac_encode_bypass_bin()
     36 *  ihevce_cabac_encode_terminate()
     37 *  ihevce_cabac_encode_tunary()
     38 *  ihevce_cabac_encode_tunary_bypass()
     39 *  ihevce_cabac_encode_bypass_bins()
     40 *  ihevce_cabac_encode_egk()
     41 *  ihevce_cabac_encode_trunc_rice()
     42 *  ihevce_cabac_encode_trunc_rice_ctxt()
     43 *  ihevce_cabac_flush()
     44 *  ihevce_cabac_ctxt_backup()
     45 *  ihevce_cabac_ctxt_row_init()
     46 *
     47 *******************************************************************************
     48 */
     49 
     50 /*****************************************************************************/
     51 /* File Includes                                                             */
     52 /*****************************************************************************/
     53 /* System include files */
     54 #include <stdio.h>
     55 #include <string.h>
     56 #include <stdlib.h>
     57 #include <assert.h>
     58 #include <stdarg.h>
     59 #include <math.h>
     60 
     61 /* User include files */
     62 #include "ihevc_typedefs.h"
     63 #include "ihevc_debug.h"
     64 #include "ihevc_macros.h"
     65 #include "ihevc_platform_macros.h"
     66 #include "ihevc_cabac_tables.h"
     67 
     68 #include "ihevce_defs.h"
     69 #include "ihevce_error_codes.h"
     70 #include "ihevce_bitstream.h"
     71 #include "ihevce_cabac.h"
     72 
     73 #define TEST_CABAC_BITESTIMATE 0
     74 
     75 /*****************************************************************************/
     76 /* Function Definitions                                                      */
     77 /*****************************************************************************/
     78 
     79 /**
     80 ******************************************************************************
     81 *
     82 *  @brief Resets the encoder cabac engine
     83 *
     84 *  @par   Description
     85 *  This routine needs to be called at start of dependent slice encode
     86 *
     87 *  @param[inout]   ps_cabac_ctxt
     88 *  pointer to cabac context (handle)
     89 *
     90 *  @param[in]   ps_bitstrm
     91 *  pointer to bitstream context (handle)
     92 *
     93 *  @param[in]   e_cabac_op_mode
     94 *  opertaing mode of cabac; put bits / compute bits mode @sa CABAC_OP_MODE
     95 *
     96 *  @return      success or failure error code
     97 *
     98 ******************************************************************************
     99 */
    100 WORD32
    101     ihevce_cabac_reset(cab_ctxt_t *ps_cabac, bitstrm_t *ps_bitstrm, CABAC_OP_MODE e_cabac_op_mode)
    102 {
    103     /* Sanity checks */
    104     ASSERT(ps_cabac != NULL);
    105     ASSERT(
    106         (e_cabac_op_mode == CABAC_MODE_ENCODE_BITS) ||
    107         (e_cabac_op_mode == CABAC_MODE_COMPUTE_BITS));
    108 
    109     ps_cabac->e_cabac_op_mode = e_cabac_op_mode;
    110 
    111     if(CABAC_MODE_ENCODE_BITS == e_cabac_op_mode)
    112     {
    113         ASSERT(ps_bitstrm != NULL);
    114 
    115         /* Bitstream context initialization */
    116         ps_cabac->pu1_strm_buffer = ps_bitstrm->pu1_strm_buffer;
    117         ps_cabac->u4_max_strm_size = ps_bitstrm->u4_max_strm_size;
    118         /* When entropy sync is enabled start form fixed offset from point
    119          * where slice header extension has ended to handle emulation prevention
    120          *  bytes during insertion of slice offset at end of frame */
    121         if(1 == ps_cabac->i1_entropy_coding_sync_enabled_flag)
    122         {
    123             ps_cabac->u4_strm_buf_offset = ps_cabac->u4_first_slice_start_offset;
    124         }
    125         else
    126         {
    127             ps_cabac->u4_strm_buf_offset = ps_bitstrm->u4_strm_buf_offset;
    128         }
    129         ps_cabac->i4_zero_bytes_run = ps_bitstrm->i4_zero_bytes_run;
    130 
    131         /* cabac engine initialization */
    132         ps_cabac->u4_low = 0;
    133         ps_cabac->u4_range = 510;
    134         ps_cabac->u4_bits_gen = 0;
    135         ps_cabac->u4_out_standing_bytes = 0;
    136     }
    137     else /* (CABAC_MODE_COMPUTE_BITS == e_cabac_op_mode) */
    138     {
    139         /* reset the bits estimated */
    140         ps_cabac->u4_bits_estimated_q12 = 0;
    141 
    142         /* reset the texture bits estimated */
    143         ps_cabac->u4_texture_bits_estimated_q12 = 0;
    144 
    145         /* Setting range to 0 switches off AEV_TRACE in compute bits mode */
    146         ps_cabac->u4_range = 0;
    147     }
    148 
    149     return (IHEVCE_SUCCESS);
    150 }
    151 
    152 /**
    153 ******************************************************************************
    154 *
    155 *  @brief Initializes the encoder cabac engine
    156 *
    157 *  @par   Description
    158 *  This routine needs to be called at start of slice/frame encode
    159 *
    160 *  @param[inout]   ps_cabac_ctxt
    161 *  pointer to cabac context (handle)
    162 *
    163 *  @param[in]   ps_bitstrm
    164 *  pointer to bitstream context (handle)
    165 *
    166 *  @param[in]   qp
    167 *  current slice qp
    168 *
    169 *  @param[in]   cabac_init_idc
    170 *  current slice init idc (range - [0- 2])*
    171 *
    172 *  @param[in]   e_cabac_op_mode
    173 *  opertaing mode of cabac; put bits / compute bits mode @sa CABAC_OP_MODE
    174 *
    175 *  @return      success or failure error code
    176 *
    177 ******************************************************************************
    178 */
    179 WORD32 ihevce_cabac_init(
    180     cab_ctxt_t *ps_cabac,
    181     bitstrm_t *ps_bitstrm,
    182     WORD32 slice_qp,
    183     WORD32 cabac_init_idc,
    184     CABAC_OP_MODE e_cabac_op_mode)
    185 {
    186     /* Sanity checks */
    187     ASSERT(ps_cabac != NULL);
    188     ASSERT((slice_qp >= 0) && (slice_qp < IHEVC_MAX_QP));
    189     ASSERT((cabac_init_idc >= 0) && (cabac_init_idc < 3));
    190     ASSERT(
    191         (e_cabac_op_mode == CABAC_MODE_ENCODE_BITS) ||
    192         (e_cabac_op_mode == CABAC_MODE_COMPUTE_BITS));
    193 
    194     ps_cabac->e_cabac_op_mode = e_cabac_op_mode;
    195 
    196     if(CABAC_MODE_ENCODE_BITS == e_cabac_op_mode)
    197     {
    198         ASSERT(ps_bitstrm != NULL);
    199 
    200         /* Bitstream context initialization */
    201         ps_cabac->pu1_strm_buffer = ps_bitstrm->pu1_strm_buffer;
    202         ps_cabac->u4_max_strm_size = ps_bitstrm->u4_max_strm_size;
    203         /* When entropy sync is enabled start form fixed offset from point
    204          * where slice header extension has ended to handle emulation prevention
    205          *  bytes during insertion of slice offset at end of frame */
    206         if(1 == ps_cabac->i1_entropy_coding_sync_enabled_flag)
    207         {
    208             ps_cabac->u4_strm_buf_offset = ps_cabac->u4_first_slice_start_offset;
    209         }
    210         else
    211         {
    212             ps_cabac->u4_strm_buf_offset = ps_bitstrm->u4_strm_buf_offset;
    213         }
    214         ps_cabac->i4_zero_bytes_run = ps_bitstrm->i4_zero_bytes_run;
    215 
    216         /* cabac engine initialization */
    217         ps_cabac->u4_low = 0;
    218         ps_cabac->u4_range = 510;
    219         ps_cabac->u4_bits_gen = 0;
    220         ps_cabac->u4_out_standing_bytes = 0;
    221 
    222         /* reset the bits estimated */
    223         ps_cabac->u4_bits_estimated_q12 = 0;
    224 
    225         /* reset the texture bits estimated */
    226         ps_cabac->u4_texture_bits_estimated_q12 = 0;
    227     }
    228     else /* (CABAC_MODE_COMPUTE_BITS == e_cabac_op_mode) */
    229     {
    230         /* reset the bits estimated */
    231         ps_cabac->u4_bits_estimated_q12 = 0;
    232 
    233         /* reset the texture bits estimated */
    234         ps_cabac->u4_texture_bits_estimated_q12 = 0;
    235 
    236         /* Setting range to 0 switches off AEV_TRACE in compute bits mode */
    237         ps_cabac->u4_range = 0;
    238     }
    239 
    240     /* cabac context initialization based on init idc and slice qp */
    241     COPY_CABAC_STATES(
    242         ps_cabac->au1_ctxt_models,
    243         &gau1_ihevc_cab_ctxts[cabac_init_idc][slice_qp][0],
    244         IHEVC_CAB_CTXT_END);
    245 
    246     return (IHEVCE_SUCCESS);
    247 }
    248 
    249 /**
    250 ******************************************************************************
    251 *
    252 *  @brief Puts new byte (and outstanding bytes) into bitstream after cabac
    253 *         renormalization
    254 *
    255 *  @par   Description
    256 *  1. Extract the leading byte of low(L)
    257 *  2. If leading byte=0xff increment outstanding bytes and return
    258 *     (as the actual bits depend on carry propogation later)
    259 *  3. If leading byte is not 0xff check for any carry propogation
    260 *  4. Insert the carry (propogated in previous byte) along with outstanding
    261 *     bytes (if any) and leading byte
    262 *
    263 *
    264 *  @param[inout]   ps_cabac
    265 *  pointer to cabac context (handle)
    266 *
    267 *  @return      success or failure error code
    268 *
    269 ******************************************************************************
    270 */
    271 WORD32 ihevce_cabac_put_byte(cab_ctxt_t *ps_cabac)
    272 {
    273     UWORD32 u4_low = ps_cabac->u4_low;
    274     UWORD32 u4_bits_gen = ps_cabac->u4_bits_gen;
    275     WORD32 lead_byte = u4_low >> (u4_bits_gen + CABAC_BITS - 8);
    276 
    277     /* Sanity checks */
    278     ASSERT((ps_cabac->u4_range >= 256) && (ps_cabac->u4_range < 512));
    279     ASSERT((u4_bits_gen >= 8));
    280 
    281     /* update bits generated and low after extracting leading byte */
    282     u4_bits_gen -= 8;
    283     ps_cabac->u4_low &= ((1 << (CABAC_BITS + u4_bits_gen)) - 1);
    284     ps_cabac->u4_bits_gen = u4_bits_gen;
    285 
    286     /************************************************************************/
    287     /* 1. Extract the leading byte of low(L)                                */
    288     /* 2. If leading byte=0xff increment outstanding bytes and return       */
    289     /*      (as the actual bits depend on carry propogation later)          */
    290     /* 3. If leading byte is not 0xff check for any carry propogation       */
    291     /* 4. Insert the carry (propogated in previous byte) along with         */
    292     /*    outstanding bytes (if any) and leading byte                       */
    293     /************************************************************************/
    294     if(lead_byte == 0xff)
    295     {
    296         /* actual bits depend on carry propogration     */
    297         ps_cabac->u4_out_standing_bytes++;
    298         return (IHEVCE_SUCCESS);
    299     }
    300     else
    301     {
    302         /* carry = 1 => putbit(1); carry propogated due to L renorm */
    303         WORD32 carry = (lead_byte >> 8) & 0x1;
    304         UWORD8 *pu1_strm_buf = ps_cabac->pu1_strm_buffer;
    305         UWORD32 u4_strm_buf_offset = ps_cabac->u4_strm_buf_offset;
    306         WORD32 zero_run = ps_cabac->i4_zero_bytes_run;
    307         UWORD32 u4_out_standing_bytes = ps_cabac->u4_out_standing_bytes;
    308 
    309         /*********************************************************************/
    310         /* Bitstream overflow check                                          */
    311         /* NOTE: corner case of epb bytes (max 2 for 32bit word) not handled */
    312         /*********************************************************************/
    313         if((u4_strm_buf_offset + u4_out_standing_bytes + 1) >= ps_cabac->u4_max_strm_size)
    314         {
    315             /* return without corrupting the buffer beyond its size */
    316             return (IHEVCE_BITSTREAM_BUFFER_OVERFLOW);
    317         }
    318 
    319         /*********************************************************************/
    320         /*        Insert the carry propogated in previous byte               */
    321         /*                                                                   */
    322         /* Note : Do not worry about corruption into slice header align byte */
    323         /*        This is because the first bin cannot result in overflow    */
    324         /*********************************************************************/
    325         if(carry)
    326         {
    327             /* CORNER CASE: if the previous data is 0x000003, then EPB will be inserted
    328             and the data will become 0x00000303 and if the carry is present, it will
    329             be added with the last byte and it will become 0x00000304 which is not correct
    330             as per standard*/
    331             /* so check for previous four bytes and if it is equal to 0x00000303
    332             then subtract u4_strm_buf_offset by 1 */
    333             if(pu1_strm_buf[u4_strm_buf_offset - 1] == 0x03 &&
    334                pu1_strm_buf[u4_strm_buf_offset - 2] == 0x03 &&
    335                pu1_strm_buf[u4_strm_buf_offset - 3] == 0x00 &&
    336                pu1_strm_buf[u4_strm_buf_offset - 4] == 0x00)
    337             {
    338                 u4_strm_buf_offset -= 1;
    339             }
    340             /* previous byte carry add will not result in overflow to        */
    341             /* u4_strm_buf_offset - 2 as we track 0xff as outstanding bytes  */
    342             pu1_strm_buf[u4_strm_buf_offset - 1] += carry;
    343             zero_run = 0;
    344         }
    345 
    346         /*        Insert outstanding bytes (if any)         */
    347         while(u4_out_standing_bytes)
    348         {
    349             UWORD8 u1_0_or_ff = carry ? 0 : 0xFF;
    350 
    351             PUTBYTE_EPB(pu1_strm_buf, u4_strm_buf_offset, u1_0_or_ff, zero_run);
    352 
    353             u4_out_standing_bytes--;
    354         }
    355         ps_cabac->u4_out_standing_bytes = 0;
    356 
    357         /*        Insert the leading byte                   */
    358         lead_byte &= 0xFF;
    359         PUTBYTE_EPB(pu1_strm_buf, u4_strm_buf_offset, lead_byte, zero_run);
    360 
    361         /* update the state variables and return success */
    362         ps_cabac->u4_strm_buf_offset = u4_strm_buf_offset;
    363         ps_cabac->i4_zero_bytes_run = zero_run;
    364         return (IHEVCE_SUCCESS);
    365     }
    366 }
    367 
    368 /**
    369 ******************************************************************************
    370 *
    371 *  @brief Codes a bypass bin (equi probable 0 / 1)
    372 *
    373 *  @par   Description
    374 *  After encoding bypass bin, bits gen incremented by 1 and bitstream generated
    375 *
    376 *  @param[inout]  ps_cabac : pointer to cabac context (handle)
    377 *
    378 *  @param[in]   bin :  bypass bin(0/1) to be encoded
    379 *
    380 *  @return      success or failure error code
    381 *
    382 ******************************************************************************
    383 */
    384 WORD32 ihevce_cabac_encode_bypass_bin(cab_ctxt_t *ps_cabac, WORD32 bin)
    385 {
    386     UWORD32 u4_range = ps_cabac->u4_range;
    387     UWORD32 u4_low = ps_cabac->u4_low;
    388 
    389     if(CABAC_MODE_ENCODE_BITS == ps_cabac->e_cabac_op_mode)
    390     {
    391         /* Sanity checks */
    392         ASSERT((u4_range >= 256) && (u4_range < 512));
    393         ASSERT((bin == 0) || (bin == 1));
    394 
    395         /*Compute bit always to populate the trace*/
    396         /* increment bits generated by 1 */
    397         ps_cabac->u4_bits_estimated_q12 += (1 << CABAC_FRAC_BITS_Q);
    398 
    399         u4_low <<= 1;
    400         /* add range if bin is 1 */
    401         if(bin)
    402         {
    403             u4_low += u4_range;
    404         }
    405 
    406         /* 1 bit to be inserted in the bitstream */
    407         ps_cabac->u4_bits_gen++;
    408         ps_cabac->u4_low = u4_low;
    409 
    410         /* generate stream when a byte is ready */
    411         if(ps_cabac->u4_bits_gen > CABAC_BITS)
    412         {
    413             return (ihevce_cabac_put_byte(ps_cabac));
    414         }
    415     }
    416     else /* (CABAC_MODE_COMPUTE_BITS == e_cabac_op_mode) */
    417     {
    418         /* increment bits generated by 1 */
    419         ps_cabac->u4_bits_estimated_q12 += (1 << CABAC_FRAC_BITS_Q);
    420     }
    421 
    422     return (IHEVCE_SUCCESS);
    423 }
    424 
    425 /**
    426 ******************************************************************************
    427 *
    428 *  @brief Codes a terminate bin (1:terminate 0:do not terminate)
    429 *
    430 *  @par   Description
    431 *  After encoding bypass bin, bits gen incremented by 1 and bitstream generated
    432 *
    433 *  @param[inout]  ps_cabac : pointer to cabac context (handle)
    434 *
    435 *  @param[in]   term_bin : (1:terminate 0:do not terminate)
    436 *
    437 *  @return      success or failure error code
    438 *
    439 ******************************************************************************
    440 */
    441 WORD32
    442     ihevce_cabac_encode_terminate(cab_ctxt_t *ps_cabac, WORD32 term_bin, WORD32 i4_end_of_sub_strm)
    443 {
    444     UWORD32 u4_range = ps_cabac->u4_range;
    445     UWORD32 u4_low = ps_cabac->u4_low;
    446     UWORD32 u4_rlps;
    447     WORD32 shift;
    448     WORD32 error = IHEVCE_SUCCESS;
    449 
    450     /* Sanity checks */
    451     ASSERT((u4_range >= 256) && (u4_range < 512));
    452     ASSERT((term_bin == 0) || (term_bin == 1));
    453 
    454     /*  term_bin = 1 has lps range = 2 */
    455     u4_rlps = 2;
    456     u4_range -= u4_rlps;
    457 
    458     /* if terminate L is incremented by curR and R=2 */
    459     if(term_bin)
    460     {
    461         /* lps path;  L= L + R; R = RLPS */
    462         u4_low += u4_range;
    463         u4_range = u4_rlps;
    464     }
    465 
    466     /*****************************************************************/
    467     /* Renormalization; calculate bits generated based on range(R)   */
    468     /* Note : 6 <= R < 512; R is 2 only for terminating encode       */
    469     /*****************************************************************/
    470     GETRANGE(shift, u4_range);
    471     shift = 9 - shift;
    472     u4_low <<= shift;
    473     u4_range <<= shift;
    474 
    475     /* bits to be inserted in the bitstream */
    476     ps_cabac->u4_bits_gen += shift;
    477     ps_cabac->u4_range = u4_range;
    478     ps_cabac->u4_low = u4_low;
    479 
    480     /* generate stream when a byte is ready */
    481     if(ps_cabac->u4_bits_gen > CABAC_BITS)
    482     {
    483         error = ihevce_cabac_put_byte(ps_cabac);
    484     }
    485 
    486     if(term_bin)
    487     {
    488         ihevce_cabac_flush(ps_cabac, i4_end_of_sub_strm);
    489     }
    490 
    491     /*Compute bit always to populate the trace*/
    492     ps_cabac->u4_bits_estimated_q12 += gau2_ihevce_cabac_bin_to_bits[(62 << 1) | term_bin];
    493 
    494     return (error);
    495 }
    496 
    497 /**
    498 ******************************************************************************
    499 *
    500 *  @brief Encodes a truncated unary symbol associated with context model(s)
    501 *
    502 *  @par   Description
    503 *  Does binarization of tunary symbol as per sec 9.3.2.2 and does the cabac
    504 *  encoding of each bin. This is used for computing symbols like qp_delta,
    505 *  last_sig_coeff_prefix_x, last_sig_coeff_prefix_y.
    506 *
    507 *  The context models associated with each bin is computed as :
    508 *   current bin context = "base context idx" + (bin_idx >> shift)
    509 *  where
    510 *   1. "base context idx" is the base index for the syntax element
    511 *   2. "bin_idx" is the current bin index of the unary code
    512 *   3. "shift" is the shift factor associated with this syntax element
    513 *
    514 *  @param[inout]ps_cabac
    515 *   pointer to cabac context (handle)
    516 *
    517 *  @param[in]   sym
    518 *   syntax element to be coded as truncated unary bins
    519 *
    520 *  @param[in]   c_max
    521 *   maximum value of sym (required for tunary binarization)
    522 *
    523 *  @param[in]   ctxt_index
    524 *   base context model index for this syntax element
    525 *
    526 *  @param[in]   ctxt_shift
    527 *   shift factor for context increments associated with this syntax element
    528 *
    529 *  @param[in]   ctxt_inc_max
    530 *   max value of context increment beyond which all bins will use same ctxt
    531 *
    532 *  @return      success or failure error code
    533 *
    534 ******************************************************************************
    535 */
    536 WORD32 ihevce_cabac_encode_tunary(
    537     cab_ctxt_t *ps_cabac,
    538     WORD32 sym,
    539     WORD32 c_max,
    540     WORD32 ctxt_index,
    541     WORD32 ctxt_shift,
    542     WORD32 ctxt_inc_max)
    543 {
    544     WORD32 bin_ctxt, i;
    545     WORD32 error = IHEVCE_SUCCESS;
    546 
    547     /* Sanity checks */
    548     ASSERT(c_max > 0);
    549     ASSERT((sym <= c_max) && (sym >= 0));
    550     ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END));
    551     ASSERT((ctxt_index + (c_max >> ctxt_shift)) < IHEVC_CAB_CTXT_END);
    552 
    553     /* Special case of sym= 0 */
    554     if(0 == sym)
    555     {
    556         return (ihevce_cabac_encode_bin(ps_cabac, 0, ctxt_index));
    557     }
    558 
    559     /* write '1' bins  */
    560     for(i = 0; i < sym; i++)
    561     {
    562         /* TODO: encode bin to be inlined later */
    563         bin_ctxt = ctxt_index + MIN((i >> ctxt_shift), ctxt_inc_max);
    564         error |= ihevce_cabac_encode_bin(ps_cabac, 1, bin_ctxt);
    565     }
    566 
    567     /* write terminating 0 bin */
    568     if(sym < c_max)
    569     {
    570         /* TODO: encode bin to be inlined later */
    571         bin_ctxt = ctxt_index + MIN((i >> ctxt_shift), ctxt_inc_max);
    572         error |= ihevce_cabac_encode_bin(ps_cabac, 0, bin_ctxt);
    573     }
    574 
    575     return (error);
    576 }
    577 
    578 /**
    579 ******************************************************************************
    580 *
    581 *  @brief Encodes a syntax element as truncated unary bypass bins
    582 *
    583 *  @par   Description
    584 *  Does binarization of tunary symbol as per sec 9.3.2.2 and does the cabac
    585 *  encoding of each bin. This is used for computing symbols like merge_idx,
    586 *  mpm_idx etc
    587 *
    588 *  @param[inout]ps_cabac
    589 *   pointer to cabac context (handle)
    590 *
    591 *  @param[in]   sym
    592 *   syntax element to be coded as truncated unary bins
    593 *
    594 *  @param[in]   c_max
    595 *   maximum value of sym (required for tunary binarization)
    596 *
    597 *  @return      success or failure error code
    598 *
    599 ******************************************************************************
    600 */
    601 WORD32 ihevce_cabac_encode_tunary_bypass(cab_ctxt_t *ps_cabac, WORD32 sym, WORD32 c_max)
    602 {
    603     WORD32 error = IHEVCE_SUCCESS;
    604     WORD32 length;
    605     WORD32 u4_bins;
    606 
    607     /* Sanity checks */
    608     ASSERT(c_max > 0);
    609     ASSERT((sym <= c_max) && (sym >= 0));
    610 
    611     if(sym < c_max)
    612     {
    613         /* unary code with (sym) '1's and terminating '0' bin */
    614         length = (sym + 1);
    615         u4_bins = (1 << length) - 2;
    616     }
    617     else
    618     {
    619         /* tunary code with (sym) '1's */
    620         length = sym;
    621         u4_bins = (1 << length) - 1;
    622     }
    623 
    624     /* Encode the tunary binarized code as bypass bins */
    625     error = ihevce_cabac_encode_bypass_bins(ps_cabac, u4_bins, length);
    626 
    627     return (error);
    628 }
    629 
    630 /**
    631 ******************************************************************************
    632 *
    633 *  @brief Encodes a syntax element as kth order Exp-Golomb code (EGK)
    634 *
    635 *  @par   Description
    636 *  Does binarization of symbol as per sec 9.3.2.4  kth order Exp-Golomb(EGk)
    637 *  process and encodes the resulting bypass bins
    638 *
    639 *  @param[inout]ps_cabac
    640 *   pointer to cabac context (handle)
    641 *
    642 *  @param[in]   u4_sym
    643 *   syntax element to be coded as EGK
    644 *
    645 *  @param[in]   k
    646 *   order of EGk
    647 *
    648 *  @return      success or failure error code
    649 *
    650 ******************************************************************************
    651 */
    652 WORD32 ihevce_cabac_encode_egk(cab_ctxt_t *ps_cabac, UWORD32 u4_sym, WORD32 k)
    653 {
    654     WORD32 num_bins, unary_length;
    655     UWORD32 u4_sym_shiftk_plus1, u4_egk, u4_unary_bins;
    656 
    657     WORD32 error = IHEVCE_SUCCESS;
    658 
    659     /* Sanity checks */
    660     ASSERT((k >= 0));
    661     /* ASSERT(u4_sym >= (UWORD32)(1 << k)); */
    662 
    663     /************************************************************************/
    664     /* shift symbol by k bits to find unary code prefix (111110)            */
    665     /* Use GETRANGE to elminate the while loop in sec 9.3.2.4 of HEVC spec  */
    666     /************************************************************************/
    667     u4_sym_shiftk_plus1 = (u4_sym >> k) + 1;
    668     /* GETRANGE(unary_length, (u4_sym_shiftk_plus1 + 1)); */
    669     GETRANGE(unary_length, u4_sym_shiftk_plus1);
    670 
    671     /* unary code with (unary_length-1) '1's and terminating '0' bin */
    672     u4_unary_bins = (1 << unary_length) - 2;
    673 
    674     /* insert the symbol prefix of (unary lenght - 1)  bins */
    675     u4_egk = (u4_unary_bins << (unary_length - 1)) |
    676              (u4_sym_shiftk_plus1 & ((1 << (unary_length - 1)) - 1));
    677 
    678     /* insert last k bits of symbol in the end */
    679     u4_egk = (u4_egk << k) | (u4_sym & ((1 << k) - 1));
    680 
    681     /* length of the code = 2 *(unary_length - 1) + 1 + k */
    682     num_bins = (2 * unary_length) - 1 + k;
    683 
    684     /* Encode the egk binarized code as bypass bins */
    685     error = ihevce_cabac_encode_bypass_bins(ps_cabac, u4_egk, num_bins);
    686 
    687     return (error);
    688 }
    689 
    690 /**
    691 ******************************************************************************
    692 *
    693 *  @brief Encodes a syntax element as truncated rice code (TR)
    694 *
    695 *  @par   Description
    696 *  Does binarization of symbol as per sec 9.3.2.3 Truncated Rice(TR)
    697 *  binarization process and encodes the resulting bypass bins
    698 *  This function ise used for coeff_abs_level_remaining coding when
    699 *  level is less than c_rice_max
    700 *
    701 *  @param[inout]ps_cabac
    702 *   pointer to cabac context (handle)
    703 *
    704 *  @param[in]   u4_sym
    705 *   syntax element to be coded as truncated rice code
    706 *
    707 *  @param[in]   c_rice_param
    708 *    shift factor for truncated unary prefix coding of (u4_sym >> c_rice_param)
    709 *
    710 *  @param[in]   c_rice_max
    711 *    max symbol val below which a suffix is coded as (u4_sym%(1<<c_rice_param))
    712 *    This is currently (4 << c_rice_param) for coeff_abs_level_remaining
    713 *
    714 *  @return      success or failure error code
    715 *
    716 ******************************************************************************
    717 */
    718 WORD32 ihevce_cabac_encode_trunc_rice(
    719     cab_ctxt_t *ps_cabac, UWORD32 u4_sym, WORD32 c_rice_param, WORD32 c_rice_max)
    720 {
    721     WORD32 num_bins, unary_length, u4_unary_bins;
    722     UWORD32 u4_tr;
    723 
    724     WORD32 error = IHEVCE_SUCCESS;
    725 
    726     (void)c_rice_max;
    727     /* Sanity checks */
    728     ASSERT((c_rice_param >= 0));
    729     ASSERT((UWORD32)c_rice_max > u4_sym);
    730 
    731     /************************************************************************/
    732     /* shift symbol by c_rice_param bits to find unary code prefix (111.10) */
    733     /************************************************************************/
    734     unary_length = (u4_sym >> c_rice_param) + 1;
    735 
    736     /* unary code with (unary_length-1) '1's and terminating '0' bin */
    737     u4_unary_bins = (1 << unary_length) - 2;
    738 
    739     /* insert last c_rice_param bits of symbol in the end */
    740     u4_tr = (u4_unary_bins << c_rice_param) | (u4_sym & ((1 << c_rice_param) - 1));
    741 
    742     /* length of the code */
    743     num_bins = unary_length + c_rice_param;
    744 
    745     /* Encode the tr binarized code as bypass bins */
    746     error = ihevce_cabac_encode_bypass_bins(ps_cabac, u4_tr, num_bins);
    747 
    748     return (error);
    749 }
    750 
    751 /**
    752 ******************************************************************************
    753 *
    754 *  @brief Flushes the cabac encoder engine as per section 9.3.4 figure 9-12
    755 *
    756 *  @par   Description
    757 *
    758 *
    759 *  @param[inout]   ps_cabac
    760 *  pointer to cabac context (handle)
    761 *
    762 *  @return      success or failure error code
    763 *
    764 ******************************************************************************
    765 */
    766 WORD32 ihevce_cabac_flush(cab_ctxt_t *ps_cabac, WORD32 i4_end_of_sub_strm)
    767 {
    768     UWORD32 u4_low = ps_cabac->u4_low;
    769     UWORD32 u4_bits_gen = ps_cabac->u4_bits_gen;
    770 
    771     UWORD8 *pu1_strm_buf = ps_cabac->pu1_strm_buffer;
    772     UWORD32 u4_strm_buf_offset = ps_cabac->u4_strm_buf_offset;
    773     WORD32 zero_run = ps_cabac->i4_zero_bytes_run;
    774     UWORD32 u4_out_standing_bytes = ps_cabac->u4_out_standing_bytes;
    775 
    776     (void)i4_end_of_sub_strm;
    777     /************************************************************************/
    778     /* Insert the carry (propogated in previous byte) along with            */
    779     /* outstanding bytes (if any) and flush remaining bits                  */
    780     /************************************************************************/
    781 
    782     //TODO: Review this function
    783     {
    784         /* carry = 1 => putbit(1); carry propogated due to L renorm */
    785         WORD32 carry = (u4_low >> (u4_bits_gen + CABAC_BITS)) & 0x1;
    786         WORD32 last_byte;
    787         WORD32 bits_left;
    788         WORD32 rem_bits;
    789 
    790         /*********************************************************************/
    791         /* Bitstream overflow check                                          */
    792         /* NOTE: corner case of epb bytes (max 2 for 32bit word) not handled */
    793         /*********************************************************************/
    794         if((u4_strm_buf_offset + u4_out_standing_bytes + 1) >= ps_cabac->u4_max_strm_size)
    795         {
    796             /* return without corrupting the buffer beyond its size */
    797             return (IHEVCE_BITSTREAM_BUFFER_OVERFLOW);
    798         }
    799 
    800         if(carry)
    801         {
    802             /* CORNER CASE: if the previous data is 0x000003, then EPB will be inserted
    803             and the data will become 0x00000303 and if the carry is present, it will
    804             be added with the last byte and it will become 0x00000304 which is not correct
    805             as per standard*/
    806             /* so check for previous four bytes and if it is equal to 0x00000303
    807             then subtract u4_strm_buf_offset by 1 */
    808             if(pu1_strm_buf[u4_strm_buf_offset - 1] == 0x03 &&
    809                pu1_strm_buf[u4_strm_buf_offset - 2] == 0x03 &&
    810                pu1_strm_buf[u4_strm_buf_offset - 3] == 0x00 &&
    811                pu1_strm_buf[u4_strm_buf_offset - 4] == 0x00)
    812             {
    813                 u4_strm_buf_offset -= 1;
    814             }
    815             /* previous byte carry add will not result in overflow to        */
    816             /* u4_strm_buf_offset - 2 as we track 0xff as outstanding bytes  */
    817             pu1_strm_buf[u4_strm_buf_offset - 1] += carry;
    818             zero_run = 0;
    819         }
    820 
    821         /*        Insert outstanding bytes (if any)         */
    822         while(u4_out_standing_bytes)
    823         {
    824             UWORD8 u1_0_or_ff = carry ? 0 : 0xFF;
    825 
    826             PUTBYTE_EPB(pu1_strm_buf, u4_strm_buf_offset, u1_0_or_ff, zero_run);
    827 
    828             u4_out_standing_bytes--;
    829         }
    830 
    831         /*  clear the carry in low */
    832         u4_low &= ((1 << (u4_bits_gen + CABAC_BITS)) - 1);
    833 
    834         /* extract the remaining bits;                                   */
    835         /* includes additional msb bit of low as per Figure 9-12      */
    836         bits_left = u4_bits_gen + 1;
    837         rem_bits = (u4_low >> (u4_bits_gen + CABAC_BITS - bits_left));
    838 
    839         if(bits_left >= 8)
    840         {
    841             last_byte = (rem_bits >> (bits_left - 8)) & 0xFF;
    842             PUTBYTE_EPB(pu1_strm_buf, u4_strm_buf_offset, last_byte, zero_run);
    843             bits_left -= 8;
    844         }
    845 
    846         /* insert last byte along with rbsp stop bit(1) and 0's in the end */
    847         last_byte = (rem_bits << (8 - bits_left)) | (1 << (7 - bits_left));
    848         last_byte &= 0xFF;
    849         PUTBYTE_EPB(pu1_strm_buf, u4_strm_buf_offset, last_byte, zero_run);
    850 
    851         /* update the state variables and return success */
    852         ps_cabac->u4_strm_buf_offset = u4_strm_buf_offset;
    853         ps_cabac->i4_zero_bytes_run = 0;
    854         return (IHEVCE_SUCCESS);
    855     }
    856 }
    857 
    858 /**
    859 ******************************************************************************
    860 *
    861 *  @brief API to backup cabac ctxt at end of 2nd CTB row which is used to init
    862 *   context at start of every row
    863 *
    864 *  @par   Description
    865 *         API to backup cabac ctxt at end of 2nd CTB row which is used to init
    866 *         context at start of every row
    867 *
    868 *  @param[inout]   ps_cabac
    869 *  pointer to cabac context (handle)
    870 *
    871 *  @return      success or failure error code
    872 *
    873 ******************************************************************************
    874 */
    875 WORD32 ihevce_cabac_ctxt_backup(cab_ctxt_t *ps_cabac)
    876 {
    877     memcpy(
    878         ps_cabac->au1_ctxt_models_top_right,
    879         ps_cabac->au1_ctxt_models,
    880         sizeof(ps_cabac->au1_ctxt_models));
    881     return (IHEVCE_SUCCESS);
    882 }
    883 
    884 /**
    885 ******************************************************************************
    886 *
    887 *  @brief Init cabac ctxt at every row start
    888 *
    889 *  @par   Description
    890 *         API to init cabac ctxt at start of every row when entropy sync is
    891 *         enabled
    892 *
    893 *  @param[inout]   ps_cabac
    894 *  pointer to cabac context (handle)
    895 *
    896 *  @return      success or failure error code
    897 *
    898 ******************************************************************************
    899 */
    900 WORD32 ihevce_cabac_ctxt_row_init(cab_ctxt_t *ps_cabac)
    901 {
    902     /* cabac engine initialization */
    903     ps_cabac->u4_low = 0;
    904     ps_cabac->u4_range = 510;
    905     ps_cabac->u4_bits_gen = 0;
    906     ps_cabac->u4_out_standing_bytes = 0;
    907     ps_cabac->i4_zero_bytes_run = 0;
    908 
    909     /*copy top right context as init context when starting to encode a row*/
    910     COPY_CABAC_STATES(
    911         ps_cabac->au1_ctxt_models, ps_cabac->au1_ctxt_models_top_right, IHEVC_CAB_CTXT_END);
    912 
    913     return (IHEVCE_SUCCESS);
    914 }
    915