ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
getid3_flv Class Reference
+ Inheritance diagram for getid3_flv:
+ Collaboration diagram for getid3_flv:

Public Member Functions

 Analyze ()
 
- Public Member Functions inherited from getid3_handler
 __construct (getID3 $getid3, $call_module=null)
 
 Analyze ()
 
 AnalyzeString ($string)
 
 setStringMode ($string)
 
 saveAttachment ($name, $offset, $length, $image_mime=null)
 

Static Public Member Functions

static audioFormatLookup ($id)
 
static audioRateLookup ($id)
 
static audioBitDepthLookup ($id)
 
static videoCodecLookup ($id)
 

Data Fields

const magic = 'FLV'
 
 $max_frames = 100000
 

Additional Inherited Members

- Protected Member Functions inherited from getid3_handler
 ftell ()
 
 fread ($bytes)
 
 fseek ($bytes, $whence=SEEK_SET)
 
 feof ()
 
 isDependencyFor ($module)
 
 error ($text)
 
 warning ($text)
 
 notice ($text)
 
- Protected Attributes inherited from getid3_handler
 $getid3
 
 $data_string_flag = false
 
 $data_string = ''
 
 $data_string_position = 0
 
 $data_string_length = 0
 

Detailed Description

Definition at line 76 of file module.audio-video.flv.php.

Member Function Documentation

◆ Analyze()

getid3_flv::Analyze ( )

Reimplemented from getid3_handler.

Definition at line 82 of file module.audio-video.flv.php.

82 {
83 $info = &$this->getid3->info;
84
85 $this->fseek($info['avdataoffset']);
86
87 $FLVdataLength = $info['avdataend'] - $info['avdataoffset'];
88 $FLVheader = $this->fread(5);
89
90 $info['fileformat'] = 'flv';
91 $info['flv']['header']['signature'] = substr($FLVheader, 0, 3);
92 $info['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1));
93 $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1));
94
95 if ($info['flv']['header']['signature'] != self::magic) {
96 $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::magic).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'"');
97 unset($info['flv'], $info['fileformat']);
98 return false;
99 }
100
101 $info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04);
102 $info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01);
103
104 $FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4));
105 $FLVheaderFrameLength = 9;
106 if ($FrameSizeDataLength > $FLVheaderFrameLength) {
107 $this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);
108 }
109 $Duration = 0;
110 $found_video = false;
111 $found_audio = false;
112 $found_meta = false;
113 $found_valid_meta_playtime = false;
114 $tagParseCount = 0;
115 $info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0);
116 $flv_framecount = &$info['flv']['framecount'];
117 while ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime)) {
118 $ThisTagHeader = $this->fread(16);
119
120 $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4));
121 $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1));
122 $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3));
123 $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3));
124 $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1));
125 $NextOffset = $this->ftell() - 1 + $DataLength;
126 if ($Timestamp > $Duration) {
127 $Duration = $Timestamp;
128 }
129
130 $flv_framecount['total']++;
131 switch ($TagType) {
133 $flv_framecount['audio']++;
134 if (!$found_audio) {
135 $found_audio = true;
136 $info['flv']['audio']['audioFormat'] = ($LastHeaderByte >> 4) & 0x0F;
137 $info['flv']['audio']['audioRate'] = ($LastHeaderByte >> 2) & 0x03;
138 $info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01;
139 $info['flv']['audio']['audioType'] = $LastHeaderByte & 0x01;
140 }
141 break;
142
144 $flv_framecount['video']++;
145 if (!$found_video) {
146 $found_video = true;
147 $info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07;
148
149 $FLVvideoHeader = $this->fread(11);
150
151 if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) {
152 // this code block contributed by: moysevichØgmail*com
153
154 $AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1));
155 if ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) {
156 // read AVCDecoderConfigurationRecord
157 $configurationVersion = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 1));
158 $AVCProfileIndication = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 1));
159 $profile_compatibility = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 1));
160 $lengthSizeMinusOne = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 1));
161 $numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 8, 1));
162
163 if (($numOfSequenceParameterSets & 0x1F) != 0) {
164 // there is at least one SequenceParameterSet
165 // read size of the first SequenceParameterSet
166 //$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2));
167 $spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2));
168 // read the first SequenceParameterSet
169 $sps = $this->fread($spsSize);
170 if (strlen($sps) == $spsSize) { // make sure that whole SequenceParameterSet was red
171 $spsReader = new AVCSequenceParameterSetReader($sps);
172 $spsReader->readData();
173 $info['video']['resolution_x'] = $spsReader->getWidth();
174 $info['video']['resolution_y'] = $spsReader->getHeight();
175 }
176 }
177 }
178 // end: moysevichØgmail*com
179
180 } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) {
181
182 $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7;
183 $PictureSizeType = $PictureSizeType & 0x0007;
184 $info['flv']['header']['videoSizeType'] = $PictureSizeType;
185 switch ($PictureSizeType) {
186 case 0:
187 //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2));
188 //$PictureSizeEnc <<= 1;
189 //$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8;
190 //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
191 //$PictureSizeEnc <<= 1;
192 //$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8;
193
194 $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7;
195 $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7;
196 $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF;
197 $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF;
198 break;
199
200 case 1:
201 $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7;
202 $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7;
203 $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF;
204 $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF;
205 break;
206
207 case 2:
208 $info['video']['resolution_x'] = 352;
209 $info['video']['resolution_y'] = 288;
210 break;
211
212 case 3:
213 $info['video']['resolution_x'] = 176;
214 $info['video']['resolution_y'] = 144;
215 break;
216
217 case 4:
218 $info['video']['resolution_x'] = 128;
219 $info['video']['resolution_y'] = 96;
220 break;
221
222 case 5:
223 $info['video']['resolution_x'] = 320;
224 $info['video']['resolution_y'] = 240;
225 break;
226
227 case 6:
228 $info['video']['resolution_x'] = 160;
229 $info['video']['resolution_y'] = 120;
230 break;
231
232 default:
233 $info['video']['resolution_x'] = 0;
234 $info['video']['resolution_y'] = 0;
235 break;
236
237 }
238
239 } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_VP6FLV_ALPHA) {
240
241 /* contributed by schouwerwouØgmail*com */
242 if (!isset($info['video']['resolution_x'])) { // only when meta data isn't set
243 $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
244 $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2));
245 $info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3;
246 $info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3;
247 }
248 /* end schouwerwouØgmail*com */
249
250 }
251 if (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) {
252 $info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y'];
253 }
254 }
255 break;
256
257 // Meta tag
259 if (!$found_meta) {
260 $found_meta = true;
261 $this->fseek(-1, SEEK_CUR);
262 $datachunk = $this->fread($DataLength);
263 $AMFstream = new AMFStream($datachunk);
264 $reader = new AMFReader($AMFstream);
265 $eventName = $reader->readData();
266 $info['flv']['meta'][$eventName] = $reader->readData();
267 unset($reader);
268
269 $copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate');
270 foreach ($copykeys as $sourcekey => $destkey) {
271 if (isset($info['flv']['meta']['onMetaData'][$sourcekey])) {
272 switch ($sourcekey) {
273 case 'width':
274 case 'height':
275 $info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey]));
276 break;
277 case 'audiodatarate':
278 $info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000));
279 break;
280 case 'videodatarate':
281 case 'frame_rate':
282 default:
283 $info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey];
284 break;
285 }
286 }
287 }
288 if (!empty($info['flv']['meta']['onMetaData']['duration'])) {
289 $found_valid_meta_playtime = true;
290 }
291 }
292 break;
293
294 default:
295 // noop
296 break;
297 }
298 $this->fseek($NextOffset);
299 }
300
301 $info['playtime_seconds'] = $Duration / 1000;
302 if ($info['playtime_seconds'] > 0) {
303 $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
304 }
305
306 if ($info['flv']['header']['hasAudio']) {
307 $info['audio']['codec'] = self::audioFormatLookup($info['flv']['audio']['audioFormat']);
308 $info['audio']['sample_rate'] = self::audioRateLookup($info['flv']['audio']['audioRate']);
309 $info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']);
310
311 $info['audio']['channels'] = $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo
312 $info['audio']['lossless'] = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed
313 $info['audio']['dataformat'] = 'flv';
314 }
315 if (!empty($info['flv']['header']['hasVideo'])) {
316 $info['video']['codec'] = self::videoCodecLookup($info['flv']['video']['videoCodec']);
317 $info['video']['dataformat'] = 'flv';
318 $info['video']['lossless'] = false;
319 }
320
321 // Set information from meta
322 if (!empty($info['flv']['meta']['onMetaData']['duration'])) {
323 $info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration'];
324 $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
325 }
326 if (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) {
327 $info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']);
328 }
329 if (isset($info['flv']['meta']['onMetaData']['videocodecid'])) {
330 $info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']);
331 }
332 return true;
333 }
static audioBitDepthLookup($id)
static audioFormatLookup($id)
static videoCodecLookup($id)
static audioRateLookup($id)
fseek($bytes, $whence=SEEK_SET)
Definition: getid3.php:1711
fread($bytes)
Definition: getid3.php:1683
error($text)
Definition: getid3.php:1752
static PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8')
Definition: getid3.lib.php:18
static LittleEndian2Int($byteword, $signed=false)
Definition: getid3.lib.php:292
static CastAsInt($floatnum)
Definition: getid3.lib.php:65
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
Definition: getid3.lib.php:263
$info
Definition: index.php:5
const H264_AVC_SEQUENCE_HEADER
const GETID3_FLV_TAG_AUDIO
getID3() by James Heinrich info@getid3.org //
const GETID3_FLV_VIDEO_VP6FLV_ALPHA
const GETID3_FLV_TAG_VIDEO
const GETID3_FLV_VIDEO_H263
const GETID3_FLV_TAG_META
const GETID3_FLV_VIDEO_H264

References $info, $reader, audioBitDepthLookup(), audioFormatLookup(), audioRateLookup(), getid3_lib\BigEndian2Int(), getid3_lib\CastAsInt(), getid3_handler\error(), getid3_handler\fread(), getid3_handler\fseek(), getid3_handler\ftell(), GETID3_FLV_TAG_AUDIO, GETID3_FLV_TAG_META, GETID3_FLV_TAG_VIDEO, GETID3_FLV_VIDEO_H263, GETID3_FLV_VIDEO_H264, GETID3_FLV_VIDEO_VP6FLV_ALPHA, H264_AVC_SEQUENCE_HEADER, getid3_lib\LittleEndian2Int(), getid3_lib\PrintHexBytes(), and videoCodecLookup().

+ Here is the call graph for this function:

◆ audioBitDepthLookup()

static getid3_flv::audioBitDepthLookup (   $id)
static

Definition at line 368 of file module.audio-video.flv.php.

368 {
369 static $lookup = array(
370 0 => 8,
371 1 => 16,
372 );
373 return (isset($lookup[$id]) ? $lookup[$id] : false);
374 }
if(!array_key_exists('StateId', $_REQUEST)) $id

References $id.

Referenced by Analyze().

+ Here is the caller graph for this function:

◆ audioFormatLookup()

static getid3_flv::audioFormatLookup (   $id)
static

Definition at line 336 of file module.audio-video.flv.php.

336 {
337 static $lookup = array(
338 0 => 'Linear PCM, platform endian',
339 1 => 'ADPCM',
340 2 => 'mp3',
341 3 => 'Linear PCM, little endian',
342 4 => 'Nellymoser 16kHz mono',
343 5 => 'Nellymoser 8kHz mono',
344 6 => 'Nellymoser',
345 7 => 'G.711A-law logarithmic PCM',
346 8 => 'G.711 mu-law logarithmic PCM',
347 9 => 'reserved',
348 10 => 'AAC',
349 11 => 'Speex',
350 12 => false, // unknown?
351 13 => false, // unknown?
352 14 => 'mp3 8kHz',
353 15 => 'Device-specific sound',
354 );
355 return (isset($lookup[$id]) ? $lookup[$id] : false);
356 }

References $id.

Referenced by Analyze().

+ Here is the caller graph for this function:

◆ audioRateLookup()

static getid3_flv::audioRateLookup (   $id)
static

Definition at line 358 of file module.audio-video.flv.php.

358 {
359 static $lookup = array(
360 0 => 5500,
361 1 => 11025,
362 2 => 22050,
363 3 => 44100,
364 );
365 return (isset($lookup[$id]) ? $lookup[$id] : false);
366 }

References $id.

Referenced by Analyze().

+ Here is the caller graph for this function:

◆ videoCodecLookup()

static getid3_flv::videoCodecLookup (   $id)
static

Definition at line 376 of file module.audio-video.flv.php.

376 {
377 static $lookup = array(
378 GETID3_FLV_VIDEO_H263 => 'Sorenson H.263',
379 GETID3_FLV_VIDEO_SCREEN => 'Screen video',
380 GETID3_FLV_VIDEO_VP6FLV => 'On2 VP6',
381 GETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel',
382 GETID3_FLV_VIDEO_SCREENV2 => 'Screen video v2',
383 GETID3_FLV_VIDEO_H264 => 'Sorenson H.264',
384 );
385 return (isset($lookup[$id]) ? $lookup[$id] : false);
386 }
const GETID3_FLV_VIDEO_VP6FLV
const GETID3_FLV_VIDEO_SCREEN
const GETID3_FLV_VIDEO_SCREENV2

References $id, GETID3_FLV_VIDEO_H263, GETID3_FLV_VIDEO_H264, GETID3_FLV_VIDEO_SCREEN, GETID3_FLV_VIDEO_SCREENV2, GETID3_FLV_VIDEO_VP6FLV, and GETID3_FLV_VIDEO_VP6FLV_ALPHA.

Referenced by Analyze().

+ Here is the caller graph for this function:

Field Documentation

◆ $max_frames

getid3_flv::$max_frames = 100000

Definition at line 80 of file module.audio-video.flv.php.

◆ magic

const getid3_flv::magic = 'FLV'

Definition at line 78 of file module.audio-video.flv.php.


The documentation for this class was generated from the following file: