Syntax Syntax
Parameters Parameters
- $languageid
-
(Required)
Return Return
(string)
Source Source
File: wp-includes/ID3/module.audio-video.quicktime.php
'heading' => (float) $GPS_this_GPRMC['heading'], ); } else { $this->warning('Unhandled GPS format in "free" atom at offset '.$gps_pointer['offset']); } } $this->fseek($previous_offset); } else { $this->warning('QuickTime atom "'.$atomname.'" is not mod-8 bytes long ('.$atomsize.' bytes) at offset '.$baseoffset); } } else { $this->warning('QuickTime atom "'.$atomname.'" is zero bytes long at offset '.$baseoffset); } break; case 'loci':// 3GP location (El Loco) $loffset = 0; $info['quicktime']['comments']['gps_flags'] = array( getid3_lib::BigEndian2Int(substr($atom_data, 0, 4))); $info['quicktime']['comments']['gps_lang'] = array( getid3_lib::BigEndian2Int(substr($atom_data, 4, 2))); $info['quicktime']['comments']['gps_location'] = array( $this->LociString(substr($atom_data, 6), $loffset)); $loci_data = substr($atom_data, 6 + $loffset); $info['quicktime']['comments']['gps_role'] = array( getid3_lib::BigEndian2Int(substr($loci_data, 0, 1))); $info['quicktime']['comments']['gps_longitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 1, 4))); $info['quicktime']['comments']['gps_latitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 5, 4))); $info['quicktime']['comments']['gps_altitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 9, 4))); $info['quicktime']['comments']['gps_body'] = array( $this->LociString(substr($loci_data, 13 ), $loffset)); $info['quicktime']['comments']['gps_notes'] = array( $this->LociString(substr($loci_data, 13 + $loffset), $loffset)); break; case 'chpl': // CHaPter List // https://www.adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/video_file_format_spec_v10.pdf $chpl_version = getid3_lib::BigEndian2Int(substr($atom_data, 4, 1)); // Expected to be 0 $chpl_flags = getid3_lib::BigEndian2Int(substr($atom_data, 5, 3)); // Reserved, set to 0 $chpl_count = getid3_lib::BigEndian2Int(substr($atom_data, 8, 1)); $chpl_offset = 9; for ($i = 0; $i < $chpl_count; $i++) { if (($chpl_offset + 9) >= strlen($atom_data)) { $this->warning('QuickTime chapter '.$i.' extends beyond end of "chpl" atom'); break; } $info['quicktime']['chapters'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 8)) / 10000000; // timestamps are stored as 100-nanosecond units $chpl_offset += 8; $chpl_title_size = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 1)); $chpl_offset += 1; $info['quicktime']['chapters'][$i]['title'] = substr($atom_data, $chpl_offset, $chpl_title_size); $chpl_offset += $chpl_title_size; } break; case 'FIRM': // FIRMware version(?), seen on GoPro Hero4 $info['quicktime']['camera']['firmware'] = $atom_data; break; case 'CAME': // FIRMware version(?), seen on GoPro Hero4 $info['quicktime']['camera']['serial_hash'] = unpack('H*', $atom_data); break; case 'dscp': case 'rcif': // https://www.getid3.org/phpBB3/viewtopic.php?t=1908 if (substr($atom_data, 0, 7) == "\x00\x00\x00\x00\x55\xC4".'{') { if ($json_decoded = @json_decode(rtrim(substr($atom_data, 6), "\x00"), true)) { $info['quicktime']['camera'][$atomname] = $json_decoded; if (($atomname == 'rcif') && isset($info['quicktime']['camera']['rcif']['wxcamera']['rotate'])) { $info['video']['rotate'] = $info['quicktime']['video']['rotate'] = $info['quicktime']['camera']['rcif']['wxcamera']['rotate']; } } else { $this->warning('Failed to JSON decode atom "'.$atomname.'"'); $atom_structure['data'] = $atom_data; } unset($json_decoded); } else { $this->warning('Expecting 55 C4 7B at start of atom "'.$atomname.'", found '.getid3_lib::PrintHexBytes(substr($atom_data, 4, 3)).' instead'); $atom_structure['data'] = $atom_data; } break; case 'frea': // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea // may contain "scra" (PreviewImage) and/or "thma" (ThumbnailImage) $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms); break; case 'tima': // subatom to "frea" // no idea what this does, the one sample file I've seen has a value of 0x00000027 $atom_structure['data'] = $atom_data; break; case 'ver ': // subatom to "frea" // some kind of version number, the one sample file I've seen has a value of "3.00.073" $atom_structure['data'] = $atom_data; break; case 'thma': // subatom to "frea" -- "ThumbnailImage" // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea if (strlen($atom_data) > 0) { $info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg', 'description'=>'ThumbnailImage'); } break; case 'scra': // subatom to "frea" -- "PreviewImage" // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea // but the only sample file I've seen has no useful data here if (strlen($atom_data) > 0) { $info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg', 'description'=>'PreviewImage'); } break; case 'cdsc': // timed metadata reference // A QuickTime movie can contain none, one, or several timed metadata tracks. Timed metadata tracks can refer to multiple tracks. // Metadata tracks are linked to the tracks they describe using a track-reference of type 'cdsc'. The metadata track holds the 'cdsc' track reference. $atom_structure['track_number'] = getid3_lib::BigEndian2Int($atom_data); break; default: $this->warning('Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).'), '.$atomsize.' bytes at offset '.$baseoffset); $atom_structure['data'] = $atom_data; break; } } array_pop($atomHierarchy); return $atom_structure; } /** * @param string $atom_data * @param int $baseoffset * @param array $atomHierarchy * @param bool $ParseAllPossibleAtoms * * @return array|false */ public function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { $atom_structure = false; $subatomoffset = 0; $subatomcounter = 0; if ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) { return false;