ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
GetId3\Module\AudioVideo\Matroska Class Reference

GetId3() by James Heinrich info@.nosp@m.geti.nosp@m.d3.or.nosp@m.g //. More...

+ Inheritance diagram for GetId3\Module\AudioVideo\Matroska:
+ Collaboration diagram for GetId3\Module\AudioVideo\Matroska:

Public Member Functions

 analyze ()
 
- Public Member Functions inherited from GetId3\Handler\BaseHandler
 __construct (GetId3Core $getid3, $call_module=null)
 
 analyze ()
 Analyze from file pointer. More...
 
 AnalyzeString (&$string)
 Analyze from string instead. More...
 
 saveAttachment (&$ThisFileInfoIndex, $filename, $offset, $length)
 

Static Public Member Functions

static MatroskaTargetTypeValue ($target_type)
 array $MatroskaTargetTypeValue More...
 
static MatroskaBlockLacingType ($lacingtype)
 array $MatroskaBlockLacingType More...
 
static MatroskaCodecIDtoCommonName ($codecid)
 array $MatroskaCodecIDlist More...
 

Data Fields

const EBML_ID_CHAPTERS = 0x0043A770
 
const EBML_ID_SEEKHEAD = 0x014D9B74
 
const EBML_ID_TAGS = 0x0254C367
 
const EBML_ID_INFO = 0x0549A966
 
const EBML_ID_TRACKS = 0x0654AE6B
 
const EBML_ID_SEGMENT = 0x08538067
 
const EBML_ID_ATTACHMENTS = 0x0941A469
 
const EBML_ID_EBML = 0x0A45DFA3
 
const EBML_ID_CUES = 0x0C53BB6B
 
const EBML_ID_CLUSTER = 0x0F43B675
 
const EBML_ID_LANGUAGE = 0x02B59C
 
const EBML_ID_TRACKTIMECODESCALE = 0x03314F
 
const EBML_ID_DEFAULTDURATION = 0x03E383
 
const EBML_ID_CODECNAME = 0x058688
 
const EBML_ID_CODECDOWNLOADURL = 0x06B240
 
const EBML_ID_TIMECODESCALE = 0x0AD7B1
 
const EBML_ID_COLOURSPACE = 0x0EB524
 
const EBML_ID_GAMMAVALUE = 0x0FB523
 
const EBML_ID_CODECSETTINGS = 0x1A9697
 
const EBML_ID_CODECINFOURL = 0x1B4040
 
const EBML_ID_PREVFILENAME = 0x1C83AB
 
const EBML_ID_PREVUID = 0x1CB923
 
const EBML_ID_NEXTFILENAME = 0x1E83BB
 
const EBML_ID_NEXTUID = 0x1EB923
 
const EBML_ID_CONTENTCOMPALGO = 0x0254
 
const EBML_ID_CONTENTCOMPSETTINGS = 0x0255
 
const EBML_ID_DOCTYPE = 0x0282
 
const EBML_ID_DOCTYPEREADVERSION = 0x0285
 
const EBML_ID_EBMLVERSION = 0x0286
 
const EBML_ID_DOCTYPEVERSION = 0x0287
 
const EBML_ID_EBMLMAXIDLENGTH = 0x02F2
 
const EBML_ID_EBMLMAXSIZELENGTH = 0x02F3
 
const EBML_ID_EBMLREADVERSION = 0x02F7
 
const EBML_ID_CHAPLANGUAGE = 0x037C
 
const EBML_ID_CHAPCOUNTRY = 0x037E
 
const EBML_ID_SEGMENTFAMILY = 0x0444
 
const EBML_ID_DATEUTC = 0x0461
 
const EBML_ID_TAGLANGUAGE = 0x047A
 
const EBML_ID_TAGDEFAULT = 0x0484
 
const EBML_ID_TAGBINARY = 0x0485
 
const EBML_ID_TAGSTRING = 0x0487
 
const EBML_ID_DURATION = 0x0489
 
const EBML_ID_CHAPPROCESSPRIVATE = 0x050D
 
const EBML_ID_CHAPTERFLAGENABLED = 0x0598
 
const EBML_ID_TAGNAME = 0x05A3
 
const EBML_ID_EDITIONENTRY = 0x05B9
 
const EBML_ID_EDITIONUID = 0x05BC
 
const EBML_ID_EDITIONFLAGHIDDEN = 0x05BD
 
const EBML_ID_EDITIONFLAGDEFAULT = 0x05DB
 
const EBML_ID_EDITIONFLAGORDERED = 0x05DD
 
const EBML_ID_FILEDATA = 0x065C
 
const EBML_ID_FILEMIMETYPE = 0x0660
 
const EBML_ID_FILENAME = 0x066E
 
const EBML_ID_FILEREFERRAL = 0x0675
 
const EBML_ID_FILEDESCRIPTION = 0x067E
 
const EBML_ID_FILEUID = 0x06AE
 
const EBML_ID_CONTENTENCALGO = 0x07E1
 
const EBML_ID_CONTENTENCKEYID = 0x07E2
 
const EBML_ID_CONTENTSIGNATURE = 0x07E3
 
const EBML_ID_CONTENTSIGKEYID = 0x07E4
 
const EBML_ID_CONTENTSIGALGO = 0x07E5
 
const EBML_ID_CONTENTSIGHASHALGO = 0x07E6
 
const EBML_ID_MUXINGAPP = 0x0D80
 
const EBML_ID_SEEK = 0x0DBB
 
const EBML_ID_CONTENTENCODINGORDER = 0x1031
 
const EBML_ID_CONTENTENCODINGSCOPE = 0x1032
 
const EBML_ID_CONTENTENCODINGTYPE = 0x1033
 
const EBML_ID_CONTENTCOMPRESSION = 0x1034
 
const EBML_ID_CONTENTENCRYPTION = 0x1035
 
const EBML_ID_CUEREFNUMBER = 0x135F
 
const EBML_ID_NAME = 0x136E
 
const EBML_ID_CUEBLOCKNUMBER = 0x1378
 
const EBML_ID_TRACKOFFSET = 0x137F
 
const EBML_ID_SEEKID = 0x13AB
 
const EBML_ID_SEEKPOSITION = 0x13AC
 
const EBML_ID_STEREOMODE = 0x13B8
 
const EBML_ID_PIXELCROPBOTTOM = 0x14AA
 
const EBML_ID_DISPLAYWIDTH = 0x14B0
 
const EBML_ID_DISPLAYUNIT = 0x14B2
 
const EBML_ID_ASPECTRATIOTYPE = 0x14B3
 
const EBML_ID_DISPLAYHEIGHT = 0x14BA
 
const EBML_ID_PIXELCROPTOP = 0x14BB
 
const EBML_ID_PIXELCROPLEFT = 0x14CC
 
const EBML_ID_PIXELCROPRIGHT = 0x14DD
 
const EBML_ID_FLAGFORCED = 0x15AA
 
const EBML_ID_MAXBLOCKADDITIONID = 0x15EE
 
const EBML_ID_WRITINGAPP = 0x1741
 
const EBML_ID_CLUSTERSILENTTRACKS = 0x1854
 
const EBML_ID_CLUSTERSILENTTRACKNUMBER = 0x18D7
 
const EBML_ID_ATTACHEDFILE = 0x21A7
 
const EBML_ID_CONTENTENCODING = 0x2240
 
const EBML_ID_BITDEPTH = 0x2264
 
const EBML_ID_CODECPRIVATE = 0x23A2
 
const EBML_ID_TARGETS = 0x23C0
 
const EBML_ID_CHAPTERPHYSICALEQUIV = 0x23C3
 
const EBML_ID_TAGCHAPTERUID = 0x23C4
 
const EBML_ID_TAGTRACKUID = 0x23C5
 
const EBML_ID_TAGATTACHMENTUID = 0x23C6
 
const EBML_ID_TAGEDITIONUID = 0x23C9
 
const EBML_ID_TARGETTYPE = 0x23CA
 
const EBML_ID_TRACKTRANSLATE = 0x2624
 
const EBML_ID_TRACKTRANSLATETRACKID = 0x26A5
 
const EBML_ID_TRACKTRANSLATECODEC = 0x26BF
 
const EBML_ID_TRACKTRANSLATEEDITIONUID = 0x26FC
 
const EBML_ID_SIMPLETAG = 0x27C8
 
const EBML_ID_TARGETTYPEVALUE = 0x28CA
 
const EBML_ID_CHAPPROCESSCOMMAND = 0x2911
 
const EBML_ID_CHAPPROCESSTIME = 0x2922
 
const EBML_ID_CHAPTERTRANSLATE = 0x2924
 
const EBML_ID_CHAPPROCESSDATA = 0x2933
 
const EBML_ID_CHAPPROCESS = 0x2944
 
const EBML_ID_CHAPPROCESSCODECID = 0x2955
 
const EBML_ID_CHAPTERTRANSLATEID = 0x29A5
 
const EBML_ID_CHAPTERTRANSLATECODEC = 0x29BF
 
const EBML_ID_CHAPTERTRANSLATEEDITIONUID = 0x29FC
 
const EBML_ID_CONTENTENCODINGS = 0x2D80
 
const EBML_ID_MINCACHE = 0x2DE7
 
const EBML_ID_MAXCACHE = 0x2DF8
 
const EBML_ID_CHAPTERSEGMENTUID = 0x2E67
 
const EBML_ID_CHAPTERSEGMENTEDITIONUID = 0x2EBC
 
const EBML_ID_TRACKOVERLAY = 0x2FAB
 
const EBML_ID_TAG = 0x3373
 
const EBML_ID_SEGMENTFILENAME = 0x3384
 
const EBML_ID_SEGMENTUID = 0x33A4
 
const EBML_ID_CHAPTERUID = 0x33C4
 
const EBML_ID_TRACKUID = 0x33C5
 
const EBML_ID_ATTACHMENTLINK = 0x3446
 
const EBML_ID_CLUSTERBLOCKADDITIONS = 0x35A1
 
const EBML_ID_CHANNELPOSITIONS = 0x347B
 
const EBML_ID_OUTPUTSAMPLINGFREQUENCY = 0x38B5
 
const EBML_ID_TITLE = 0x3BA9
 
const EBML_ID_CHAPTERDISPLAY = 0x00
 
const EBML_ID_TRACKTYPE = 0x03
 
const EBML_ID_CHAPSTRING = 0x05
 
const EBML_ID_CODECID = 0x06
 
const EBML_ID_FLAGDEFAULT = 0x08
 
const EBML_ID_CHAPTERTRACKNUMBER = 0x09
 
const EBML_ID_CLUSTERSLICES = 0x0E
 
const EBML_ID_CHAPTERTRACK = 0x0F
 
const EBML_ID_CHAPTERTIMESTART = 0x11
 
const EBML_ID_CHAPTERTIMEEND = 0x12
 
const EBML_ID_CUEREFTIME = 0x16
 
const EBML_ID_CUEREFCLUSTER = 0x17
 
const EBML_ID_CHAPTERFLAGHIDDEN = 0x18
 
const EBML_ID_FLAGINTERLACED = 0x1A
 
const EBML_ID_CLUSTERBLOCKDURATION = 0x1B
 
const EBML_ID_FLAGLACING = 0x1C
 
const EBML_ID_CHANNELS = 0x1F
 
const EBML_ID_CLUSTERBLOCKGROUP = 0x20
 
const EBML_ID_CLUSTERBLOCK = 0x21
 
const EBML_ID_CLUSTERBLOCKVIRTUAL = 0x22
 
const EBML_ID_CLUSTERSIMPLEBLOCK = 0x23
 
const EBML_ID_CLUSTERCODECSTATE = 0x24
 
const EBML_ID_CLUSTERBLOCKADDITIONAL = 0x25
 
const EBML_ID_CLUSTERBLOCKMORE = 0x26
 
const EBML_ID_CLUSTERPOSITION = 0x27
 
const EBML_ID_CODECDECODEALL = 0x2A
 
const EBML_ID_CLUSTERPREVSIZE = 0x2B
 
const EBML_ID_TRACKENTRY = 0x2E
 
const EBML_ID_CLUSTERENCRYPTEDBLOCK = 0x2F
 
const EBML_ID_PIXELWIDTH = 0x30
 
const EBML_ID_CUETIME = 0x33
 
const EBML_ID_SAMPLINGFREQUENCY = 0x35
 
const EBML_ID_CHAPTERATOM = 0x36
 
const EBML_ID_CUETRACKPOSITIONS = 0x37
 
const EBML_ID_FLAGENABLED = 0x39
 
const EBML_ID_PIXELHEIGHT = 0x3A
 
const EBML_ID_CUEPOINT = 0x3B
 
const EBML_ID_CRC32 = 0x3F
 
const EBML_ID_CLUSTERBLOCKADDITIONID = 0x4B
 
const EBML_ID_CLUSTERLACENUMBER = 0x4C
 
const EBML_ID_CLUSTERFRAMENUMBER = 0x4D
 
const EBML_ID_CLUSTERDELAY = 0x4E
 
const EBML_ID_CLUSTERDURATION = 0x4F
 
const EBML_ID_TRACKNUMBER = 0x57
 
const EBML_ID_CUEREFERENCE = 0x5B
 
const EBML_ID_VIDEO = 0x60
 
const EBML_ID_AUDIO = 0x61
 
const EBML_ID_CLUSTERTIMESLICE = 0x68
 
const EBML_ID_CUECODECSTATE = 0x6A
 
const EBML_ID_CUEREFCODECSTATE = 0x6B
 
const EBML_ID_VOID = 0x6C
 
const EBML_ID_CLUSTERTIMECODE = 0x67
 
const EBML_ID_CLUSTERBLOCKADDID = 0x6E
 
const EBML_ID_CUECLUSTERPOSITION = 0x71
 
const EBML_ID_CUETRACK = 0x77
 
const EBML_ID_CLUSTERREFERENCEPRIORITY = 0x7A
 
const EBML_ID_CLUSTERREFERENCEBLOCK = 0x7B
 
const EBML_ID_CLUSTERREFERENCEVIRTUAL = 0x7D
 

Static Public Attributes

static $hide_clusters = true
 
static $parse_whole_file = false
 

Private Member Functions

 parseEBML (&$info)
 
 EnsureBufferHasEnoughData ($min_data=1024)
 
 readEBMLint ()
 
 readEBMLelementData ($length)
 
 getEBMLelement (&$element, $parent_end, $get_data=false)
 
 unhandledElement ($type, $line, $element)
 
 ExtractCommentsSimpleTag ($SimpleTagArray)
 
 HandleEMBLSimpleTag ($parent_end)
 
 HandleEMBLClusterBlock ($element, $block_type, &$info)
 

Static Private Member Functions

static EBML2Int ($EBMLstring)
 
static EBMLdate2unix ($EBMLdatestamp)
 
static EBMLidName ($value)
 array $EBMLidList More...
 
static getDefaultStreamInfo ($streams)
 

Private Attributes

 $EBMLbuffer = ''
 
 $EBMLbuffer_offset = 0
 
 $EBMLbuffer_length = 0
 
 $current_offset = 0
 
 $unuseful_elements = array(self::EBML_ID_CRC32, self::EBML_ID_VOID)
 

Additional Inherited Members

- Protected Member Functions inherited from GetId3\Handler\BaseHandler
 ftell ()
 
 fread ($bytes)
 
 fseek ($bytes, $whence=SEEK_SET)
 
 feof ()
 
 isDependencyFor ($module)
 
 error ($text)
 
 warning ($text)
 
- Protected Attributes inherited from GetId3\Handler\BaseHandler
 $getid3
 
 $data_string_flag = false
 
 $data_string = ''
 
 $data_string_position = 0
 
 $data_string_length = 0
 

Detailed Description

GetId3() by James Heinrich info@.nosp@m.geti.nosp@m.d3.or.nosp@m.g //.

module for analyzing Matroska containers

Author
James Heinrich info@.nosp@m.geti.nosp@m.d3.or.nosp@m.g http://www.getid3.org http://www.matroska.org/technical/specs/index.html

Definition at line 33 of file Matroska.php.

Member Function Documentation

◆ analyze()

GetId3\Module\AudioVideo\Matroska::analyze ( )
Returns
boolean

Definition at line 268 of file Matroska.php.

References $info, array, GetId3\Module\AudioVideo\Matroska\ExtractCommentsSimpleTag(), GetId3\Module\AudioVideo\Riff\ParseBITMAPINFOHEADER(), GetId3\Module\AudioVideo\Matroska\parseEBML(), GetId3\Module\AudioVideo\Riff\RIFFfourccLookup(), and GetId3\Module\AudioVideo\Riff\RIFFparseWAVEFORMATex().

269  {
270  $info = &$this->getid3->info;
271 
272  // parse container
273  try {
274  $this->parseEBML($info);
275  } catch (DefaultException $e) {
276  $info['error'][] = 'EBML parser: '.$e->getMessage();
277  }
278 
279  // calculate playtime
280  if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
281  foreach ($info['matroska']['info'] as $key => $infoarray) {
282  if (isset($infoarray['Duration'])) {
283  // TimecodeScale is how many nanoseconds each Duration unit is
284  $info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000);
285  break;
286  }
287  }
288  }
289 
290  // extract tags
291  if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) {
292  foreach ($info['matroska']['tags'] as $key => $infoarray) {
293  $this->ExtractCommentsSimpleTag($infoarray);
294  }
295  }
296 
297  // process tracks
298  if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
299  foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) {
300 
301  $track_info = array();
302  $track_info['dataformat'] = self::MatroskaCodecIDtoCommonName($trackarray['CodecID']);
303  $track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true);
304  if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; }
305 
306  switch ($trackarray['TrackType']) {
307 
308  case 1: // Video
309  $track_info['resolution_x'] = $trackarray['PixelWidth'];
310  $track_info['resolution_y'] = $trackarray['PixelHeight'];
311  if (isset($trackarray['DisplayWidth'])) { $track_info['display_x'] = $trackarray['DisplayWidth']; }
312  if (isset($trackarray['DisplayHeight'])) { $track_info['display_y'] = $trackarray['DisplayHeight']; }
313  if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate'] = round(1000000000 / $trackarray['DefaultDuration'], 3); }
314  if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; }
315 
316  switch ($trackarray['CodecID']) {
317  case 'V_MS/VFW/FOURCC':
318  if (!class_exists('GetId3\Module\AudioVideo\Riff')) {
319  $this->getid3->warning('Unable to parse codec private data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "' . str_replace('_', DIRECTORY_SEPARATOR, 'GetId3\Module\AudioVideo\Riff') . '.php"');
320  break;
321  }
322  $parsed = Riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']);
323  $track_info['codec'] = Riff::RIFFfourccLookup($parsed['fourcc']);
324  $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
325  break;
326 
327  /*case 'V_MPEG4/ISO/AVC':
328  $h264['profile'] = GetId3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1));
329  $h264['level'] = GetId3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1));
330  $rn = GetId3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1));
331  $h264['NALUlength'] = ($rn & 3) + 1;
332  $rn = GetId3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1));
333  $nsps = ($rn & 31);
334  $offset = 6;
335  for ($i = 0; $i < $nsps; $i ++) {
336  $length = GetId3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
337  $h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
338  $offset += 2 + $length;
339  }
340  $npps = GetId3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1));
341  $offset += 1;
342  for ($i = 0; $i < $npps; $i ++) {
343  $length = GetId3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
344  $h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
345  $offset += 2 + $length;
346  }
347  $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264;
348  break;*/
349  }
350 
351  $info['video']['streams'][] = $track_info;
352  break;
353 
354  case 2: // Audio
355  $track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0);
356  $track_info['channels'] = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1);
357  $track_info['language'] = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng');
358  if (isset($trackarray['BitDepth'])) { $track_info['bits_per_sample'] = $trackarray['BitDepth']; }
359  if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; }
360 
361  switch ($trackarray['CodecID']) {
362  case 'A_PCM/INT/LIT':
363  case 'A_PCM/INT/BIG':
364  $track_info['bitrate'] = $trackarray['SamplingFrequency'] * $trackarray['Channels'] * $trackarray['BitDepth'];
365  break;
366 
367  case 'A_AC3':
368  case 'A_DTS':
369  case 'A_MPEG/L3':
370  case 'A_MPEG/L2':
371  case 'A_FLAC':
372  $class = 'GetId3\\Module\\Audio\\' . ucfirst($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']);
373  if (!class_exists($class)) {
374  $this->getid3->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "module.audio.'.$track_info['dataformat'].'.php"');
375  break;
376  }
377 
378  if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) {
379  $this->getid3->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set');
380  break;
381  }
382 
383  // create temp instance
384  $getid3_temp = new GetId3Core();
385  if ($track_info['dataformat'] != 'flac') {
386  $getid3_temp->openfile($this->getid3->filename);
387  }
388  $getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'];
389  if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') {
390  $getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length'];
391  }
392 
393  // analyze
394  $header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat'];
395  $getid3_audio = new $class($getid3_temp, __CLASS__);
396  if ($track_info['dataformat'] == 'flac') {
397  $getid3_audio->AnalyzeString($trackarray['CodecPrivate']);
398  } else {
399  $getid3_audio->analyze();
400  }
401  if (!empty($getid3_temp->info[$header_data_key])) {
402  $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key];
403  if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
404  foreach ($getid3_temp->info['audio'] as $key => $value) {
405  $track_info[$key] = $value;
406  }
407  }
408  } else {
409  $this->getid3->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']);
410  }
411 
412  // copy errors and warnings
413  if (!empty($getid3_temp->info['error'])) {
414  foreach ($getid3_temp->info['error'] as $newerror) {
415  $this->getid3->warning($class.'() says: ['.$newerror.']');
416  }
417  }
418  if (!empty($getid3_temp->info['warning'])) {
419  foreach ($getid3_temp->info['warning'] as $newerror) {
420  if ($track_info['dataformat'] == 'mp3' && preg_match('/^Probable truncated file: expecting \d+ bytes of audio data, only found \d+ \(short by \d+ bytes\)$/', $newerror)) {
421  // LAME/Xing header is probably set, but audio data is chunked into Matroska file and near-impossible to verify if audio stream is complete, so ignore useless warning
422  continue;
423  }
424  $this->getid3->warning($class.'() says: ['.$newerror.']');
425  }
426  }
427  unset($getid3_temp, $getid3_audio);
428  break;
429 
430  case 'A_AAC':
431  case 'A_AAC/MPEG2/LC':
432  case 'A_AAC/MPEG4/LC':
433  case 'A_AAC/MPEG4/LC/SBR':
434  $this->getid3->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated');
435  break;
436 
437  case 'A_VORBIS':
438  if (!isset($trackarray['CodecPrivate'])) {
439  $this->getid3->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set');
440  break;
441  }
442  $vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1);
443  if ($vorbis_offset === false) {
444  $this->getid3->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword');
445  break;
446  }
447  $vorbis_offset -= 1;
448 
449  if (!class_exists('GetId3\\Module\\Audio\\Ogg')) {
450  $this->getid3->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "GetId3\\Module\\Audio\\Ogg.php"');
451  break;
452  }
453 
454  // create temp instance
455  $getid3_temp = new GetId3Core();
456 
457  // analyze
458  $getid3_ogg = new Ogg($getid3_temp);
459  $oggpageinfo['page_seqno'] = 0;
460  $getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo);
461  if (!empty($getid3_temp->info['ogg'])) {
462  $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg'];
463  if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
464  foreach ($getid3_temp->info['audio'] as $key => $value) {
465  $track_info[$key] = $value;
466  }
467  }
468  }
469 
470  // copy errors and warnings
471  if (!empty($getid3_temp->info['error'])) {
472  foreach ($getid3_temp->info['error'] as $newerror) {
473  $this->getid3->warning('getid3_ogg() says: ['.$newerror.']');
474  }
475  }
476  if (!empty($getid3_temp->info['warning'])) {
477  foreach ($getid3_temp->info['warning'] as $newerror) {
478  $this->getid3->warning('getid3_ogg() says: ['.$newerror.']');
479  }
480  }
481 
482  if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) {
483  $track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal'];
484  }
485  unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset);
486  break;
487 
488  case 'A_MS/ACM':
489  if (!class_exists('GetId3\Module\AudioVideo\Riff')) {
490  $this->getid3->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "' . str_replace('_', DIRECTORY_SEPARATOR, 'GetId3\Module\AudioVideo\Riff') . '.php"');
491  break;
492  }
493 
494  $parsed = Riff::RIFFparseWAVEFORMATex($trackarray['CodecPrivate']);
495  foreach ($parsed as $key => $value) {
496  if ($key != 'raw') {
497  $track_info[$key] = $value;
498  }
499  }
500  $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
501  break;
502 
503  default:
504  $this->getid3->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"');
505  }
506 
507  $info['audio']['streams'][] = $track_info;
508  break;
509  }
510  }
511 
512  if (!empty($info['video']['streams'])) {
513  $info['video'] = self::getDefaultStreamInfo($info['video']['streams']);
514  }
515  if (!empty($info['audio']['streams'])) {
516  $info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']);
517  }
518  }
519 
520  // determine mime type
521  if (!empty($info['video']['streams'])) {
522  $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska');
523  } elseif (!empty($info['audio']['streams'])) {
524  $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska');
525  } elseif (isset($info['mime_type'])) {
526  unset($info['mime_type']);
527  }
528 
529  return true;
530  }
ExtractCommentsSimpleTag($SimpleTagArray)
Definition: Matroska.php:1406
static RIFFparseWAVEFORMATex($WaveFormatExData)
Definition: Riff.php:1707
static RIFFfourccLookup($fourcc)
Definition: Riff.php:2101
$info
Definition: example_052.php:80
static ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true)
Definition: Riff.php:1805
Create styles array
The data for the language used.
+ Here is the call graph for this function:

◆ EBML2Int()

static GetId3\Module\AudioVideo\Matroska::EBML2Int (   $EBMLstring)
staticprivate
Parameters
type$EBMLstring
Returns
type http://matroska.org/specs/

Definition at line 1529 of file Matroska.php.

References GetId3\Lib\Helper\BigEndian2Int().

1530  {
1531  // Element ID coded with an UTF-8 like system:
1532  // 1xxx xxxx - Class A IDs (2^7 -2 possible values) (base 0x8X)
1533  // 01xx xxxx xxxx xxxx - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX)
1534  // 001x xxxx xxxx xxxx xxxx xxxx - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX)
1535  // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX)
1536  // Values with all x at 0 and 1 are reserved (hence the -2).
1537 
1538  // Data size, in octets, is also coded with an UTF-8 like system :
1539  // 1xxx xxxx - value 0 to 2^7-2
1540  // 01xx xxxx xxxx xxxx - value 0 to 2^14-2
1541  // 001x xxxx xxxx xxxx xxxx xxxx - value 0 to 2^21-2
1542  // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^28-2
1543  // 0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^35-2
1544  // 0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^42-2
1545  // 0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^49-2
1546  // 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^56-2
1547 
1548  $first_byte_int = ord($EBMLstring[0]);
1549  if (0x80 & $first_byte_int) {
1550  $EBMLstring[0] = chr($first_byte_int & 0x7F);
1551  } elseif (0x40 & $first_byte_int) {
1552  $EBMLstring[0] = chr($first_byte_int & 0x3F);
1553  } elseif (0x20 & $first_byte_int) {
1554  $EBMLstring[0] = chr($first_byte_int & 0x1F);
1555  } elseif (0x10 & $first_byte_int) {
1556  $EBMLstring[0] = chr($first_byte_int & 0x0F);
1557  } elseif (0x08 & $first_byte_int) {
1558  $EBMLstring[0] = chr($first_byte_int & 0x07);
1559  } elseif (0x04 & $first_byte_int) {
1560  $EBMLstring[0] = chr($first_byte_int & 0x03);
1561  } elseif (0x02 & $first_byte_int) {
1562  $EBMLstring[0] = chr($first_byte_int & 0x01);
1563  } elseif (0x01 & $first_byte_int) {
1564  $EBMLstring[0] = chr($first_byte_int & 0x00);
1565  }
1566 
1567  return Helper::BigEndian2Int($EBMLstring);
1568  }
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
Definition: Helper.php:374
+ Here is the call graph for this function:

◆ EBMLdate2unix()

static GetId3\Module\AudioVideo\Matroska::EBMLdate2unix (   $EBMLdatestamp)
staticprivate
Parameters
type$EBMLdatestamp
Returns
type

Definition at line 1575 of file Matroska.php.

1576  {
1577  // Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC)
1578  // 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC
1579  return round(($EBMLdatestamp / 1000000000) + 978307200);
1580  }

◆ EBMLidName()

static GetId3\Module\AudioVideo\Matroska::EBMLidName (   $value)
staticprivate

array $EBMLidList

Parameters
type$value
Returns
type

Definition at line 1674 of file Matroska.php.

References array.

1675  {
1676  static $EBMLidList = array();
1677  if (empty($EBMLidList)) {
1678  $EBMLidList[self::EBML_ID_ASPECTRATIOTYPE] = 'AspectRatioType';
1679  $EBMLidList[self::EBML_ID_ATTACHEDFILE] = 'AttachedFile';
1680  $EBMLidList[self::EBML_ID_ATTACHMENTLINK] = 'AttachmentLink';
1681  $EBMLidList[self::EBML_ID_ATTACHMENTS] = 'Attachments';
1682  $EBMLidList[self::EBML_ID_AUDIO] = 'Audio';
1683  $EBMLidList[self::EBML_ID_BITDEPTH] = 'BitDepth';
1684  $EBMLidList[self::EBML_ID_CHANNELPOSITIONS] = 'ChannelPositions';
1685  $EBMLidList[self::EBML_ID_CHANNELS] = 'Channels';
1686  $EBMLidList[self::EBML_ID_CHAPCOUNTRY] = 'ChapCountry';
1687  $EBMLidList[self::EBML_ID_CHAPLANGUAGE] = 'ChapLanguage';
1688  $EBMLidList[self::EBML_ID_CHAPPROCESS] = 'ChapProcess';
1689  $EBMLidList[self::EBML_ID_CHAPPROCESSCODECID] = 'ChapProcessCodecID';
1690  $EBMLidList[self::EBML_ID_CHAPPROCESSCOMMAND] = 'ChapProcessCommand';
1691  $EBMLidList[self::EBML_ID_CHAPPROCESSDATA] = 'ChapProcessData';
1692  $EBMLidList[self::EBML_ID_CHAPPROCESSPRIVATE] = 'ChapProcessPrivate';
1693  $EBMLidList[self::EBML_ID_CHAPPROCESSTIME] = 'ChapProcessTime';
1694  $EBMLidList[self::EBML_ID_CHAPSTRING] = 'ChapString';
1695  $EBMLidList[self::EBML_ID_CHAPTERATOM] = 'ChapterAtom';
1696  $EBMLidList[self::EBML_ID_CHAPTERDISPLAY] = 'ChapterDisplay';
1697  $EBMLidList[self::EBML_ID_CHAPTERFLAGENABLED] = 'ChapterFlagEnabled';
1698  $EBMLidList[self::EBML_ID_CHAPTERFLAGHIDDEN] = 'ChapterFlagHidden';
1699  $EBMLidList[self::EBML_ID_CHAPTERPHYSICALEQUIV] = 'ChapterPhysicalEquiv';
1700  $EBMLidList[self::EBML_ID_CHAPTERS] = 'Chapters';
1701  $EBMLidList[self::EBML_ID_CHAPTERSEGMENTEDITIONUID] = 'ChapterSegmentEditionUID';
1702  $EBMLidList[self::EBML_ID_CHAPTERSEGMENTUID] = 'ChapterSegmentUID';
1703  $EBMLidList[self::EBML_ID_CHAPTERTIMEEND] = 'ChapterTimeEnd';
1704  $EBMLidList[self::EBML_ID_CHAPTERTIMESTART] = 'ChapterTimeStart';
1705  $EBMLidList[self::EBML_ID_CHAPTERTRACK] = 'ChapterTrack';
1706  $EBMLidList[self::EBML_ID_CHAPTERTRACKNUMBER] = 'ChapterTrackNumber';
1707  $EBMLidList[self::EBML_ID_CHAPTERTRANSLATE] = 'ChapterTranslate';
1708  $EBMLidList[self::EBML_ID_CHAPTERTRANSLATECODEC] = 'ChapterTranslateCodec';
1709  $EBMLidList[self::EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID';
1710  $EBMLidList[self::EBML_ID_CHAPTERTRANSLATEID] = 'ChapterTranslateID';
1711  $EBMLidList[self::EBML_ID_CHAPTERUID] = 'ChapterUID';
1712  $EBMLidList[self::EBML_ID_CLUSTER] = 'Cluster';
1713  $EBMLidList[self::EBML_ID_CLUSTERBLOCK] = 'ClusterBlock';
1714  $EBMLidList[self::EBML_ID_CLUSTERBLOCKADDID] = 'ClusterBlockAddID';
1715  $EBMLidList[self::EBML_ID_CLUSTERBLOCKADDITIONAL] = 'ClusterBlockAdditional';
1716  $EBMLidList[self::EBML_ID_CLUSTERBLOCKADDITIONID] = 'ClusterBlockAdditionID';
1717  $EBMLidList[self::EBML_ID_CLUSTERBLOCKADDITIONS] = 'ClusterBlockAdditions';
1718  $EBMLidList[self::EBML_ID_CLUSTERBLOCKDURATION] = 'ClusterBlockDuration';
1719  $EBMLidList[self::EBML_ID_CLUSTERBLOCKGROUP] = 'ClusterBlockGroup';
1720  $EBMLidList[self::EBML_ID_CLUSTERBLOCKMORE] = 'ClusterBlockMore';
1721  $EBMLidList[self::EBML_ID_CLUSTERBLOCKVIRTUAL] = 'ClusterBlockVirtual';
1722  $EBMLidList[self::EBML_ID_CLUSTERCODECSTATE] = 'ClusterCodecState';
1723  $EBMLidList[self::EBML_ID_CLUSTERDELAY] = 'ClusterDelay';
1724  $EBMLidList[self::EBML_ID_CLUSTERDURATION] = 'ClusterDuration';
1725  $EBMLidList[self::EBML_ID_CLUSTERENCRYPTEDBLOCK] = 'ClusterEncryptedBlock';
1726  $EBMLidList[self::EBML_ID_CLUSTERFRAMENUMBER] = 'ClusterFrameNumber';
1727  $EBMLidList[self::EBML_ID_CLUSTERLACENUMBER] = 'ClusterLaceNumber';
1728  $EBMLidList[self::EBML_ID_CLUSTERPOSITION] = 'ClusterPosition';
1729  $EBMLidList[self::EBML_ID_CLUSTERPREVSIZE] = 'ClusterPrevSize';
1730  $EBMLidList[self::EBML_ID_CLUSTERREFERENCEBLOCK] = 'ClusterReferenceBlock';
1731  $EBMLidList[self::EBML_ID_CLUSTERREFERENCEPRIORITY] = 'ClusterReferencePriority';
1732  $EBMLidList[self::EBML_ID_CLUSTERREFERENCEVIRTUAL] = 'ClusterReferenceVirtual';
1733  $EBMLidList[self::EBML_ID_CLUSTERSILENTTRACKNUMBER] = 'ClusterSilentTrackNumber';
1734  $EBMLidList[self::EBML_ID_CLUSTERSILENTTRACKS] = 'ClusterSilentTracks';
1735  $EBMLidList[self::EBML_ID_CLUSTERSIMPLEBLOCK] = 'ClusterSimpleBlock';
1736  $EBMLidList[self::EBML_ID_CLUSTERTIMECODE] = 'ClusterTimecode';
1737  $EBMLidList[self::EBML_ID_CLUSTERTIMESLICE] = 'ClusterTimeSlice';
1738  $EBMLidList[self::EBML_ID_CODECDECODEALL] = 'CodecDecodeAll';
1739  $EBMLidList[self::EBML_ID_CODECDOWNLOADURL] = 'CodecDownloadURL';
1740  $EBMLidList[self::EBML_ID_CODECID] = 'CodecID';
1741  $EBMLidList[self::EBML_ID_CODECINFOURL] = 'CodecInfoURL';
1742  $EBMLidList[self::EBML_ID_CODECNAME] = 'CodecName';
1743  $EBMLidList[self::EBML_ID_CODECPRIVATE] = 'CodecPrivate';
1744  $EBMLidList[self::EBML_ID_CODECSETTINGS] = 'CodecSettings';
1745  $EBMLidList[self::EBML_ID_COLOURSPACE] = 'ColourSpace';
1746  $EBMLidList[self::EBML_ID_CONTENTCOMPALGO] = 'ContentCompAlgo';
1747  $EBMLidList[self::EBML_ID_CONTENTCOMPRESSION] = 'ContentCompression';
1748  $EBMLidList[self::EBML_ID_CONTENTCOMPSETTINGS] = 'ContentCompSettings';
1749  $EBMLidList[self::EBML_ID_CONTENTENCALGO] = 'ContentEncAlgo';
1750  $EBMLidList[self::EBML_ID_CONTENTENCKEYID] = 'ContentEncKeyID';
1751  $EBMLidList[self::EBML_ID_CONTENTENCODING] = 'ContentEncoding';
1752  $EBMLidList[self::EBML_ID_CONTENTENCODINGORDER] = 'ContentEncodingOrder';
1753  $EBMLidList[self::EBML_ID_CONTENTENCODINGS] = 'ContentEncodings';
1754  $EBMLidList[self::EBML_ID_CONTENTENCODINGSCOPE] = 'ContentEncodingScope';
1755  $EBMLidList[self::EBML_ID_CONTENTENCODINGTYPE] = 'ContentEncodingType';
1756  $EBMLidList[self::EBML_ID_CONTENTENCRYPTION] = 'ContentEncryption';
1757  $EBMLidList[self::EBML_ID_CONTENTSIGALGO] = 'ContentSigAlgo';
1758  $EBMLidList[self::EBML_ID_CONTENTSIGHASHALGO] = 'ContentSigHashAlgo';
1759  $EBMLidList[self::EBML_ID_CONTENTSIGKEYID] = 'ContentSigKeyID';
1760  $EBMLidList[self::EBML_ID_CONTENTSIGNATURE] = 'ContentSignature';
1761  $EBMLidList[self::EBML_ID_CRC32] = 'CRC32';
1762  $EBMLidList[self::EBML_ID_CUEBLOCKNUMBER] = 'CueBlockNumber';
1763  $EBMLidList[self::EBML_ID_CUECLUSTERPOSITION] = 'CueClusterPosition';
1764  $EBMLidList[self::EBML_ID_CUECODECSTATE] = 'CueCodecState';
1765  $EBMLidList[self::EBML_ID_CUEPOINT] = 'CuePoint';
1766  $EBMLidList[self::EBML_ID_CUEREFCLUSTER] = 'CueRefCluster';
1767  $EBMLidList[self::EBML_ID_CUEREFCODECSTATE] = 'CueRefCodecState';
1768  $EBMLidList[self::EBML_ID_CUEREFERENCE] = 'CueReference';
1769  $EBMLidList[self::EBML_ID_CUEREFNUMBER] = 'CueRefNumber';
1770  $EBMLidList[self::EBML_ID_CUEREFTIME] = 'CueRefTime';
1771  $EBMLidList[self::EBML_ID_CUES] = 'Cues';
1772  $EBMLidList[self::EBML_ID_CUETIME] = 'CueTime';
1773  $EBMLidList[self::EBML_ID_CUETRACK] = 'CueTrack';
1774  $EBMLidList[self::EBML_ID_CUETRACKPOSITIONS] = 'CueTrackPositions';
1775  $EBMLidList[self::EBML_ID_DATEUTC] = 'DateUTC';
1776  $EBMLidList[self::EBML_ID_DEFAULTDURATION] = 'DefaultDuration';
1777  $EBMLidList[self::EBML_ID_DISPLAYHEIGHT] = 'DisplayHeight';
1778  $EBMLidList[self::EBML_ID_DISPLAYUNIT] = 'DisplayUnit';
1779  $EBMLidList[self::EBML_ID_DISPLAYWIDTH] = 'DisplayWidth';
1780  $EBMLidList[self::EBML_ID_DOCTYPE] = 'DocType';
1781  $EBMLidList[self::EBML_ID_DOCTYPEREADVERSION] = 'DocTypeReadVersion';
1782  $EBMLidList[self::EBML_ID_DOCTYPEVERSION] = 'DocTypeVersion';
1783  $EBMLidList[self::EBML_ID_DURATION] = 'Duration';
1784  $EBMLidList[self::EBML_ID_EBML] = 'EBML';
1785  $EBMLidList[self::EBML_ID_EBMLMAXIDLENGTH] = 'EBMLMaxIDLength';
1786  $EBMLidList[self::EBML_ID_EBMLMAXSIZELENGTH] = 'EBMLMaxSizeLength';
1787  $EBMLidList[self::EBML_ID_EBMLREADVERSION] = 'EBMLReadVersion';
1788  $EBMLidList[self::EBML_ID_EBMLVERSION] = 'EBMLVersion';
1789  $EBMLidList[self::EBML_ID_EDITIONENTRY] = 'EditionEntry';
1790  $EBMLidList[self::EBML_ID_EDITIONFLAGDEFAULT] = 'EditionFlagDefault';
1791  $EBMLidList[self::EBML_ID_EDITIONFLAGHIDDEN] = 'EditionFlagHidden';
1792  $EBMLidList[self::EBML_ID_EDITIONFLAGORDERED] = 'EditionFlagOrdered';
1793  $EBMLidList[self::EBML_ID_EDITIONUID] = 'EditionUID';
1794  $EBMLidList[self::EBML_ID_FILEDATA] = 'FileData';
1795  $EBMLidList[self::EBML_ID_FILEDESCRIPTION] = 'FileDescription';
1796  $EBMLidList[self::EBML_ID_FILEMIMETYPE] = 'FileMimeType';
1797  $EBMLidList[self::EBML_ID_FILENAME] = 'FileName';
1798  $EBMLidList[self::EBML_ID_FILEREFERRAL] = 'FileReferral';
1799  $EBMLidList[self::EBML_ID_FILEUID] = 'FileUID';
1800  $EBMLidList[self::EBML_ID_FLAGDEFAULT] = 'FlagDefault';
1801  $EBMLidList[self::EBML_ID_FLAGENABLED] = 'FlagEnabled';
1802  $EBMLidList[self::EBML_ID_FLAGFORCED] = 'FlagForced';
1803  $EBMLidList[self::EBML_ID_FLAGINTERLACED] = 'FlagInterlaced';
1804  $EBMLidList[self::EBML_ID_FLAGLACING] = 'FlagLacing';
1805  $EBMLidList[self::EBML_ID_GAMMAVALUE] = 'GammaValue';
1806  $EBMLidList[self::EBML_ID_INFO] = 'Info';
1807  $EBMLidList[self::EBML_ID_LANGUAGE] = 'Language';
1808  $EBMLidList[self::EBML_ID_MAXBLOCKADDITIONID] = 'MaxBlockAdditionID';
1809  $EBMLidList[self::EBML_ID_MAXCACHE] = 'MaxCache';
1810  $EBMLidList[self::EBML_ID_MINCACHE] = 'MinCache';
1811  $EBMLidList[self::EBML_ID_MUXINGAPP] = 'MuxingApp';
1812  $EBMLidList[self::EBML_ID_NAME] = 'Name';
1813  $EBMLidList[self::EBML_ID_NEXTFILENAME] = 'NextFilename';
1814  $EBMLidList[self::EBML_ID_NEXTUID] = 'NextUID';
1815  $EBMLidList[self::EBML_ID_OUTPUTSAMPLINGFREQUENCY] = 'OutputSamplingFrequency';
1816  $EBMLidList[self::EBML_ID_PIXELCROPBOTTOM] = 'PixelCropBottom';
1817  $EBMLidList[self::EBML_ID_PIXELCROPLEFT] = 'PixelCropLeft';
1818  $EBMLidList[self::EBML_ID_PIXELCROPRIGHT] = 'PixelCropRight';
1819  $EBMLidList[self::EBML_ID_PIXELCROPTOP] = 'PixelCropTop';
1820  $EBMLidList[self::EBML_ID_PIXELHEIGHT] = 'PixelHeight';
1821  $EBMLidList[self::EBML_ID_PIXELWIDTH] = 'PixelWidth';
1822  $EBMLidList[self::EBML_ID_PREVFILENAME] = 'PrevFilename';
1823  $EBMLidList[self::EBML_ID_PREVUID] = 'PrevUID';
1824  $EBMLidList[self::EBML_ID_SAMPLINGFREQUENCY] = 'SamplingFrequency';
1825  $EBMLidList[self::EBML_ID_SEEK] = 'Seek';
1826  $EBMLidList[self::EBML_ID_SEEKHEAD] = 'SeekHead';
1827  $EBMLidList[self::EBML_ID_SEEKID] = 'SeekID';
1828  $EBMLidList[self::EBML_ID_SEEKPOSITION] = 'SeekPosition';
1829  $EBMLidList[self::EBML_ID_SEGMENT] = 'Segment';
1830  $EBMLidList[self::EBML_ID_SEGMENTFAMILY] = 'SegmentFamily';
1831  $EBMLidList[self::EBML_ID_SEGMENTFILENAME] = 'SegmentFilename';
1832  $EBMLidList[self::EBML_ID_SEGMENTUID] = 'SegmentUID';
1833  $EBMLidList[self::EBML_ID_SIMPLETAG] = 'SimpleTag';
1834  $EBMLidList[self::EBML_ID_CLUSTERSLICES] = 'ClusterSlices';
1835  $EBMLidList[self::EBML_ID_STEREOMODE] = 'StereoMode';
1836  $EBMLidList[self::EBML_ID_TAG] = 'Tag';
1837  $EBMLidList[self::EBML_ID_TAGATTACHMENTUID] = 'TagAttachmentUID';
1838  $EBMLidList[self::EBML_ID_TAGBINARY] = 'TagBinary';
1839  $EBMLidList[self::EBML_ID_TAGCHAPTERUID] = 'TagChapterUID';
1840  $EBMLidList[self::EBML_ID_TAGDEFAULT] = 'TagDefault';
1841  $EBMLidList[self::EBML_ID_TAGEDITIONUID] = 'TagEditionUID';
1842  $EBMLidList[self::EBML_ID_TAGLANGUAGE] = 'TagLanguage';
1843  $EBMLidList[self::EBML_ID_TAGNAME] = 'TagName';
1844  $EBMLidList[self::EBML_ID_TAGTRACKUID] = 'TagTrackUID';
1845  $EBMLidList[self::EBML_ID_TAGS] = 'Tags';
1846  $EBMLidList[self::EBML_ID_TAGSTRING] = 'TagString';
1847  $EBMLidList[self::EBML_ID_TARGETS] = 'Targets';
1848  $EBMLidList[self::EBML_ID_TARGETTYPE] = 'TargetType';
1849  $EBMLidList[self::EBML_ID_TARGETTYPEVALUE] = 'TargetTypeValue';
1850  $EBMLidList[self::EBML_ID_TIMECODESCALE] = 'TimecodeScale';
1851  $EBMLidList[self::EBML_ID_TITLE] = 'Title';
1852  $EBMLidList[self::EBML_ID_TRACKENTRY] = 'TrackEntry';
1853  $EBMLidList[self::EBML_ID_TRACKNUMBER] = 'TrackNumber';
1854  $EBMLidList[self::EBML_ID_TRACKOFFSET] = 'TrackOffset';
1855  $EBMLidList[self::EBML_ID_TRACKOVERLAY] = 'TrackOverlay';
1856  $EBMLidList[self::EBML_ID_TRACKS] = 'Tracks';
1857  $EBMLidList[self::EBML_ID_TRACKTIMECODESCALE] = 'TrackTimecodeScale';
1858  $EBMLidList[self::EBML_ID_TRACKTRANSLATE] = 'TrackTranslate';
1859  $EBMLidList[self::EBML_ID_TRACKTRANSLATECODEC] = 'TrackTranslateCodec';
1860  $EBMLidList[self::EBML_ID_TRACKTRANSLATEEDITIONUID] = 'TrackTranslateEditionUID';
1861  $EBMLidList[self::EBML_ID_TRACKTRANSLATETRACKID] = 'TrackTranslateTrackID';
1862  $EBMLidList[self::EBML_ID_TRACKTYPE] = 'TrackType';
1863  $EBMLidList[self::EBML_ID_TRACKUID] = 'TrackUID';
1864  $EBMLidList[self::EBML_ID_VIDEO] = 'Video';
1865  $EBMLidList[self::EBML_ID_VOID] = 'Void';
1866  $EBMLidList[self::EBML_ID_WRITINGAPP] = 'WritingApp';
1867  }
1868 
1869  return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value));
1870  }
Create styles array
The data for the language used.

◆ EnsureBufferHasEnoughData()

GetId3\Module\AudioVideo\Matroska::EnsureBufferHasEnoughData (   $min_data = 1024)
private
Parameters
type$min_data
Returns
boolean

Definition at line 1261 of file Matroska.php.

References GetId3\Module\AudioVideo\Matroska\$current_offset, GetId3\Handler\BaseHandler\feof(), GetId3\Handler\BaseHandler\fread(), GetId3\Handler\BaseHandler\fseek(), and GetId3\Lib\Helper\intValueSupported().

Referenced by GetId3\Module\AudioVideo\Matroska\getEBMLelement().

1262  {
1263  if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) {
1264 
1265  if (!Helper::intValueSupported($this->current_offset + $this->getid3->fread_buffer_size())) {
1266  $this->getid3->info['error'][] = 'EBML parser: cannot read past '.$this->current_offset;
1267 
1268  return false;
1269  }
1270 
1271  $this->fseek($this->current_offset);
1272  $this->EBMLbuffer_offset = $this->current_offset;
1273  $this->EBMLbuffer = $this->fread(max($min_data, $this->getid3->fread_buffer_size()));
1274  $this->EBMLbuffer_length = strlen($this->EBMLbuffer);
1275 
1276  if ($this->EBMLbuffer_length == 0 && $this->feof()) {
1277  $this->getid3->info['error'][] = 'EBML parser: ran out of file at offset '.$this->current_offset;
1278 
1279  return false;
1280  }
1281  }
1282 
1283  return true;
1284  }
fseek($bytes, $whence=SEEK_SET)
static intValueSupported($num)
null $hasINT64
Definition: Helper.php:130
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ExtractCommentsSimpleTag()

GetId3\Module\AudioVideo\Matroska::ExtractCommentsSimpleTag (   $SimpleTagArray)
private
Parameters
type$SimpleTagArray
Returns
boolean

Definition at line 1406 of file Matroska.php.

Referenced by GetId3\Module\AudioVideo\Matroska\analyze().

1407  {
1408  if (!empty($SimpleTagArray['SimpleTag'])) {
1409  foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) {
1410  if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) {
1411  $this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString'];
1412  }
1413  if (!empty($SimpleTagData['SimpleTag'])) {
1414  $this->ExtractCommentsSimpleTag($SimpleTagData);
1415  }
1416  }
1417  }
1418 
1419  return true;
1420  }
ExtractCommentsSimpleTag($SimpleTagArray)
Definition: Matroska.php:1406
+ Here is the caller graph for this function:

◆ getDefaultStreamInfo()

static GetId3\Module\AudioVideo\Matroska::getDefaultStreamInfo (   $streams)
staticprivate

Definition at line 1872 of file Matroska.php.

References $info, and array.

1873  {
1874  foreach (array_reverse($streams) as $stream) {
1875  if ($stream['default']) {
1876  break;
1877  }
1878  }
1879 
1880  $unset = array('default', 'name');
1881  foreach ($unset as $u) {
1882  if (isset($stream[$u])) {
1883  unset($stream[$u]);
1884  }
1885  }
1886 
1887  $info = $stream;
1888  $info['streams'] = $streams;
1889 
1890  return $info;
1891  }
$info
Definition: example_052.php:80
Create styles array
The data for the language used.

◆ getEBMLelement()

GetId3\Module\AudioVideo\Matroska::getEBMLelement ( $element,
  $parent_end,
  $get_data = false 
)
private
Parameters
type$element
type$parent_end
type$get_data
Returns
boolean

Definition at line 1344 of file Matroska.php.

References GetId3\Module\AudioVideo\Matroska\$current_offset, array, GetId3\Module\AudioVideo\Matroska\EnsureBufferHasEnoughData(), GetId3\Module\AudioVideo\Matroska\readEBMLelementData(), and GetId3\Module\AudioVideo\Matroska\readEBMLint().

Referenced by GetId3\Module\AudioVideo\Matroska\HandleEMBLSimpleTag(), and GetId3\Module\AudioVideo\Matroska\parseEBML().

1345  {
1346  if ($this->current_offset >= $parent_end) {
1347  return false;
1348  }
1349 
1350  if (!$this->EnsureBufferHasEnoughData()) {
1351  $this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information
1352 
1353  return false;
1354  }
1355 
1356  $element = array();
1357 
1358  // set offset
1359  $element['offset'] = $this->current_offset;
1360 
1361  // get ID
1362  $element['id'] = $this->readEBMLint();
1363 
1364  // get name
1365  $element['id_name'] = self::EBMLidName($element['id']);
1366 
1367  // get length
1368  $element['length'] = $this->readEBMLint();
1369 
1370  // get end offset
1371  $element['end'] = $this->current_offset + $element['length'];
1372 
1373  // get raw data
1374  $dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id']));
1375  if (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) {
1376  $element['data'] = $this->readEBMLelementData($element['length'], $element);
1377  }
1378 
1379  return true;
1380  }
EnsureBufferHasEnoughData($min_data=1024)
Definition: Matroska.php:1261
Create styles array
The data for the language used.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ HandleEMBLClusterBlock()

GetId3\Module\AudioVideo\Matroska::HandleEMBLClusterBlock (   $element,
  $block_type,
$info 
)
private
Parameters
type$element
type$block_type
type$info
Returns
type http://www.matroska.org/technical/specs/index.html#simpleblock_structure

Definition at line 1466 of file Matroska.php.

References GetId3\Module\AudioVideo\Matroska\$current_offset, $info, $size, array, GetId3\Lib\Helper\BigEndian2Int(), GetId3\Module\AudioVideo\Matroska\readEBMLelementData(), and GetId3\Module\AudioVideo\Matroska\readEBMLint().

Referenced by GetId3\Module\AudioVideo\Matroska\parseEBML().

1467  {
1468  $block_data = array();
1469  $block_data['tracknumber'] = $this->readEBMLint();
1470  $block_data['timecode'] = Helper::BigEndian2Int($this->readEBMLelementData(2), false, true);
1471  $block_data['flags_raw'] = Helper::BigEndian2Int($this->readEBMLelementData(1));
1472 
1473  if ($block_type == self::EBML_ID_CLUSTERSIMPLEBLOCK) {
1474  $block_data['flags']['keyframe'] = (($block_data['flags_raw'] & 0x80) >> 7);
1475  //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4);
1476  } else {
1477  //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4);
1478  }
1479  $block_data['flags']['invisible'] = (bool) (($block_data['flags_raw'] & 0x08) >> 3);
1480  $block_data['flags']['lacing'] = (($block_data['flags_raw'] & 0x06) >> 1); // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing
1481  if ($block_type == self::EBML_ID_CLUSTERSIMPLEBLOCK) {
1482  $block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01));
1483  } else {
1484  //$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0);
1485  }
1486  $block_data['flags']['lacing_type'] = self::MatroskaBlockLacingType($block_data['flags']['lacing']);
1487 
1488  // Lace (when lacing bit is set)
1489  if ($block_data['flags']['lacing'] > 0) {
1490  $block_data['lace_frames'] = Helper::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8)
1491  if ($block_data['flags']['lacing'] != 0x02) {
1492  for ($i = 1; $i < $block_data['lace_frames']; $i ++) { // Lace-coded size of each frame of the lace, except for the last one (multiple uint8). *This is not used with Fixed-size lacing as it is calculated automatically from (total size of lace) / (number of frames in lace).
1493  if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing
1494  $block_data['lace_frames_size'][$i] = $this->readEBMLint(); // TODO: read size correctly, calc size for the last frame. For now offsets are deteminded OK with readEBMLint() and that's the most important thing.
1495  } else { // Xiph lacing
1496  $block_data['lace_frames_size'][$i] = 0;
1497  do {
1499  $block_data['lace_frames_size'][$i] += $size;
1500  } while ($size == 255);
1501  }
1502  }
1503  if ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly
1504  $block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']);
1505  }
1506  }
1507  }
1508 
1509  if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) {
1510  $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset;
1511  $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset;
1512  //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0;
1513  }
1514  //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'];
1515  //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['duration'] = $block_data['timecode'] * ((isset($info['matroska']['info'][0]['TimecodeScale']) ? $info['matroska']['info'][0]['TimecodeScale'] : 1000000) / 1000000000);
1516 
1517  // set offset manually
1518  $this->current_offset = $element['end'];
1519 
1520  return $block_data;
1521  }
$size
Definition: RandomTest.php:79
$info
Definition: example_052.php:80
Create styles array
The data for the language used.
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
Definition: Helper.php:374
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ HandleEMBLSimpleTag()

GetId3\Module\AudioVideo\Matroska::HandleEMBLSimpleTag (   $parent_end)
private
Parameters
type$parent_end
Returns
type

Definition at line 1427 of file Matroska.php.

References array, GetId3\Lib\Helper\BigEndian2Int(), GetId3\Module\AudioVideo\Matroska\getEBMLelement(), and GetId3\Module\AudioVideo\Matroska\unhandledElement().

Referenced by GetId3\Module\AudioVideo\Matroska\parseEBML().

1428  {
1429  $simpletag_entry = array();
1430 
1431  while ($this->getEBMLelement($element, $parent_end, array(self::EBML_ID_SIMPLETAG))) {
1432  switch ($element['id']) {
1433 
1434  case self::EBML_ID_TAGNAME:
1435  case self::EBML_ID_TAGLANGUAGE:
1436  case self::EBML_ID_TAGSTRING:
1437  case self::EBML_ID_TAGBINARY:
1438  $simpletag_entry[$element['id_name']] = $element['data'];
1439  break;
1440 
1441  case self::EBML_ID_SIMPLETAG:
1442  $simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']);
1443  break;
1444 
1445  case self::EBML_ID_TAGDEFAULT:
1446  $simpletag_entry[$element['id_name']] = (bool) Helper::BigEndian2Int($element['data']);
1447  break;
1448 
1449  default:
1450  $this->unhandledElement('tag.simpletag', __LINE__, $element);
1451  }
1452  }
1453 
1454  return $simpletag_entry;
1455  }
unhandledElement($type, $line, $element)
Definition: Matroska.php:1388
Create styles array
The data for the language used.
getEBMLelement(&$element, $parent_end, $get_data=false)
Definition: Matroska.php:1344
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
Definition: Helper.php:374
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ MatroskaBlockLacingType()

static GetId3\Module\AudioVideo\Matroska::MatroskaBlockLacingType (   $lacingtype)
static

array $MatroskaBlockLacingType

Parameters
type$lacingtype
Returns
type http://matroska.org/technical/specs/index.html#block_structure

Definition at line 1612 of file Matroska.php.

References array.

1613  {
1614  static $MatroskaBlockLacingType = array();
1615  if (empty($MatroskaBlockLacingType)) {
1616  $MatroskaBlockLacingType[0x00] = 'no lacing';
1617  $MatroskaBlockLacingType[0x01] = 'Xiph lacing';
1618  $MatroskaBlockLacingType[0x02] = 'fixed-size lacing';
1619  $MatroskaBlockLacingType[0x03] = 'EBML lacing';
1620  }
1621 
1622  return (isset($MatroskaBlockLacingType[$lacingtype]) ? $MatroskaBlockLacingType[$lacingtype] : $lacingtype);
1623  }
Create styles array
The data for the language used.

◆ MatroskaCodecIDtoCommonName()

static GetId3\Module\AudioVideo\Matroska::MatroskaCodecIDtoCommonName (   $codecid)
static

array $MatroskaCodecIDlist

Parameters
type$codecid
Returns
type http://www.matroska.org/technical/specs/codecid/index.html

Definition at line 1632 of file Matroska.php.

References array.

1633  {
1634  static $MatroskaCodecIDlist = array();
1635  if (empty($MatroskaCodecIDlist)) {
1636  $MatroskaCodecIDlist['A_AAC'] = 'aac';
1637  $MatroskaCodecIDlist['A_AAC/MPEG2/LC'] = 'aac';
1638  $MatroskaCodecIDlist['A_AC3'] = 'ac3';
1639  $MatroskaCodecIDlist['A_DTS'] = 'dts';
1640  $MatroskaCodecIDlist['A_FLAC'] = 'flac';
1641  $MatroskaCodecIDlist['A_MPEG/L1'] = 'mp1';
1642  $MatroskaCodecIDlist['A_MPEG/L2'] = 'mp2';
1643  $MatroskaCodecIDlist['A_MPEG/L3'] = 'mp3';
1644  $MatroskaCodecIDlist['A_PCM/INT/LIT'] = 'pcm'; // PCM Integer Little Endian
1645  $MatroskaCodecIDlist['A_PCM/INT/BIG'] = 'pcm'; // PCM Integer Big Endian
1646  $MatroskaCodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music
1647  $MatroskaCodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2
1648  $MatroskaCodecIDlist['A_VORBIS'] = 'vorbis';
1649  $MatroskaCodecIDlist['V_MPEG1'] = 'mpeg';
1650  $MatroskaCodecIDlist['V_THEORA'] = 'theora';
1651  $MatroskaCodecIDlist['V_REAL/RV40'] = 'real';
1652  $MatroskaCodecIDlist['V_REAL/RV10'] = 'real';
1653  $MatroskaCodecIDlist['V_REAL/RV20'] = 'real';
1654  $MatroskaCodecIDlist['V_REAL/RV30'] = 'real';
1655  $MatroskaCodecIDlist['V_QUICKTIME'] = 'quicktime'; // Quicktime
1656  $MatroskaCodecIDlist['V_MPEG4/ISO/AP'] = 'mpeg4';
1657  $MatroskaCodecIDlist['V_MPEG4/ISO/ASP'] = 'mpeg4';
1658  $MatroskaCodecIDlist['V_MPEG4/ISO/AVC'] = 'h264';
1659  $MatroskaCodecIDlist['V_MPEG4/ISO/SP'] = 'mpeg4';
1660  $MatroskaCodecIDlist['V_VP8'] = 'vp8';
1661  $MatroskaCodecIDlist['V_MS/VFW/FOURCC'] = 'riff';
1662  $MatroskaCodecIDlist['A_MS/ACM'] = 'riff';
1663  }
1664 
1665  return (isset($MatroskaCodecIDlist[$codecid]) ? $MatroskaCodecIDlist[$codecid] : $codecid);
1666  }
Create styles array
The data for the language used.

◆ MatroskaTargetTypeValue()

static GetId3\Module\AudioVideo\Matroska::MatroskaTargetTypeValue (   $target_type)
static

array $MatroskaTargetTypeValue

Parameters
type$target_type
Returns
type http://www.matroska.org/technical/specs/tagging/index.html

Definition at line 1589 of file Matroska.php.

References $target_type, and array.

1590  {
1591  static $MatroskaTargetTypeValue = array();
1592  if (empty($MatroskaTargetTypeValue)) {
1593  $MatroskaTargetTypeValue[10] = 'A: ~ V:shot'; // the lowest hierarchy found in music or movies
1594  $MatroskaTargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene'; // corresponds to parts of a track for audio (like a movement)
1595  $MatroskaTargetTypeValue[30] = 'A:track/song ~ V:chapter'; // the common parts of an album or a movie
1596  $MatroskaTargetTypeValue[40] = 'A:part/session ~ V:part/session'; // when an album or episode has different logical parts
1597  $MatroskaTargetTypeValue[50] = 'A:album/opera/concert ~ V:movie/episode/concert'; // the most common grouping level of music and video (equals to an episode for TV series)
1598  $MatroskaTargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume'; // a list of lower levels grouped together
1599  $MatroskaTargetTypeValue[70] = 'A:collection ~ V:collection'; // the high hierarchy consisting of many different lower items
1600  }
1601 
1602  return (isset($MatroskaTargetTypeValue[$target_type]) ? $MatroskaTargetTypeValue[$target_type] : $target_type);
1603  }
$target_type
Definition: goto.php:50
Create styles array
The data for the language used.

◆ parseEBML()

GetId3\Module\AudioVideo\Matroska::parseEBML ( $info)
private
Parameters
type$info
Returns
type http://www.matroska.org/technical/specs/index.html#EBMLBasics

Definition at line 540 of file Matroska.php.

References GetId3\Module\AudioVideo\Matroska\$current_offset, $info, array, GetId3\GetId3Core\ATTACHMENTS_INLINE, GetId3\Lib\Helper\BigEndian2Float(), GetId3\Lib\Helper\BigEndian2Int(), GetId3\Module\AudioVideo\Matroska\getEBMLelement(), GetId3\Module\AudioVideo\Matroska\HandleEMBLClusterBlock(), GetId3\Module\AudioVideo\Matroska\HandleEMBLSimpleTag(), GetId3\Handler\BaseHandler\saveAttachment(), GetId3\Lib\Helper\trimNullByte(), and GetId3\Module\AudioVideo\Matroska\unhandledElement().

Referenced by GetId3\Module\AudioVideo\Matroska\analyze().

541  {
542  $this->current_offset = $info['avdataoffset'];
543 
544  while ($this->getEBMLelement($top_element, $info['avdataend'])) {
545  switch ($top_element['id']) {
546 
547  case self::EBML_ID_EBML:
548  $info['fileformat'] = 'matroska';
549  $info['matroska']['header']['offset'] = $top_element['offset'];
550  $info['matroska']['header']['length'] = $top_element['length'];
551 
552  while ($this->getEBMLelement($element_data, $top_element['end'], true)) {
553  switch ($element_data['id']) {
554 
555  case self::EBML_ID_EBMLVERSION:
556  case self::EBML_ID_EBMLREADVERSION:
557  case self::EBML_ID_EBMLMAXIDLENGTH:
558  case self::EBML_ID_EBMLMAXSIZELENGTH:
559  case self::EBML_ID_DOCTYPEVERSION:
560  case self::EBML_ID_DOCTYPEREADVERSION:
561  $element_data['data'] = Helper::BigEndian2Int($element_data['data']);
562  break;
563 
564  case self::EBML_ID_DOCTYPE:
565  $element_data['data'] = Helper::trimNullByte($element_data['data']);
566  $info['matroska']['doctype'] = $element_data['data'];
567  break;
568 
569  case self::EBML_ID_CRC32: // not useful, ignore
570  $this->current_offset = $element_data['end'];
571  unset($element_data);
572  break;
573 
574  default:
575  $this->unhandledElement('header', __LINE__, $element_data);
576  }
577  if (!empty($element_data)) {
578  unset($element_data['offset'], $element_data['end']);
579  $info['matroska']['header']['elements'][] = $element_data;
580  }
581  }
582  break;
583 
584  case self::EBML_ID_SEGMENT:
585  $info['matroska']['segment'][0]['offset'] = $top_element['offset'];
586  $info['matroska']['segment'][0]['length'] = $top_element['length'];
587 
588  while ($this->getEBMLelement($element_data, $top_element['end'])) {
589  if ($element_data['id'] != self::EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required
590  $info['matroska']['segments'][] = $element_data;
591  }
592  switch ($element_data['id']) {
593 
594  case self::EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements.
595 
596  while ($this->getEBMLelement($seek_entry, $element_data['end'])) {
597  switch ($seek_entry['id']) {
598 
599  case self::EBML_ID_SEEK: // Contains a single seek entry to an EBML element
600  while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) {
601 
602  switch ($sub_seek_entry['id']) {
603 
604  case self::EBML_ID_SEEKID:
605  $seek_entry['target_id'] = self::EBML2Int($sub_seek_entry['data']);
606  $seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']);
607  break;
608 
609  case self::EBML_ID_SEEKPOSITION:
610  $seek_entry['target_offset'] = $element_data['offset'] + Helper::BigEndian2Int($sub_seek_entry['data']);
611  break;
612 
613  default:
614  $this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry); }
615  }
616 
617  if ($seek_entry['target_id'] != self::EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required
618  $info['matroska']['seek'][] = $seek_entry;
619  }
620  break;
621 
622  default:
623  $this->unhandledElement('seekhead', __LINE__, $seek_entry);
624  }
625  }
626  break;
627 
628  case self::EBML_ID_TRACKS: // A top-level block of information with many tracks described.
629  $info['matroska']['tracks'] = $element_data;
630 
631  while ($this->getEBMLelement($track_entry, $element_data['end'])) {
632  switch ($track_entry['id']) {
633 
634  case self::EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements.
635 
636  while ($this->getEBMLelement($subelement, $track_entry['end'], array(self::EBML_ID_VIDEO, self::EBML_ID_AUDIO, self::EBML_ID_CONTENTENCODINGS))) {
637  switch ($subelement['id']) {
638 
639  case self::EBML_ID_TRACKNUMBER:
640  case self::EBML_ID_TRACKUID:
641  case self::EBML_ID_TRACKTYPE:
642  case self::EBML_ID_MINCACHE:
643  case self::EBML_ID_MAXCACHE:
644  case self::EBML_ID_MAXBLOCKADDITIONID:
645  case self::EBML_ID_DEFAULTDURATION: // nanoseconds per frame
646  $track_entry[$subelement['id_name']] = Helper::BigEndian2Int($subelement['data']);
647  break;
648 
649  case self::EBML_ID_TRACKTIMECODESCALE:
650  $track_entry[$subelement['id_name']] = Helper::BigEndian2Float($subelement['data']);
651  break;
652 
653  case self::EBML_ID_CODECID:
654  case self::EBML_ID_LANGUAGE:
655  case self::EBML_ID_NAME:
656  case self::EBML_ID_CODECNAME:
657  $track_entry[$subelement['id_name']] = Helper::trimNullByte($subelement['data']);
658  break;
659 
660  case self::EBML_ID_CODECPRIVATE:
661  $track_entry[$subelement['id_name']] = $subelement['data'];
662  break;
663 
664  case self::EBML_ID_FLAGENABLED:
665  case self::EBML_ID_FLAGDEFAULT:
666  case self::EBML_ID_FLAGFORCED:
667  case self::EBML_ID_FLAGLACING:
668  case self::EBML_ID_CODECDECODEALL:
669  $track_entry[$subelement['id_name']] = (bool) Helper::BigEndian2Int($subelement['data']);
670  break;
671 
672  case self::EBML_ID_VIDEO:
673 
674  while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
675  switch ($sub_subelement['id']) {
676 
677  case self::EBML_ID_PIXELWIDTH:
678  case self::EBML_ID_PIXELHEIGHT:
679  case self::EBML_ID_STEREOMODE:
680  case self::EBML_ID_PIXELCROPBOTTOM:
681  case self::EBML_ID_PIXELCROPTOP:
682  case self::EBML_ID_PIXELCROPLEFT:
683  case self::EBML_ID_PIXELCROPRIGHT:
684  case self::EBML_ID_DISPLAYWIDTH:
685  case self::EBML_ID_DISPLAYHEIGHT:
686  case self::EBML_ID_DISPLAYUNIT:
687  case self::EBML_ID_ASPECTRATIOTYPE:
688  $track_entry[$sub_subelement['id_name']] = Helper::BigEndian2Int($sub_subelement['data']);
689  break;
690 
691  case self::EBML_ID_FLAGINTERLACED:
692  $track_entry[$sub_subelement['id_name']] = (bool) Helper::BigEndian2Int($sub_subelement['data']);
693  break;
694 
695  case self::EBML_ID_GAMMAVALUE:
696  $track_entry[$sub_subelement['id_name']] = Helper::BigEndian2Float($sub_subelement['data']);
697  break;
698 
699  case self::EBML_ID_COLOURSPACE:
700  $track_entry[$sub_subelement['id_name']] = Helper::trimNullByte($sub_subelement['data']);
701  break;
702 
703  default:
704  $this->unhandledElement('track.video', __LINE__, $sub_subelement);
705  }
706  }
707  break;
708 
709  case self::EBML_ID_AUDIO:
710 
711  while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
712  switch ($sub_subelement['id']) {
713 
714  case self::EBML_ID_CHANNELS:
715  case self::EBML_ID_BITDEPTH:
716  $track_entry[$sub_subelement['id_name']] = Helper::BigEndian2Int($sub_subelement['data']);
717  break;
718 
719  case self::EBML_ID_SAMPLINGFREQUENCY:
720  case self::EBML_ID_OUTPUTSAMPLINGFREQUENCY:
721  $track_entry[$sub_subelement['id_name']] = Helper::BigEndian2Float($sub_subelement['data']);
722  break;
723 
724  case self::EBML_ID_CHANNELPOSITIONS:
725  $track_entry[$sub_subelement['id_name']] = Helper::trimNullByte($sub_subelement['data']);
726  break;
727 
728  default:
729  $this->unhandledElement('track.audio', __LINE__, $sub_subelement);
730  }
731  }
732  break;
733 
734  case self::EBML_ID_CONTENTENCODINGS:
735 
736  while ($this->getEBMLelement($sub_subelement, $subelement['end'])) {
737  switch ($sub_subelement['id']) {
738 
739  case self::EBML_ID_CONTENTENCODING:
740 
741  while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(self::EBML_ID_CONTENTCOMPRESSION, self::EBML_ID_CONTENTENCRYPTION))) {
742  switch ($sub_sub_subelement['id']) {
743 
744  case self::EBML_ID_CONTENTENCODINGORDER:
745  case self::EBML_ID_CONTENTENCODINGSCOPE:
746  case self::EBML_ID_CONTENTENCODINGTYPE:
747  $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = Helper::BigEndian2Int($sub_sub_subelement['data']);
748  break;
749 
750  case self::EBML_ID_CONTENTCOMPRESSION:
751 
752  while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
753  switch ($sub_sub_sub_subelement['id']) {
754 
755  case self::EBML_ID_CONTENTCOMPALGO:
756  $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = Helper::BigEndian2Int($sub_sub_sub_subelement['data']);
757  break;
758 
759  case self::EBML_ID_CONTENTCOMPSETTINGS:
760  $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
761  break;
762 
763  default:
764  $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
765  }
766  }
767  break;
768 
769  case self::EBML_ID_CONTENTENCRYPTION:
770 
771  while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
772  switch ($sub_sub_sub_subelement['id']) {
773 
774  case self::EBML_ID_CONTENTENCALGO:
775  case self::EBML_ID_CONTENTSIGALGO:
776  case self::EBML_ID_CONTENTSIGHASHALGO:
777  $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = Helper::BigEndian2Int($sub_sub_sub_subelement['data']);
778  break;
779 
780  case self::EBML_ID_CONTENTENCKEYID:
781  case self::EBML_ID_CONTENTSIGNATURE:
782  case self::EBML_ID_CONTENTSIGKEYID:
783  $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
784  break;
785 
786  default:
787  $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
788  }
789  }
790  break;
791 
792  default:
793  $this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);
794  }
795  }
796  break;
797 
798  default:
799  $this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement);
800  }
801  }
802  break;
803 
804  default:
805  $this->unhandledElement('track', __LINE__, $subelement);
806  }
807  }
808 
809  $info['matroska']['tracks']['tracks'][] = $track_entry;
810  break;
811 
812  default:
813  $this->unhandledElement('tracks', __LINE__, $track_entry);
814  }
815  }
816  break;
817 
818  case self::EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file.
819  $info_entry = array();
820 
821  while ($this->getEBMLelement($subelement, $element_data['end'], true)) {
822  switch ($subelement['id']) {
823 
824  case self::EBML_ID_TIMECODESCALE:
825  $info_entry[$subelement['id_name']] = Helper::BigEndian2Int($subelement['data']);
826  break;
827 
828  case self::EBML_ID_DURATION:
829  $info_entry[$subelement['id_name']] = Helper::BigEndian2Float($subelement['data']);
830  break;
831 
832  case self::EBML_ID_DATEUTC:
833  $info_entry[$subelement['id_name']] = Helper::BigEndian2Int($subelement['data']);
834  $info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]);
835  break;
836 
837  case self::EBML_ID_SEGMENTUID:
838  case self::EBML_ID_PREVUID:
839  case self::EBML_ID_NEXTUID:
840  $info_entry[$subelement['id_name']] = Helper::trimNullByte($subelement['data']);
841  break;
842 
843  case self::EBML_ID_SEGMENTFAMILY:
844  $info_entry[$subelement['id_name']][] = Helper::trimNullByte($subelement['data']);
845  break;
846 
847  case self::EBML_ID_SEGMENTFILENAME:
848  case self::EBML_ID_PREVFILENAME:
849  case self::EBML_ID_NEXTFILENAME:
850  case self::EBML_ID_TITLE:
851  case self::EBML_ID_MUXINGAPP:
852  case self::EBML_ID_WRITINGAPP:
853  $info_entry[$subelement['id_name']] = Helper::trimNullByte($subelement['data']);
854  $info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']];
855  break;
856 
857  case self::EBML_ID_CHAPTERTRANSLATE:
858  $chaptertranslate_entry = array();
859 
860  while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
861  switch ($sub_subelement['id']) {
862 
863  case self::EBML_ID_CHAPTERTRANSLATEEDITIONUID:
864  $chaptertranslate_entry[$sub_subelement['id_name']][] = Helper::BigEndian2Int($sub_subelement['data']);
865  break;
866 
867  case self::EBML_ID_CHAPTERTRANSLATECODEC:
868  $chaptertranslate_entry[$sub_subelement['id_name']] = Helper::BigEndian2Int($sub_subelement['data']);
869  break;
870 
871  case self::EBML_ID_CHAPTERTRANSLATEID:
872  $chaptertranslate_entry[$sub_subelement['id_name']] = Helper::trimNullByte($sub_subelement['data']);
873  break;
874 
875  default:
876  $this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement);
877  }
878  }
879  $info_entry[$subelement['id_name']] = $chaptertranslate_entry;
880  break;
881 
882  default:
883  $this->unhandledElement('info', __LINE__, $subelement);
884  }
885  }
886  $info['matroska']['info'][] = $info_entry;
887  break;
888 
889  case self::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.
890  if (self::$hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway
891  $this->current_offset = $element_data['end'];
892  break;
893  }
894  $cues_entry = array();
895 
896  while ($this->getEBMLelement($subelement, $element_data['end'])) {
897  switch ($subelement['id']) {
898 
899  case self::EBML_ID_CUEPOINT:
900  $cuepoint_entry = array();
901 
902  while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(self::EBML_ID_CUETRACKPOSITIONS))) {
903  switch ($sub_subelement['id']) {
904 
905  case self::EBML_ID_CUETRACKPOSITIONS:
906  $cuetrackpositions_entry = array();
907 
908  while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
909  switch ($sub_sub_subelement['id']) {
910 
911  case self::EBML_ID_CUETRACK:
912  case self::EBML_ID_CUECLUSTERPOSITION:
913  case self::EBML_ID_CUEBLOCKNUMBER:
914  case self::EBML_ID_CUECODECSTATE:
915  $cuetrackpositions_entry[$sub_sub_subelement['id_name']] = Helper::BigEndian2Int($sub_sub_subelement['data']);
916  break;
917 
918  default:
919  $this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);
920  }
921  }
922  $cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry;
923  break;
924 
925  case self::EBML_ID_CUETIME:
926  $cuepoint_entry[$sub_subelement['id_name']] = Helper::BigEndian2Int($sub_subelement['data']);
927  break;
928 
929  default:
930  $this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement);
931  }
932  }
933  $cues_entry[] = $cuepoint_entry;
934  break;
935 
936  default:
937  $this->unhandledElement('cues', __LINE__, $subelement);
938  }
939  }
940  $info['matroska']['cues'] = $cues_entry;
941  break;
942 
943  case self::EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters.
944  $tags_entry = array();
945 
946  while ($this->getEBMLelement($subelement, $element_data['end'], false)) {
947  switch ($subelement['id']) {
948 
949  case self::EBML_ID_TAG:
950  $tag_entry = array();
951 
952  while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) {
953  switch ($sub_subelement['id']) {
954 
955  case self::EBML_ID_TARGETS:
956  $targets_entry = array();
957 
958  while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
959  switch ($sub_sub_subelement['id']) {
960 
961  case self::EBML_ID_TARGETTYPEVALUE:
962  $targets_entry[$sub_sub_subelement['id_name']] = Helper::BigEndian2Int($sub_sub_subelement['data']);
963  $targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::MatroskaTargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]);
964  break;
965 
966  case self::EBML_ID_TARGETTYPE:
967  $targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
968  break;
969 
970  case self::EBML_ID_TAGTRACKUID:
971  case self::EBML_ID_TAGEDITIONUID:
972  case self::EBML_ID_TAGCHAPTERUID:
973  case self::EBML_ID_TAGATTACHMENTUID:
974  $targets_entry[$sub_sub_subelement['id_name']][] = Helper::BigEndian2Int($sub_sub_subelement['data']);
975  break;
976 
977  default:
978  $this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement);
979  }
980  }
981  $tag_entry[$sub_subelement['id_name']] = $targets_entry;
982  break;
983 
984  case self::EBML_ID_SIMPLETAG:
985  $tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']);
986  break;
987 
988  default:
989  $this->unhandledElement('tags.tag', __LINE__, $sub_subelement);
990  }
991  }
992  $tags_entry[] = $tag_entry;
993  break;
994 
995  default:
996  $this->unhandledElement('tags', __LINE__, $subelement);
997  }
998  }
999  $info['matroska']['tags'] = $tags_entry;
1000  break;
1001 
1002  case self::EBML_ID_ATTACHMENTS: // Contain attached files.
1003 
1004  while ($this->getEBMLelement($subelement, $element_data['end'])) {
1005  switch ($subelement['id']) {
1006 
1007  case self::EBML_ID_ATTACHEDFILE:
1008  $attachedfile_entry = array();
1009 
1010  while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(self::EBML_ID_FILEDATA))) {
1011  switch ($sub_subelement['id']) {
1012 
1013  case self::EBML_ID_FILEDESCRIPTION:
1014  case self::EBML_ID_FILENAME:
1015  case self::EBML_ID_FILEMIMETYPE:
1016  $attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data'];
1017  break;
1018 
1019  case self::EBML_ID_FILEDATA:
1020  $attachedfile_entry['data_offset'] = $this->current_offset;
1021  $attachedfile_entry['data_length'] = $sub_subelement['length'];
1022 
1023  $this->saveAttachment(
1024  $attachedfile_entry[$sub_subelement['id_name']],
1025  $attachedfile_entry['FileName'],
1026  $attachedfile_entry['data_offset'],
1027  $attachedfile_entry['data_length']);
1028 
1029  $this->current_offset = $sub_subelement['end'];
1030  break;
1031 
1032  case self::EBML_ID_FILEUID:
1033  $attachedfile_entry[$sub_subelement['id_name']] = Helper::BigEndian2Int($sub_subelement['data']);
1034  break;
1035 
1036  default:
1037  $this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement);
1038  }
1039  }
1040  if (!empty($attachedfile_entry['FileData']) && !empty($attachedfile_entry['FileMimeType']) && preg_match('#^image/#i', $attachedfile_entry['FileMimeType'])) {
1041  if ($this->getid3->option_save_attachments === GetId3Core::ATTACHMENTS_INLINE) {
1042  $attachedfile_entry['data'] = $attachedfile_entry['FileData'];
1043  $attachedfile_entry['image_mime'] = $attachedfile_entry['FileMimeType'];
1044  $info['matroska']['comments']['picture'][] = array('data' => $attachedfile_entry['data'], 'image_mime' => $attachedfile_entry['image_mime'], 'filename' => $attachedfile_entry['FileName']);
1045  unset($attachedfile_entry['FileData'], $attachedfile_entry['FileMimeType']);
1046  }
1047  }
1048  if (!empty($attachedfile_entry['image_mime']) && preg_match('#^image/#i', $attachedfile_entry['image_mime'])) {
1049  // don't add a second copy of attached images, which are grouped under the standard location [comments][picture]
1050  } else {
1051  $info['matroska']['attachments'][] = $attachedfile_entry;
1052  }
1053  break;
1054 
1055  default:
1056  $this->unhandledElement('attachments', __LINE__, $subelement);
1057  }
1058  }
1059  break;
1060 
1061  case self::EBML_ID_CHAPTERS:
1062 
1063  while ($this->getEBMLelement($subelement, $element_data['end'])) {
1064  switch ($subelement['id']) {
1065 
1066  case self::EBML_ID_EDITIONENTRY:
1067  $editionentry_entry = array();
1068 
1069  while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(self::EBML_ID_CHAPTERATOM))) {
1070  switch ($sub_subelement['id']) {
1071 
1072  case self::EBML_ID_EDITIONUID:
1073  $editionentry_entry[$sub_subelement['id_name']] = Helper::BigEndian2Int($sub_subelement['data']);
1074  break;
1075 
1076  case self::EBML_ID_EDITIONFLAGHIDDEN:
1077  case self::EBML_ID_EDITIONFLAGDEFAULT:
1078  case self::EBML_ID_EDITIONFLAGORDERED:
1079  $editionentry_entry[$sub_subelement['id_name']] = (bool) Helper::BigEndian2Int($sub_subelement['data']);
1080  break;
1081 
1082  case self::EBML_ID_CHAPTERATOM:
1083  $chapteratom_entry = array();
1084 
1085  while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(self::EBML_ID_CHAPTERTRACK, self::EBML_ID_CHAPTERDISPLAY))) {
1086  switch ($sub_sub_subelement['id']) {
1087 
1088  case self::EBML_ID_CHAPTERSEGMENTUID:
1089  case self::EBML_ID_CHAPTERSEGMENTEDITIONUID:
1090  $chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
1091  break;
1092 
1093  case self::EBML_ID_CHAPTERFLAGENABLED:
1094  case self::EBML_ID_CHAPTERFLAGHIDDEN:
1095  $chapteratom_entry[$sub_sub_subelement['id_name']] = (bool) Helper::BigEndian2Int($sub_sub_subelement['data']);
1096  break;
1097 
1098  case self::EBML_ID_CHAPTERUID:
1099  case self::EBML_ID_CHAPTERTIMESTART:
1100  case self::EBML_ID_CHAPTERTIMEEND:
1101  $chapteratom_entry[$sub_sub_subelement['id_name']] = Helper::BigEndian2Int($sub_sub_subelement['data']);
1102  break;
1103 
1104  case self::EBML_ID_CHAPTERTRACK:
1105  $chaptertrack_entry = array();
1106 
1107  while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
1108  switch ($sub_sub_sub_subelement['id']) {
1109 
1110  case self::EBML_ID_CHAPTERTRACKNUMBER:
1111  $chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = Helper::BigEndian2Int($sub_sub_sub_subelement['data']);
1112  break;
1113 
1114  default:
1115  $this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);
1116  }
1117  }
1118  $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry;
1119  break;
1120 
1121  case self::EBML_ID_CHAPTERDISPLAY:
1122  $chapterdisplay_entry = array();
1123 
1124  while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
1125  switch ($sub_sub_sub_subelement['id']) {
1126 
1127  case self::EBML_ID_CHAPSTRING:
1128  case self::EBML_ID_CHAPLANGUAGE:
1129  case self::EBML_ID_CHAPCOUNTRY:
1130  $chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
1131  break;
1132 
1133  default:
1134  $this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);
1135  }
1136  }
1137  $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry;
1138  break;
1139 
1140  default:
1141  $this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);
1142  }
1143  }
1144  $editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry;
1145  break;
1146 
1147  default:
1148  $this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement);
1149  }
1150  }
1151  $info['matroska']['chapters'][] = $editionentry_entry;
1152  break;
1153 
1154  default:
1155  $this->unhandledElement('chapters', __LINE__, $subelement);
1156  }
1157  }
1158  break;
1159 
1160  case self::EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure.
1161  $cluster_entry = array();
1162 
1163  while ($this->getEBMLelement($subelement, $element_data['end'], array(self::EBML_ID_CLUSTERSILENTTRACKS, self::EBML_ID_CLUSTERBLOCKGROUP, self::EBML_ID_CLUSTERSIMPLEBLOCK))) {
1164  switch ($subelement['id']) {
1165 
1166  case self::EBML_ID_CLUSTERTIMECODE:
1167  case self::EBML_ID_CLUSTERPOSITION:
1168  case self::EBML_ID_CLUSTERPREVSIZE:
1169  $cluster_entry[$subelement['id_name']] = Helper::BigEndian2Int($subelement['data']);
1170  break;
1171 
1172  case self::EBML_ID_CLUSTERSILENTTRACKS:
1173  $cluster_silent_tracks = array();
1174 
1175  while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
1176  switch ($sub_subelement['id']) {
1177 
1178  case self::EBML_ID_CLUSTERSILENTTRACKNUMBER:
1179  $cluster_silent_tracks[] = Helper::BigEndian2Int($sub_subelement['data']);
1180  break;
1181 
1182  default:
1183  $this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement);
1184  }
1185  }
1186  $cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks;
1187  break;
1188 
1189  case self::EBML_ID_CLUSTERBLOCKGROUP:
1190  $cluster_block_group = array('offset' => $this->current_offset);
1191 
1192  while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(self::EBML_ID_CLUSTERBLOCK))) {
1193  switch ($sub_subelement['id']) {
1194 
1195  case self::EBML_ID_CLUSTERBLOCK:
1196  $cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, self::EBML_ID_CLUSTERBLOCK, $info);
1197  break;
1198 
1199  case self::EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int
1200  case self::EBML_ID_CLUSTERBLOCKDURATION: // unsigned-int
1201  $cluster_block_group[$sub_subelement['id_name']] = Helper::BigEndian2Int($sub_subelement['data']);
1202  break;
1203 
1204  case self::EBML_ID_CLUSTERREFERENCEBLOCK: // signed-int
1205  $cluster_block_group[$sub_subelement['id_name']][] = Helper::BigEndian2Int($sub_subelement['data'], false, true);
1206  break;
1207 
1208  case self::EBML_ID_CLUSTERCODECSTATE:
1209  $cluster_block_group[$sub_subelement['id_name']] = Helper::trimNullByte($sub_subelement['data']);
1210  break;
1211 
1212  default:
1213  $this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement);
1214  }
1215  }
1216  $cluster_entry[$subelement['id_name']][] = $cluster_block_group;
1217  break;
1218 
1219  case self::EBML_ID_CLUSTERSIMPLEBLOCK:
1220  $cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, self::EBML_ID_CLUSTERSIMPLEBLOCK, $info);
1221  break;
1222 
1223  default:
1224  $this->unhandledElement('cluster', __LINE__, $subelement);
1225  }
1226  $this->current_offset = $subelement['end'];
1227  }
1228  if (!self::$hide_clusters) {
1229  $info['matroska']['cluster'][] = $cluster_entry;
1230  }
1231 
1232  // check to see if all the data we need exists already, if so, break out of the loop
1233  if (!self::$parse_whole_file) {
1234  if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
1235  if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
1236  if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {
1237  return;
1238  }
1239  }
1240  }
1241  }
1242  break;
1243 
1244  default:
1245  $this->unhandledElement('segment', __LINE__, $element_data);
1246  }
1247  }
1248  break;
1249 
1250  default:
1251  $this->unhandledElement('root', __LINE__, $top_element);
1252  }
1253  }
1254  }
HandleEMBLClusterBlock($element, $block_type, &$info)
Definition: Matroska.php:1466
static BigEndian2Float($byteword)
ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic.
Definition: Helper.php:290
unhandledElement($type, $line, $element)
Definition: Matroska.php:1388
$info
Definition: example_052.php:80
Create styles array
The data for the language used.
getEBMLelement(&$element, $parent_end, $get_data=false)
Definition: Matroska.php:1344
static trimNullByte($string)
Definition: Helper.php:1811
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
Definition: Helper.php:374
saveAttachment(&$ThisFileInfoIndex, $filename, $offset, $length)
const ATTACHMENTS_INLINE
Definition: GetId3Core.php:65
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ readEBMLelementData()

GetId3\Module\AudioVideo\Matroska::readEBMLelementData (   $length)
private
Parameters
type$length
Returns
type

Definition at line 1329 of file Matroska.php.

References $data.

Referenced by GetId3\Module\AudioVideo\Matroska\getEBMLelement(), and GetId3\Module\AudioVideo\Matroska\HandleEMBLClusterBlock().

1330  {
1331  $data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length);
1332  $this->current_offset += $length;
1333 
1334  return $data;
1335  }
+ Here is the caller graph for this function:

◆ readEBMLint()

GetId3\Module\AudioVideo\Matroska::readEBMLint ( )
private
Returns
type
Exceptions
Exception

Definition at line 1291 of file Matroska.php.

References GetId3\Module\AudioVideo\Matroska\$EBMLbuffer_offset.

Referenced by GetId3\Module\AudioVideo\Matroska\getEBMLelement(), and GetId3\Module\AudioVideo\Matroska\HandleEMBLClusterBlock().

1292  {
1293  $actual_offset = $this->current_offset - $this->EBMLbuffer_offset;
1294 
1295  // get length of integer
1296  $first_byte_int = ord($this->EBMLbuffer[$actual_offset]);
1297  if (0x80 & $first_byte_int) {
1298  $length = 1;
1299  } elseif (0x40 & $first_byte_int) {
1300  $length = 2;
1301  } elseif (0x20 & $first_byte_int) {
1302  $length = 3;
1303  } elseif (0x10 & $first_byte_int) {
1304  $length = 4;
1305  } elseif (0x08 & $first_byte_int) {
1306  $length = 5;
1307  } elseif (0x04 & $first_byte_int) {
1308  $length = 6;
1309  } elseif (0x02 & $first_byte_int) {
1310  $length = 7;
1311  } elseif (0x01 & $first_byte_int) {
1312  $length = 8;
1313  } else {
1314  throw new DefaultException('invalid EBML integer (leading 0x00) at '.$this->current_offset);
1315  }
1316 
1317  // read
1318  $int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length));
1319  $this->current_offset += $length;
1320 
1321  return $int_value;
1322  }
+ Here is the caller graph for this function:

◆ unhandledElement()

GetId3\Module\AudioVideo\Matroska::unhandledElement (   $type,
  $line,
  $element 
)
private
Parameters
type$type
type$line
type$element

Definition at line 1388 of file Matroska.php.

Referenced by GetId3\Module\AudioVideo\Matroska\HandleEMBLSimpleTag(), and GetId3\Module\AudioVideo\Matroska\parseEBML().

1389  {
1390  // warn only about unknown and missed elements, not about unuseful
1391  if (!in_array($element['id'], $this->unuseful_elements)) {
1392  $this->getid3->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']);
1393  }
1394 
1395  // increase offset for unparsed elements
1396  if (!isset($element['data'])) {
1397  $this->current_offset = $element['end'];
1398  }
1399  }
+ Here is the caller graph for this function:

Field Documentation

◆ $current_offset

◆ $EBMLbuffer

GetId3\Module\AudioVideo\Matroska::$EBMLbuffer = ''
private

Definition at line 242 of file Matroska.php.

◆ $EBMLbuffer_length

GetId3\Module\AudioVideo\Matroska::$EBMLbuffer_length = 0
private

Definition at line 252 of file Matroska.php.

◆ $EBMLbuffer_offset

GetId3\Module\AudioVideo\Matroska::$EBMLbuffer_offset = 0
private

Definition at line 247 of file Matroska.php.

Referenced by GetId3\Module\AudioVideo\Matroska\readEBMLint().

◆ $hide_clusters

GetId3\Module\AudioVideo\Matroska::$hide_clusters = true
static

Definition at line 230 of file Matroska.php.

◆ $parse_whole_file

GetId3\Module\AudioVideo\Matroska::$parse_whole_file = false
static

Definition at line 235 of file Matroska.php.

◆ $unuseful_elements

GetId3\Module\AudioVideo\Matroska::$unuseful_elements = array(self::EBML_ID_CRC32, self::EBML_ID_VOID)
private

Definition at line 262 of file Matroska.php.

◆ EBML_ID_ASPECTRATIOTYPE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_ASPECTRATIOTYPE = 0x14B3

Definition at line 114 of file Matroska.php.

◆ EBML_ID_ATTACHEDFILE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_ATTACHEDFILE = 0x21A7

Definition at line 124 of file Matroska.php.

◆ EBML_ID_ATTACHMENTLINK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_ATTACHMENTLINK = 0x3446

Definition at line 161 of file Matroska.php.

◆ EBML_ID_ATTACHMENTS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_ATTACHMENTS = 0x0941A469

Definition at line 41 of file Matroska.php.

◆ EBML_ID_AUDIO

const GetId3\Module\AudioVideo\Matroska::EBML_ID_AUDIO = 0x61

Definition at line 212 of file Matroska.php.

◆ EBML_ID_BITDEPTH

const GetId3\Module\AudioVideo\Matroska::EBML_ID_BITDEPTH = 0x2264

Definition at line 126 of file Matroska.php.

◆ EBML_ID_CHANNELPOSITIONS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHANNELPOSITIONS = 0x347B

Definition at line 163 of file Matroska.php.

◆ EBML_ID_CHANNELS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHANNELS = 0x1F

Definition at line 182 of file Matroska.php.

◆ EBML_ID_CHAPCOUNTRY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPCOUNTRY = 0x037E

Definition at line 69 of file Matroska.php.

◆ EBML_ID_CHAPLANGUAGE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPLANGUAGE = 0x037C

Definition at line 68 of file Matroska.php.

◆ EBML_ID_CHAPPROCESS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPPROCESS = 0x2944

Definition at line 145 of file Matroska.php.

◆ EBML_ID_CHAPPROCESSCODECID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPPROCESSCODECID = 0x2955

Definition at line 146 of file Matroska.php.

◆ EBML_ID_CHAPPROCESSCOMMAND

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPPROCESSCOMMAND = 0x2911

Definition at line 141 of file Matroska.php.

◆ EBML_ID_CHAPPROCESSDATA

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPPROCESSDATA = 0x2933

Definition at line 144 of file Matroska.php.

◆ EBML_ID_CHAPPROCESSPRIVATE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPPROCESSPRIVATE = 0x050D

Definition at line 77 of file Matroska.php.

◆ EBML_ID_CHAPPROCESSTIME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPPROCESSTIME = 0x2922

Definition at line 142 of file Matroska.php.

◆ EBML_ID_CHAPSTRING

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPSTRING = 0x05

Definition at line 168 of file Matroska.php.

◆ EBML_ID_CHAPTERATOM

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERATOM = 0x36

Definition at line 198 of file Matroska.php.

◆ EBML_ID_CHAPTERDISPLAY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERDISPLAY = 0x00

Definition at line 166 of file Matroska.php.

◆ EBML_ID_CHAPTERFLAGENABLED

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERFLAGENABLED = 0x0598

Definition at line 78 of file Matroska.php.

◆ EBML_ID_CHAPTERFLAGHIDDEN

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERFLAGHIDDEN = 0x18

Definition at line 178 of file Matroska.php.

◆ EBML_ID_CHAPTERPHYSICALEQUIV

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERPHYSICALEQUIV = 0x23C3

Definition at line 129 of file Matroska.php.

◆ EBML_ID_CHAPTERS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERS = 0x0043A770

Definition at line 35 of file Matroska.php.

◆ EBML_ID_CHAPTERSEGMENTEDITIONUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERSEGMENTEDITIONUID = 0x2EBC

Definition at line 154 of file Matroska.php.

◆ EBML_ID_CHAPTERSEGMENTUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERSEGMENTUID = 0x2E67

Definition at line 153 of file Matroska.php.

◆ EBML_ID_CHAPTERTIMEEND

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTIMEEND = 0x12

Definition at line 175 of file Matroska.php.

◆ EBML_ID_CHAPTERTIMESTART

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTIMESTART = 0x11

Definition at line 174 of file Matroska.php.

◆ EBML_ID_CHAPTERTRACK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTRACK = 0x0F

Definition at line 173 of file Matroska.php.

◆ EBML_ID_CHAPTERTRACKNUMBER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTRACKNUMBER = 0x09

Definition at line 171 of file Matroska.php.

◆ EBML_ID_CHAPTERTRANSLATE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTRANSLATE = 0x2924

Definition at line 143 of file Matroska.php.

◆ EBML_ID_CHAPTERTRANSLATECODEC

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTRANSLATECODEC = 0x29BF

Definition at line 148 of file Matroska.php.

◆ EBML_ID_CHAPTERTRANSLATEEDITIONUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTRANSLATEEDITIONUID = 0x29FC

Definition at line 149 of file Matroska.php.

◆ EBML_ID_CHAPTERTRANSLATEID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERTRANSLATEID = 0x29A5

Definition at line 147 of file Matroska.php.

◆ EBML_ID_CHAPTERUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CHAPTERUID = 0x33C4

Definition at line 159 of file Matroska.php.

◆ EBML_ID_CLUSTER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTER = 0x0F43B675

Definition at line 44 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCK = 0x21

Definition at line 184 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKADDID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKADDID = 0x6E

Definition at line 218 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKADDITIONAL

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKADDITIONAL = 0x25

Definition at line 188 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKADDITIONID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKADDITIONID = 0x4B

Definition at line 204 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKADDITIONS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKADDITIONS = 0x35A1

Definition at line 162 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKDURATION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKDURATION = 0x1B

Definition at line 180 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKGROUP

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKGROUP = 0x20

Definition at line 183 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKMORE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKMORE = 0x26

Definition at line 189 of file Matroska.php.

◆ EBML_ID_CLUSTERBLOCKVIRTUAL

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERBLOCKVIRTUAL = 0x22

Definition at line 185 of file Matroska.php.

◆ EBML_ID_CLUSTERCODECSTATE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERCODECSTATE = 0x24

Definition at line 187 of file Matroska.php.

◆ EBML_ID_CLUSTERDELAY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERDELAY = 0x4E

Definition at line 207 of file Matroska.php.

◆ EBML_ID_CLUSTERDURATION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERDURATION = 0x4F

Definition at line 208 of file Matroska.php.

◆ EBML_ID_CLUSTERENCRYPTEDBLOCK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERENCRYPTEDBLOCK = 0x2F

Definition at line 194 of file Matroska.php.

◆ EBML_ID_CLUSTERFRAMENUMBER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERFRAMENUMBER = 0x4D

Definition at line 206 of file Matroska.php.

◆ EBML_ID_CLUSTERLACENUMBER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERLACENUMBER = 0x4C

Definition at line 205 of file Matroska.php.

◆ EBML_ID_CLUSTERPOSITION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERPOSITION = 0x27

Definition at line 190 of file Matroska.php.

◆ EBML_ID_CLUSTERPREVSIZE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERPREVSIZE = 0x2B

Definition at line 192 of file Matroska.php.

◆ EBML_ID_CLUSTERREFERENCEBLOCK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERREFERENCEBLOCK = 0x7B

Definition at line 222 of file Matroska.php.

◆ EBML_ID_CLUSTERREFERENCEPRIORITY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERREFERENCEPRIORITY = 0x7A

Definition at line 221 of file Matroska.php.

◆ EBML_ID_CLUSTERREFERENCEVIRTUAL

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERREFERENCEVIRTUAL = 0x7D

Definition at line 223 of file Matroska.php.

◆ EBML_ID_CLUSTERSILENTTRACKNUMBER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERSILENTTRACKNUMBER = 0x18D7

Definition at line 123 of file Matroska.php.

◆ EBML_ID_CLUSTERSILENTTRACKS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERSILENTTRACKS = 0x1854

Definition at line 122 of file Matroska.php.

◆ EBML_ID_CLUSTERSIMPLEBLOCK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERSIMPLEBLOCK = 0x23

Definition at line 186 of file Matroska.php.

◆ EBML_ID_CLUSTERSLICES

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERSLICES = 0x0E

Definition at line 172 of file Matroska.php.

◆ EBML_ID_CLUSTERTIMECODE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERTIMECODE = 0x67

Definition at line 217 of file Matroska.php.

◆ EBML_ID_CLUSTERTIMESLICE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CLUSTERTIMESLICE = 0x68

Definition at line 213 of file Matroska.php.

◆ EBML_ID_CODECDECODEALL

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CODECDECODEALL = 0x2A

Definition at line 191 of file Matroska.php.

◆ EBML_ID_CODECDOWNLOADURL

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CODECDOWNLOADURL = 0x06B240

Definition at line 49 of file Matroska.php.

◆ EBML_ID_CODECID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CODECID = 0x06

Definition at line 169 of file Matroska.php.

◆ EBML_ID_CODECINFOURL

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CODECINFOURL = 0x1B4040

Definition at line 54 of file Matroska.php.

◆ EBML_ID_CODECNAME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CODECNAME = 0x058688

Definition at line 48 of file Matroska.php.

◆ EBML_ID_CODECPRIVATE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CODECPRIVATE = 0x23A2

Definition at line 127 of file Matroska.php.

◆ EBML_ID_CODECSETTINGS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CODECSETTINGS = 0x1A9697

Definition at line 53 of file Matroska.php.

◆ EBML_ID_COLOURSPACE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_COLOURSPACE = 0x0EB524

Definition at line 51 of file Matroska.php.

◆ EBML_ID_CONTENTCOMPALGO

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTCOMPALGO = 0x0254

Definition at line 59 of file Matroska.php.

◆ EBML_ID_CONTENTCOMPRESSION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTCOMPRESSION = 0x1034

Definition at line 102 of file Matroska.php.

◆ EBML_ID_CONTENTCOMPSETTINGS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTCOMPSETTINGS = 0x0255

Definition at line 60 of file Matroska.php.

◆ EBML_ID_CONTENTENCALGO

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCALGO = 0x07E1

Definition at line 91 of file Matroska.php.

◆ EBML_ID_CONTENTENCKEYID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCKEYID = 0x07E2

Definition at line 92 of file Matroska.php.

◆ EBML_ID_CONTENTENCODING

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCODING = 0x2240

Definition at line 125 of file Matroska.php.

◆ EBML_ID_CONTENTENCODINGORDER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCODINGORDER = 0x1031

Definition at line 99 of file Matroska.php.

◆ EBML_ID_CONTENTENCODINGS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCODINGS = 0x2D80

Definition at line 150 of file Matroska.php.

◆ EBML_ID_CONTENTENCODINGSCOPE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCODINGSCOPE = 0x1032

Definition at line 100 of file Matroska.php.

◆ EBML_ID_CONTENTENCODINGTYPE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCODINGTYPE = 0x1033

Definition at line 101 of file Matroska.php.

◆ EBML_ID_CONTENTENCRYPTION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTENCRYPTION = 0x1035

Definition at line 103 of file Matroska.php.

◆ EBML_ID_CONTENTSIGALGO

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTSIGALGO = 0x07E5

Definition at line 95 of file Matroska.php.

◆ EBML_ID_CONTENTSIGHASHALGO

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTSIGHASHALGO = 0x07E6

Definition at line 96 of file Matroska.php.

◆ EBML_ID_CONTENTSIGKEYID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTSIGKEYID = 0x07E4

Definition at line 94 of file Matroska.php.

◆ EBML_ID_CONTENTSIGNATURE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CONTENTSIGNATURE = 0x07E3

Definition at line 93 of file Matroska.php.

◆ EBML_ID_CRC32

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CRC32 = 0x3F

Definition at line 203 of file Matroska.php.

◆ EBML_ID_CUEBLOCKNUMBER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUEBLOCKNUMBER = 0x1378

Definition at line 106 of file Matroska.php.

◆ EBML_ID_CUECLUSTERPOSITION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUECLUSTERPOSITION = 0x71

Definition at line 219 of file Matroska.php.

◆ EBML_ID_CUECODECSTATE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUECODECSTATE = 0x6A

Definition at line 214 of file Matroska.php.

◆ EBML_ID_CUEPOINT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUEPOINT = 0x3B

Definition at line 202 of file Matroska.php.

◆ EBML_ID_CUEREFCLUSTER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUEREFCLUSTER = 0x17

Definition at line 177 of file Matroska.php.

◆ EBML_ID_CUEREFCODECSTATE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUEREFCODECSTATE = 0x6B

Definition at line 215 of file Matroska.php.

◆ EBML_ID_CUEREFERENCE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUEREFERENCE = 0x5B

Definition at line 210 of file Matroska.php.

◆ EBML_ID_CUEREFNUMBER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUEREFNUMBER = 0x135F

Definition at line 104 of file Matroska.php.

◆ EBML_ID_CUEREFTIME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUEREFTIME = 0x16

Definition at line 176 of file Matroska.php.

◆ EBML_ID_CUES

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUES = 0x0C53BB6B

Definition at line 43 of file Matroska.php.

◆ EBML_ID_CUETIME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUETIME = 0x33

Definition at line 196 of file Matroska.php.

◆ EBML_ID_CUETRACK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUETRACK = 0x77

Definition at line 220 of file Matroska.php.

◆ EBML_ID_CUETRACKPOSITIONS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_CUETRACKPOSITIONS = 0x37

Definition at line 199 of file Matroska.php.

◆ EBML_ID_DATEUTC

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DATEUTC = 0x0461

Definition at line 71 of file Matroska.php.

◆ EBML_ID_DEFAULTDURATION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DEFAULTDURATION = 0x03E383

Definition at line 47 of file Matroska.php.

◆ EBML_ID_DISPLAYHEIGHT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DISPLAYHEIGHT = 0x14BA

Definition at line 115 of file Matroska.php.

◆ EBML_ID_DISPLAYUNIT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DISPLAYUNIT = 0x14B2

Definition at line 113 of file Matroska.php.

◆ EBML_ID_DISPLAYWIDTH

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DISPLAYWIDTH = 0x14B0

Definition at line 112 of file Matroska.php.

◆ EBML_ID_DOCTYPE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DOCTYPE = 0x0282

Definition at line 61 of file Matroska.php.

◆ EBML_ID_DOCTYPEREADVERSION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DOCTYPEREADVERSION = 0x0285

Definition at line 62 of file Matroska.php.

◆ EBML_ID_DOCTYPEVERSION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DOCTYPEVERSION = 0x0287

Definition at line 64 of file Matroska.php.

◆ EBML_ID_DURATION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_DURATION = 0x0489

Definition at line 76 of file Matroska.php.

◆ EBML_ID_EBML

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EBML = 0x0A45DFA3

Definition at line 42 of file Matroska.php.

◆ EBML_ID_EBMLMAXIDLENGTH

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EBMLMAXIDLENGTH = 0x02F2

Definition at line 65 of file Matroska.php.

◆ EBML_ID_EBMLMAXSIZELENGTH

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EBMLMAXSIZELENGTH = 0x02F3

Definition at line 66 of file Matroska.php.

◆ EBML_ID_EBMLREADVERSION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EBMLREADVERSION = 0x02F7

Definition at line 67 of file Matroska.php.

◆ EBML_ID_EBMLVERSION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EBMLVERSION = 0x0286

Definition at line 63 of file Matroska.php.

◆ EBML_ID_EDITIONENTRY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EDITIONENTRY = 0x05B9

Definition at line 80 of file Matroska.php.

◆ EBML_ID_EDITIONFLAGDEFAULT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EDITIONFLAGDEFAULT = 0x05DB

Definition at line 83 of file Matroska.php.

◆ EBML_ID_EDITIONFLAGHIDDEN

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EDITIONFLAGHIDDEN = 0x05BD

Definition at line 82 of file Matroska.php.

◆ EBML_ID_EDITIONFLAGORDERED

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EDITIONFLAGORDERED = 0x05DD

Definition at line 84 of file Matroska.php.

◆ EBML_ID_EDITIONUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_EDITIONUID = 0x05BC

Definition at line 81 of file Matroska.php.

◆ EBML_ID_FILEDATA

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FILEDATA = 0x065C

Definition at line 85 of file Matroska.php.

◆ EBML_ID_FILEDESCRIPTION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FILEDESCRIPTION = 0x067E

Definition at line 89 of file Matroska.php.

◆ EBML_ID_FILEMIMETYPE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FILEMIMETYPE = 0x0660

Definition at line 86 of file Matroska.php.

◆ EBML_ID_FILENAME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FILENAME = 0x066E

Definition at line 87 of file Matroska.php.

◆ EBML_ID_FILEREFERRAL

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FILEREFERRAL = 0x0675

Definition at line 88 of file Matroska.php.

◆ EBML_ID_FILEUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FILEUID = 0x06AE

Definition at line 90 of file Matroska.php.

◆ EBML_ID_FLAGDEFAULT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FLAGDEFAULT = 0x08

Definition at line 170 of file Matroska.php.

◆ EBML_ID_FLAGENABLED

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FLAGENABLED = 0x39

Definition at line 200 of file Matroska.php.

◆ EBML_ID_FLAGFORCED

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FLAGFORCED = 0x15AA

Definition at line 119 of file Matroska.php.

◆ EBML_ID_FLAGINTERLACED

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FLAGINTERLACED = 0x1A

Definition at line 179 of file Matroska.php.

◆ EBML_ID_FLAGLACING

const GetId3\Module\AudioVideo\Matroska::EBML_ID_FLAGLACING = 0x1C

Definition at line 181 of file Matroska.php.

◆ EBML_ID_GAMMAVALUE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_GAMMAVALUE = 0x0FB523

Definition at line 52 of file Matroska.php.

◆ EBML_ID_INFO

const GetId3\Module\AudioVideo\Matroska::EBML_ID_INFO = 0x0549A966

Definition at line 38 of file Matroska.php.

◆ EBML_ID_LANGUAGE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_LANGUAGE = 0x02B59C

Definition at line 45 of file Matroska.php.

◆ EBML_ID_MAXBLOCKADDITIONID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_MAXBLOCKADDITIONID = 0x15EE

Definition at line 120 of file Matroska.php.

◆ EBML_ID_MAXCACHE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_MAXCACHE = 0x2DF8

Definition at line 152 of file Matroska.php.

◆ EBML_ID_MINCACHE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_MINCACHE = 0x2DE7

Definition at line 151 of file Matroska.php.

◆ EBML_ID_MUXINGAPP

const GetId3\Module\AudioVideo\Matroska::EBML_ID_MUXINGAPP = 0x0D80

Definition at line 97 of file Matroska.php.

◆ EBML_ID_NAME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_NAME = 0x136E

Definition at line 105 of file Matroska.php.

◆ EBML_ID_NEXTFILENAME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_NEXTFILENAME = 0x1E83BB

Definition at line 57 of file Matroska.php.

◆ EBML_ID_NEXTUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_NEXTUID = 0x1EB923

Definition at line 58 of file Matroska.php.

◆ EBML_ID_OUTPUTSAMPLINGFREQUENCY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_OUTPUTSAMPLINGFREQUENCY = 0x38B5

Definition at line 164 of file Matroska.php.

◆ EBML_ID_PIXELCROPBOTTOM

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PIXELCROPBOTTOM = 0x14AA

Definition at line 111 of file Matroska.php.

◆ EBML_ID_PIXELCROPLEFT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PIXELCROPLEFT = 0x14CC

Definition at line 117 of file Matroska.php.

◆ EBML_ID_PIXELCROPRIGHT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PIXELCROPRIGHT = 0x14DD

Definition at line 118 of file Matroska.php.

◆ EBML_ID_PIXELCROPTOP

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PIXELCROPTOP = 0x14BB

Definition at line 116 of file Matroska.php.

◆ EBML_ID_PIXELHEIGHT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PIXELHEIGHT = 0x3A

Definition at line 201 of file Matroska.php.

◆ EBML_ID_PIXELWIDTH

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PIXELWIDTH = 0x30

Definition at line 195 of file Matroska.php.

◆ EBML_ID_PREVFILENAME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PREVFILENAME = 0x1C83AB

Definition at line 55 of file Matroska.php.

◆ EBML_ID_PREVUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_PREVUID = 0x1CB923

Definition at line 56 of file Matroska.php.

◆ EBML_ID_SAMPLINGFREQUENCY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SAMPLINGFREQUENCY = 0x35

Definition at line 197 of file Matroska.php.

◆ EBML_ID_SEEK

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEEK = 0x0DBB

Definition at line 98 of file Matroska.php.

◆ EBML_ID_SEEKHEAD

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEEKHEAD = 0x014D9B74

Definition at line 36 of file Matroska.php.

◆ EBML_ID_SEEKID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEEKID = 0x13AB

Definition at line 108 of file Matroska.php.

◆ EBML_ID_SEEKPOSITION

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEEKPOSITION = 0x13AC

Definition at line 109 of file Matroska.php.

◆ EBML_ID_SEGMENT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEGMENT = 0x08538067

Definition at line 40 of file Matroska.php.

◆ EBML_ID_SEGMENTFAMILY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEGMENTFAMILY = 0x0444

Definition at line 70 of file Matroska.php.

◆ EBML_ID_SEGMENTFILENAME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEGMENTFILENAME = 0x3384

Definition at line 157 of file Matroska.php.

◆ EBML_ID_SEGMENTUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SEGMENTUID = 0x33A4

Definition at line 158 of file Matroska.php.

◆ EBML_ID_SIMPLETAG

const GetId3\Module\AudioVideo\Matroska::EBML_ID_SIMPLETAG = 0x27C8

Definition at line 139 of file Matroska.php.

◆ EBML_ID_STEREOMODE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_STEREOMODE = 0x13B8

Definition at line 110 of file Matroska.php.

◆ EBML_ID_TAG

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAG = 0x3373

Definition at line 156 of file Matroska.php.

◆ EBML_ID_TAGATTACHMENTUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGATTACHMENTUID = 0x23C6

Definition at line 132 of file Matroska.php.

◆ EBML_ID_TAGBINARY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGBINARY = 0x0485

Definition at line 74 of file Matroska.php.

◆ EBML_ID_TAGCHAPTERUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGCHAPTERUID = 0x23C4

Definition at line 130 of file Matroska.php.

◆ EBML_ID_TAGDEFAULT

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGDEFAULT = 0x0484

Definition at line 73 of file Matroska.php.

◆ EBML_ID_TAGEDITIONUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGEDITIONUID = 0x23C9

Definition at line 133 of file Matroska.php.

◆ EBML_ID_TAGLANGUAGE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGLANGUAGE = 0x047A

Definition at line 72 of file Matroska.php.

◆ EBML_ID_TAGNAME

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGNAME = 0x05A3

Definition at line 79 of file Matroska.php.

◆ EBML_ID_TAGS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGS = 0x0254C367

Definition at line 37 of file Matroska.php.

◆ EBML_ID_TAGSTRING

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGSTRING = 0x0487

Definition at line 75 of file Matroska.php.

◆ EBML_ID_TAGTRACKUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TAGTRACKUID = 0x23C5

Definition at line 131 of file Matroska.php.

◆ EBML_ID_TARGETS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TARGETS = 0x23C0

Definition at line 128 of file Matroska.php.

◆ EBML_ID_TARGETTYPE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TARGETTYPE = 0x23CA

Definition at line 134 of file Matroska.php.

◆ EBML_ID_TARGETTYPEVALUE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TARGETTYPEVALUE = 0x28CA

Definition at line 140 of file Matroska.php.

◆ EBML_ID_TIMECODESCALE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TIMECODESCALE = 0x0AD7B1

Definition at line 50 of file Matroska.php.

◆ EBML_ID_TITLE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TITLE = 0x3BA9

Definition at line 165 of file Matroska.php.

◆ EBML_ID_TRACKENTRY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKENTRY = 0x2E

Definition at line 193 of file Matroska.php.

◆ EBML_ID_TRACKNUMBER

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKNUMBER = 0x57

Definition at line 209 of file Matroska.php.

◆ EBML_ID_TRACKOFFSET

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKOFFSET = 0x137F

Definition at line 107 of file Matroska.php.

◆ EBML_ID_TRACKOVERLAY

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKOVERLAY = 0x2FAB

Definition at line 155 of file Matroska.php.

◆ EBML_ID_TRACKS

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKS = 0x0654AE6B

Definition at line 39 of file Matroska.php.

◆ EBML_ID_TRACKTIMECODESCALE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKTIMECODESCALE = 0x03314F

Definition at line 46 of file Matroska.php.

◆ EBML_ID_TRACKTRANSLATE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKTRANSLATE = 0x2624

Definition at line 135 of file Matroska.php.

◆ EBML_ID_TRACKTRANSLATECODEC

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKTRANSLATECODEC = 0x26BF

Definition at line 137 of file Matroska.php.

◆ EBML_ID_TRACKTRANSLATEEDITIONUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKTRANSLATEEDITIONUID = 0x26FC

Definition at line 138 of file Matroska.php.

◆ EBML_ID_TRACKTRANSLATETRACKID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKTRANSLATETRACKID = 0x26A5

Definition at line 136 of file Matroska.php.

◆ EBML_ID_TRACKTYPE

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKTYPE = 0x03

Definition at line 167 of file Matroska.php.

◆ EBML_ID_TRACKUID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_TRACKUID = 0x33C5

Definition at line 160 of file Matroska.php.

◆ EBML_ID_VIDEO

const GetId3\Module\AudioVideo\Matroska::EBML_ID_VIDEO = 0x60

Definition at line 211 of file Matroska.php.

◆ EBML_ID_VOID

const GetId3\Module\AudioVideo\Matroska::EBML_ID_VOID = 0x6C

Definition at line 216 of file Matroska.php.

◆ EBML_ID_WRITINGAPP

const GetId3\Module\AudioVideo\Matroska::EBML_ID_WRITINGAPP = 0x1741

Definition at line 121 of file Matroska.php.


The documentation for this class was generated from the following file: