Changeset 32979 for trunk/src/wp-includes/ID3/module.audio.ogg.php
- Timestamp:
- 06/28/2015 12:16:17 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/ID3/module.audio.ogg.php
r29734 r32979 63 63 64 64 $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); 65 66 } elseif (substr($filedata, 0, 8) == 'OpusHead') { 67 68 if( $this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) == false ) { 69 return false; 70 } 65 71 66 72 } elseif (substr($filedata, 0, 8) == 'Speex ') { … … 256 262 } else { 257 263 258 $info['error'][] = 'Expecting either "Speex " or "vorbis" identifier strings, found "'.substr($filedata, 0, 8).'"';264 $info['error'][] = 'Expecting either "Speex ", "OpusHead" or "vorbis" identifier strings, found "'.substr($filedata, 0, 8).'"'; 259 265 unset($info['ogg']); 260 266 unset($info['mime_type']); … … 289 295 $this->ParseVorbisComments(); 290 296 break; 291 } 292 297 298 case 'opus': 299 $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); 300 $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags' 301 if(substr($filedata, 0, 8) != 'OpusTags') { 302 $info['error'][] = 'Expected "OpusTags" as header but got "'.substr($filedata, 0, 8).'"'; 303 return false; 304 } 305 306 $this->ParseVorbisComments(); 307 break; 308 309 } 293 310 294 311 // Last Page - Number of Samples … … 409 426 return true; 410 427 } 428 429 // http://tools.ietf.org/html/draft-ietf-codec-oggopus-03 430 public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { 431 $info = &$this->getid3->info; 432 $info['audio']['dataformat'] = 'opus'; 433 $info['mime_type'] = 'audio/ogg; codecs=opus'; 434 435 /** @todo find a usable way to detect abr (vbr that is padded to be abr) */ 436 $info['audio']['bitrate_mode'] = 'vbr'; 437 438 $info['audio']['lossless'] = false; 439 440 $info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead' 441 $filedataoffset += 8; 442 $info['ogg']['pageheader']['opus']['version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); 443 $filedataoffset += 1; 444 445 if ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) { 446 $info['error'][] = 'Unknown opus version number (only accepting 1-15)'; 447 return false; 448 } 449 450 $info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); 451 $filedataoffset += 1; 452 453 if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) { 454 $info['error'][] = 'Invalid channel count in opus header (must not be zero)'; 455 return false; 456 } 457 458 $info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); 459 $filedataoffset += 2; 460 461 $info['ogg']['pageheader']['opus']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); 462 $filedataoffset += 4; 463 464 //$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); 465 //$filedataoffset += 2; 466 467 //$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); 468 //$filedataoffset += 1; 469 470 $info['opus']['opus_version'] = $info['ogg']['pageheader']['opus']['version']; 471 $info['opus']['sample_rate'] = $info['ogg']['pageheader']['opus']['sample_rate']; 472 $info['opus']['out_channel_count'] = $info['ogg']['pageheader']['opus']['out_channel_count']; 473 474 $info['audio']['channels'] = $info['opus']['out_channel_count']; 475 $info['audio']['sample_rate'] = $info['opus']['sample_rate']; 476 return true; 477 } 478 411 479 412 480 public function ParseOggPageHeader() { … … 472 540 case 'vorbis': 473 541 case 'speex': 542 case 'opus': 474 543 $CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset']; // Second Ogg page, after header block 475 544 $this->fseek($CommentStartOffset); … … 480 549 $commentdataoffset += (strlen('vorbis') + 1); 481 550 } 551 else if ($info['audio']['dataformat'] == 'opus') { 552 $commentdataoffset += strlen('OpusTags'); 553 } 554 482 555 break; 483 556 … … 505 578 $ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw']; 506 579 for ($i = 0; $i < $CommentsCount; $i++) { 580 581 if ($i >= 10000) { 582 // https://github.com/owncloud/music/issues/212#issuecomment-43082336 583 $info['warning'][] = 'Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments'; 584 break; 585 } 507 586 508 587 $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset; … … 616 695 $ogg->setStringMode($data); 617 696 $info['ogg']['comments']['picture'][] = array( 618 'image_mime' => $imageinfo['mime'], 619 'data' => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']), 697 'image_mime' => $imageinfo['mime'], 698 'datalength' => strlen($data), 699 'picturetype' => 'cover art', 700 'image_height' => $imageinfo['height'], 701 'image_width' => $imageinfo['width'], 702 'data' => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']), 620 703 ); 621 704 unset($ogg);
Note: See TracChangeset
for help on using the changeset viewer.