WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Самая быстрая Тема-конструктор для WordPress
функция не описана

getid3_matroska::parseEBML() private WP 1.0

Это метод класса: getid3_matroska{}

Хуков нет.

Возвращает

Null. Ничего.

Использование

// private - только в коде основоного (родительского) класса
$result = $this->parseEBML( $info );
$info(массив) (обязательный) (передается по ссылке — &)

Код getid3_matroska::parseEBML() WP 5.5.1

wp-includes/ID3/module.audio-video.matroska.php
<?php
private function parseEBML(&$info) {
	// http://www.matroska.org/technical/specs/index.html#EBMLBasics
	$this->current_offset = $info['avdataoffset'];

	while ($this->getEBMLelement($top_element, $info['avdataend'])) {
		switch ($top_element['id']) {

			case EBML_ID_EBML:
				$info['matroska']['header']['offset'] = $top_element['offset'];
				$info['matroska']['header']['length'] = $top_element['length'];

				while ($this->getEBMLelement($element_data, $top_element['end'], true)) {
					switch ($element_data['id']) {

						case EBML_ID_EBMLVERSION:
						case EBML_ID_EBMLREADVERSION:
						case EBML_ID_EBMLMAXIDLENGTH:
						case EBML_ID_EBMLMAXSIZELENGTH:
						case EBML_ID_DOCTYPEVERSION:
						case EBML_ID_DOCTYPEREADVERSION:
							$element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']);
							break;

						case EBML_ID_DOCTYPE:
							$element_data['data'] = getid3_lib::trimNullByte($element_data['data']);
							$info['matroska']['doctype'] = $element_data['data'];
							$info['fileformat'] = $element_data['data'];
							break;

						default:
							$this->unhandledElement('header', __LINE__, $element_data);
							break;
					}

					unset($element_data['offset'], $element_data['end']);
					$info['matroska']['header']['elements'][] = $element_data;
				}
				break;

			case EBML_ID_SEGMENT:
				$info['matroska']['segment'][0]['offset'] = $top_element['offset'];
				$info['matroska']['segment'][0]['length'] = $top_element['length'];

				while ($this->getEBMLelement($element_data, $top_element['end'])) {
					if ($element_data['id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required
						$info['matroska']['segments'][] = $element_data;
					}
					switch ($element_data['id']) {

						case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements.

							while ($this->getEBMLelement($seek_entry, $element_data['end'])) {
								switch ($seek_entry['id']) {

									case EBML_ID_SEEK: // Contains a single seek entry to an EBML element
										while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) {

											switch ($sub_seek_entry['id']) {

												case EBML_ID_SEEKID:
													$seek_entry['target_id']   = self::EBML2Int($sub_seek_entry['data']);
													$seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']);
													break;

												case EBML_ID_SEEKPOSITION:
													$seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']);
													break;

												default:
													$this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry);												}
													break;
										}
										if (!isset($seek_entry['target_id'])) {
											$this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']);
											break;
										}
										if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !self::$hide_clusters) { // collect clusters only if required
											$info['matroska']['seek'][] = $seek_entry;
										}
										break;

									default:
										$this->unhandledElement('seekhead', __LINE__, $seek_entry);
										break;
								}
							}
							break;

						case EBML_ID_TRACKS: // A top-level block of information with many tracks described.
							$info['matroska']['tracks'] = $element_data;

							while ($this->getEBMLelement($track_entry, $element_data['end'])) {
								switch ($track_entry['id']) {

									case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements.

										while ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) {
											switch ($subelement['id']) {

												case EBML_ID_TRACKUID:
													$track_entry[$subelement['id_name']] = getid3_lib::PrintHexBytes($subelement['data'], true, false);
													break;
												case EBML_ID_TRACKNUMBER:
												case EBML_ID_TRACKTYPE:
												case EBML_ID_MINCACHE:
												case EBML_ID_MAXCACHE:
												case EBML_ID_MAXBLOCKADDITIONID:
												case EBML_ID_DEFAULTDURATION: // nanoseconds per frame
													$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
													break;

												case EBML_ID_TRACKTIMECODESCALE:
													$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
													break;

												case EBML_ID_CODECID:
												case EBML_ID_LANGUAGE:
												case EBML_ID_NAME:
												case EBML_ID_CODECNAME:
													$track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
													break;

												case EBML_ID_CODECPRIVATE:
													$track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true);
													break;

												case EBML_ID_FLAGENABLED:
												case EBML_ID_FLAGDEFAULT:
												case EBML_ID_FLAGFORCED:
												case EBML_ID_FLAGLACING:
												case EBML_ID_CODECDECODEALL:
													$track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']);
													break;

												case EBML_ID_VIDEO:

													while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
														switch ($sub_subelement['id']) {

															case EBML_ID_PIXELWIDTH:
															case EBML_ID_PIXELHEIGHT:
															case EBML_ID_PIXELCROPBOTTOM:
															case EBML_ID_PIXELCROPTOP:
															case EBML_ID_PIXELCROPLEFT:
															case EBML_ID_PIXELCROPRIGHT:
															case EBML_ID_DISPLAYWIDTH:
															case EBML_ID_DISPLAYHEIGHT:
															case EBML_ID_DISPLAYUNIT:
															case EBML_ID_ASPECTRATIOTYPE:
															case EBML_ID_STEREOMODE:
															case EBML_ID_OLDSTEREOMODE:
																$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
																break;

															case EBML_ID_FLAGINTERLACED:
																$track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
																break;

															case EBML_ID_GAMMAVALUE:
																$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
																break;

															case EBML_ID_COLOURSPACE:
																$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
																break;

															default:
																$this->unhandledElement('track.video', __LINE__, $sub_subelement);
																break;
														}
													}
													break;

												case EBML_ID_AUDIO:

													while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
														switch ($sub_subelement['id']) {

															case EBML_ID_CHANNELS:
															case EBML_ID_BITDEPTH:
																$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
																break;

															case EBML_ID_SAMPLINGFREQUENCY:
															case EBML_ID_OUTPUTSAMPLINGFREQUENCY:
																$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
																break;

															case EBML_ID_CHANNELPOSITIONS:
																$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
																break;

															default:
																$this->unhandledElement('track.audio', __LINE__, $sub_subelement);
																break;
														}
													}
													break;

												case EBML_ID_CONTENTENCODINGS:

													while ($this->getEBMLelement($sub_subelement, $subelement['end'])) {
														switch ($sub_subelement['id']) {

															case EBML_ID_CONTENTENCODING:

																while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) {
																	switch ($sub_sub_subelement['id']) {

																		case EBML_ID_CONTENTENCODINGORDER:
																		case EBML_ID_CONTENTENCODINGSCOPE:
																		case EBML_ID_CONTENTENCODINGTYPE:
																			$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																			break;

																		case EBML_ID_CONTENTCOMPRESSION:

																			while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																				switch ($sub_sub_sub_subelement['id']) {

																					case EBML_ID_CONTENTCOMPALGO:
																						$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']);
																						break;

																					case EBML_ID_CONTENTCOMPSETTINGS:
																						$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
																						break;

																					default:
																						$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
																						break;
																				}
																			}
																			break;

																		case EBML_ID_CONTENTENCRYPTION:

																			while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																				switch ($sub_sub_sub_subelement['id']) {

																					case EBML_ID_CONTENTENCALGO:
																					case EBML_ID_CONTENTSIGALGO:
																					case EBML_ID_CONTENTSIGHASHALGO:
																						$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']);
																						break;

																					case EBML_ID_CONTENTENCKEYID:
																					case EBML_ID_CONTENTSIGNATURE:
																					case EBML_ID_CONTENTSIGKEYID:
																						$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
																						break;

																					default:
																						$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
																						break;
																				}
																			}
																			break;

																		default:
																			$this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);
																			break;
																	}
																}
																break;

															default:
																$this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement);
																break;
														}
													}
													break;

												default:
													$this->unhandledElement('track', __LINE__, $subelement);
													break;
											}
										}

										$info['matroska']['tracks']['tracks'][] = $track_entry;
										break;

									default:
										$this->unhandledElement('tracks', __LINE__, $track_entry);
										break;
								}
							}
							break;

						case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file.
							$info_entry = array();

							while ($this->getEBMLelement($subelement, $element_data['end'], true)) {
								switch ($subelement['id']) {

									case EBML_ID_TIMECODESCALE:
										$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
										break;

									case EBML_ID_DURATION:
										$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
										break;

									case EBML_ID_DATEUTC:
										$info_entry[$subelement['id_name']]         = getid3_lib::BigEndian2Int($subelement['data']);
										$info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]);
										break;

									case EBML_ID_SEGMENTUID:
									case EBML_ID_PREVUID:
									case EBML_ID_NEXTUID:
										$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
										break;

									case EBML_ID_SEGMENTFAMILY:
										$info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']);
										break;

									case EBML_ID_SEGMENTFILENAME:
									case EBML_ID_PREVFILENAME:
									case EBML_ID_NEXTFILENAME:
									case EBML_ID_TITLE:
									case EBML_ID_MUXINGAPP:
									case EBML_ID_WRITINGAPP:
										$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
										$info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']];
										break;

									case EBML_ID_CHAPTERTRANSLATE:
										$chaptertranslate_entry = array();

										while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
											switch ($sub_subelement['id']) {

												case EBML_ID_CHAPTERTRANSLATEEDITIONUID:
													$chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												case EBML_ID_CHAPTERTRANSLATECODEC:
													$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												case EBML_ID_CHAPTERTRANSLATEID:
													$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
													break;

												default:
													$this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement);
													break;
											}
										}
										$info_entry[$subelement['id_name']] = $chaptertranslate_entry;
										break;

									default:
										$this->unhandledElement('info', __LINE__, $subelement);
										break;
								}
							}
							$info['matroska']['info'][] = $info_entry;
							break;

						case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams.
							if (self::$hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway
								$this->current_offset = $element_data['end'];
								break;
							}
							$cues_entry = array();

							while ($this->getEBMLelement($subelement, $element_data['end'])) {
								switch ($subelement['id']) {

									case EBML_ID_CUEPOINT:
										$cuepoint_entry = array();

										while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) {
											switch ($sub_subelement['id']) {

												case EBML_ID_CUETRACKPOSITIONS:
													$cuetrackpositions_entry = array();

													while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
														switch ($sub_sub_subelement['id']) {

															case EBML_ID_CUETRACK:
															case EBML_ID_CUECLUSTERPOSITION:
															case EBML_ID_CUEBLOCKNUMBER:
															case EBML_ID_CUECODECSTATE:
																$cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																break;

															default:
																$this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);
																break;
														}
													}
													$cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry;
													break;

												case EBML_ID_CUETIME:
													$cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												default:
													$this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement);
													break;
											}
										}
										$cues_entry[] = $cuepoint_entry;
										break;

									default:
										$this->unhandledElement('cues', __LINE__, $subelement);
										break;
								}
							}
							$info['matroska']['cues'] = $cues_entry;
							break;

						case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters.
							$tags_entry = array();

							while ($this->getEBMLelement($subelement, $element_data['end'], false)) {
								switch ($subelement['id']) {

									case EBML_ID_TAG:
										$tag_entry = array();

										while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) {
											switch ($sub_subelement['id']) {

												case EBML_ID_TARGETS:
													$targets_entry = array();

													while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
														switch ($sub_sub_subelement['id']) {

															case EBML_ID_TARGETTYPEVALUE:
																$targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																$targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]);
																break;

															case EBML_ID_TARGETTYPE:
																$targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
																break;

															case EBML_ID_TAGTRACKUID:
															case EBML_ID_TAGEDITIONUID:
															case EBML_ID_TAGCHAPTERUID:
															case EBML_ID_TAGATTACHMENTUID:
																$targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::PrintHexBytes($sub_sub_subelement['data'], true, false);
																break;

															default:
																$this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement);
																break;
														}
													}
													$tag_entry[$sub_subelement['id_name']] = $targets_entry;
													break;

												case EBML_ID_SIMPLETAG:
													$tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']);
													break;

												default:
													$this->unhandledElement('tags.tag', __LINE__, $sub_subelement);
													break;
											}
										}
										$tags_entry[] = $tag_entry;
										break;

									default:
										$this->unhandledElement('tags', __LINE__, $subelement);
										break;
								}
							}
							$info['matroska']['tags'] = $tags_entry;
							break;

						case EBML_ID_ATTACHMENTS: // Contain attached files.

							while ($this->getEBMLelement($subelement, $element_data['end'])) {
								switch ($subelement['id']) {

									case EBML_ID_ATTACHEDFILE:
										$attachedfile_entry = array();

										while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) {
											switch ($sub_subelement['id']) {

												case EBML_ID_FILEDESCRIPTION:
												case EBML_ID_FILENAME:
												case EBML_ID_FILEMIMETYPE:
													$attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data'];
													break;

												case EBML_ID_FILEDATA:
													$attachedfile_entry['data_offset'] = $this->current_offset;
													$attachedfile_entry['data_length'] = $sub_subelement['length'];

													$attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment(
														$attachedfile_entry['FileName'],
														$attachedfile_entry['data_offset'],
														$attachedfile_entry['data_length']);

													$this->current_offset = $sub_subelement['end'];
													break;

												case EBML_ID_FILEUID:
													$attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												default:
													$this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement);
													break;
											}
										}
										$info['matroska']['attachments'][] = $attachedfile_entry;
										break;

									default:
										$this->unhandledElement('attachments', __LINE__, $subelement);
										break;
								}
							}
							break;

						case EBML_ID_CHAPTERS:

							while ($this->getEBMLelement($subelement, $element_data['end'])) {
								switch ($subelement['id']) {

									case EBML_ID_EDITIONENTRY:
										$editionentry_entry = array();

										while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) {
											switch ($sub_subelement['id']) {

												case EBML_ID_EDITIONUID:
													$editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												case EBML_ID_EDITIONFLAGHIDDEN:
												case EBML_ID_EDITIONFLAGDEFAULT:
												case EBML_ID_EDITIONFLAGORDERED:
													$editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												case EBML_ID_CHAPTERATOM:
													$chapteratom_entry = array();

													while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) {
														switch ($sub_sub_subelement['id']) {

															case EBML_ID_CHAPTERSEGMENTUID:
															case EBML_ID_CHAPTERSEGMENTEDITIONUID:
																$chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
																break;

															case EBML_ID_CHAPTERFLAGENABLED:
															case EBML_ID_CHAPTERFLAGHIDDEN:
																$chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																break;

															case EBML_ID_CHAPTERUID:
															case EBML_ID_CHAPTERTIMESTART:
															case EBML_ID_CHAPTERTIMEEND:
																$chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																break;

															case EBML_ID_CHAPTERTRACK:
																$chaptertrack_entry = array();

																while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																	switch ($sub_sub_sub_subelement['id']) {

																		case EBML_ID_CHAPTERTRACKNUMBER:
																			$chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);
																			break;

																		default:
																			$this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);
																			break;
																	}
																}
																$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry;
																break;

															case EBML_ID_CHAPTERDISPLAY:
																$chapterdisplay_entry = array();

																while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																	switch ($sub_sub_sub_subelement['id']) {

																		case EBML_ID_CHAPSTRING:
																		case EBML_ID_CHAPLANGUAGE:
																		case EBML_ID_CHAPCOUNTRY:
																			$chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
																			break;

																		default:
																			$this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);
																			break;
																	}
																}
																$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry;
																break;

															default:
																$this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);
																break;
														}
													}
													$editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry;
													break;

												default:
													$this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement);
													break;
											}
										}
										$info['matroska']['chapters'][] = $editionentry_entry;
										break;

									default:
										$this->unhandledElement('chapters', __LINE__, $subelement);
										break;
								}
							}
							break;

						case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure.
							$cluster_entry = array();

							while ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) {
								switch ($subelement['id']) {

									case EBML_ID_CLUSTERTIMECODE:
									case EBML_ID_CLUSTERPOSITION:
									case EBML_ID_CLUSTERPREVSIZE:
										$cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
										break;

									case EBML_ID_CLUSTERSILENTTRACKS:
										$cluster_silent_tracks = array();

										while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
											switch ($sub_subelement['id']) {

												case EBML_ID_CLUSTERSILENTTRACKNUMBER:
													$cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												default:
													$this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement);
													break;
											}
										}
										$cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks;
										break;

									case EBML_ID_CLUSTERBLOCKGROUP:
										$cluster_block_group = array('offset' => $this->current_offset);

										while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) {
											switch ($sub_subelement['id']) {

												case EBML_ID_CLUSTERBLOCK:
													$cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info);
													break;

												case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int
												case EBML_ID_CLUSTERBLOCKDURATION:     // unsigned-int
													$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
													break;

												case EBML_ID_CLUSTERREFERENCEBLOCK:    // signed-int
													$cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true);
													break;

												case EBML_ID_CLUSTERCODECSTATE:
													$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
													break;

												default:
													$this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement);
													break;
											}
										}
										$cluster_entry[$subelement['id_name']][] = $cluster_block_group;
										break;

									case EBML_ID_CLUSTERSIMPLEBLOCK:
										$cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info);
										break;

									default:
										$this->unhandledElement('cluster', __LINE__, $subelement);
										break;
								}
								$this->current_offset = $subelement['end'];
							}
							if (!self::$hide_clusters) {
								$info['matroska']['cluster'][] = $cluster_entry;
							}

							// check to see if all the data we need exists already, if so, break out of the loop
							if (!self::$parse_whole_file) {
								if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
									if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
										if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {
											return;
										}
									}
								}
							}
							break;

						default:
							$this->unhandledElement('segment', __LINE__, $element_data);
							break;
					}
				}
				break;

			default:
				$this->unhandledElement('root', __LINE__, $top_element);
				break;
		}
	}
}