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