LCOV - code coverage report
Current view: top level - media/libvpx/libvpx/vpx_dsp - bitreader.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 32 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 5 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
       3             :  *
       4             :  *  Use of this source code is governed by a BSD-style license
       5             :  *  that can be found in the LICENSE file in the root of the source
       6             :  *  tree. An additional intellectual property rights grant can be found
       7             :  *  in the file PATENTS.  All contributing project authors may
       8             :  *  be found in the AUTHORS file in the root of the source tree.
       9             :  */
      10             : 
      11             : #ifndef VPX_DSP_BITREADER_H_
      12             : #define VPX_DSP_BITREADER_H_
      13             : 
      14             : #include <stddef.h>
      15             : #include <limits.h>
      16             : 
      17             : #include "./vpx_config.h"
      18             : #include "vpx_ports/mem.h"
      19             : #include "vpx/vp8dx.h"
      20             : #include "vpx/vpx_integer.h"
      21             : #include "vpx_dsp/prob.h"
      22             : 
      23             : #ifdef __cplusplus
      24             : extern "C" {
      25             : #endif
      26             : 
      27             : typedef size_t BD_VALUE;
      28             : 
      29             : #define BD_VALUE_SIZE ((int)sizeof(BD_VALUE) * CHAR_BIT)
      30             : 
      31             : // This is meant to be a large, positive constant that can still be efficiently
      32             : // loaded as an immediate (on platforms like ARM, for example).
      33             : // Even relatively modest values like 100 would work fine.
      34             : #define LOTS_OF_BITS 0x40000000
      35             : 
      36             : typedef struct {
      37             :   // Be careful when reordering this struct, it may impact the cache negatively.
      38             :   BD_VALUE value;
      39             :   unsigned int range;
      40             :   int count;
      41             :   const uint8_t *buffer_end;
      42             :   const uint8_t *buffer;
      43             :   vpx_decrypt_cb decrypt_cb;
      44             :   void *decrypt_state;
      45             :   uint8_t clear_buffer[sizeof(BD_VALUE) + 1];
      46             : } vpx_reader;
      47             : 
      48             : int vpx_reader_init(vpx_reader *r, const uint8_t *buffer, size_t size,
      49             :                     vpx_decrypt_cb decrypt_cb, void *decrypt_state);
      50             : 
      51             : void vpx_reader_fill(vpx_reader *r);
      52             : 
      53             : const uint8_t *vpx_reader_find_end(vpx_reader *r);
      54             : 
      55           0 : static INLINE int vpx_reader_has_error(vpx_reader *r) {
      56             :   // Check if we have reached the end of the buffer.
      57             :   //
      58             :   // Variable 'count' stores the number of bits in the 'value' buffer, minus
      59             :   // 8. The top byte is part of the algorithm, and the remainder is buffered
      60             :   // to be shifted into it. So if count == 8, the top 16 bits of 'value' are
      61             :   // occupied, 8 for the algorithm and 8 in the buffer.
      62             :   //
      63             :   // When reading a byte from the user's buffer, count is filled with 8 and
      64             :   // one byte is filled into the value buffer. When we reach the end of the
      65             :   // data, count is additionally filled with LOTS_OF_BITS. So when
      66             :   // count == LOTS_OF_BITS - 1, the user's data has been exhausted.
      67             :   //
      68             :   // 1 if we have tried to decode bits after the end of stream was encountered.
      69             :   // 0 No error.
      70           0 :   return r->count > BD_VALUE_SIZE && r->count < LOTS_OF_BITS;
      71             : }
      72             : 
      73           0 : static INLINE int vpx_read(vpx_reader *r, int prob) {
      74           0 :   unsigned int bit = 0;
      75             :   BD_VALUE value;
      76             :   BD_VALUE bigsplit;
      77             :   int count;
      78             :   unsigned int range;
      79           0 :   unsigned int split = (r->range * prob + (256 - prob)) >> CHAR_BIT;
      80             : 
      81           0 :   if (r->count < 0) vpx_reader_fill(r);
      82             : 
      83           0 :   value = r->value;
      84           0 :   count = r->count;
      85             : 
      86           0 :   bigsplit = (BD_VALUE)split << (BD_VALUE_SIZE - CHAR_BIT);
      87             : 
      88           0 :   range = split;
      89             : 
      90           0 :   if (value >= bigsplit) {
      91           0 :     range = r->range - split;
      92           0 :     value = value - bigsplit;
      93           0 :     bit = 1;
      94             :   }
      95             : 
      96             :   {
      97           0 :     register int shift = vpx_norm[range];
      98           0 :     range <<= shift;
      99           0 :     value <<= shift;
     100           0 :     count -= shift;
     101             :   }
     102           0 :   r->value = value;
     103           0 :   r->count = count;
     104           0 :   r->range = range;
     105             : 
     106           0 :   return bit;
     107             : }
     108             : 
     109           0 : static INLINE int vpx_read_bit(vpx_reader *r) {
     110           0 :   return vpx_read(r, 128);  // vpx_prob_half
     111             : }
     112             : 
     113           0 : static INLINE int vpx_read_literal(vpx_reader *r, int bits) {
     114           0 :   int literal = 0, bit;
     115             : 
     116           0 :   for (bit = bits - 1; bit >= 0; bit--) literal |= vpx_read_bit(r) << bit;
     117             : 
     118           0 :   return literal;
     119             : }
     120             : 
     121           0 : static INLINE int vpx_read_tree(vpx_reader *r, const vpx_tree_index *tree,
     122             :                                 const vpx_prob *probs) {
     123           0 :   vpx_tree_index i = 0;
     124             : 
     125           0 :   while ((i = tree[i + vpx_read(r, probs[i >> 1])]) > 0) continue;
     126             : 
     127           0 :   return -i;
     128             : }
     129             : 
     130             : #ifdef __cplusplus
     131             : }  // extern "C"
     132             : #endif
     133             : 
     134             : #endif  // VPX_DSP_BITREADER_H_

Generated by: LCOV version 1.13