media/libvpx/vp9/decoder/vp9_read_bit_buffer.h

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /*
     2  *  Copyright (c) 2013 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  */
    11 #ifndef VP9_DECODER_VP9_READ_BIT_BUFFER_H_
    12 #define VP9_DECODER_VP9_READ_BIT_BUFFER_H_
    14 #include <limits.h>
    16 #include "vpx/vpx_integer.h"
    18 typedef void (*vp9_rb_error_handler)(void *data, size_t bit_offset);
    20 struct vp9_read_bit_buffer {
    21   const uint8_t *bit_buffer;
    22   const uint8_t *bit_buffer_end;
    23   size_t bit_offset;
    25   void *error_handler_data;
    26   vp9_rb_error_handler error_handler;
    27 };
    29 static size_t vp9_rb_bytes_read(struct vp9_read_bit_buffer *rb) {
    30   return rb->bit_offset / CHAR_BIT + (rb->bit_offset % CHAR_BIT > 0);
    31 }
    33 static int vp9_rb_read_bit(struct vp9_read_bit_buffer *rb) {
    34   const size_t off = rb->bit_offset;
    35   const size_t p = off / CHAR_BIT;
    36   const int q = CHAR_BIT - 1 - (int)off % CHAR_BIT;
    37   if (rb->bit_buffer + p >= rb->bit_buffer_end) {
    38     rb->error_handler(rb->error_handler_data, rb->bit_offset);
    39     return 0;
    40   } else {
    41     const int bit = (rb->bit_buffer[p] & (1 << q)) >> q;
    42     rb->bit_offset = off + 1;
    43     return bit;
    44   }
    45 }
    47 static int vp9_rb_read_literal(struct vp9_read_bit_buffer *rb, int bits) {
    48   int value = 0, bit;
    49   for (bit = bits - 1; bit >= 0; bit--)
    50     value |= vp9_rb_read_bit(rb) << bit;
    51   return value;
    52 }
    54 static int vp9_rb_read_signed_literal(struct vp9_read_bit_buffer *rb,
    55                                       int bits) {
    56   const int value = vp9_rb_read_literal(rb, bits);
    57   return vp9_rb_read_bit(rb) ? -value : value;
    58 }
    60 #endif  // VP9_DECODER_VP9_READ_BIT_BUFFER_H_

mercurial