Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2 *
      3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
      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 /**
     19 *******************************************************************************
     20 * @file
     21 *  ihevcd_bitstream.c
     22 *
     23 * @brief
     24 *  Contains functions for bitstream access
     25 *
     26 * @author
     27 *  Harish
     28 *
     29 * @par List of Functions:
     30 * - ihevcd_bits_init()
     31 * - ihevcd_bits_flush()
     32 * - ihevcd_bits_flush_to_byte_boundary()
     33 * - ihevcd_bits_nxt()
     34 * - ihevcd_bits_nxt32()
     35 * - ihevcd_bits_get()
     36 * - ihevcd_bits_num_bits_remaining()
     37 * - ihevcd_bits_num_bits_consumed()
     38 * - ihevcd_sev()
     39 * - ihevcd_uev()
     40 *
     41 *
     42 * @remarks
     43 *  None
     44 *
     45 *******************************************************************************
     46 */
     47 /*****************************************************************************/
     48 /* File Includes                                                             */
     49 /*****************************************************************************/
     50 #include <stdio.h>
     51 #include <stddef.h>
     52 #include <stdlib.h>
     53 #include <string.h>
     54 #include <assert.h>
     55 #include "ihevc_typedefs.h"
     56 #include "iv.h"
     57 #include "ivd.h"
     58 #include "ihevcd_cxa.h"
     59 
     60 #include "ihevc_defs.h"
     61 #include "ihevc_debug.h"
     62 #include "ihevc_structs.h"
     63 #include "ihevc_macros.h"
     64 #include "ihevc_platform_macros.h"
     65 #include "ihevc_cabac_tables.h"
     66 
     67 #include "ihevcd_defs.h"
     68 #include "ihevcd_function_selector.h"
     69 #include "ihevcd_structs.h"
     70 #include "ihevcd_error.h"
     71 #include "ihevcd_bitstream.h"
     72 
     73 /*****************************************************************************/
     74 /* Function Prototypes                                                       */
     75 /*****************************************************************************/
     76 
     77 /**
     78 *******************************************************************************
     79 *
     80 * @brief
     81 *  Function used for bitstream structure initialization
     82 *
     83 * @par Description:
     84 *  Initialize bitstream structure elements
     85 *
     86 * @param[in] ps_bitstrm
     87 *  Pointer to bitstream structure
     88 *
     89 * @param[in] pu1_buf
     90 *  Pointer to bitstream data
     91 *
     92 * @param[in] u4_numbytes
     93 *  Number of bytes in bitstream
     94 *
     95 * @returns  none
     96 *
     97 * @remarks
     98 *  Assumes pu1_buf is aligned to 4 bytes. If not aligned  then all bitstream
     99 * accesses will be unaligned and hence  costlier. Since this is codec memory
    100 * that holds emulation prevented data, assumption of aligned to 4 bytes is
    101 * valid
    102 *
    103 *******************************************************************************
    104 */
    105 void ihevcd_bits_init(bitstrm_t *ps_bitstrm,
    106                       UWORD8 *pu1_buf,
    107                       UWORD32 u4_numbytes)
    108 {
    109     UWORD32 u4_cur_word;
    110     UWORD32 u4_nxt_word;
    111     UWORD32 u4_temp;
    112     UWORD32 *pu4_buf;
    113 
    114     pu4_buf     = (UWORD32 *)pu1_buf;
    115     u4_temp = *pu4_buf++;
    116     u4_cur_word = ITT_BIG_ENDIAN(u4_temp);
    117     u4_temp = *pu4_buf++;
    118     u4_nxt_word = ITT_BIG_ENDIAN(u4_temp);
    119 
    120     ps_bitstrm->u4_bit_ofst     = 0;
    121     ps_bitstrm->pu1_buf_base    = pu1_buf;
    122     ps_bitstrm->pu4_buf         = pu4_buf;
    123     ps_bitstrm->u4_cur_word     = u4_cur_word;
    124     ps_bitstrm->u4_nxt_word     = u4_nxt_word;
    125 
    126     ps_bitstrm->pu1_buf_max     = pu1_buf + u4_numbytes + 8;
    127 
    128     return;
    129 }
    130 
    131 /**
    132 *******************************************************************************
    133 *
    134 * @brief
    135 *  Flushes given number of bits. Bits consumed increases by  this number
    136 *
    137 * @par Description:
    138 *  Increment bit offset by numbits. If bit offset increases  beyond 32, then
    139 * move nxt_word to cur_word, read next  word32 to nxt_word after endian
    140 * conversion
    141 *
    142 * @param[in] ps_bitstrm
    143 *  Pointer to bitstream structure
    144 *
    145 * @param[in] u4_numbits
    146 *  Number of bits to be flushed
    147 *
    148 * @returns  None
    149 *
    150 * @remarks
    151 *
    152 *
    153 *******************************************************************************
    154 */
    155 void ihevcd_bits_flush(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
    156 {
    157 
    158     BITS_FLUSH(ps_bitstrm->pu4_buf,
    159                ps_bitstrm->u4_bit_ofst,
    160                ps_bitstrm->u4_cur_word,
    161                ps_bitstrm->u4_nxt_word,
    162                u4_numbits);
    163 
    164     return;
    165 }
    166 
    167 /**
    168 *******************************************************************************
    169 *
    170 * @brief
    171 *  Flushes to next byte boundary.Bits consumed increases by  this number
    172 *
    173 * @par Description:
    174 *  Compute number of bits remaining in the current byte  then call
    175 * ihevcd_bits_flush() bits with this number
    176 *
    177 * @param[in] ps_bitstrm
    178 *  Pointer to bitstream structure
    179 *
    180 * @returns  None
    181 *
    182 * @remarks
    183 *
    184 *
    185 *******************************************************************************
    186 */
    187 void ihevcd_bits_flush_to_byte_boundary(bitstrm_t *ps_bitstrm)
    188 {
    189     UWORD32 u4_numbits;
    190     u4_numbits = (ps_bitstrm->u4_bit_ofst) & 7;
    191 
    192     u4_numbits = 8 - u4_numbits;
    193 
    194     BITS_FLUSH(ps_bitstrm->pu4_buf,
    195                ps_bitstrm->u4_bit_ofst,
    196                ps_bitstrm->u4_cur_word,
    197                ps_bitstrm->u4_nxt_word,
    198                u4_numbits);
    199 
    200     return;
    201 }
    202 
    203 /**
    204 *******************************************************************************
    205 *
    206 * @brief
    207 *  Seeks by given number of bits in the bitstream from current position
    208 *
    209 * @par Description:
    210 *  Add given number of bits to bitstream offset and update pu4_buf, cur_word and
    211 *  nxt_word accordingly
    212 *
    213 * @param[in] ps_bitstrm
    214 *  Pointer to bitstream structure
    215 *
    216 * @param[in] numbits
    217 *  Number of bits to seek
    218 *
    219 * @returns  None
    220 *
    221 * @remarks
    222 * Assumes emulation prevention has been done before and the buffer does not
    223 * contain any emulation prevention bytes
    224 *
    225 *******************************************************************************
    226 */
    227 void ihevcd_bits_seek(bitstrm_t *ps_bitstrm, WORD32 numbits)
    228 {
    229     WORD32 val;
    230     ASSERT(numbits >= -32);
    231     ASSERT(numbits <= 32);
    232     /* Check if Seeking backwards*/
    233     if(numbits < 0)
    234     {
    235         UWORD32 abs_numbits = -numbits;
    236         if(ps_bitstrm->u4_bit_ofst >= abs_numbits)
    237         {
    238             /* If the current offset is greater than number of bits to seek back,
    239              * then subtract abs_numbits from offset and return.
    240              */
    241             ps_bitstrm->u4_bit_ofst -= abs_numbits;
    242             return;
    243         }
    244         else
    245         {
    246             /* If the current offset is lesser than number of bits to seek back,
    247              * then subtract abs_numbits from offset and add 32 and move cur_word to nxt_word
    248              * and load cur_word appropriately and decrement pu4_buf
    249              */
    250             ps_bitstrm->u4_bit_ofst -= abs_numbits;
    251             ps_bitstrm->u4_bit_ofst += 32;
    252             ps_bitstrm->pu4_buf--;
    253 
    254             val = *(ps_bitstrm->pu4_buf - 2);
    255             ps_bitstrm->u4_nxt_word = ps_bitstrm->u4_cur_word;
    256             ps_bitstrm->u4_cur_word = ITT_BIG_ENDIAN(val);
    257             return;
    258         }
    259     }
    260     else
    261     {
    262         /* Not supported/tested currently */
    263         ASSERT(1);
    264         BITS_FLUSH(ps_bitstrm->pu4_buf,
    265                    ps_bitstrm->u4_bit_ofst,
    266                    ps_bitstrm->u4_cur_word,
    267                    ps_bitstrm->u4_nxt_word,
    268                    numbits);
    269 
    270 
    271     }
    272     return;
    273 }
    274 /**
    275 *******************************************************************************
    276 *
    277 * @brief
    278 *  Snoops for next numbits number of bits from the bitstream this does not
    279 * update the bitstream offset and does not  consume the bits
    280 *
    281 * @par Description:
    282 *  Extract required number of bits from cur_word & nxt_word  return these
    283 * bits
    284 *
    285 * @param[in] ps_bitstrm
    286 *  Pointer to bitstream structure
    287 *
    288 * @param[in] u4_numbits
    289 *  Number of bits
    290 *
    291 * @returns  Next u4_numbits number of bits
    292 *
    293 * @remarks
    294 *
    295 *
    296 *******************************************************************************
    297 */
    298 UWORD32 ihevcd_bits_nxt(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
    299 {
    300     UWORD32 u4_bits_read;
    301 
    302     BITS_NXT(u4_bits_read,
    303              ps_bitstrm->pu4_buf,
    304              ps_bitstrm->u4_bit_ofst,
    305              ps_bitstrm->u4_cur_word,
    306              ps_bitstrm->u4_nxt_word,
    307              u4_numbits);
    308     return u4_bits_read;
    309 }
    310 /**
    311 *******************************************************************************
    312 *
    313 * @brief
    314 *  Snoops for next 32 bits from the bitstream  this does not update the
    315 * bitstream offset and does not  consume the bits
    316 *
    317 * @par Description:
    318 *  Extract required number of bits from cur_word & nxt_word  return these
    319 * bits
    320 *
    321 * @param[in] ps_bitstrm
    322 *  Pointer to bitstream structure
    323 *
    324 * @param[in] u4_numbits
    325 *  Number of bits
    326 *
    327 * @returns  Next 32 bits
    328 *
    329 * @remarks
    330 *
    331 *
    332 *******************************************************************************
    333 */
    334 UWORD32 ihevcd_bits_nxt32(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
    335 {
    336     UWORD32 u4_bits_read;
    337     UNUSED(u4_numbits);
    338     BITS_NXT32(u4_bits_read,
    339                ps_bitstrm->pu4_buf,
    340                ps_bitstrm->u4_bit_ofst,
    341                ps_bitstrm->u4_cur_word,
    342                ps_bitstrm->u4_nxt_word);
    343     return u4_bits_read;
    344 }
    345 
    346 /**
    347 *******************************************************************************
    348 *
    349 * @brief
    350 *  Reads next numbits number of bits from the bitstream  this updates the
    351 * bitstream offset and consumes the bits
    352 *
    353 * @par Description:
    354 *  Extract required number of bits from cur_word & nxt_word  return these
    355 * bits
    356 *
    357 * @param[in] ps_bitstrm
    358 *  Pointer to bitstream structure
    359 *
    360 * @param[in] u4_numbits
    361 *  Number of bits
    362 *
    363 * @returns  Bits read
    364 *
    365 * @remarks
    366 *
    367 *
    368 *******************************************************************************
    369 */
    370 UWORD32 ihevcd_bits_get(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
    371 {
    372     UWORD32 u4_bits_read;
    373 
    374     BITS_GET(u4_bits_read,
    375              ps_bitstrm->pu4_buf,
    376              ps_bitstrm->u4_bit_ofst,
    377              ps_bitstrm->u4_cur_word,
    378              ps_bitstrm->u4_nxt_word,
    379              u4_numbits);
    380     return u4_bits_read;
    381 
    382 }
    383 
    384 /**
    385 *******************************************************************************
    386 *
    387 * @brief
    388 *  Returns the number of bits remaining in the bitstream
    389 *
    390 * @par Description:
    391 *  Compute number of bits remaining based on current pointer and buffer base
    392 * and current offset. Since 8 bytes are  read at the start into cur_word and
    393 * nxt_word and are not  consumed, 8 has to be subtracted
    394 *
    395 * @param[in] ps_bitstrm
    396 *  Pointer to bitstream structure
    397 *
    398 * @returns  Total number of bits remaining
    399 *
    400 * @remarks
    401 *
    402 *
    403 *******************************************************************************
    404 */
    405 UWORD32  ihevcd_bits_num_bits_remaining(bitstrm_t *ps_bitstrm)
    406 {
    407     UWORD32 u4_bits_consumed;
    408     UWORD32 u4_size_in_bits;
    409 
    410     /* 8 bytes are read in cur_word and nxt_word at the start. Hence */
    411     /* subtract 8 bytes */
    412     u4_bits_consumed = (UWORD32)(((UWORD8 *)ps_bitstrm->pu4_buf -
    413                                   (UWORD8 *)ps_bitstrm->pu1_buf_base - 8) <<
    414                                  3) + ps_bitstrm->u4_bit_ofst;
    415 
    416     u4_size_in_bits = (UWORD32)(ps_bitstrm->pu1_buf_max -
    417                     ps_bitstrm->pu1_buf_base) - 8;
    418     u4_size_in_bits <<= 3;
    419     if(u4_size_in_bits > u4_bits_consumed)
    420     {
    421         return (u4_size_in_bits - u4_bits_consumed);
    422     }
    423     else
    424     {
    425         return 0;
    426     }
    427 }
    428 
    429 /**
    430 *******************************************************************************
    431 *
    432 * @brief
    433 *  Returns the number of bits consumed in the bitstream
    434 *
    435 * @par Description:
    436 *  Compute number of bits consumed based on current pointer  and buffer base
    437 * and current offset. Since 8 bytes are  read at the start into cur_word and
    438 * nxt_word and are not  consumed, 8 has to be subtracted
    439 *
    440 * @param[in] ps_bitstrm
    441 *  Pointer to bitstream structure
    442 *
    443 * @returns  Total number of bits bits consumed
    444 *
    445 * @remarks
    446 *
    447 *
    448 *******************************************************************************
    449 */
    450 UWORD32  ihevcd_bits_num_bits_consumed(bitstrm_t *ps_bitstrm)
    451 {
    452     UWORD32 u4_bits_consumed;
    453     /* 8 bytes are read in cur_word and nxt_word at the start. Hence */
    454     /* subtract 8 bytes */
    455 
    456     u4_bits_consumed = (UWORD32)(((UWORD8 *)ps_bitstrm->pu4_buf -
    457                                   (UWORD8 *)ps_bitstrm->pu1_buf_base - 8) <<
    458                                  3) + ps_bitstrm->u4_bit_ofst;
    459     return u4_bits_consumed;
    460 }
    461 
    462 /**
    463 *******************************************************************************
    464 *
    465 * @brief
    466 *  Reads unsigned integer 0-th order exp-golomb-coded syntax element from
    467 * the bitstream  Section: 9.2
    468 *
    469 * @par Description:
    470 *  Extract required number of bits from cur_word & nxt_word  return these
    471 * bits
    472 *
    473 * @param[in] ps_bitstrm
    474 *  Pointer to bitstream structure
    475 *
    476 * @returns  UEV decoded syntax element
    477 *
    478 * @remarks
    479 *
    480 *
    481 *******************************************************************************
    482 */
    483 UWORD32 ihevcd_uev(bitstrm_t *ps_bitstrm)
    484 {
    485     UWORD32 u4_bits_read;
    486     UWORD32 u4_clz;
    487 
    488 
    489     /***************************************************************/
    490     /* Find leading zeros in next 32 bits                          */
    491     /***************************************************************/
    492     BITS_NXT32(u4_bits_read,
    493                ps_bitstrm->pu4_buf,
    494                ps_bitstrm->u4_bit_ofst,
    495                ps_bitstrm->u4_cur_word,
    496                ps_bitstrm->u4_nxt_word);
    497 
    498 
    499     u4_clz = CLZ(u4_bits_read);
    500 
    501     BITS_FLUSH(ps_bitstrm->pu4_buf,
    502                ps_bitstrm->u4_bit_ofst,
    503                ps_bitstrm->u4_cur_word,
    504                ps_bitstrm->u4_nxt_word,
    505                (u4_clz + 1));
    506 
    507     u4_bits_read = 0;
    508     if(u4_clz)
    509     {
    510         BITS_GET(u4_bits_read,
    511                  ps_bitstrm->pu4_buf,
    512                  ps_bitstrm->u4_bit_ofst,
    513                  ps_bitstrm->u4_cur_word,
    514                  ps_bitstrm->u4_nxt_word,
    515                  u4_clz);
    516     }
    517     return ((1 << u4_clz) + u4_bits_read - 1);
    518 
    519 }
    520 
    521 /**
    522 *******************************************************************************
    523 *
    524 * @brief
    525 *  Reads signed integer 0-th order exp-golomb-coded syntax  element from the
    526 * bitstream. Function similar to get_uev  Section: 9.2.1
    527 *
    528 * @par Description:
    529 *  Extract required number of bits from cur_word & nxt_word  return these
    530 * bits
    531 *
    532 * @param[in] ps_bitstrm
    533 *  Pointer to bitstream structure
    534 *
    535 * @returns  UEV decoded syntax element
    536 *
    537 * @remarks
    538 *
    539 *
    540 *******************************************************************************
    541 */
    542 WORD32 ihevcd_sev(bitstrm_t *ps_bitstrm)
    543 {
    544     UWORD32 u4_bits_read;
    545     UWORD32 u4_clz;
    546     UWORD32 u4_abs_val;
    547 
    548 
    549     /***************************************************************/
    550     /* Find leading zeros in next 32 bits                          */
    551     /***************************************************************/
    552     BITS_NXT32(u4_bits_read,
    553                ps_bitstrm->pu4_buf,
    554                ps_bitstrm->u4_bit_ofst,
    555                ps_bitstrm->u4_cur_word,
    556                ps_bitstrm->u4_nxt_word);
    557 
    558 
    559     u4_clz = CLZ(u4_bits_read);
    560 
    561     BITS_FLUSH(ps_bitstrm->pu4_buf,
    562                ps_bitstrm->u4_bit_ofst,
    563                ps_bitstrm->u4_cur_word,
    564                ps_bitstrm->u4_nxt_word,
    565                (u4_clz + 1));
    566 
    567     u4_bits_read = 0;
    568     if(u4_clz)
    569     {
    570         BITS_GET(u4_bits_read,
    571                  ps_bitstrm->pu4_buf,
    572                  ps_bitstrm->u4_bit_ofst,
    573                  ps_bitstrm->u4_cur_word,
    574                  ps_bitstrm->u4_nxt_word,
    575                  u4_clz);
    576     }
    577     u4_abs_val = ((1 << u4_clz) + u4_bits_read) >> 1;
    578     if(u4_bits_read & 0x1)
    579         return (-(WORD32)u4_abs_val);
    580     else
    581         return (u4_abs_val);
    582 }
    583 
    584 
    585 
    586 
    587 
    588 
    589