getid3_mp3::FreeFormatFrameLength() –

You appear to be a bot. Output may be restricted

Description

Usage

$int|false = getid3_mp3::FreeFormatFrameLength( $offset, $deepscan );

Parameters

$offset
( int ) required
$deepscan
( bool ) optional

Returns

int|false

Source

File name: wordpress/wp-includes/ID3/module.audio.mp3.php
Lines:

1 to 76 of 76
  public function FreeFormatFrameLength($offset, $deepscan=false) {
    $info = &$this->getid3->info;

    $this->fseek($offset);
    $MPEGaudioData = $this->fread(32768);

    $SyncPattern1 = substr($MPEGaudioData, 0, 4);
    // may be different pattern due to padding
    $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) | 0x02).$SyncPattern1[3];
    if ($SyncPattern2 === $SyncPattern1) {
      $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) & 0xFD).$SyncPattern1[3];
    }

    $framelength = false;
    $framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4);
    $framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4);
    if ($framelength1 > 4) {
      $framelength = $framelength1;
    }
    if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
      $framelength = $framelength2;
    }
    if (!$framelength) {

      // LAME 3.88 has a different value for modeextension on the first frame vs the rest
      $framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4);
      $framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4);

      if ($framelength1 > 4) {
        $framelength = $framelength1;
      }
      if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
        $framelength = $framelength2;
      }
      if (!$framelength) {
        $this->error('Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset);
        return false;
      } else {
        $this->warning('ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)');
        $info['audio']['codec']   = 'LAME';
        $info['audio']['encoder'] = 'LAME3.88';
        $SyncPattern1 = substr($SyncPattern1, 0, 3);
        $SyncPattern2 = substr($SyncPattern2, 0, 3);
      }
    }

    if ($deepscan) {

      $ActualFrameLengthValues = array();
      $nextoffset = $offset + $framelength;
      while ($nextoffset < ($info['avdataend'] - 6)) {
        $this->fseek($nextoffset - 1);
        $NextSyncPattern = $this->fread(6);
        if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) {
          // good - found where expected
          $ActualFrameLengthValues[] = $framelength;
        } elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) {
          // ok - found one byte earlier than expected (last frame wasn't padded, first frame was)
          $ActualFrameLengthValues[] = ($framelength - 1);
          $nextoffset--;
        } elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) {
          // ok - found one byte later than expected (last frame was padded, first frame wasn't)
          $ActualFrameLengthValues[] = ($framelength + 1);
          $nextoffset++;
        } else {
          $this->error('Did not find expected free-format sync pattern at offset '.$nextoffset);
          return false;
        }
        $nextoffset += $framelength;
      }
      if (count($ActualFrameLengthValues) > 0) {
        $framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues)));
      }
    }
    return $framelength;
  }
 

 View on GitHub View on Trac