7#include <packager/media/codecs/ac4_parser.h>
14#include <absl/log/check.h>
15#include <absl/log/log.h>
17#include <packager/media/base/bit_reader.h>
18#include <packager/media/base/rcheck.h>
20using namespace shaka::media;
27const int CH_MODE_MONO = 0;
28const int CH_MODE_STEREO = 1;
29const int CH_MODE_3_0 = 2;
30const int CH_MODE_5_0 = 3;
31const int CH_MODE_5_1 = 4;
32const int CH_MODE_70_34 = 5;
33const int CH_MODE_71_34 = 6;
34const int CH_MODE_70_52 = 7;
35const int CH_MODE_71_52 = 8;
36const int CH_MODE_70_322 = 9;
37const int CH_MODE_71_322 = 10;
38const int CH_MODE_7_0_4 = 11;
39const int CH_MODE_7_1_4 = 12;
40const int CH_MODE_9_0_4 = 13;
41const int CH_MODE_9_1_4 = 14;
42const int CH_MODE_22_2 = 15;
43const int CH_MODE_RESERVED = 16;
45int ReadAc4VariableBits(
BitReader* reader,
int nBits) {
50 RCHECK(reader->
ReadBits(nBits, &extra_value));
52 RCHECK(reader->
ReadBits(1, &b_moreBits));
53 if (b_moreBits == 1) {
55 value += (1 << nBits);
57 }
while (b_moreBits == 1);
63AC4Parser::AC4Parser() =
default;
64AC4Parser::~AC4Parser() =
default;
66bool AC4Parser::Parse(
const uint8_t* data,
size_t data_size) {
68 if (!ParseAc4Toc(&reader))
73bool AC4Parser::ParseAc4Toc(
BitReader* reader) {
76 RCHECK(reader->
ReadBits(2, &ac4_toc.bitstream_version));
77 if (ac4_toc.bitstream_version == 3) {
78 ac4_toc.bitstream_version = ReadAc4VariableBits(reader, 2);
80 RCHECK(reader->
ReadBits(10, &ac4_toc.sequence_counter));
81 RCHECK(reader->
ReadBits(1, &ac4_toc.b_wait_frames));
82 if (ac4_toc.b_wait_frames) {
83 RCHECK(reader->
ReadBits(3, &ac4_toc.wait_frames));
84 if (ac4_toc.wait_frames > 0) {
85 RCHECK(reader->
ReadBits(2, &ac4_toc.br_code));
88 RCHECK(reader->
ReadBits(1, &ac4_toc.fs_index));
89 RCHECK(reader->
ReadBits(4, &ac4_toc.frame_rate_index));
90 RCHECK(reader->
ReadBits(1, &ac4_toc.b_iframe_global));
91 RCHECK(reader->
ReadBits(1, &ac4_toc.b_single_presentation));
92 if (ac4_toc.b_single_presentation) {
93 ac4_toc.n_presentations = 1;
95 RCHECK(reader->
ReadBits(1, &ac4_toc.b_more_presentations));
96 if (ac4_toc.b_more_presentations) {
97 ac4_toc.n_presentations = ReadAc4VariableBits(reader, 2) + 2;
99 ac4_toc.n_presentations = 0;
102 int payload_base = 0;
103 RCHECK(reader->
ReadBits(1, &ac4_toc.b_payload_base));
104 if (ac4_toc.b_payload_base) {
105 RCHECK(reader->
ReadBits(5, &ac4_toc.payload_base_minus1));
106 payload_base = ac4_toc.payload_base_minus1 + 1;
107 if (payload_base == 0x20) {
108 payload_base = ReadAc4VariableBits(reader, 3);
111 if (ac4_toc.bitstream_version <= 1) {
112 printf(
"Warning: Bitstream version 0 is deprecated\n");
114 RCHECK(reader->
ReadBits(1, &ac4_toc.b_program_id));
115 if (ac4_toc.b_program_id) {
116 RCHECK(reader->
ReadBits(16, &ac4_toc.short_program_id));
117 RCHECK(reader->
ReadBits(1, &ac4_toc.b_program_uuid_present));
118 if (ac4_toc.b_program_uuid_present) {
119 for (
int cnt = 0; cnt < 16; cnt++) {
120 RCHECK(reader->
ReadBits(8, &ac4_toc.program_uuid));
124 int max_group_index = 0;
125 ac4_toc.presentation_v1_infos =
126 new Ac4PresentationV1Info[ac4_toc.n_presentations];
127 for (
int i = 0; i < ac4_toc.n_presentations; i++) {
128 ParseAc4PresentationV1Info(reader, ac4_toc.presentation_v1_infos[i],
131 ac4_toc.total_n_substream_groups = max_group_index + 1;
132 ac4_toc.substream_group_infos =
133 new Ac4SubstreamGroupInfo[ac4_toc.total_n_substream_groups];
134 for (
int j = 0; j < ac4_toc.total_n_substream_groups; j++) {
135 ParseAc4SubstreamGroupInfo(reader, ac4_toc.substream_group_infos[j], j);
140 int n_substreams = 0;
141 RCHECK(reader->
ReadBits(2, &n_substreams));
142 if (n_substreams == 0) {
143 n_substreams = ReadAc4VariableBits(reader, 2) + 4;
145 int b_size_present = 0;
146 if (n_substreams == 1) {
147 RCHECK(reader->
ReadBits(1, &b_size_present));
151 if (b_size_present) {
152 for (
int s = 0; s < n_substreams; s++) {
154 RCHECK(reader->
ReadBits(1, &b_more_bits));
155 int substream_size = 0;
156 RCHECK(reader->
ReadBits(10, &substream_size));
158 substream_size += (ReadAc4VariableBits(reader, 2) << 10);
167bool AC4Parser::ParseAc4PresentationV1Info(
169 Ac4PresentationV1Info& ac4_presentation_v1_info,
170 int& max_group_index) {
173 reader->
ReadBits(1, &ac4_presentation_v1_info.b_single_substream_group));
174 if (ac4_presentation_v1_info.b_single_substream_group != 1) {
175 RCHECK(reader->
ReadBits(3, &ac4_presentation_v1_info.presentation_config));
176 if (ac4_presentation_v1_info.presentation_config == 7) {
177 ac4_presentation_v1_info.presentation_config =
178 ReadAc4VariableBits(reader, 2);
181 if (ac4_toc.bitstream_version != 1) {
185 while (reader->
ReadBits(1, &more_bits) && more_bits) {
186 ac4_presentation_v1_info.presentation_version++;
189 if (ac4_presentation_v1_info.b_single_substream_group != 1 &&
190 ac4_presentation_v1_info.presentation_config == 6) {
191 ac4_presentation_v1_info.b_add_emdf_substreams = 1;
193 if (ac4_toc.bitstream_version != 1) {
194 RCHECK(reader->
ReadBits(3, &ac4_presentation_v1_info.mdcompat));
196 RCHECK(reader->
ReadBits(1, &ac4_presentation_v1_info.b_presentation_id));
197 if (ac4_presentation_v1_info.b_presentation_id) {
198 ac4_presentation_v1_info.b_presentation_id =
199 ReadAc4VariableBits(reader, 2);
201 ParseFrameRateMultiplyInfo(reader);
202 ParseFrameRateFractionsInfo(reader);
203 ParseEmdfInfo(reader);
206 reader->
ReadBits(1, &ac4_presentation_v1_info.b_presentation_filter));
208 if (ac4_presentation_v1_info.b_presentation_filter) {
210 reader->
ReadBits(1, &ac4_presentation_v1_info.b_enable_presentation));
212 if (ac4_presentation_v1_info.b_single_substream_group == 1) {
213 group_index = ParseAc4SgiSpecifier(reader);
215 group_index > max_group_index ? group_index : max_group_index;
216 ac4_presentation_v1_info.n_substream_groups = 1;
218 reader->
ReadBits(1, &ac4_presentation_v1_info.b_multi_pid);
219 switch (ac4_presentation_v1_info.presentation_config) {
221 group_index = ParseAc4SgiSpecifier(reader);
223 group_index > max_group_index ? group_index : max_group_index;
224 group_index = ParseAc4SgiSpecifier(reader);
226 group_index > max_group_index ? group_index : max_group_index;
227 ac4_presentation_v1_info.n_substream_groups = 2;
230 group_index = ParseAc4SgiSpecifier(reader);
232 group_index > max_group_index ? group_index : max_group_index;
233 group_index = ParseAc4SgiSpecifier(reader);
235 group_index > max_group_index ? group_index : max_group_index;
236 ac4_presentation_v1_info.n_substream_groups = 1;
239 group_index = ParseAc4SgiSpecifier(reader);
241 group_index > max_group_index ? group_index : max_group_index;
242 group_index = ParseAc4SgiSpecifier(reader);
244 group_index > max_group_index ? group_index : max_group_index;
245 ac4_presentation_v1_info.n_substream_groups = 2;
248 group_index = ParseAc4SgiSpecifier(reader);
250 group_index > max_group_index ? group_index : max_group_index;
251 group_index = ParseAc4SgiSpecifier(reader);
253 group_index > max_group_index ? group_index : max_group_index;
254 group_index = ParseAc4SgiSpecifier(reader);
256 group_index > max_group_index ? group_index : max_group_index;
257 ac4_presentation_v1_info.n_substream_groups = 3;
260 group_index = ParseAc4SgiSpecifier(reader);
262 group_index > max_group_index ? group_index : max_group_index;
263 group_index = ParseAc4SgiSpecifier(reader);
265 group_index > max_group_index ? group_index : max_group_index;
266 group_index = ParseAc4SgiSpecifier(reader);
268 group_index > max_group_index ? group_index : max_group_index;
269 ac4_presentation_v1_info.n_substream_groups = 2;
273 2, &ac4_presentation_v1_info.n_substream_groups_minus2));
274 ac4_presentation_v1_info.n_substream_groups =
275 ac4_presentation_v1_info.n_substream_groups_minus2 + 2;
276 if (ac4_presentation_v1_info.n_substream_groups == 5) {
277 ac4_presentation_v1_info.n_substream_groups +=
278 ReadAc4VariableBits(reader, 2);
280 for (
int sg = 0; sg < ac4_presentation_v1_info.n_substream_groups;
282 group_index = ParseAc4SgiSpecifier(reader);
284 group_index > max_group_index ? group_index : max_group_index;
288 ParsePresentationConfigExtInfo(reader);
292 RCHECK(reader->
ReadBits(1, &ac4_presentation_v1_info.b_pre_virtualized));
294 reader->
ReadBits(1, &ac4_presentation_v1_info.b_add_emdf_substreams));
295 ParseAc4PresentationSubstreamInfo(reader);
297 if (ac4_presentation_v1_info.b_add_emdf_substreams) {
299 reader->
ReadBits(2, &ac4_presentation_v1_info.n_add_emdf_substreams));
300 if (ac4_presentation_v1_info.n_add_emdf_substreams == 0) {
301 ac4_presentation_v1_info.n_add_emdf_substreams =
302 ReadAc4VariableBits(reader, 2) + 4;
304 for (
int i = 0; i < ac4_presentation_v1_info.n_add_emdf_substreams; i++) {
305 ParseEmdfInfo(reader);
311bool AC4Parser::ParseFrameRateMultiplyInfo(
BitReader* reader) {
312 FrameRateMultiplyInfo frame_rate_multiply_info;
313 switch (ac4_toc.frame_rate_index) {
317 RCHECK(reader->
ReadBits(1, &frame_rate_multiply_info.b_multiplier));
318 if (frame_rate_multiply_info.b_multiplier) {
320 1, &frame_rate_multiply_info.multiplier_bit));
328 RCHECK(reader->
ReadBits(1, &frame_rate_multiply_info.b_multiplier));
336bool AC4Parser::ParseFrameRateFractionsInfo(
BitReader* reader) {
337 FrameRateFractionsInfo frame_rate_fractions_info;
338 if (ac4_toc.frame_rate_index >= 5 && ac4_toc.frame_rate_index <= 9) {
340 reader->
ReadBits(1, &frame_rate_fractions_info.b_frame_rate_fraction));
342 if (ac4_toc.frame_rate_index >= 10 && ac4_toc.frame_rate_index <= 12) {
344 reader->
ReadBits(1, &frame_rate_fractions_info.b_frame_rate_fraction));
345 if (frame_rate_fractions_info.b_frame_rate_fraction == 1) {
347 1, &frame_rate_fractions_info.b_frame_rate_fraction_is_4));
353bool AC4Parser::ParseEmdfInfo(
BitReader* reader) {
355 RCHECK(reader->
ReadBits(2, &emdf_info.emdf_version));
356 if (emdf_info.emdf_version == 3) {
357 emdf_info.emdf_version += ReadAc4VariableBits(reader, 2);
359 RCHECK(reader->
ReadBits(3, &emdf_info.key_id));
360 if (emdf_info.key_id == 7) {
361 emdf_info.key_id += ReadAc4VariableBits(reader, 3);
363 RCHECK(reader->
ReadBits(1, &emdf_info.b_emdf_payloads_substream_info));
364 if (emdf_info.b_emdf_payloads_substream_info) {
365 RCHECK(reader->
ReadBits(2, &emdf_info.substream_index));
366 if (emdf_info.substream_index == 3) {
367 emdf_info.substream_index += ReadAc4VariableBits(reader, 2);
370 RCHECK(reader->
ReadBits(2, &emdf_info.protection_length_primary));
371 RCHECK(reader->
ReadBits(2, &emdf_info.protection_length_secondary));
372 switch (emdf_info.protection_length_primary) {
374 RCHECK(reader->
ReadBits(8, &emdf_info.protection_bits_primary[0]));
377 for (
unsigned idx = 0; idx < 4; idx++) {
378 RCHECK(reader->
ReadBits(8, &emdf_info.protection_bits_primary[idx]));
382 for (
unsigned idx = 0; idx < 16; idx++) {
383 RCHECK(reader->
ReadBits(8, &emdf_info.protection_bits_primary[idx]));
387 LOG(ERROR) <<
"Invalid EMDF primary protection length: "
388 <<
static_cast<int>(emdf_info.protection_length_primary);
393 switch (emdf_info.protection_length_secondary) {
397 RCHECK(reader->
ReadBits(8, &emdf_info.protection_bits_secondary[0]));
400 for (
unsigned idx = 0; idx < 4; idx++) {
401 RCHECK(reader->
ReadBits(8, &emdf_info.protection_bits_secondary[idx]));
405 for (
unsigned idx = 0; idx < 16; idx++) {
406 RCHECK(reader->
ReadBits(8, &emdf_info.protection_bits_secondary[idx]));
410 LOG(ERROR) <<
"Invalid EMDF secondary protection length: "
411 <<
static_cast<int>(emdf_info.protection_length_secondary);
417bool AC4Parser::ParseAc4PresentationSubstreamInfo(
BitReader* reader) {
418 Ac4PresentationV1Info ac4_presentation_v1_info;
419 RCHECK(reader->
ReadBits(1, &ac4_presentation_v1_info.b_alternative));
420 RCHECK(reader->
ReadBits(1, &ac4_presentation_v1_info.b_pres_ndot));
421 RCHECK(reader->
ReadBits(2, &ac4_presentation_v1_info.substream_index));
422 if (ac4_presentation_v1_info.substream_index == 3) {
423 ac4_presentation_v1_info.substream_index += ReadAc4VariableBits(reader, 2);
428int AC4Parser::ParseAc4SgiSpecifier(
BitReader* reader) {
430 if (ac4_toc.bitstream_version == 1) {
433 RCHECK(reader->
ReadBits(3, &group_index));
434 if (group_index == 7) {
435 group_index += ReadAc4VariableBits(reader, 2);
441bool AC4Parser::ParsePresentationConfigExtInfo(
BitReader* reader) {
443 int b_more_skip_bytes;
444 RCHECK(reader->
ReadBits(1, &n_skip_bytes));
445 RCHECK(reader->
ReadBits(1, &b_more_skip_bytes));
446 if (b_more_skip_bytes) {
447 n_skip_bytes += ReadAc4VariableBits(reader, 2) << 5;
449 for (
int i = 0; i < n_skip_bytes; i++) {
455int AC4Parser::GetPresentationIdx(
int substream_group_index) {
456 for (
int idx = 0; idx < ac4_toc.n_presentations; idx++) {
457 for (
int sg = 0; sg < ac4_toc.presentation_v1_infos[idx].n_substream_groups;
459 if (substream_group_index ==
460 ac4_toc.presentation_v1_infos[idx].group_index[sg]) {
468int AC4Parser::GetPresentationVersion(
int substream_group_index) {
469 for (
int idx = 0; idx < ac4_toc.n_presentations; idx++) {
470 for (
int sg = 0; sg < ac4_toc.presentation_v1_infos[idx].n_substream_groups;
472 if (substream_group_index ==
473 ac4_toc.presentation_v1_infos[idx].group_index[sg]) {
474 return ac4_toc.presentation_v1_infos[idx].presentation_version;
481bool AC4Parser::ParseAc4SubstreamGroupInfo(
483 Ac4SubstreamGroupInfo& ac4_substream_group_info,
484 int substream_group_index) {
485 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_substreams_present));
486 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_hsf_ext));
487 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_single_substream));
488 if (ac4_substream_group_info.b_single_substream) {
489 ac4_substream_group_info.n_lf_substreams = 1;
492 reader->
ReadBits(2, &ac4_substream_group_info.n_lf_substreams_minus2));
493 ac4_substream_group_info.n_lf_substreams =
494 ac4_substream_group_info.n_lf_substreams_minus2 + 2;
495 if (ac4_substream_group_info.n_lf_substreams == 5) {
496 ac4_substream_group_info.n_lf_substreams +=
497 ReadAc4VariableBits(reader, 2);
500 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_channel_coded));
502 int pre_idx = GetPresentationIdx(substream_group_index);
503 int frame_rate_factor =
504 (ac4_toc.presentation_v1_infos[pre_idx]
505 .frame_rate_multiply_info.dsi_frame_rate_multiply_info == 0)
507 : (ac4_toc.presentation_v1_infos[pre_idx]
508 .frame_rate_multiply_info.dsi_frame_rate_multiply_info *
510 if (ac4_substream_group_info.b_channel_coded) {
511 for (
int sus = 0; sus < ac4_substream_group_info.n_lf_substreams; sus++) {
512 if (ac4_toc.bitstream_version == 1) {
515 ac4_substream_group_info.sus_ver = 1;
517 ParseAc4SubstreamInfoChan(reader,
518 GetPresentationVersion(substream_group_index),
519 ac4_toc.fs_index, frame_rate_factor,
520 ac4_substream_group_info.b_substreams_present);
521 if (ac4_substream_group_info.b_hsf_ext) {
522 ParseAc4HsfExtSubstreamInfo(reader, ac4_substream_group_info);
526 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_oamd_substream));
527 if (ac4_substream_group_info.b_oamd_substream) {
528 ParseOamdSubstreamInfo(reader, ac4_substream_group_info);
530 for (
int sus = 0; sus < ac4_substream_group_info.n_lf_substreams; sus++) {
531 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_ajoc));
532 if (ac4_substream_group_info.b_ajoc) {
533 ParseAc4SubstreamInfoAjoc(
534 reader, ac4_toc.fs_index, frame_rate_factor,
535 ac4_substream_group_info.b_substreams_present);
536 if (ac4_substream_group_info.b_hsf_ext) {
537 ParseAc4HsfExtSubstreamInfo(reader, ac4_substream_group_info);
540 ParseAc4SubstreamInfoObj(reader, ac4_toc.fs_index, frame_rate_factor,
541 ac4_substream_group_info.b_substreams_present);
542 if (ac4_substream_group_info.b_hsf_ext) {
543 ParseAc4HsfExtSubstreamInfo(reader, ac4_substream_group_info);
548 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_content_type));
549 if (ac4_substream_group_info.b_content_type) {
550 ParseContentType(reader, ac4_substream_group_info);
555bool AC4Parser::ParseContentType(
557 Ac4SubstreamGroupInfo& ac4_substream_group_info) {
558 RCHECK(reader->
ReadBits(3, &ac4_substream_group_info.content_classifier));
559 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_language_indicator));
560 if (ac4_substream_group_info.b_language_indicator) {
562 1, &ac4_substream_group_info.b_serialized_language_tag));
563 if (ac4_substream_group_info.b_serialized_language_tag) {
564 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_start_tag));
566 reader->
ReadBits(16, &ac4_substream_group_info.language_tag_chunk));
569 reader->
ReadBits(6, &ac4_substream_group_info.n_language_tag_bytes));
570 for (
int i = 0; i < ac4_substream_group_info.n_language_tag_bytes; i++) {
572 8, &ac4_substream_group_info.language_tag_bytes[i]));
579bool AC4Parser::ParseOamdSubstreamInfo(
581 Ac4SubstreamGroupInfo& ac4_substream_group_info) {
582 RCHECK(reader->
ReadBits(1, &ac4_substream_group_info.b_oamd_ndot));
583 if (ac4_substream_group_info.b_substreams_present == 1) {
584 RCHECK(reader->
ReadBits(2, &ac4_substream_group_info.substream_index));
585 if (ac4_substream_group_info.substream_index == 3) {
586 ac4_substream_group_info.substream_index +=
587 ReadAc4VariableBits(reader, 2);
593bool AC4Parser::ParseAc4HsfExtSubstreamInfo(
595 Ac4SubstreamGroupInfo& ac4_substream_group_info) {
596 if (ac4_substream_group_info.b_substreams_present == 1) {
597 RCHECK(reader->
ReadBits(2, &ac4_substream_group_info.substream_index));
598 if (ac4_substream_group_info.substream_index == 3) {
599 ac4_substream_group_info.substream_index +=
600 ReadAc4VariableBits(reader, 2);
606bool AC4Parser::ParseAc4SubstreamInfoChan(
BitReader* reader,
607 int presentation_version,
609 int frame_rate_factor,
610 int b_substreams_present) {
611 Ac4SubstreamInfoChan ac4_substream_info_chan;
612 ac4_substream_info_chan.channel_mode =
613 ParseChannelMode(reader, presentation_version);
614 if (ac4_substream_info_chan.channel_mode == 0b111111111) {
615 ac4_substream_info_chan.channel_mode += ReadAc4VariableBits(reader, 2);
617 if ((ac4_substream_info_chan.channel_mode >= CH_MODE_7_0_4) &&
618 (ac4_substream_info_chan.channel_mode <= CH_MODE_9_1_4)) {
620 1, &ac4_substream_info_chan.b_4_back_channels_present));
621 RCHECK(reader->
ReadBits(1, &ac4_substream_info_chan.b_centre_present));
622 RCHECK(reader->
ReadBits(2, &ac4_substream_info_chan.top_channels_present));
625 RCHECK(reader->
ReadBits(1, &ac4_substream_info_chan.b_sf_multiplier));
626 if (ac4_substream_info_chan.b_sf_multiplier) {
627 RCHECK(reader->
ReadBits(1, &ac4_substream_info_chan.sf_multiplier));
630 RCHECK(reader->
ReadBits(1, &ac4_substream_info_chan.b_bitrate_info));
631 if (ac4_substream_info_chan.b_bitrate_info) {
632 RCHECK(reader->
ReadBits(3, &ac4_substream_info_chan.bitrate_indicator));
633 if ((ac4_substream_info_chan.bitrate_indicator & 0x1) == 1) {
635 RCHECK(reader->
ReadBits(2, &more_bits));
636 ac4_substream_info_chan.bitrate_indicator =
637 (ac4_substream_info_chan.bitrate_indicator << 2) + more_bits;
640 if (ac4_substream_info_chan.channel_mode >= CH_MODE_70_52 &&
641 ac4_substream_info_chan.channel_mode <= CH_MODE_71_322) {
642 RCHECK(reader->
ReadBits(1, &ac4_substream_info_chan.add_ch_base));
644 for (
int i = 0; i < frame_rate_factor; i++) {
645 RCHECK(reader->
ReadBits(1, &ac4_substream_info_chan.b_audio_ndot));
647 if (b_substreams_present == 1) {
648 RCHECK(reader->
ReadBits(2, &ac4_substream_info_chan.substream_index));
649 if (ac4_substream_info_chan.substream_index == 3) {
650 ac4_substream_info_chan.substream_index += ReadAc4VariableBits(reader, 2);
656bool AC4Parser::ParseAc4SubstreamInfoAjoc(
BitReader* reader,
658 int frame_rate_factor,
659 int b_substreams_present) {
660 Ac4SubstreamInfoAjoc ac4_substream_info_ajoc;
661 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_lfe));
662 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_static_dmx));
663 if (ac4_substream_info_ajoc.b_static_dmx) {
664 ac4_substream_info_ajoc.n_fullband_dmx_signals = 5;
667 4, &ac4_substream_info_ajoc.n_fullband_dmx_signals_minus1));
668 ac4_substream_info_ajoc.n_fullband_dmx_signals =
669 ac4_substream_info_ajoc.n_fullband_dmx_signals_minus1 + 1;
670 ParseBedDynObjAssignment(reader,
671 ac4_substream_info_ajoc.n_fullband_dmx_signals,
672 ac4_substream_info_ajoc);
675 reader->
ReadBits(1, &ac4_substream_info_ajoc.b_oamd_common_data_present));
676 if (ac4_substream_info_ajoc.b_oamd_common_data_present) {
677 ParseOamdCommonData(reader);
680 4, &ac4_substream_info_ajoc.n_fullband_upmix_signals_minus1));
681 if (ac4_substream_info_ajoc.n_fullband_upmix_signals_minus1 + 1 == 16) {
682 ac4_substream_info_ajoc.n_fullband_upmix_signals_minus1 +=
683 ReadAc4VariableBits(reader, 3);
685 ParseBedDynObjAssignment(
686 reader, ac4_substream_info_ajoc.n_fullband_upmix_signals_minus1 + 1,
687 ac4_substream_info_ajoc);
689 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_sf_multiplier));
690 if (ac4_substream_info_ajoc.b_sf_multiplier) {
691 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.sf_multiplier));
694 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_bitrate_info));
695 if (ac4_substream_info_ajoc.b_bitrate_info) {
696 RCHECK(reader->
ReadBits(3, &ac4_substream_info_ajoc.bitrate_indicator));
697 if ((ac4_substream_info_ajoc.bitrate_indicator & 0x1) == 1) {
699 RCHECK(reader->
ReadBits(2, &more_bits));
700 ac4_substream_info_ajoc.bitrate_indicator =
701 (ac4_substream_info_ajoc.bitrate_indicator << 2) + more_bits;
704 for (
int i = 0; i < frame_rate_factor; i++) {
705 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_audio_ndot));
707 if (b_substreams_present == 1) {
708 RCHECK(reader->
ReadBits(2, &ac4_substream_info_ajoc.substream_index));
709 if (ac4_substream_info_ajoc.substream_index == 3) {
710 ac4_substream_info_ajoc.substream_index += ReadAc4VariableBits(reader, 2);
717bool AC4Parser::ParseBedDynObjAssignment(
720 Ac4SubstreamInfoAjoc& ac4_substream_info_ajoc) {
721 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_dyn_objects_only));
722 if (ac4_substream_info_ajoc.b_dyn_objects_only == 0) {
723 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_isf));
724 if (ac4_substream_info_ajoc.b_isf) {
725 RCHECK(reader->
ReadBits(3, &ac4_substream_info_ajoc.isf_config));
727 RCHECK(reader->
ReadBits(1, &ac4_substream_info_ajoc.b_ch_assign_code));
728 if (ac4_substream_info_ajoc.b_ch_assign_code) {
730 reader->
ReadBits(3, &ac4_substream_info_ajoc.bed_chan_assign_code));
733 reader->
ReadBits(1, &ac4_substream_info_ajoc.b_chan_assign_mask));
734 if (ac4_substream_info_ajoc.b_chan_assign_mask) {
736 1, &ac4_substream_info_ajoc.b_nonstd_bed_channel_assignment));
737 if (ac4_substream_info_ajoc.b_nonstd_bed_channel_assignment) {
740 &ac4_substream_info_ajoc.nonstd_bed_channel_assignment_mask));
743 10, &ac4_substream_info_ajoc.std_bed_channel_assignment_mask));
747 int bed_ch_bits = (int)ceil(log((
float)n_signals) / log((
float)2));
749 bed_ch_bits, &ac4_substream_info_ajoc.n_bed_signals_minus1));
750 ac4_substream_info_ajoc.n_bed_signals =
751 ac4_substream_info_ajoc.n_bed_signals_minus1 + 1;
753 ac4_substream_info_ajoc.n_bed_signals = 1;
755 for (
int b = 0; b < ac4_substream_info_ajoc.n_bed_signals; b++) {
757 4, &ac4_substream_info_ajoc.nonstd_bed_channel_assignment));
766bool AC4Parser::ParseOamdCommonData(
BitReader* reader) {
767 OamdCommonData oamd_common_data;
768 RCHECK(reader->
ReadBits(1, &oamd_common_data.b_default_screen_size_ratio));
769 if (oamd_common_data.b_default_screen_size_ratio == 0) {
771 reader->
ReadBits(5, &oamd_common_data.master_screen_size_ratio_code));
773 RCHECK(reader->
ReadBits(1, &oamd_common_data.b_bed_object_chan_distribute));
774 RCHECK(reader->
ReadBits(1, &oamd_common_data.b_additional_data));
775 if (oamd_common_data.b_additional_data) {
776 RCHECK(reader->
ReadBits(1, &oamd_common_data.add_data_bytes_minus1));
777 oamd_common_data.add_data_bytes =
778 oamd_common_data.add_data_bytes_minus1 + 1;
779 if (oamd_common_data.add_data_bytes == 2) {
780 oamd_common_data.add_data_bytes += ReadAc4VariableBits(reader, 2);
782 reader->
SkipBytes(oamd_common_data.add_data_bytes);
787bool AC4Parser::ParseAc4SubstreamInfoObj(
BitReader* reader,
789 int frame_rate_factor,
790 int b_substreams_present) {
791 Ac4SubstreamInfoObj ac4_substream_info_obj;
792 RCHECK(reader->
ReadBits(3, &ac4_substream_info_obj.n_objects_code));
793 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_dynamic_objects));
794 if (ac4_substream_info_obj.b_dynamic_objects) {
795 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_lfe));
797 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_bed_objects));
798 if (ac4_substream_info_obj.b_bed_objects) {
799 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_bed_start));
800 if (ac4_substream_info_obj.b_bed_start) {
801 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_ch_assign_code));
802 if (ac4_substream_info_obj.b_ch_assign_code) {
804 3, &ac4_substream_info_obj.bed_chan_assign_code));
807 1, &ac4_substream_info_obj.b_nonstd_bed_channel_assignment));
808 if (ac4_substream_info_obj.b_nonstd_bed_channel_assignment) {
811 &ac4_substream_info_obj.nonstd_bed_channel_assignment_mask));
814 10, &ac4_substream_info_obj.std_bed_channel_assignment_mask));
819 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_isf));
820 if (ac4_substream_info_obj.b_isf) {
821 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_isf_start));
822 if (ac4_substream_info_obj.b_isf_start) {
823 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.isf_config));
827 RCHECK(reader->
ReadBits(4, &res_bytes));
833 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_sf_multiplier));
834 if (ac4_substream_info_obj.b_sf_multiplier) {
835 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.sf_multiplier));
838 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_bitrate_info));
839 if (ac4_substream_info_obj.b_bitrate_info) {
840 RCHECK(reader->
ReadBits(3, &ac4_substream_info_obj.bitrate_indicator));
841 if ((ac4_substream_info_obj.bitrate_indicator & 0x1) == 1) {
843 RCHECK(reader->
ReadBits(2, &more_bits));
844 ac4_substream_info_obj.bitrate_indicator =
845 (ac4_substream_info_obj.bitrate_indicator << 2) + more_bits;
848 for (
int i = 0; i < frame_rate_factor; i++) {
849 RCHECK(reader->
ReadBits(1, &ac4_substream_info_obj.b_audio_ndot));
851 if (b_substreams_present == 1) {
852 RCHECK(reader->
ReadBits(2, &ac4_substream_info_obj.substream_index));
853 if (ac4_substream_info_obj.substream_index == 3) {
854 ac4_substream_info_obj.substream_index += ReadAc4VariableBits(reader, 2);
861int AC4Parser::ParseChannelMode(
BitReader* reader,
int presentation_version) {
862 int channel_mode_code = 0;
864 RCHECK(reader->
ReadBits(1, &channel_mode_code));
865 if (channel_mode_code == 0) {
868 RCHECK(reader->
ReadBits(1, &read_more));
869 channel_mode_code = (channel_mode_code << 1) | read_more;
870 if (channel_mode_code == 2) {
871 return CH_MODE_STEREO;
873 RCHECK(reader->
ReadBits(2, &read_more));
874 channel_mode_code = (channel_mode_code << 2) | read_more;
875 switch (channel_mode_code) {
883 RCHECK(reader->
ReadBits(3, &read_more));
884 channel_mode_code = (channel_mode_code << 3) | read_more;
885 switch (channel_mode_code) {
887 if (presentation_version == 2) {
888 return CH_MODE_STEREO;
890 return CH_MODE_70_34;
893 if (presentation_version == 2) {
895 return CH_MODE_STEREO;
897 return CH_MODE_71_34;
900 return CH_MODE_70_52;
902 return CH_MODE_71_52;
904 return CH_MODE_70_322;
906 return CH_MODE_71_322;
908 RCHECK(reader->
ReadBits(1, &read_more));
909 channel_mode_code = (channel_mode_code << 1) | read_more;
910 switch (channel_mode_code) {
912 return CH_MODE_7_0_4;
914 return CH_MODE_7_1_4;
916 RCHECK(reader->
ReadBits(1, &read_more));
917 channel_mode_code = (channel_mode_code << 1) | read_more;
918 switch (channel_mode_code) {
920 return CH_MODE_9_0_4;
922 return CH_MODE_9_1_4;
927 ReadAc4VariableBits(reader, 2);
928 return CH_MODE_RESERVED;
All the methods that are virtual are virtual for mocking.