Shaka Packager SDK
Loading...
Searching...
No Matches
hls_audio_util.cc
1// Copyright 2018 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/codecs/hls_audio_util.h>
8
9#include <cstddef>
10#include <cstdint>
11#include <vector>
12
13#include <absl/log/check.h>
14#include <absl/log/log.h>
15
16#include <packager/media/base/buffer_writer.h>
17#include <packager/media/base/fourccs.h>
18#include <packager/media/base/stream_info.h>
19#include <packager/media/codecs/aac_audio_specific_config.h>
20
21namespace shaka {
22namespace media {
23
24bool WriteAudioSetupInformation(Codec codec,
25 const uint8_t* audio_specific_config,
26 size_t audio_specific_config_size,
27 BufferWriter* audio_setup_information) {
28 uint32_t audio_type = FOURCC_NULL;
29 switch (codec) {
30 case kCodecAAC: {
31 AACAudioSpecificConfig config;
32 const bool result = config.Parse(std::vector<uint8_t>(
33 audio_specific_config,
34 audio_specific_config + audio_specific_config_size));
35
36 AACAudioSpecificConfig::AudioObjectType audio_object_type;
37 if (!result) {
38 LOG(WARNING) << "Failed to parse config. Assuming AAC-LC.";
39 audio_object_type = AACAudioSpecificConfig::AOT_AAC_LC;
40 } else {
41 audio_object_type = config.GetAudioObjectType();
42 }
43
44 switch (audio_object_type) {
45 case AACAudioSpecificConfig::AOT_AAC_LC:
46 audio_type = FOURCC_zaac;
47 break;
48 case AACAudioSpecificConfig::AOT_SBR:
49 audio_type = FOURCC_zach;
50 break;
51 case AACAudioSpecificConfig::AOT_PS:
52 audio_type = FOURCC_zacp;
53 break;
54 default:
55 LOG(ERROR) << "Unknown object type for aac " << audio_object_type;
56 return false;
57 }
58 } break;
59 case kCodecAC3:
60 audio_type = FOURCC_zac3;
61 break;
62 case kCodecEAC3:
63 audio_type = FOURCC_zec3;
64 break;
65 default:
66 LOG(ERROR) << "Codec " << codec << " is not supported in encrypted TS.";
67 return false;
68 }
69
70 DCHECK_NE(audio_type, FOURCC_NULL);
71 audio_setup_information->AppendInt(audio_type);
72 // Priming. Since no info from encoder, set it to 0x0000.
73 audio_setup_information->AppendInt(static_cast<uint16_t>(0x0000));
74 // Version is always 0x01.
75 audio_setup_information->AppendInt(static_cast<uint8_t>(0x01));
76
77 // Size is one byte.
78 if (audio_specific_config_size > 0xFF) {
79 LOG(ERROR) << "Audio specific config should not be larger than one byte "
80 << audio_specific_config_size;
81 return false;
82 }
83 audio_setup_information->AppendInt(
84 static_cast<uint8_t>(audio_specific_config_size));
85
86 audio_setup_information->AppendArray(audio_specific_config,
87 audio_specific_config_size);
88 return true;
89}
90
91} // namespace media
92} // namespace shaka
All the methods that are virtual are virtual for mocking.