5#include <packager/media/codecs/es_descriptor.h>
11#include <absl/log/check.h>
12#include <absl/log/log.h>
14#include <packager/media/base/bit_reader.h>
15#include <packager/media/base/buffer_writer.h>
16#include <packager/media/base/rcheck.h>
24 kForbiddenStreamType = 0x00,
25 kObjectDescriptorStreamType = 0x01,
26 kClockReferenceStreamType = 0x02,
27 kSceneDescriptionStreamType = 0x03,
28 kVisualStreamType = 0x04,
29 kAudioStreamType = 0x05,
30 kMPEG7StreamType = 0x06,
31 kIPMPStreamType = 0x07,
32 kObjectContentInfoStreamType = 0x08,
33 kMPEGJStreamType = 0x09,
34 kInteractionStream = 0x0A,
35 kIPMPToolStreamType = 0x0B,
39enum SLPredefinedTags {
40 kSLPredefinedNull = 0x01,
41 kSLPredefinedMP4 = 0x02,
46bool ReadDescriptorSize(BitReader* reader,
size_t* size) {
52 for (
size_t i = 0; i < 4; ++i) {
53 RCHECK(reader->ReadBits(1, &msb));
54 RCHECK(reader->ReadBits(7, &
byte));
55 *size = (*size << 7) +
byte;
64void WriteDescriptorSize(
size_t size, BufferWriter* writer) {
65 std::vector<uint8_t> size_bytes;
67 uint8_t
byte = (size & 0x7F);
69 if (!size_bytes.empty())
71 size_bytes.push_back(
byte);
73 for (
auto iter = size_bytes.rbegin(); iter != size_bytes.rend(); iter++)
74 writer->AppendInt(*iter);
77size_t CountDescriptorSize(
size_t size) {
89 BitReader reader(data.data(), data.size());
96 if (tag !=
static_cast<uint8_t
>(tag_)) {
97 LOG(ERROR) <<
"Expecting tag " <<
static_cast<int>(tag_) <<
", but seeing "
98 <<
static_cast<int>(tag);
101 RCHECK(ReadDescriptorSize(reader, &data_size_));
102 return ReadData(reader);
108 size_t buffer_size_before_write = writer->Size();
110 WriteInternal(writer);
112 DCHECK_EQ(size, writer->Size() - buffer_size_before_write);
116 data_size_ = ComputeDataSize();
117 return 1 + CountDescriptorSize(data_size_) + data_size_;
121 writer->
AppendInt(
static_cast<uint8_t
>(tag_));
122 WriteDescriptorSize(data_size_, writer);
125bool DecoderSpecificInfoDescriptor::ReadData(
BitReader* reader) {
127 for (uint8_t& data_entry : data_)
128 RCHECK(reader->ReadBits(8, &data_entry));
132void DecoderSpecificInfoDescriptor::WriteInternal(BufferWriter* writer) {
134 writer->AppendVector(data_);
137size_t DecoderSpecificInfoDescriptor::ComputeDataSize() {
141bool DecoderConfigDescriptor::ReadData(BitReader* reader) {
142 const size_t start_pos = reader->bit_position();
143 RCHECK(reader->ReadBits(8, &object_type_));
146 RCHECK(reader->ReadBits(6, &stream_type));
147 if (stream_type != kAudioStreamType) {
148 LOG(ERROR) <<
"Seeing non audio stream type " << stream_type;
152 RCHECK(reader->SkipBits(2));
153 RCHECK(reader->ReadBits(24, &buffer_size_db_));
154 RCHECK(reader->ReadBits(32, &max_bitrate_));
155 RCHECK(reader->ReadBits(32, &avg_bitrate_));
156 const size_t fields_bits = reader->bit_position() - start_pos;
158 const size_t kBitsInByte = 8;
159 const bool has_child_tags =
data_size() * kBitsInByte > fields_bits;
160 decoder_specific_info_descriptor_ = DecoderSpecificInfoDescriptor();
162 RCHECK(decoder_specific_info_descriptor_.
Read(reader));
167void DecoderConfigDescriptor::WriteInternal(BufferWriter* writer) {
170 writer->AppendInt(
static_cast<uint8_t
>(object_type_));
172 const uint8_t stream_type = (kAudioStreamType << 2) | 1;
173 writer->AppendInt(stream_type);
174 writer->AppendNBytes(buffer_size_db_, 3);
175 writer->AppendInt(max_bitrate_);
176 writer->AppendInt(avg_bitrate_);
178 if (!decoder_specific_info_descriptor_.data().empty())
179 decoder_specific_info_descriptor_.
Write(writer);
182size_t DecoderConfigDescriptor::ComputeDataSize() {
185 const size_t data_size_without_children = 1 + 1 + 3 + 4 + 4;
186 if (decoder_specific_info_descriptor_.data().empty())
187 return data_size_without_children;
188 return data_size_without_children +
192bool SLConfigDescriptor::ReadData(BitReader*) {
196void SLConfigDescriptor::WriteInternal(BufferWriter* writer) {
198 writer->AppendInt(
static_cast<uint8_t
>(kSLPredefinedMP4));
201size_t SLConfigDescriptor::ComputeDataSize() {
205bool ESDescriptor::ReadData(BitReader* reader) {
206 bool stream_dependency_flag;
208 bool ocr_stream_flag;
209 RCHECK(reader->ReadBits(16, &esid_));
210 RCHECK(reader->ReadBits(1, &stream_dependency_flag));
211 RCHECK(reader->ReadBits(1, &url_flag));
213 RCHECK(reader->ReadBits(1, &ocr_stream_flag));
214 RCHECK(reader->SkipBits(5));
216 if (stream_dependency_flag)
217 RCHECK(reader->SkipBits(16));
219 RCHECK(reader->SkipBits(16));
221 return decoder_config_descriptor_.
Read(reader);
226void ESDescriptor::WriteInternal(BufferWriter* writer) {
231 const uint16_t kEsid = 0;
232 writer->AppendInt(kEsid);
233 const uint8_t kNoEsFlags = 0;
234 writer->AppendInt(kNoEsFlags);
236 decoder_config_descriptor_.
Write(writer);
237 sl_config_descriptor_.
Write(writer);
240size_t ESDescriptor::ComputeDataSize() {
242 const size_t data_size_without_children = 2 + 1;
243 return data_size_without_children + decoder_config_descriptor_.
ComputeSize() +
All the methods that are virtual are virtual for mocking.