wp/wp-includes/ID3/module.audio-video.matroska.php
author ymh <ymh.work@gmail.com>
Tue, 22 Oct 2019 16:11:46 +0200
changeset 15 3d4e9c994f10
parent 7 cf61fcea0001
child 16 a86126ab1dd4
permissions -rw-r--r--
Upgrade jquery-ui in in-motion theme version from 1.8.14 to 1.8.22 to avoid 'a.curCSS is not a function' errors in console that caused problems with circles and navigation.
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) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   237
			$this->error('EBML parser: '.$e->getMessage());
0
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':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   333
							case 'A_EAC3':
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
							case 'A_DTS':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
							case 'A_MPEG/L3':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
							case 'A_MPEG/L2':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
							case 'A_FLAC':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   338
								$module_dataformat = ($track_info['dataformat'] == 'mp2' ? 'mp3' : ($track_info['dataformat'] == 'eac3' ? 'ac3' : $track_info['dataformat']));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   339
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.$module_dataformat.'.php', __FILE__, true);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
								if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
									$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
   343
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
								// create temp instance
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
								$getid3_temp = new getID3();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
								if ($track_info['dataformat'] != 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
									$getid3_temp->openfile($this->getid3->filename);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
								$getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
								if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
									$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
   354
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
								// analyze
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   357
								$class = 'getid3_'.$module_dataformat;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
								$header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
								$getid3_audio = new $class($getid3_temp, __CLASS__);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
								if ($track_info['dataformat'] == 'flac') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
									$getid3_audio->AnalyzeString($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
								else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
									$getid3_audio->Analyze();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
								if (!empty($getid3_temp->info[$header_data_key])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
										foreach ($getid3_temp->info['audio'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
											$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
										}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
								else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
									$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
   376
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
								// copy errors and warnings
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
								if (!empty($getid3_temp->info['error'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
									foreach ($getid3_temp->info['error'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
										$this->warning($class.'() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
								if (!empty($getid3_temp->info['warning'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
									foreach ($getid3_temp->info['warning'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
										$this->warning($class.'() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
								unset($getid3_temp, $getid3_audio);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
							case 'A_AAC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
							case 'A_AAC/MPEG2/LC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
							case 'A_AAC/MPEG2/LC/SBR':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
							case 'A_AAC/MPEG4/LC':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
							case 'A_AAC/MPEG4/LC/SBR':
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   397
								$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
   398
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
							case 'A_VORBIS':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
								if (!isset($trackarray['CodecPrivate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
									$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
   403
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
								$vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
								if ($vorbis_offset === false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
									$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
   408
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
								$vorbis_offset -= 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   412
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
								// create temp instance
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
								$getid3_temp = new getID3();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
								// analyze
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
								$getid3_ogg = new getid3_ogg($getid3_temp);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
								$oggpageinfo['page_seqno'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
								$getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
								if (!empty($getid3_temp->info['ogg'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
										foreach ($getid3_temp->info['audio'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
											$track_info[$key] = $value;
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
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
								// copy errors and warnings
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
								if (!empty($getid3_temp->info['error'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
									foreach ($getid3_temp->info['error'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
										$this->warning('getid3_ogg() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
								if (!empty($getid3_temp->info['warning'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
									foreach ($getid3_temp->info['warning'] as $newerror) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
										$this->warning('getid3_ogg() says: ['.$newerror.']');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
								if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
									$track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
								unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
							case 'A_MS/ACM':
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   449
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
								$parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
								foreach ($parsed as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
									if ($key != 'raw') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
										$track_info[$key] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
								$this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"');
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   462
								break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
						$info['audio']['streams'][] = $track_info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
			if (!empty($info['video']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
				$info['video'] = self::getDefaultStreamInfo($info['video']['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
			if (!empty($info['audio']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
				$info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
		// process attachments
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
		if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
			foreach ($info['matroska']['attachments'] as $i => $entry) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
				if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
					$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
   483
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
		// determine mime type
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
		if (!empty($info['video']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
		} elseif (!empty($info['audio']['streams'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
		} elseif (isset($info['mime_type'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
			unset($info['mime_type']);
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
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
	private function parseEBML(&$info) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
		// http://www.matroska.org/technical/specs/index.html#EBMLBasics
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
		$this->current_offset = $info['avdataoffset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
		while ($this->getEBMLelement($top_element, $info['avdataend'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
			switch ($top_element['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
				case EBML_ID_EBML:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
					$info['matroska']['header']['offset'] = $top_element['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
					$info['matroska']['header']['length'] = $top_element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
					while ($this->getEBMLelement($element_data, $top_element['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
						switch ($element_data['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
							case EBML_ID_EBMLVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
							case EBML_ID_EBMLREADVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
							case EBML_ID_EBMLMAXIDLENGTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
							case EBML_ID_EBMLMAXSIZELENGTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
							case EBML_ID_DOCTYPEVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
							case EBML_ID_DOCTYPEREADVERSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
								$element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
							case EBML_ID_DOCTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
								$element_data['data'] = getid3_lib::trimNullByte($element_data['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
								$info['matroska']['doctype'] = $element_data['data'];
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   525
								$info['fileformat'] = $element_data['data'];
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
								$this->unhandledElement('header', __LINE__, $element_data);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   530
								break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
						unset($element_data['offset'], $element_data['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
						$info['matroska']['header']['elements'][] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
				case EBML_ID_SEGMENT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
					$info['matroska']['segment'][0]['offset'] = $top_element['offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
					$info['matroska']['segment'][0]['length'] = $top_element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
					while ($this->getEBMLelement($element_data, $top_element['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
						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
   544
							$info['matroska']['segments'][] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
						switch ($element_data['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
							case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
								while ($this->getEBMLelement($seek_entry, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
									switch ($seek_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
										case EBML_ID_SEEK: // Contains a single seek entry to an EBML element
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
											while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
												switch ($sub_seek_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
													case EBML_ID_SEEKID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
														$seek_entry['target_id']   = self::EBML2Int($sub_seek_entry['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
														$seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']);
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
													case EBML_ID_SEEKPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
														$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
   565
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
														$this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry);												}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   569
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
											}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   571
											if (!isset($seek_entry['target_id'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   572
												$this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   573
												break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   574
											}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   575
											if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !self::$hide_clusters) { // collect clusters only if required
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
												$info['matroska']['seek'][] = $seek_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
											$this->unhandledElement('seekhead', __LINE__, $seek_entry);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   582
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
							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
   588
								$info['matroska']['tracks'] = $element_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
								while ($this->getEBMLelement($track_entry, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
									switch ($track_entry['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
										case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
											while ($this->getEBMLelement($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
   596
												switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
													case EBML_ID_TRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
													case EBML_ID_TRACKUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
													case EBML_ID_TRACKTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
													case EBML_ID_MINCACHE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
													case EBML_ID_MAXCACHE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
													case EBML_ID_MAXBLOCKADDITIONID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
													case EBML_ID_DEFAULTDURATION: // nanoseconds per frame
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
													case EBML_ID_TRACKTIMECODESCALE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
													case EBML_ID_CODECID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
													case EBML_ID_LANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
													case EBML_ID_NAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
													case EBML_ID_CODECNAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
														$track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
													case EBML_ID_CODECPRIVATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
														$track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
													case EBML_ID_FLAGENABLED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
													case EBML_ID_FLAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
													case EBML_ID_FLAGFORCED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
													case EBML_ID_FLAGLACING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
													case EBML_ID_CODECDECODEALL:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
														$track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
													case EBML_ID_VIDEO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
															switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
																case EBML_ID_PIXELWIDTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
																case EBML_ID_PIXELHEIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
																case EBML_ID_PIXELCROPBOTTOM:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
																case EBML_ID_PIXELCROPTOP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
																case EBML_ID_PIXELCROPLEFT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
																case EBML_ID_PIXELCROPRIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
																case EBML_ID_DISPLAYWIDTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
																case EBML_ID_DISPLAYHEIGHT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
																case EBML_ID_DISPLAYUNIT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
																case EBML_ID_ASPECTRATIOTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
																case EBML_ID_STEREOMODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
																case EBML_ID_OLDSTEREOMODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
																case EBML_ID_FLAGINTERLACED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
																	$track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
																case EBML_ID_GAMMAVALUE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
																case EBML_ID_COLOURSPACE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
																	$this->unhandledElement('track.video', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   665
																	break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
														}
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_AUDIO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
															switch ($sub_subelement['id']) {
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_CHANNELS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
																case EBML_ID_BITDEPTH:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
																case EBML_ID_SAMPLINGFREQUENCY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
																case EBML_ID_OUTPUTSAMPLINGFREQUENCY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
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_CHANNELPOSITIONS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
																	$this->unhandledElement('track.audio', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   691
																	break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
													case EBML_ID_CONTENTENCODINGS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
														while ($this->getEBMLelement($sub_subelement, $subelement['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
															switch ($sub_subelement['id']) {
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_CONTENTENCODING:
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_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
																		switch ($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_CONTENTENCODINGORDER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
																			case EBML_ID_CONTENTENCODINGSCOPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
																			case EBML_ID_CONTENTENCODINGTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
																				$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
   710
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
																			case EBML_ID_CONTENTCOMPRESSION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
																					switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
																						case EBML_ID_CONTENTCOMPALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
																							$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
   719
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
																						case EBML_ID_CONTENTCOMPSETTINGS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
																							$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
   723
																							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
																						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
																							$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   727
																							break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
																					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
																				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
																			case EBML_ID_CONTENTENCRYPTION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
																					switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
																						case EBML_ID_CONTENTENCALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
																						case EBML_ID_CONTENTSIGALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
																						case EBML_ID_CONTENTSIGHASHALGO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
																							$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
   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
																						case EBML_ID_CONTENTENCKEYID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
																						case EBML_ID_CONTENTSIGNATURE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
																						case EBML_ID_CONTENTSIGKEYID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
																							$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
   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.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   751
																							break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
																					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
																				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
																				$this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   758
																				break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
																	$this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   765
																	break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
														$this->unhandledElement('track', __LINE__, $subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   772
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
											$info['matroska']['tracks']['tracks'][] = $track_entry;
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
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
											$this->unhandledElement('tracks', __LINE__, $track_entry);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   781
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
							case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
								$info_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
								while ($this->getEBMLelement($subelement, $element_data['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
										case EBML_ID_TIMECODESCALE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
										case EBML_ID_DURATION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
										case EBML_ID_DATEUTC:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
											$info_entry[$subelement['id_name']]         = getid3_lib::BigEndian2Int($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
											$info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
										case EBML_ID_SEGMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
										case EBML_ID_PREVUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
										case EBML_ID_NEXTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
										case EBML_ID_SEGMENTFAMILY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
											$info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
										case EBML_ID_SEGMENTFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
										case EBML_ID_PREVFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
										case EBML_ID_NEXTFILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
										case EBML_ID_TITLE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
										case EBML_ID_MUXINGAPP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
										case EBML_ID_WRITINGAPP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
											$info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
										case EBML_ID_CHAPTERTRANSLATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
											$chaptertranslate_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
													case EBML_ID_CHAPTERTRANSLATEEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
														$chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
													case EBML_ID_CHAPTERTRANSLATECODEC:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
													case EBML_ID_CHAPTERTRANSLATEID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
														$this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   845
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
											$info_entry[$subelement['id_name']] = $chaptertranslate_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
											$this->unhandledElement('info', __LINE__, $subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   853
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
								$info['matroska']['info'][] = $info_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
							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
   860
								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
   861
									$this->current_offset = $element_data['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
								$cues_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
										case EBML_ID_CUEPOINT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
											$cuepoint_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
													case EBML_ID_CUETRACKPOSITIONS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
														$cuetrackpositions_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
																case EBML_ID_CUETRACK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
																case EBML_ID_CUECLUSTERPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
																case EBML_ID_CUEBLOCKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
																case EBML_ID_CUECODECSTATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
																	$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
   886
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
																	$this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   890
																	break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
														$cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
													case EBML_ID_CUETIME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
														$cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
														$this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   902
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
											$cues_entry[] = $cuepoint_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
											$this->unhandledElement('cues', __LINE__, $subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   910
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
								$info['matroska']['cues'] = $cues_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
							case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
								$tags_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
								while ($this->getEBMLelement($subelement, $element_data['end'], false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
										case EBML_ID_TAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
											$tag_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
													case EBML_ID_TARGETS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
														$targets_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
																case EBML_ID_TARGETTYPEVALUE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
																	$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
   936
																	$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
   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
																case EBML_ID_TARGETTYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
																	$targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
																case EBML_ID_TAGTRACKUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
																case EBML_ID_TAGEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
																case EBML_ID_TAGCHAPTERUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
																case EBML_ID_TAGATTACHMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
																	$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
   948
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
																	$this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   952
																	break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
														$tag_entry[$sub_subelement['id_name']] = $targets_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
														break;
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_SIMPLETAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
														$tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
														$this->unhandledElement('tags.tag', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   964
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
											$tags_entry[] = $tag_entry;
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
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
											$this->unhandledElement('tags', __LINE__, $subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   972
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
								$info['matroska']['tags'] = $tags_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
							case EBML_ID_ATTACHMENTS: // Contain attached files.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
										case EBML_ID_ATTACHEDFILE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
											$attachedfile_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
													case EBML_ID_FILEDESCRIPTION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
													case EBML_ID_FILENAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
													case EBML_ID_FILEMIMETYPE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
														$attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
													case EBML_ID_FILEDATA:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
														$attachedfile_entry['data_offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
														$attachedfile_entry['data_length'] = $sub_subelement['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
														$attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
															$attachedfile_entry['FileName'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
															$attachedfile_entry['data_offset'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
															$attachedfile_entry['data_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
														$this->current_offset = $sub_subelement['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
													case EBML_ID_FILEUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
														$attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
														$this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1013
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
											$info['matroska']['attachments'][] = $attachedfile_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
											$this->unhandledElement('attachments', __LINE__, $subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1021
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
								break;
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_CHAPTERS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
								while ($this->getEBMLelement($subelement, $element_data['end'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
									switch ($subelement['id']) {
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_EDITIONENTRY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
											$editionentry_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
													case EBML_ID_EDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
														$editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
													case EBML_ID_EDITIONFLAGHIDDEN:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
													case EBML_ID_EDITIONFLAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
													case EBML_ID_EDITIONFLAGORDERED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
														$editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
													case EBML_ID_CHAPTERATOM:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
														$chapteratom_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
														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
  1051
															switch ($sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
																case EBML_ID_CHAPTERSEGMENTUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
																case EBML_ID_CHAPTERSEGMENTEDITIONUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
																case EBML_ID_CHAPTERFLAGENABLED:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
																case EBML_ID_CHAPTERFLAGHIDDEN:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
																	$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
  1061
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
																case EBML_ID_CHAPTERUID:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
																case EBML_ID_CHAPTERTIMESTART:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
																case EBML_ID_CHAPTERTIMEEND:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
																	$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
  1067
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
																case EBML_ID_CHAPTERTRACK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
																	$chaptertrack_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
																		switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
																			case EBML_ID_CHAPTERTRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
																				$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
  1077
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
																				$this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1081
																				break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
																case EBML_ID_CHAPTERDISPLAY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
																	$chapterdisplay_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
																		switch ($sub_sub_sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
																			case EBML_ID_CHAPSTRING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
																			case EBML_ID_CHAPLANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
																			case EBML_ID_CHAPCOUNTRY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
																				$chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
																				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
																			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
																				$this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1101
																				break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
																		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
																	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
																	break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
																default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
																	$this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1109
																	break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
															}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
														}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
														$editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
														$this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1117
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
											$info['matroska']['chapters'][] = $editionentry_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
											$this->unhandledElement('chapters', __LINE__, $subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1125
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
							case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
								$cluster_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
								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
  1134
									switch ($subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
										case EBML_ID_CLUSTERTIMECODE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
										case EBML_ID_CLUSTERPOSITION:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
										case EBML_ID_CLUSTERPREVSIZE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
											$cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($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_CLUSTERSILENTTRACKS:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
											$cluster_silent_tracks = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
													case EBML_ID_CLUSTERSILENTTRACKNUMBER:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
														$cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
														$this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1154
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
											$cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
										case EBML_ID_CLUSTERBLOCKGROUP:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
											$cluster_block_group = array('offset' => $this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
												switch ($sub_subelement['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
													case EBML_ID_CLUSTERBLOCK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
														$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
  1168
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
													case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
													case EBML_ID_CLUSTERBLOCKDURATION:     // unsigned-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
													case EBML_ID_CLUSTERREFERENCEBLOCK:    // signed-int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
														$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
  1177
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
													case EBML_ID_CLUSTERCODECSTATE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
														break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
													default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
														$this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1185
														break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
												}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
											$cluster_entry[$subelement['id_name']][] = $cluster_block_group;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
										case EBML_ID_CLUSTERSIMPLEBLOCK:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
											$cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
											$this->unhandledElement('cluster', __LINE__, $subelement);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1197
											break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
									$this->current_offset = $subelement['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
								if (!self::$hide_clusters) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
									$info['matroska']['cluster'][] = $cluster_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
								// 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
  1206
								if (!self::$parse_whole_file) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
									if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
										if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
											if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
												return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
										}
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
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
							default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
								$this->unhandledElement('segment', __LINE__, $element_data);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1219
								break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
					$this->unhandledElement('root', __LINE__, $top_element);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1226
					break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
	private function EnsureBufferHasEnoughData($min_data=1024) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
		if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
			$read_bytes = max($min_data, $this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
			try {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
				$this->fseek($this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
				$this->EBMLbuffer_offset = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
				$this->EBMLbuffer        = $this->fread($read_bytes);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
				$this->EBMLbuffer_length = strlen($this->EBMLbuffer);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
			} catch (getid3_exception $e) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
				$this->warning('EBML parser: '.$e->getMessage());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
			if ($this->EBMLbuffer_length == 0 && $this->feof()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
				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
  1247
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
	private function readEBMLint() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
		$actual_offset = $this->current_offset - $this->EBMLbuffer_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
		// get length of integer
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
		$first_byte_int = ord($this->EBMLbuffer[$actual_offset]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
		if       (0x80 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
			$length = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
		} elseif (0x40 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
			$length = 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
		} elseif (0x20 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
			$length = 3;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
		} elseif (0x10 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
			$length = 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
		} elseif (0x08 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
			$length = 5;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
		} elseif (0x04 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
			$length = 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
		} elseif (0x02 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
			$length = 7;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
		} elseif (0x01 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
			$length = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
			throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
		// read
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
		$int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
		$this->current_offset += $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
		return $int_value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
	private function readEBMLelementData($length, $check_buffer=false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
		if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
		$data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
		$this->current_offset += $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
		return $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
	private function getEBMLelement(&$element, $parent_end, $get_data=false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
		if ($this->current_offset >= $parent_end) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
			return false;
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
		if (!$this->EnsureBufferHasEnoughData()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
			$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
  1300
			return false;
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
		$element = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
		// set offset
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
		$element['offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
		// get ID
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
		$element['id'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
		// get name
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
		$element['id_name'] = self::EBMLidName($element['id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
		// get length
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
		$element['length'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
		// get end offset
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
		$element['end'] = $this->current_offset + $element['length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
		// get raw data
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
		$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
  1322
		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
  1323
			$element['data'] = $this->readEBMLelementData($element['length'], $element);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
	private function unhandledElement($type, $line, $element) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
		// warn only about unknown and missed elements, not about unuseful
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
		if (!in_array($element['id'], $this->unuseful_elements)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
			$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
  1333
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
		// increase offset for unparsed elements
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
		if (!isset($element['data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
			$this->current_offset = $element['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
	private function ExtractCommentsSimpleTag($SimpleTagArray) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
		if (!empty($SimpleTagArray['SimpleTag'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
			foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
				if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
					$this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
				if (!empty($SimpleTagData['SimpleTag'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
					$this->ExtractCommentsSimpleTag($SimpleTagData);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
	private function HandleEMBLSimpleTag($parent_end) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
		$simpletag_entry = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
		while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
			switch ($element['id']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1362
				case EBML_ID_TAGNAME:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1363
				case EBML_ID_TAGLANGUAGE:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
				case EBML_ID_TAGSTRING:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
				case EBML_ID_TAGBINARY:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1366
					$simpletag_entry[$element['id_name']] = $element['data'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
				case EBML_ID_SIMPLETAG:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
					$simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
				case EBML_ID_TAGDEFAULT:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1374
					$simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1375
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1376
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1377
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
					$this->unhandledElement('tag.simpletag', __LINE__, $element);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1379
					break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1381
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
		return $simpletag_entry;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1386
	private function HandleEMBLClusterBlock($element, $block_type, &$info) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
		// http://www.matroska.org/technical/specs/index.html#block_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
		// http://www.matroska.org/technical/specs/index.html#simpleblock_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
		$block_data = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
		$block_data['tracknumber'] = $this->readEBMLint();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1392
		$block_data['timecode']    = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1393
		$block_data['flags_raw']   = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
			$block_data['flags']['keyframe']  = (($block_data['flags_raw'] & 0x80) >> 7);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1397
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
		else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1400
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1401
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1402
		$block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1403
		$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
  1404
		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
			$block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
		else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
			//$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1409
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1410
		$block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1411
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1412
		// Lace (when lacing bit is set)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1413
		if ($block_data['flags']['lacing'] > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
			$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
  1415
			if ($block_data['flags']['lacing'] != 0x02) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1416
				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
  1417
					if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1418
						$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
  1419
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
					else { // Xiph lacing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
						$block_data['lace_frames_size'][$i] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
						do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
							$size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
							$block_data['lace_frames_size'][$i] += $size;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1426
						while ($size == 255);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1427
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1428
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1429
				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
  1430
					$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
  1431
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
		if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
			$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
			$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
  1438
			//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
		//$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
  1441
		//$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
  1442
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
		// set offset manually
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
		$this->current_offset = $element['end'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
		return $block_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
	private static function EBML2Int($EBMLstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
		// http://matroska.org/specs/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
		// Element ID coded with an UTF-8 like system:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
		// 1xxx xxxx                                  - Class A IDs (2^7 -2 possible values) (base 0x8X)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
		// 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
  1455
		// 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
  1456
		// 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
  1457
		// Values with all x at 0 and 1 are reserved (hence the -2).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
		// Data size, in octets, is also coded with an UTF-8 like system :
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
		// 1xxx xxxx                                                                              - value 0 to  2^7-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
		// 01xx xxxx  xxxx xxxx                                                                   - value 0 to 2^14-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
		// 001x xxxx  xxxx xxxx  xxxx xxxx                                                        - value 0 to 2^21-2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
		// 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
  1464
		// 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
  1465
		// 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
  1466
		// 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
  1467
		// 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
  1468
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
		$first_byte_int = ord($EBMLstring[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1470
		if (0x80 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
			$EBMLstring[0] = chr($first_byte_int & 0x7F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
		} elseif (0x40 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
			$EBMLstring[0] = chr($first_byte_int & 0x3F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
		} elseif (0x20 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
			$EBMLstring[0] = chr($first_byte_int & 0x1F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
		} elseif (0x10 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
			$EBMLstring[0] = chr($first_byte_int & 0x0F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1478
		} elseif (0x08 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1479
			$EBMLstring[0] = chr($first_byte_int & 0x07);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
		} elseif (0x04 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
			$EBMLstring[0] = chr($first_byte_int & 0x03);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
		} elseif (0x02 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
			$EBMLstring[0] = chr($first_byte_int & 0x01);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
		} elseif (0x01 & $first_byte_int) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
			$EBMLstring[0] = chr($first_byte_int & 0x00);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1487
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1488
		return getid3_lib::BigEndian2Int($EBMLstring);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1489
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1490
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
	private static function EBMLdate2unix($EBMLdatestamp) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
		// 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
  1493
		// 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
  1494
		return round(($EBMLdatestamp / 1000000000) + 978307200);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1497
	public static function TargetTypeValue($target_type) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
		// http://www.matroska.org/technical/specs/tagging/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1499
		static $TargetTypeValue = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
		if (empty($TargetTypeValue)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
			$TargetTypeValue[10] = 'A: ~ V:shot';                                           // the lowest hierarchy found in music or movies
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
			$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
  1503
			$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
  1504
			$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
  1505
			$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
  1506
			$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
  1507
			$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
  1508
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1509
		return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
	public static function BlockLacingType($lacingtype) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
		// http://matroska.org/technical/specs/index.html#block_structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
		static $BlockLacingType = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1515
		if (empty($BlockLacingType)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1516
			$BlockLacingType[0x00] = 'no lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
			$BlockLacingType[0x01] = 'Xiph lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
			$BlockLacingType[0x02] = 'fixed-size lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
			$BlockLacingType[0x03] = 'EBML lacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
		return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1524
	public static function CodecIDtoCommonName($codecid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1525
		// http://www.matroska.org/technical/specs/codecid/index.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
		static $CodecIDlist = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
		if (empty($CodecIDlist)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1528
			$CodecIDlist['A_AAC']            = 'aac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
			$CodecIDlist['A_AAC/MPEG2/LC']   = 'aac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1530
			$CodecIDlist['A_AC3']            = 'ac3';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1531
			$CodecIDlist['A_EAC3']           = 'eac3';
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1532
			$CodecIDlist['A_DTS']            = 'dts';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1533
			$CodecIDlist['A_FLAC']           = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1534
			$CodecIDlist['A_MPEG/L1']        = 'mp1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1535
			$CodecIDlist['A_MPEG/L2']        = 'mp2';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
			$CodecIDlist['A_MPEG/L3']        = 'mp3';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
			$CodecIDlist['A_PCM/INT/LIT']    = 'pcm';       // PCM Integer Little Endian
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1538
			$CodecIDlist['A_PCM/INT/BIG']    = 'pcm';       // PCM Integer Big Endian
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1539
			$CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1540
			$CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1541
			$CodecIDlist['A_VORBIS']         = 'vorbis';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1542
			$CodecIDlist['V_MPEG1']          = 'mpeg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1543
			$CodecIDlist['V_THEORA']         = 'theora';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1544
			$CodecIDlist['V_REAL/RV40']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
			$CodecIDlist['V_REAL/RV10']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
			$CodecIDlist['V_REAL/RV20']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
			$CodecIDlist['V_REAL/RV30']      = 'real';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1548
			$CodecIDlist['V_QUICKTIME']      = 'quicktime'; // Quicktime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1549
			$CodecIDlist['V_MPEG4/ISO/AP']   = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1550
			$CodecIDlist['V_MPEG4/ISO/ASP']  = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1551
			$CodecIDlist['V_MPEG4/ISO/AVC']  = 'h264';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1552
			$CodecIDlist['V_MPEG4/ISO/SP']   = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1553
			$CodecIDlist['V_VP8']            = 'vp8';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1554
			$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
  1555
			$CodecIDlist['A_MS/ACM']         = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM)
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1556
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1557
		return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
	private static function EBMLidName($value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
		static $EBMLidList = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1562
		if (empty($EBMLidList)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1563
			$EBMLidList[EBML_ID_ASPECTRATIOTYPE]            = 'AspectRatioType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1564
			$EBMLidList[EBML_ID_ATTACHEDFILE]               = 'AttachedFile';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1565
			$EBMLidList[EBML_ID_ATTACHMENTLINK]             = 'AttachmentLink';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1566
			$EBMLidList[EBML_ID_ATTACHMENTS]                = 'Attachments';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1567
			$EBMLidList[EBML_ID_AUDIO]                      = 'Audio';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1568
			$EBMLidList[EBML_ID_BITDEPTH]                   = 'BitDepth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1569
			$EBMLidList[EBML_ID_CHANNELPOSITIONS]           = 'ChannelPositions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1570
			$EBMLidList[EBML_ID_CHANNELS]                   = 'Channels';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1571
			$EBMLidList[EBML_ID_CHAPCOUNTRY]                = 'ChapCountry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1572
			$EBMLidList[EBML_ID_CHAPLANGUAGE]               = 'ChapLanguage';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1573
			$EBMLidList[EBML_ID_CHAPPROCESS]                = 'ChapProcess';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1574
			$EBMLidList[EBML_ID_CHAPPROCESSCODECID]         = 'ChapProcessCodecID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1575
			$EBMLidList[EBML_ID_CHAPPROCESSCOMMAND]         = 'ChapProcessCommand';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1576
			$EBMLidList[EBML_ID_CHAPPROCESSDATA]            = 'ChapProcessData';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1577
			$EBMLidList[EBML_ID_CHAPPROCESSPRIVATE]         = 'ChapProcessPrivate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1578
			$EBMLidList[EBML_ID_CHAPPROCESSTIME]            = 'ChapProcessTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1579
			$EBMLidList[EBML_ID_CHAPSTRING]                 = 'ChapString';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1580
			$EBMLidList[EBML_ID_CHAPTERATOM]                = 'ChapterAtom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1581
			$EBMLidList[EBML_ID_CHAPTERDISPLAY]             = 'ChapterDisplay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1582
			$EBMLidList[EBML_ID_CHAPTERFLAGENABLED]         = 'ChapterFlagEnabled';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1583
			$EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN]          = 'ChapterFlagHidden';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1584
			$EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV]       = 'ChapterPhysicalEquiv';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1585
			$EBMLidList[EBML_ID_CHAPTERS]                   = 'Chapters';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
			$EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID]   = 'ChapterSegmentEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1587
			$EBMLidList[EBML_ID_CHAPTERSEGMENTUID]          = 'ChapterSegmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1588
			$EBMLidList[EBML_ID_CHAPTERTIMEEND]             = 'ChapterTimeEnd';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1589
			$EBMLidList[EBML_ID_CHAPTERTIMESTART]           = 'ChapterTimeStart';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1590
			$EBMLidList[EBML_ID_CHAPTERTRACK]               = 'ChapterTrack';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1591
			$EBMLidList[EBML_ID_CHAPTERTRACKNUMBER]         = 'ChapterTrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1592
			$EBMLidList[EBML_ID_CHAPTERTRANSLATE]           = 'ChapterTranslate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1593
			$EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC]      = 'ChapterTranslateCodec';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1594
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1595
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEID]         = 'ChapterTranslateID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1596
			$EBMLidList[EBML_ID_CHAPTERUID]                 = 'ChapterUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1597
			$EBMLidList[EBML_ID_CLUSTER]                    = 'Cluster';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1598
			$EBMLidList[EBML_ID_CLUSTERBLOCK]               = 'ClusterBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1599
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDID]          = 'ClusterBlockAddID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1600
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL]     = 'ClusterBlockAdditional';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1601
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID]     = 'ClusterBlockAdditionID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1602
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS]      = 'ClusterBlockAdditions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1603
			$EBMLidList[EBML_ID_CLUSTERBLOCKDURATION]       = 'ClusterBlockDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1604
			$EBMLidList[EBML_ID_CLUSTERBLOCKGROUP]          = 'ClusterBlockGroup';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1605
			$EBMLidList[EBML_ID_CLUSTERBLOCKMORE]           = 'ClusterBlockMore';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1606
			$EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL]        = 'ClusterBlockVirtual';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1607
			$EBMLidList[EBML_ID_CLUSTERCODECSTATE]          = 'ClusterCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1608
			$EBMLidList[EBML_ID_CLUSTERDELAY]               = 'ClusterDelay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1609
			$EBMLidList[EBML_ID_CLUSTERDURATION]            = 'ClusterDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1610
			$EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK]      = 'ClusterEncryptedBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1611
			$EBMLidList[EBML_ID_CLUSTERFRAMENUMBER]         = 'ClusterFrameNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1612
			$EBMLidList[EBML_ID_CLUSTERLACENUMBER]          = 'ClusterLaceNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1613
			$EBMLidList[EBML_ID_CLUSTERPOSITION]            = 'ClusterPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1614
			$EBMLidList[EBML_ID_CLUSTERPREVSIZE]            = 'ClusterPrevSize';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1615
			$EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK]      = 'ClusterReferenceBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1616
			$EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY]   = 'ClusterReferencePriority';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1617
			$EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL]    = 'ClusterReferenceVirtual';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1618
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER]   = 'ClusterSilentTrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1619
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKS]        = 'ClusterSilentTracks';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1620
			$EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK]         = 'ClusterSimpleBlock';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1621
			$EBMLidList[EBML_ID_CLUSTERTIMECODE]            = 'ClusterTimecode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1622
			$EBMLidList[EBML_ID_CLUSTERTIMESLICE]           = 'ClusterTimeSlice';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1623
			$EBMLidList[EBML_ID_CODECDECODEALL]             = 'CodecDecodeAll';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1624
			$EBMLidList[EBML_ID_CODECDOWNLOADURL]           = 'CodecDownloadURL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1625
			$EBMLidList[EBML_ID_CODECID]                    = 'CodecID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1626
			$EBMLidList[EBML_ID_CODECINFOURL]               = 'CodecInfoURL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1627
			$EBMLidList[EBML_ID_CODECNAME]                  = 'CodecName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1628
			$EBMLidList[EBML_ID_CODECPRIVATE]               = 'CodecPrivate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1629
			$EBMLidList[EBML_ID_CODECSETTINGS]              = 'CodecSettings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1630
			$EBMLidList[EBML_ID_COLOURSPACE]                = 'ColourSpace';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1631
			$EBMLidList[EBML_ID_CONTENTCOMPALGO]            = 'ContentCompAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1632
			$EBMLidList[EBML_ID_CONTENTCOMPRESSION]         = 'ContentCompression';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1633
			$EBMLidList[EBML_ID_CONTENTCOMPSETTINGS]        = 'ContentCompSettings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1634
			$EBMLidList[EBML_ID_CONTENTENCALGO]             = 'ContentEncAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1635
			$EBMLidList[EBML_ID_CONTENTENCKEYID]            = 'ContentEncKeyID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1636
			$EBMLidList[EBML_ID_CONTENTENCODING]            = 'ContentEncoding';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1637
			$EBMLidList[EBML_ID_CONTENTENCODINGORDER]       = 'ContentEncodingOrder';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1638
			$EBMLidList[EBML_ID_CONTENTENCODINGS]           = 'ContentEncodings';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1639
			$EBMLidList[EBML_ID_CONTENTENCODINGSCOPE]       = 'ContentEncodingScope';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1640
			$EBMLidList[EBML_ID_CONTENTENCODINGTYPE]        = 'ContentEncodingType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1641
			$EBMLidList[EBML_ID_CONTENTENCRYPTION]          = 'ContentEncryption';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1642
			$EBMLidList[EBML_ID_CONTENTSIGALGO]             = 'ContentSigAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1643
			$EBMLidList[EBML_ID_CONTENTSIGHASHALGO]         = 'ContentSigHashAlgo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1644
			$EBMLidList[EBML_ID_CONTENTSIGKEYID]            = 'ContentSigKeyID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1645
			$EBMLidList[EBML_ID_CONTENTSIGNATURE]           = 'ContentSignature';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1646
			$EBMLidList[EBML_ID_CRC32]                      = 'CRC32';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1647
			$EBMLidList[EBML_ID_CUEBLOCKNUMBER]             = 'CueBlockNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1648
			$EBMLidList[EBML_ID_CUECLUSTERPOSITION]         = 'CueClusterPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1649
			$EBMLidList[EBML_ID_CUECODECSTATE]              = 'CueCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1650
			$EBMLidList[EBML_ID_CUEPOINT]                   = 'CuePoint';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1651
			$EBMLidList[EBML_ID_CUEREFCLUSTER]              = 'CueRefCluster';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1652
			$EBMLidList[EBML_ID_CUEREFCODECSTATE]           = 'CueRefCodecState';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1653
			$EBMLidList[EBML_ID_CUEREFERENCE]               = 'CueReference';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1654
			$EBMLidList[EBML_ID_CUEREFNUMBER]               = 'CueRefNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1655
			$EBMLidList[EBML_ID_CUEREFTIME]                 = 'CueRefTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1656
			$EBMLidList[EBML_ID_CUES]                       = 'Cues';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1657
			$EBMLidList[EBML_ID_CUETIME]                    = 'CueTime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1658
			$EBMLidList[EBML_ID_CUETRACK]                   = 'CueTrack';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1659
			$EBMLidList[EBML_ID_CUETRACKPOSITIONS]          = 'CueTrackPositions';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1660
			$EBMLidList[EBML_ID_DATEUTC]                    = 'DateUTC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1661
			$EBMLidList[EBML_ID_DEFAULTDURATION]            = 'DefaultDuration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1662
			$EBMLidList[EBML_ID_DISPLAYHEIGHT]              = 'DisplayHeight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1663
			$EBMLidList[EBML_ID_DISPLAYUNIT]                = 'DisplayUnit';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1664
			$EBMLidList[EBML_ID_DISPLAYWIDTH]               = 'DisplayWidth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1665
			$EBMLidList[EBML_ID_DOCTYPE]                    = 'DocType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1666
			$EBMLidList[EBML_ID_DOCTYPEREADVERSION]         = 'DocTypeReadVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1667
			$EBMLidList[EBML_ID_DOCTYPEVERSION]             = 'DocTypeVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1668
			$EBMLidList[EBML_ID_DURATION]                   = 'Duration';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1669
			$EBMLidList[EBML_ID_EBML]                       = 'EBML';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1670
			$EBMLidList[EBML_ID_EBMLMAXIDLENGTH]            = 'EBMLMaxIDLength';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1671
			$EBMLidList[EBML_ID_EBMLMAXSIZELENGTH]          = 'EBMLMaxSizeLength';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1672
			$EBMLidList[EBML_ID_EBMLREADVERSION]            = 'EBMLReadVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1673
			$EBMLidList[EBML_ID_EBMLVERSION]                = 'EBMLVersion';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1674
			$EBMLidList[EBML_ID_EDITIONENTRY]               = 'EditionEntry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1675
			$EBMLidList[EBML_ID_EDITIONFLAGDEFAULT]         = 'EditionFlagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1676
			$EBMLidList[EBML_ID_EDITIONFLAGHIDDEN]          = 'EditionFlagHidden';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1677
			$EBMLidList[EBML_ID_EDITIONFLAGORDERED]         = 'EditionFlagOrdered';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1678
			$EBMLidList[EBML_ID_EDITIONUID]                 = 'EditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1679
			$EBMLidList[EBML_ID_FILEDATA]                   = 'FileData';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1680
			$EBMLidList[EBML_ID_FILEDESCRIPTION]            = 'FileDescription';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1681
			$EBMLidList[EBML_ID_FILEMIMETYPE]               = 'FileMimeType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1682
			$EBMLidList[EBML_ID_FILENAME]                   = 'FileName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1683
			$EBMLidList[EBML_ID_FILEREFERRAL]               = 'FileReferral';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1684
			$EBMLidList[EBML_ID_FILEUID]                    = 'FileUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1685
			$EBMLidList[EBML_ID_FLAGDEFAULT]                = 'FlagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1686
			$EBMLidList[EBML_ID_FLAGENABLED]                = 'FlagEnabled';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1687
			$EBMLidList[EBML_ID_FLAGFORCED]                 = 'FlagForced';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1688
			$EBMLidList[EBML_ID_FLAGINTERLACED]             = 'FlagInterlaced';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1689
			$EBMLidList[EBML_ID_FLAGLACING]                 = 'FlagLacing';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1690
			$EBMLidList[EBML_ID_GAMMAVALUE]                 = 'GammaValue';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1691
			$EBMLidList[EBML_ID_INFO]                       = 'Info';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1692
			$EBMLidList[EBML_ID_LANGUAGE]                   = 'Language';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1693
			$EBMLidList[EBML_ID_MAXBLOCKADDITIONID]         = 'MaxBlockAdditionID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1694
			$EBMLidList[EBML_ID_MAXCACHE]                   = 'MaxCache';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1695
			$EBMLidList[EBML_ID_MINCACHE]                   = 'MinCache';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1696
			$EBMLidList[EBML_ID_MUXINGAPP]                  = 'MuxingApp';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1697
			$EBMLidList[EBML_ID_NAME]                       = 'Name';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1698
			$EBMLidList[EBML_ID_NEXTFILENAME]               = 'NextFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1699
			$EBMLidList[EBML_ID_NEXTUID]                    = 'NextUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1700
			$EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY]    = 'OutputSamplingFrequency';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1701
			$EBMLidList[EBML_ID_PIXELCROPBOTTOM]            = 'PixelCropBottom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1702
			$EBMLidList[EBML_ID_PIXELCROPLEFT]              = 'PixelCropLeft';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1703
			$EBMLidList[EBML_ID_PIXELCROPRIGHT]             = 'PixelCropRight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1704
			$EBMLidList[EBML_ID_PIXELCROPTOP]               = 'PixelCropTop';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1705
			$EBMLidList[EBML_ID_PIXELHEIGHT]                = 'PixelHeight';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1706
			$EBMLidList[EBML_ID_PIXELWIDTH]                 = 'PixelWidth';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1707
			$EBMLidList[EBML_ID_PREVFILENAME]               = 'PrevFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1708
			$EBMLidList[EBML_ID_PREVUID]                    = 'PrevUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1709
			$EBMLidList[EBML_ID_SAMPLINGFREQUENCY]          = 'SamplingFrequency';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1710
			$EBMLidList[EBML_ID_SEEK]                       = 'Seek';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1711
			$EBMLidList[EBML_ID_SEEKHEAD]                   = 'SeekHead';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1712
			$EBMLidList[EBML_ID_SEEKID]                     = 'SeekID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
			$EBMLidList[EBML_ID_SEEKPOSITION]               = 'SeekPosition';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1714
			$EBMLidList[EBML_ID_SEGMENT]                    = 'Segment';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
			$EBMLidList[EBML_ID_SEGMENTFAMILY]              = 'SegmentFamily';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
			$EBMLidList[EBML_ID_SEGMENTFILENAME]            = 'SegmentFilename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
			$EBMLidList[EBML_ID_SEGMENTUID]                 = 'SegmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
			$EBMLidList[EBML_ID_SIMPLETAG]                  = 'SimpleTag';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
			$EBMLidList[EBML_ID_CLUSTERSLICES]              = 'ClusterSlices';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
			$EBMLidList[EBML_ID_STEREOMODE]                 = 'StereoMode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
			$EBMLidList[EBML_ID_OLDSTEREOMODE]              = 'OldStereoMode';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
			$EBMLidList[EBML_ID_TAG]                        = 'Tag';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
			$EBMLidList[EBML_ID_TAGATTACHMENTUID]           = 'TagAttachmentUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
			$EBMLidList[EBML_ID_TAGBINARY]                  = 'TagBinary';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
			$EBMLidList[EBML_ID_TAGCHAPTERUID]              = 'TagChapterUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
			$EBMLidList[EBML_ID_TAGDEFAULT]                 = 'TagDefault';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1727
			$EBMLidList[EBML_ID_TAGEDITIONUID]              = 'TagEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1728
			$EBMLidList[EBML_ID_TAGLANGUAGE]                = 'TagLanguage';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1729
			$EBMLidList[EBML_ID_TAGNAME]                    = 'TagName';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1730
			$EBMLidList[EBML_ID_TAGTRACKUID]                = 'TagTrackUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
			$EBMLidList[EBML_ID_TAGS]                       = 'Tags';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
			$EBMLidList[EBML_ID_TAGSTRING]                  = 'TagString';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
			$EBMLidList[EBML_ID_TARGETS]                    = 'Targets';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
			$EBMLidList[EBML_ID_TARGETTYPE]                 = 'TargetType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
			$EBMLidList[EBML_ID_TARGETTYPEVALUE]            = 'TargetTypeValue';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
			$EBMLidList[EBML_ID_TIMECODESCALE]              = 'TimecodeScale';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
			$EBMLidList[EBML_ID_TITLE]                      = 'Title';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1738
			$EBMLidList[EBML_ID_TRACKENTRY]                 = 'TrackEntry';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1739
			$EBMLidList[EBML_ID_TRACKNUMBER]                = 'TrackNumber';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1740
			$EBMLidList[EBML_ID_TRACKOFFSET]                = 'TrackOffset';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1741
			$EBMLidList[EBML_ID_TRACKOVERLAY]               = 'TrackOverlay';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1742
			$EBMLidList[EBML_ID_TRACKS]                     = 'Tracks';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1743
			$EBMLidList[EBML_ID_TRACKTIMECODESCALE]         = 'TrackTimecodeScale';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1744
			$EBMLidList[EBML_ID_TRACKTRANSLATE]             = 'TrackTranslate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
			$EBMLidList[EBML_ID_TRACKTRANSLATECODEC]        = 'TrackTranslateCodec';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
			$EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID]   = 'TrackTranslateEditionUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
			$EBMLidList[EBML_ID_TRACKTRANSLATETRACKID]      = 'TrackTranslateTrackID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
			$EBMLidList[EBML_ID_TRACKTYPE]                  = 'TrackType';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
			$EBMLidList[EBML_ID_TRACKUID]                   = 'TrackUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
			$EBMLidList[EBML_ID_VIDEO]                      = 'Video';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1751
			$EBMLidList[EBML_ID_VOID]                       = 'Void';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1752
			$EBMLidList[EBML_ID_WRITINGAPP]                 = 'WritingApp';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1753
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1754
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1755
		return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1756
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1757
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1758
	public static function displayUnit($value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1759
		// http://www.matroska.org/technical/specs/index.html#DisplayUnit
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1760
		static $units = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1761
			0 => 'pixels',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1762
			1 => 'centimeters',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1763
			2 => 'inches',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1764
			3 => 'Display Aspect Ratio');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1765
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1766
		return (isset($units[$value]) ? $units[$value] : 'unknown');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1767
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1768
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1769
	private static function getDefaultStreamInfo($streams)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1770
	{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1771
		foreach (array_reverse($streams) as $stream) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1772
			if ($stream['default']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1773
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1774
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1775
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1776
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1777
		$unset = array('default', 'name');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1778
		foreach ($unset as $u) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1779
			if (isset($stream[$u])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1780
				unset($stream[$u]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1781
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1782
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1783
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1784
		$info = $stream;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1785
		$info['streams'] = $streams;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1786
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1787
		return $info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1788
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1789
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1790
}