Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93

Warning: Undefined array key "page_file_edit_line" in /home/sportsfever/public_html/filemanger/edit_text_line.php on line 32
/home/sportsfe.../httpdocs/wp-inclu.../ID3
File: module.audio.mp3.php
}
[1000] Fix | Delete
[1001] Fix | Delete
if (isset($thisfile_mpeg_audio['VBR_frames']) ? $thisfile_mpeg_audio['VBR_frames'] : '') {
[1002] Fix | Delete
switch ($thisfile_mpeg_audio['bitrate_mode']) {
[1003] Fix | Delete
case 'vbr':
[1004] Fix | Delete
case 'abr':
[1005] Fix | Delete
$bytes_per_frame = 1152;
[1006] Fix | Delete
if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) {
[1007] Fix | Delete
$bytes_per_frame = 384;
[1008] Fix | Delete
} elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) {
[1009] Fix | Delete
$bytes_per_frame = 576;
[1010] Fix | Delete
}
[1011] Fix | Delete
$thisfile_mpeg_audio['VBR_bitrate'] = (isset($thisfile_mpeg_audio['VBR_bytes']) ? (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($info['audio']['sample_rate'] / $bytes_per_frame) : 0);
[1012] Fix | Delete
if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) {
[1013] Fix | Delete
$info['audio']['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate'];
[1014] Fix | Delete
$thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion
[1015] Fix | Delete
}
[1016] Fix | Delete
break;
[1017] Fix | Delete
}
[1018] Fix | Delete
}
[1019] Fix | Delete
[1020] Fix | Delete
// End variable-bitrate headers
[1021] Fix | Delete
////////////////////////////////////////////////////////////////////////////////////
[1022] Fix | Delete
[1023] Fix | Delete
if ($recursivesearch) {
[1024] Fix | Delete
[1025] Fix | Delete
if (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) {
[1026] Fix | Delete
return false;
[1027] Fix | Delete
}
[1028] Fix | Delete
if (!empty($this->getid3->info['mp3_validity_check_bitrates']) && !empty($thisfile_mpeg_audio['bitrate_mode']) && ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') && !empty($thisfile_mpeg_audio['VBR_bitrate'])) {
[1029] Fix | Delete
// https://github.com/JamesHeinrich/getID3/issues/287
[1030] Fix | Delete
if (count(array_keys($this->getid3->info['mp3_validity_check_bitrates'])) == 1) {
[1031] Fix | Delete
list($cbr_bitrate_in_short_scan) = array_keys($this->getid3->info['mp3_validity_check_bitrates']);
[1032] Fix | Delete
$deviation_cbr_from_header_bitrate = abs($thisfile_mpeg_audio['VBR_bitrate'] - $cbr_bitrate_in_short_scan) / $cbr_bitrate_in_short_scan;
[1033] Fix | Delete
if ($deviation_cbr_from_header_bitrate < 0.01) {
[1034] Fix | Delete
// VBR header bitrate may differ slightly from true bitrate of frames, perhaps accounting for overhead of VBR header frame itself?
[1035] Fix | Delete
// If measured CBR bitrate is within 1% of specified bitrate in VBR header then assume that file is truly CBR
[1036] Fix | Delete
$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
[1037] Fix | Delete
//$this->warning('VBR header ignored, assuming CBR '.round($cbr_bitrate_in_short_scan / 1000).'kbps based on scan of '.$this->mp3_valid_check_frames.' frames');
[1038] Fix | Delete
}
[1039] Fix | Delete
}
[1040] Fix | Delete
}
[1041] Fix | Delete
if (isset($this->getid3->info['mp3_validity_check_bitrates'])) {
[1042] Fix | Delete
unset($this->getid3->info['mp3_validity_check_bitrates']);
[1043] Fix | Delete
}
[1044] Fix | Delete
[1045] Fix | Delete
}
[1046] Fix | Delete
[1047] Fix | Delete
[1048] Fix | Delete
//if (false) {
[1049] Fix | Delete
// // experimental side info parsing section - not returning anything useful yet
[1050] Fix | Delete
//
[1051] Fix | Delete
// $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData);
[1052] Fix | Delete
// $SideInfoOffset = 0;
[1053] Fix | Delete
//
[1054] Fix | Delete
// if ($thisfile_mpeg_audio['version'] == '1') {
[1055] Fix | Delete
// if ($thisfile_mpeg_audio['channelmode'] == 'mono') {
[1056] Fix | Delete
// // MPEG-1 (mono)
[1057] Fix | Delete
// $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);
[1058] Fix | Delete
// $SideInfoOffset += 9;
[1059] Fix | Delete
// $SideInfoOffset += 5;
[1060] Fix | Delete
// } else {
[1061] Fix | Delete
// // MPEG-1 (stereo, joint-stereo, dual-channel)
[1062] Fix | Delete
// $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);
[1063] Fix | Delete
// $SideInfoOffset += 9;
[1064] Fix | Delete
// $SideInfoOffset += 3;
[1065] Fix | Delete
// }
[1066] Fix | Delete
// } else { // 2 or 2.5
[1067] Fix | Delete
// if ($thisfile_mpeg_audio['channelmode'] == 'mono') {
[1068] Fix | Delete
// // MPEG-2, MPEG-2.5 (mono)
[1069] Fix | Delete
// $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);
[1070] Fix | Delete
// $SideInfoOffset += 8;
[1071] Fix | Delete
// $SideInfoOffset += 1;
[1072] Fix | Delete
// } else {
[1073] Fix | Delete
// // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel)
[1074] Fix | Delete
// $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);
[1075] Fix | Delete
// $SideInfoOffset += 8;
[1076] Fix | Delete
// $SideInfoOffset += 2;
[1077] Fix | Delete
// }
[1078] Fix | Delete
// }
[1079] Fix | Delete
//
[1080] Fix | Delete
// if ($thisfile_mpeg_audio['version'] == '1') {
[1081] Fix | Delete
// for ($channel = 0; $channel < $info['audio']['channels']; $channel++) {
[1082] Fix | Delete
// for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) {
[1083] Fix | Delete
// $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1);
[1084] Fix | Delete
// $SideInfoOffset += 2;
[1085] Fix | Delete
// }
[1086] Fix | Delete
// }
[1087] Fix | Delete
// }
[1088] Fix | Delete
// for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) {
[1089] Fix | Delete
// for ($channel = 0; $channel < $info['audio']['channels']; $channel++) {
[1090] Fix | Delete
// $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12);
[1091] Fix | Delete
// $SideInfoOffset += 12;
[1092] Fix | Delete
// $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);
[1093] Fix | Delete
// $SideInfoOffset += 9;
[1094] Fix | Delete
// $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8);
[1095] Fix | Delete
// $SideInfoOffset += 8;
[1096] Fix | Delete
// if ($thisfile_mpeg_audio['version'] == '1') {
[1097] Fix | Delete
// $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);
[1098] Fix | Delete
// $SideInfoOffset += 4;
[1099] Fix | Delete
// } else {
[1100] Fix | Delete
// $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);
[1101] Fix | Delete
// $SideInfoOffset += 9;
[1102] Fix | Delete
// }
[1103] Fix | Delete
// $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
[1104] Fix | Delete
// $SideInfoOffset += 1;
[1105] Fix | Delete
//
[1106] Fix | Delete
// if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') {
[1107] Fix | Delete
//
[1108] Fix | Delete
// $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2);
[1109] Fix | Delete
// $SideInfoOffset += 2;
[1110] Fix | Delete
// $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
[1111] Fix | Delete
// $SideInfoOffset += 1;
[1112] Fix | Delete
//
[1113] Fix | Delete
// for ($region = 0; $region < 2; $region++) {
[1114] Fix | Delete
// $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);
[1115] Fix | Delete
// $SideInfoOffset += 5;
[1116] Fix | Delete
// }
[1117] Fix | Delete
// $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0;
[1118] Fix | Delete
//
[1119] Fix | Delete
// for ($window = 0; $window < 3; $window++) {
[1120] Fix | Delete
// $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3);
[1121] Fix | Delete
// $SideInfoOffset += 3;
[1122] Fix | Delete
// }
[1123] Fix | Delete
//
[1124] Fix | Delete
// } else {
[1125] Fix | Delete
//
[1126] Fix | Delete
// for ($region = 0; $region < 3; $region++) {
[1127] Fix | Delete
// $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);
[1128] Fix | Delete
// $SideInfoOffset += 5;
[1129] Fix | Delete
// }
[1130] Fix | Delete
//
[1131] Fix | Delete
// $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);
[1132] Fix | Delete
// $SideInfoOffset += 4;
[1133] Fix | Delete
// $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3);
[1134] Fix | Delete
// $SideInfoOffset += 3;
[1135] Fix | Delete
// $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0;
[1136] Fix | Delete
// }
[1137] Fix | Delete
//
[1138] Fix | Delete
// if ($thisfile_mpeg_audio['version'] == '1') {
[1139] Fix | Delete
// $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
[1140] Fix | Delete
// $SideInfoOffset += 1;
[1141] Fix | Delete
// }
[1142] Fix | Delete
// $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
[1143] Fix | Delete
// $SideInfoOffset += 1;
[1144] Fix | Delete
// $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
[1145] Fix | Delete
// $SideInfoOffset += 1;
[1146] Fix | Delete
// }
[1147] Fix | Delete
// }
[1148] Fix | Delete
//}
[1149] Fix | Delete
[1150] Fix | Delete
return true;
[1151] Fix | Delete
}
[1152] Fix | Delete
[1153] Fix | Delete
/**
[1154] Fix | Delete
* @param int $offset
[1155] Fix | Delete
* @param int $nextframetestoffset
[1156] Fix | Delete
* @param bool $ScanAsCBR
[1157] Fix | Delete
*
[1158] Fix | Delete
* @return bool
[1159] Fix | Delete
*/
[1160] Fix | Delete
public function RecursiveFrameScanning(&$offset, &$nextframetestoffset, $ScanAsCBR) {
[1161] Fix | Delete
$info = &$this->getid3->info;
[1162] Fix | Delete
$firstframetestarray = array('error' => array(), 'warning'=> array(), 'avdataend' => $info['avdataend'], 'avdataoffset' => $info['avdataoffset']);
[1163] Fix | Delete
$this->decodeMPEGaudioHeader($offset, $firstframetestarray, false);
[1164] Fix | Delete
[1165] Fix | Delete
$info['mp3_validity_check_bitrates'] = array();
[1166] Fix | Delete
for ($i = 0; $i < $this->mp3_valid_check_frames; $i++) {
[1167] Fix | Delete
// check next (default: 50) frames for validity, to make sure we haven't run across a false synch
[1168] Fix | Delete
if (($nextframetestoffset + 4) >= $info['avdataend']) {
[1169] Fix | Delete
// end of file
[1170] Fix | Delete
return true;
[1171] Fix | Delete
}
[1172] Fix | Delete
[1173] Fix | Delete
$nextframetestarray = array('error' => array(), 'warning' => array(), 'avdataend' => $info['avdataend'], 'avdataoffset'=>$info['avdataoffset']);
[1174] Fix | Delete
if ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) {
[1175] Fix | Delete
/** @phpstan-ignore-next-line */
[1176] Fix | Delete
getid3_lib::safe_inc($info['mp3_validity_check_bitrates'][$nextframetestarray['mpeg']['audio']['bitrate']]);
[1177] Fix | Delete
if ($ScanAsCBR) {
[1178] Fix | Delete
// force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header
[1179] Fix | Delete
if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) {
[1180] Fix | Delete
return false;
[1181] Fix | Delete
}
[1182] Fix | Delete
}
[1183] Fix | Delete
[1184] Fix | Delete
[1185] Fix | Delete
// next frame is OK, get ready to check the one after that
[1186] Fix | Delete
if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) {
[1187] Fix | Delete
$nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength'];
[1188] Fix | Delete
} else {
[1189] Fix | Delete
$this->error('Frame at offset ('.$offset.') is has an invalid frame length.');
[1190] Fix | Delete
return false;
[1191] Fix | Delete
}
[1192] Fix | Delete
[1193] Fix | Delete
} elseif (!empty($firstframetestarray['mpeg']['audio']['framelength']) && (($nextframetestoffset + $firstframetestarray['mpeg']['audio']['framelength']) > $info['avdataend'])) {
[1194] Fix | Delete
[1195] Fix | Delete
// it's not the end of the file, but there's not enough data left for another frame, so assume it's garbage/padding and return OK
[1196] Fix | Delete
return true;
[1197] Fix | Delete
[1198] Fix | Delete
} else {
[1199] Fix | Delete
[1200] Fix | Delete
// next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence
[1201] Fix | Delete
$this->warning('Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.');
[1202] Fix | Delete
[1203] Fix | Delete
return false;
[1204] Fix | Delete
}
[1205] Fix | Delete
}
[1206] Fix | Delete
return true;
[1207] Fix | Delete
}
[1208] Fix | Delete
[1209] Fix | Delete
/**
[1210] Fix | Delete
* @param int $offset
[1211] Fix | Delete
* @param bool $deepscan
[1212] Fix | Delete
*
[1213] Fix | Delete
* @return int|false
[1214] Fix | Delete
*/
[1215] Fix | Delete
public function FreeFormatFrameLength($offset, $deepscan=false) {
[1216] Fix | Delete
$info = &$this->getid3->info;
[1217] Fix | Delete
[1218] Fix | Delete
$this->fseek($offset);
[1219] Fix | Delete
$MPEGaudioData = $this->fread(32768);
[1220] Fix | Delete
[1221] Fix | Delete
$SyncPattern1 = substr($MPEGaudioData, 0, 4);
[1222] Fix | Delete
// may be different pattern due to padding
[1223] Fix | Delete
$SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) | 0x02).$SyncPattern1[3];
[1224] Fix | Delete
if ($SyncPattern2 === $SyncPattern1) {
[1225] Fix | Delete
$SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) & 0xFD).$SyncPattern1[3];
[1226] Fix | Delete
}
[1227] Fix | Delete
[1228] Fix | Delete
$framelength = false;
[1229] Fix | Delete
$framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4);
[1230] Fix | Delete
$framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4);
[1231] Fix | Delete
if ($framelength1 > 4) {
[1232] Fix | Delete
$framelength = $framelength1;
[1233] Fix | Delete
}
[1234] Fix | Delete
if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
[1235] Fix | Delete
$framelength = $framelength2;
[1236] Fix | Delete
}
[1237] Fix | Delete
if (!$framelength) {
[1238] Fix | Delete
[1239] Fix | Delete
// LAME 3.88 has a different value for modeextension on the first frame vs the rest
[1240] Fix | Delete
$framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4);
[1241] Fix | Delete
$framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4);
[1242] Fix | Delete
[1243] Fix | Delete
if ($framelength1 > 4) {
[1244] Fix | Delete
$framelength = $framelength1;
[1245] Fix | Delete
}
[1246] Fix | Delete
if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
[1247] Fix | Delete
$framelength = $framelength2;
[1248] Fix | Delete
}
[1249] Fix | Delete
if (!$framelength) {
[1250] Fix | Delete
$this->error('Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset);
[1251] Fix | Delete
return false;
[1252] Fix | Delete
} else {
[1253] Fix | Delete
$this->warning('ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)');
[1254] Fix | Delete
$info['audio']['codec'] = 'LAME';
[1255] Fix | Delete
$info['audio']['encoder'] = 'LAME3.88';
[1256] Fix | Delete
$SyncPattern1 = substr($SyncPattern1, 0, 3);
[1257] Fix | Delete
$SyncPattern2 = substr($SyncPattern2, 0, 3);
[1258] Fix | Delete
}
[1259] Fix | Delete
}
[1260] Fix | Delete
[1261] Fix | Delete
if ($deepscan) {
[1262] Fix | Delete
[1263] Fix | Delete
$ActualFrameLengthValues = array();
[1264] Fix | Delete
$nextoffset = $offset + $framelength;
[1265] Fix | Delete
while ($nextoffset < ($info['avdataend'] - 6)) {
[1266] Fix | Delete
$this->fseek($nextoffset - 1);
[1267] Fix | Delete
$NextSyncPattern = $this->fread(6);
[1268] Fix | Delete
if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) {
[1269] Fix | Delete
// good - found where expected
[1270] Fix | Delete
$ActualFrameLengthValues[] = $framelength;
[1271] Fix | Delete
} elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) {
[1272] Fix | Delete
// ok - found one byte earlier than expected (last frame wasn't padded, first frame was)
[1273] Fix | Delete
$ActualFrameLengthValues[] = ($framelength - 1);
[1274] Fix | Delete
$nextoffset--;
[1275] Fix | Delete
} elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) {
[1276] Fix | Delete
// ok - found one byte later than expected (last frame was padded, first frame wasn't)
[1277] Fix | Delete
$ActualFrameLengthValues[] = ($framelength + 1);
[1278] Fix | Delete
$nextoffset++;
[1279] Fix | Delete
} else {
[1280] Fix | Delete
$this->error('Did not find expected free-format sync pattern at offset '.$nextoffset);
[1281] Fix | Delete
return false;
[1282] Fix | Delete
}
[1283] Fix | Delete
$nextoffset += $framelength;
[1284] Fix | Delete
}
[1285] Fix | Delete
if (count($ActualFrameLengthValues) > 0) {
[1286] Fix | Delete
$framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues)));
[1287] Fix | Delete
}
[1288] Fix | Delete
}
[1289] Fix | Delete
return $framelength;
[1290] Fix | Delete
}
[1291] Fix | Delete
[1292] Fix | Delete
/**
[1293] Fix | Delete
* @return bool
[1294] Fix | Delete
*/
[1295] Fix | Delete
public function getOnlyMPEGaudioInfoBruteForce() {
[1296] Fix | Delete
$MPEGaudioHeaderDecodeCache = array();
[1297] Fix | Delete
$MPEGaudioHeaderValidCache = array();
[1298] Fix | Delete
$MPEGaudioHeaderLengthCache = array();
[1299] Fix | Delete
$MPEGaudioVersionLookup = self::MPEGaudioVersionArray();
[1300] Fix | Delete
$MPEGaudioLayerLookup = self::MPEGaudioLayerArray();
[1301] Fix | Delete
$MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray();
[1302] Fix | Delete
$MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray();
[1303] Fix | Delete
$MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray();
[1304] Fix | Delete
$MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray();
[1305] Fix | Delete
$MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray();
[1306] Fix | Delete
$LongMPEGversionLookup = array();
[1307] Fix | Delete
$LongMPEGlayerLookup = array();
[1308] Fix | Delete
$LongMPEGbitrateLookup = array();
[1309] Fix | Delete
$LongMPEGpaddingLookup = array();
[1310] Fix | Delete
$LongMPEGfrequencyLookup = array();
[1311] Fix | Delete
$Distribution = array();
[1312] Fix | Delete
$Distribution['bitrate'] = array();
[1313] Fix | Delete
$Distribution['frequency'] = array();
[1314] Fix | Delete
$Distribution['layer'] = array();
[1315] Fix | Delete
$Distribution['version'] = array();
[1316] Fix | Delete
$Distribution['padding'] = array();
[1317] Fix | Delete
[1318] Fix | Delete
$info = &$this->getid3->info;
[1319] Fix | Delete
$this->fseek($info['avdataoffset']);
[1320] Fix | Delete
[1321] Fix | Delete
$max_frames_scan = 5000;
[1322] Fix | Delete
$frames_scanned = 0;
[1323] Fix | Delete
[1324] Fix | Delete
$previousvalidframe = $info['avdataoffset'];
[1325] Fix | Delete
while ($this->ftell() < $info['avdataend']) {
[1326] Fix | Delete
set_time_limit(30);
[1327] Fix | Delete
$head4 = $this->fread(4);
[1328] Fix | Delete
if (strlen($head4) < 4) {
[1329] Fix | Delete
break;
[1330] Fix | Delete
}
[1331] Fix | Delete
if ($head4[0] != "\xFF") {
[1332] Fix | Delete
for ($i = 1; $i < 4; $i++) {
[1333] Fix | Delete
if ($head4[$i] == "\xFF") {
[1334] Fix | Delete
$this->fseek($i - 4, SEEK_CUR);
[1335] Fix | Delete
continue 2;
[1336] Fix | Delete
}
[1337] Fix | Delete
}
[1338] Fix | Delete
continue;
[1339] Fix | Delete
}
[1340] Fix | Delete
if (!isset($MPEGaudioHeaderDecodeCache[$head4])) {
[1341] Fix | Delete
$MPEGaudioHeaderDecodeCache[$head4] = self::MPEGaudioHeaderDecode($head4);
[1342] Fix | Delete
}
[1343] Fix | Delete
if (!isset($MPEGaudioHeaderValidCache[$head4])) {
[1344] Fix | Delete
$MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false);
[1345] Fix | Delete
}
[1346] Fix | Delete
if ($MPEGaudioHeaderValidCache[$head4]) {
[1347] Fix | Delete
[1348] Fix | Delete
if (!isset($MPEGaudioHeaderLengthCache[$head4])) {
[1349] Fix | Delete
$LongMPEGversionLookup[$head4] = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']];
[1350] Fix | Delete
$LongMPEGlayerLookup[$head4] = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']];
[1351] Fix | Delete
$LongMPEGbitrateLookup[$head4] = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']];
[1352] Fix | Delete
$LongMPEGpaddingLookup[$head4] = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding'];
[1353] Fix | Delete
$LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']];
[1354] Fix | Delete
$MPEGaudioHeaderLengthCache[$head4] = self::MPEGaudioFrameLength(
[1355] Fix | Delete
$LongMPEGbitrateLookup[$head4],
[1356] Fix | Delete
$LongMPEGversionLookup[$head4],
[1357] Fix | Delete
$LongMPEGlayerLookup[$head4],
[1358] Fix | Delete
$LongMPEGpaddingLookup[$head4],
[1359] Fix | Delete
$LongMPEGfrequencyLookup[$head4]);
[1360] Fix | Delete
}
[1361] Fix | Delete
if ($MPEGaudioHeaderLengthCache[$head4] > 4) {
[1362] Fix | Delete
$WhereWeWere = $this->ftell();
[1363] Fix | Delete
$this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR);
[1364] Fix | Delete
$next4 = $this->fread(4);
[1365] Fix | Delete
if ($next4[0] == "\xFF") {
[1366] Fix | Delete
if (!isset($MPEGaudioHeaderDecodeCache[$next4])) {
[1367] Fix | Delete
$MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4);
[1368] Fix | Delete
}
[1369] Fix | Delete
if (!isset($MPEGaudioHeaderValidCache[$next4])) {
[1370] Fix | Delete
$MPEGaudioHeaderValidCache[$next4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false);
[1371] Fix | Delete
}
[1372] Fix | Delete
if ($MPEGaudioHeaderValidCache[$next4]) {
[1373] Fix | Delete
$this->fseek(-4, SEEK_CUR);
[1374] Fix | Delete
[1375] Fix | Delete
$Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] = isset($Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]) ? ++$Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] : 1;
[1376] Fix | Delete
$Distribution['layer'][$LongMPEGlayerLookup[$head4]] = isset($Distribution['layer'][$LongMPEGlayerLookup[$head4]]) ? ++$Distribution['layer'][$LongMPEGlayerLookup[$head4]] : 1;
[1377] Fix | Delete
$Distribution['version'][$LongMPEGversionLookup[$head4]] = isset($Distribution['version'][$LongMPEGversionLookup[$head4]]) ? ++$Distribution['version'][$LongMPEGversionLookup[$head4]] : 1;
[1378] Fix | Delete
$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] = isset($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]) ? ++$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] : 1;
[1379] Fix | Delete
$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] = isset($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]) ? ++$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] : 1;
[1380] Fix | Delete
if (++$frames_scanned >= $max_frames_scan) {
[1381] Fix | Delete
$pct_data_scanned = getid3_lib::SafeDiv($this->ftell() - $info['avdataoffset'], $info['avdataend'] - $info['avdataoffset']);
[1382] Fix | Delete
$this->warning('too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.');
[1383] Fix | Delete
foreach ($Distribution as $key1 => $value1) {
[1384] Fix | Delete
foreach ($value1 as $key2 => $value2) {
[1385] Fix | Delete
$Distribution[$key1][$key2] = $pct_data_scanned ? round($value2 / $pct_data_scanned) : 1;
[1386] Fix | Delete
}
[1387] Fix | Delete
}
[1388] Fix | Delete
break;
[1389] Fix | Delete
}
[1390] Fix | Delete
continue;
[1391] Fix | Delete
}
[1392] Fix | Delete
}
[1393] Fix | Delete
unset($next4);
[1394] Fix | Delete
$this->fseek($WhereWeWere - 3);
[1395] Fix | Delete
}
[1396] Fix | Delete
[1397] Fix | Delete
}
[1398] Fix | Delete
}
[1399] Fix | Delete
foreach ($Distribution as $key => $value) {
[1400] Fix | Delete
ksort($Distribution[$key], SORT_NUMERIC);
[1401] Fix | Delete
}
[1402] Fix | Delete
ksort($Distribution['version'], SORT_STRING);
[1403] Fix | Delete
$info['mpeg']['audio']['bitrate_distribution'] = $Distribution['bitrate'];
[1404] Fix | Delete
$info['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency'];
[1405] Fix | Delete
$info['mpeg']['audio']['layer_distribution'] = $Distribution['layer'];
[1406] Fix | Delete
$info['mpeg']['audio']['version_distribution'] = $Distribution['version'];
[1407] Fix | Delete
$info['mpeg']['audio']['padding_distribution'] = $Distribution['padding'];
[1408] Fix | Delete
if (count($Distribution['version']) > 1) {
[1409] Fix | Delete
$this->error('Corrupt file - more than one MPEG version detected');
[1410] Fix | Delete
}
[1411] Fix | Delete
if (count($Distribution['layer']) > 1) {
[1412] Fix | Delete
$this->error('Corrupt file - more than one MPEG layer detected');
[1413] Fix | Delete
}
[1414] Fix | Delete
if (count($Distribution['frequency']) > 1) {
[1415] Fix | Delete
$this->error('Corrupt file - more than one MPEG sample rate detected');
[1416] Fix | Delete
}
[1417] Fix | Delete
[1418] Fix | Delete
[1419] Fix | Delete
$bittotal = 0;
[1420] Fix | Delete
foreach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) {
[1421] Fix | Delete
if ($bitratevalue != 'free') {
[1422] Fix | Delete
$bittotal += ($bitratevalue * $bitratecount);
[1423] Fix | Delete
}
[1424] Fix | Delete
}
[1425] Fix | Delete
$info['mpeg']['audio']['frame_count'] = array_sum($Distribution['bitrate']);
[1426] Fix | Delete
if ($info['mpeg']['audio']['frame_count'] == 0) {
[1427] Fix | Delete
$this->error('no MPEG audio frames found');
[1428] Fix | Delete
return false;
[1429] Fix | Delete
}
[1430] Fix | Delete
$info['mpeg']['audio']['bitrate'] = ($bittotal / $info['mpeg']['audio']['frame_count']);
[1431] Fix | Delete
$info['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr');
[1432] Fix | Delete
$info['mpeg']['audio']['sample_rate'] = getid3_lib::array_max($Distribution['frequency'], true);
[1433] Fix | Delete
[1434] Fix | Delete
$info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate'];
[1435] Fix | Delete
$info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode'];
[1436] Fix | Delete
$info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate'];
[1437] Fix | Delete
$info['audio']['dataformat'] = 'mp'.getid3_lib::array_max($Distribution['layer'], true);
[1438] Fix | Delete
$info['fileformat'] = $info['audio']['dataformat'];
[1439] Fix | Delete
[1440] Fix | Delete
return true;
[1441] Fix | Delete
}
[1442] Fix | Delete
[1443] Fix | Delete
/**
[1444] Fix | Delete
* @param int $avdataoffset
[1445] Fix | Delete
* @param bool $BitrateHistogram
[1446] Fix | Delete
*
[1447] Fix | Delete
* @return bool
[1448] Fix | Delete
*/
[1449] Fix | Delete
public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) {
[1450] Fix | Delete
// looks for synch, decodes MPEG audio header
[1451] Fix | Delete
[1452] Fix | Delete
$info = &$this->getid3->info;
[1453] Fix | Delete
[1454] Fix | Delete
static $MPEGaudioVersionLookup;
[1455] Fix | Delete
static $MPEGaudioLayerLookup;
[1456] Fix | Delete
static $MPEGaudioBitrateLookup;
[1457] Fix | Delete
if (empty($MPEGaudioVersionLookup)) {
[1458] Fix | Delete
$MPEGaudioVersionLookup = self::MPEGaudioVersionArray();
[1459] Fix | Delete
$MPEGaudioLayerLookup = self::MPEGaudioLayerArray();
[1460] Fix | Delete
$MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray();
[1461] Fix | Delete
}
[1462] Fix | Delete
[1463] Fix | Delete
$this->fseek($avdataoffset);
[1464] Fix | Delete
$sync_seek_buffer_size = min(128 * 1024, $info['avdataend'] - $avdataoffset);
[1465] Fix | Delete
if ($sync_seek_buffer_size <= 0) {
[1466] Fix | Delete
$this->error('Invalid $sync_seek_buffer_size at offset '.$avdataoffset);
[1467] Fix | Delete
return false;
[1468] Fix | Delete
}
[1469] Fix | Delete
$header = $this->fread($sync_seek_buffer_size);
[1470] Fix | Delete
$sync_seek_buffer_size = strlen($header);
[1471] Fix | Delete
$SynchSeekOffset = 0;
[1472] Fix | Delete
$SyncSeekAttempts = 0;
[1473] Fix | Delete
$SyncSeekAttemptsMax = 1000;
[1474] Fix | Delete
$FirstFrameThisfileInfo = null;
[1475] Fix | Delete
while ($SynchSeekOffset < $sync_seek_buffer_size) {
[1476] Fix | Delete
if ((($avdataoffset + $SynchSeekOffset) < $info['avdataend']) && !$this->feof()) {
[1477] Fix | Delete
[1478] Fix | Delete
if ($SynchSeekOffset > $sync_seek_buffer_size) {
[1479] Fix | Delete
// if a synch's not found within the first 128k bytes, then give up
[1480] Fix | Delete
$this->error('Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB');
[1481] Fix | Delete
if (isset($info['audio']['bitrate'])) {
[1482] Fix | Delete
unset($info['audio']['bitrate']);
[1483] Fix | Delete
}
[1484] Fix | Delete
if (isset($info['mpeg']['audio'])) {
[1485] Fix | Delete
unset($info['mpeg']['audio']);
[1486] Fix | Delete
}
[1487] Fix | Delete
if (empty($info['mpeg'])) {
[1488] Fix | Delete
unset($info['mpeg']);
[1489] Fix | Delete
}
[1490] Fix | Delete
return false;
[1491] Fix | Delete
}
[1492] Fix | Delete
}
[1493] Fix | Delete
[1494] Fix | Delete
if (($SynchSeekOffset + 1) >= strlen($header)) {
[1495] Fix | Delete
$this->error('Could not find valid MPEG synch before end of file');
[1496] Fix | Delete
return false;
[1497] Fix | Delete
}
[1498] Fix | Delete
[1499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function