xref: /aosp_15_r20/external/libwebm/webm_parser/src/buffer_reader.cc (revision 103e46e4cd4b6efcf6001f23fa8665fb110abf8d)
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 Mahendrakar BufferReader::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 Mahendrakar BufferReader::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 Mahendrakar BufferReader::BufferReader(std::vector<std::uint8_t>&& vector)
29*103e46e4SHarish Mahendrakar     : data_(std::move(vector)) {}
30*103e46e4SHarish Mahendrakar 
BufferReader(BufferReader && other)31*103e46e4SHarish Mahendrakar BufferReader::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 Mahendrakar BufferReader& 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 Mahendrakar BufferReader& 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 Mahendrakar Status 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 Mahendrakar Status 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 Mahendrakar std::uint64_t BufferReader::Position() const { return pos_; }
109*103e46e4SHarish Mahendrakar 
110*103e46e4SHarish Mahendrakar }  // namespace webm
111