32 {
33 $info = &$this->getid3->info;
34
35 $info[
'fileformat'] =
'mpeg';
37
38 $MPEGstreamData = $this->
fread($this->getid3->option_fread_buffer_size);
39 $MPEGstreamBaseOffset = 0;
40 $MPEGstreamDataOffset = 0;
41
42 $StartCodeValue = false;
43 $prevStartCodeValue = false;
44
45 $GOPcounter = -1;
46 $FramesByGOP = array();
47 $ParsedAVchannels = array();
48
49 do {
50
51 if ($MPEGstreamDataOffset > (strlen($MPEGstreamData) - 16384)) {
52
53
54 $MPEGstreamData .= $this->
fread($this->getid3->option_fread_buffer_size);
55 if (strlen($MPEGstreamData) > $this->getid3->option_fread_buffer_size) {
56 $MPEGstreamData = substr($MPEGstreamData, $MPEGstreamDataOffset);
57 $MPEGstreamBaseOffset += $MPEGstreamDataOffset;
58 $MPEGstreamDataOffset = 0;
59 }
60 }
61 if (($StartCodeOffset = strpos($MPEGstreamData, self::START_CODE_BASE, $MPEGstreamDataOffset)) === false) {
62
63 break;
64 } else {
65 $MPEGstreamDataOffset = $StartCodeOffset;
66 $prevStartCodeValue = $StartCodeValue;
67 $StartCodeValue = ord(substr($MPEGstreamData, $StartCodeOffset + 3, 1));
68
69 }
70 $MPEGstreamDataOffset += 4;
71 switch ($StartCodeValue) {
72
73 case 0x00:
74 if (!empty(
$info[
'mpeg'][
'video'][
'bitrate_mode']) && (
$info[
'mpeg'][
'video'][
'bitrate_mode'] ==
'vbr')) {
76 $bitstreamoffset = 0;
77
78 $PictureHeader = array();
79
83
84
85 $FramesByGOP[$GOPcounter][] = $PictureHeader;
86 }
87 break;
88
89 case 0xB3:
90
91
92
93
94
95 $info[
'video'][
'codec'] =
'MPEG-1';
96
98 $bitstreamoffset = 0;
99
109
110 if (
$info[
'mpeg'][
'video'][
'raw'][
'load_intra_quantiser_matrix']) {
112 for (
$i = 0;
$i < 64;
$i++) {
114 }
115 }
117
118 if (
$info[
'mpeg'][
'video'][
'raw'][
'load_non_intra_quantiser_matrix']) {
119 $bitstream .=
getid3_lib::BigEndian2Bin(substr($MPEGstreamData, $StartCodeOffset + 12 + (
$info[
'mpeg'][
'video'][
'raw'][
'load_intra_quantiser_matrix'] ? 64 : 0), 64));
120 for (
$i = 0;
$i < 64;
$i++) {
122 }
123 }
124
128 if (
$info[
'mpeg'][
'video'][
'raw'][
'bitrate'] == 0x3FFFF) {
129
130 $info[
'mpeg'][
'video'][
'bitrate_mode'] =
'vbr';
131 } else {
132 $info[
'mpeg'][
'video'][
'bitrate'] =
$info[
'mpeg'][
'video'][
'raw'][
'bitrate'] * 400;
133 $info[
'mpeg'][
'video'][
'bitrate_mode'] =
'cbr';
134 $info[
'video'][
'bitrate'] =
$info[
'mpeg'][
'video'][
'bitrate'];
135 }
136 $info[
'video'][
'resolution_x'] =
$info[
'mpeg'][
'video'][
'raw'][
'horizontal_size_value'];
137 $info[
'video'][
'resolution_y'] =
$info[
'mpeg'][
'video'][
'raw'][
'vertical_size_value'];
138 $info[
'video'][
'frame_rate'] =
$info[
'mpeg'][
'video'][
'frame_rate'];
139 $info[
'video'][
'bitrate_mode'] =
$info[
'mpeg'][
'video'][
'bitrate_mode'];
140 $info[
'video'][
'pixel_aspect_ratio'] =
$info[
'mpeg'][
'video'][
'pixel_aspect_ratio'];
141 $info[
'video'][
'lossless'] =
false;
142 $info[
'video'][
'bits_per_sample'] = 24;
143 break;
144
145 case 0xB5:
146 $info[
'video'][
'codec'] =
'MPEG-2';
147
149 $bitstreamoffset = 0;
150
152
153 switch (
$info[
'mpeg'][
'video'][
'raw'][
'extension_start_code_identifier']) {
154 case 1:
166
167 $info[
'video'][
'resolution_x'] = (
$info[
'mpeg'][
'video'][
'raw'][
'horizontal_size_extension'] << 12) |
$info[
'mpeg'][
'video'][
'raw'][
'horizontal_size_value'];
168 $info[
'video'][
'resolution_y'] = (
$info[
'mpeg'][
'video'][
'raw'][
'vertical_size_extension'] << 12) |
$info[
'mpeg'][
'video'][
'raw'][
'vertical_size_value'];
169 $info[
'video'][
'interlaced'] = !
$info[
'mpeg'][
'video'][
'raw'][
'progressive_sequence'];
170 $info[
'mpeg'][
'video'][
'interlaced'] = !
$info[
'mpeg'][
'video'][
'raw'][
'progressive_sequence'];
172 break;
173
174 case 2:
177 if (
$info[
'mpeg'][
'video'][
'raw'][
'colour_description']) {
181 }
185
187 break;
188
189 case 3:
190 break;
191
192 case 5:
195 if (
$info[
'mpeg'][
'video'][
'raw'][
'scalable_mode'] == 1) {
203 } elseif (
$info[
'mpeg'][
'video'][
'raw'][
'scalable_mode'] == 3) {
205 if (
$info[
'mpeg'][
'video'][
'raw'][
'picture_mux_enable']) {
207 }
210 }
211
213 break;
214
215 case 7:
216 break;
217
218 case 8:
235 if (
$info[
'mpeg'][
'video'][
'raw'][
'composite_display_flag']) {
241 }
242
243 $info[
'mpeg'][
'video'][
'intra_dc_precision_bits'] =
$info[
'mpeg'][
'video'][
'raw'][
'intra_dc_precision'] + 8;
245 break;
246
247 case 9:
248 break;
249 case 10:
250 break;
251
252 default:
253 $this->
warning(
'Unexpected $info[mpeg][video][raw][extension_start_code_identifier] value of '.
$info[
'mpeg'][
'video'][
'raw'][
'extension_start_code_identifier']);
254 break;
255 }
256 break;
257
258
259 case 0xB8:
260 $GOPcounter++;
261 if (
$info[
'mpeg'][
'video'][
'bitrate_mode'] ==
'vbr') {
263 $bitstreamoffset = 0;
264
265 $GOPheader = array();
266
267 $GOPheader['byte_offset'] = $MPEGstreamBaseOffset + $StartCodeOffset;
276
277 $time_code_separator = ($GOPheader['drop_frame_flag'] ? ';' : ':');
278 $GOPheader[
'time_code'] =
sprintf(
'%02d'.$time_code_separator.
'%02d'.$time_code_separator.
'%02d'.$time_code_separator.
'%02d', $GOPheader[
'time_code_hours'], $GOPheader[
'time_code_minutes'], $GOPheader[
'time_code_seconds'], $GOPheader[
'time_code_pictures']);
279
280 $info[
'mpeg'][
'group_of_pictures'][] = $GOPheader;
281 }
282 break;
283
284 case 0xC0:
285 case 0xC1:
286 case 0xC2:
287 case 0xC3:
288 case 0xC4:
289 case 0xC5:
290 case 0xC6:
291 case 0xC7:
292 case 0xC8:
293 case 0xC9:
294 case 0xCA:
295 case 0xCB:
296 case 0xCC:
297 case 0xCD:
298 case 0xCE:
299 case 0xCF:
300 case 0xD0:
301 case 0xD1:
302 case 0xD2:
303 case 0xD3:
304 case 0xD4:
305 case 0xD5:
306 case 0xD6:
307 case 0xD7:
308 case 0xD8:
309 case 0xD9:
310 case 0xDA:
311 case 0xDB:
312 case 0xDC:
313 case 0xDD:
314 case 0xDE:
315 case 0xDF:
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332 if (isset($ParsedAVchannels[$StartCodeValue])) {
333 break;
334 }
335 $ParsedAVchannels[$StartCodeValue] = $StartCodeValue;
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382 $getid3_temp =
new getID3();
383 $getid3_temp->openfile($this->getid3->filename);
384 $getid3_temp->info =
$info;
386 for (
$i = 0;
$i <= 7;
$i++) {
387
388
389
390 $getid3_temp->info =
$info;
391
392 if ($getid3_mp3->decodeMPEGaudioHeader($MPEGstreamBaseOffset + $StartCodeOffset + 4 + 8 +
$i, $getid3_temp->info,
false)) {
393
394 $info = $getid3_temp->info;
395 $info[
'audio'][
'bitrate_mode'] =
'cbr';
396 $info[
'audio'][
'lossless'] =
false;
397 break;
398 }
399 }
400 unset($getid3_temp, $getid3_mp3);
401 break;
402
403 case 0xBC:
404 case 0xBD:
405 case 0xBE:
406 case 0xBF:
407 case 0xF0:
408 case 0xF1:
409 case 0xF2:
410 case 0xF3:
411 case 0xF4:
412 case 0xF5:
413 case 0xF6:
414 case 0xF7:
415 case 0xF8:
416 case 0xF9:
417 case 0xFA:
418 case 0xFB:
419 case 0xFC:
420 case 0xFD:
421 case 0xFE:
422 case 0xFF:
423
424 break;
425
426 default:
427
428 break;
429 }
430 } while (true);
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490 if (!empty(
$info[
'mpeg'][
'video'][
'bitrate_mode']) && (
$info[
'mpeg'][
'video'][
'bitrate_mode'] ==
'vbr')) {
491 $last_GOP_id = max(array_keys($FramesByGOP));
492 $frames_in_last_GOP = count($FramesByGOP[$last_GOP_id]);
493 $gopdata = &
$info[
'mpeg'][
'group_of_pictures'][$last_GOP_id];
494 $info[
'playtime_seconds'] = ($gopdata[
'time_code_hours'] * 3600) + ($gopdata[
'time_code_minutes'] * 60) + $gopdata[
'time_code_seconds'] + (($gopdata[
'time_code_pictures'] + $frames_in_last_GOP + 1) /
$info[
'mpeg'][
'video'][
'frame_rate']);
495 if (!isset(
$info[
'video'][
'bitrate'])) {
496 $overall_bitrate = (
$info[
'avdataend'] -
$info[
'avdataoffset']) * 8 /
$info[
'playtime_seconds'];
497 $info[
'video'][
'bitrate'] = $overall_bitrate - (isset(
$info[
'audio'][
'bitrate']) ?
$info[
'audio'][
'bitrate'] : 0);
498 }
499 unset(
$info[
'mpeg'][
'group_of_pictures']);
500 }
501
502 return true;
503 }
sprintf('%.4f', $callTime)
fseek($bytes, $whence=SEEK_SET)
static BigEndian2Bin($byteword)
static pictureStructureTextLookup($picture_structure)
static videoFormatTextLookup($video_format)
static chromaFormatTextLookup($chroma_format)
readBitsFromStream(&$bitstream, &$bitstreamoffset, $bits_to_read, $return_singlebit_as_boolean=true)
static videoAspectRatioTextLookup($rawaspectratio)
static videoFramerateLookup($rawframerate)
static videoAspectRatioLookup($rawaspectratio)
static scalableModeTextLookup($scalable_mode)