1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved. 2*103e46e4SHarish Mahendrakar // 3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license 4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source 5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found 6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may 7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree. 8*103e46e4SHarish Mahendrakar #include "webm/buffer_reader.h" 9*103e46e4SHarish Mahendrakar 10*103e46e4SHarish Mahendrakar #include <algorithm> 11*103e46e4SHarish Mahendrakar #include <cassert> 12*103e46e4SHarish Mahendrakar #include <cstddef> 13*103e46e4SHarish Mahendrakar #include <cstdint> 14*103e46e4SHarish Mahendrakar #include <initializer_list> 15*103e46e4SHarish Mahendrakar #include <utility> 16*103e46e4SHarish Mahendrakar #include <vector> 17*103e46e4SHarish Mahendrakar 18*103e46e4SHarish Mahendrakar #include "webm/status.h" 19*103e46e4SHarish Mahendrakar 20*103e46e4SHarish Mahendrakar namespace webm { 21*103e46e4SHarish Mahendrakar BufferReader(std::initializer_list<std::uint8_t> bytes)22*103e46e4SHarish MahendrakarBufferReader::BufferReader(std::initializer_list<std::uint8_t> bytes) 23*103e46e4SHarish Mahendrakar : data_(bytes) {} 24*103e46e4SHarish Mahendrakar BufferReader(const std::vector<std::uint8_t> & vector)25*103e46e4SHarish MahendrakarBufferReader::BufferReader(const std::vector<std::uint8_t>& vector) 26*103e46e4SHarish Mahendrakar : data_(vector) {} 27*103e46e4SHarish Mahendrakar BufferReader(std::vector<std::uint8_t> && vector)28*103e46e4SHarish MahendrakarBufferReader::BufferReader(std::vector<std::uint8_t>&& vector) 29*103e46e4SHarish Mahendrakar : data_(std::move(vector)) {} 30*103e46e4SHarish Mahendrakar BufferReader(BufferReader && other)31*103e46e4SHarish MahendrakarBufferReader::BufferReader(BufferReader&& other) 32*103e46e4SHarish Mahendrakar : data_(std::move(other.data_)), pos_(other.pos_) { 33*103e46e4SHarish Mahendrakar other.pos_ = 0; 34*103e46e4SHarish Mahendrakar } 35*103e46e4SHarish Mahendrakar operator =(BufferReader && other)36*103e46e4SHarish MahendrakarBufferReader& BufferReader::operator=(BufferReader&& other) { 37*103e46e4SHarish Mahendrakar if (this != &other) { 38*103e46e4SHarish Mahendrakar data_ = std::move(other.data_); 39*103e46e4SHarish Mahendrakar pos_ = other.pos_; 40*103e46e4SHarish Mahendrakar other.pos_ = 0; 41*103e46e4SHarish Mahendrakar } 42*103e46e4SHarish Mahendrakar return *this; 43*103e46e4SHarish Mahendrakar } 44*103e46e4SHarish Mahendrakar operator =(std::initializer_list<std::uint8_t> bytes)45*103e46e4SHarish MahendrakarBufferReader& BufferReader::operator=( 46*103e46e4SHarish Mahendrakar std::initializer_list<std::uint8_t> bytes) { 47*103e46e4SHarish Mahendrakar data_ = std::vector<std::uint8_t>(bytes); 48*103e46e4SHarish Mahendrakar pos_ = 0; 49*103e46e4SHarish Mahendrakar return *this; 50*103e46e4SHarish Mahendrakar } 51*103e46e4SHarish Mahendrakar Read(std::size_t num_to_read,std::uint8_t * buffer,std::uint64_t * num_actually_read)52*103e46e4SHarish MahendrakarStatus BufferReader::Read(std::size_t num_to_read, std::uint8_t* buffer, 53*103e46e4SHarish Mahendrakar std::uint64_t* num_actually_read) { 54*103e46e4SHarish Mahendrakar assert(num_to_read > 0); 55*103e46e4SHarish Mahendrakar assert(buffer != nullptr); 56*103e46e4SHarish Mahendrakar assert(num_actually_read != nullptr); 57*103e46e4SHarish Mahendrakar 58*103e46e4SHarish Mahendrakar *num_actually_read = 0; 59*103e46e4SHarish Mahendrakar std::size_t expected = num_to_read; 60*103e46e4SHarish Mahendrakar 61*103e46e4SHarish Mahendrakar std::size_t num_remaining = data_.size() - pos_; 62*103e46e4SHarish Mahendrakar if (num_remaining == 0) { 63*103e46e4SHarish Mahendrakar return Status(Status::kEndOfFile); 64*103e46e4SHarish Mahendrakar } 65*103e46e4SHarish Mahendrakar 66*103e46e4SHarish Mahendrakar if (num_to_read > num_remaining) { 67*103e46e4SHarish Mahendrakar num_to_read = static_cast<std::size_t>(num_remaining); 68*103e46e4SHarish Mahendrakar } 69*103e46e4SHarish Mahendrakar 70*103e46e4SHarish Mahendrakar std::copy_n(data_.data() + pos_, num_to_read, buffer); 71*103e46e4SHarish Mahendrakar *num_actually_read = num_to_read; 72*103e46e4SHarish Mahendrakar pos_ += num_to_read; 73*103e46e4SHarish Mahendrakar 74*103e46e4SHarish Mahendrakar if (*num_actually_read != expected) { 75*103e46e4SHarish Mahendrakar return Status(Status::kOkPartial); 76*103e46e4SHarish Mahendrakar } 77*103e46e4SHarish Mahendrakar 78*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted); 79*103e46e4SHarish Mahendrakar } 80*103e46e4SHarish Mahendrakar Skip(std::uint64_t num_to_skip,std::uint64_t * num_actually_skipped)81*103e46e4SHarish MahendrakarStatus BufferReader::Skip(std::uint64_t num_to_skip, 82*103e46e4SHarish Mahendrakar std::uint64_t* num_actually_skipped) { 83*103e46e4SHarish Mahendrakar assert(num_to_skip > 0); 84*103e46e4SHarish Mahendrakar assert(num_actually_skipped != nullptr); 85*103e46e4SHarish Mahendrakar 86*103e46e4SHarish Mahendrakar *num_actually_skipped = 0; 87*103e46e4SHarish Mahendrakar std::uint64_t expected = num_to_skip; 88*103e46e4SHarish Mahendrakar 89*103e46e4SHarish Mahendrakar std::size_t num_remaining = data_.size() - pos_; 90*103e46e4SHarish Mahendrakar if (num_remaining == 0) { 91*103e46e4SHarish Mahendrakar return Status(Status::kEndOfFile); 92*103e46e4SHarish Mahendrakar } 93*103e46e4SHarish Mahendrakar 94*103e46e4SHarish Mahendrakar if (num_to_skip > num_remaining) { 95*103e46e4SHarish Mahendrakar num_to_skip = static_cast<std::uint64_t>(num_remaining); 96*103e46e4SHarish Mahendrakar } 97*103e46e4SHarish Mahendrakar 98*103e46e4SHarish Mahendrakar *num_actually_skipped = num_to_skip; 99*103e46e4SHarish Mahendrakar pos_ += num_to_skip; 100*103e46e4SHarish Mahendrakar 101*103e46e4SHarish Mahendrakar if (*num_actually_skipped != expected) { 102*103e46e4SHarish Mahendrakar return Status(Status::kOkPartial); 103*103e46e4SHarish Mahendrakar } 104*103e46e4SHarish Mahendrakar 105*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted); 106*103e46e4SHarish Mahendrakar } 107*103e46e4SHarish Mahendrakar Position() const108*103e46e4SHarish Mahendrakarstd::uint64_t BufferReader::Position() const { return pos_; } 109*103e46e4SHarish Mahendrakar 110*103e46e4SHarish Mahendrakar } // namespace webm 111