499 $this->current_offset =
$info[
'avdataoffset'];
502 switch ($top_element[
'id']) {
505 $info[
'matroska'][
'header'][
'offset'] = $top_element[
'offset'];
506 $info[
'matroska'][
'header'][
'length'] = $top_element[
'length'];
508 while ($this->
getEBMLelement($element_data, $top_element[
'end'],
true)) {
509 switch ($element_data[
'id']) {
522 $info[
'matroska'][
'doctype'] = $element_data[
'data'];
523 $info[
'fileformat'] = $element_data[
'data'];
531 unset($element_data[
'offset'], $element_data[
'end']);
532 $info[
'matroska'][
'header'][
'elements'][] = $element_data;
537 $info[
'matroska'][
'segment'][0][
'offset'] = $top_element[
'offset'];
538 $info[
'matroska'][
'segment'][0][
'length'] = $top_element[
'length'];
540 while ($this->
getEBMLelement($element_data, $top_element[
'end'])) {
542 $info[
'matroska'][
'segments'][] = $element_data;
544 switch ($element_data[
'id']) {
548 while ($this->
getEBMLelement($seek_entry, $element_data[
'end'])) {
549 switch ($seek_entry[
'id']) {
552 while ($this->
getEBMLelement($sub_seek_entry, $seek_entry[
'end'],
true)) {
554 switch ($sub_seek_entry[
'id']) {
557 $seek_entry[
'target_id'] = self::EBML2Int($sub_seek_entry[
'data']);
558 $seek_entry[
'target_name'] = self::EBMLidName($seek_entry[
'target_id']);
570 if ($seek_entry[
'target_id'] !=
EBML_ID_CLUSTER || !self::$hide_clusters) {
571 $info[
'matroska'][
'seek'][] = $seek_entry;
583 $info[
'matroska'][
'tracks'] = $element_data;
585 while ($this->
getEBMLelement($track_entry, $element_data[
'end'])) {
586 switch ($track_entry[
'id']) {
591 switch ($subelement[
'id']) {
615 $track_entry[$subelement[
'id_name']] = $this->
readEBMLelementData($subelement[
'length'],
true);
628 while ($this->
getEBMLelement($sub_subelement, $subelement[
'end'],
true)) {
629 switch ($sub_subelement[
'id']) {
667 while ($this->
getEBMLelement($sub_subelement, $subelement[
'end'],
true)) {
668 switch ($sub_subelement[
'id']) {
693 while ($this->
getEBMLelement($sub_subelement, $subelement[
'end'])) {
694 switch ($sub_subelement[
'id']) {
699 switch ($sub_sub_subelement[
'id']) {
704 $track_entry[$sub_subelement[
'id_name']][$sub_sub_subelement[
'id_name']] =
getid3_lib::BigEndian2Int($sub_sub_subelement[
'data']);
709 while ($this->
getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement[
'end'],
true)) {
710 switch ($sub_sub_sub_subelement[
'id']) {
713 $track_entry[$sub_subelement[
'id_name']][$sub_sub_subelement[
'id_name']][$sub_sub_sub_subelement[
'id_name']] =
getid3_lib::BigEndian2Int($sub_sub_sub_subelement[
'data']);
717 $track_entry[$sub_subelement[
'id_name']][$sub_sub_subelement[
'id_name']][$sub_sub_sub_subelement[
'id_name']] = $sub_sub_sub_subelement[
'data'];
721 $this->
unhandledElement(
'track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
729 while ($this->
getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement[
'end'],
true)) {
730 switch ($sub_sub_sub_subelement[
'id']) {
735 $track_entry[$sub_subelement[
'id_name']][$sub_sub_subelement[
'id_name']][$sub_sub_sub_subelement[
'id_name']] =
getid3_lib::BigEndian2Int($sub_sub_sub_subelement[
'data']);
741 $track_entry[$sub_subelement[
'id_name']][$sub_sub_subelement[
'id_name']][$sub_sub_sub_subelement[
'id_name']] = $sub_sub_sub_subelement[
'data'];
745 $this->
unhandledElement(
'track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
752 $this->
unhandledElement(
'track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);
759 $this->
unhandledElement(
'track.contentencodings', __LINE__, $sub_subelement);
771 $info[
'matroska'][
'tracks'][
'tracks'][] = $track_entry;
782 $info_entry = array();
784 while ($this->
getEBMLelement($subelement, $element_data[
'end'],
true)) {
785 switch ($subelement[
'id']) {
797 $info_entry[$subelement[
'id_name'].
'_unix'] = self::EBMLdate2unix($info_entry[$subelement[
'id_name']]);
817 $info[
'matroska'][
'comments'][strtolower($subelement[
'id_name'])][] = $info_entry[$subelement[
'id_name']];
821 $chaptertranslate_entry = array();
823 while ($this->
getEBMLelement($sub_subelement, $subelement[
'end'],
true)) {
824 switch ($sub_subelement[
'id']) {
839 $this->
unhandledElement(
'info.chaptertranslate', __LINE__, $sub_subelement);
843 $info_entry[$subelement[
'id_name']] = $chaptertranslate_entry;
851 $info[
'matroska'][
'info'][] = $info_entry;
855 if (self::$hide_clusters) {
856 $this->current_offset = $element_data[
'end'];
859 $cues_entry = array();
861 while ($this->
getEBMLelement($subelement, $element_data[
'end'])) {
862 switch ($subelement[
'id']) {
865 $cuepoint_entry = array();
868 switch ($sub_subelement[
'id']) {
871 $cuetrackpositions_entry = array();
873 while ($this->
getEBMLelement($sub_sub_subelement, $sub_subelement[
'end'],
true)) {
874 switch ($sub_sub_subelement[
'id']) {
884 $this->
unhandledElement(
'cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);
888 $cuepoint_entry[$sub_subelement[
'id_name']][] = $cuetrackpositions_entry;
900 $cues_entry[] = $cuepoint_entry;
908 $info[
'matroska'][
'cues'] = $cues_entry;
912 $tags_entry = array();
914 while ($this->
getEBMLelement($subelement, $element_data[
'end'],
false)) {
915 switch ($subelement[
'id']) {
918 $tag_entry = array();
920 while ($this->
getEBMLelement($sub_subelement, $subelement[
'end'],
false)) {
921 switch ($sub_subelement[
'id']) {
924 $targets_entry = array();
926 while ($this->
getEBMLelement($sub_sub_subelement, $sub_subelement[
'end'],
true)) {
927 switch ($sub_sub_subelement[
'id']) {
931 $targets_entry[strtolower($sub_sub_subelement[
'id_name']).
'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement[
'id_name']]);
935 $targets_entry[$sub_sub_subelement[
'id_name']] = $sub_sub_subelement[
'data'];
950 $tag_entry[$sub_subelement[
'id_name']] = $targets_entry;
954 $tag_entry[$sub_subelement[
'id_name']][] = $this->
HandleEMBLSimpleTag($sub_subelement[
'end']);
962 $tags_entry[] = $tag_entry;
970 $info[
'matroska'][
'tags'] = $tags_entry;
975 while ($this->
getEBMLelement($subelement, $element_data[
'end'])) {
976 switch ($subelement[
'id']) {
979 $attachedfile_entry = array();
982 switch ($sub_subelement[
'id']) {
987 $attachedfile_entry[$sub_subelement[
'id_name']] = $sub_subelement[
'data'];
992 $attachedfile_entry[
'data_length'] = $sub_subelement[
'length'];
994 $attachedfile_entry[$sub_subelement[
'id_name']] = $this->
saveAttachment(
995 $attachedfile_entry[
'FileName'],
996 $attachedfile_entry[
'data_offset'],
997 $attachedfile_entry[
'data_length']);
999 $this->current_offset = $sub_subelement[
'end'];
1007 $this->
unhandledElement(
'attachments.attachedfile', __LINE__, $sub_subelement);
1011 $info[
'matroska'][
'attachments'][] = $attachedfile_entry;
1023 while ($this->
getEBMLelement($subelement, $element_data[
'end'])) {
1024 switch ($subelement[
'id']) {
1027 $editionentry_entry = array();
1030 switch ($sub_subelement[
'id']) {
1043 $chapteratom_entry = array();
1046 switch ($sub_sub_subelement[
'id']) {
1050 $chapteratom_entry[$sub_sub_subelement[
'id_name']] = $sub_sub_subelement[
'data'];
1065 $chaptertrack_entry = array();
1067 while ($this->
getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement[
'end'],
true)) {
1068 switch ($sub_sub_sub_subelement[
'id']) {
1075 $this->
unhandledElement(
'chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);
1079 $chapteratom_entry[$sub_sub_subelement[
'id_name']][] = $chaptertrack_entry;
1083 $chapterdisplay_entry = array();
1085 while ($this->
getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement[
'end'],
true)) {
1086 switch ($sub_sub_sub_subelement[
'id']) {
1091 $chapterdisplay_entry[$sub_sub_sub_subelement[
'id_name']] = $sub_sub_sub_subelement[
'data'];
1095 $this->
unhandledElement(
'chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);
1099 $chapteratom_entry[$sub_sub_subelement[
'id_name']][] = $chapterdisplay_entry;
1103 $this->
unhandledElement(
'chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);
1107 $editionentry_entry[$sub_subelement[
'id_name']][] = $chapteratom_entry;
1111 $this->
unhandledElement(
'chapters.editionentry', __LINE__, $sub_subelement);
1115 $info[
'matroska'][
'chapters'][] = $editionentry_entry;
1126 $cluster_entry = array();
1129 switch ($subelement[
'id']) {
1138 $cluster_silent_tracks = array();
1140 while ($this->
getEBMLelement($sub_subelement, $subelement[
'end'],
true)) {
1141 switch ($sub_subelement[
'id']) {
1148 $this->
unhandledElement(
'cluster.silenttracks', __LINE__, $sub_subelement);
1152 $cluster_entry[$subelement[
'id_name']][] = $cluster_silent_tracks;
1156 $cluster_block_group = array(
'offset' => $this->current_offset);
1159 switch ($sub_subelement[
'id']) {
1183 $cluster_entry[$subelement[
'id_name']][] = $cluster_block_group;
1194 $this->current_offset = $subelement[
'end'];
1196 if (!self::$hide_clusters) {
1197 $info[
'matroska'][
'cluster'][] = $cluster_entry;
1201 if (!self::$parse_whole_file) {
1202 if (isset(
$info[
'matroska'][
'info']) && is_array(
$info[
'matroska'][
'info'])) {
1203 if (isset(
$info[
'matroska'][
'tracks'][
'tracks']) && is_array(
$info[
'matroska'][
'tracks'][
'tracks'])) {
1204 if (count(
$info[
'matroska'][
'track_data_offsets']) == count(
$info[
'matroska'][
'tracks'][
'tracks'])) {
const EBML_ID_CHANNELPOSITIONS
const EBML_ID_SAMPLINGFREQUENCY
const EBML_ID_PIXELCROPBOTTOM
const EBML_ID_PIXELCROPTOP
const EBML_ID_TIMECODESCALE
const EBML_ID_EDITIONENTRY
const EBML_ID_CHAPTERTRACK
const EBML_ID_SEEKPOSITION
const EBML_ID_CONTENTCOMPRESSION
const EBML_ID_CONTENTENCODINGTYPE
const EBML_ID_CLUSTERCODECSTATE
const EBML_ID_CHAPTERSEGMENTEDITIONUID
const EBML_ID_CONTENTENCALGO
const EBML_ID_CHAPTERDISPLAY
const EBML_ID_CLUSTERBLOCKDURATION
const EBML_ID_CLUSTERTIMECODE
const EBML_ID_TAGEDITIONUID
HandleEMBLClusterBlock($element, $block_type, &$info)
const EBML_ID_COLOURSPACE
const EBML_ID_TAGATTACHMENTUID
const EBML_ID_CHAPTERTRACKNUMBER
const EBML_ID_FLAGENABLED
const EBML_ID_TAGCHAPTERUID
const EBML_ID_DOCTYPEVERSION
const EBML_ID_DISPLAYWIDTH
const EBML_ID_PIXELHEIGHT
const EBML_ID_CONTENTENCODING
saveAttachment($name, $offset, $length, $image_mime=null)
const EBML_ID_CHAPLANGUAGE
const EBML_ID_FILEDESCRIPTION
const EBML_ID_CLUSTERSILENTTRACKS
const EBML_ID_CHAPTERTRANSLATEID
const EBML_ID_OUTPUTSAMPLINGFREQUENCY
const EBML_ID_PREVFILENAME
const EBML_ID_EBMLMAXSIZELENGTH
const EBML_ID_ATTACHMENTS
const EBML_ID_TAGTRACKUID
const EBML_ID_CONTENTCOMPSETTINGS
const EBML_ID_CUETRACKPOSITIONS
getEBMLelement(&$element, $parent_end, $get_data=false)
const EBML_ID_CHAPTERTIMEEND
const EBML_ID_FLAGINTERLACED
const EBML_ID_FILEMIMETYPE
const EBML_ID_EDITIONFLAGDEFAULT
const EBML_ID_CONTENTSIGNATURE
const EBML_ID_CUECLUSTERPOSITION
const EBML_ID_CODECDECODEALL
const EBML_ID_CLUSTERBLOCK
const EBML_ID_CONTENTSIGKEYID
const EBML_ID_CHAPTERSEGMENTUID
const EBML_ID_CLUSTERREFERENCEPRIORITY
const EBML_ID_CHAPTERS
getID3() by James Heinrich info@getid3.org //
const EBML_ID_MAXBLOCKADDITIONID
static trimNullByte($string)
const EBML_ID_ATTACHEDFILE
const EBML_ID_CHAPTERTRANSLATEEDITIONUID
const EBML_ID_CLUSTERPREVSIZE
const EBML_ID_CHAPTERFLAGHIDDEN
readEBMLelementData($length, $check_buffer=false)
const EBML_ID_EDITIONFLAGORDERED
const EBML_ID_EBMLREADVERSION
const EBML_ID_CONTENTENCKEYID
HandleEMBLSimpleTag($parent_end)
const EBML_ID_CUEBLOCKNUMBER
const EBML_ID_TRACKNUMBER
const EBML_ID_CLUSTERPOSITION
const EBML_ID_TARGETTYPEVALUE
const EBML_ID_CONTENTSIGALGO
BigEndian2Int($byteword, $synchsafe=false, $signed=false)
const EBML_ID_TRACKTIMECODESCALE
const EBML_ID_CONTENTENCODINGSCOPE
BigEndian2Float($byteword)
const EBML_ID_NEXTFILENAME
const EBML_ID_PIXELCROPLEFT
const EBML_ID_CONTENTSIGHASHALGO
const EBML_ID_SEGMENTFILENAME
const EBML_ID_EBMLVERSION
const EBML_ID_CONTENTENCODINGORDER
const EBML_ID_DOCTYPEREADVERSION
const EBML_ID_FLAGDEFAULT
const EBML_ID_EDITIONFLAGHIDDEN
const EBML_ID_CHAPTERTRANSLATE
const EBML_ID_EBMLMAXIDLENGTH
const EBML_ID_CONTENTENCODINGS
const EBML_ID_OLDSTEREOMODE
const EBML_ID_PIXELCROPRIGHT
const EBML_ID_CLUSTERREFERENCEBLOCK
const EBML_ID_CLUSTERBLOCKGROUP
const EBML_ID_CONTENTCOMPALGO
const EBML_ID_CLUSTERSIMPLEBLOCK
const EBML_ID_CHAPCOUNTRY
const EBML_ID_SEGMENTFAMILY
unhandledElement($type, $line, $element)
const EBML_ID_CHAPTERTIMESTART
const EBML_ID_ASPECTRATIOTYPE
const EBML_ID_CODECPRIVATE
const EBML_ID_CONTENTENCRYPTION
const EBML_ID_DEFAULTDURATION
const EBML_ID_CUECODECSTATE
const EBML_ID_CHAPTERATOM
const EBML_ID_DISPLAYHEIGHT
const EBML_ID_DISPLAYUNIT
const EBML_ID_CHAPTERTRANSLATECODEC
const EBML_ID_CLUSTERSILENTTRACKNUMBER
const EBML_ID_CHAPTERFLAGENABLED