[ Index ]
 

Code source de LifeType 1.2.4

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/class/gallery/getid3/ -> module.audio-video.real.php (source)

   1  <?php
   2  /////////////////////////////////////////////////////////////////
   3  /// getID3() by James Heinrich <info@getid3.org>               //
   4  //  available at http://getid3.sourceforge.net                 //
   5  //            or http://www.getid3.org                         //
   6  /////////////////////////////////////////////////////////////////
   7  // See readme.txt for more details                             //
   8  /////////////////////////////////////////////////////////////////
   9  //                                                             //
  10  // module.audio-video.real.php                                 //
  11  // module for analyzing Real Audio/Video files                 //
  12  // dependencies: module.audio-video.riff.php                   //
  13  //                                                            ///
  14  /////////////////////////////////////////////////////////////////
  15  
  16  getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);
  17  
  18  class getid3_real
  19  {
  20  
  21  	function getid3_real(&$fd, &$ThisFileInfo) {
  22          $ThisFileInfo['fileformat']       = 'real';
  23          $ThisFileInfo['bitrate']          = 0;
  24          $ThisFileInfo['playtime_seconds'] = 0;
  25  
  26          fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET);
  27          $ChunkCounter = 0;
  28          while (ftell($fd) < $ThisFileInfo['avdataend']) {
  29              $ChunkData  = fread($fd, 8);
  30              $ChunkName  =                           substr($ChunkData, 0, 4);
  31              $ChunkSize  = getid3_lib::BigEndian2Int(substr($ChunkData, 4, 4));
  32  
  33              if ($ChunkName == '.ra'."\xFD") {
  34                  $ChunkData .= fread($fd, $ChunkSize - 8);
  35                  if ($this->ParseOldRAheader(substr($ChunkData, 0, 128), $ThisFileInfo['real']['old_ra_header'])) {
  36                      $ThisFileInfo['audio']['dataformat']      = 'real';
  37                      $ThisFileInfo['audio']['lossless']        = false;
  38                      $ThisFileInfo['audio']['sample_rate']     = $ThisFileInfo['real']['old_ra_header']['sample_rate'];
  39                      $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['real']['old_ra_header']['bits_per_sample'];
  40                      $ThisFileInfo['audio']['channels']        = $ThisFileInfo['real']['old_ra_header']['channels'];
  41  
  42                      $ThisFileInfo['playtime_seconds']         = 60 * ($ThisFileInfo['real']['old_ra_header']['audio_bytes'] / $ThisFileInfo['real']['old_ra_header']['bytes_per_minute']);
  43                      $ThisFileInfo['audio']['bitrate']         =  8 * ($ThisFileInfo['real']['old_ra_header']['audio_bytes'] / $ThisFileInfo['playtime_seconds']);
  44                      $ThisFileInfo['audio']['codec']           = $this->RealAudioCodecFourCClookup($ThisFileInfo['real']['old_ra_header']['fourcc'], $ThisFileInfo['audio']['bitrate']);
  45  
  46                      foreach ($ThisFileInfo['real']['old_ra_header']['comments'] as $key => $valuearray) {
  47                          if (strlen(trim($valuearray[0])) > 0) {
  48                              $ThisFileInfo['real']['comments'][$key][] = trim($valuearray[0]);
  49                          }
  50                      }
  51                      return true;
  52                  }
  53                  $ThisFileInfo['error'][] = 'There was a problem parsing this RealAudio file. Please submit it for analysis to http://www.getid3.org/upload/ or info@getid3.org';
  54                  unset($ThisFileInfo['bitrate']);
  55                  unset($ThisFileInfo['playtime_seconds']);
  56                  return false;
  57              }
  58  
  59              // shortcut
  60              $ThisFileInfo['real']['chunks'][$ChunkCounter] = array();
  61              $thisfile_real_chunks_currentchunk = &$ThisFileInfo['real']['chunks'][$ChunkCounter];
  62  
  63              $thisfile_real_chunks_currentchunk['name']   = $ChunkName;
  64              $thisfile_real_chunks_currentchunk['offset'] = ftell($fd) - 8;
  65              $thisfile_real_chunks_currentchunk['length'] = $ChunkSize;
  66              if (($thisfile_real_chunks_currentchunk['offset'] + $thisfile_real_chunks_currentchunk['length']) > $ThisFileInfo['avdataend']) {
  67                  $ThisFileInfo['warning'][] = 'Chunk "'.$thisfile_real_chunks_currentchunk['name'].'" at offset '.$thisfile_real_chunks_currentchunk['offset'].' claims to be '.$thisfile_real_chunks_currentchunk['length'].' bytes long, which is beyond end of file';
  68                  return false;
  69              }
  70  
  71              if ($ChunkSize > (GETID3_FREAD_BUFFER_SIZE + 8)) {
  72  
  73                  $ChunkData .= fread($fd, GETID3_FREAD_BUFFER_SIZE - 8);
  74                  fseek($fd, $thisfile_real_chunks_currentchunk['offset'] + $ChunkSize, SEEK_SET);
  75  
  76              } else {
  77  
  78                  $ChunkData .= fread($fd, $ChunkSize - 8);
  79  
  80              }
  81              $offset = 8;
  82  
  83              switch ($ChunkName) {
  84  
  85                  case '.RMF': // RealMedia File Header
  86                      $thisfile_real_chunks_currentchunk['object_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
  87                      $offset += 2;
  88                      switch ($thisfile_real_chunks_currentchunk['object_version']) {
  89  
  90                          case 0:
  91                              $thisfile_real_chunks_currentchunk['file_version']  = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
  92                              $offset += 4;
  93                              $thisfile_real_chunks_currentchunk['headers_count'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
  94                              $offset += 4;
  95                              break;
  96  
  97                          default:
  98                              //$ThisFileInfo['warning'][] = 'Expected .RMF-object_version to be "0", actual value is "'.$thisfile_real_chunks_currentchunk['object_version'].'" (should not be a problem)';
  99                              break;
 100  
 101                      }
 102                      break;
 103  
 104  
 105                  case 'PROP': // Properties Header
 106                      $thisfile_real_chunks_currentchunk['object_version']      = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 107                      $offset += 2;
 108                      if ($thisfile_real_chunks_currentchunk['object_version'] == 0) {
 109                          $thisfile_real_chunks_currentchunk['max_bit_rate']    = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 110                          $offset += 4;
 111                          $thisfile_real_chunks_currentchunk['avg_bit_rate']    = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 112                          $offset += 4;
 113                          $thisfile_real_chunks_currentchunk['max_packet_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 114                          $offset += 4;
 115                          $thisfile_real_chunks_currentchunk['avg_packet_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 116                          $offset += 4;
 117                          $thisfile_real_chunks_currentchunk['num_packets']     = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 118                          $offset += 4;
 119                          $thisfile_real_chunks_currentchunk['duration']        = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 120                          $offset += 4;
 121                          $thisfile_real_chunks_currentchunk['preroll']         = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 122                          $offset += 4;
 123                          $thisfile_real_chunks_currentchunk['index_offset']    = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 124                          $offset += 4;
 125                          $thisfile_real_chunks_currentchunk['data_offset']     = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 126                          $offset += 4;
 127                          $thisfile_real_chunks_currentchunk['num_streams']     = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 128                          $offset += 2;
 129                          $thisfile_real_chunks_currentchunk['flags_raw']       = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 130                          $offset += 2;
 131                          $ThisFileInfo['playtime_seconds'] = $thisfile_real_chunks_currentchunk['duration'] / 1000;
 132                          if ($thisfile_real_chunks_currentchunk['duration'] > 0) {
 133                              $ThisFileInfo['bitrate'] += $thisfile_real_chunks_currentchunk['avg_bit_rate'];
 134                          }
 135                          $thisfile_real_chunks_currentchunk['flags']['save_enabled']   = (bool) ($thisfile_real_chunks_currentchunk['flags_raw'] & 0x0001);
 136                          $thisfile_real_chunks_currentchunk['flags']['perfect_play']   = (bool) ($thisfile_real_chunks_currentchunk['flags_raw'] & 0x0002);
 137                          $thisfile_real_chunks_currentchunk['flags']['live_broadcast'] = (bool) ($thisfile_real_chunks_currentchunk['flags_raw'] & 0x0004);
 138                      }
 139                      break;
 140  
 141                  case 'MDPR': // Media Properties Header
 142                      $thisfile_real_chunks_currentchunk['object_version']         = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 143                      $offset += 2;
 144                      if ($thisfile_real_chunks_currentchunk['object_version'] == 0) {
 145                          $thisfile_real_chunks_currentchunk['stream_number']      = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 146                          $offset += 2;
 147                          $thisfile_real_chunks_currentchunk['max_bit_rate']       = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 148                          $offset += 4;
 149                          $thisfile_real_chunks_currentchunk['avg_bit_rate']       = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 150                          $offset += 4;
 151                          $thisfile_real_chunks_currentchunk['max_packet_size']    = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 152                          $offset += 4;
 153                          $thisfile_real_chunks_currentchunk['avg_packet_size']    = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 154                          $offset += 4;
 155                          $thisfile_real_chunks_currentchunk['start_time']         = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 156                          $offset += 4;
 157                          $thisfile_real_chunks_currentchunk['preroll']            = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 158                          $offset += 4;
 159                          $thisfile_real_chunks_currentchunk['duration']           = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 160                          $offset += 4;
 161                          $thisfile_real_chunks_currentchunk['stream_name_size']   = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 1));
 162                          $offset += 1;
 163                          $thisfile_real_chunks_currentchunk['stream_name']        = substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['stream_name_size']);
 164                          $offset += $thisfile_real_chunks_currentchunk['stream_name_size'];
 165                          $thisfile_real_chunks_currentchunk['mime_type_size']     = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 1));
 166                          $offset += 1;
 167                          $thisfile_real_chunks_currentchunk['mime_type']          = substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['mime_type_size']);
 168                          $offset += $thisfile_real_chunks_currentchunk['mime_type_size'];
 169                          $thisfile_real_chunks_currentchunk['type_specific_len']  = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 170                          $offset += 4;
 171                          $thisfile_real_chunks_currentchunk['type_specific_data'] = substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['type_specific_len']);
 172                          $offset += $thisfile_real_chunks_currentchunk['type_specific_len'];
 173  
 174                          // shortcut
 175                          $thisfile_real_chunks_currentchunk_typespecificdata = &$thisfile_real_chunks_currentchunk['type_specific_data'];
 176  
 177                          switch ($thisfile_real_chunks_currentchunk['mime_type']) {
 178                              case 'video/x-pn-realvideo':
 179                              case 'video/x-pn-multirate-realvideo':
 180                                  // http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html
 181  
 182                                  // shortcut
 183                                  $thisfile_real_chunks_currentchunk['video_info'] = array();
 184                                  $thisfile_real_chunks_currentchunk_videoinfo     = &$thisfile_real_chunks_currentchunk['video_info'];
 185  
 186                                  $thisfile_real_chunks_currentchunk_videoinfo['dwSize']            = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata,  0, 4));
 187                                  $thisfile_real_chunks_currentchunk_videoinfo['fourcc1']           =                           substr($thisfile_real_chunks_currentchunk_typespecificdata,  4, 4);
 188                                  $thisfile_real_chunks_currentchunk_videoinfo['fourcc2']           =                           substr($thisfile_real_chunks_currentchunk_typespecificdata,  8, 4);
 189                                  $thisfile_real_chunks_currentchunk_videoinfo['width']             = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 12, 2));
 190                                  $thisfile_real_chunks_currentchunk_videoinfo['height']            = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 14, 2));
 191                                  $thisfile_real_chunks_currentchunk_videoinfo['bits_per_sample']   = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 16, 2));
 192                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown1']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 18, 2));
 193                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown2']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 20, 2));
 194                                  $thisfile_real_chunks_currentchunk_videoinfo['frames_per_second'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 22, 2));
 195                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown3']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 24, 2));
 196                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown4']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 26, 2));
 197                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown5']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 28, 2));
 198                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown6']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 30, 2));
 199                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown7']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 32, 2));
 200                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown8']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 34, 2));
 201                                  //$thisfile_real_chunks_currentchunk_videoinfo['unknown9']          = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 36, 2));
 202  
 203                                  $thisfile_real_chunks_currentchunk_videoinfo['codec'] = getid3_riff::RIFFfourccLookup($thisfile_real_chunks_currentchunk_videoinfo['fourcc2']);
 204  
 205                                  $ThisFileInfo['video']['resolution_x']    =         $thisfile_real_chunks_currentchunk_videoinfo['width'];
 206                                  $ThisFileInfo['video']['resolution_y']    =         $thisfile_real_chunks_currentchunk_videoinfo['height'];
 207                                  $ThisFileInfo['video']['frame_rate']      = (float) $thisfile_real_chunks_currentchunk_videoinfo['frames_per_second'];
 208                                  $ThisFileInfo['video']['codec']           =         $thisfile_real_chunks_currentchunk_videoinfo['codec'];
 209                                  $ThisFileInfo['video']['bits_per_sample'] =         $thisfile_real_chunks_currentchunk_videoinfo['bits_per_sample'];
 210                                  break;
 211  
 212                              case 'audio/x-pn-realaudio':
 213                              case 'audio/x-pn-multirate-realaudio':
 214                                  $this->ParseOldRAheader($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk['parsed_audio_data']);
 215  
 216                                  $ThisFileInfo['audio']['sample_rate']     = $thisfile_real_chunks_currentchunk['parsed_audio_data']['sample_rate'];
 217                                  $ThisFileInfo['audio']['bits_per_sample'] = $thisfile_real_chunks_currentchunk['parsed_audio_data']['bits_per_sample'];
 218                                  $ThisFileInfo['audio']['channels']        = $thisfile_real_chunks_currentchunk['parsed_audio_data']['channels'];
 219                                  if (!empty($ThisFileInfo['audio']['dataformat'])) {
 220                                      foreach ($ThisFileInfo['audio'] as $key => $value) {
 221                                          if ($key != 'streams') {
 222                                              $ThisFileInfo['audio']['streams'][$thisfile_real_chunks_currentchunk['stream_number']][$key] = $value;
 223                                          }
 224                                      }
 225                                  }
 226                                  break;
 227  
 228                              case 'logical-fileinfo':
 229                                  // shortcut
 230                                  $thisfile_real_chunks_currentchunk['logical_fileinfo'] = array();
 231                                  $thisfile_real_chunks_currentchunk_logicalfileinfo     = &$thisfile_real_chunks_currentchunk['logical_fileinfo'];
 232  
 233                                  $thisfile_real_chunks_currentchunk_logicalfileinfo_offset = 0;
 234                                  $thisfile_real_chunks_currentchunk_logicalfileinfo['logical_fileinfo_length'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4));
 235                                  $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4;
 236  
 237                                  //$thisfile_real_chunks_currentchunk_logicalfileinfo['unknown1']                = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4));
 238                                  $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4;
 239  
 240                                  $thisfile_real_chunks_currentchunk_logicalfileinfo['num_tags']                = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4));
 241                                  $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4;
 242  
 243                                  //$thisfile_real_chunks_currentchunk_logicalfileinfo['unknown2']                = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4));
 244                                  $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4;
 245  
 246                                  //$thisfile_real_chunks_currentchunk_logicalfileinfo['d']                       = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 1));
 247  
 248                                  //$thisfile_real_chunks_currentchunk_logicalfileinfo['one_type'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata,     $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4));
 249                                  //$thisfile_real_chunks_currentchunk_logicalfileinfo_thislength  = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 4 + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 2));
 250                                  //$thisfile_real_chunks_currentchunk_logicalfileinfo['one']      =                           substr($thisfile_real_chunks_currentchunk_typespecificdata, 6 + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, $thisfile_real_chunks_currentchunk_logicalfileinfo_thislength);
 251                                  //$thisfile_real_chunks_currentchunk_logicalfileinfo_offset += (6 + $thisfile_real_chunks_currentchunk_logicalfileinfo_thislength);
 252  
 253                                  break;
 254  
 255                          }
 256  
 257  
 258                          if (empty($ThisFileInfo['playtime_seconds'])) {
 259                              $ThisFileInfo['playtime_seconds'] = max($ThisFileInfo['playtime_seconds'], ($thisfile_real_chunks_currentchunk['duration'] + $thisfile_real_chunks_currentchunk['start_time']) / 1000);
 260                          }
 261                          if ($thisfile_real_chunks_currentchunk['duration'] > 0) {
 262                              switch ($thisfile_real_chunks_currentchunk['mime_type']) {
 263                                  case 'audio/x-pn-realaudio':
 264                                  case 'audio/x-pn-multirate-realaudio':
 265                                      $ThisFileInfo['audio']['bitrate']    = (isset($ThisFileInfo['audio']['bitrate']) ? $ThisFileInfo['audio']['bitrate'] : 0) + $thisfile_real_chunks_currentchunk['avg_bit_rate'];
 266                                      $ThisFileInfo['audio']['codec']      = $this->RealAudioCodecFourCClookup($thisfile_real_chunks_currentchunk['parsed_audio_data']['fourcc'], $ThisFileInfo['audio']['bitrate']);
 267                                      $ThisFileInfo['audio']['dataformat'] = 'real';
 268                                      $ThisFileInfo['audio']['lossless']   = false;
 269                                      break;
 270  
 271                                  case 'video/x-pn-realvideo':
 272                                  case 'video/x-pn-multirate-realvideo':
 273                                      $ThisFileInfo['video']['bitrate']            = (isset($ThisFileInfo['video']['bitrate']) ? $ThisFileInfo['video']['bitrate'] : 0) + $thisfile_real_chunks_currentchunk['avg_bit_rate'];
 274                                      $ThisFileInfo['video']['bitrate_mode']       = 'cbr';
 275                                      $ThisFileInfo['video']['dataformat']         = 'real';
 276                                      $ThisFileInfo['video']['lossless']           = false;
 277                                      $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1;
 278                                      break;
 279  
 280                                  case 'audio/x-ralf-mpeg4-generic':
 281                                      $ThisFileInfo['audio']['bitrate']    = (isset($ThisFileInfo['audio']['bitrate']) ? $ThisFileInfo['audio']['bitrate'] : 0) + $thisfile_real_chunks_currentchunk['avg_bit_rate'];
 282                                      $ThisFileInfo['audio']['codec']      = 'RealAudio Lossless';
 283                                      $ThisFileInfo['audio']['dataformat'] = 'real';
 284                                      $ThisFileInfo['audio']['lossless']   = true;
 285                                      break;
 286                              }
 287                              $ThisFileInfo['bitrate'] = (isset($ThisFileInfo['video']['bitrate']) ? $ThisFileInfo['video']['bitrate'] : 0) + (isset($ThisFileInfo['audio']['bitrate']) ? $ThisFileInfo['audio']['bitrate'] : 0);
 288                          }
 289                      }
 290                      break;
 291  
 292                  case 'CONT': // Content Description Header (text comments)
 293                      $thisfile_real_chunks_currentchunk['object_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 294                      $offset += 2;
 295                      if ($thisfile_real_chunks_currentchunk['object_version'] == 0) {
 296                          $thisfile_real_chunks_currentchunk['title_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 297                          $offset += 2;
 298                          $thisfile_real_chunks_currentchunk['title'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['title_len']);
 299                          $offset += $thisfile_real_chunks_currentchunk['title_len'];
 300  
 301                          $thisfile_real_chunks_currentchunk['artist_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 302                          $offset += 2;
 303                          $thisfile_real_chunks_currentchunk['artist'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['artist_len']);
 304                          $offset += $thisfile_real_chunks_currentchunk['artist_len'];
 305  
 306                          $thisfile_real_chunks_currentchunk['copyright_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 307                          $offset += 2;
 308                          $thisfile_real_chunks_currentchunk['copyright'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['copyright_len']);
 309                          $offset += $thisfile_real_chunks_currentchunk['copyright_len'];
 310  
 311                          $thisfile_real_chunks_currentchunk['comment_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 312                          $offset += 2;
 313                          $thisfile_real_chunks_currentchunk['comment'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['comment_len']);
 314                          $offset += $thisfile_real_chunks_currentchunk['comment_len'];
 315  
 316  
 317                          $commentkeystocopy = array('title'=>'title', 'artist'=>'artist', 'copyright'=>'copyright', 'comment'=>'comment');
 318                          foreach ($commentkeystocopy as $key => $val) {
 319                              if ($thisfile_real_chunks_currentchunk[$key]) {
 320                                  $ThisFileInfo['real']['comments'][$val][] = trim($thisfile_real_chunks_currentchunk[$key]);
 321                              }
 322                          }
 323  
 324                      }
 325                      break;
 326  
 327  
 328                  case 'DATA': // Data Chunk Header
 329                      // do nothing
 330                      break;
 331  
 332                  case 'INDX': // Index Section Header
 333                      $thisfile_real_chunks_currentchunk['object_version']        = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 334                      $offset += 2;
 335                      if ($thisfile_real_chunks_currentchunk['object_version'] == 0) {
 336                          $thisfile_real_chunks_currentchunk['num_indices']       = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 337                          $offset += 4;
 338                          $thisfile_real_chunks_currentchunk['stream_number']     = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2));
 339                          $offset += 2;
 340                          $thisfile_real_chunks_currentchunk['next_index_header'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4));
 341                          $offset += 4;
 342  
 343                          if ($thisfile_real_chunks_currentchunk['next_index_header'] == 0) {
 344                              // last index chunk found, ignore rest of file
 345                              break 2;
 346                          } else {
 347                              // non-last index chunk, seek to next index chunk (skipping actual index data)
 348                              fseek($fd, $thisfile_real_chunks_currentchunk['next_index_header'], SEEK_SET);
 349                          }
 350                      }
 351                      break;
 352  
 353                  default:
 354                      $ThisFileInfo['warning'][] = 'Unhandled RealMedia chunk "'.$ChunkName.'" at offset '.$thisfile_real_chunks_currentchunk['offset'];
 355                      break;
 356              }
 357              $ChunkCounter++;
 358          }
 359  
 360          if (!empty($ThisFileInfo['audio']['streams'])) {
 361              $ThisFileInfo['audio']['bitrate'] = 0;
 362              foreach ($ThisFileInfo['audio']['streams'] as $key => $valuearray) {
 363                  $ThisFileInfo['audio']['bitrate'] += $valuearray['bitrate'];
 364              }
 365          }
 366  
 367          return true;
 368      }
 369  
 370  
 371  	function ParseOldRAheader($OldRAheaderData, &$ParsedArray) {
 372          // http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html
 373  
 374          $ParsedArray = array();
 375          $ParsedArray['magic'] = substr($OldRAheaderData, 0, 4);
 376          if ($ParsedArray['magic'] != '.ra'."\xFD") {
 377              return false;
 378          }
 379          $ParsedArray['version1']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData,  4, 2));
 380  
 381          if ($ParsedArray['version1'] < 3) {
 382  
 383              return false;
 384  
 385          } elseif ($ParsedArray['version1'] == 3) {
 386  
 387              $ParsedArray['fourcc1']          = '.ra3';
 388              $ParsedArray['bits_per_sample']  = 16;   // hard-coded for old versions?
 389              $ParsedArray['sample_rate']      = 8000; // hard-coded for old versions?
 390  
 391              $ParsedArray['header_size']      = getid3_lib::BigEndian2Int(substr($OldRAheaderData,  6, 2));
 392              $ParsedArray['channels']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData,  8, 2)); // always 1 (?)
 393              //$ParsedArray['unknown1']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 10, 2));
 394              //$ParsedArray['unknown2']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 12, 2));
 395              //$ParsedArray['unknown3']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 14, 2));
 396              $ParsedArray['bytes_per_minute'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 16, 2));
 397              $ParsedArray['audio_bytes']      = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 18, 4));
 398              $ParsedArray['comments_raw']     =                           substr($OldRAheaderData, 22, $ParsedArray['header_size'] - 22 + 1); // not including null terminator
 399  
 400              $commentoffset = 0;
 401              $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1));
 402              $ParsedArray['comments']['title'][]     = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength);
 403              $commentoffset += $commentlength;
 404  
 405              $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1));
 406              $ParsedArray['comments']['artist'][]    = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength);
 407              $commentoffset += $commentlength;
 408  
 409              $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1));
 410              $ParsedArray['comments']['copyright'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength);
 411              $commentoffset += $commentlength;
 412  
 413              $commentoffset++; // final null terminator (?)
 414              $commentoffset++; // fourcc length (?) should be 4
 415              $ParsedArray['fourcc']           =                           substr($OldRAheaderData, 23 + $commentoffset, 4);
 416  
 417          } elseif ($ParsedArray['version1'] <= 5) {
 418  
 419              //$ParsedArray['unknown1']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData,  6, 2));
 420              $ParsedArray['fourcc1']          =                           substr($OldRAheaderData,  8, 4);
 421              $ParsedArray['file_size']        = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 12, 4));
 422              $ParsedArray['version2']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 16, 2));
 423              $ParsedArray['header_size']      = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 18, 4));
 424              $ParsedArray['codec_flavor_id']  = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 22, 2));
 425              $ParsedArray['coded_frame_size'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 24, 4));
 426              $ParsedArray['audio_bytes']      = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 28, 4));
 427              $ParsedArray['bytes_per_minute'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 32, 4));
 428              //$ParsedArray['unknown5']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 36, 4));
 429              $ParsedArray['sub_packet_h']     = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 40, 2));
 430              $ParsedArray['frame_size']       = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 42, 2));
 431              $ParsedArray['sub_packet_size']  = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 44, 2));
 432              //$ParsedArray['unknown6']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 46, 2));
 433  
 434              switch ($ParsedArray['version1']) {
 435  
 436                  case 4:
 437                      $ParsedArray['sample_rate']      = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 48, 2));
 438                      //$ParsedArray['unknown8']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 50, 2));
 439                      $ParsedArray['bits_per_sample']  = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 52, 2));
 440                      $ParsedArray['channels']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 54, 2));
 441                      $ParsedArray['length_fourcc2']   = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 56, 1));
 442                      $ParsedArray['fourcc2']          =                           substr($OldRAheaderData, 57, 4);
 443                      $ParsedArray['length_fourcc3']   = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 61, 1));
 444                      $ParsedArray['fourcc3']          =                           substr($OldRAheaderData, 62, 4);
 445                      //$ParsedArray['unknown9']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 66, 1));
 446                      //$ParsedArray['unknown10']        = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 67, 2));
 447                      $ParsedArray['comments_raw']     =                           substr($OldRAheaderData, 69, $ParsedArray['header_size'] - 69 + 16);
 448  
 449                      $commentoffset = 0;
 450                      $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1));
 451                      $ParsedArray['comments']['title'][]     = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength);
 452                      $commentoffset += $commentlength;
 453  
 454                      $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1));
 455                      $ParsedArray['comments']['artist'][]    = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength);
 456                      $commentoffset += $commentlength;
 457  
 458                      $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1));
 459                      $ParsedArray['comments']['copyright'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength);
 460                      $commentoffset += $commentlength;
 461                      break;
 462  
 463                  case 5:
 464                      $ParsedArray['sample_rate']      = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 48, 4));
 465                      $ParsedArray['sample_rate2']     = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 52, 4));
 466                      $ParsedArray['bits_per_sample']  = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 56, 4));
 467                      $ParsedArray['channels']         = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 60, 2));
 468                      $ParsedArray['genr']             =                           substr($OldRAheaderData, 62, 4);
 469                      $ParsedArray['fourcc3']          =                           substr($OldRAheaderData, 66, 4);
 470                      $ParsedArray['comments']         = array();
 471                      break;
 472              }
 473              $ParsedArray['fourcc'] = $ParsedArray['fourcc3'];
 474  
 475          }
 476          foreach ($ParsedArray['comments'] as $key => $value) {
 477              if ($ParsedArray['comments'][$key][0] === false) {
 478                  $ParsedArray['comments'][$key][0] = '';
 479              }
 480          }
 481  
 482          return true;
 483      }
 484  
 485  	function RealAudioCodecFourCClookup($fourcc, $bitrate) {
 486          static $RealAudioCodecFourCClookup = array();
 487          if (empty($RealAudioCodecFourCClookup)) {
 488              // http://www.its.msstate.edu/net/real/reports/config/tags.stats
 489              // http://www.freelists.org/archives/matroska-devel/06-2003/fullthread18.html
 490  
 491              $RealAudioCodecFourCClookup['14_4'][8000]  = 'RealAudio v2 (14.4kbps)';
 492              $RealAudioCodecFourCClookup['14.4'][8000]  = 'RealAudio v2 (14.4kbps)';
 493              $RealAudioCodecFourCClookup['lpcJ'][8000]  = 'RealAudio v2 (14.4kbps)';
 494              $RealAudioCodecFourCClookup['28_8'][15200] = 'RealAudio v2 (28.8kbps)';
 495              $RealAudioCodecFourCClookup['28.8'][15200] = 'RealAudio v2 (28.8kbps)';
 496              $RealAudioCodecFourCClookup['sipr'][4933]  = 'RealAudio v4 (5kbps Voice)';
 497              $RealAudioCodecFourCClookup['sipr'][6444]  = 'RealAudio v4 (6.5kbps Voice)';
 498              $RealAudioCodecFourCClookup['sipr'][8444]  = 'RealAudio v4 (8.5kbps Voice)';
 499              $RealAudioCodecFourCClookup['sipr'][16000] = 'RealAudio v4 (16kbps Wideband)';
 500              $RealAudioCodecFourCClookup['dnet'][8000]  = 'RealAudio v3 (8kbps Music)';
 501              $RealAudioCodecFourCClookup['dnet'][16000] = 'RealAudio v3 (16kbps Music Low Response)';
 502              $RealAudioCodecFourCClookup['dnet'][15963] = 'RealAudio v3 (16kbps Music Mid/High Response)';
 503              $RealAudioCodecFourCClookup['dnet'][20000] = 'RealAudio v3 (20kbps Music Stereo)';
 504              $RealAudioCodecFourCClookup['dnet'][32000] = 'RealAudio v3 (32kbps Music Mono)';
 505              $RealAudioCodecFourCClookup['dnet'][31951] = 'RealAudio v3 (32kbps Music Stereo)';
 506              $RealAudioCodecFourCClookup['dnet'][39965] = 'RealAudio v3 (40kbps Music Mono)';
 507              $RealAudioCodecFourCClookup['dnet'][40000] = 'RealAudio v3 (40kbps Music Stereo)';
 508              $RealAudioCodecFourCClookup['dnet'][79947] = 'RealAudio v3 (80kbps Music Mono)';
 509              $RealAudioCodecFourCClookup['dnet'][80000] = 'RealAudio v3 (80kbps Music Stereo)';
 510  
 511              $RealAudioCodecFourCClookup['dnet'][0] = 'RealAudio v3';
 512              $RealAudioCodecFourCClookup['sipr'][0] = 'RealAudio v4';
 513              $RealAudioCodecFourCClookup['cook'][0] = 'RealAudio G2';
 514              $RealAudioCodecFourCClookup['atrc'][0] = 'RealAudio 8';
 515          }
 516          $roundbitrate = intval(round($bitrate));
 517          if (isset($RealAudioCodecFourCClookup[$fourcc][$roundbitrate])) {
 518              return $RealAudioCodecFourCClookup[$fourcc][$roundbitrate];
 519          } elseif (isset($RealAudioCodecFourCClookup[$fourcc][0])) {
 520              return $RealAudioCodecFourCClookup[$fourcc][0];
 521          }
 522          return $fourcc;
 523      }
 524  
 525  }
 526  
 527  
 528  ?>


Généré le : Mon Nov 26 21:04:15 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics