wp/wp-includes/ID3/module.audio-video.flv.php
author ymh <ymh.work@gmail.com>
Mon, 14 Oct 2019 17:39:30 +0200
changeset 7 cf61fcea0001
parent 5 5e2f62d02dcd
child 16 a86126ab1dd4
permissions -rw-r--r--
resynchronize code repo with production
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
//  FLV module by Seth Kaufman <sethØwhirl-i-gig*com>          //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
//  * version 0.1 (26 June 2005)                               //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
//  * version 0.1.1 (15 July 2005)                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
//  minor modifications by James Heinrich <info@getid3.org>    //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
//  * version 0.2 (22 February 2006)                           //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
//  Support for On2 VP6 codec and meta information             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
//    by Steve Webster <steve.websterØfeaturecreep*com>        //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
//  * version 0.3 (15 June 2006)                               //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
//  Modified to not read entire file into memory               //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
//    by James Heinrich <info@getid3.org>                      //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
//  * version 0.4 (07 December 2007)                           //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
//  Bugfixes for incorrectly parsed FLV dimensions             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
//    and incorrect parsing of onMetaTag                       //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
//    by Evgeny Moysevich <moysevichØgmail*com>                //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
//  * version 0.5 (21 May 2009)                                //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
//  Fixed parsing of audio tags and added additional codec     //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
//    details. The duration is now read from onMetaTag (if     //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
//    exists), rather than parsing whole file                  //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
//    by Nigel Barnes <ngbarnesØhotmail*com>                   //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
//  * version 0.6 (24 May 2009)                                //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
//  Better parsing of files with h264 video                    //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
//    by Evgeny Moysevich <moysevichØgmail*com>                //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
//  * version 0.6.1 (30 May 2011)                              //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
//    prevent infinite loops in expGolombUe()                  //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
//                                                             //
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    42
//  * version 0.7.0 (16 Jul 2013)                              //
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    43
//  handle GETID3_FLV_VIDEO_VP6FLV_ALPHA                       //
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    44
//  improved AVCSequenceParameterSetReader::readData()         //
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    45
//    by Xander Schouwerwou <schouwerwouØgmail*com>            //
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    46
//                                                             //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
// module.audio-video.flv.php                                  //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
// module for analyzing Shockwave Flash Video files            //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
// dependencies: NONE                                          //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
//                                                            ///
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
define('GETID3_FLV_TAG_AUDIO',          8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
define('GETID3_FLV_TAG_VIDEO',          9);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
define('GETID3_FLV_TAG_META',          18);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
define('GETID3_FLV_VIDEO_H263',         2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
define('GETID3_FLV_VIDEO_SCREEN',       3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
define('GETID3_FLV_VIDEO_VP6FLV',       4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
define('GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
define('GETID3_FLV_VIDEO_SCREENV2',     6);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
define('GETID3_FLV_VIDEO_H264',         7);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
define('H264_AVC_SEQUENCE_HEADER',          0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
define('H264_PROFILE_BASELINE',            66);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
define('H264_PROFILE_MAIN',                77);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
define('H264_PROFILE_EXTENDED',            88);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
define('H264_PROFILE_HIGH',               100);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
define('H264_PROFILE_HIGH10',             110);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
define('H264_PROFILE_HIGH422',            122);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
define('H264_PROFILE_HIGH444',            144);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
define('H264_PROFILE_HIGH444_PREDICTIVE', 244);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    76
class getid3_flv extends getid3_handler {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    77
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    78
	const magic = 'FLV';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    79
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
	public $max_frames = 100000; // break out of the loop if too many frames have been scanned; only scan this many if meta frame does not contain useful duration
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
	public function Analyze() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    85
		$this->fseek($info['avdataoffset']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
		$FLVdataLength = $info['avdataend'] - $info['avdataoffset'];
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    88
		$FLVheader = $this->fread(5);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
		$info['fileformat'] = 'flv';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
		$info['flv']['header']['signature'] =                           substr($FLVheader, 0, 3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
		$info['flv']['header']['version']   = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
		$TypeFlags                          = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    95
		if ($info['flv']['header']['signature'] != self::magic) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    96
			$this->error('Expecting "'.getid3_lib::PrintHexBytes(self::magic).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'"');
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    97
			unset($info['flv'], $info['fileformat']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
		$info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
		$info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   104
		$FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4));
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
		$FLVheaderFrameLength = 9;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
		if ($FrameSizeDataLength > $FLVheaderFrameLength) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   107
			$this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
		$Duration = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
		$found_video = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
		$found_audio = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
		$found_meta  = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
		$found_valid_meta_playtime = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
		$tagParseCount = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
		$info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
		$flv_framecount = &$info['flv']['framecount'];
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   117
		while ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime))  {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   118
			$ThisTagHeader = $this->fread(16);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
			$PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
			$TagType           = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  4, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
			$DataLength        = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  5, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
			$Timestamp         = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  8, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
			$LastHeaderByte    = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1));
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   125
			$NextOffset = $this->ftell() - 1 + $DataLength;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
			if ($Timestamp > $Duration) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
				$Duration = $Timestamp;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
			$flv_framecount['total']++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
			switch ($TagType) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
				case GETID3_FLV_TAG_AUDIO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
					$flv_framecount['audio']++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
					if (!$found_audio) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
						$found_audio = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
						$info['flv']['audio']['audioFormat']     = ($LastHeaderByte >> 4) & 0x0F;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
						$info['flv']['audio']['audioRate']       = ($LastHeaderByte >> 2) & 0x03;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
						$info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
						$info['flv']['audio']['audioType']       =  $LastHeaderByte       & 0x01;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
				case GETID3_FLV_TAG_VIDEO:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
					$flv_framecount['video']++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
					if (!$found_video) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
						$found_video = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
						$info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   149
						$FLVvideoHeader = $this->fread(11);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
						if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
							// this code block contributed by: moysevichØgmail*com
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
							$AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
							if ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
								//	read AVCDecoderConfigurationRecord
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
								$configurationVersion       = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  4, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
								$AVCProfileIndication       = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  5, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
								$profile_compatibility      = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  6, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
								$lengthSizeMinusOne         = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  7, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
								$numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  8, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
								if (($numOfSequenceParameterSets & 0x1F) != 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
									//	there is at least one SequenceParameterSet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
									//	read size of the first SequenceParameterSet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
									//$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
									$spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
									//	read the first SequenceParameterSet
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   169
									$sps = $this->fread($spsSize);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
									if (strlen($sps) == $spsSize) {	//	make sure that whole SequenceParameterSet was red
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
										$spsReader = new AVCSequenceParameterSetReader($sps);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
										$spsReader->readData();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
										$info['video']['resolution_x'] = $spsReader->getWidth();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
										$info['video']['resolution_y'] = $spsReader->getHeight();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
							// end: moysevichØgmail*com
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
						} elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
							$PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
							$PictureSizeType = $PictureSizeType & 0x0007;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
							$info['flv']['header']['videoSizeType'] = $PictureSizeType;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
							switch ($PictureSizeType) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
								case 0:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
									//$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
									//$PictureSizeEnc <<= 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
									//$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
									//$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
									//$PictureSizeEnc <<= 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
									//$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   194
									$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   195
									$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
									$info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
									$info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
								case 1:
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   201
									$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   202
									$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
									$info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
									$info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
								case 2:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
									$info['video']['resolution_x'] = 352;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
									$info['video']['resolution_y'] = 288;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
								case 3:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
									$info['video']['resolution_x'] = 176;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
									$info['video']['resolution_y'] = 144;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
								case 4:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
									$info['video']['resolution_x'] = 128;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
									$info['video']['resolution_y'] = 96;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
								case 5:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
									$info['video']['resolution_x'] = 320;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
									$info['video']['resolution_y'] = 240;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
								case 6:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
									$info['video']['resolution_x'] = 160;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
									$info['video']['resolution_y'] = 120;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
								default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
									$info['video']['resolution_x'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
									$info['video']['resolution_y'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
							}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   238
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   239
						} elseif ($info['flv']['video']['videoCodec'] ==  GETID3_FLV_VIDEO_VP6FLV_ALPHA) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   240
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   241
							/* contributed by schouwerwouØgmail*com */
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   242
							if (!isset($info['video']['resolution_x'])) { // only when meta data isn't set
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   243
								$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   244
								$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   245
								$info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   246
								$info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   247
							}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   248
							/* end schouwerwouØgmail*com */
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   249
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
						}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   251
						if (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   252
							$info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   253
						}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
				// Meta tag
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
				case GETID3_FLV_TAG_META:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
					if (!$found_meta) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
						$found_meta = true;
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   261
						$this->fseek(-1, SEEK_CUR);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   262
						$datachunk = $this->fread($DataLength);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
						$AMFstream = new AMFStream($datachunk);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
						$reader = new AMFReader($AMFstream);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
						$eventName = $reader->readData();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
						$info['flv']['meta'][$eventName] = $reader->readData();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
						unset($reader);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
						$copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
						foreach ($copykeys as $sourcekey => $destkey) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
							if (isset($info['flv']['meta']['onMetaData'][$sourcekey])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
								switch ($sourcekey) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
									case 'width':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
									case 'height':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
										$info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey]));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
										break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
									case 'audiodatarate':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
										$info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
										break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
									case 'videodatarate':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
									case 'frame_rate':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
									default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
										$info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
										break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
						if (!empty($info['flv']['meta']['onMetaData']['duration'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
							$found_valid_meta_playtime = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
					// noop
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
			}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   298
			$this->fseek($NextOffset);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
		$info['playtime_seconds'] = $Duration / 1000;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
		if ($info['playtime_seconds'] > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
			$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
		if ($info['flv']['header']['hasAudio']) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   307
			$info['audio']['codec']           =   self::audioFormatLookup($info['flv']['audio']['audioFormat']);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   308
			$info['audio']['sample_rate']     =     self::audioRateLookup($info['flv']['audio']['audioRate']);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   309
			$info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
			$info['audio']['channels']   =  $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
			$info['audio']['lossless']   = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
			$info['audio']['dataformat'] = 'flv';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
		if (!empty($info['flv']['header']['hasVideo'])) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   316
			$info['video']['codec']      = self::videoCodecLookup($info['flv']['video']['videoCodec']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
			$info['video']['dataformat'] = 'flv';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
			$info['video']['lossless']   = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
		// Set information from meta
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
		if (!empty($info['flv']['meta']['onMetaData']['duration'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
			$info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
			$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
		if (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   327
			$info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
		if (isset($info['flv']['meta']['onMetaData']['videocodecid'])) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   330
			$info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   336
	public static function audioFormatLookup($id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   337
		static $lookup = array(
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
			0  => 'Linear PCM, platform endian',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
			1  => 'ADPCM',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
			2  => 'mp3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
			3  => 'Linear PCM, little endian',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
			4  => 'Nellymoser 16kHz mono',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
			5  => 'Nellymoser 8kHz mono',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
			6  => 'Nellymoser',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
			7  => 'G.711A-law logarithmic PCM',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
			8  => 'G.711 mu-law logarithmic PCM',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
			9  => 'reserved',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
			10 => 'AAC',
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   349
			11 => 'Speex',
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
			12 => false, // unknown?
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
			13 => false, // unknown?
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
			14 => 'mp3 8kHz',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
			15 => 'Device-specific sound',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
		);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   355
		return (isset($lookup[$id]) ? $lookup[$id] : false);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   358
	public static function audioRateLookup($id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   359
		static $lookup = array(
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
			0 =>  5500,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
			1 => 11025,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
			2 => 22050,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
			3 => 44100,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
		);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   365
		return (isset($lookup[$id]) ? $lookup[$id] : false);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   368
	public static function audioBitDepthLookup($id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   369
		static $lookup = array(
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
			0 =>  8,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
			1 => 16,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
		);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   373
		return (isset($lookup[$id]) ? $lookup[$id] : false);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   376
	public static function videoCodecLookup($id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   377
		static $lookup = array(
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
			GETID3_FLV_VIDEO_H263         => 'Sorenson H.263',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
			GETID3_FLV_VIDEO_SCREEN       => 'Screen video',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
			GETID3_FLV_VIDEO_VP6FLV       => 'On2 VP6',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
			GETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
			GETID3_FLV_VIDEO_SCREENV2     => 'Screen video v2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
			GETID3_FLV_VIDEO_H264         => 'Sorenson H.264',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
		);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   385
		return (isset($lookup[$id]) ? $lookup[$id] : false);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
	}
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
class AMFStream {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
	public $bytes;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
	public $pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   393
	public function __construct(&$bytes) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
		$this->bytes =& $bytes;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
		$this->pos = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
	public function readByte() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
		return getid3_lib::BigEndian2Int(substr($this->bytes, $this->pos++, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
	public function readInt() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
		return ($this->readByte() << 8) + $this->readByte();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
	public function readLong() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
		return ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
	public function readDouble() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
		return getid3_lib::BigEndian2Float($this->read(8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
	public function readUTF() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
		$length = $this->readInt();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
		return $this->read($length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
	public function readLongUTF() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
		$length = $this->readLong();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
		return $this->read($length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
	public function read($length) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
		$val = substr($this->bytes, $this->pos, $length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
		$this->pos += $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
		return $val;
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
	public function peekByte() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
		$pos = $this->pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
		$val = $this->readByte();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
		$this->pos = $pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
		return $val;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
	public function peekInt() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
		$pos = $this->pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
		$val = $this->readInt();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
		$this->pos = $pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
		return $val;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
	public function peekLong() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
		$pos = $this->pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
		$val = $this->readLong();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
		$this->pos = $pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
		return $val;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
	public function peekDouble() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
		$pos = $this->pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
		$val = $this->readDouble();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
		$this->pos = $pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
		return $val;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
	public function peekUTF() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
		$pos = $this->pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
		$val = $this->readUTF();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
		$this->pos = $pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
		return $val;
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
	public function peekLongUTF() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
		$pos = $this->pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
		$val = $this->readLongUTF();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
		$this->pos = $pos;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
		return $val;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
class AMFReader {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
	public $stream;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   476
	public function __construct(&$stream) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
		$this->stream =& $stream;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
	public function readData() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
		$value = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
		$type = $this->stream->readByte();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
		switch ($type) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
			// Double
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
			case 0:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
				$value = $this->readDouble();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
			// Boolean
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
			case 1:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
				$value = $this->readBoolean();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
			// String
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
			case 2:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
				$value = $this->readString();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
			// Object
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
			case 3:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
				$value = $this->readObject();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
			// null
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
			case 6:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
				return null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
			// Mixed array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
			case 8:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
				$value = $this->readMixedArray();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
			// Array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
			case 10:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
				$value = $this->readArray();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
			// Date
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
			case 11:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
				$value = $this->readDate();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
			// Long string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
			case 13:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
				$value = $this->readLongString();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
			// XML (handled as string)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
			case 15:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
				$value = $this->readXML();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
			// Typed object (handled as object)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
			case 16:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
				$value = $this->readTypedObject();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
			// Long string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
				$value = '(unknown or unsupported data type)';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   544
				break;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
		return $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
	public function readDouble() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
		return $this->stream->readDouble();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
	public function readBoolean() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
		return $this->stream->readByte() == 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
	public function readString() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
		return $this->stream->readUTF();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
	public function readObject() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
		// Get highest numerical index - ignored
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
//		$highestIndex = $this->stream->readLong();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
		$data = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
		while ($key = $this->stream->readUTF()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
			$data[$key] = $this->readData();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
		// Mixed array record ends with empty string (0x00 0x00) and 0x09
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
		if (($key == '') && ($this->stream->peekByte() == 0x09)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
			// Consume byte
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
			$this->stream->readByte();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
		return $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
	public function readMixedArray() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
		// Get highest numerical index - ignored
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
		$highestIndex = $this->stream->readLong();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
		$data = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
		while ($key = $this->stream->readUTF()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
			if (is_numeric($key)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
				$key = (float) $key;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
			$data[$key] = $this->readData();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
		// Mixed array record ends with empty string (0x00 0x00) and 0x09
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
		if (($key == '') && ($this->stream->peekByte() == 0x09)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
			// Consume byte
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
			$this->stream->readByte();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
		return $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
	public function readArray() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
		$length = $this->stream->readLong();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
		$data = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
		for ($i = 0; $i < $length; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
			$data[] = $this->readData();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
		return $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
	public function readDate() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
		$timestamp = $this->stream->readDouble();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
		$timezone = $this->stream->readInt();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
		return $timestamp;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
	public function readLongString() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
		return $this->stream->readLongUTF();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
	public function readXML() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
		return $this->stream->readLongUTF();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
	public function readTypedObject() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
		$className = $this->stream->readUTF();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
		return $this->readObject();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
class AVCSequenceParameterSetReader {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
	public $sps;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
	public $start = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
	public $currentBytes = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
	public $currentBits = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
	public $width;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
	public $height;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   638
	public function __construct($sps) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
		$this->sps = $sps;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
	public function readData() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
		$this->skipBits(8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
		$this->skipBits(8);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   645
		$profile = $this->getBits(8);                               // read profile
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   646
		if ($profile > 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   647
			$this->skipBits(8);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   648
			$level_idc = $this->getBits(8);                         // level_idc
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   649
			$this->expGolombUe();                                   // seq_parameter_set_id // sps
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   650
			$this->expGolombUe();                                   // log2_max_frame_num_minus4
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   651
			$picOrderType = $this->expGolombUe();                   // pic_order_cnt_type
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   652
			if ($picOrderType == 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   653
				$this->expGolombUe();                               // log2_max_pic_order_cnt_lsb_minus4
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   654
			} elseif ($picOrderType == 1) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   655
				$this->skipBits(1);                                 // delta_pic_order_always_zero_flag
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   656
				$this->expGolombSe();                               // offset_for_non_ref_pic
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   657
				$this->expGolombSe();                               // offset_for_top_to_bottom_field
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   658
				$num_ref_frames_in_pic_order_cnt_cycle = $this->expGolombUe(); // num_ref_frames_in_pic_order_cnt_cycle
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   659
				for ($i = 0; $i < $num_ref_frames_in_pic_order_cnt_cycle; $i++) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   660
					$this->expGolombSe();                           // offset_for_ref_frame[ i ]
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
			}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   663
			$this->expGolombUe();                                   // num_ref_frames
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   664
			$this->skipBits(1);                                     // gaps_in_frame_num_value_allowed_flag
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   665
			$pic_width_in_mbs_minus1 = $this->expGolombUe();        // pic_width_in_mbs_minus1
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   666
			$pic_height_in_map_units_minus1 = $this->expGolombUe(); // pic_height_in_map_units_minus1
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   667
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   668
			$frame_mbs_only_flag = $this->getBits(1);               // frame_mbs_only_flag
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   669
			if ($frame_mbs_only_flag == 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   670
				$this->skipBits(1);                                 // mb_adaptive_frame_field_flag
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   671
			}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   672
			$this->skipBits(1);                                     // direct_8x8_inference_flag
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   673
			$frame_cropping_flag = $this->getBits(1);               // frame_cropping_flag
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   674
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   675
			$frame_crop_left_offset   = 0;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   676
			$frame_crop_right_offset  = 0;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   677
			$frame_crop_top_offset    = 0;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   678
			$frame_crop_bottom_offset = 0;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   679
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   680
			if ($frame_cropping_flag) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   681
				$frame_crop_left_offset   = $this->expGolombUe();   // frame_crop_left_offset
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   682
				$frame_crop_right_offset  = $this->expGolombUe();   // frame_crop_right_offset
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   683
				$frame_crop_top_offset    = $this->expGolombUe();   // frame_crop_top_offset
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   684
				$frame_crop_bottom_offset = $this->expGolombUe();   // frame_crop_bottom_offset
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   685
			}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   686
			$this->skipBits(1);                                     // vui_parameters_present_flag
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   687
			// etc
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   688
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   689
			$this->width  = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   690
			$this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
		}
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
	public function skipBits($bits) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
		$newBits = $this->currentBits + $bits;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
		$this->currentBytes += (int)floor($newBits / 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
		$this->currentBits = $newBits % 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
	public function getBit() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
		$result = (getid3_lib::BigEndian2Int(substr($this->sps, $this->currentBytes, 1)) >> (7 - $this->currentBits)) & 0x01;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
		$this->skipBits(1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
		return $result;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
	public function getBits($bits) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
		$result = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
		for ($i = 0; $i < $bits; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
			$result = ($result << 1) + $this->getBit();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
		return $result;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
	public function expGolombUe() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
		$significantBits = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
		$bit = $this->getBit();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
		while ($bit == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
			$significantBits++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
			$bit = $this->getBit();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
			if ($significantBits > 31) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
				// something is broken, this is an emergency escape to prevent infinite loops
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
				return 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
		return (1 << $significantBits) + $this->getBits($significantBits) - 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
	public function expGolombSe() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
		$result = $this->expGolombUe();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
		if (($result & 0x01) == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
			return -($result >> 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
			return ($result + 1) >> 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
	public function getWidth() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
		return $this->width;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
	public function getHeight() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
		return $this->height;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
	}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   745
}