@@ -209,6 +209,7 @@ pub enum SampleEntry {
209
209
pub struct ES_Descriptor {
210
210
pub audio_codec : CodecType ,
211
211
pub audio_sample_rate : Option < u32 > ,
212
+ pub audio_channel_count : Option < u16 > ,
212
213
pub codec_specific_config : Vec < u8 > ,
213
214
}
214
215
@@ -1136,10 +1137,11 @@ fn read_esds<T: Read>(src: &mut BMFFBox<T>) -> Result<ES_Descriptor> {
1136
1137
let esds_array = try!( read_buf ( src, esds_size as usize ) ) ;
1137
1138
1138
1139
// Parsing DecoderConfig descriptor to get the object_profile_indicator
1139
- // for correct codec type and audio sample rate.
1140
- let ( object_profile_indicator, sample_frequency) = {
1140
+ // for correct codec type, audio sample rate and channel counts .
1141
+ let ( object_profile_indicator, sample_frequency, channels ) = {
1141
1142
let mut object_profile: u8 = 0 ;
1142
1143
let mut sample_frequency = None ;
1144
+ let mut channels = None ;
1143
1145
1144
1146
// clone a esds cursor for parsing.
1145
1147
let esds = & mut Cursor :: new ( & esds_array) ;
@@ -1209,12 +1211,16 @@ fn read_esds<T: Read>(src: &mut BMFFBox<T>) -> Result<ES_Descriptor> {
1209
1211
1210
1212
let sample_index = ( audio_specific_config & 0x07FF ) >> 7 ;
1211
1213
1214
+ let channel_counts = ( audio_specific_config & 0x007F ) >> 3 ;
1215
+
1212
1216
sample_frequency =
1213
1217
frequency_table. iter ( ) . find ( |item| item. 0 == sample_index) . map ( |x| x. 1 ) ;
1218
+
1219
+ channels = Some ( channel_counts) ;
1214
1220
}
1215
1221
}
1216
1222
1217
- ( object_profile, sample_frequency)
1223
+ ( object_profile, sample_frequency, channels )
1218
1224
} ;
1219
1225
1220
1226
let codec = match object_profile_indicator {
@@ -1230,6 +1236,7 @@ fn read_esds<T: Read>(src: &mut BMFFBox<T>) -> Result<ES_Descriptor> {
1230
1236
Ok ( ES_Descriptor {
1231
1237
audio_codec : codec,
1232
1238
audio_sample_rate : sample_frequency,
1239
+ audio_channel_count : channels,
1233
1240
codec_specific_config : esds_array,
1234
1241
} )
1235
1242
}
0 commit comments