media/libvpx/vp8/decoder/dboolhuff.c

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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  */
    12 #include "dboolhuff.h"
    14 int vp8dx_start_decode(BOOL_DECODER *br,
    15                        const unsigned char *source,
    16                        unsigned int source_sz,
    17                        vp8_decrypt_cb *decrypt_cb,
    18                        void *decrypt_state)
    19 {
    20     br->user_buffer_end = source+source_sz;
    21     br->user_buffer     = source;
    22     br->value    = 0;
    23     br->count    = -8;
    24     br->range    = 255;
    25     br->decrypt_cb = decrypt_cb;
    26     br->decrypt_state = decrypt_state;
    28     if (source_sz && !source)
    29         return 1;
    31     /* Populate the buffer */
    32     vp8dx_bool_decoder_fill(br);
    34     return 0;
    35 }
    37 void vp8dx_bool_decoder_fill(BOOL_DECODER *br)
    38 {
    39     const unsigned char *bufptr = br->user_buffer;
    40     VP8_BD_VALUE value = br->value;
    41     int count = br->count;
    42     int shift = VP8_BD_VALUE_SIZE - 8 - (count + 8);
    43     size_t bytes_left = br->user_buffer_end - bufptr;
    44     size_t bits_left = bytes_left * CHAR_BIT;
    45     int x = (int)(shift + CHAR_BIT - bits_left);
    46     int loop_end = 0;
    47     unsigned char decrypted[sizeof(VP8_BD_VALUE) + 1];
    49     if (br->decrypt_cb) {
    50         size_t n = bytes_left > sizeof(decrypted) ? sizeof(decrypted) : bytes_left;
    51         br->decrypt_cb(br->decrypt_state, bufptr, decrypted, (int)n);
    52         bufptr = decrypted;
    53     }
    55     if(x >= 0)
    56     {
    57         count += VP8_LOTS_OF_BITS;
    58         loop_end = x;
    59     }
    61     if (x < 0 || bits_left)
    62     {
    63         while(shift >= loop_end)
    64         {
    65             count += CHAR_BIT;
    66             value |= (VP8_BD_VALUE)*bufptr << shift;
    67             ++bufptr;
    68             ++br->user_buffer;
    69             shift -= CHAR_BIT;
    70         }
    71     }
    73     br->value = value;
    74     br->count = count;
    75 }

mercurial