54 $info = &$this->getid3->info;
55 $info[
'fileformat'] =
'aac';
56 $info[
'audio'][
'dataformat'] =
'aac';
57 $info[
'audio'][
'lossless'] =
false;
59 fseek($this->getid3->fp,
$info[
'avdataoffset'], SEEK_SET);
60 $AACheader =
fread($this->getid3->fp, 1024);
63 if (substr($AACheader, 0, 4) ==
'ADIF') {
88 $info[
'aac'][
'header_type'] =
'ADIF';
90 $info[
'aac'][
'header'][
'mpeg_version'] = 4;
92 $info[
'aac'][
'header'][
'copyright'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) ==
'1');
94 if (
$info[
'aac'][
'header'][
'copyright']) {
98 $info[
'aac'][
'header'][
'original_copy'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) ==
'1');
100 $info[
'aac'][
'header'][
'home'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) ==
'1');
102 $info[
'aac'][
'header'][
'is_vbr'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) ==
'1');
104 if (
$info[
'aac'][
'header'][
'is_vbr']) {
105 $info[
'audio'][
'bitrate_mode'] =
'vbr';
106 $info[
'aac'][
'header'][
'bitrate_max'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 23));
109 $info[
'audio'][
'bitrate_mode'] =
'cbr';
110 $info[
'aac'][
'header'][
'bitrate'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 23));
112 $info[
'audio'][
'bitrate'] =
$info[
'aac'][
'header'][
'bitrate'];
114 if (
$info[
'audio'][
'bitrate'] == 0) {
115 $info[
'error'][] =
'Corrupt AAC file: bitrate_audio == zero';
119 $info[
'aac'][
'header'][
'num_program_configs'] = 1 +
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
122 for ($i = 0; $i <
$info[
'aac'][
'header'][
'num_program_configs']; $i++) {
171 if (!$info[
'aac'][
'header'][
'is_vbr']) {
172 $info[
'aac'][
'program_configs'][$i][
'buffer_fullness'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 20));
175 $info[
'aac'][
'program_configs'][$i][
'element_instance_tag'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
177 $info[
'aac'][
'program_configs'][$i][
'object_type'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2));
179 $info[
'aac'][
'program_configs'][$i][
'sampling_frequency_index'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
181 $info[
'aac'][
'program_configs'][$i][
'num_front_channel_elements'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
183 $info[
'aac'][
'program_configs'][$i][
'num_side_channel_elements'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
185 $info[
'aac'][
'program_configs'][$i][
'num_back_channel_elements'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
187 $info[
'aac'][
'program_configs'][$i][
'num_lfe_channel_elements'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2));
189 $info[
'aac'][
'program_configs'][$i][
'num_assoc_data_elements'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 3));
191 $info[
'aac'][
'program_configs'][$i][
'num_valid_cc_elements'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
193 $info[
'aac'][
'program_configs'][$i][
'mono_mixdown_present'] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
195 if ($info[
'aac'][
'program_configs'][$i][
'mono_mixdown_present']) {
196 $info[
'aac'][
'program_configs'][$i][
'mono_mixdown_element_number'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
199 $info[
'aac'][
'program_configs'][$i][
'stereo_mixdown_present'] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
201 if ($info[
'aac'][
'program_configs'][$i][
'stereo_mixdown_present']) {
202 $info[
'aac'][
'program_configs'][$i][
'stereo_mixdown_element_number'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
205 $info[
'aac'][
'program_configs'][$i][
'matrix_mixdown_idx_present'] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
207 if ($info[
'aac'][
'program_configs'][$i][
'matrix_mixdown_idx_present']) {
208 $info[
'aac'][
'program_configs'][$i][
'matrix_mixdown_idx'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2));
210 $info[
'aac'][
'program_configs'][$i][
'pseudo_surround_enable'] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
213 for ($j = 0; $j < $info[
'aac'][
'program_configs'][$i][
'num_front_channel_elements']; $j++) {
214 $info[
'aac'][
'program_configs'][$i][
'front_element_is_cpe'][$j] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
216 $info[
'aac'][
'program_configs'][$i][
'front_element_tag_select'][$j] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
219 for ($j = 0; $j < $info[
'aac'][
'program_configs'][$i][
'num_side_channel_elements']; $j++) {
220 $info[
'aac'][
'program_configs'][$i][
'side_element_is_cpe'][$j] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
222 $info[
'aac'][
'program_configs'][$i][
'side_element_tag_select'][$j] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
225 for ($j = 0; $j < $info[
'aac'][
'program_configs'][$i][
'num_back_channel_elements']; $j++) {
226 $info[
'aac'][
'program_configs'][$i][
'back_element_is_cpe'][$j] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
228 $info[
'aac'][
'program_configs'][$i][
'back_element_tag_select'][$j] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
231 for ($j = 0; $j < $info[
'aac'][
'program_configs'][$i][
'num_lfe_channel_elements']; $j++) {
232 $info[
'aac'][
'program_configs'][$i][
'lfe_element_tag_select'][$j] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
235 for ($j = 0; $j < $info[
'aac'][
'program_configs'][$i][
'num_assoc_data_elements']; $j++) {
236 $info[
'aac'][
'program_configs'][$i][
'assoc_data_element_tag_select'][$j] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
239 for ($j = 0; $j < $info[
'aac'][
'program_configs'][$i][
'num_valid_cc_elements']; $j++) {
240 $info[
'aac'][
'program_configs'][$i][
'cc_element_is_ind_sw'][$j] = (bool)
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1));
242 $info[
'aac'][
'program_configs'][$i][
'valid_cc_element_tag_select'][$j] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4));
246 $bitoffset = ceil($bitoffset / 8) * 8;
248 $info[
'aac'][
'program_configs'][$i][
'comment_field_bytes'] =
Helper::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 8));
250 $info[
'aac'][
'program_configs'][$i][
'comment_field'] =
Helper::Bin2String(substr($AACheaderBitstream, $bitoffset, 8 * $info[
'aac'][
'program_configs'][$i][
'comment_field_bytes']));
251 $bitoffset += 8 * $info[
'aac'][
'program_configs'][$i][
'comment_field_bytes'];
253 $info[
'aac'][
'header'][
'profile'] = self::AACprofileLookup($info[
'aac'][
'program_configs'][$i][
'object_type'], $info[
'aac'][
'header'][
'mpeg_version']);
254 $info[
'aac'][
'program_configs'][$i][
'sampling_frequency'] = self::AACsampleRateLookup($info[
'aac'][
'program_configs'][$i][
'sampling_frequency_index']);
255 $info[
'audio'][
'sample_rate'] = $info[
'aac'][
'program_configs'][$i][
'sampling_frequency'];
256 $info[
'audio'][
'channels'] = self::AACchannelCountCalculate($info[
'aac'][
'program_configs'][$i]);
257 if ($info[
'aac'][
'program_configs'][$i][
'comment_field']) {
258 $info[
'aac'][
'comments'][] = $info[
'aac'][
'program_configs'][$i][
'comment_field'];
261 $info[
'playtime_seconds'] = (($info[
'avdataend'] - $info[
'avdataoffset']) * 8) / $info[
'audio'][
'bitrate'];
263 $info[
'audio'][
'encoder_options'] = $info[
'aac'][
'header_type'].
' '.$info[
'aac'][
'header'][
'profile'];
269 unset($info[
'fileformat']);
271 $info[
'error'][] =
'AAC-ADIF synch not found at offset '.$info[
'avdataoffset'].
' (expected "ADIF", found "'.substr($AACheader, 0, 4).
'" instead)';
static BigEndian2Bin($byteword)
fseek($bytes, $whence=SEEK_SET)
static Bin2String($binstring)
static Bin2Dec($binstring, $signed=false)