wp/wp-includes/ID3/module.audio-video.matroska.php
author ymh <ymh.work@gmail.com>
Tue, 09 Jun 2015 03:35:32 +0200
changeset 5 5e2f62d02dcd
parent 0 d970ebf37754
child 7 cf61fcea0001
permissions -rw-r--r--
upgrade wordpress + plugins
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                         //
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
     6
//          also https://github.com/JamesHeinrich/getID3       //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
// See readme.txt for more details                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
// module.audio-video.matriska.php                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
// module for analyzing Matroska containers                    //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
// dependencies: NONE                                          //
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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
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
    19
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
    20
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
    21
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
    22
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
    23
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
    24
define('EBML_ID_ATTACHMENTS',               0x0941A469); // [19][41][A4][69] -- Contain attached files.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
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
    26
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
    27
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
    28
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
    29
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
    30
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
    31
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
    32
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
    33
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
    34
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
    35
define('EBML_ID_GAMMAVALUE',                  0x0FB523); //     [2F][B5][23] -- Gamma Value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
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
    37
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
    38
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
    39
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
    40
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
    41
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
    42
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
    43
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
    44
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
    45
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
    46
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
    47
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
    48
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
    49
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
    50
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
    51
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
    52
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
    53
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
    54
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
    55
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
    56
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
    57
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
    58
define('EBML_ID_TAGSTRING',                     0x0487); //         [44][87] -- The value of the Tag.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
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
    60
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
    61
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
    62
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
    63
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
    64
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
    65
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
    66
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
    67
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
    68
define('EBML_ID_FILEDATA',                      0x065C); //         [46][5C] -- The data of the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
define('EBML_ID_FILEMIMETYPE',                  0x0660); //         [46][60] -- MIME type of the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
define('EBML_ID_FILENAME',                      0x066E); //         [46][6E] -- Filename of the attached file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
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
    72
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
    73
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
    74
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
    75
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
    76
define('EBML_ID_CONTENTSIGNATURE',              0x07E3); //         [47][E3] -- A cryptographic signature of the contents.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
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
    78
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
    79
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
    80
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
    81
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
    82
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
    83
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
    84
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
    85
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
    86
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
    87
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
    88
define('EBML_ID_NAME',                          0x136E); //         [53][6E] -- A human-readable track name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
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
    90
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
    91
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
    92
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
    93
define('EBML_ID_STEREOMODE',                    0x13B8); //         [53][B8] -- Stereo-3D video mode.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
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
    95
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
    96
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
    97
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
    98
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
    99
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
   100
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
   101
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
   102
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
   103
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
   104
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
   105
define('EBML_ID_WRITINGAPP',                    0x1741); //         [57][41] -- Writing application ("mkvmerge-0.3.3").
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
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
   107
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
   108
define('EBML_ID_ATTACHEDFILE',                  0x21A7); //         [61][A7] -- An attached file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
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
   110
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
   111
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
   112
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
   113
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
   114
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
   115
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
   116
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
   117
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
   118
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
   119
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
   120
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
   121
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
   122
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
   123
define('EBML_ID_SIMPLETAG',                     0x27C8); //         [67][C8] -- Contains general information about the target.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
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
   125
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
   126
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
   127
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
   128
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
   129
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
   130
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
   131
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
   132
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
   133
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
   134
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
   135
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
   136
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
   137
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
   138
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
   139
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
   140
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
   141
define('EBML_ID_SEGMENTFILENAME',               0x3384); //         [73][84] -- A filename corresponding to this segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
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
   143
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
   144
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
   145
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
   146
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
   147
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
   148
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
   149
define('EBML_ID_TITLE',                         0x3BA9); //         [7B][A9] -- General name of the segment.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
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
   151
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
   152
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
   153
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
   154
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
   155
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
   156
define('EBML_ID_CLUSTERSLICES',                   0x0E); //             [8E] -- Contains slices description.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
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
   158
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
   159
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
   160
define('EBML_ID_CUEREFTIME',                      0x16); //             [96] -- Timecode of the referenced Block.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
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
   162
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
   163
define('EBML_ID_FLAGINTERLACED',                  0x1A); //             [9A] -- Set if the video is interlaced.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
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
   165
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
   166
define('EBML_ID_CHANNELS',                        0x1F); //             [9F] -- Numbers of channels in the track.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
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
   168
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
   169
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
   170
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
   171
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
   172
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
   173
define('EBML_ID_CLUSTERBLOCKMORE',                0x26); //             [A6] -- Contain the BlockAdditional and some parameters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
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
   175
define('EBML_ID_CODECDECODEALL',                  0x2A); //             [AA] -- The codec can decode potentially damaged data.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
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
   177
define('EBML_ID_TRACKENTRY',                      0x2E); //             [AE] -- Describes a track with all elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
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
   179
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
   180
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
   181
define('EBML_ID_SAMPLINGFREQUENCY',               0x35); //             [B5] -- Sampling frequency in Hz.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
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
   183
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
   184
define('EBML_ID_FLAGENABLED',                     0x39); //             [B9] -- Set if the track is used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
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
   186
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
   187
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
   188
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
   189
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
   190
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
   191
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
   192
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
   193
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
   194
define('EBML_ID_CUEREFERENCE',                    0x5B); //             [DB] -- The Clusters containing the required referenced Blocks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
define('EBML_ID_VIDEO',                           0x60); //             [E0] -- Video settings.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
define('EBML_ID_AUDIO',                           0x61); //             [E1] -- Audio settings.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
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
   198
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
   199
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
   200
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
   201
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
   202
define('EBML_ID_CLUSTERBLOCKADDID',               0x6E); //             [EE] -- An ID to identify the BlockAdditional level.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
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
   204
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
   205
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
   206
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
   207
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
   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
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
* @tutorial http://www.matroska.org/technical/specs/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
*
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
* @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
   214
* @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
   215
*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
class getid3_matroska extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
	// public options
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
	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
   220
	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
   221
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
	// private parser settings/placeholders
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
	private $EBMLbuffer        = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
	private $EBMLbuffer_offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
	private $EBMLbuffer_length = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
	private $current_offset    = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
	private $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
	public function Analyze()
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
	{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
		// parse container
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
		try {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
			$this->parseEBML($info);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
		} catch (Exception $e) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
			$info['error'][] = 'EBML parser: '.$e->getMessage();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
		// calculate playtime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
		if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
			foreach ($info['matroska']['info'] as $key => $infoarray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
				if (isset($infoarray['Duration'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
					// TimecodeScale is how many nanoseconds each Duration unit is
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
					$info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
					break;
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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
		// extract tags
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
		if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
			foreach ($info['matroska']['tags'] as $key => $infoarray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
				$this->ExtractCommentsSimpleTag($infoarray);
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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
		// process tracks
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
		if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
			foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
				$track_info = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
				$track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
				$track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
				if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
				switch ($trackarray['TrackType']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
					case 1: // Video
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
						$track_info['resolution_x'] = $trackarray['PixelWidth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
						$track_info['resolution_y'] = $trackarray['PixelHeight'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
						$track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
						$track_info['display_x']    = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
						$track_info['display_y']    = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
						if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
						if (isset($trackarray['PixelCropTop']))    { $track_info['crop_top']    = $trackarray['PixelCropTop']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
						if (isset($trackarray['PixelCropLeft']))   { $track_info['crop_left']   = $trackarray['PixelCropLeft']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
						if (isset($trackarray['PixelCropRight']))  { $track_info['crop_right']  = $trackarray['PixelCropRight']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
						if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate']  = round(1000000000 / $trackarray['DefaultDuration'], 3); }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
						if (isset($trackarray['CodecName']))       { $track_info['codec']       = $trackarray['CodecName']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
						switch ($trackarray['CodecID']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
							case 'V_MS/VFW/FOURCC':
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   285
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   286
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
								$parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
								$track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
							/*case 'V_MPEG4/ISO/AVC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
								$h264['profile']    = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
								$h264['level']      = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
								$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
								$h264['NALUlength'] = ($rn & 3) + 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
								$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
								$nsps               = ($rn & 31);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
								$offset             = 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
								for ($i = 0; $i < $nsps; $i ++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
									$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
									$h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
									$offset       += 2 + $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
								$npps               = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
								$offset            += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
								for ($i = 0; $i < $npps; $i ++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
									$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
									$h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
									$offset       += 2 + $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
								break;*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
						$info['video']['streams'][] = $track_info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
					case 2: // Audio
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
						$track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
						$track_info['channels']    = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
						$track_info['language']    = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
						if (isset($trackarray['BitDepth']))  { $track_info['bits_per_sample'] = $trackarray['BitDepth']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
						if (isset($trackarray['CodecName'])) { $track_info['codec']           = $trackarray['CodecName']; }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
						switch ($trackarray['CodecID']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
							case 'A_PCM/INT/LIT':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
							case 'A_PCM/INT/BIG':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
								$track_info['bitrate'] = $trackarray['SamplingFrequency'] * $trackarray['Channels'] * $trackarray['BitDepth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
							case 'A_AC3':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
							case 'A_DTS':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
							case 'A_MPEG/L3':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
							case 'A_MPEG/L2':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
							case 'A_FLAC':
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   337
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']).'.php', __FILE__, true);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
								if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
									$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
   341
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
								// create temp instance
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
								$getid3_temp = new getID3();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
								if ($track_info['dataformat'] != 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
									$getid3_temp->openfile($this->getid3->filename);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
								$getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
								if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
									$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
   352
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
								// analyze
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
								$class = 'getid3_'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
								$header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
								$getid3_audio = new $class($getid3_temp, __CLASS__);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
								if ($track_info['dataformat'] == 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
									$getid3_audio->AnalyzeString($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
								else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
									$getid3_audio->Analyze();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
								if (!empty($getid3_temp->info[$header_data_key])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
										foreach ($getid3_temp->info['audio'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
											$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
								else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
									$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
   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
								// copy errors and warnings
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
								if (!empty($getid3_temp->info['error'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
									foreach ($getid3_temp->info['error'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
										$this->warning($class.'() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
								if (!empty($getid3_temp->info['warning'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
									foreach ($getid3_temp->info['warning'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
										$this->warning($class.'() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
								unset($getid3_temp, $getid3_audio);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
							case 'A_AAC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
							case 'A_AAC/MPEG2/LC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
							case 'A_AAC/MPEG2/LC/SBR':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
							case 'A_AAC/MPEG4/LC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
							case 'A_AAC/MPEG4/LC/SBR':
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   395
								$this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated');
0
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_VORBIS':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
								if (!isset($trackarray['CodecPrivate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
									$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
   401
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
								$vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
								if ($vorbis_offset === false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
									$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
   406
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
								$vorbis_offset -= 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   410
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
								// create temp instance
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
								$getid3_temp = new getID3();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
								// analyze
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
								$getid3_ogg = new getid3_ogg($getid3_temp);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
								$oggpageinfo['page_seqno'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
								$getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
								if (!empty($getid3_temp->info['ogg'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
										foreach ($getid3_temp->info['audio'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
											$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
								// copy errors and warnings
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
								if (!empty($getid3_temp->info['error'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
									foreach ($getid3_temp->info['error'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
										$this->warning('getid3_ogg() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
								if (!empty($getid3_temp->info['warning'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
									foreach ($getid3_temp->info['warning'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
										$this->warning('getid3_ogg() says: ['.$newerror.']');
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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
								if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
									$track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
								unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
							case 'A_MS/ACM':
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   447
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
								$parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
								foreach ($parsed as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
									if ($key != 'raw') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
										$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
								$this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
						$info['audio']['streams'][] = $track_info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
			if (!empty($info['video']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
				$info['video'] = self::getDefaultStreamInfo($info['video']['streams']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
			if (!empty($info['audio']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
				$info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
		// process attachments
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
		if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
			foreach ($info['matroska']['attachments'] as $i => $entry) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
				if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
					$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
   480
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
		// determine mime type
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
		if (!empty($info['video']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
		} elseif (!empty($info['audio']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
		} elseif (isset($info['mime_type'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
			unset($info['mime_type']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
		return true;
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
	private function parseEBML(&$info) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
		// http://www.matroska.org/technical/specs/index.html#EBMLBasics
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
		$this->current_offset = $info['avdataoffset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
		while ($this->getEBMLelement($top_element, $info['avdataend'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
			switch ($top_element['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
				case EBML_ID_EBML:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
					$info['matroska']['header']['offset'] = $top_element['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
					$info['matroska']['header']['length'] = $top_element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
					while ($this->getEBMLelement($element_data, $top_element['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
						switch ($element_data['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
							case EBML_ID_EBMLVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
							case EBML_ID_EBMLREADVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
							case EBML_ID_EBMLMAXIDLENGTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
							case EBML_ID_EBMLMAXSIZELENGTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
							case EBML_ID_DOCTYPEVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
							case EBML_ID_DOCTYPEREADVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
								$element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
							case EBML_ID_DOCTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
								$element_data['data'] = getid3_lib::trimNullByte($element_data['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
								$info['matroska']['doctype'] = $element_data['data'];
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   522
								$info['fileformat'] = $element_data['data'];
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
								$this->unhandledElement('header', __LINE__, $element_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
						unset($element_data['offset'], $element_data['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
						$info['matroska']['header']['elements'][] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
					}
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_SEGMENT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
					$info['matroska']['segment'][0]['offset'] = $top_element['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
					$info['matroska']['segment'][0]['length'] = $top_element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
					while ($this->getEBMLelement($element_data, $top_element['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
						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
   540
							$info['matroska']['segments'][] = $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
						switch ($element_data['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
							case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
								while ($this->getEBMLelement($seek_entry, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
									switch ($seek_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
										case EBML_ID_SEEK: // Contains a single seek entry to an EBML element
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
											while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
												switch ($sub_seek_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
													case EBML_ID_SEEKID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
														$seek_entry['target_id']   = self::EBML2Int($sub_seek_entry['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
														$seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
													case EBML_ID_SEEKPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
														$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
   561
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
														$this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry);												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
											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
   568
												$info['matroska']['seek'][] = $seek_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
											$this->unhandledElement('seekhead', __LINE__, $seek_entry);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
							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
   579
								$info['matroska']['tracks'] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
								while ($this->getEBMLelement($track_entry, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
									switch ($track_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
										case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
											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
   587
												switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
													case EBML_ID_TRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
													case EBML_ID_TRACKUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
													case EBML_ID_TRACKTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
													case EBML_ID_MINCACHE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
													case EBML_ID_MAXCACHE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
													case EBML_ID_MAXBLOCKADDITIONID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
													case EBML_ID_DEFAULTDURATION: // nanoseconds per frame
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
													case EBML_ID_TRACKTIMECODESCALE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
														break;
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_CODECID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
													case EBML_ID_LANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
													case EBML_ID_NAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
													case EBML_ID_CODECNAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
														$track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
													case EBML_ID_CODECPRIVATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
														$track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
													case EBML_ID_FLAGENABLED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
													case EBML_ID_FLAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
													case EBML_ID_FLAGFORCED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
													case EBML_ID_FLAGLACING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
													case EBML_ID_CODECDECODEALL:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
														$track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
													case EBML_ID_VIDEO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
															switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
																case EBML_ID_PIXELWIDTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
																case EBML_ID_PIXELHEIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
																case EBML_ID_PIXELCROPBOTTOM:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
																case EBML_ID_PIXELCROPTOP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
																case EBML_ID_PIXELCROPLEFT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
																case EBML_ID_PIXELCROPRIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
																case EBML_ID_DISPLAYWIDTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
																case EBML_ID_DISPLAYHEIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
																case EBML_ID_DISPLAYUNIT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
																case EBML_ID_ASPECTRATIOTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
																case EBML_ID_STEREOMODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
																case EBML_ID_OLDSTEREOMODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
																case EBML_ID_FLAGINTERLACED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
																	$track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
																case EBML_ID_GAMMAVALUE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
																case EBML_ID_COLOURSPACE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
																	$this->unhandledElement('track.video', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
														}
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_AUDIO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
															switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
																case EBML_ID_CHANNELS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
																case EBML_ID_BITDEPTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
																case EBML_ID_SAMPLINGFREQUENCY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
																case EBML_ID_OUTPUTSAMPLINGFREQUENCY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
																case EBML_ID_CHANNELPOSITIONS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
																	$this->unhandledElement('track.audio', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
													case EBML_ID_CONTENTENCODINGS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
														while ($this->getEBMLelement($sub_subelement, $subelement['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
															switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
																case EBML_ID_CONTENTENCODING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
																	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
   693
																		switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
																			case EBML_ID_CONTENTENCODINGORDER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
																			case EBML_ID_CONTENTENCODINGSCOPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
																			case EBML_ID_CONTENTENCODINGTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
																				$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
   699
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
																			case EBML_ID_CONTENTCOMPRESSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
																					switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
																						case EBML_ID_CONTENTCOMPALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
																							$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
   708
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
																						case EBML_ID_CONTENTCOMPSETTINGS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
																							$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
   712
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
																						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
																							$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
																					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
																				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
																				break;
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_CONTENTENCRYPTION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
																					switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
																						case EBML_ID_CONTENTENCALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
																						case EBML_ID_CONTENTSIGALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
																						case EBML_ID_CONTENTSIGHASHALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
																							$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
   729
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
																						case EBML_ID_CONTENTENCKEYID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
																						case EBML_ID_CONTENTSIGNATURE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
																						case EBML_ID_CONTENTSIGKEYID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
																							$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
   735
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
																						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
																							$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
																					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
																				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
																				$this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
																	$this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
														$this->unhandledElement('track', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
											$info['matroska']['tracks']['tracks'][] = $track_entry;
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('tracks', __LINE__, $track_entry);
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
							case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
								$info_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
								while ($this->getEBMLelement($subelement, $element_data['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
										case EBML_ID_TIMECODESCALE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
										case EBML_ID_DURATION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
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_DATEUTC:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
											$info_entry[$subelement['id_name']]         = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
											$info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
										case EBML_ID_SEGMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
										case EBML_ID_PREVUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
										case EBML_ID_NEXTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
										case EBML_ID_SEGMENTFAMILY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
											$info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
										case EBML_ID_SEGMENTFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
										case EBML_ID_PREVFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
										case EBML_ID_NEXTFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
										case EBML_ID_TITLE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
										case EBML_ID_MUXINGAPP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
										case EBML_ID_WRITINGAPP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
											$info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']];
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_CHAPTERTRANSLATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
											$chaptertranslate_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
													case EBML_ID_CHAPTERTRANSLATEEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
														$chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
													case EBML_ID_CHAPTERTRANSLATECODEC:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
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_CHAPTERTRANSLATEID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
														$this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
											$info_entry[$subelement['id_name']] = $chaptertranslate_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
											$this->unhandledElement('info', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
								$info['matroska']['info'][] = $info_entry;
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
							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
   841
								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
   842
									$this->current_offset = $element_data['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
								$cues_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
										case EBML_ID_CUEPOINT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
											$cuepoint_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
													case EBML_ID_CUETRACKPOSITIONS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
														$cuetrackpositions_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
																case EBML_ID_CUETRACK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
																case EBML_ID_CUECLUSTERPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
																case EBML_ID_CUEBLOCKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
																case EBML_ID_CUECODECSTATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
																	$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
   867
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
																	$this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
														$cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
														break;
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_CUETIME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
														$cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
														$this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
											$cues_entry[] = $cuepoint_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
											$this->unhandledElement('cues', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
								$info['matroska']['cues'] = $cues_entry;
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
							case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
								$tags_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
								while ($this->getEBMLelement($subelement, $element_data['end'], false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
										case EBML_ID_TAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
											$tag_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
													case EBML_ID_TARGETS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
														$targets_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
																case EBML_ID_TARGETTYPEVALUE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
																	$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
   914
																	$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
   915
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
																case EBML_ID_TARGETTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
																	$targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
																case EBML_ID_TAGTRACKUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
																case EBML_ID_TAGEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
																case EBML_ID_TAGCHAPTERUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
																case EBML_ID_TAGATTACHMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
																	$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
   926
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
																	$this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
														$tag_entry[$sub_subelement['id_name']] = $targets_entry;
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_SIMPLETAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
														$tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
														$this->unhandledElement('tags.tag', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
											$tags_entry[] = $tag_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
											$this->unhandledElement('tags', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
								$info['matroska']['tags'] = $tags_entry;
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
							case EBML_ID_ATTACHMENTS: // Contain attached files.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
										case EBML_ID_ATTACHEDFILE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
											$attachedfile_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
													case EBML_ID_FILEDESCRIPTION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
													case EBML_ID_FILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
													case EBML_ID_FILEMIMETYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
														$attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
													case EBML_ID_FILEDATA:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
														$attachedfile_entry['data_offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
														$attachedfile_entry['data_length'] = $sub_subelement['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
														$attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
															$attachedfile_entry['FileName'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
															$attachedfile_entry['data_offset'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
															$attachedfile_entry['data_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
														$this->current_offset = $sub_subelement['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
													case EBML_ID_FILEUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
														$attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
														$this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
											$info['matroska']['attachments'][] = $attachedfile_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
											$this->unhandledElement('attachments', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
							case EBML_ID_CHAPTERS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
										case EBML_ID_EDITIONENTRY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
											$editionentry_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
													case EBML_ID_EDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
														$editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
													case EBML_ID_EDITIONFLAGHIDDEN:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
													case EBML_ID_EDITIONFLAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
													case EBML_ID_EDITIONFLAGORDERED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
														$editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
													case EBML_ID_CHAPTERATOM:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
														$chapteratom_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
														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
  1024
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
																case EBML_ID_CHAPTERSEGMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
																case EBML_ID_CHAPTERSEGMENTEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
																case EBML_ID_CHAPTERFLAGENABLED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
																case EBML_ID_CHAPTERFLAGHIDDEN:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
																	$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
  1034
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
																case EBML_ID_CHAPTERUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
																case EBML_ID_CHAPTERTIMESTART:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
																case EBML_ID_CHAPTERTIMEEND:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
																	$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
  1040
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
																case EBML_ID_CHAPTERTRACK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
																	$chaptertrack_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
																		switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
																			case EBML_ID_CHAPTERTRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
																				$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
  1050
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
																				$this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
																case EBML_ID_CHAPTERDISPLAY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
																	$chapterdisplay_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
																		switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
																			case EBML_ID_CHAPSTRING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
																			case EBML_ID_CHAPLANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
																			case EBML_ID_CHAPCOUNTRY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
																				$chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
																				$this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
																	$this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
														$editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry;
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', __LINE__, $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
											$info['matroska']['chapters'][] = $editionentry_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', __LINE__, $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
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
							case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
								$cluster_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
								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
  1102
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
										case EBML_ID_CLUSTERTIMECODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
										case EBML_ID_CLUSTERPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
										case EBML_ID_CLUSTERPREVSIZE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
											$cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
										case EBML_ID_CLUSTERSILENTTRACKS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
											$cluster_silent_tracks = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
													case EBML_ID_CLUSTERSILENTTRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
														$cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
														$this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
											$cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
										case EBML_ID_CLUSTERBLOCKGROUP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
											$cluster_block_group = array('offset' => $this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
													case EBML_ID_CLUSTERBLOCK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
														$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
  1135
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
													case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
													case EBML_ID_CLUSTERBLOCKDURATION:     // unsigned-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
													case EBML_ID_CLUSTERREFERENCEBLOCK:    // signed-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
														$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
  1144
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
													case EBML_ID_CLUSTERCODECSTATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
														$this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
											$cluster_entry[$subelement['id_name']][] = $cluster_block_group;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
										case EBML_ID_CLUSTERSIMPLEBLOCK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
											$cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
											$this->unhandledElement('cluster', __LINE__, $subelement);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
									$this->current_offset = $subelement['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
								if (!self::$hide_clusters) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
									$info['matroska']['cluster'][] = $cluster_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
								// 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
  1171
								if (!self::$parse_whole_file) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
									if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
										if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
											if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
												return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
								$this->unhandledElement('segment', __LINE__, $element_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
					$this->unhandledElement('root', __LINE__, $top_element);
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
	private function EnsureBufferHasEnoughData($min_data=1024) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
		if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
			$read_bytes = max($min_data, $this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
			try {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
				$this->fseek($this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
				$this->EBMLbuffer_offset = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
				$this->EBMLbuffer        = $this->fread($read_bytes);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
				$this->EBMLbuffer_length = strlen($this->EBMLbuffer);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
			} catch (getid3_exception $e) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
				$this->warning('EBML parser: '.$e->getMessage());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
				return false;
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
			if ($this->EBMLbuffer_length == 0 && $this->feof()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
				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
  1210
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
	private function readEBMLint() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
		$actual_offset = $this->current_offset - $this->EBMLbuffer_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
		// get length of integer
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
		$first_byte_int = ord($this->EBMLbuffer[$actual_offset]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
		if       (0x80 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
			$length = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
		} elseif (0x40 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
			$length = 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
		} elseif (0x20 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
			$length = 3;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
		} elseif (0x10 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
			$length = 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
		} elseif (0x08 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
			$length = 5;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
		} elseif (0x04 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
			$length = 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
		} elseif (0x02 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
			$length = 7;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
		} elseif (0x01 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
			$length = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
			throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
		// read
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
		$int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
		$this->current_offset += $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
		return $int_value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
	private function readEBMLelementData($length, $check_buffer=false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
		if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
		$data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
		$this->current_offset += $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
		return $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
	private function getEBMLelement(&$element, $parent_end, $get_data=false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
		if ($this->current_offset >= $parent_end) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
			return false;
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
		if (!$this->EnsureBufferHasEnoughData()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
			$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
  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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
		$element = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
		// set offset
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
		$element['offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
		// get ID
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
		$element['id'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
		// get name
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
		$element['id_name'] = self::EBMLidName($element['id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
		// get length
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
		$element['length'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
		// get end offset
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
		$element['end'] = $this->current_offset + $element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
		// get raw data
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
		$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
  1285
		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
  1286
			$element['data'] = $this->readEBMLelementData($element['length'], $element);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
	private function unhandledElement($type, $line, $element) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
		// warn only about unknown and missed elements, not about unuseful
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
		if (!in_array($element['id'], $this->unuseful_elements)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
			$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
  1296
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
		// increase offset for unparsed elements
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
		if (!isset($element['data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
			$this->current_offset = $element['end'];
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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
	private function ExtractCommentsSimpleTag($SimpleTagArray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
		if (!empty($SimpleTagArray['SimpleTag'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
			foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
				if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
					$this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
				if (!empty($SimpleTagData['SimpleTag'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
					$this->ExtractCommentsSimpleTag($SimpleTagData);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
	private function HandleEMBLSimpleTag($parent_end) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
		$simpletag_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
		while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
			switch ($element['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
				case EBML_ID_TAGNAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
				case EBML_ID_TAGLANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
				case EBML_ID_TAGSTRING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
				case EBML_ID_TAGBINARY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
					$simpletag_entry[$element['id_name']] = $element['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
				case EBML_ID_SIMPLETAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
					$simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
				case EBML_ID_TAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
					$simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
					$this->unhandledElement('tag.simpletag', __LINE__, $element);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
		return $simpletag_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
	private function HandleEMBLClusterBlock($element, $block_type, &$info) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
		// http://www.matroska.org/technical/specs/index.html#block_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
		// http://www.matroska.org/technical/specs/index.html#simpleblock_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
		$block_data = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
		$block_data['tracknumber'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
		$block_data['timecode']    = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
		$block_data['flags_raw']   = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
			$block_data['flags']['keyframe']  = (($block_data['flags_raw'] & 0x80) >> 7);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
		else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1362
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1363
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
		$block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
		$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
  1366
		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
			$block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
		else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
			//$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
		$block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1374
		// Lace (when lacing bit is set)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1375
		if ($block_data['flags']['lacing'] > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1376
			$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
  1377
			if ($block_data['flags']['lacing'] != 0x02) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
				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
  1379
					if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
						$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
  1381
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
					else { // Xiph lacing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
						$block_data['lace_frames_size'][$i] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
						do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
							$size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1386
							$block_data['lace_frames_size'][$i] += $size;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
						while ($size == 255);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
				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
  1392
					$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
  1393
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1397
		if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
			$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
			$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
  1400
			//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1401
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1402
		//$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
  1403
		//$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
  1404
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
		// set offset manually
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
		$this->current_offset = $element['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
		return $block_data;
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
	private static function EBML2Int($EBMLstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1412
		// http://matroska.org/specs/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1413
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
		// Element ID coded with an UTF-8 like system:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1415
		// 1xxx xxxx                                  - Class A IDs (2^7 -2 possible values) (base 0x8X)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1416
		// 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
  1417
		// 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
  1418
		// 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
  1419
		// Values with all x at 0 and 1 are reserved (hence the -2).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
		// Data size, in octets, is also coded with an UTF-8 like system :
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
		// 1xxx xxxx                                                                              - value 0 to  2^7-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
		// 01xx xxxx  xxxx xxxx                                                                   - value 0 to 2^14-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
		// 001x xxxx  xxxx xxxx  xxxx xxxx                                                        - value 0 to 2^21-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
		// 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
  1426
		// 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
  1427
		// 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
  1428
		// 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
  1429
		// 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
  1430
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
		$first_byte_int = ord($EBMLstring[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
		if (0x80 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
			$EBMLstring[0] = chr($first_byte_int & 0x7F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
		} elseif (0x40 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
			$EBMLstring[0] = chr($first_byte_int & 0x3F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
		} elseif (0x20 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
			$EBMLstring[0] = chr($first_byte_int & 0x1F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
		} elseif (0x10 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
			$EBMLstring[0] = chr($first_byte_int & 0x0F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
		} elseif (0x08 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
			$EBMLstring[0] = chr($first_byte_int & 0x07);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
		} elseif (0x04 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
			$EBMLstring[0] = chr($first_byte_int & 0x03);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
		} elseif (0x02 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
			$EBMLstring[0] = chr($first_byte_int & 0x01);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
		} elseif (0x01 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
			$EBMLstring[0] = chr($first_byte_int & 0x00);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
		return getid3_lib::BigEndian2Int($EBMLstring);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
	private static function EBMLdate2unix($EBMLdatestamp) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
		// 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
  1455
		// 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
  1456
		return round(($EBMLdatestamp / 1000000000) + 978307200);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
	public static function TargetTypeValue($target_type) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
		// http://www.matroska.org/technical/specs/tagging/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
		static $TargetTypeValue = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
		if (empty($TargetTypeValue)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
			$TargetTypeValue[10] = 'A: ~ V:shot';                                           // the lowest hierarchy found in music or movies
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
			$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
  1465
			$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
  1466
			$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
  1467
			$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
  1468
			$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
  1469
			$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
  1470
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
		return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
	public static function BlockLacingType($lacingtype) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
		// http://matroska.org/technical/specs/index.html#block_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
		static $BlockLacingType = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
		if (empty($BlockLacingType)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1478
			$BlockLacingType[0x00] = 'no lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1479
			$BlockLacingType[0x01] = 'Xiph lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
			$BlockLacingType[0x02] = 'fixed-size lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
			$BlockLacingType[0x03] = 'EBML lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
		return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
	public static function CodecIDtoCommonName($codecid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1487
		// http://www.matroska.org/technical/specs/codecid/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1488
		static $CodecIDlist = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1489
		if (empty($CodecIDlist)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1490
			$CodecIDlist['A_AAC']            = 'aac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
			$CodecIDlist['A_AAC/MPEG2/LC']   = 'aac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
			$CodecIDlist['A_AC3']            = 'ac3';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1493
			$CodecIDlist['A_DTS']            = 'dts';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1494
			$CodecIDlist['A_FLAC']           = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
			$CodecIDlist['A_MPEG/L1']        = 'mp1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
			$CodecIDlist['A_MPEG/L2']        = 'mp2';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1497
			$CodecIDlist['A_MPEG/L3']        = 'mp3';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
			$CodecIDlist['A_PCM/INT/LIT']    = 'pcm';       // PCM Integer Little Endian
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1499
			$CodecIDlist['A_PCM/INT/BIG']    = 'pcm';       // PCM Integer Big Endian
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
			$CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
			$CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
			$CodecIDlist['A_VORBIS']         = 'vorbis';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1503
			$CodecIDlist['V_MPEG1']          = 'mpeg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1504
			$CodecIDlist['V_THEORA']         = 'theora';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1505
			$CodecIDlist['V_REAL/RV40']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1506
			$CodecIDlist['V_REAL/RV10']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1507
			$CodecIDlist['V_REAL/RV20']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1508
			$CodecIDlist['V_REAL/RV30']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1509
			$CodecIDlist['V_QUICKTIME']      = 'quicktime'; // Quicktime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
			$CodecIDlist['V_MPEG4/ISO/AP']   = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
			$CodecIDlist['V_MPEG4/ISO/ASP']  = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
			$CodecIDlist['V_MPEG4/ISO/AVC']  = 'h264';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
			$CodecIDlist['V_MPEG4/ISO/SP']   = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
			$CodecIDlist['V_VP8']            = 'vp8';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1515
			$CodecIDlist['V_MS/VFW/FOURCC']  = 'vcm'; // Microsoft (TM) Video Codec Manager (VCM)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1516
			$CodecIDlist['A_MS/ACM']         = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM)
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
		return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
	private static function EBMLidName($value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
		static $EBMLidList = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
		if (empty($EBMLidList)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1524
			$EBMLidList[EBML_ID_ASPECTRATIOTYPE]            = 'AspectRatioType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1525
			$EBMLidList[EBML_ID_ATTACHEDFILE]               = 'AttachedFile';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
			$EBMLidList[EBML_ID_ATTACHMENTLINK]             = 'AttachmentLink';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
			$EBMLidList[EBML_ID_ATTACHMENTS]                = 'Attachments';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1528
			$EBMLidList[EBML_ID_AUDIO]                      = 'Audio';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
			$EBMLidList[EBML_ID_BITDEPTH]                   = 'BitDepth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1530
			$EBMLidList[EBML_ID_CHANNELPOSITIONS]           = 'ChannelPositions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1531
			$EBMLidList[EBML_ID_CHANNELS]                   = 'Channels';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1532
			$EBMLidList[EBML_ID_CHAPCOUNTRY]                = 'ChapCountry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1533
			$EBMLidList[EBML_ID_CHAPLANGUAGE]               = 'ChapLanguage';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1534
			$EBMLidList[EBML_ID_CHAPPROCESS]                = 'ChapProcess';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1535
			$EBMLidList[EBML_ID_CHAPPROCESSCODECID]         = 'ChapProcessCodecID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
			$EBMLidList[EBML_ID_CHAPPROCESSCOMMAND]         = 'ChapProcessCommand';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
			$EBMLidList[EBML_ID_CHAPPROCESSDATA]            = 'ChapProcessData';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1538
			$EBMLidList[EBML_ID_CHAPPROCESSPRIVATE]         = 'ChapProcessPrivate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1539
			$EBMLidList[EBML_ID_CHAPPROCESSTIME]            = 'ChapProcessTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1540
			$EBMLidList[EBML_ID_CHAPSTRING]                 = 'ChapString';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1541
			$EBMLidList[EBML_ID_CHAPTERATOM]                = 'ChapterAtom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1542
			$EBMLidList[EBML_ID_CHAPTERDISPLAY]             = 'ChapterDisplay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1543
			$EBMLidList[EBML_ID_CHAPTERFLAGENABLED]         = 'ChapterFlagEnabled';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1544
			$EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN]          = 'ChapterFlagHidden';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
			$EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV]       = 'ChapterPhysicalEquiv';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
			$EBMLidList[EBML_ID_CHAPTERS]                   = 'Chapters';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
			$EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID]   = 'ChapterSegmentEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1548
			$EBMLidList[EBML_ID_CHAPTERSEGMENTUID]          = 'ChapterSegmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1549
			$EBMLidList[EBML_ID_CHAPTERTIMEEND]             = 'ChapterTimeEnd';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1550
			$EBMLidList[EBML_ID_CHAPTERTIMESTART]           = 'ChapterTimeStart';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1551
			$EBMLidList[EBML_ID_CHAPTERTRACK]               = 'ChapterTrack';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1552
			$EBMLidList[EBML_ID_CHAPTERTRACKNUMBER]         = 'ChapterTrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1553
			$EBMLidList[EBML_ID_CHAPTERTRANSLATE]           = 'ChapterTranslate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1554
			$EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC]      = 'ChapterTranslateCodec';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1555
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1556
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEID]         = 'ChapterTranslateID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1557
			$EBMLidList[EBML_ID_CHAPTERUID]                 = 'ChapterUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
			$EBMLidList[EBML_ID_CLUSTER]                    = 'Cluster';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
			$EBMLidList[EBML_ID_CLUSTERBLOCK]               = 'ClusterBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDID]          = 'ClusterBlockAddID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL]     = 'ClusterBlockAdditional';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1562
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID]     = 'ClusterBlockAdditionID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1563
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS]      = 'ClusterBlockAdditions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1564
			$EBMLidList[EBML_ID_CLUSTERBLOCKDURATION]       = 'ClusterBlockDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1565
			$EBMLidList[EBML_ID_CLUSTERBLOCKGROUP]          = 'ClusterBlockGroup';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1566
			$EBMLidList[EBML_ID_CLUSTERBLOCKMORE]           = 'ClusterBlockMore';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1567
			$EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL]        = 'ClusterBlockVirtual';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1568
			$EBMLidList[EBML_ID_CLUSTERCODECSTATE]          = 'ClusterCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1569
			$EBMLidList[EBML_ID_CLUSTERDELAY]               = 'ClusterDelay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1570
			$EBMLidList[EBML_ID_CLUSTERDURATION]            = 'ClusterDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1571
			$EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK]      = 'ClusterEncryptedBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1572
			$EBMLidList[EBML_ID_CLUSTERFRAMENUMBER]         = 'ClusterFrameNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1573
			$EBMLidList[EBML_ID_CLUSTERLACENUMBER]          = 'ClusterLaceNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1574
			$EBMLidList[EBML_ID_CLUSTERPOSITION]            = 'ClusterPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1575
			$EBMLidList[EBML_ID_CLUSTERPREVSIZE]            = 'ClusterPrevSize';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1576
			$EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK]      = 'ClusterReferenceBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1577
			$EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY]   = 'ClusterReferencePriority';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1578
			$EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL]    = 'ClusterReferenceVirtual';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1579
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER]   = 'ClusterSilentTrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1580
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKS]        = 'ClusterSilentTracks';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1581
			$EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK]         = 'ClusterSimpleBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1582
			$EBMLidList[EBML_ID_CLUSTERTIMECODE]            = 'ClusterTimecode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1583
			$EBMLidList[EBML_ID_CLUSTERTIMESLICE]           = 'ClusterTimeSlice';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1584
			$EBMLidList[EBML_ID_CODECDECODEALL]             = 'CodecDecodeAll';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1585
			$EBMLidList[EBML_ID_CODECDOWNLOADURL]           = 'CodecDownloadURL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
			$EBMLidList[EBML_ID_CODECID]                    = 'CodecID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1587
			$EBMLidList[EBML_ID_CODECINFOURL]               = 'CodecInfoURL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1588
			$EBMLidList[EBML_ID_CODECNAME]                  = 'CodecName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1589
			$EBMLidList[EBML_ID_CODECPRIVATE]               = 'CodecPrivate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1590
			$EBMLidList[EBML_ID_CODECSETTINGS]              = 'CodecSettings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1591
			$EBMLidList[EBML_ID_COLOURSPACE]                = 'ColourSpace';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1592
			$EBMLidList[EBML_ID_CONTENTCOMPALGO]            = 'ContentCompAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1593
			$EBMLidList[EBML_ID_CONTENTCOMPRESSION]         = 'ContentCompression';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1594
			$EBMLidList[EBML_ID_CONTENTCOMPSETTINGS]        = 'ContentCompSettings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1595
			$EBMLidList[EBML_ID_CONTENTENCALGO]             = 'ContentEncAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1596
			$EBMLidList[EBML_ID_CONTENTENCKEYID]            = 'ContentEncKeyID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1597
			$EBMLidList[EBML_ID_CONTENTENCODING]            = 'ContentEncoding';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1598
			$EBMLidList[EBML_ID_CONTENTENCODINGORDER]       = 'ContentEncodingOrder';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1599
			$EBMLidList[EBML_ID_CONTENTENCODINGS]           = 'ContentEncodings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1600
			$EBMLidList[EBML_ID_CONTENTENCODINGSCOPE]       = 'ContentEncodingScope';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1601
			$EBMLidList[EBML_ID_CONTENTENCODINGTYPE]        = 'ContentEncodingType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1602
			$EBMLidList[EBML_ID_CONTENTENCRYPTION]          = 'ContentEncryption';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1603
			$EBMLidList[EBML_ID_CONTENTSIGALGO]             = 'ContentSigAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1604
			$EBMLidList[EBML_ID_CONTENTSIGHASHALGO]         = 'ContentSigHashAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1605
			$EBMLidList[EBML_ID_CONTENTSIGKEYID]            = 'ContentSigKeyID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1606
			$EBMLidList[EBML_ID_CONTENTSIGNATURE]           = 'ContentSignature';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1607
			$EBMLidList[EBML_ID_CRC32]                      = 'CRC32';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1608
			$EBMLidList[EBML_ID_CUEBLOCKNUMBER]             = 'CueBlockNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1609
			$EBMLidList[EBML_ID_CUECLUSTERPOSITION]         = 'CueClusterPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1610
			$EBMLidList[EBML_ID_CUECODECSTATE]              = 'CueCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1611
			$EBMLidList[EBML_ID_CUEPOINT]                   = 'CuePoint';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1612
			$EBMLidList[EBML_ID_CUEREFCLUSTER]              = 'CueRefCluster';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1613
			$EBMLidList[EBML_ID_CUEREFCODECSTATE]           = 'CueRefCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1614
			$EBMLidList[EBML_ID_CUEREFERENCE]               = 'CueReference';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1615
			$EBMLidList[EBML_ID_CUEREFNUMBER]               = 'CueRefNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1616
			$EBMLidList[EBML_ID_CUEREFTIME]                 = 'CueRefTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1617
			$EBMLidList[EBML_ID_CUES]                       = 'Cues';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1618
			$EBMLidList[EBML_ID_CUETIME]                    = 'CueTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1619
			$EBMLidList[EBML_ID_CUETRACK]                   = 'CueTrack';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1620
			$EBMLidList[EBML_ID_CUETRACKPOSITIONS]          = 'CueTrackPositions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1621
			$EBMLidList[EBML_ID_DATEUTC]                    = 'DateUTC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1622
			$EBMLidList[EBML_ID_DEFAULTDURATION]            = 'DefaultDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1623
			$EBMLidList[EBML_ID_DISPLAYHEIGHT]              = 'DisplayHeight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1624
			$EBMLidList[EBML_ID_DISPLAYUNIT]                = 'DisplayUnit';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1625
			$EBMLidList[EBML_ID_DISPLAYWIDTH]               = 'DisplayWidth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1626
			$EBMLidList[EBML_ID_DOCTYPE]                    = 'DocType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1627
			$EBMLidList[EBML_ID_DOCTYPEREADVERSION]         = 'DocTypeReadVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1628
			$EBMLidList[EBML_ID_DOCTYPEVERSION]             = 'DocTypeVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1629
			$EBMLidList[EBML_ID_DURATION]                   = 'Duration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1630
			$EBMLidList[EBML_ID_EBML]                       = 'EBML';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1631
			$EBMLidList[EBML_ID_EBMLMAXIDLENGTH]            = 'EBMLMaxIDLength';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1632
			$EBMLidList[EBML_ID_EBMLMAXSIZELENGTH]          = 'EBMLMaxSizeLength';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1633
			$EBMLidList[EBML_ID_EBMLREADVERSION]            = 'EBMLReadVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1634
			$EBMLidList[EBML_ID_EBMLVERSION]                = 'EBMLVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1635
			$EBMLidList[EBML_ID_EDITIONENTRY]               = 'EditionEntry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1636
			$EBMLidList[EBML_ID_EDITIONFLAGDEFAULT]         = 'EditionFlagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1637
			$EBMLidList[EBML_ID_EDITIONFLAGHIDDEN]          = 'EditionFlagHidden';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1638
			$EBMLidList[EBML_ID_EDITIONFLAGORDERED]         = 'EditionFlagOrdered';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1639
			$EBMLidList[EBML_ID_EDITIONUID]                 = 'EditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1640
			$EBMLidList[EBML_ID_FILEDATA]                   = 'FileData';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1641
			$EBMLidList[EBML_ID_FILEDESCRIPTION]            = 'FileDescription';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1642
			$EBMLidList[EBML_ID_FILEMIMETYPE]               = 'FileMimeType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1643
			$EBMLidList[EBML_ID_FILENAME]                   = 'FileName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1644
			$EBMLidList[EBML_ID_FILEREFERRAL]               = 'FileReferral';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1645
			$EBMLidList[EBML_ID_FILEUID]                    = 'FileUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1646
			$EBMLidList[EBML_ID_FLAGDEFAULT]                = 'FlagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1647
			$EBMLidList[EBML_ID_FLAGENABLED]                = 'FlagEnabled';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1648
			$EBMLidList[EBML_ID_FLAGFORCED]                 = 'FlagForced';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1649
			$EBMLidList[EBML_ID_FLAGINTERLACED]             = 'FlagInterlaced';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1650
			$EBMLidList[EBML_ID_FLAGLACING]                 = 'FlagLacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1651
			$EBMLidList[EBML_ID_GAMMAVALUE]                 = 'GammaValue';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1652
			$EBMLidList[EBML_ID_INFO]                       = 'Info';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1653
			$EBMLidList[EBML_ID_LANGUAGE]                   = 'Language';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1654
			$EBMLidList[EBML_ID_MAXBLOCKADDITIONID]         = 'MaxBlockAdditionID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1655
			$EBMLidList[EBML_ID_MAXCACHE]                   = 'MaxCache';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1656
			$EBMLidList[EBML_ID_MINCACHE]                   = 'MinCache';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1657
			$EBMLidList[EBML_ID_MUXINGAPP]                  = 'MuxingApp';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1658
			$EBMLidList[EBML_ID_NAME]                       = 'Name';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1659
			$EBMLidList[EBML_ID_NEXTFILENAME]               = 'NextFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1660
			$EBMLidList[EBML_ID_NEXTUID]                    = 'NextUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1661
			$EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY]    = 'OutputSamplingFrequency';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1662
			$EBMLidList[EBML_ID_PIXELCROPBOTTOM]            = 'PixelCropBottom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1663
			$EBMLidList[EBML_ID_PIXELCROPLEFT]              = 'PixelCropLeft';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1664
			$EBMLidList[EBML_ID_PIXELCROPRIGHT]             = 'PixelCropRight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1665
			$EBMLidList[EBML_ID_PIXELCROPTOP]               = 'PixelCropTop';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1666
			$EBMLidList[EBML_ID_PIXELHEIGHT]                = 'PixelHeight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1667
			$EBMLidList[EBML_ID_PIXELWIDTH]                 = 'PixelWidth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1668
			$EBMLidList[EBML_ID_PREVFILENAME]               = 'PrevFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1669
			$EBMLidList[EBML_ID_PREVUID]                    = 'PrevUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1670
			$EBMLidList[EBML_ID_SAMPLINGFREQUENCY]          = 'SamplingFrequency';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1671
			$EBMLidList[EBML_ID_SEEK]                       = 'Seek';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1672
			$EBMLidList[EBML_ID_SEEKHEAD]                   = 'SeekHead';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1673
			$EBMLidList[EBML_ID_SEEKID]                     = 'SeekID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1674
			$EBMLidList[EBML_ID_SEEKPOSITION]               = 'SeekPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1675
			$EBMLidList[EBML_ID_SEGMENT]                    = 'Segment';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1676
			$EBMLidList[EBML_ID_SEGMENTFAMILY]              = 'SegmentFamily';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1677
			$EBMLidList[EBML_ID_SEGMENTFILENAME]            = 'SegmentFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1678
			$EBMLidList[EBML_ID_SEGMENTUID]                 = 'SegmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1679
			$EBMLidList[EBML_ID_SIMPLETAG]                  = 'SimpleTag';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1680
			$EBMLidList[EBML_ID_CLUSTERSLICES]              = 'ClusterSlices';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1681
			$EBMLidList[EBML_ID_STEREOMODE]                 = 'StereoMode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1682
			$EBMLidList[EBML_ID_OLDSTEREOMODE]              = 'OldStereoMode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1683
			$EBMLidList[EBML_ID_TAG]                        = 'Tag';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1684
			$EBMLidList[EBML_ID_TAGATTACHMENTUID]           = 'TagAttachmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1685
			$EBMLidList[EBML_ID_TAGBINARY]                  = 'TagBinary';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1686
			$EBMLidList[EBML_ID_TAGCHAPTERUID]              = 'TagChapterUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1687
			$EBMLidList[EBML_ID_TAGDEFAULT]                 = 'TagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1688
			$EBMLidList[EBML_ID_TAGEDITIONUID]              = 'TagEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1689
			$EBMLidList[EBML_ID_TAGLANGUAGE]                = 'TagLanguage';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1690
			$EBMLidList[EBML_ID_TAGNAME]                    = 'TagName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1691
			$EBMLidList[EBML_ID_TAGTRACKUID]                = 'TagTrackUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1692
			$EBMLidList[EBML_ID_TAGS]                       = 'Tags';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1693
			$EBMLidList[EBML_ID_TAGSTRING]                  = 'TagString';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1694
			$EBMLidList[EBML_ID_TARGETS]                    = 'Targets';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1695
			$EBMLidList[EBML_ID_TARGETTYPE]                 = 'TargetType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1696
			$EBMLidList[EBML_ID_TARGETTYPEVALUE]            = 'TargetTypeValue';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1697
			$EBMLidList[EBML_ID_TIMECODESCALE]              = 'TimecodeScale';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1698
			$EBMLidList[EBML_ID_TITLE]                      = 'Title';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1699
			$EBMLidList[EBML_ID_TRACKENTRY]                 = 'TrackEntry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1700
			$EBMLidList[EBML_ID_TRACKNUMBER]                = 'TrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1701
			$EBMLidList[EBML_ID_TRACKOFFSET]                = 'TrackOffset';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1702
			$EBMLidList[EBML_ID_TRACKOVERLAY]               = 'TrackOverlay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1703
			$EBMLidList[EBML_ID_TRACKS]                     = 'Tracks';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1704
			$EBMLidList[EBML_ID_TRACKTIMECODESCALE]         = 'TrackTimecodeScale';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1705
			$EBMLidList[EBML_ID_TRACKTRANSLATE]             = 'TrackTranslate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1706
			$EBMLidList[EBML_ID_TRACKTRANSLATECODEC]        = 'TrackTranslateCodec';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1707
			$EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID]   = 'TrackTranslateEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1708
			$EBMLidList[EBML_ID_TRACKTRANSLATETRACKID]      = 'TrackTranslateTrackID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1709
			$EBMLidList[EBML_ID_TRACKTYPE]                  = 'TrackType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1710
			$EBMLidList[EBML_ID_TRACKUID]                   = 'TrackUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1711
			$EBMLidList[EBML_ID_VIDEO]                      = 'Video';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1712
			$EBMLidList[EBML_ID_VOID]                       = 'Void';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
			$EBMLidList[EBML_ID_WRITINGAPP]                 = 'WritingApp';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1714
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
		return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
	public static function displayUnit($value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
		// http://www.matroska.org/technical/specs/index.html#DisplayUnit
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
		static $units = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
			0 => 'pixels',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
			1 => 'centimeters',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
			2 => 'inches',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
			3 => 'Display Aspect Ratio');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1727
		return (isset($units[$value]) ? $units[$value] : 'unknown');
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
	private static function getDefaultStreamInfo($streams)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
	{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
		foreach (array_reverse($streams) as $stream) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
			if ($stream['default']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1738
		$unset = array('default', 'name');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1739
		foreach ($unset as $u) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1740
			if (isset($stream[$u])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1741
				unset($stream[$u]);
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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
		$info = $stream;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
		$info['streams'] = $streams;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
		return $info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1751
}