Shaka Packager SDK
Loading...
Searching...
No Matches
adts_header.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/mp2t/adts_header.h>
8
9#include <cstddef>
10#include <cstdint>
11#include <iterator>
12#include <vector>
13
14#include <absl/log/check.h>
15
16#include <packager/macros/logging.h>
17#include <packager/media/base/bit_reader.h>
18#include <packager/media/base/bit_writer.h>
19#include <packager/media/formats/mp2t/mp2t_common.h>
20
21namespace {
22const size_t kAdtsHeaderMinSize = 7;
23
24// The following conversion table is extracted from ISO 14496 Part 3 -
25// Table 1.16 - Sampling Frequency Index.
26const int kAdtsFrequencyTable[] = {96000, 88200, 64000, 48000, 44100,
27 32000, 24000, 22050, 16000, 12000,
28 11025, 8000, 7350};
29const size_t kAdtsFrequencyTableSize = std::size(kAdtsFrequencyTable);
30
31// The following conversion table is extracted from ISO 14496 Part 3 -
32// Table 1.17 - Channel Configuration.
33const int kAdtsNumChannelsTable[] = {0, 1, 2, 3, 4, 5, 6, 8};
34const size_t kAdtsNumChannelsTableSize = std::size(kAdtsNumChannelsTable);
35} // namespace
36
37namespace shaka {
38namespace media {
39namespace mp2t {
40
41bool AdtsHeader::IsSyncWord(const uint8_t* buf) const {
42 return (buf[0] == 0xff) && ((buf[1] & 0xf6) == 0xf0);
43}
44
46 return kAdtsHeaderMinSize + 1;
47}
48
50 const size_t kSamplesPerAacFrame = 1024;
51 return kSamplesPerAacFrame;
52}
53
54bool AdtsHeader::Parse(const uint8_t* adts_frame, size_t adts_frame_size) {
55 CHECK(adts_frame);
56
57 if (adts_frame_size < kAdtsHeaderMinSize)
58 return false;
59
60 BitReader frame(adts_frame, adts_frame_size);
61 // Verify frame starts with sync bits (0xfff).
62 uint32_t sync;
63 RCHECK(frame.ReadBits(12, &sync));
64 RCHECK(sync == 0xfff);
65 // Skip MPEG version and layer.
66 RCHECK(frame.SkipBits(3));
67 RCHECK(frame.ReadBits(1, &protection_absent_));
68 RCHECK(frame.ReadBits(2, &profile_));
69 RCHECK(frame.ReadBits(4, &sampling_frequency_index_));
70 RCHECK(sampling_frequency_index_ < kAdtsFrequencyTableSize);
71 // Skip private stream bit.
72 RCHECK(frame.SkipBits(1));
73 RCHECK(frame.ReadBits(3, &channel_configuration_));
74 RCHECK(channel_configuration_ < kAdtsNumChannelsTableSize);
75 // Skip originality, home and copyright info.
76 RCHECK(frame.SkipBits(4));
77 RCHECK(frame.ReadBits(13, &frame_size_));
78 // Skip buffer fullness indicator.
79 RCHECK(frame.SkipBits(11));
80 uint8_t num_blocks_minus_1;
81 RCHECK(frame.ReadBits(2, &num_blocks_minus_1));
82 if (num_blocks_minus_1) {
83 NOTIMPLEMENTED() << "ADTS frames with more than one data block "
84 "not supported.";
85 return false;
86 }
87 return true;
88}
89
91 const size_t kCrcSize = sizeof(uint16_t);
92 return kAdtsHeaderMinSize + (protection_absent_ ? 0 : kCrcSize);
93}
94
96 return frame_size_;
97}
98
99size_t AdtsHeader::GetFrameSizeWithoutParsing(const uint8_t* data,
100 size_t num_bytes) const {
101 DCHECK_GT(num_bytes, static_cast<size_t>(5));
102 return ((static_cast<int>(data[5]) >> 5) | (static_cast<int>(data[4]) << 3) |
103 ((static_cast<int>(data[3]) & 0x3) << 11));
104}
105
106void AdtsHeader::GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const {
107 DCHECK(buffer);
108 buffer->clear();
109 BitWriter config(buffer);
110 config.WriteBits(GetObjectType(), 5);
111 config.WriteBits(sampling_frequency_index_, 4);
112 config.WriteBits(channel_configuration_, 4);
113 config.Flush();
114}
115
117 return profile_ + 1;
118}
119
121 DCHECK_LT(sampling_frequency_index_, kAdtsFrequencyTableSize);
122 return kAdtsFrequencyTable[sampling_frequency_index_];
123}
124
126 DCHECK_LT(channel_configuration_, kAdtsNumChannelsTableSize);
127 return kAdtsNumChannelsTable[channel_configuration_];
128}
129
130} // namespace mp2t
131} // namespace media
132} // namespace shaka
A class to read bit streams.
Definition bit_reader.h:19
bool SkipBits(size_t num_bits)
Definition bit_reader.cc:28
bool ReadBits(size_t num_bits, T *out)
Definition bit_reader.h:37
void Flush()
Write pending bits, and align bitstream with extra zero bits.
Definition bit_writer.cc:37
void WriteBits(uint32_t bits, size_t number_of_bits)
Definition bit_writer.cc:21
size_t GetSamplesPerFrame() const override
uint8_t GetNumChannels() const override
void GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const override
size_t GetFrameSizeWithoutParsing(const uint8_t *data, size_t num_bytes) const override
size_t GetHeaderSize() const override
bool IsSyncWord(const uint8_t *buf) const override
bool Parse(const uint8_t *adts_frame, size_t adts_frame_size) override
size_t GetMinFrameSize() const override
uint8_t GetObjectType() const override
size_t GetFrameSize() const override
uint32_t GetSamplingFrequency() const override
All the methods that are virtual are virtual for mocking.