Shaka Packager SDK
Loading...
Searching...
No Matches
buffer_writer.cc
1// Copyright 2014 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/media/base/buffer_writer.h>
8
9#include <cstddef>
10#include <cstdint>
11#include <string>
12#include <vector>
13
14#include <absl/base/internal/endian.h>
15#include <absl/log/check.h>
16
17#include <packager/file.h>
18#include <packager/status.h>
19
20namespace shaka {
21namespace media {
22
23BufferWriter::BufferWriter() {
24 const size_t kDefaultReservedCapacity = 0x40000; // 256KB.
25 buf_.reserve(kDefaultReservedCapacity);
26}
27BufferWriter::BufferWriter(size_t reserved_size_in_bytes) {
28 buf_.reserve(reserved_size_in_bytes);
29}
30BufferWriter::~BufferWriter() {}
31
32void BufferWriter::AppendInt(uint8_t v) {
33 buf_.push_back(v);
34}
35void BufferWriter::AppendInt(uint16_t v) {
36 AppendInternal(absl::big_endian::FromHost16(v));
37}
38void BufferWriter::AppendInt(uint32_t v) {
39 AppendInternal(absl::big_endian::FromHost32(v));
40}
41void BufferWriter::AppendInt(uint64_t v) {
42 AppendInternal(absl::big_endian::FromHost64(v));
43}
44void BufferWriter::AppendInt(int16_t v) {
45 AppendInternal(absl::big_endian::FromHost16(v));
46}
47void BufferWriter::AppendInt(int32_t v) {
48 AppendInternal(absl::big_endian::FromHost32(v));
49}
50void BufferWriter::AppendInt(int64_t v) {
51 AppendInternal(absl::big_endian::FromHost64(v));
52}
53
54void BufferWriter::AppendNBytes(uint64_t v, size_t num_bytes) {
55 DCHECK_GE(sizeof(v), num_bytes);
56 v = absl::big_endian::FromHost64(v);
57 const uint8_t* data = reinterpret_cast<uint8_t*>(&v);
58 AppendArray(&data[sizeof(v) - num_bytes], num_bytes);
59}
60
61void BufferWriter::AppendVector(const std::vector<uint8_t>& v) {
62 buf_.insert(buf_.end(), v.begin(), v.end());
63}
64
65void BufferWriter::AppendString(const std::string& s) {
66 buf_.insert(buf_.end(), s.begin(), s.end());
67}
68
69void BufferWriter::AppendArray(const uint8_t* buf, size_t size) {
70 buf_.insert(buf_.end(), buf, buf + size);
71}
72
73void BufferWriter::AppendBuffer(const BufferWriter& buffer) {
74 buf_.insert(buf_.end(), buffer.buf_.begin(), buffer.buf_.end());
75}
76
77Status BufferWriter::WriteToFile(File* file) {
78 DCHECK(file);
79 DCHECK(!buf_.empty());
80
81 size_t remaining_size = buf_.size();
82 const uint8_t* buf = &buf_[0];
83 while (remaining_size > 0) {
84 int64_t size_written = file->Write(buf, remaining_size);
85 if (size_written <= 0) {
86 return Status(error::FILE_FAILURE,
87 "Fail to write to file in BufferWriter");
88 }
89 remaining_size -= size_written;
90 buf += size_written;
91 }
92 buf_.clear();
93 return Status::OK;
94}
95
96template <typename T>
97void BufferWriter::AppendInternal(T v) {
98 AppendArray(reinterpret_cast<uint8_t*>(&v), sizeof(T));
99}
100
101} // namespace media
102} // namespace shaka
Status WriteToFile(File *file)
void AppendNBytes(uint64_t v, size_t num_bytes)
All the methods that are virtual are virtual for mocking.