Shaka Packager SDK
Loading...
Searching...
No Matches
box.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/formats/mp4/box.h>
8
9#include <cstddef>
10#include <cstdint>
11
12#include <absl/log/check.h>
13
14#include <packager/media/base/fourccs.h>
15#include <packager/media/base/rcheck.h>
16#include <packager/media/formats/mp4/box_buffer.h>
17
18namespace shaka {
19namespace media {
20namespace mp4 {
21
22Box::Box() : box_size_(0) {}
23Box::~Box() {}
24
25bool Box::Parse(BoxReader* reader) {
26 DCHECK(reader);
27 BoxBuffer buffer(reader);
28 return ReadWriteInternal(&buffer);
29}
30
31void Box::Write(BufferWriter* writer) {
32 DCHECK(writer);
33 // Compute and update box size.
34 uint32_t size = ComputeSize();
35 DCHECK_EQ(size, box_size_);
36
37 size_t buffer_size_before_write = writer->Size();
38 BoxBuffer buffer(writer);
39 CHECK(ReadWriteInternal(&buffer));
40 DCHECK_EQ(box_size_, writer->Size() - buffer_size_before_write)
41 << FourCCToString(BoxType());
42}
43
44void Box::WriteHeader(BufferWriter* writer) {
45 DCHECK(writer);
46 // Compute and update box size.
47 uint32_t size = ComputeSize();
48 DCHECK_EQ(size, box_size_);
49
50 size_t buffer_size_before_write = writer->Size();
51 BoxBuffer buffer(writer);
52 CHECK(ReadWriteHeaderInternal(&buffer));
53 DCHECK_EQ(HeaderSize(), writer->Size() - buffer_size_before_write);
54}
55
56uint32_t Box::ComputeSize() {
57 box_size_ = static_cast<uint32_t>(ComputeSizeInternal());
58 return box_size_;
59}
60
61uint32_t Box::HeaderSize() const {
62 const uint32_t kFourCCSize = 4;
63 // We don't support 64-bit size.
64 return kFourCCSize + sizeof(uint32_t);
65}
66
67bool Box::ReadWriteHeaderInternal(BoxBuffer* buffer) {
68 if (buffer->Reading()) {
69 // Skip for read mode, which is handled already in BoxReader.
70 } else {
71 CHECK(buffer->ReadWriteUInt32(&box_size_));
72 FourCC fourcc = BoxType();
73 CHECK(buffer->ReadWriteFourCC(&fourcc));
74 }
75 return true;
76}
77
78FullBox::FullBox() = default;
79FullBox::~FullBox() = default;
80
81uint32_t FullBox::HeaderSize() const {
82 // Additional 1-byte version and 3-byte flags.
83 return Box::HeaderSize() + 1 + 3;
84}
85
86bool FullBox::ReadWriteHeaderInternal(BoxBuffer* buffer) {
87 RCHECK(Box::ReadWriteHeaderInternal(buffer));
88
89 uint32_t vflags;
90 if (buffer->Reading()) {
91 RCHECK(buffer->ReadWriteUInt32(&vflags));
92 this->version = vflags >> 24;
93 this->flags = vflags & 0x00FFFFFF;
94 } else {
95 vflags = (this->version << 24) | this->flags;
96 RCHECK(buffer->ReadWriteUInt32(&vflags));
97 }
98 return true;
99}
100
101} // namespace mp4
102} // namespace media
103} // namespace shaka
Class for reading MP4 boxes.
Definition box_reader.h:30
All the methods that are virtual are virtual for mocking.