7 #include <packager/media/formats/mp2t/ac3_header.h>
9 #include <absl/log/check.h>
11 #include <packager/media/base/bit_reader.h>
12 #include <packager/media/base/bit_writer.h>
13 #include <packager/media/formats/mp2t/mp2t_common.h>
21 const uint32_t kAc3SampleRateTable[] = {48000, 44100, 32000};
24 const uint8_t kAc3NumChannelsTable[] = {2, 1, 2, 3, 3, 4, 4, 5};
28 const size_t kFrameSizeCodeTable[][3] = {
30 {96, 69, 64}, {96, 70, 64}, {120, 87, 80},
31 {120, 88, 80}, {144, 104, 96}, {144, 105, 96},
32 {168, 121, 112}, {168, 122, 112}, {192, 139, 128},
33 {192, 140, 128}, {240, 174, 160}, {240, 175, 160},
34 {288, 208, 192}, {288, 209, 192}, {336, 243, 224},
35 {336, 244, 224}, {384, 278, 256}, {384, 279, 256},
36 {480, 348, 320}, {480, 349, 320}, {576, 417, 384},
37 {576, 418, 384}, {672, 487, 448}, {672, 488, 448},
38 {768, 557, 512}, {768, 558, 512}, {960, 696, 640},
39 {960, 697, 640}, {1152, 835, 768}, {1152, 836, 768},
40 {1344, 975, 896}, {1344, 976, 896}, {1536, 1114, 1024},
41 {1536, 1115, 1024}, {1728, 1253, 1152}, {1728, 1254, 1152},
42 {1920, 1393, 1280}, {1920, 1394, 1280},
48 size_t CalcFrameSize(uint8_t fscod, uint8_t frmsizecod) {
49 const size_t kNumFscode = std::size(kAc3SampleRateTable);
50 DCHECK_LT(fscod, kNumFscode);
51 DCHECK_LT(frmsizecod, std::size(kFrameSizeCodeTable));
54 const int index = kNumFscode - 1 - fscod;
55 return kFrameSizeCodeTable[frmsizecod][index] * 2;
63 return buf[0] == 0x0B && buf[1] == 0x77;
68 const size_t kMinAc3FrameSize = 10u;
69 return kMinAc3FrameSize;
75 const size_t kSamplesPerAc3Frame = 1536;
76 return kSamplesPerAc3Frame;
80 BitReader frame(audio_frame, audio_frame_size);
85 RCHECK(frame.
ReadBits(16, &syncword));
86 RCHECK(syncword == 0x0B77);
90 RCHECK(fscod_ < std::size(kAc3SampleRateTable));
91 RCHECK(frame.
ReadBits(6, &frmsizecod_));
92 RCHECK(frmsizecod_ < std::size(kFrameSizeCodeTable));
99 RCHECK(acmod_ < std::size(kAc3NumChannelsTable));
101 if ((acmod_ & 0x01) && (acmod_ != 0x01))
122 return CalcFrameSize(fscod_, frmsizecod_);
126 size_t num_bytes)
const {
127 DCHECK_GT(num_bytes,
static_cast<size_t>(4));
128 uint8_t fscod = data[4] >> 6;
129 uint8_t frmsizecod = data[4] & 0x3f;
130 return CalcFrameSize(fscod, frmsizecod);
143 const uint8_t bit_rate_code = frmsizecod_ >> 1;
154 DCHECK_LT(fscod_, std::size(kAc3SampleRateTable));
155 return kAc3SampleRateTable[fscod_];
159 DCHECK_LT(acmod_, std::size(kAc3NumChannelsTable));
160 return kAc3NumChannelsTable[acmod_] + (lfeon_ ? 1 : 0);
All the methods that are virtual are virtual for mocking.