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/clone/wp-inclu.../ID3
File: module.audio-video.quicktime.php
}
[1000] Fix | Delete
unset($atom_structure['sample_description_table'][$i]['data']);
[1001] Fix | Delete
}
[1002] Fix | Delete
break;
[1003] Fix | Delete
[1004] Fix | Delete
[1005] Fix | Delete
case 'stts': // Sample Table Time-to-Sample atom
[1006] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1007] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1008] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1009] Fix | Delete
$sttsEntriesDataOffset = 8;
[1010] Fix | Delete
//$FrameRateCalculatorArray = array();
[1011] Fix | Delete
$frames_count = 0;
[1012] Fix | Delete
[1013] Fix | Delete
$max_stts_entries_to_scan = ($info['php_memory_limit'] ? min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']) : $atom_structure['number_entries']);
[1014] Fix | Delete
if ($max_stts_entries_to_scan < $atom_structure['number_entries']) {
[1015] Fix | Delete
$this->warning('QuickTime atom "stts" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($this->getid3->memory_limit / 1048576).'MB).');
[1016] Fix | Delete
}
[1017] Fix | Delete
for ($i = 0; $i < $max_stts_entries_to_scan; $i++) {
[1018] Fix | Delete
$atom_structure['time_to_sample_table'][$i]['sample_count'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));
[1019] Fix | Delete
$sttsEntriesDataOffset += 4;
[1020] Fix | Delete
$atom_structure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));
[1021] Fix | Delete
$sttsEntriesDataOffset += 4;
[1022] Fix | Delete
[1023] Fix | Delete
$frames_count += $atom_structure['time_to_sample_table'][$i]['sample_count'];
[1024] Fix | Delete
[1025] Fix | Delete
// THIS SECTION REPLACED WITH CODE IN "stbl" ATOM
[1026] Fix | Delete
//if (!empty($info['quicktime']['time_scale']) && ($atom_structure['time_to_sample_table'][$i]['sample_duration'] > 0)) {
[1027] Fix | Delete
// $stts_new_framerate = $info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'];
[1028] Fix | Delete
// if ($stts_new_framerate <= 60) {
[1029] Fix | Delete
// // some atoms have durations of "1" giving a very large framerate, which probably is not right
[1030] Fix | Delete
// $info['video']['frame_rate'] = max($info['video']['frame_rate'], $stts_new_framerate);
[1031] Fix | Delete
// }
[1032] Fix | Delete
//}
[1033] Fix | Delete
//
[1034] Fix | Delete
//$FrameRateCalculatorArray[($info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'])] += $atom_structure['time_to_sample_table'][$i]['sample_count'];
[1035] Fix | Delete
}
[1036] Fix | Delete
$info['quicktime']['stts_framecount'][] = $frames_count;
[1037] Fix | Delete
//$sttsFramesTotal = 0;
[1038] Fix | Delete
//$sttsSecondsTotal = 0;
[1039] Fix | Delete
//foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) {
[1040] Fix | Delete
// if (($frames_per_second > 60) || ($frames_per_second < 1)) {
[1041] Fix | Delete
// // not video FPS information, probably audio information
[1042] Fix | Delete
// $sttsFramesTotal = 0;
[1043] Fix | Delete
// $sttsSecondsTotal = 0;
[1044] Fix | Delete
// break;
[1045] Fix | Delete
// }
[1046] Fix | Delete
// $sttsFramesTotal += $frame_count;
[1047] Fix | Delete
// $sttsSecondsTotal += $frame_count / $frames_per_second;
[1048] Fix | Delete
//}
[1049] Fix | Delete
//if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) {
[1050] Fix | Delete
// if (($sttsFramesTotal / $sttsSecondsTotal) > $info['video']['frame_rate']) {
[1051] Fix | Delete
// $info['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal;
[1052] Fix | Delete
// }
[1053] Fix | Delete
//}
[1054] Fix | Delete
break;
[1055] Fix | Delete
[1056] Fix | Delete
[1057] Fix | Delete
case 'stss': // Sample Table Sync Sample (key frames) atom
[1058] Fix | Delete
if ($ParseAllPossibleAtoms) {
[1059] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1060] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1061] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1062] Fix | Delete
$stssEntriesDataOffset = 8;
[1063] Fix | Delete
for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
[1064] Fix | Delete
$atom_structure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stssEntriesDataOffset, 4));
[1065] Fix | Delete
$stssEntriesDataOffset += 4;
[1066] Fix | Delete
}
[1067] Fix | Delete
}
[1068] Fix | Delete
break;
[1069] Fix | Delete
[1070] Fix | Delete
[1071] Fix | Delete
case 'stsc': // Sample Table Sample-to-Chunk atom
[1072] Fix | Delete
if ($ParseAllPossibleAtoms) {
[1073] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1074] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1075] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1076] Fix | Delete
$stscEntriesDataOffset = 8;
[1077] Fix | Delete
for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
[1078] Fix | Delete
$atom_structure['sample_to_chunk_table'][$i]['first_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
[1079] Fix | Delete
$stscEntriesDataOffset += 4;
[1080] Fix | Delete
$atom_structure['sample_to_chunk_table'][$i]['samples_per_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
[1081] Fix | Delete
$stscEntriesDataOffset += 4;
[1082] Fix | Delete
$atom_structure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
[1083] Fix | Delete
$stscEntriesDataOffset += 4;
[1084] Fix | Delete
}
[1085] Fix | Delete
}
[1086] Fix | Delete
break;
[1087] Fix | Delete
[1088] Fix | Delete
[1089] Fix | Delete
case 'stsz': // Sample Table SiZe atom
[1090] Fix | Delete
if ($ParseAllPossibleAtoms) {
[1091] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1092] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1093] Fix | Delete
$atom_structure['sample_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1094] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4));
[1095] Fix | Delete
$stszEntriesDataOffset = 12;
[1096] Fix | Delete
if ($atom_structure['sample_size'] == 0) {
[1097] Fix | Delete
for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
[1098] Fix | Delete
$atom_structure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stszEntriesDataOffset, 4));
[1099] Fix | Delete
$stszEntriesDataOffset += 4;
[1100] Fix | Delete
}
[1101] Fix | Delete
}
[1102] Fix | Delete
}
[1103] Fix | Delete
break;
[1104] Fix | Delete
[1105] Fix | Delete
[1106] Fix | Delete
case 'stco': // Sample Table Chunk Offset atom
[1107] Fix | Delete
// if (true) {
[1108] Fix | Delete
if ($ParseAllPossibleAtoms) {
[1109] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1110] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1111] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1112] Fix | Delete
$stcoEntriesDataOffset = 8;
[1113] Fix | Delete
for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
[1114] Fix | Delete
$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 4));
[1115] Fix | Delete
$stcoEntriesDataOffset += 4;
[1116] Fix | Delete
}
[1117] Fix | Delete
}
[1118] Fix | Delete
break;
[1119] Fix | Delete
[1120] Fix | Delete
[1121] Fix | Delete
case 'co64': // Chunk Offset 64-bit (version of "stco" that supports > 2GB files)
[1122] Fix | Delete
if ($ParseAllPossibleAtoms) {
[1123] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1124] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1125] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1126] Fix | Delete
$stcoEntriesDataOffset = 8;
[1127] Fix | Delete
for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
[1128] Fix | Delete
$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 8));
[1129] Fix | Delete
$stcoEntriesDataOffset += 8;
[1130] Fix | Delete
}
[1131] Fix | Delete
}
[1132] Fix | Delete
break;
[1133] Fix | Delete
[1134] Fix | Delete
[1135] Fix | Delete
case 'dref': // Data REFerence atom
[1136] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1137] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1138] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1139] Fix | Delete
$drefDataOffset = 8;
[1140] Fix | Delete
for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
[1141] Fix | Delete
$atom_structure['data_references'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4));
[1142] Fix | Delete
$drefDataOffset += 4;
[1143] Fix | Delete
$atom_structure['data_references'][$i]['type'] = substr($atom_data, $drefDataOffset, 4);
[1144] Fix | Delete
$drefDataOffset += 4;
[1145] Fix | Delete
$atom_structure['data_references'][$i]['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 1));
[1146] Fix | Delete
$drefDataOffset += 1;
[1147] Fix | Delete
$atom_structure['data_references'][$i]['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 3)); // hardcoded: 0x0000
[1148] Fix | Delete
$drefDataOffset += 3;
[1149] Fix | Delete
$atom_structure['data_references'][$i]['data'] = substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));
[1150] Fix | Delete
$drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3);
[1151] Fix | Delete
[1152] Fix | Delete
$atom_structure['data_references'][$i]['flags']['self_reference'] = (bool) ($atom_structure['data_references'][$i]['flags_raw'] & 0x001);
[1153] Fix | Delete
}
[1154] Fix | Delete
break;
[1155] Fix | Delete
[1156] Fix | Delete
[1157] Fix | Delete
case 'gmin': // base Media INformation atom
[1158] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1159] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1160] Fix | Delete
$atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2));
[1161] Fix | Delete
$atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2));
[1162] Fix | Delete
$atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2));
[1163] Fix | Delete
$atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));
[1164] Fix | Delete
$atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 2));
[1165] Fix | Delete
$atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2));
[1166] Fix | Delete
break;
[1167] Fix | Delete
[1168] Fix | Delete
[1169] Fix | Delete
case 'smhd': // Sound Media information HeaDer atom
[1170] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1171] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1172] Fix | Delete
$atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2));
[1173] Fix | Delete
$atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2));
[1174] Fix | Delete
break;
[1175] Fix | Delete
[1176] Fix | Delete
[1177] Fix | Delete
case 'vmhd': // Video Media information HeaDer atom
[1178] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1179] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
[1180] Fix | Delete
$atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2));
[1181] Fix | Delete
$atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2));
[1182] Fix | Delete
$atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2));
[1183] Fix | Delete
$atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));
[1184] Fix | Delete
[1185] Fix | Delete
$atom_structure['flags']['no_lean_ahead'] = (bool) ($atom_structure['flags_raw'] & 0x001);
[1186] Fix | Delete
break;
[1187] Fix | Delete
[1188] Fix | Delete
[1189] Fix | Delete
case 'hdlr': // HanDLeR reference atom
[1190] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1191] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1192] Fix | Delete
$atom_structure['component_type'] = substr($atom_data, 4, 4);
[1193] Fix | Delete
$atom_structure['component_subtype'] = substr($atom_data, 8, 4);
[1194] Fix | Delete
$atom_structure['component_manufacturer'] = substr($atom_data, 12, 4);
[1195] Fix | Delete
$atom_structure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
[1196] Fix | Delete
$atom_structure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
[1197] Fix | Delete
$atom_structure['component_name'] = $this->MaybePascal2String(substr($atom_data, 24));
[1198] Fix | Delete
[1199] Fix | Delete
if (($atom_structure['component_subtype'] == 'STpn') && ($atom_structure['component_manufacturer'] == 'zzzz')) {
[1200] Fix | Delete
$info['video']['dataformat'] = 'quicktimevr';
[1201] Fix | Delete
}
[1202] Fix | Delete
break;
[1203] Fix | Delete
[1204] Fix | Delete
[1205] Fix | Delete
case 'mdhd': // MeDia HeaDer atom
[1206] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1207] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1208] Fix | Delete
$atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1209] Fix | Delete
$atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4));
[1210] Fix | Delete
$atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
[1211] Fix | Delete
$atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
[1212] Fix | Delete
$atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 2));
[1213] Fix | Delete
$atom_structure['quality'] = getid3_lib::BigEndian2Int(substr($atom_data, 22, 2));
[1214] Fix | Delete
[1215] Fix | Delete
if ($atom_structure['time_scale'] == 0) {
[1216] Fix | Delete
$this->error('Corrupt Quicktime file: mdhd.time_scale == zero');
[1217] Fix | Delete
return false;
[1218] Fix | Delete
}
[1219] Fix | Delete
$info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
[1220] Fix | Delete
[1221] Fix | Delete
$atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
[1222] Fix | Delete
$atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
[1223] Fix | Delete
$atom_structure['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale'];
[1224] Fix | Delete
$atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']);
[1225] Fix | Delete
if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {
[1226] Fix | Delete
$info['comments']['language'][] = $atom_structure['language'];
[1227] Fix | Delete
}
[1228] Fix | Delete
$info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix'];
[1229] Fix | Delete
$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix'];
[1230] Fix | Delete
break;
[1231] Fix | Delete
[1232] Fix | Delete
[1233] Fix | Delete
case 'pnot': // Preview atom
[1234] Fix | Delete
$atom_structure['modification_date'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // "standard Macintosh format"
[1235] Fix | Delete
$atom_structure['version_number'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x00
[1236] Fix | Delete
$atom_structure['atom_type'] = substr($atom_data, 6, 4); // usually: 'PICT'
[1237] Fix | Delete
$atom_structure['atom_index'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01
[1238] Fix | Delete
[1239] Fix | Delete
$atom_structure['modification_date_unix'] = getid3_lib::DateMac2Unix($atom_structure['modification_date']);
[1240] Fix | Delete
$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modification_date_unix'];
[1241] Fix | Delete
break;
[1242] Fix | Delete
[1243] Fix | Delete
[1244] Fix | Delete
case 'crgn': // Clipping ReGioN atom
[1245] Fix | Delete
$atom_structure['region_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); // The Region size, Region boundary box,
[1246] Fix | Delete
$atom_structure['boundary_box'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 8)); // and Clipping region data fields
[1247] Fix | Delete
$atom_structure['clipping_data'] = substr($atom_data, 10); // constitute a QuickDraw region.
[1248] Fix | Delete
break;
[1249] Fix | Delete
[1250] Fix | Delete
[1251] Fix | Delete
case 'load': // track LOAD settings atom
[1252] Fix | Delete
$atom_structure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4));
[1253] Fix | Delete
$atom_structure['preload_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1254] Fix | Delete
$atom_structure['preload_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4));
[1255] Fix | Delete
$atom_structure['default_hints_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
[1256] Fix | Delete
[1257] Fix | Delete
$atom_structure['default_hints']['double_buffer'] = (bool) ($atom_structure['default_hints_raw'] & 0x0020);
[1258] Fix | Delete
$atom_structure['default_hints']['high_quality'] = (bool) ($atom_structure['default_hints_raw'] & 0x0100);
[1259] Fix | Delete
break;
[1260] Fix | Delete
[1261] Fix | Delete
[1262] Fix | Delete
case 'tmcd': // TiMe CoDe atom
[1263] Fix | Delete
case 'chap': // CHAPter list atom
[1264] Fix | Delete
case 'sync': // SYNChronization atom
[1265] Fix | Delete
case 'scpt': // tranSCriPT atom
[1266] Fix | Delete
case 'ssrc': // non-primary SouRCe atom
[1267] Fix | Delete
for ($i = 0; $i < strlen($atom_data); $i += 4) {
[1268] Fix | Delete
@$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));
[1269] Fix | Delete
}
[1270] Fix | Delete
break;
[1271] Fix | Delete
[1272] Fix | Delete
[1273] Fix | Delete
case 'elst': // Edit LiST atom
[1274] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1275] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1276] Fix | Delete
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1277] Fix | Delete
for ($i = 0; $i < $atom_structure['number_entries']; $i++ ) {
[1278] Fix | Delete
$atom_structure['edit_list'][$i]['track_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 0, 4));
[1279] Fix | Delete
$atom_structure['edit_list'][$i]['media_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 4, 4));
[1280] Fix | Delete
$atom_structure['edit_list'][$i]['media_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 8 + ($i * 12) + 8, 4));
[1281] Fix | Delete
}
[1282] Fix | Delete
break;
[1283] Fix | Delete
[1284] Fix | Delete
[1285] Fix | Delete
case 'kmat': // compressed MATte atom
[1286] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1287] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
[1288] Fix | Delete
$atom_structure['matte_data_raw'] = substr($atom_data, 4);
[1289] Fix | Delete
break;
[1290] Fix | Delete
[1291] Fix | Delete
[1292] Fix | Delete
case 'ctab': // Color TABle atom
[1293] Fix | Delete
$atom_structure['color_table_seed'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // hardcoded: 0x00000000
[1294] Fix | Delete
$atom_structure['color_table_flags'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x8000
[1295] Fix | Delete
$atom_structure['color_table_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)) + 1;
[1296] Fix | Delete
for ($colortableentry = 0; $colortableentry < $atom_structure['color_table_size']; $colortableentry++) {
[1297] Fix | Delete
$atom_structure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 0, 2));
[1298] Fix | Delete
$atom_structure['color_table'][$colortableentry]['red'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 2, 2));
[1299] Fix | Delete
$atom_structure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 4, 2));
[1300] Fix | Delete
$atom_structure['color_table'][$colortableentry]['blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 6, 2));
[1301] Fix | Delete
}
[1302] Fix | Delete
break;
[1303] Fix | Delete
[1304] Fix | Delete
[1305] Fix | Delete
case 'mvhd': // MoVie HeaDer atom
[1306] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1307] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
[1308] Fix | Delete
$atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1309] Fix | Delete
$atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4));
[1310] Fix | Delete
$atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
[1311] Fix | Delete
$atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
[1312] Fix | Delete
$atom_structure['preferred_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 20, 4));
[1313] Fix | Delete
$atom_structure['preferred_volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 24, 2));
[1314] Fix | Delete
$atom_structure['reserved'] = substr($atom_data, 26, 10);
[1315] Fix | Delete
$atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 36, 4));
[1316] Fix | Delete
$atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));
[1317] Fix | Delete
$atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 44, 4));
[1318] Fix | Delete
$atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 48, 4));
[1319] Fix | Delete
$atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));
[1320] Fix | Delete
$atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 56, 4));
[1321] Fix | Delete
$atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 60, 4));
[1322] Fix | Delete
$atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));
[1323] Fix | Delete
$atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 68, 4));
[1324] Fix | Delete
$atom_structure['preview_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 72, 4));
[1325] Fix | Delete
$atom_structure['preview_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 76, 4));
[1326] Fix | Delete
$atom_structure['poster_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 80, 4));
[1327] Fix | Delete
$atom_structure['selection_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 84, 4));
[1328] Fix | Delete
$atom_structure['selection_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 88, 4));
[1329] Fix | Delete
$atom_structure['current_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 92, 4));
[1330] Fix | Delete
$atom_structure['next_track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 96, 4));
[1331] Fix | Delete
[1332] Fix | Delete
if ($atom_structure['time_scale'] == 0) {
[1333] Fix | Delete
$this->error('Corrupt Quicktime file: mvhd.time_scale == zero');
[1334] Fix | Delete
return false;
[1335] Fix | Delete
}
[1336] Fix | Delete
$atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
[1337] Fix | Delete
$atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
[1338] Fix | Delete
$info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix'];
[1339] Fix | Delete
$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix'];
[1340] Fix | Delete
$info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
[1341] Fix | Delete
$info['quicktime']['display_scale'] = $atom_structure['matrix_a'];
[1342] Fix | Delete
$info['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale'];
[1343] Fix | Delete
break;
[1344] Fix | Delete
[1345] Fix | Delete
[1346] Fix | Delete
case 'tkhd': // TracK HeaDer atom
[1347] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
[1348] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
[1349] Fix | Delete
$atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1350] Fix | Delete
$atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4));
[1351] Fix | Delete
$atom_structure['trackid'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
[1352] Fix | Delete
$atom_structure['reserved1'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
[1353] Fix | Delete
$atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
[1354] Fix | Delete
$atom_structure['reserved2'] = getid3_lib::BigEndian2Int(substr($atom_data, 24, 8));
[1355] Fix | Delete
$atom_structure['layer'] = getid3_lib::BigEndian2Int(substr($atom_data, 32, 2));
[1356] Fix | Delete
$atom_structure['alternate_group'] = getid3_lib::BigEndian2Int(substr($atom_data, 34, 2));
[1357] Fix | Delete
$atom_structure['volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 36, 2));
[1358] Fix | Delete
$atom_structure['reserved3'] = getid3_lib::BigEndian2Int(substr($atom_data, 38, 2));
[1359] Fix | Delete
// http://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieBasics/MTEditing/K-Chapter/11MatrixFunctions.html
[1360] Fix | Delete
// http://developer.apple.com/library/mac/#documentation/QuickTime/qtff/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737
[1361] Fix | Delete
$atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));
[1362] Fix | Delete
$atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 44, 4));
[1363] Fix | Delete
$atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 48, 4));
[1364] Fix | Delete
$atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));
[1365] Fix | Delete
$atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 56, 4));
[1366] Fix | Delete
$atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 60, 4));
[1367] Fix | Delete
$atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));
[1368] Fix | Delete
$atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 68, 4));
[1369] Fix | Delete
$atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 72, 4));
[1370] Fix | Delete
$atom_structure['width'] = getid3_lib::FixedPoint16_16(substr($atom_data, 76, 4));
[1371] Fix | Delete
$atom_structure['height'] = getid3_lib::FixedPoint16_16(substr($atom_data, 80, 4));
[1372] Fix | Delete
$atom_structure['flags']['enabled'] = (bool) ($atom_structure['flags_raw'] & 0x0001);
[1373] Fix | Delete
$atom_structure['flags']['in_movie'] = (bool) ($atom_structure['flags_raw'] & 0x0002);
[1374] Fix | Delete
$atom_structure['flags']['in_preview'] = (bool) ($atom_structure['flags_raw'] & 0x0004);
[1375] Fix | Delete
$atom_structure['flags']['in_poster'] = (bool) ($atom_structure['flags_raw'] & 0x0008);
[1376] Fix | Delete
$atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
[1377] Fix | Delete
$atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
[1378] Fix | Delete
$info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix'];
[1379] Fix | Delete
$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix'];
[1380] Fix | Delete
[1381] Fix | Delete
// https://www.getid3.org/phpBB3/viewtopic.php?t=1908
[1382] Fix | Delete
// attempt to compute rotation from matrix values
[1383] Fix | Delete
// 2017-Dec-28: uncertain if 90/270 are correctly oriented; values returned by FixedPoint16_16 should perhaps be -1 instead of 65535(?)
[1384] Fix | Delete
$matrixRotation = 0;
[1385] Fix | Delete
switch ($atom_structure['matrix_a'].':'.$atom_structure['matrix_b'].':'.$atom_structure['matrix_c'].':'.$atom_structure['matrix_d']) {
[1386] Fix | Delete
case '1:0:0:1': $matrixRotation = 0; break;
[1387] Fix | Delete
case '0:1:65535:0': $matrixRotation = 90; break;
[1388] Fix | Delete
case '65535:0:0:65535': $matrixRotation = 180; break;
[1389] Fix | Delete
case '0:65535:1:0': $matrixRotation = 270; break;
[1390] Fix | Delete
default: break;
[1391] Fix | Delete
}
[1392] Fix | Delete
[1393] Fix | Delete
// https://www.getid3.org/phpBB3/viewtopic.php?t=2468
[1394] Fix | Delete
// The rotation matrix can appear in the Quicktime file multiple times, at least once for each track,
[1395] Fix | Delete
// and it's possible that only the video track (or, in theory, one of the video tracks) is flagged as
[1396] Fix | Delete
// rotated while the other tracks (e.g. audio) is tagged as rotation=0 (behavior noted on iPhone 8 Plus)
[1397] Fix | Delete
// The correct solution would be to check if the TrackID associated with the rotation matrix is indeed
[1398] Fix | Delete
// a video track (or the main video track) and only set the rotation then, but since information about
[1399] Fix | Delete
// what track is what is not trivially there to be examined, the lazy solution is to set the rotation
[1400] Fix | Delete
// if it is found to be nonzero, on the assumption that tracks that don't need it will have rotation set
[1401] Fix | Delete
// to zero (and be effectively ignored) and the video track will have rotation set correctly, which will
[1402] Fix | Delete
// either be zero and automatically correct, or nonzero and be set correctly.
[1403] Fix | Delete
if (!isset($info['video']['rotate']) || (($info['video']['rotate'] == 0) && ($matrixRotation > 0))) {
[1404] Fix | Delete
$info['quicktime']['video']['rotate'] = $info['video']['rotate'] = $matrixRotation;
[1405] Fix | Delete
}
[1406] Fix | Delete
[1407] Fix | Delete
if ($atom_structure['flags']['enabled'] == 1) {
[1408] Fix | Delete
if (!isset($info['video']['resolution_x']) || !isset($info['video']['resolution_y'])) {
[1409] Fix | Delete
$info['video']['resolution_x'] = $atom_structure['width'];
[1410] Fix | Delete
$info['video']['resolution_y'] = $atom_structure['height'];
[1411] Fix | Delete
}
[1412] Fix | Delete
$info['video']['resolution_x'] = max($info['video']['resolution_x'], $atom_structure['width']);
[1413] Fix | Delete
$info['video']['resolution_y'] = max($info['video']['resolution_y'], $atom_structure['height']);
[1414] Fix | Delete
$info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x'];
[1415] Fix | Delete
$info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y'];
[1416] Fix | Delete
} else {
[1417] Fix | Delete
// see: https://www.getid3.org/phpBB3/viewtopic.php?t=1295
[1418] Fix | Delete
//if (isset($info['video']['resolution_x'])) { unset($info['video']['resolution_x']); }
[1419] Fix | Delete
//if (isset($info['video']['resolution_y'])) { unset($info['video']['resolution_y']); }
[1420] Fix | Delete
//if (isset($info['quicktime']['video'])) { unset($info['quicktime']['video']); }
[1421] Fix | Delete
}
[1422] Fix | Delete
break;
[1423] Fix | Delete
[1424] Fix | Delete
[1425] Fix | Delete
case 'iods': // Initial Object DeScriptor atom
[1426] Fix | Delete
// http://www.koders.com/c/fid1FAB3E762903DC482D8A246D4A4BF9F28E049594.aspx?s=windows.h
[1427] Fix | Delete
// http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html
[1428] Fix | Delete
$offset = 0;
[1429] Fix | Delete
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1430] Fix | Delete
$offset += 1;
[1431] Fix | Delete
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 3));
[1432] Fix | Delete
$offset += 3;
[1433] Fix | Delete
$atom_structure['mp4_iod_tag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1434] Fix | Delete
$offset += 1;
[1435] Fix | Delete
$atom_structure['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset);
[1436] Fix | Delete
//$offset already adjusted by quicktime_read_mp4_descr_length()
[1437] Fix | Delete
$atom_structure['object_descriptor_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));
[1438] Fix | Delete
$offset += 2;
[1439] Fix | Delete
$atom_structure['od_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1440] Fix | Delete
$offset += 1;
[1441] Fix | Delete
$atom_structure['scene_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1442] Fix | Delete
$offset += 1;
[1443] Fix | Delete
$atom_structure['audio_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1444] Fix | Delete
$offset += 1;
[1445] Fix | Delete
$atom_structure['video_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1446] Fix | Delete
$offset += 1;
[1447] Fix | Delete
$atom_structure['graphics_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1448] Fix | Delete
$offset += 1;
[1449] Fix | Delete
[1450] Fix | Delete
$atom_structure['num_iods_tracks'] = ($atom_structure['length'] - 7) / 6; // 6 bytes would only be right if all tracks use 1-byte length fields
[1451] Fix | Delete
for ($i = 0; $i < $atom_structure['num_iods_tracks']; $i++) {
[1452] Fix | Delete
$atom_structure['track'][$i]['ES_ID_IncTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
[1453] Fix | Delete
$offset += 1;
[1454] Fix | Delete
$atom_structure['track'][$i]['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset);
[1455] Fix | Delete
//$offset already adjusted by quicktime_read_mp4_descr_length()
[1456] Fix | Delete
$atom_structure['track'][$i]['track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4));
[1457] Fix | Delete
$offset += 4;
[1458] Fix | Delete
}
[1459] Fix | Delete
[1460] Fix | Delete
$atom_structure['audio_profile_name'] = $this->QuicktimeIODSaudioProfileName($atom_structure['audio_profile_id']);
[1461] Fix | Delete
$atom_structure['video_profile_name'] = $this->QuicktimeIODSvideoProfileName($atom_structure['video_profile_id']);
[1462] Fix | Delete
break;
[1463] Fix | Delete
[1464] Fix | Delete
case 'ftyp': // FileTYPe (?) atom (for MP4 it seems)
[1465] Fix | Delete
$atom_structure['signature'] = substr($atom_data, 0, 4);
[1466] Fix | Delete
$atom_structure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
[1467] Fix | Delete
$atom_structure['fourcc'] = substr($atom_data, 8, 4);
[1468] Fix | Delete
break;
[1469] Fix | Delete
[1470] Fix | Delete
case 'mdat': // Media DATa atom
[1471] Fix | Delete
// 'mdat' contains the actual data for the audio/video, possibly also subtitles
[1472] Fix | Delete
[1473] Fix | Delete
/* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */
[1474] Fix | Delete
[1475] Fix | Delete
// first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?)
[1476] Fix | Delete
$mdat_offset = 0;
[1477] Fix | Delete
while (true) {
[1478] Fix | Delete
if (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x08".'wide') {
[1479] Fix | Delete
$mdat_offset += 8;
[1480] Fix | Delete
} elseif (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x00".'mdat') {
[1481] Fix | Delete
$mdat_offset += 8;
[1482] Fix | Delete
} else {
[1483] Fix | Delete
break;
[1484] Fix | Delete
}
[1485] Fix | Delete
}
[1486] Fix | Delete
if (substr($atom_data, $mdat_offset, 4) == 'GPRO') {
[1487] Fix | Delete
$GOPRO_chunk_length = getid3_lib::LittleEndian2Int(substr($atom_data, $mdat_offset + 4, 4));
[1488] Fix | Delete
$GOPRO_offset = 8;
[1489] Fix | Delete
$atom_structure['GPRO']['raw'] = substr($atom_data, $mdat_offset + 8, $GOPRO_chunk_length - 8);
[1490] Fix | Delete
$atom_structure['GPRO']['firmware'] = substr($atom_structure['GPRO']['raw'], 0, 15);
[1491] Fix | Delete
$atom_structure['GPRO']['unknown1'] = substr($atom_structure['GPRO']['raw'], 15, 16);
[1492] Fix | Delete
$atom_structure['GPRO']['unknown2'] = substr($atom_structure['GPRO']['raw'], 31, 32);
[1493] Fix | Delete
$atom_structure['GPRO']['unknown3'] = substr($atom_structure['GPRO']['raw'], 63, 16);
[1494] Fix | Delete
$atom_structure['GPRO']['camera'] = substr($atom_structure['GPRO']['raw'], 79, 32);
[1495] Fix | Delete
$info['quicktime']['camera']['model'] = rtrim($atom_structure['GPRO']['camera'], "\x00");
[1496] Fix | Delete
}
[1497] Fix | Delete
[1498] Fix | Delete
// check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field
[1499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function