wp/wp-includes/ID3/module.audio-video.matroska.php
author ymh <ymh.work@gmail.com>
Wed, 06 Nov 2013 03:21:17 +0000
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
permissions -rw-r--r--
first import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/// getID3() by James Heinrich <info@getid3.org>               //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
//  available at http://getid3.sourceforge.net                 //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
//            or http://www.getid3.org                         //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
// See readme.txt for more details                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
// module.audio-video.matriska.php                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
// module for analyzing Matroska containers                    //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
// dependencies: NONE                                          //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
//                                                            ///
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
define('EBML_ID_CHAPTERS',                  0x0043A770); // [10][43][A7][70] -- A system to define basic menus and partition data. For more detailed information, look at the Chapters Explanation.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
define('EBML_ID_SEEKHEAD',                  0x014D9B74); // [11][4D][9B][74] -- Contains the position of other level 1 elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
define('EBML_ID_TAGS',                      0x0254C367); // [12][54][C3][67] -- Element containing elements specific to Tracks/Chapters. A list of valid tags can be found <http://www.matroska.org/technical/specs/tagging/index.html>.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
define('EBML_ID_INFO',                      0x0549A966); // [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
define('EBML_ID_TRACKS',                    0x0654AE6B); // [16][54][AE][6B] -- A top-level block of information with many tracks described.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
define('EBML_ID_SEGMENT',                   0x08538067); // [18][53][80][67] -- This element contains all other top-level (level 1) elements. Typically a Matroska file is composed of 1 segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
define('EBML_ID_ATTACHMENTS',               0x0941A469); // [19][41][A4][69] -- Contain attached files.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
define('EBML_ID_EBML',                      0x0A45DFA3); // [1A][45][DF][A3] -- Set the EBML characteristics of the data to follow. Each EBML document has to start with this.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
define('EBML_ID_CUES',                      0x0C53BB6B); // [1C][53][BB][6B] -- A top-level element to speed seeking access. All entries are local to the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
define('EBML_ID_CLUSTER',                   0x0F43B675); // [1F][43][B6][75] -- The lower level element containing the (monolithic) Block structure.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
define('EBML_ID_LANGUAGE',                    0x02B59C); //     [22][B5][9C] -- Specifies the language of the track in the Matroska languages form.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
define('EBML_ID_TRACKTIMECODESCALE',          0x03314F); //     [23][31][4F] -- The scale to apply on this track to work at normal speed in relation with other tracks (mostly used to adjust video speed when the audio length differs).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
define('EBML_ID_DEFAULTDURATION',             0x03E383); //     [23][E3][83] -- Number of nanoseconds (i.e. not scaled) per frame.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
define('EBML_ID_CODECNAME',                   0x058688); //     [25][86][88] -- A human-readable string specifying the codec.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
define('EBML_ID_CODECDOWNLOADURL',            0x06B240); //     [26][B2][40] -- A URL to download about the codec used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
define('EBML_ID_TIMECODESCALE',               0x0AD7B1); //     [2A][D7][B1] -- Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are expressed in milliseconds).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
define('EBML_ID_COLOURSPACE',                 0x0EB524); //     [2E][B5][24] -- Same value as in AVI (32 bits).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
define('EBML_ID_GAMMAVALUE',                  0x0FB523); //     [2F][B5][23] -- Gamma Value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
define('EBML_ID_CODECSETTINGS',               0x1A9697); //     [3A][96][97] -- A string describing the encoding setting used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
define('EBML_ID_CODECINFOURL',                0x1B4040); //     [3B][40][40] -- A URL to find information about the codec used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
define('EBML_ID_PREVFILENAME',                0x1C83AB); //     [3C][83][AB] -- An escaped filename corresponding to the previous segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
define('EBML_ID_PREVUID',                     0x1CB923); //     [3C][B9][23] -- A unique ID to identify the previous chained segment (128 bits).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
define('EBML_ID_NEXTFILENAME',                0x1E83BB); //     [3E][83][BB] -- An escaped filename corresponding to the next segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
define('EBML_ID_NEXTUID',                     0x1EB923); //     [3E][B9][23] -- A unique ID to identify the next chained segment (128 bits).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
define('EBML_ID_CONTENTCOMPALGO',               0x0254); //         [42][54] -- The compression algorithm used. Algorithms that have been specified so far are:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
define('EBML_ID_CONTENTCOMPSETTINGS',           0x0255); //         [42][55] -- Settings that might be needed by the decompressor. For Header Stripping (ContentCompAlgo=3), the bytes that were removed from the beggining of each frames of the track.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
define('EBML_ID_DOCTYPE',                       0x0282); //         [42][82] -- A string that describes the type of document that follows this EBML header ('matroska' in our case).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
define('EBML_ID_DOCTYPEREADVERSION',            0x0285); //         [42][85] -- The minimum DocType version an interpreter has to support to read this file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
define('EBML_ID_EBMLVERSION',                   0x0286); //         [42][86] -- The version of EBML parser used to create the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
define('EBML_ID_DOCTYPEVERSION',                0x0287); //         [42][87] -- The version of DocType interpreter used to create the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
define('EBML_ID_EBMLMAXIDLENGTH',               0x02F2); //         [42][F2] -- The maximum length of the IDs you'll find in this file (4 or less in Matroska).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
define('EBML_ID_EBMLMAXSIZELENGTH',             0x02F3); //         [42][F3] -- The maximum length of the sizes you'll find in this file (8 or less in Matroska). This does not override the element size indicated at the beginning of an element. Elements that have an indicated size which is larger than what is allowed by EBMLMaxSizeLength shall be considered invalid.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
define('EBML_ID_EBMLREADVERSION',               0x02F7); //         [42][F7] -- The minimum EBML version a parser has to support to read this file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
define('EBML_ID_CHAPLANGUAGE',                  0x037C); //         [43][7C] -- The languages corresponding to the string, in the bibliographic ISO-639-2 form.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
define('EBML_ID_CHAPCOUNTRY',                   0x037E); //         [43][7E] -- The countries corresponding to the string, same 2 octets as in Internet domains.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
define('EBML_ID_SEGMENTFAMILY',                 0x0444); //         [44][44] -- A randomly generated unique ID that all segments related to each other must use (128 bits).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
define('EBML_ID_DATEUTC',                       0x0461); //         [44][61] -- Date of the origin of timecode (value 0), i.e. production date.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
define('EBML_ID_TAGLANGUAGE',                   0x047A); //         [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
define('EBML_ID_TAGDEFAULT',                    0x0484); //         [44][84] -- Indication to know if this is the default/original language to use for the given tag.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
define('EBML_ID_TAGBINARY',                     0x0485); //         [44][85] -- The values of the Tag if it is binary. Note that this cannot be used in the same SimpleTag as TagString.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
define('EBML_ID_TAGSTRING',                     0x0487); //         [44][87] -- The value of the Tag.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
define('EBML_ID_DURATION',                      0x0489); //         [44][89] -- Duration of the segment (based on TimecodeScale).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
define('EBML_ID_CHAPPROCESSPRIVATE',            0x050D); //         [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the "DVD level" equivalent.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
define('EBML_ID_CHAPTERFLAGENABLED',            0x0598); //         [45][98] -- Specify wether the chapter is enabled. It can be enabled/disabled by a Control Track. When disabled, the movie should skip all the content between the TimeStart and TimeEnd of this chapter.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
define('EBML_ID_TAGNAME',                       0x05A3); //         [45][A3] -- The name of the Tag that is going to be stored.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
define('EBML_ID_EDITIONENTRY',                  0x05B9); //         [45][B9] -- Contains all information about a segment edition.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
define('EBML_ID_EDITIONUID',                    0x05BC); //         [45][BC] -- A unique ID to identify the edition. It's useful for tagging an edition.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
define('EBML_ID_EDITIONFLAGHIDDEN',             0x05BD); //         [45][BD] -- If an edition is hidden (1), it should not be available to the user interface (but still to Control Tracks).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
define('EBML_ID_EDITIONFLAGDEFAULT',            0x05DB); //         [45][DB] -- If a flag is set (1) the edition should be used as the default one.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
define('EBML_ID_EDITIONFLAGORDERED',            0x05DD); //         [45][DD] -- Specify if the chapters can be defined multiple times and the order to play them is enforced.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
define('EBML_ID_FILEDATA',                      0x065C); //         [46][5C] -- The data of the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
define('EBML_ID_FILEMIMETYPE',                  0x0660); //         [46][60] -- MIME type of the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
define('EBML_ID_FILENAME',                      0x066E); //         [46][6E] -- Filename of the attached file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
define('EBML_ID_FILEREFERRAL',                  0x0675); //         [46][75] -- A binary value that a track/codec can refer to when the attachment is needed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
define('EBML_ID_FILEDESCRIPTION',               0x067E); //         [46][7E] -- A human-friendly name for the attached file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
define('EBML_ID_FILEUID',                       0x06AE); //         [46][AE] -- Unique ID representing the file, as random as possible.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
define('EBML_ID_CONTENTENCALGO',                0x07E1); //         [47][E1] -- The encryption algorithm used. The value '0' means that the contents have not been encrypted but only signed. Predefined values:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
define('EBML_ID_CONTENTENCKEYID',               0x07E2); //         [47][E2] -- For public key algorithms this is the ID of the public key the the data was encrypted with.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
define('EBML_ID_CONTENTSIGNATURE',              0x07E3); //         [47][E3] -- A cryptographic signature of the contents.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
define('EBML_ID_CONTENTSIGKEYID',               0x07E4); //         [47][E4] -- This is the ID of the private key the data was signed with.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
define('EBML_ID_CONTENTSIGALGO',                0x07E5); //         [47][E5] -- The algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
define('EBML_ID_CONTENTSIGHASHALGO',            0x07E6); //         [47][E6] -- The hash algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
define('EBML_ID_MUXINGAPP',                     0x0D80); //         [4D][80] -- Muxing application or library ("libmatroska-0.4.3").
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
define('EBML_ID_SEEK',                          0x0DBB); //         [4D][BB] -- Contains a single seek entry to an EBML element.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
define('EBML_ID_CONTENTENCODINGORDER',          0x1031); //         [50][31] -- Tells when this modification was used during encoding/muxing starting with 0 and counting upwards. The decoder/demuxer has to start with the highest order number it finds and work its way down. This value has to be unique over all ContentEncodingOrder elements in the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
define('EBML_ID_CONTENTENCODINGSCOPE',          0x1032); //         [50][32] -- A bit field that describes which elements have been modified in this way. Values (big endian) can be OR'ed. Possible values:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
define('EBML_ID_CONTENTENCODINGTYPE',           0x1033); //         [50][33] -- A value describing what kind of transformation has been done. Possible values:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
define('EBML_ID_CONTENTCOMPRESSION',            0x1034); //         [50][34] -- Settings describing the compression used. Must be present if the value of ContentEncodingType is 0 and absent otherwise. Each block must be decompressable even if no previous block is available in order not to prevent seeking.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
define('EBML_ID_CONTENTENCRYPTION',             0x1035); //         [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
define('EBML_ID_CUEREFNUMBER',                  0x135F); //         [53][5F] -- Number of the referenced Block of Track X in the specified Cluster.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
define('EBML_ID_NAME',                          0x136E); //         [53][6E] -- A human-readable track name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
define('EBML_ID_CUEBLOCKNUMBER',                0x1378); //         [53][78] -- Number of the Block in the specified Cluster.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
define('EBML_ID_TRACKOFFSET',                   0x137F); //         [53][7F] -- A value to add to the Block's Timecode. This can be used to adjust the playback offset of a track.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
define('EBML_ID_SEEKID',                        0x13AB); //         [53][AB] -- The binary ID corresponding to the element name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
define('EBML_ID_SEEKPOSITION',                  0x13AC); //         [53][AC] -- The position of the element in the segment in octets (0 = first level 1 element).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
define('EBML_ID_STEREOMODE',                    0x13B8); //         [53][B8] -- Stereo-3D video mode.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
define('EBML_ID_OLDSTEREOMODE',                 0x13B9); //         [53][B9] -- Bogus StereoMode value used in old versions of libmatroska. DO NOT USE. (0: mono, 1: right eye, 2: left eye, 3: both eyes).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
define('EBML_ID_PIXELCROPBOTTOM',               0x14AA); //         [54][AA] -- The number of video pixels to remove at the bottom of the image (for HDTV content).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
define('EBML_ID_DISPLAYWIDTH',                  0x14B0); //         [54][B0] -- Width of the video frames to display.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
define('EBML_ID_DISPLAYUNIT',                   0x14B2); //         [54][B2] -- Type of the unit for DisplayWidth/Height (0: pixels, 1: centimeters, 2: inches).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
define('EBML_ID_ASPECTRATIOTYPE',               0x14B3); //         [54][B3] -- Specify the possible modifications to the aspect ratio (0: free resizing, 1: keep aspect ratio, 2: fixed).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
define('EBML_ID_DISPLAYHEIGHT',                 0x14BA); //         [54][BA] -- Height of the video frames to display.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
define('EBML_ID_PIXELCROPTOP',                  0x14BB); //         [54][BB] -- The number of video pixels to remove at the top of the image.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
define('EBML_ID_PIXELCROPLEFT',                 0x14CC); //         [54][CC] -- The number of video pixels to remove on the left of the image.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
define('EBML_ID_PIXELCROPRIGHT',                0x14DD); //         [54][DD] -- The number of video pixels to remove on the right of the image.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
define('EBML_ID_FLAGFORCED',                    0x15AA); //         [55][AA] -- Set if that track MUST be used during playback. There can be many forced track for a kind (audio, video or subs), the player should select the one which language matches the user preference or the default + forced track. Overlay MAY happen between a forced and non-forced track of the same kind.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
define('EBML_ID_MAXBLOCKADDITIONID',            0x15EE); //         [55][EE] -- The maximum value of BlockAddID. A value 0 means there is no BlockAdditions for this track.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
define('EBML_ID_WRITINGAPP',                    0x1741); //         [57][41] -- Writing application ("mkvmerge-0.3.3").
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
define('EBML_ID_CLUSTERSILENTTRACKS',           0x1854); //         [58][54] -- The list of tracks that are not used in that part of the stream. It is useful when using overlay tracks on seeking. Then you should decide what track to use.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
define('EBML_ID_CLUSTERSILENTTRACKNUMBER',      0x18D7); //         [58][D7] -- One of the track number that are not used from now on in the stream. It could change later if not specified as silent in a further Cluster.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
define('EBML_ID_ATTACHEDFILE',                  0x21A7); //         [61][A7] -- An attached file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
define('EBML_ID_CONTENTENCODING',               0x2240); //         [62][40] -- Settings for one content encoding like compression or encryption.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
define('EBML_ID_BITDEPTH',                      0x2264); //         [62][64] -- Bits per sample, mostly used for PCM.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
define('EBML_ID_CODECPRIVATE',                  0x23A2); //         [63][A2] -- Private data only known to the codec.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
define('EBML_ID_TARGETS',                       0x23C0); //         [63][C0] -- Contain all UIDs where the specified meta data apply. It is void to describe everything in the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
define('EBML_ID_CHAPTERPHYSICALEQUIV',          0x23C3); //         [63][C3] -- Specify the physical equivalent of this ChapterAtom like "DVD" (60) or "SIDE" (50), see complete list of values.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
define('EBML_ID_TAGCHAPTERUID',                 0x23C4); //         [63][C4] -- A unique ID to identify the Chapter(s) the tags belong to. If the value is 0 at this level, the tags apply to all chapters in the Segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
define('EBML_ID_TAGTRACKUID',                   0x23C5); //         [63][C5] -- A unique ID to identify the Track(s) the tags belong to. If the value is 0 at this level, the tags apply to all tracks in the Segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
define('EBML_ID_TAGATTACHMENTUID',              0x23C6); //         [63][C6] -- A unique ID to identify the Attachment(s) the tags belong to. If the value is 0 at this level, the tags apply to all the attachments in the Segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
define('EBML_ID_TAGEDITIONUID',                 0x23C9); //         [63][C9] -- A unique ID to identify the EditionEntry(s) the tags belong to. If the value is 0 at this level, the tags apply to all editions in the Segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
define('EBML_ID_TARGETTYPE',                    0x23CA); //         [63][CA] -- An informational string that can be used to display the logical level of the target like "ALBUM", "TRACK", "MOVIE", "CHAPTER", etc (see TargetType).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
define('EBML_ID_TRACKTRANSLATE',                0x2624); //         [66][24] -- The track identification for the given Chapter Codec.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
define('EBML_ID_TRACKTRANSLATETRACKID',         0x26A5); //         [66][A5] -- The binary value used to represent this track in the chapter codec data. The format depends on the ChapProcessCodecID used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
define('EBML_ID_TRACKTRANSLATECODEC',           0x26BF); //         [66][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
define('EBML_ID_TRACKTRANSLATEEDITIONUID',      0x26FC); //         [66][FC] -- Specify an edition UID on which this translation applies. When not specified, it means for all editions found in the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
define('EBML_ID_SIMPLETAG',                     0x27C8); //         [67][C8] -- Contains general information about the target.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
define('EBML_ID_TARGETTYPEVALUE',               0x28CA); //         [68][CA] -- A number to indicate the logical level of the target (see TargetType).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
define('EBML_ID_CHAPPROCESSCOMMAND',            0x2911); //         [69][11] -- Contains all the commands associated to the Atom.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
define('EBML_ID_CHAPPROCESSTIME',               0x2922); //         [69][22] -- Defines when the process command should be handled (0: during the whole chapter, 1: before starting playback, 2: after playback of the chapter).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
define('EBML_ID_CHAPTERTRANSLATE',              0x2924); //         [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
define('EBML_ID_CHAPPROCESSDATA',               0x2933); //         [69][33] -- Contains the command information. The data should be interpreted depending on the ChapProcessCodecID value. For ChapProcessCodecID = 1, the data correspond to the binary DVD cell pre/post commands.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
define('EBML_ID_CHAPPROCESS',                   0x2944); //         [69][44] -- Contains all the commands associated to the Atom.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
define('EBML_ID_CHAPPROCESSCODECID',            0x2955); //         [69][55] -- Contains the type of the codec used for the processing. A value of 0 means native Matroska processing (to be defined), a value of 1 means the DVD command set is used. More codec IDs can be added later.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
define('EBML_ID_CHAPTERTRANSLATEID',            0x29A5); //         [69][A5] -- The binary value used to represent this segment in the chapter codec data. The format depends on the ChapProcessCodecID used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
define('EBML_ID_CHAPTERTRANSLATECODEC',         0x29BF); //         [69][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
define('EBML_ID_CHAPTERTRANSLATEEDITIONUID',    0x29FC); //         [69][FC] -- Specify an edition UID on which this correspondance applies. When not specified, it means for all editions found in the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
define('EBML_ID_CONTENTENCODINGS',              0x2D80); //         [6D][80] -- Settings for several content encoding mechanisms like compression or encryption.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
define('EBML_ID_MINCACHE',                      0x2DE7); //         [6D][E7] -- The minimum number of frames a player should be able to cache during playback. If set to 0, the reference pseudo-cache system is not used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
define('EBML_ID_MAXCACHE',                      0x2DF8); //         [6D][F8] -- The maximum cache size required to store referenced frames in and the current frame. 0 means no cache is needed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
define('EBML_ID_CHAPTERSEGMENTUID',             0x2E67); //         [6E][67] -- A segment to play in place of this chapter. Edition ChapterSegmentEditionUID should be used for this segment, otherwise no edition is used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
define('EBML_ID_CHAPTERSEGMENTEDITIONUID',      0x2EBC); //         [6E][BC] -- The edition to play from the segment linked in ChapterSegmentUID.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
define('EBML_ID_TRACKOVERLAY',                  0x2FAB); //         [6F][AB] -- Specify that this track is an overlay track for the Track specified (in the u-integer). That means when this track has a gap (see SilentTracks) the overlay track should be used instead. The order of multiple TrackOverlay matters, the first one is the one that should be used. If not found it should be the second, etc.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
define('EBML_ID_TAG',                           0x3373); //         [73][73] -- Element containing elements specific to Tracks/Chapters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
define('EBML_ID_SEGMENTFILENAME',               0x3384); //         [73][84] -- A filename corresponding to this segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
define('EBML_ID_SEGMENTUID',                    0x33A4); //         [73][A4] -- A randomly generated unique ID to identify the current segment between many others (128 bits).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
define('EBML_ID_CHAPTERUID',                    0x33C4); //         [73][C4] -- A unique ID to identify the Chapter.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
define('EBML_ID_TRACKUID',                      0x33C5); //         [73][C5] -- A unique ID to identify the Track. This should be kept the same when making a direct stream copy of the Track to another file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
define('EBML_ID_ATTACHMENTLINK',                0x3446); //         [74][46] -- The UID of an attachment that is used by this codec.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
define('EBML_ID_CLUSTERBLOCKADDITIONS',         0x35A1); //         [75][A1] -- Contain additional blocks to complete the main one. An EBML parser that has no knowledge of the Block structure could still see and use/skip these data.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
define('EBML_ID_CHANNELPOSITIONS',              0x347B); //         [7D][7B] -- Table of horizontal angles for each successive channel, see appendix.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
define('EBML_ID_OUTPUTSAMPLINGFREQUENCY',       0x38B5); //         [78][B5] -- Real output sampling frequency in Hz (used for SBR techniques).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
define('EBML_ID_TITLE',                         0x3BA9); //         [7B][A9] -- General name of the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
define('EBML_ID_CHAPTERDISPLAY',                  0x00); //             [80] -- Contains all possible strings to use for the chapter display.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
define('EBML_ID_TRACKTYPE',                       0x03); //             [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
define('EBML_ID_CHAPSTRING',                      0x05); //             [85] -- Contains the string to use as the chapter atom.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
define('EBML_ID_CODECID',                         0x06); //             [86] -- An ID corresponding to the codec, see the codec page for more info.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
define('EBML_ID_FLAGDEFAULT',                     0x08); //             [88] -- Set if that track (audio, video or subs) SHOULD be used if no language found matches the user preference.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
define('EBML_ID_CHAPTERTRACKNUMBER',              0x09); //             [89] -- UID of the Track to apply this chapter too. In the absense of a control track, choosing this chapter will select the listed Tracks and deselect unlisted tracks. Absense of this element indicates that the Chapter should be applied to any currently used Tracks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
define('EBML_ID_CLUSTERSLICES',                   0x0E); //             [8E] -- Contains slices description.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
define('EBML_ID_CHAPTERTRACK',                    0x0F); //             [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
define('EBML_ID_CHAPTERTIMESTART',                0x11); //             [91] -- Timecode of the start of Chapter (not scaled).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
define('EBML_ID_CHAPTERTIMEEND',                  0x12); //             [92] -- Timecode of the end of Chapter (timecode excluded, not scaled).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
define('EBML_ID_CUEREFTIME',                      0x16); //             [96] -- Timecode of the referenced Block.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
define('EBML_ID_CUEREFCLUSTER',                   0x17); //             [97] -- Position of the Cluster containing the referenced Block.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
define('EBML_ID_CHAPTERFLAGHIDDEN',               0x18); //             [98] -- If a chapter is hidden (1), it should not be available to the user interface (but still to Control Tracks).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
define('EBML_ID_FLAGINTERLACED',                  0x1A); //             [9A] -- Set if the video is interlaced.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
define('EBML_ID_CLUSTERBLOCKDURATION',            0x1B); //             [9B] -- The duration of the Block (based on TimecodeScale). This element is mandatory when DefaultDuration is set for the track. When not written and with no DefaultDuration, the value is assumed to be the difference between the timecode of this Block and the timecode of the next Block in "display" order (not coding order). This element can be useful at the end of a Track (as there is not other Block available), or when there is a break in a track like for subtitle tracks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
define('EBML_ID_FLAGLACING',                      0x1C); //             [9C] -- Set if the track may contain blocks using lacing.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
define('EBML_ID_CHANNELS',                        0x1F); //             [9F] -- Numbers of channels in the track.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
define('EBML_ID_CLUSTERBLOCKGROUP',               0x20); //             [A0] -- Basic container of information containing a single Block or BlockVirtual, and information specific to that Block/VirtualBlock.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
define('EBML_ID_CLUSTERBLOCK',                    0x21); //             [A1] -- Block containing the actual data to be rendered and a timecode relative to the Cluster Timecode.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
define('EBML_ID_CLUSTERBLOCKVIRTUAL',             0x22); //             [A2] -- A Block with no data. It must be stored in the stream at the place the real Block should be in display order.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
define('EBML_ID_CLUSTERSIMPLEBLOCK',              0x23); //             [A3] -- Similar to Block but without all the extra information, mostly used to reduced overhead when no extra feature is needed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
define('EBML_ID_CLUSTERCODECSTATE',               0x24); //             [A4] -- The new codec state to use. Data interpretation is private to the codec. This information should always be referenced by a seek entry.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
define('EBML_ID_CLUSTERBLOCKADDITIONAL',          0x25); //             [A5] -- Interpreted by the codec as it wishes (using the BlockAddID).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
define('EBML_ID_CLUSTERBLOCKMORE',                0x26); //             [A6] -- Contain the BlockAdditional and some parameters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
define('EBML_ID_CLUSTERPOSITION',                 0x27); //             [A7] -- Position of the Cluster in the segment (0 in live broadcast streams). It might help to resynchronise offset on damaged streams.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
define('EBML_ID_CODECDECODEALL',                  0x2A); //             [AA] -- The codec can decode potentially damaged data.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
define('EBML_ID_CLUSTERPREVSIZE',                 0x2B); //             [AB] -- Size of the previous Cluster, in octets. Can be useful for backward playing.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
define('EBML_ID_TRACKENTRY',                      0x2E); //             [AE] -- Describes a track with all elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
define('EBML_ID_CLUSTERENCRYPTEDBLOCK',           0x2F); //             [AF] -- Similar to SimpleBlock but the data inside the Block are Transformed (encrypt and/or signed).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
define('EBML_ID_PIXELWIDTH',                      0x30); //             [B0] -- Width of the encoded video frames in pixels.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
define('EBML_ID_CUETIME',                         0x33); //             [B3] -- Absolute timecode according to the segment time base.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
define('EBML_ID_SAMPLINGFREQUENCY',               0x35); //             [B5] -- Sampling frequency in Hz.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
define('EBML_ID_CHAPTERATOM',                     0x36); //             [B6] -- Contains the atom information to use as the chapter atom (apply to all tracks).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
define('EBML_ID_CUETRACKPOSITIONS',               0x37); //             [B7] -- Contain positions for different tracks corresponding to the timecode.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
define('EBML_ID_FLAGENABLED',                     0x39); //             [B9] -- Set if the track is used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
define('EBML_ID_PIXELHEIGHT',                     0x3A); //             [BA] -- Height of the encoded video frames in pixels.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
define('EBML_ID_CUEPOINT',                        0x3B); //             [BB] -- Contains all information relative to a seek point in the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
define('EBML_ID_CRC32',                           0x3F); //             [BF] -- The CRC is computed on all the data of the Master element it's in, regardless of its position. It's recommended to put the CRC value at the beggining of the Master element for easier reading. All level 1 elements should include a CRC-32.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
define('EBML_ID_CLUSTERBLOCKADDITIONID',          0x4B); //             [CB] -- The ID of the BlockAdditional element (0 is the main Block).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
define('EBML_ID_CLUSTERLACENUMBER',               0x4C); //             [CC] -- The reverse number of the frame in the lace (0 is the last frame, 1 is the next to last, etc). While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
define('EBML_ID_CLUSTERFRAMENUMBER',              0x4D); //             [CD] -- The number of the frame to generate from this lace with this delay (allow you to generate many frames from the same Block/Frame).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
define('EBML_ID_CLUSTERDELAY',                    0x4E); //             [CE] -- The (scaled) delay to apply to the element.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
define('EBML_ID_CLUSTERDURATION',                 0x4F); //             [CF] -- The (scaled) duration to apply to the element.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
define('EBML_ID_TRACKNUMBER',                     0x57); //             [D7] -- The track number as used in the Block Header (using more than 127 tracks is not encouraged, though the design allows an unlimited number).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
define('EBML_ID_CUEREFERENCE',                    0x5B); //             [DB] -- The Clusters containing the required referenced Blocks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
define('EBML_ID_VIDEO',                           0x60); //             [E0] -- Video settings.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
define('EBML_ID_AUDIO',                           0x61); //             [E1] -- Audio settings.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
define('EBML_ID_CLUSTERTIMESLICE',                0x68); //             [E8] -- Contains extra time information about the data contained in the Block. While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
define('EBML_ID_CUECODECSTATE',                   0x6A); //             [EA] -- The position of the Codec State corresponding to this Cue element. 0 means that the data is taken from the initial Track Entry.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
define('EBML_ID_CUEREFCODECSTATE',                0x6B); //             [EB] -- The position of the Codec State corresponding to this referenced element. 0 means that the data is taken from the initial Track Entry.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
define('EBML_ID_VOID',                            0x6C); //             [EC] -- Used to void damaged data, to avoid unexpected behaviors when using damaged data. The content is discarded. Also used to reserve space in a sub-element for later use.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
define('EBML_ID_CLUSTERTIMECODE',                 0x67); //             [E7] -- Absolute timecode of the cluster (based on TimecodeScale).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
define('EBML_ID_CLUSTERBLOCKADDID',               0x6E); //             [EE] -- An ID to identify the BlockAdditional level.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
define('EBML_ID_CUECLUSTERPOSITION',              0x71); //             [F1] -- The position of the Cluster containing the required Block.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
define('EBML_ID_CUETRACK',                        0x77); //             [F7] -- The track for which a position is given.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
define('EBML_ID_CLUSTERREFERENCEPRIORITY',        0x7A); //             [FA] -- This frame is referenced and has the specified cache priority. In cache only a frame of the same or higher priority can replace this frame. A value of 0 means the frame is not referenced.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
define('EBML_ID_CLUSTERREFERENCEBLOCK',           0x7B); //             [FB] -- Timecode of another frame used as a reference (ie: B or P frame). The timecode is relative to the block it's attached to.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
define('EBML_ID_CLUSTERREFERENCEVIRTUAL',         0x7D); //             [FD] -- Relative position of the data that should be in position of the virtual block.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
* @tutorial http://www.matroska.org/technical/specs/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
*
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
* @todo Rewrite EBML parser to reduce it's size and honor default element values
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
* @todo After rewrite implement stream size calculation, that will provide additional useful info and enable AAC/FLAC audio bitrate detection
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
class getid3_matroska extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
	// public options
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
	public static $hide_clusters    = true;  // if true, do not return information about CLUSTER chunks, since there's a lot of them and they're not usually useful [default: TRUE]
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
	public static $parse_whole_file = false; // true to parse the whole file, not only header [default: FALSE]
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
	// private parser settings/placeholders
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
	private $EBMLbuffer        = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
	private $EBMLbuffer_offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
	private $EBMLbuffer_length = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
	private $current_offset    = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
	private $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
	public function Analyze()
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
	{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
		// parse container
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
		try {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
			$this->parseEBML($info);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
		} catch (Exception $e) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
			$info['error'][] = 'EBML parser: '.$e->getMessage();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
		// calculate playtime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
		if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
			foreach ($info['matroska']['info'] as $key => $infoarray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
				if (isset($infoarray['Duration'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
					// TimecodeScale is how many nanoseconds each Duration unit is
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
					$info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
		// extract tags
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
		if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
			foreach ($info['matroska']['tags'] as $key => $infoarray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
				$this->ExtractCommentsSimpleTag($infoarray);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
		// process tracks
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
		if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
			foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
				$track_info = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
				$track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
				$track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
				if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
				switch ($trackarray['TrackType']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
					case 1: // Video
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
						$track_info['resolution_x'] = $trackarray['PixelWidth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
						$track_info['resolution_y'] = $trackarray['PixelHeight'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
						$track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
						$track_info['display_x']    = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
						$track_info['display_y']    = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
						if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
						if (isset($trackarray['PixelCropTop']))    { $track_info['crop_top']    = $trackarray['PixelCropTop']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
						if (isset($trackarray['PixelCropLeft']))   { $track_info['crop_left']   = $trackarray['PixelCropLeft']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
						if (isset($trackarray['PixelCropRight']))  { $track_info['crop_right']  = $trackarray['PixelCropRight']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
						if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate']  = round(1000000000 / $trackarray['DefaultDuration'], 3); }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
						if (isset($trackarray['CodecName']))       { $track_info['codec']       = $trackarray['CodecName']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
						switch ($trackarray['CodecID']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
							case 'V_MS/VFW/FOURCC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
								if (!getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
									$this->warning('Unable to parse codec private data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "module.audio-video.riff.php"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
								$parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
								$track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
							/*case 'V_MPEG4/ISO/AVC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
								$h264['profile']    = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
								$h264['level']      = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
								$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
								$h264['NALUlength'] = ($rn & 3) + 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
								$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
								$nsps               = ($rn & 31);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
								$offset             = 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
								for ($i = 0; $i < $nsps; $i ++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
									$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
									$h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
									$offset       += 2 + $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
								$npps               = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
								$offset            += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
								for ($i = 0; $i < $npps; $i ++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
									$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
									$h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
									$offset       += 2 + $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
								break;*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
						$info['video']['streams'][] = $track_info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
					case 2: // Audio
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
						$track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
						$track_info['channels']    = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
						$track_info['language']    = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
						if (isset($trackarray['BitDepth']))  { $track_info['bits_per_sample'] = $trackarray['BitDepth']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
						if (isset($trackarray['CodecName'])) { $track_info['codec']           = $trackarray['CodecName']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
						switch ($trackarray['CodecID']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
							case 'A_PCM/INT/LIT':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
							case 'A_PCM/INT/BIG':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
								$track_info['bitrate'] = $trackarray['SamplingFrequency'] * $trackarray['Channels'] * $trackarray['BitDepth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
							case 'A_AC3':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
							case 'A_DTS':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
							case 'A_MPEG/L3':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
							case 'A_MPEG/L2':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
							case 'A_FLAC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
								if (!getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']).'.php', __FILE__, false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "module.audio.'.$track_info['dataformat'].'.php"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
								if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
								// create temp instance
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
								$getid3_temp = new getID3();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
								if ($track_info['dataformat'] != 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
									$getid3_temp->openfile($this->getid3->filename);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
								$getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
								if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
									$getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
								// analyze
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
								$class = 'getid3_'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
								$header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
								$getid3_audio = new $class($getid3_temp, __CLASS__);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
								if ($track_info['dataformat'] == 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
									$getid3_audio->AnalyzeString($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
								else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
									$getid3_audio->Analyze();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
								if (!empty($getid3_temp->info[$header_data_key])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
										foreach ($getid3_temp->info['audio'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
											$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
								else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
								// copy errors and warnings
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
								if (!empty($getid3_temp->info['error'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
									foreach ($getid3_temp->info['error'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
										$this->warning($class.'() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
								if (!empty($getid3_temp->info['warning'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
									foreach ($getid3_temp->info['warning'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
										if ($track_info['dataformat'] == 'mp3' && preg_match('/^Probable truncated file: expecting \d+ bytes of audio data, only found \d+ \(short by \d+ bytes\)$/', $newerror)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
											// 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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
											continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
										$this->warning($class.'() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
								unset($getid3_temp, $getid3_audio);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
							case 'A_AAC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
							case 'A_AAC/MPEG2/LC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
							case 'A_AAC/MPEG2/LC/SBR':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
							case 'A_AAC/MPEG4/LC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
							case 'A_AAC/MPEG4/LC/SBR':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
							    $this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
							case 'A_VORBIS':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
								if (!isset($trackarray['CodecPrivate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
								$vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
								if ($vorbis_offset === false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
								$vorbis_offset -= 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
								if (!getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "module.audio.ogg.php"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
								// create temp instance
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
								$getid3_temp = new getID3();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
								// analyze
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
								$getid3_ogg = new getid3_ogg($getid3_temp);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
								$oggpageinfo['page_seqno'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
								$getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
								if (!empty($getid3_temp->info['ogg'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
										foreach ($getid3_temp->info['audio'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
											$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
								// copy errors and warnings
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
								if (!empty($getid3_temp->info['error'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
									foreach ($getid3_temp->info['error'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
										$this->warning('getid3_ogg() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
								if (!empty($getid3_temp->info['warning'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
									foreach ($getid3_temp->info['warning'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
										$this->warning('getid3_ogg() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
								if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
									$track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
								unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
							case 'A_MS/ACM':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
								if (!getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because cannot include "module.audio-video.riff.php"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
								$parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
								foreach ($parsed as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
									if ($key != 'raw') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
										$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
								$this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
						$info['audio']['streams'][] = $track_info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
			if (!empty($info['video']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
				$info['video'] = self::getDefaultStreamInfo($info['video']['streams']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
			if (!empty($info['audio']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
				$info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
		// process attachments
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
		if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
			foreach ($info['matroska']['attachments'] as $i => $entry) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
				if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
					$info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
		// determine mime type
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
		if (!empty($info['video']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
		} elseif (!empty($info['audio']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
		} elseif (isset($info['mime_type'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
			unset($info['mime_type']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
	private function parseEBML(&$info) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
		// http://www.matroska.org/technical/specs/index.html#EBMLBasics
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
		$this->current_offset = $info['avdataoffset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
		while ($this->getEBMLelement($top_element, $info['avdataend'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
			switch ($top_element['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
				case EBML_ID_EBML:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
					$info['fileformat'] = 'matroska';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
					$info['matroska']['header']['offset'] = $top_element['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
					$info['matroska']['header']['length'] = $top_element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
					while ($this->getEBMLelement($element_data, $top_element['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
						switch ($element_data['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
							case EBML_ID_EBMLVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
							case EBML_ID_EBMLREADVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
							case EBML_ID_EBMLMAXIDLENGTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
							case EBML_ID_EBMLMAXSIZELENGTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
							case EBML_ID_DOCTYPEVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
							case EBML_ID_DOCTYPEREADVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
								$element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
							case EBML_ID_DOCTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
								$element_data['data'] = getid3_lib::trimNullByte($element_data['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
								$info['matroska']['doctype'] = $element_data['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
								$this->unhandledElement('header', __LINE__, $element_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
						unset($element_data['offset'], $element_data['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
						$info['matroska']['header']['elements'][] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
				case EBML_ID_SEGMENT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
					$info['matroska']['segment'][0]['offset'] = $top_element['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
					$info['matroska']['segment'][0]['length'] = $top_element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
					while ($this->getEBMLelement($element_data, $top_element['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
						if ($element_data['id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
							$info['matroska']['segments'][] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
						switch ($element_data['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
							case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
								while ($this->getEBMLelement($seek_entry, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
									switch ($seek_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
										case EBML_ID_SEEK: // Contains a single seek entry to an EBML element
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
											while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
												switch ($sub_seek_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
													case EBML_ID_SEEKID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
														$seek_entry['target_id']   = self::EBML2Int($sub_seek_entry['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
														$seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
													case EBML_ID_SEEKPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
														$seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
														$this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry);												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
											if ($seek_entry['target_id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
												$info['matroska']['seek'][] = $seek_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
											$this->unhandledElement('seekhead', __LINE__, $seek_entry);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
							case EBML_ID_TRACKS: // A top-level block of information with many tracks described.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
								$info['matroska']['tracks'] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
								while ($this->getEBMLelement($track_entry, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
									switch ($track_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
										case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
											while ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
												switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
													case EBML_ID_TRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
													case EBML_ID_TRACKUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
													case EBML_ID_TRACKTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
													case EBML_ID_MINCACHE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
													case EBML_ID_MAXCACHE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
													case EBML_ID_MAXBLOCKADDITIONID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
													case EBML_ID_DEFAULTDURATION: // nanoseconds per frame
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
													case EBML_ID_TRACKTIMECODESCALE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
													case EBML_ID_CODECID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
													case EBML_ID_LANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
													case EBML_ID_NAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
													case EBML_ID_CODECNAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
														$track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
													case EBML_ID_CODECPRIVATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
														$track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
													case EBML_ID_FLAGENABLED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
													case EBML_ID_FLAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
													case EBML_ID_FLAGFORCED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
													case EBML_ID_FLAGLACING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
													case EBML_ID_CODECDECODEALL:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
														$track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
													case EBML_ID_VIDEO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
															switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
																case EBML_ID_PIXELWIDTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
																case EBML_ID_PIXELHEIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
																case EBML_ID_PIXELCROPBOTTOM:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
																case EBML_ID_PIXELCROPTOP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
																case EBML_ID_PIXELCROPLEFT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
																case EBML_ID_PIXELCROPRIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
																case EBML_ID_DISPLAYWIDTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
																case EBML_ID_DISPLAYHEIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
																case EBML_ID_DISPLAYUNIT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
																case EBML_ID_ASPECTRATIOTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
																case EBML_ID_STEREOMODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
																case EBML_ID_OLDSTEREOMODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
																case EBML_ID_FLAGINTERLACED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
																	$track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
																case EBML_ID_GAMMAVALUE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
																case EBML_ID_COLOURSPACE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
																	$this->unhandledElement('track.video', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
													case EBML_ID_AUDIO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
															switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
																case EBML_ID_CHANNELS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
																case EBML_ID_BITDEPTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
																case EBML_ID_SAMPLINGFREQUENCY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
																case EBML_ID_OUTPUTSAMPLINGFREQUENCY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
																case EBML_ID_CHANNELPOSITIONS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
																	$this->unhandledElement('track.audio', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
													case EBML_ID_CONTENTENCODINGS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
														while ($this->getEBMLelement($sub_subelement, $subelement['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
															switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
																case EBML_ID_CONTENTENCODING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
																	while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
																		switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
																			case EBML_ID_CONTENTENCODINGORDER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
																			case EBML_ID_CONTENTENCODINGSCOPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
																			case EBML_ID_CONTENTENCODINGTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
																				$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
																			case EBML_ID_CONTENTCOMPRESSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
																					switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
																						case EBML_ID_CONTENTCOMPALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
																						case EBML_ID_CONTENTCOMPSETTINGS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
																						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
																							$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
																					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
																				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
																			case EBML_ID_CONTENTENCRYPTION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
																					switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
																						case EBML_ID_CONTENTENCALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
																						case EBML_ID_CONTENTSIGALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
																						case EBML_ID_CONTENTSIGHASHALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
																						case EBML_ID_CONTENTENCKEYID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
																						case EBML_ID_CONTENTSIGNATURE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
																						case EBML_ID_CONTENTSIGKEYID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
																						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
																							$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
																					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
																				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
																				$this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
																	$this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
														$this->unhandledElement('track', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
											$info['matroska']['tracks']['tracks'][] = $track_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
											$this->unhandledElement('tracks', __LINE__, $track_entry);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
							case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
								$info_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
								while ($this->getEBMLelement($subelement, $element_data['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
										case EBML_ID_TIMECODESCALE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
										case EBML_ID_DURATION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
										case EBML_ID_DATEUTC:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
											$info_entry[$subelement['id_name']]         = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
											$info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
										case EBML_ID_SEGMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
										case EBML_ID_PREVUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
										case EBML_ID_NEXTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
										case EBML_ID_SEGMENTFAMILY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
											$info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
										case EBML_ID_SEGMENTFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
										case EBML_ID_PREVFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
										case EBML_ID_NEXTFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
										case EBML_ID_TITLE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
										case EBML_ID_MUXINGAPP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
										case EBML_ID_WRITINGAPP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
											$info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
										case EBML_ID_CHAPTERTRANSLATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
											$chaptertranslate_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
													case EBML_ID_CHAPTERTRANSLATEEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
														$chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
													case EBML_ID_CHAPTERTRANSLATECODEC:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
													case EBML_ID_CHAPTERTRANSLATEID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
														$this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
											$info_entry[$subelement['id_name']] = $chaptertranslate_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
											$this->unhandledElement('info', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
								$info['matroska']['info'][] = $info_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
							case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
								if (self::$hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
									$this->current_offset = $element_data['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
								$cues_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
										case EBML_ID_CUEPOINT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
											$cuepoint_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
													case EBML_ID_CUETRACKPOSITIONS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
														$cuetrackpositions_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
																case EBML_ID_CUETRACK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
																case EBML_ID_CUECLUSTERPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
																case EBML_ID_CUEBLOCKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
																case EBML_ID_CUECODECSTATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
																	$cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
																	$this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
														$cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
													case EBML_ID_CUETIME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
														$cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
														$this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
											$cues_entry[] = $cuepoint_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
											$this->unhandledElement('cues', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
								$info['matroska']['cues'] = $cues_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
							case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
								$tags_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
								while ($this->getEBMLelement($subelement, $element_data['end'], false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
										case EBML_ID_TAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
											$tag_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
													case EBML_ID_TARGETS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
														$targets_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
																case EBML_ID_TARGETTYPEVALUE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
																	$targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
																	$targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
																case EBML_ID_TARGETTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
																	$targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
																case EBML_ID_TAGTRACKUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
																case EBML_ID_TAGEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
																case EBML_ID_TAGCHAPTERUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
																case EBML_ID_TAGATTACHMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
																	$targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
																	$this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
														$tag_entry[$sub_subelement['id_name']] = $targets_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
													case EBML_ID_SIMPLETAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
														$tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
														$this->unhandledElement('tags.tag', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
											$tags_entry[] = $tag_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
											$this->unhandledElement('tags', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
								$info['matroska']['tags'] = $tags_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
							case EBML_ID_ATTACHMENTS: // Contain attached files.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
										case EBML_ID_ATTACHEDFILE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
											$attachedfile_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
													case EBML_ID_FILEDESCRIPTION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
													case EBML_ID_FILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
													case EBML_ID_FILEMIMETYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
														$attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
													case EBML_ID_FILEDATA:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
														$attachedfile_entry['data_offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
														$attachedfile_entry['data_length'] = $sub_subelement['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
														$attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
															$attachedfile_entry['FileName'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
															$attachedfile_entry['data_offset'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
															$attachedfile_entry['data_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
														$this->current_offset = $sub_subelement['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
													case EBML_ID_FILEUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
														$attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
														$this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
											$info['matroska']['attachments'][] = $attachedfile_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
											$this->unhandledElement('attachments', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
							case EBML_ID_CHAPTERS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
										case EBML_ID_EDITIONENTRY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
											$editionentry_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
													case EBML_ID_EDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
														$editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
													case EBML_ID_EDITIONFLAGHIDDEN:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
													case EBML_ID_EDITIONFLAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
													case EBML_ID_EDITIONFLAGORDERED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
														$editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
													case EBML_ID_CHAPTERATOM:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
														$chapteratom_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
																case EBML_ID_CHAPTERSEGMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
																case EBML_ID_CHAPTERSEGMENTEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
																case EBML_ID_CHAPTERFLAGENABLED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
																case EBML_ID_CHAPTERFLAGHIDDEN:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
																case EBML_ID_CHAPTERUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
																case EBML_ID_CHAPTERTIMESTART:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
																case EBML_ID_CHAPTERTIMEEND:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
																case EBML_ID_CHAPTERTRACK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
																	$chaptertrack_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
																		switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
																			case EBML_ID_CHAPTERTRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
																				$chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
																				$this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
																case EBML_ID_CHAPTERDISPLAY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
																	$chapterdisplay_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
																		switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
																			case EBML_ID_CHAPSTRING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
																			case EBML_ID_CHAPLANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
																			case EBML_ID_CHAPCOUNTRY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
																				$chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
																				$this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
																	$this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
														$editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
														$this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
											$info['matroska']['chapters'][] = $editionentry_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
											$this->unhandledElement('chapters', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
							case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
								$cluster_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
								while ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
										case EBML_ID_CLUSTERTIMECODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
										case EBML_ID_CLUSTERPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
										case EBML_ID_CLUSTERPREVSIZE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
											$cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
										case EBML_ID_CLUSTERSILENTTRACKS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
											$cluster_silent_tracks = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
													case EBML_ID_CLUSTERSILENTTRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
														$cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
														$this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
											$cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
										case EBML_ID_CLUSTERBLOCKGROUP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
											$cluster_block_group = array('offset' => $this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
													case EBML_ID_CLUSTERBLOCK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
														$cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
													case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
													case EBML_ID_CLUSTERBLOCKDURATION:     // unsigned-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
													case EBML_ID_CLUSTERREFERENCEBLOCK:    // signed-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
														$cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
													case EBML_ID_CLUSTERCODECSTATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
														$this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
											$cluster_entry[$subelement['id_name']][] = $cluster_block_group;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
										case EBML_ID_CLUSTERSIMPLEBLOCK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
											$cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
											$this->unhandledElement('cluster', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
									$this->current_offset = $subelement['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
								if (!self::$hide_clusters) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
									$info['matroska']['cluster'][] = $cluster_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
								// check to see if all the data we need exists already, if so, break out of the loop
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
								if (!self::$parse_whole_file) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
									if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
										if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
											if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
												return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
								$this->unhandledElement('segment', __LINE__, $element_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
					$this->unhandledElement('root', __LINE__, $top_element);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
	private function EnsureBufferHasEnoughData($min_data=1024) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
		if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
			$read_bytes = max($min_data, $this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
			try {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
				$this->fseek($this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
				$this->EBMLbuffer_offset = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
				$this->EBMLbuffer        = $this->fread($read_bytes);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
				$this->EBMLbuffer_length = strlen($this->EBMLbuffer);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
			} catch (getid3_exception $e) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
				$this->warning('EBML parser: '.$e->getMessage());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
			if ($this->EBMLbuffer_length == 0 && $this->feof()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
				return $this->error('EBML parser: ran out of file at offset '.$this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
	private function readEBMLint() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
		$actual_offset = $this->current_offset - $this->EBMLbuffer_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
		// get length of integer
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
		$first_byte_int = ord($this->EBMLbuffer[$actual_offset]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
		if       (0x80 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
			$length = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
		} elseif (0x40 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
			$length = 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
		} elseif (0x20 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
			$length = 3;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
		} elseif (0x10 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
			$length = 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
		} elseif (0x08 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
			$length = 5;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
		} elseif (0x04 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
			$length = 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
		} elseif (0x02 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
			$length = 7;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
		} elseif (0x01 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
			$length = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
			throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
		// read
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
		$int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
		$this->current_offset += $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
		return $int_value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
	private function readEBMLelementData($length, $check_buffer=false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
		if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
		$data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
		$this->current_offset += $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
		return $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
	private function getEBMLelement(&$element, $parent_end, $get_data=false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
		if ($this->current_offset >= $parent_end) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
		if (!$this->EnsureBufferHasEnoughData()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
			$this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
		$element = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
		// set offset
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
		$element['offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
		// get ID
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
		$element['id'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
		// get name
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
		$element['id_name'] = self::EBMLidName($element['id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
		// get length
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
		$element['length'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
		// get end offset
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
		$element['end'] = $this->current_offset + $element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
		// get raw data
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
		$dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
		if (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
			$element['data'] = $this->readEBMLelementData($element['length'], $element);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
	private function unhandledElement($type, $line, $element) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
		// warn only about unknown and missed elements, not about unuseful
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
		if (!in_array($element['id'], $this->unuseful_elements)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
			$this->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
		// increase offset for unparsed elements
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
		if (!isset($element['data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
			$this->current_offset = $element['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
	private function ExtractCommentsSimpleTag($SimpleTagArray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
		if (!empty($SimpleTagArray['SimpleTag'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
			foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
				if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
					$this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
				if (!empty($SimpleTagData['SimpleTag'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
					$this->ExtractCommentsSimpleTag($SimpleTagData);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
	private function HandleEMBLSimpleTag($parent_end) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
		$simpletag_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
		while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
			switch ($element['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
				case EBML_ID_TAGNAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
				case EBML_ID_TAGLANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
				case EBML_ID_TAGSTRING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
				case EBML_ID_TAGBINARY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
					$simpletag_entry[$element['id_name']] = $element['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
				case EBML_ID_SIMPLETAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
					$simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
				case EBML_ID_TAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
					$simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
					$this->unhandledElement('tag.simpletag', __LINE__, $element);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
		return $simpletag_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1362
	private function HandleEMBLClusterBlock($element, $block_type, &$info) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1363
		// http://www.matroska.org/technical/specs/index.html#block_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
		// http://www.matroska.org/technical/specs/index.html#simpleblock_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1366
		$block_data = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
		$block_data['tracknumber'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
		$block_data['timecode']    = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
		$block_data['flags_raw']   = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
			$block_data['flags']['keyframe']  = (($block_data['flags_raw'] & 0x80) >> 7);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1374
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1375
		else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1376
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1377
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
		$block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1379
		$block_data['flags']['lacing']    =       (($block_data['flags_raw'] & 0x06) >> 1);  // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1381
			$block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
		else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
			//$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1386
		$block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
		// Lace (when lacing bit is set)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
		if ($block_data['flags']['lacing'] > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
			$block_data['lace_frames'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
			if ($block_data['flags']['lacing'] != 0x02) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1392
				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).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1393
					if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
						$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.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
					else { // Xiph lacing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1397
						$block_data['lace_frames_size'][$i] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
						do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
							$size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1400
							$block_data['lace_frames_size'][$i] += $size;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1401
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1402
						while ($size == 255);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1403
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1404
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
				if ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
					$block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1409
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1410
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1411
		if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1412
			$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1413
			$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
			//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1415
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1416
		//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1417
		//$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);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1418
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1419
		// set offset manually
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
		$this->current_offset = $element['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
		return $block_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
	private static function EBML2Int($EBMLstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1426
		// http://matroska.org/specs/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1427
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1428
		// Element ID coded with an UTF-8 like system:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1429
		// 1xxx xxxx                                  - Class A IDs (2^7 -2 possible values) (base 0x8X)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1430
		// 01xx xxxx  xxxx xxxx                       - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
		// 001x xxxx  xxxx xxxx  xxxx xxxx            - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
		// 0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
		// Values with all x at 0 and 1 are reserved (hence the -2).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
		// Data size, in octets, is also coded with an UTF-8 like system :
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
		// 1xxx xxxx                                                                              - value 0 to  2^7-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
		// 01xx xxxx  xxxx xxxx                                                                   - value 0 to 2^14-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
		// 001x xxxx  xxxx xxxx  xxxx xxxx                                                        - value 0 to 2^21-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
		// 0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                             - value 0 to 2^28-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
		// 0000 1xxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                  - value 0 to 2^35-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
		// 0000 01xx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                       - value 0 to 2^42-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
		// 0000 001x  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx            - value 0 to 2^49-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
		// 0000 0001  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - value 0 to 2^56-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
		$first_byte_int = ord($EBMLstring[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
		if (0x80 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
			$EBMLstring[0] = chr($first_byte_int & 0x7F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
		} elseif (0x40 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
			$EBMLstring[0] = chr($first_byte_int & 0x3F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
		} elseif (0x20 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
			$EBMLstring[0] = chr($first_byte_int & 0x1F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
		} elseif (0x10 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
			$EBMLstring[0] = chr($first_byte_int & 0x0F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
		} elseif (0x08 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1455
			$EBMLstring[0] = chr($first_byte_int & 0x07);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1456
		} elseif (0x04 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
			$EBMLstring[0] = chr($first_byte_int & 0x03);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
		} elseif (0x02 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
			$EBMLstring[0] = chr($first_byte_int & 0x01);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
		} elseif (0x01 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
			$EBMLstring[0] = chr($first_byte_int & 0x00);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
		return getid3_lib::BigEndian2Int($EBMLstring);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1465
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1466
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1467
	private static function EBMLdate2unix($EBMLdatestamp) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1468
		// Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
		// 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1470
		return round(($EBMLdatestamp / 1000000000) + 978307200);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
	public static function TargetTypeValue($target_type) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
		// http://www.matroska.org/technical/specs/tagging/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
		static $TargetTypeValue = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
		if (empty($TargetTypeValue)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
			$TargetTypeValue[10] = 'A: ~ V:shot';                                           // the lowest hierarchy found in music or movies
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1478
			$TargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene';                    // corresponds to parts of a track for audio (like a movement)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1479
			$TargetTypeValue[30] = 'A:track/song ~ V:chapter';                              // the common parts of an album or a movie
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
			$TargetTypeValue[40] = 'A:part/session ~ V:part/session';                       // when an album or episode has different logical parts
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
			$TargetTypeValue[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)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
			$TargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume';  // a list of lower levels grouped together
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
			$TargetTypeValue[70] = 'A:collection ~ V:collection';                           // the high hierarchy consisting of many different lower items
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
		return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1487
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1488
	public static function BlockLacingType($lacingtype) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1489
		// http://matroska.org/technical/specs/index.html#block_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1490
		static $BlockLacingType = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
		if (empty($BlockLacingType)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
			$BlockLacingType[0x00] = 'no lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1493
			$BlockLacingType[0x01] = 'Xiph lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1494
			$BlockLacingType[0x02] = 'fixed-size lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
			$BlockLacingType[0x03] = 'EBML lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1497
		return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1499
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
	public static function CodecIDtoCommonName($codecid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
		// http://www.matroska.org/technical/specs/codecid/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
		static $CodecIDlist = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1503
		if (empty($CodecIDlist)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1504
			$CodecIDlist['A_AAC']            = 'aac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1505
			$CodecIDlist['A_AAC/MPEG2/LC']   = 'aac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1506
			$CodecIDlist['A_AC3']            = 'ac3';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1507
			$CodecIDlist['A_DTS']            = 'dts';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1508
			$CodecIDlist['A_FLAC']           = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1509
			$CodecIDlist['A_MPEG/L1']        = 'mp1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
			$CodecIDlist['A_MPEG/L2']        = 'mp2';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
			$CodecIDlist['A_MPEG/L3']        = 'mp3';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
			$CodecIDlist['A_PCM/INT/LIT']    = 'pcm';       // PCM Integer Little Endian
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
			$CodecIDlist['A_PCM/INT/BIG']    = 'pcm';       // PCM Integer Big Endian
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
			$CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1515
			$CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1516
			$CodecIDlist['A_VORBIS']         = 'vorbis';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
			$CodecIDlist['V_MPEG1']          = 'mpeg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
			$CodecIDlist['V_THEORA']         = 'theora';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
			$CodecIDlist['V_REAL/RV40']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
			$CodecIDlist['V_REAL/RV10']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
			$CodecIDlist['V_REAL/RV20']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
			$CodecIDlist['V_REAL/RV30']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
			$CodecIDlist['V_QUICKTIME']      = 'quicktime'; // Quicktime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1524
			$CodecIDlist['V_MPEG4/ISO/AP']   = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1525
			$CodecIDlist['V_MPEG4/ISO/ASP']  = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
			$CodecIDlist['V_MPEG4/ISO/AVC']  = 'h264';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
			$CodecIDlist['V_MPEG4/ISO/SP']   = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1528
			$CodecIDlist['V_VP8']            = 'vp8';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
			$CodecIDlist['V_MS/VFW/FOURCC']  = 'riff';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1530
			$CodecIDlist['A_MS/ACM']         = 'riff';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1531
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1532
		return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1533
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1534
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1535
	private static function EBMLidName($value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
		static $EBMLidList = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
		if (empty($EBMLidList)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1538
			$EBMLidList[EBML_ID_ASPECTRATIOTYPE]            = 'AspectRatioType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1539
			$EBMLidList[EBML_ID_ATTACHEDFILE]               = 'AttachedFile';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1540
			$EBMLidList[EBML_ID_ATTACHMENTLINK]             = 'AttachmentLink';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1541
			$EBMLidList[EBML_ID_ATTACHMENTS]                = 'Attachments';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1542
			$EBMLidList[EBML_ID_AUDIO]                      = 'Audio';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1543
			$EBMLidList[EBML_ID_BITDEPTH]                   = 'BitDepth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1544
			$EBMLidList[EBML_ID_CHANNELPOSITIONS]           = 'ChannelPositions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
			$EBMLidList[EBML_ID_CHANNELS]                   = 'Channels';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
			$EBMLidList[EBML_ID_CHAPCOUNTRY]                = 'ChapCountry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
			$EBMLidList[EBML_ID_CHAPLANGUAGE]               = 'ChapLanguage';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1548
			$EBMLidList[EBML_ID_CHAPPROCESS]                = 'ChapProcess';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1549
			$EBMLidList[EBML_ID_CHAPPROCESSCODECID]         = 'ChapProcessCodecID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1550
			$EBMLidList[EBML_ID_CHAPPROCESSCOMMAND]         = 'ChapProcessCommand';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1551
			$EBMLidList[EBML_ID_CHAPPROCESSDATA]            = 'ChapProcessData';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1552
			$EBMLidList[EBML_ID_CHAPPROCESSPRIVATE]         = 'ChapProcessPrivate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1553
			$EBMLidList[EBML_ID_CHAPPROCESSTIME]            = 'ChapProcessTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1554
			$EBMLidList[EBML_ID_CHAPSTRING]                 = 'ChapString';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1555
			$EBMLidList[EBML_ID_CHAPTERATOM]                = 'ChapterAtom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1556
			$EBMLidList[EBML_ID_CHAPTERDISPLAY]             = 'ChapterDisplay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1557
			$EBMLidList[EBML_ID_CHAPTERFLAGENABLED]         = 'ChapterFlagEnabled';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
			$EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN]          = 'ChapterFlagHidden';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
			$EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV]       = 'ChapterPhysicalEquiv';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
			$EBMLidList[EBML_ID_CHAPTERS]                   = 'Chapters';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
			$EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID]   = 'ChapterSegmentEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1562
			$EBMLidList[EBML_ID_CHAPTERSEGMENTUID]          = 'ChapterSegmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1563
			$EBMLidList[EBML_ID_CHAPTERTIMEEND]             = 'ChapterTimeEnd';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1564
			$EBMLidList[EBML_ID_CHAPTERTIMESTART]           = 'ChapterTimeStart';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1565
			$EBMLidList[EBML_ID_CHAPTERTRACK]               = 'ChapterTrack';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1566
			$EBMLidList[EBML_ID_CHAPTERTRACKNUMBER]         = 'ChapterTrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1567
			$EBMLidList[EBML_ID_CHAPTERTRANSLATE]           = 'ChapterTranslate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1568
			$EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC]      = 'ChapterTranslateCodec';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1569
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1570
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEID]         = 'ChapterTranslateID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1571
			$EBMLidList[EBML_ID_CHAPTERUID]                 = 'ChapterUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1572
			$EBMLidList[EBML_ID_CLUSTER]                    = 'Cluster';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1573
			$EBMLidList[EBML_ID_CLUSTERBLOCK]               = 'ClusterBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1574
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDID]          = 'ClusterBlockAddID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1575
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL]     = 'ClusterBlockAdditional';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1576
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID]     = 'ClusterBlockAdditionID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1577
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS]      = 'ClusterBlockAdditions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1578
			$EBMLidList[EBML_ID_CLUSTERBLOCKDURATION]       = 'ClusterBlockDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1579
			$EBMLidList[EBML_ID_CLUSTERBLOCKGROUP]          = 'ClusterBlockGroup';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1580
			$EBMLidList[EBML_ID_CLUSTERBLOCKMORE]           = 'ClusterBlockMore';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1581
			$EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL]        = 'ClusterBlockVirtual';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1582
			$EBMLidList[EBML_ID_CLUSTERCODECSTATE]          = 'ClusterCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1583
			$EBMLidList[EBML_ID_CLUSTERDELAY]               = 'ClusterDelay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1584
			$EBMLidList[EBML_ID_CLUSTERDURATION]            = 'ClusterDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1585
			$EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK]      = 'ClusterEncryptedBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
			$EBMLidList[EBML_ID_CLUSTERFRAMENUMBER]         = 'ClusterFrameNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1587
			$EBMLidList[EBML_ID_CLUSTERLACENUMBER]          = 'ClusterLaceNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1588
			$EBMLidList[EBML_ID_CLUSTERPOSITION]            = 'ClusterPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1589
			$EBMLidList[EBML_ID_CLUSTERPREVSIZE]            = 'ClusterPrevSize';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1590
			$EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK]      = 'ClusterReferenceBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1591
			$EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY]   = 'ClusterReferencePriority';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1592
			$EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL]    = 'ClusterReferenceVirtual';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1593
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER]   = 'ClusterSilentTrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1594
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKS]        = 'ClusterSilentTracks';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1595
			$EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK]         = 'ClusterSimpleBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1596
			$EBMLidList[EBML_ID_CLUSTERTIMECODE]            = 'ClusterTimecode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1597
			$EBMLidList[EBML_ID_CLUSTERTIMESLICE]           = 'ClusterTimeSlice';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1598
			$EBMLidList[EBML_ID_CODECDECODEALL]             = 'CodecDecodeAll';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1599
			$EBMLidList[EBML_ID_CODECDOWNLOADURL]           = 'CodecDownloadURL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1600
			$EBMLidList[EBML_ID_CODECID]                    = 'CodecID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1601
			$EBMLidList[EBML_ID_CODECINFOURL]               = 'CodecInfoURL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1602
			$EBMLidList[EBML_ID_CODECNAME]                  = 'CodecName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1603
			$EBMLidList[EBML_ID_CODECPRIVATE]               = 'CodecPrivate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1604
			$EBMLidList[EBML_ID_CODECSETTINGS]              = 'CodecSettings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1605
			$EBMLidList[EBML_ID_COLOURSPACE]                = 'ColourSpace';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1606
			$EBMLidList[EBML_ID_CONTENTCOMPALGO]            = 'ContentCompAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1607
			$EBMLidList[EBML_ID_CONTENTCOMPRESSION]         = 'ContentCompression';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1608
			$EBMLidList[EBML_ID_CONTENTCOMPSETTINGS]        = 'ContentCompSettings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1609
			$EBMLidList[EBML_ID_CONTENTENCALGO]             = 'ContentEncAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1610
			$EBMLidList[EBML_ID_CONTENTENCKEYID]            = 'ContentEncKeyID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1611
			$EBMLidList[EBML_ID_CONTENTENCODING]            = 'ContentEncoding';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1612
			$EBMLidList[EBML_ID_CONTENTENCODINGORDER]       = 'ContentEncodingOrder';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1613
			$EBMLidList[EBML_ID_CONTENTENCODINGS]           = 'ContentEncodings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1614
			$EBMLidList[EBML_ID_CONTENTENCODINGSCOPE]       = 'ContentEncodingScope';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1615
			$EBMLidList[EBML_ID_CONTENTENCODINGTYPE]        = 'ContentEncodingType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1616
			$EBMLidList[EBML_ID_CONTENTENCRYPTION]          = 'ContentEncryption';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1617
			$EBMLidList[EBML_ID_CONTENTSIGALGO]             = 'ContentSigAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1618
			$EBMLidList[EBML_ID_CONTENTSIGHASHALGO]         = 'ContentSigHashAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1619
			$EBMLidList[EBML_ID_CONTENTSIGKEYID]            = 'ContentSigKeyID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1620
			$EBMLidList[EBML_ID_CONTENTSIGNATURE]           = 'ContentSignature';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1621
			$EBMLidList[EBML_ID_CRC32]                      = 'CRC32';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1622
			$EBMLidList[EBML_ID_CUEBLOCKNUMBER]             = 'CueBlockNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1623
			$EBMLidList[EBML_ID_CUECLUSTERPOSITION]         = 'CueClusterPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1624
			$EBMLidList[EBML_ID_CUECODECSTATE]              = 'CueCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1625
			$EBMLidList[EBML_ID_CUEPOINT]                   = 'CuePoint';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1626
			$EBMLidList[EBML_ID_CUEREFCLUSTER]              = 'CueRefCluster';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1627
			$EBMLidList[EBML_ID_CUEREFCODECSTATE]           = 'CueRefCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1628
			$EBMLidList[EBML_ID_CUEREFERENCE]               = 'CueReference';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1629
			$EBMLidList[EBML_ID_CUEREFNUMBER]               = 'CueRefNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1630
			$EBMLidList[EBML_ID_CUEREFTIME]                 = 'CueRefTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1631
			$EBMLidList[EBML_ID_CUES]                       = 'Cues';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1632
			$EBMLidList[EBML_ID_CUETIME]                    = 'CueTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1633
			$EBMLidList[EBML_ID_CUETRACK]                   = 'CueTrack';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1634
			$EBMLidList[EBML_ID_CUETRACKPOSITIONS]          = 'CueTrackPositions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1635
			$EBMLidList[EBML_ID_DATEUTC]                    = 'DateUTC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1636
			$EBMLidList[EBML_ID_DEFAULTDURATION]            = 'DefaultDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1637
			$EBMLidList[EBML_ID_DISPLAYHEIGHT]              = 'DisplayHeight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1638
			$EBMLidList[EBML_ID_DISPLAYUNIT]                = 'DisplayUnit';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1639
			$EBMLidList[EBML_ID_DISPLAYWIDTH]               = 'DisplayWidth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1640
			$EBMLidList[EBML_ID_DOCTYPE]                    = 'DocType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1641
			$EBMLidList[EBML_ID_DOCTYPEREADVERSION]         = 'DocTypeReadVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1642
			$EBMLidList[EBML_ID_DOCTYPEVERSION]             = 'DocTypeVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1643
			$EBMLidList[EBML_ID_DURATION]                   = 'Duration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1644
			$EBMLidList[EBML_ID_EBML]                       = 'EBML';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1645
			$EBMLidList[EBML_ID_EBMLMAXIDLENGTH]            = 'EBMLMaxIDLength';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1646
			$EBMLidList[EBML_ID_EBMLMAXSIZELENGTH]          = 'EBMLMaxSizeLength';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1647
			$EBMLidList[EBML_ID_EBMLREADVERSION]            = 'EBMLReadVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1648
			$EBMLidList[EBML_ID_EBMLVERSION]                = 'EBMLVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1649
			$EBMLidList[EBML_ID_EDITIONENTRY]               = 'EditionEntry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1650
			$EBMLidList[EBML_ID_EDITIONFLAGDEFAULT]         = 'EditionFlagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1651
			$EBMLidList[EBML_ID_EDITIONFLAGHIDDEN]          = 'EditionFlagHidden';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1652
			$EBMLidList[EBML_ID_EDITIONFLAGORDERED]         = 'EditionFlagOrdered';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1653
			$EBMLidList[EBML_ID_EDITIONUID]                 = 'EditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1654
			$EBMLidList[EBML_ID_FILEDATA]                   = 'FileData';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1655
			$EBMLidList[EBML_ID_FILEDESCRIPTION]            = 'FileDescription';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1656
			$EBMLidList[EBML_ID_FILEMIMETYPE]               = 'FileMimeType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1657
			$EBMLidList[EBML_ID_FILENAME]                   = 'FileName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1658
			$EBMLidList[EBML_ID_FILEREFERRAL]               = 'FileReferral';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1659
			$EBMLidList[EBML_ID_FILEUID]                    = 'FileUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1660
			$EBMLidList[EBML_ID_FLAGDEFAULT]                = 'FlagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1661
			$EBMLidList[EBML_ID_FLAGENABLED]                = 'FlagEnabled';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1662
			$EBMLidList[EBML_ID_FLAGFORCED]                 = 'FlagForced';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1663
			$EBMLidList[EBML_ID_FLAGINTERLACED]             = 'FlagInterlaced';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1664
			$EBMLidList[EBML_ID_FLAGLACING]                 = 'FlagLacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1665
			$EBMLidList[EBML_ID_GAMMAVALUE]                 = 'GammaValue';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1666
			$EBMLidList[EBML_ID_INFO]                       = 'Info';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1667
			$EBMLidList[EBML_ID_LANGUAGE]                   = 'Language';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1668
			$EBMLidList[EBML_ID_MAXBLOCKADDITIONID]         = 'MaxBlockAdditionID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1669
			$EBMLidList[EBML_ID_MAXCACHE]                   = 'MaxCache';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1670
			$EBMLidList[EBML_ID_MINCACHE]                   = 'MinCache';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1671
			$EBMLidList[EBML_ID_MUXINGAPP]                  = 'MuxingApp';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1672
			$EBMLidList[EBML_ID_NAME]                       = 'Name';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1673
			$EBMLidList[EBML_ID_NEXTFILENAME]               = 'NextFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1674
			$EBMLidList[EBML_ID_NEXTUID]                    = 'NextUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1675
			$EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY]    = 'OutputSamplingFrequency';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1676
			$EBMLidList[EBML_ID_PIXELCROPBOTTOM]            = 'PixelCropBottom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1677
			$EBMLidList[EBML_ID_PIXELCROPLEFT]              = 'PixelCropLeft';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1678
			$EBMLidList[EBML_ID_PIXELCROPRIGHT]             = 'PixelCropRight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1679
			$EBMLidList[EBML_ID_PIXELCROPTOP]               = 'PixelCropTop';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1680
			$EBMLidList[EBML_ID_PIXELHEIGHT]                = 'PixelHeight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1681
			$EBMLidList[EBML_ID_PIXELWIDTH]                 = 'PixelWidth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1682
			$EBMLidList[EBML_ID_PREVFILENAME]               = 'PrevFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1683
			$EBMLidList[EBML_ID_PREVUID]                    = 'PrevUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1684
			$EBMLidList[EBML_ID_SAMPLINGFREQUENCY]          = 'SamplingFrequency';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1685
			$EBMLidList[EBML_ID_SEEK]                       = 'Seek';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1686
			$EBMLidList[EBML_ID_SEEKHEAD]                   = 'SeekHead';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1687
			$EBMLidList[EBML_ID_SEEKID]                     = 'SeekID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1688
			$EBMLidList[EBML_ID_SEEKPOSITION]               = 'SeekPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1689
			$EBMLidList[EBML_ID_SEGMENT]                    = 'Segment';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1690
			$EBMLidList[EBML_ID_SEGMENTFAMILY]              = 'SegmentFamily';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1691
			$EBMLidList[EBML_ID_SEGMENTFILENAME]            = 'SegmentFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1692
			$EBMLidList[EBML_ID_SEGMENTUID]                 = 'SegmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1693
			$EBMLidList[EBML_ID_SIMPLETAG]                  = 'SimpleTag';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1694
			$EBMLidList[EBML_ID_CLUSTERSLICES]              = 'ClusterSlices';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1695
			$EBMLidList[EBML_ID_STEREOMODE]                 = 'StereoMode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1696
			$EBMLidList[EBML_ID_OLDSTEREOMODE]              = 'OldStereoMode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1697
			$EBMLidList[EBML_ID_TAG]                        = 'Tag';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1698
			$EBMLidList[EBML_ID_TAGATTACHMENTUID]           = 'TagAttachmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1699
			$EBMLidList[EBML_ID_TAGBINARY]                  = 'TagBinary';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1700
			$EBMLidList[EBML_ID_TAGCHAPTERUID]              = 'TagChapterUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1701
			$EBMLidList[EBML_ID_TAGDEFAULT]                 = 'TagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1702
			$EBMLidList[EBML_ID_TAGEDITIONUID]              = 'TagEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1703
			$EBMLidList[EBML_ID_TAGLANGUAGE]                = 'TagLanguage';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1704
			$EBMLidList[EBML_ID_TAGNAME]                    = 'TagName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1705
			$EBMLidList[EBML_ID_TAGTRACKUID]                = 'TagTrackUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1706
			$EBMLidList[EBML_ID_TAGS]                       = 'Tags';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1707
			$EBMLidList[EBML_ID_TAGSTRING]                  = 'TagString';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1708
			$EBMLidList[EBML_ID_TARGETS]                    = 'Targets';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1709
			$EBMLidList[EBML_ID_TARGETTYPE]                 = 'TargetType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1710
			$EBMLidList[EBML_ID_TARGETTYPEVALUE]            = 'TargetTypeValue';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1711
			$EBMLidList[EBML_ID_TIMECODESCALE]              = 'TimecodeScale';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1712
			$EBMLidList[EBML_ID_TITLE]                      = 'Title';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
			$EBMLidList[EBML_ID_TRACKENTRY]                 = 'TrackEntry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1714
			$EBMLidList[EBML_ID_TRACKNUMBER]                = 'TrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
			$EBMLidList[EBML_ID_TRACKOFFSET]                = 'TrackOffset';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
			$EBMLidList[EBML_ID_TRACKOVERLAY]               = 'TrackOverlay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
			$EBMLidList[EBML_ID_TRACKS]                     = 'Tracks';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
			$EBMLidList[EBML_ID_TRACKTIMECODESCALE]         = 'TrackTimecodeScale';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
			$EBMLidList[EBML_ID_TRACKTRANSLATE]             = 'TrackTranslate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
			$EBMLidList[EBML_ID_TRACKTRANSLATECODEC]        = 'TrackTranslateCodec';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
			$EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID]   = 'TrackTranslateEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
			$EBMLidList[EBML_ID_TRACKTRANSLATETRACKID]      = 'TrackTranslateTrackID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
			$EBMLidList[EBML_ID_TRACKTYPE]                  = 'TrackType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
			$EBMLidList[EBML_ID_TRACKUID]                   = 'TrackUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
			$EBMLidList[EBML_ID_VIDEO]                      = 'Video';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
			$EBMLidList[EBML_ID_VOID]                       = 'Void';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1727
			$EBMLidList[EBML_ID_WRITINGAPP]                 = 'WritingApp';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1728
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1729
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1730
		return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
	public static function displayUnit($value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
		// http://www.matroska.org/technical/specs/index.html#DisplayUnit
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
		static $units = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
			0 => 'pixels',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
			1 => 'centimeters',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1738
			2 => 'inches',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1739
			3 => 'Display Aspect Ratio');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1740
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1741
		return (isset($units[$value]) ? $units[$value] : 'unknown');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1742
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1743
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1744
	private static function getDefaultStreamInfo($streams)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
	{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
		foreach (array_reverse($streams) as $stream) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
			if ($stream['default']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1751
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1752
		$unset = array('default', 'name');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1753
		foreach ($unset as $u) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1754
			if (isset($stream[$u])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1755
				unset($stream[$u]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1756
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1757
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1758
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1759
		$info = $stream;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1760
		$info['streams'] = $streams;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1761
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1762
		return $info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1763
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1764
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1765
}