public function Analyze() {
$info = &$this->getid3->info;
$info['ac3']['raw']['bsi'] = array();
$thisfile_ac3 = &$info['ac3'];
$thisfile_ac3_raw = &$thisfile_ac3['raw'];
$thisfile_ac3_raw_bsi = &$thisfile_ac3_raw['bsi'];
$info['fileformat'] = 'ac3';
$this->fseek($info['avdataoffset']);
$tempAC3header = $this->fread(100); $this->AC3header['syncinfo'] = getid3_lib::BigEndian2Int(substr($tempAC3header, 0, 2));
$this->AC3header['bsi'] = getid3_lib::BigEndian2Bin(substr($tempAC3header, 2));
$thisfile_ac3_raw_bsi['bsid'] = (getid3_lib::LittleEndian2Int(substr($tempAC3header, 5, 1)) & 0xF8) >> 3; unset($tempAC3header);
if ($this->AC3header['syncinfo'] !== self::syncword) {
if (!$this->isDependencyFor('matroska')) {
unset($info['fileformat'], $info['ac3']);
return $this->error('Expecting "'.dechex(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.dechex($this->AC3header['syncinfo']).'"');
}
}
$info['audio']['dataformat'] = 'ac3';
$info['audio']['bitrate_mode'] = 'cbr';
$info['audio']['lossless'] = false;
if ($thisfile_ac3_raw_bsi['bsid'] <= 8) {
$thisfile_ac3_raw_bsi['crc1'] = getid3_lib::Bin2Dec($this->getid3_ac3::readHeaderBSI(16));
$thisfile_ac3_raw_bsi['fscod'] = $this->getid3_ac3::readHeaderBSI(2); $thisfile_ac3_raw_bsi['frmsizecod'] = $this->getid3_ac3::readHeaderBSI(6); if ($thisfile_ac3_raw_bsi['frmsizecod'] > 37) { $this->warning('Unexpected ac3.bsi.frmsizecod value: '.$thisfile_ac3_raw_bsi['frmsizecod'].', bitrate not set correctly');
}
$thisfile_ac3_raw_bsi['bsid'] = $this->getid3_ac3::readHeaderBSI(5); $thisfile_ac3_raw_bsi['bsmod'] = $this->getid3_ac3::readHeaderBSI(3);
$thisfile_ac3_raw_bsi['acmod'] = $this->getid3_ac3::readHeaderBSI(3);
if ($thisfile_ac3_raw_bsi['acmod'] & 0x01) {
$thisfile_ac3_raw_bsi['cmixlev'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3['center_mix_level'] = self::centerMixLevelLookup($thisfile_ac3_raw_bsi['cmixlev']);
}
if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) {
$thisfile_ac3_raw_bsi['surmixlev'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3['surround_mix_level'] = self::surroundMixLevelLookup($thisfile_ac3_raw_bsi['surmixlev']);
}
if ($thisfile_ac3_raw_bsi['acmod'] == 0x02) {
$thisfile_ac3_raw_bsi['dsurmod'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3['dolby_surround_mode'] = self::dolbySurroundModeLookup($thisfile_ac3_raw_bsi['dsurmod']);
}
$thisfile_ac3_raw_bsi['flags']['lfeon'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
$thisfile_ac3_raw_bsi['dialnorm'] = $this->getid3_ac3::readHeaderBSI(5);
$thisfile_ac3_raw_bsi['flags']['compr'] = (bool) $this->getid3_ac3::readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['compr']) {
$thisfile_ac3_raw_bsi['compr'] = $this->getid3_ac3::readHeaderBSI(8); $thisfile_ac3['heavy_compression'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr']);
}
$thisfile_ac3_raw_bsi['flags']['langcod'] = (bool) $this->getid3_ac3::readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['langcod']) {
$thisfile_ac3_raw_bsi['langcod'] = $this->getid3_ac3::readHeaderBSI(8); }
$thisfile_ac3_raw_bsi['flags']['audprodinfo'] = (bool) $this->getid3_ac3::readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['audprodinfo']) {
$thisfile_ac3_raw_bsi['mixlevel'] = $this->getid3_ac3::readHeaderBSI(5); $thisfile_ac3_raw_bsi['roomtyp'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3['mixing_level'] = (80 + $thisfile_ac3_raw_bsi['mixlevel']).'dB';
$thisfile_ac3['room_type'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp']);
}
$thisfile_ac3_raw_bsi['dialnorm2'] = $this->getid3_ac3::readHeaderBSI(5); $thisfile_ac3['dialogue_normalization2'] = '-'.$thisfile_ac3_raw_bsi['dialnorm2'].'dB';
$thisfile_ac3_raw_bsi['flags']['compr2'] = (bool) $this->getid3_ac3::readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['compr2']) {
$thisfile_ac3_raw_bsi['compr2'] = $this->getid3_ac3::readHeaderBSI(8); $thisfile_ac3['heavy_compression2'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr2']);
}
$thisfile_ac3_raw_bsi['flags']['langcod2'] = (bool) $this->getid3_ac3::readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['langcod2']) {
$thisfile_ac3_raw_bsi['langcod2'] = $this->getid3_ac3::readHeaderBSI(8); }
$thisfile_ac3_raw_bsi['flags']['audprodinfo2'] = (bool) $this->getid3_ac3::readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['audprodinfo2']) {
$thisfile_ac3_raw_bsi['mixlevel2'] = $this->getid3_ac3::readHeaderBSI(5); $thisfile_ac3_raw_bsi['roomtyp2'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3['mixing_level2'] = (80 + $thisfile_ac3_raw_bsi['mixlevel2']).'dB';
$thisfile_ac3['room_type2'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp2']);
}
$thisfile_ac3_raw_bsi['copyright'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
$thisfile_ac3_raw_bsi['original'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
$thisfile_ac3_raw_bsi['flags']['timecod1'] = $this->getid3_ac3::readHeaderBSI(2); if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x01) {
$thisfile_ac3_raw_bsi['timecod1'] = $this->getid3_ac3::readHeaderBSI(14); $thisfile_ac3['timecode1'] = 0;
$thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x3E00) >> 9) * 3600; $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x01F8) >> 3) * 60; $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x0003) >> 0) * 8; }
if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x02) {
$thisfile_ac3_raw_bsi['timecod2'] = $this->getid3_ac3::readHeaderBSI(14); $thisfile_ac3['timecode2'] = 0;
$thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x3800) >> 11) * 1; $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x07C0) >> 6) * (1 / 30); $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x003F) >> 0) * ((1 / 30) / 60); }
$thisfile_ac3_raw_bsi['flags']['addbsi'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['addbsi']) {
$thisfile_ac3_raw_bsi['addbsi_length'] = $this->getid3_ac3::readHeaderBSI(6) + 1;
$this->AC3header['bsi'] .= getid3_lib::BigEndian2Bin($this->fread($thisfile_ac3_raw_bsi['addbsi_length']));
$thisfile_ac3_raw_bsi['addbsi_data'] = substr($this->AC3header['bsi'], $this->BSIoffset, $thisfile_ac3_raw_bsi['addbsi_length'] * 8);
$this->BSIoffset += $thisfile_ac3_raw_bsi['addbsi_length'] * 8;
}
} elseif ($thisfile_ac3_raw_bsi['bsid'] <= 16) {
$this->error('E-AC3 parsing is incomplete and experimental in this version of getID3 ('.$this->getid3->version().'). Notably the bitrate calculations are wrong -- value might (or not) be correct, but it is not calculated correctly. Email info@getid3.org if you know how to calculate EAC3 bitrate correctly.');
$info['audio']['dataformat'] = 'eac3';
$thisfile_ac3_raw_bsi['strmtyp'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3_raw_bsi['substreamid'] = $this->getid3_ac3::readHeaderBSI(3);
$thisfile_ac3_raw_bsi['frmsiz'] = $this->getid3_ac3::readHeaderBSI(11);
$thisfile_ac3_raw_bsi['fscod'] = $this->getid3_ac3::readHeaderBSI(2);
if ($thisfile_ac3_raw_bsi['fscod'] == 3) {
$thisfile_ac3_raw_bsi['fscod2'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3_raw_bsi['numblkscod'] = 3; } else {
$thisfile_ac3_raw_bsi['numblkscod'] = $this->getid3_ac3::readHeaderBSI(2);
}
$thisfile_ac3['bsi']['blocks_per_sync_frame'] = self::blocksPerSyncFrame($thisfile_ac3_raw_bsi['numblkscod']);
$thisfile_ac3_raw_bsi['acmod'] = $this->getid3_ac3::readHeaderBSI(3);
$thisfile_ac3_raw_bsi['flags']['lfeon'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
$thisfile_ac3_raw_bsi['bsid'] = $this->getid3_ac3::readHeaderBSI(5); $thisfile_ac3_raw_bsi['dialnorm'] = $this->getid3_ac3::readHeaderBSI(5);
$thisfile_ac3_raw_bsi['flags']['compr'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['compr']) {
$thisfile_ac3_raw_bsi['compr'] = $this->getid3_ac3::readHeaderBSI(8);
}
if ($thisfile_ac3_raw_bsi['acmod'] == 0) { $thisfile_ac3_raw_bsi['dialnorm2'] = $this->getid3_ac3::readHeaderBSI(5);
$thisfile_ac3_raw_bsi['flags']['compr2'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['compr2']) {
$thisfile_ac3_raw_bsi['compr2'] = $this->getid3_ac3::readHeaderBSI(8);
}
}
if ($thisfile_ac3_raw_bsi['strmtyp'] == 1) { $thisfile_ac3_raw_bsi['flags']['chanmap'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['chanmap']) {
$thisfile_ac3_raw_bsi['chanmap'] = $this->getid3_ac3::readHeaderBSI(8);
}
}
$thisfile_ac3_raw_bsi['flags']['mixmdat'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['mixmdat']) { if ($thisfile_ac3_raw_bsi['acmod'] > 2) { $thisfile_ac3_raw_bsi['dmixmod'] = $this->getid3_ac3::readHeaderBSI(2);
}
if (($thisfile_ac3_raw_bsi['acmod'] & 0x01) && ($thisfile_ac3_raw_bsi['acmod'] > 2)) { $thisfile_ac3_raw_bsi['ltrtcmixlev'] = $this->getid3_ac3::readHeaderBSI(3);
$thisfile_ac3_raw_bsi['lorocmixlev'] = $this->getid3_ac3::readHeaderBSI(3);
}
if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { $thisfile_ac3_raw_bsi['ltrtsurmixlev'] = $this->getid3_ac3::readHeaderBSI(3);
$thisfile_ac3_raw_bsi['lorosurmixlev'] = $this->getid3_ac3::readHeaderBSI(3);
}
if ($thisfile_ac3_raw_bsi['flags']['lfeon']) { $thisfile_ac3_raw_bsi['flags']['lfemixlevcod'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['lfemixlevcod']) {
$thisfile_ac3_raw_bsi['lfemixlevcod'] = $this->getid3_ac3::readHeaderBSI(5);
}
}
if ($thisfile_ac3_raw_bsi['strmtyp'] == 0) { $thisfile_ac3_raw_bsi['flags']['pgmscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['pgmscl']) {
$thisfile_ac3_raw_bsi['pgmscl'] = $this->getid3_ac3::readHeaderBSI(6);
}
if ($thisfile_ac3_raw_bsi['acmod'] == 0) { $thisfile_ac3_raw_bsi['flags']['pgmscl2'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['pgmscl2']) {
$thisfile_ac3_raw_bsi['pgmscl2'] = $this->getid3_ac3::readHeaderBSI(6);
}
}
$thisfile_ac3_raw_bsi['flags']['extpgmscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['extpgmscl']) {
$thisfile_ac3_raw_bsi['extpgmscl'] = $this->getid3_ac3::readHeaderBSI(6);
}
$thisfile_ac3_raw_bsi['mixdef'] = $this->getid3_ac3::readHeaderBSI(2);
if ($thisfile_ac3_raw_bsi['mixdef'] == 1) { $thisfile_ac3_raw_bsi['premixcmpsel'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
$thisfile_ac3_raw_bsi['drcsrc'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
$thisfile_ac3_raw_bsi['premixcmpscl'] = $this->getid3_ac3::readHeaderBSI(3);
} elseif ($thisfile_ac3_raw_bsi['mixdef'] == 2) { $thisfile_ac3_raw_bsi['mixdata'] = $this->getid3_ac3::readHeaderBSI(12);
} elseif ($thisfile_ac3_raw_bsi['mixdef'] == 3) { $mixdefbitsread = 0;
$thisfile_ac3_raw_bsi['mixdeflen'] = $this->getid3_ac3::readHeaderBSI(5); $mixdefbitsread += 5;
$thisfile_ac3_raw_bsi['flags']['mixdata2'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['mixdata2']) {
$thisfile_ac3_raw_bsi['premixcmpsel'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
$thisfile_ac3_raw_bsi['drcsrc'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
$thisfile_ac3_raw_bsi['premixcmpscl'] = $this->getid3_ac3::readHeaderBSI(3); $mixdefbitsread += 3;
$thisfile_ac3_raw_bsi['flags']['extpgmlscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmlscl']) {
$thisfile_ac3_raw_bsi['extpgmlscl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
$thisfile_ac3_raw_bsi['flags']['extpgmcscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmcscl']) {
$thisfile_ac3_raw_bsi['extpgmcscl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
$thisfile_ac3_raw_bsi['flags']['extpgmrscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmrscl']) {
$thisfile_ac3_raw_bsi['extpgmrscl'] = $this->getid3_ac3::readHeaderBSI(4);
}
$thisfile_ac3_raw_bsi['flags']['extpgmlsscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmlsscl']) {
$thisfile_ac3_raw_bsi['extpgmlsscl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
$thisfile_ac3_raw_bsi['flags']['extpgmrsscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmrsscl']) {
$thisfile_ac3_raw_bsi['extpgmrsscl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
$thisfile_ac3_raw_bsi['flags']['extpgmlfescl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmlfescl']) {
$thisfile_ac3_raw_bsi['extpgmlfescl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
$thisfile_ac3_raw_bsi['flags']['dmixscl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['dmixscl']) {
$thisfile_ac3_raw_bsi['dmixscl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
$thisfile_ac3_raw_bsi['flags']['addch'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['addch']) {
$thisfile_ac3_raw_bsi['flags']['extpgmaux1scl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmaux1scl']) {
$thisfile_ac3_raw_bsi['extpgmaux1scl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
$thisfile_ac3_raw_bsi['flags']['extpgmaux2scl'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['extpgmaux2scl']) {
$thisfile_ac3_raw_bsi['extpgmaux2scl'] = $this->getid3_ac3::readHeaderBSI(4); $mixdefbitsread += 4;
}
}
}
$thisfile_ac3_raw_bsi['flags']['mixdata3'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['mixdata3']) {
$thisfile_ac3_raw_bsi['spchdat'] = $this->getid3_ac3::readHeaderBSI(5); $mixdefbitsread += 5;
$thisfile_ac3_raw_bsi['flags']['addspchdat'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['addspchdat']) {
$thisfile_ac3_raw_bsi['spchdat1'] = $this->getid3_ac3::readHeaderBSI(5); $mixdefbitsread += 5;
$thisfile_ac3_raw_bsi['spchan1att'] = $this->getid3_ac3::readHeaderBSI(2); $mixdefbitsread += 2;
$thisfile_ac3_raw_bsi['flags']['addspchdat1'] = (bool) $this->getid3_ac3::readHeaderBSI(1); $mixdefbitsread += 1;
if ($thisfile_ac3_raw_bsi['flags']['addspchdat1']) {
$thisfile_ac3_raw_bsi['spchdat2'] = $this->getid3_ac3::readHeaderBSI(5); $mixdefbitsread += 5;
$thisfile_ac3_raw_bsi['spchan2att'] = $this->getid3_ac3::readHeaderBSI(3); $mixdefbitsread += 3;
}
}
}
$mixdata_bits = (8 * ($thisfile_ac3_raw_bsi['mixdeflen'] + 2)) - $mixdefbitsread;
$mixdata_fill = (($mixdata_bits % 8) ? 8 - ($mixdata_bits % 8) : 0);
$thisfile_ac3_raw_bsi['mixdata'] = $this->getid3_ac3::readHeaderBSI($mixdata_bits);
$thisfile_ac3_raw_bsi['mixdatafill'] = $this->getid3_ac3::readHeaderBSI($mixdata_fill);
unset($mixdefbitsread, $mixdata_bits, $mixdata_fill);
}
if ($thisfile_ac3_raw_bsi['acmod'] < 2) { $thisfile_ac3_raw_bsi['flags']['paninfo'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['paninfo']) {
$thisfile_ac3_raw_bsi['panmean'] = $this->getid3_ac3::readHeaderBSI(8);
$thisfile_ac3_raw_bsi['paninfo'] = $this->getid3_ac3::readHeaderBSI(6);
}
if ($thisfile_ac3_raw_bsi['acmod'] == 0) { $thisfile_ac3_raw_bsi['flags']['paninfo2'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['paninfo2']) {
$thisfile_ac3_raw_bsi['panmean2'] = $this->getid3_ac3::readHeaderBSI(8);
$thisfile_ac3_raw_bsi['paninfo2'] = $this->getid3_ac3::readHeaderBSI(6);
}
}
}
$thisfile_ac3_raw_bsi['flags']['frmmixcfginfo'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['frmmixcfginfo']) { if ($thisfile_ac3_raw_bsi['numblkscod'] == 0) {
$thisfile_ac3_raw_bsi['blkmixcfginfo'][0] = $this->getid3_ac3::readHeaderBSI(5);
} else {
for ($blk = 0; $blk < $thisfile_ac3_raw_bsi['numblkscod']; $blk++) {
$thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk]) { $thisfile_ac3_raw_bsi['blkmixcfginfo'][$blk] = $this->getid3_ac3::readHeaderBSI(5);
}
}
}
}
}
}
$thisfile_ac3_raw_bsi['flags']['infomdat'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['infomdat']) { $thisfile_ac3_raw_bsi['bsmod'] = $this->getid3_ac3::readHeaderBSI(3);
$thisfile_ac3_raw_bsi['flags']['copyrightb'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
$thisfile_ac3_raw_bsi['flags']['origbs'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['acmod'] == 2) { $thisfile_ac3_raw_bsi['dsurmod'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3_raw_bsi['dheadphonmod'] = $this->getid3_ac3::readHeaderBSI(2);
}
if ($thisfile_ac3_raw_bsi['acmod'] >= 6) { $thisfile_ac3_raw_bsi['dsurexmod'] = $this->getid3_ac3::readHeaderBSI(2);
}
$thisfile_ac3_raw_bsi['flags']['audprodi'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['audprodi']) {
$thisfile_ac3_raw_bsi['mixlevel'] = $this->getid3_ac3::readHeaderBSI(5);
$thisfile_ac3_raw_bsi['roomtyp'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3_raw_bsi['flags']['adconvtyp'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
}
if ($thisfile_ac3_raw_bsi['acmod'] == 0) { $thisfile_ac3_raw_bsi['flags']['audprodi2'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['audprodi2']) {
$thisfile_ac3_raw_bsi['mixlevel2'] = $this->getid3_ac3::readHeaderBSI(5);
$thisfile_ac3_raw_bsi['roomtyp2'] = $this->getid3_ac3::readHeaderBSI(2);
$thisfile_ac3_raw_bsi['flags']['adconvtyp2'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
}
}
if ($thisfile_ac3_raw_bsi['fscod'] < 3) { $thisfile_ac3_raw_bsi['flags']['sourcefscod'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
}
}
if (($thisfile_ac3_raw_bsi['strmtyp'] == 0) && ($thisfile_ac3_raw_bsi['numblkscod'] != 3)) { $thisfile_ac3_raw_bsi['flags']['convsync'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
}
if ($thisfile_ac3_raw_bsi['strmtyp'] == 2) { if ($thisfile_ac3_raw_bsi['numblkscod'] != 3) { $thisfile_ac3_raw_bsi['flags']['blkid'] = 1;
} else {
$thisfile_ac3_raw_bsi['flags']['blkid'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
}
if ($thisfile_ac3_raw_bsi['flags']['blkid']) {
$thisfile_ac3_raw_bsi['frmsizecod'] = $this->getid3_ac3::readHeaderBSI(6);
}
}
$thisfile_ac3_raw_bsi['flags']['addbsi'] = (bool) $this->getid3_ac3::readHeaderBSI(1);
if ($thisfile_ac3_raw_bsi['flags']['addbsi']) {
$thisfile_ac3_raw_bsi['addbsil'] = $this->getid3_ac3::readHeaderBSI(6);
$thisfile_ac3_raw_bsi['addbsi'] = $this->getid3_ac3::readHeaderBSI(($thisfile_ac3_raw_bsi['addbsil'] + 1) * 8);
}
} else {
$this->error('Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 16. Please submit a support ticket with a sample file.');
unset($info['ac3']);
return false;
}
if (isset($thisfile_ac3_raw_bsi['fscod2'])) {
$thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup2($thisfile_ac3_raw_bsi['fscod2']);
} else {
$thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup($thisfile_ac3_raw_bsi['fscod']);
}
if ($thisfile_ac3_raw_bsi['fscod'] <= 3) {
$info['audio']['sample_rate'] = $thisfile_ac3['sample_rate'];
} else {
$this->warning('Unexpected ac3.bsi.fscod value: '.$thisfile_ac3_raw_bsi['fscod']);
}
if (isset($thisfile_ac3_raw_bsi['frmsizecod'])) {
$thisfile_ac3['frame_length'] = self::frameSizeLookup($thisfile_ac3_raw_bsi['frmsizecod'], $thisfile_ac3_raw_bsi['fscod']);
$thisfile_ac3['bitrate'] = self::bitrateLookup($thisfile_ac3_raw_bsi['frmsizecod']);
} elseif (!empty($thisfile_ac3_raw_bsi['frmsiz'])) {
$thisfile_ac3['bitrate'] = ($thisfile_ac3_raw_bsi['frmsiz'] + 1) * 16 * 30; $thisfile_ac3['bitrate'] = round(($thisfile_ac3['bitrate'] * 1.05) / 16000) * 16000;
}
$info['audio']['bitrate'] = $thisfile_ac3['bitrate'];
if (isset($thisfile_ac3_raw_bsi['bsmod']) && isset($thisfile_ac3_raw_bsi['acmod'])) {
$thisfile_ac3['service_type'] = self::serviceTypeLookup($thisfile_ac3_raw_bsi['bsmod'], $thisfile_ac3_raw_bsi['acmod']);
}
$ac3_coding_mode = self::audioCodingModeLookup($thisfile_ac3_raw_bsi['acmod']);
foreach($ac3_coding_mode as $key => $value) {
$thisfile_ac3[$key] = $value;
}
switch ($thisfile_ac3_raw_bsi['acmod']) {
case 0:
case 1:
$info['audio']['channelmode'] = 'mono';
break;
case 3:
case 4:
$info['audio']['channelmode'] = 'stereo';
break;
default:
$info['audio']['channelmode'] = 'surround';
break;
}
$info['audio']['channels'] = $thisfile_ac3['num_channels'];
$thisfile_ac3['lfe_enabled'] = $thisfile_ac3_raw_bsi['flags']['lfeon'];
if ($thisfile_ac3_raw_bsi['flags']['lfeon']) {
$info['audio']['channels'] .= '.1';
}
$thisfile_ac3['channels_enabled'] = self::channelsEnabledLookup($thisfile_ac3_raw_bsi['acmod'], $thisfile_ac3_raw_bsi['flags']['lfeon']);
$thisfile_ac3['dialogue_normalization'] = '-'.$thisfile_ac3_raw_bsi['dialnorm'].'dB';
return true;
}