15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/bit_reader_core.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <base/port.h> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <base/sys_byteorder.h> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kRegWidthInBits = sizeof(uint64) * 8; 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BitReaderCore::ByteStreamProvider::ByteStreamProvider() { 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BitReaderCore::ByteStreamProvider::~ByteStreamProvider() { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BitReaderCore::BitReaderCore(ByteStreamProvider* byte_stream_provider) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : byte_stream_provider_(byte_stream_provider), 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bits_read_(0), 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_(0), 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_(0), 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_next_(0), 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_next_(0) { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BitReaderCore::~BitReaderCore() { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BitReaderCore::ReadFlag(bool* flag) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (nbits_ == 0 && !Refill(1)) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *flag = (reg_ & (GG_UINT64_C(1) << (kRegWidthInBits - 1))) != 0; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_ <<= 1; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_--; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bits_read_++; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int BitReaderCore::PeekBitsMsbAligned(int num_bits, uint64* out) { 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Try to have at least |num_bits| in the bit register. 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (nbits_ < num_bits) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Refill(num_bits); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out = reg_; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return nbits_; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BitReaderCore::SkipBitsSmall(int num_bits) { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_GE(num_bits, 0); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 dummy; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (num_bits >= kRegWidthInBits) { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ReadBitsInternal(kRegWidthInBits, &dummy)) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_bits -= kRegWidthInBits; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ReadBitsInternal(num_bits, &dummy); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BitReaderCore::SkipBits(int num_bits) { 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_GE(num_bits, 0); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int remaining_bits = nbits_ + nbits_next_; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (remaining_bits >= num_bits) 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return SkipBitsSmall(num_bits); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Skip first the remaining available bits. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci num_bits -= remaining_bits; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bits_read_ += remaining_bits; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nbits_ = 0; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reg_ = 0; 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nbits_next_ = 0; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reg_next_ = 0; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Next, skip an integer number of bytes. 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int nbytes = num_bits / 8; 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (nbytes > 0) { 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint8* byte_stream_window; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int window_size = 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci byte_stream_provider_->GetBytes(nbytes, &byte_stream_window); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_GE(window_size, 0); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_LE(window_size, nbytes); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (window_size < nbytes) 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci num_bits -= 8 * nbytes; 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bits_read_ += 8 * nbytes; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Skip the remaining bits. 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return SkipBitsSmall(num_bits); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int BitReaderCore::bits_read() const { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return bits_read_; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BitReaderCore::ReadBitsInternal(int num_bits, uint64* out) { 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_GE(num_bits, 0); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (num_bits == 0) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out = 0; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (num_bits > nbits_ && !Refill(num_bits)) { 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Any subsequent ReadBits should fail: 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // empty the current bit register for that purpose. 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_ = 0; 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_ = 0; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bits_read_ += num_bits; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (num_bits == kRegWidthInBits) { 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Special case needed since for example for a 64 bit integer "a" 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // "a << 64" is not defined by the C/C++ standard. 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out = reg_; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_ = 0; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_ = 0; 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out = reg_ >> (kRegWidthInBits - num_bits); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_ <<= num_bits; 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_ -= num_bits; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BitReaderCore::Refill(int min_nbits) { 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_LE(min_nbits, kRegWidthInBits); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Transfer from the next to the current register. 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RefillCurrentRegister(); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (min_nbits <= nbits_) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(nbits_next_, 0); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(reg_next_, 0u); 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Max number of bytes to refill. 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int max_nbytes = sizeof(reg_next_); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Refill. 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* byte_stream_window; 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int window_size = 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) byte_stream_provider_->GetBytes(max_nbytes, &byte_stream_window); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_GE(window_size, 0); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_LE(window_size, max_nbytes); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (window_size == 0) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_next_ = 0; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(®_next_, byte_stream_window, window_size); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_next_ = base::NetToHost64(reg_next_); 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_next_ = window_size * 8; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Transfer from the next to the current register. 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RefillCurrentRegister(); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (nbits_ >= min_nbits); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BitReaderCore::RefillCurrentRegister() { 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // No refill possible if the destination register is full 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // or the source register is empty. 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (nbits_ == kRegWidthInBits || nbits_next_ == 0) 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_ |= (reg_next_ >> nbits_); 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int free_nbits = kRegWidthInBits - nbits_; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (free_nbits >= nbits_next_) { 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_ += nbits_next_; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_next_ = 0; 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_next_ = 0; 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_ += free_nbits; 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reg_next_ <<= free_nbits; 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nbits_next_ -= free_nbits; 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 190