1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "dboolhuff.h" 13693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "vp8/common/common.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8dx_start_decode(BOOL_DECODER *br, 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *source, 17ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org unsigned int source_sz, 18693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_decrypt_cb decrypt_cb, 196ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com void *decrypt_state) 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org br->user_buffer_end = source+source_sz; 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org br->user_buffer = source; 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org br->value = 0; 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org br->count = -8; 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org br->range = 255; 266ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com br->decrypt_cb = decrypt_cb; 276ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com br->decrypt_state = decrypt_state; 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (source_sz && !source) 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return 1; 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Populate the buffer */ 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8dx_bool_decoder_fill(br); 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return 0; 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8dx_bool_decoder_fill(BOOL_DECODER *br) 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 404b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org const unsigned char *bufptr = br->user_buffer; 414b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org VP8_BD_VALUE value = br->value; 424b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org int count = br->count; 43693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com int shift = VP8_BD_VALUE_SIZE - CHAR_BIT - (count + CHAR_BIT); 446ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com size_t bytes_left = br->user_buffer_end - bufptr; 456ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com size_t bits_left = bytes_left * CHAR_BIT; 464b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org int x = (int)(shift + CHAR_BIT - bits_left); 474b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org int loop_end = 0; 486ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com unsigned char decrypted[sizeof(VP8_BD_VALUE) + 1]; 496ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com 506ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (br->decrypt_cb) { 51693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com size_t n = MIN(sizeof(decrypted), bytes_left); 527c1508f4449fe8184aa045737c20ba37e603dd03fgalligan@chromium.org br->decrypt_cb(br->decrypt_state, bufptr, decrypted, (int)n); 536ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com bufptr = decrypted; 546ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com } 554b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org 564b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org if(x >= 0) 574b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org { 584b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org count += VP8_LOTS_OF_BITS; 594b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org loop_end = x; 604b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org } 614b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org 624b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org if (x < 0 || bits_left) 634b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org { 644b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org while(shift >= loop_end) 654b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org { 664b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org count += CHAR_BIT; 676ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com value |= (VP8_BD_VALUE)*bufptr << shift; 68ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org ++bufptr; 696ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com ++br->user_buffer; 704b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org shift -= CHAR_BIT; 714b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org } 724b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org } 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org br->value = value; 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org br->count = count; 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 77