parent
f0107beb9e
commit
8913dbda85
|
@ -40,7 +40,7 @@ Shaka Packager supports:
|
||||||
| VP9 | I / O | I / O | - | - | - |
|
| VP9 | I / O | I / O | - | - | - |
|
||||||
| AV1 | I / O | I / O | - | - | - |
|
| AV1 | I / O | I / O | - | - | - |
|
||||||
| AAC | I / O | - | I / O | I | O |
|
| AAC | I / O | - | I / O | I | O |
|
||||||
| MP3 | - | - | I / O | - | O |
|
| MP3 | O | - | I / O | - | O |
|
||||||
| Dolby AC3 | I / O | - | I / O | - | O |
|
| Dolby AC3 | I / O | - | I / O | - | O |
|
||||||
| Dolby EAC3 | I / O | - | O | - | O |
|
| Dolby EAC3 | I / O | - | O | - | O |
|
||||||
| DTS | I / O | - | - | - | - |
|
| DTS | I / O | - | - | - | - |
|
||||||
|
|
|
@ -167,13 +167,17 @@ void DecoderConfigDescriptor::WriteInternal(BufferWriter* writer) {
|
||||||
writer->AppendNBytes(buffer_size_db_, 3);
|
writer->AppendNBytes(buffer_size_db_, 3);
|
||||||
writer->AppendInt(max_bitrate_);
|
writer->AppendInt(max_bitrate_);
|
||||||
writer->AppendInt(avg_bitrate_);
|
writer->AppendInt(avg_bitrate_);
|
||||||
decoder_specific_info_descriptor_.Write(writer);
|
|
||||||
|
if (!decoder_specific_info_descriptor_.data().empty())
|
||||||
|
decoder_specific_info_descriptor_.Write(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t DecoderConfigDescriptor::ComputeDataSize() {
|
size_t DecoderConfigDescriptor::ComputeDataSize() {
|
||||||
// object_type (1 byte), stream_type (1 byte), decoding_buffer_size (3 bytes),
|
// object_type (1 byte), stream_type (1 byte), decoding_buffer_size (3 bytes),
|
||||||
// max_bitrate (4 bytes), avg_bitrate (4 bytes).
|
// max_bitrate (4 bytes), avg_bitrate (4 bytes).
|
||||||
const size_t data_size_without_children = 1 + 1 + 3 + 4 + 4;
|
const size_t data_size_without_children = 1 + 1 + 3 + 4 + 4;
|
||||||
|
if (decoder_specific_info_descriptor_.data().empty())
|
||||||
|
return data_size_without_children;
|
||||||
return data_size_without_children +
|
return data_size_without_children +
|
||||||
decoder_specific_info_descriptor_.ComputeSize();
|
decoder_specific_info_descriptor_.ComputeSize();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@ enum class ObjectType : uint8_t {
|
||||||
kForbidden = 0,
|
kForbidden = 0,
|
||||||
kISO_14496_3 = 0x40, // MPEG4 AAC
|
kISO_14496_3 = 0x40, // MPEG4 AAC
|
||||||
kISO_13818_7_AAC_LC = 0x67, // MPEG2 AAC-LC
|
kISO_13818_7_AAC_LC = 0x67, // MPEG2 AAC-LC
|
||||||
|
kISO_13818_3_MPEG1 = 0x69, // MPEG1 ISO/IEC 13818-3, 16,22.05,24kHz
|
||||||
|
kISO_11172_3_MPEG1 = 0x6B, // MPEG1 ISO/IEC 11172-3, 32,44.1,48kHz
|
||||||
kDTSC = 0xA9, // DTS Coherent Acoustics audio
|
kDTSC = 0xA9, // DTS Coherent Acoustics audio
|
||||||
kDTSE = 0xAC, // DTS Express low bit rate audio
|
kDTSE = 0xAC, // DTS Express low bit rate audio
|
||||||
kDTSH = 0xAA, // DTS-HD High Resolution Audio
|
kDTSH = 0xAA, // DTS-HD High Resolution Audio
|
||||||
|
|
|
@ -67,6 +67,7 @@ FourCC CodecToFourCC(Codec codec, H26xStreamFormat h26x_stream_format) {
|
||||||
case kCodecVP9:
|
case kCodecVP9:
|
||||||
return FOURCC_vp09;
|
return FOURCC_vp09;
|
||||||
case kCodecAAC:
|
case kCodecAAC:
|
||||||
|
case kCodecMP3:
|
||||||
return FOURCC_mp4a;
|
return FOURCC_mp4a;
|
||||||
case kCodecAC3:
|
case kCodecAC3:
|
||||||
return FOURCC_ac_3;
|
return FOURCC_ac_3;
|
||||||
|
@ -487,6 +488,25 @@ bool MP4Muxer::GenerateAudioTrak(const AudioStreamInfo* audio_info,
|
||||||
case kCodecFlac:
|
case kCodecFlac:
|
||||||
audio.dfla.data = audio_info->codec_config();
|
audio.dfla.data = audio_info->codec_config();
|
||||||
break;
|
break;
|
||||||
|
case kCodecMP3: {
|
||||||
|
audio.esds.es_descriptor.set_esid(track_id);
|
||||||
|
DecoderConfigDescriptor* decoder_config =
|
||||||
|
audio.esds.es_descriptor.mutable_decoder_config_descriptor();
|
||||||
|
uint32_t samplerate = audio_info->sampling_frequency();
|
||||||
|
if (samplerate < 32000)
|
||||||
|
decoder_config->set_object_type(ObjectType::kISO_13818_3_MPEG1);
|
||||||
|
else
|
||||||
|
decoder_config->set_object_type(ObjectType::kISO_11172_3_MPEG1);
|
||||||
|
decoder_config->set_max_bitrate(audio_info->max_bitrate());
|
||||||
|
decoder_config->set_avg_bitrate(audio_info->avg_bitrate());
|
||||||
|
|
||||||
|
// For values of DecoderConfigDescriptor.objectTypeIndication
|
||||||
|
// that refer to streams complying with ISO/IEC 11172-3 or
|
||||||
|
// ISO/IEC 13818-3 the decoder specific information is empty
|
||||||
|
// since all necessary data is contained in the bitstream frames
|
||||||
|
// itself.
|
||||||
|
break;
|
||||||
|
}
|
||||||
case kCodecOpus:
|
case kCodecOpus:
|
||||||
audio.dops.opus_identification_header = audio_info->codec_config();
|
audio.dops.opus_identification_header = audio_info->codec_config();
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue