/// <summary> /// Initializes a new instance of the <see cref="AudioTrackCodecData"/> class. /// </summary> /// <param name="waveFormatEx">The wave format ex.</param> public AudioTrackCodecData(WaveFormatEx waveFormatEx) { if (waveFormatEx != null) { this.PacketSize = (ushort)waveFormatEx.BlockAlign; this.AudioTag = (ushort)waveFormatEx.FormatTag; this.FourCodecCode = MapAudioTagToFourCodecCode(this.AudioTag); WaveFormatEx = waveFormatEx; } }
/// <summary> /// Initializes a new instance of the <see cref="AudioTrackCodecData"/> class. /// </summary> /// <param name="esds">The esds box.</param> public AudioTrackCodecData(AudioSampleEntryBox ase, ElementaryStreamDescriptorFullBox esds) { if (esds != null && esds.StreamDescriptor != null) { var decoderConfiguration = esds.StreamDescriptor.SubDescriptors.SingleOrDefault(d => d.Tag == DescriptorTag.DECODER_CONFIG) as DecoderConfigurationDescriptor; if (decoderConfiguration != null) { var decoderSpecificInformation = decoderConfiguration.SubDescriptors.SingleOrDefault(d => d.Tag == DescriptorTag.DECODER_SPECIFIC_INFO) as DecoderSpecificInformationDescriptor; switch (decoderConfiguration.ObjectTypeIndication) { case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG1_AUDIO: this.PacketSize = 1; this.AudioTag = 0x55; break; case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_AAC_AUDIO_SSRP: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_AAC_AUDIO_LC: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_AAC_AUDIO_MAIN: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG4_AUDIO: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_PART3_AUDIO: this.PacketSize = 4; if (decoderSpecificInformation != null && (decoderSpecificInformation.Information[0] == 0x05 || decoderSpecificInformation.Information[0] == 0x1D)) { this.AudioTag = 0x1610; //HE-AAC } else { this.AudioTag = 0xFF; //AAC-LC } break; default: break; } this.FourCodecCode = MapAudioTagToFourCodecCode(this.AudioTag); WaveFormatEx = new WaveFormatEx(); WaveFormatEx.FormatTag = (short)this.AudioTag; WaveFormatEx.Channels = (short)ase.ChannelCount; WaveFormatEx.SamplesPerSec = (int)ase.SampleRate; WaveFormatEx.BitsPerSample = (short)ase.SampleSize; WaveFormatEx.BlockAlign = 8; WaveFormatEx.AvgBytesPerSec = WaveFormatEx.SamplesPerSec * WaveFormatEx.Channels * WaveFormatEx.BitsPerSample / WaveFormatEx.BlockAlign; if (decoderSpecificInformation != null) { WaveFormatEx.Size = (short)decoderSpecificInformation.Information.Length; WaveFormatEx.ExtendedData = decoderSpecificInformation.Information; } } } }
/// <summary> /// Reads the sample entry properties from stream. /// </summary> /// <param name="reader">The stream reader.</param> internal override void ReadSampleEntryPropertiesFromStream(BoxBinaryReader reader) { this.reserved1 = reader.ReadUInt16(); this.reserved2 = reader.ReadUInt16(); this.reserved3 = reader.ReadUInt32(); this.ChannelCount = reader.ReadUInt16(); this.SampleSize = reader.ReadUInt16(); this.predefined = reader.ReadUInt16(); this.reserved4 = reader.ReadUInt16(); this.SampleRate = reader.ReadUInt32(); if (reader.PeekNextBoxType() != BoxType.Null) { ReadInnerBoxes(reader, BoxType.Esds, BoxType.Wfex, BoxType.Sinf, BoxType.Dec3, BoxType.Dac3, BoxType.Dmlp, BoxType.Ddts); this.AudioCodecData = GetAudioCodecDataFromInnerBoxes(); } else { var waveFormatEx = new WaveFormatEx(reader); this.AudioCodecData = new AudioTrackCodecData(waveFormatEx); } }
/// <summary> /// Initializes a new instance of the <see cref="AudioTrackCodecData"/> class. /// </summary> /// <param name="esds">The esds box.</param> public AudioTrackCodecData(AudioSampleEntryBox ase, ElementaryStreamDescriptorFullBox esds) { if (esds != null && esds.StreamDescriptor != null) { var decoderConfiguration = esds.StreamDescriptor.SubDescriptors.SingleOrDefault(d => d.Tag == DescriptorTag.DECODER_CONFIG) as DecoderConfigurationDescriptor; if (decoderConfiguration != null) { var decoderSpecificInformation = decoderConfiguration.SubDescriptors.SingleOrDefault(d => d.Tag == DescriptorTag.DECODER_SPECIFIC_INFO) as DecoderSpecificInformationDescriptor; switch (decoderConfiguration.ObjectTypeIndication) { case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG1_AUDIO: this.PacketSize = 1; this.AudioTag = 0x55; break; case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_AAC_AUDIO_SSRP: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_AAC_AUDIO_LC: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_AAC_AUDIO_MAIN: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG4_AUDIO: case DecoderConfigurationDescriptor.DecoderObjectTypes.MPEG2_PART3_AUDIO: this.PacketSize = 4; if (decoderSpecificInformation != null && (decoderSpecificInformation.Information[0] == 0x05 || decoderSpecificInformation.Information[0] == 0x1D)) this.AudioTag = 0x1610; //HE-AAC else this.AudioTag = 0xFF; //AAC-LC break; default: break; } this.FourCodecCode = MapAudioTagToFourCodecCode(this.AudioTag); WaveFormatEx = new WaveFormatEx(); WaveFormatEx.FormatTag = (short)this.AudioTag; WaveFormatEx.Channels = (short)ase.ChannelCount; WaveFormatEx.SamplesPerSec = (int)ase.SampleRate; WaveFormatEx.BitsPerSample = (short)ase.SampleSize; WaveFormatEx.BlockAlign = 8; WaveFormatEx.AvgBytesPerSec = WaveFormatEx.SamplesPerSec * WaveFormatEx.Channels * WaveFormatEx.BitsPerSample / WaveFormatEx.BlockAlign; if (decoderSpecificInformation != null) { WaveFormatEx.Size = (short)decoderSpecificInformation.Information.Length; WaveFormatEx.ExtendedData = decoderSpecificInformation.Information; } } } }