ILIAS  release_5-2 Revision v5.2.25-18-g3f80b82851
GetId3\Module\Audio\Optimfrog Class Reference

GetId3() by James Heinrich info@.nosp@m.geti.nosp@m.d3.or.nosp@m.g //. More...

+ Inheritance diagram for GetId3\Module\Audio\Optimfrog:
+ Collaboration diagram for GetId3\Module\Audio\Optimfrog:

Public Member Functions

 analyze ()
 
 ParseOptimFROGheader42 ()
 
 ParseOptimFROGheader45 ()
 
- Public Member Functions inherited from GetId3\Handler\BaseHandler
 __construct (GetId3Core $getid3, $call_module=null)
 
 analyze ()
 Analyze from file pointer. More...
 
 AnalyzeString (&$string)
 Analyze from string instead. More...
 
 saveAttachment (&$ThisFileInfoIndex, $filename, $offset, $length)
 

Static Public Member Functions

static OptimFROGsampleTypeLookup ($SampleType)
 array $OptimFROGsampleTypeLookup More...
 
static OptimFROGbitsPerSampleTypeLookup ($SampleType)
 array $OptimFROGbitsPerSampleTypeLookup More...
 
static OptimFROGchannelConfigurationLookup ($ChannelConfiguration)
 array $OptimFROGchannelConfigurationLookup More...
 
static OptimFROGchannelConfigNumChannelsLookup ($ChannelConfiguration)
 array $OptimFROGchannelConfigNumChannelsLookup More...
 
static OptimFROGencoderNameLookup ($EncoderID)
 array $OptimFROGencoderSystemLookup More...
 
static OptimFROGcompressionLookup ($CompressionID)
 array $OptimFROGencoderModeLookup More...
 
static OptimFROGspeedupLookup ($CompressionID)
 array $OptimFROGencoderSpeedupLookup More...
 

Additional Inherited Members

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

Detailed Description

GetId3() by James Heinrich info@.nosp@m.geti.nosp@m.d3.or.nosp@m.g //.

module for analyzing OptimFROG audio files

module.audio.riff.php

Author
James Heinrich info@.nosp@m.geti.nosp@m.d3.or.nosp@m.g http://www.getid3.org

Definition at line 32 of file Optimfrog.php.

Member Function Documentation

◆ analyze()

GetId3\Module\Audio\Optimfrog::analyze ( )
Returns
boolean

Definition at line 39 of file Optimfrog.php.

References $info, GetId3\Handler\BaseHandler\fread(), GetId3\Handler\BaseHandler\fseek(), GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader42(), GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45(), and GetId3\Lib\Helper\PrintHexBytes().

40  {
41  $info = &$this->getid3->info;
42 
43  $info['fileformat'] = 'ofr';
44  $info['audio']['dataformat'] = 'ofr';
45  $info['audio']['bitrate_mode'] = 'vbr';
46  $info['audio']['lossless'] = true;
47 
48  fseek($this->getid3->fp, $info['avdataoffset'], SEEK_SET);
49  $OFRheader = fread($this->getid3->fp, 8);
50  if (substr($OFRheader, 0, 5) == '*RIFF') {
51  return $this->ParseOptimFROGheader42();
52 
53  } elseif (substr($OFRheader, 0, 3) == 'OFR') {
54  return $this->ParseOptimFROGheader45();
55 
56  }
57 
58  $info['error'][] = 'Expecting "*RIFF" or "OFR " at offset '.$info['avdataoffset'].', found "'.Helper::PrintHexBytes($OFRheader).'"';
59  unset($info['fileformat']);
60 
61  return false;
62  }
static PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8')
Definition: Helper.php:36
fseek($bytes, $whence=SEEK_SET)
$info
Definition: example_052.php:80
+ Here is the call graph for this function:

◆ OptimFROGbitsPerSampleTypeLookup()

static GetId3\Module\Audio\Optimfrog::OptimFROGbitsPerSampleTypeLookup (   $SampleType)
static

array $OptimFROGbitsPerSampleTypeLookup

Parameters
type$SampleType
Returns
type

Definition at line 372 of file Optimfrog.php.

References array.

Referenced by GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45().

373  {
374  static $OptimFROGbitsPerSampleTypeLookup = array(
375  0 => 8,
376  1 => 8,
377  2 => 16,
378  3 => 16,
379  4 => 24,
380  5 => 24,
381  6 => 32,
382  7 => 32,
383  8 => 32,
384  9 => 32,
385  10 => 32
386  );
387 
388  return (isset($OptimFROGbitsPerSampleTypeLookup[$SampleType]) ? $OptimFROGbitsPerSampleTypeLookup[$SampleType] : false);
389  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ OptimFROGchannelConfigNumChannelsLookup()

static GetId3\Module\Audio\Optimfrog::OptimFROGchannelConfigNumChannelsLookup (   $ChannelConfiguration)
static

array $OptimFROGchannelConfigNumChannelsLookup

Parameters
type$ChannelConfiguration
Returns
type

Definition at line 413 of file Optimfrog.php.

References array.

Referenced by GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45().

414  {
415  static $OptimFROGchannelConfigNumChannelsLookup = array(
416  0 => 1,
417  1 => 2
418  );
419 
420  return (isset($OptimFROGchannelConfigNumChannelsLookup[$ChannelConfiguration]) ? $OptimFROGchannelConfigNumChannelsLookup[$ChannelConfiguration] : false);
421  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ OptimFROGchannelConfigurationLookup()

static GetId3\Module\Audio\Optimfrog::OptimFROGchannelConfigurationLookup (   $ChannelConfiguration)
static

array $OptimFROGchannelConfigurationLookup

Parameters
type$ChannelConfiguration
Returns
type

Definition at line 397 of file Optimfrog.php.

References array.

Referenced by GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45().

398  {
399  static $OptimFROGchannelConfigurationLookup = array(
400  0 => 'mono',
401  1 => 'stereo'
402  );
403 
404  return (isset($OptimFROGchannelConfigurationLookup[$ChannelConfiguration]) ? $OptimFROGchannelConfigurationLookup[$ChannelConfiguration] : false);
405  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ OptimFROGcompressionLookup()

static GetId3\Module\Audio\Optimfrog::OptimFROGcompressionLookup (   $CompressionID)
static

array $OptimFROGencoderModeLookup

Parameters
type$CompressionID
Returns
type

Definition at line 457 of file Optimfrog.php.

References array.

Referenced by GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45().

458  {
459  // mode = compression >> 3
460  // speedup = compression & 0x07
461 
462  $CompressionModeID = ($CompressionID & 0xF8) >> 3;
463  //$CompressionSpeedupID = ($CompressionID & 0x07);
464 
465  static $OptimFROGencoderModeLookup = array(
466  0x00 => 'fast',
467  0x01 => 'normal',
468  0x02 => 'high',
469  0x03 => 'extra', // extranew (some versions)
470  0x04 => 'best', // bestnew (some versions)
471  0x05 => 'ultra',
472  0x06 => 'insane',
473  0x07 => 'highnew',
474  0x08 => 'extranew',
475  0x09 => 'bestnew'
476  );
477 
478  return (isset($OptimFROGencoderModeLookup[$CompressionModeID]) ? $OptimFROGencoderModeLookup[$CompressionModeID] : 'undefined mode (0x'.str_pad(dechex($CompressionModeID), 2, '0', STR_PAD_LEFT).')');
479  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ OptimFROGencoderNameLookup()

static GetId3\Module\Audio\Optimfrog::OptimFROGencoderNameLookup (   $EncoderID)
static

array $OptimFROGencoderSystemLookup

Parameters
type$EncoderID
Returns
type

Definition at line 434 of file Optimfrog.php.

References array.

Referenced by GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45().

435  {
436  // version = (encoderID >> 4) + 4500
437  // system = encoderID & 0xF
438 
439  $EncoderVersion = number_format(((($EncoderID & 0xF0) >> 4) + 4500) / 1000, 3);
440  $EncoderSystemID = ($EncoderID & 0x0F);
441 
442  static $OptimFROGencoderSystemLookup = array(
443  0x00 => 'Windows console',
444  0x01 => 'Linux console',
445  0x0F => 'unknown'
446  );
447 
448  return $EncoderVersion.' ('.(isset($OptimFROGencoderSystemLookup[$EncoderSystemID]) ? $OptimFROGencoderSystemLookup[$EncoderSystemID] : 'undefined encoder type (0x'.dechex($EncoderSystemID).')').')';
449  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ OptimFROGsampleTypeLookup()

static GetId3\Module\Audio\Optimfrog::OptimFROGsampleTypeLookup (   $SampleType)
static

array $OptimFROGsampleTypeLookup

Parameters
type$SampleType
Returns
type

Definition at line 347 of file Optimfrog.php.

References array.

Referenced by GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45().

348  {
349  static $OptimFROGsampleTypeLookup = array(
350  0 => 'unsigned int (8-bit)',
351  1 => 'signed int (8-bit)',
352  2 => 'unsigned int (16-bit)',
353  3 => 'signed int (16-bit)',
354  4 => 'unsigned int (24-bit)',
355  5 => 'signed int (24-bit)',
356  6 => 'unsigned int (32-bit)',
357  7 => 'signed int (32-bit)',
358  8 => 'float 0.24 (32-bit)',
359  9 => 'float 16.8 (32-bit)',
360  10 => 'float 24.0 (32-bit)'
361  );
362 
363  return (isset($OptimFROGsampleTypeLookup[$SampleType]) ? $OptimFROGsampleTypeLookup[$SampleType] : false);
364  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ OptimFROGspeedupLookup()

static GetId3\Module\Audio\Optimfrog::OptimFROGspeedupLookup (   $CompressionID)
static

array $OptimFROGencoderSpeedupLookup

Parameters
type$CompressionID
Returns
type

Definition at line 487 of file Optimfrog.php.

References array.

Referenced by GetId3\Module\Audio\Optimfrog\ParseOptimFROGheader45().

488  {
489  // mode = compression >> 3
490  // speedup = compression & 0x07
491 
492  //$CompressionModeID = ($CompressionID & 0xF8) >> 3;
493  $CompressionSpeedupID = ($CompressionID & 0x07);
494 
495  static $OptimFROGencoderSpeedupLookup = array(
496  0x00 => '1x',
497  0x01 => '2x',
498  0x02 => '4x'
499  );
500 
501  return (isset($OptimFROGencoderSpeedupLookup[$CompressionSpeedupID]) ? $OptimFROGencoderSpeedupLookup[$CompressionSpeedupID] : 'undefined mode (0x'.dechex($CompressionSpeedupID));
502  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ ParseOptimFROGheader42()

GetId3\Module\Audio\Optimfrog::ParseOptimFROGheader42 ( )
Returns
boolean

Definition at line 68 of file Optimfrog.php.

References $info, GetId3\Handler\BaseHandler\fread(), GetId3\Handler\BaseHandler\fseek(), and GetId3\Lib\Helper\LittleEndian2Int().

Referenced by GetId3\Module\Audio\Optimfrog\analyze().

69  {
70  // for fileformat of v4.21 and older
71 
72  $info = &$this->getid3->info;
73  fseek($this->getid3->fp, $info['avdataoffset'], SEEK_SET);
74  $OptimFROGheaderData = fread($this->getid3->fp, 45);
75  $info['avdataoffset'] = 45;
76 
77  $OptimFROGencoderVersion_raw = Helper::LittleEndian2Int(substr($OptimFROGheaderData, 0, 1));
78  $OptimFROGencoderVersion_major = floor($OptimFROGencoderVersion_raw / 10);
79  $OptimFROGencoderVersion_minor = $OptimFROGencoderVersion_raw - ($OptimFROGencoderVersion_major * 10);
80  $RIFFdata = substr($OptimFROGheaderData, 1, 44);
81  $OrignalRIFFheaderSize = Helper::LittleEndian2Int(substr($RIFFdata, 4, 4)) + 8;
82  $OrignalRIFFdataSize = Helper::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44;
83 
84  if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) {
85  $info['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize);
86  fseek($this->getid3->fp, $info['avdataend'], SEEK_SET);
87  $RIFFdata .= fread($this->getid3->fp, $OrignalRIFFheaderSize - $OrignalRIFFdataSize);
88  }
89 
90  // move the data chunk after all other chunks (if any)
91  // so that the RIFF parser doesn't see EOF when trying
92  // to skip over the data chunk
93  $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8);
94 
95  $getid3_temp = new GetId3Core();
96  $getid3_temp->openfile($this->getid3->filename);
97  $getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
98  $getid3_temp->info['avdataend'] = $info['avdataend'];
99  $getid3_riff = new Riff($getid3_temp);
100  $getid3_riff->ParseRIFFdata($RIFFdata);
101  $info['riff'] = $getid3_temp->info['riff'];
102 
103  $info['audio']['encoder'] = 'OptimFROG '.$OptimFROGencoderVersion_major.'.'.$OptimFROGencoderVersion_minor;
104  $info['audio']['channels'] = $info['riff']['audio'][0]['channels'];
105  $info['audio']['sample_rate'] = $info['riff']['audio'][0]['sample_rate'];
106  $info['audio']['bits_per_sample'] = $info['riff']['audio'][0]['bits_per_sample'];
107  $info['playtime_seconds'] = $OrignalRIFFdataSize / ($info['audio']['channels'] * $info['audio']['sample_rate'] * ($info['audio']['bits_per_sample'] / 8));
108  $info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
109 
110  unset($getid3_riff, $getid3_temp, $RIFFdata);
111 
112  return true;
113  }
fseek($bytes, $whence=SEEK_SET)
$info
Definition: example_052.php:80
static LittleEndian2Int($byteword, $signed=false)
Definition: Helper.php:413
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ParseOptimFROGheader45()

GetId3\Module\Audio\Optimfrog::ParseOptimFROGheader45 ( )
Returns
boolean

Definition at line 119 of file Optimfrog.php.

References $info, array, GetId3\Handler\BaseHandler\feof(), GetId3\Lib\Helper\fileextension(), GetId3\Handler\BaseHandler\fread(), GetId3\Handler\BaseHandler\fseek(), GetId3\Handler\BaseHandler\ftell(), GetId3\Lib\Helper\LittleEndian2Int(), GetId3\Module\Audio\Optimfrog\OptimFROGbitsPerSampleTypeLookup(), GetId3\Module\Audio\Optimfrog\OptimFROGchannelConfigNumChannelsLookup(), GetId3\Module\Audio\Optimfrog\OptimFROGchannelConfigurationLookup(), GetId3\Module\Audio\Optimfrog\OptimFROGcompressionLookup(), GetId3\Module\Audio\Optimfrog\OptimFROGencoderNameLookup(), GetId3\Module\Audio\Optimfrog\OptimFROGsampleTypeLookup(), GetId3\Module\Audio\Optimfrog\OptimFROGspeedupLookup(), and GetId3\Lib\Helper\PrintHexBytes().

Referenced by GetId3\Module\Audio\Optimfrog\analyze().

120  {
121  // for fileformat of v4.50a and higher
122 
123  $info = &$this->getid3->info;
124  $RIFFdata = '';
125  fseek($this->getid3->fp, $info['avdataoffset'], SEEK_SET);
126  while (!feof($this->getid3->fp) && (ftell($this->getid3->fp) < $info['avdataend'])) {
127  $BlockOffset = ftell($this->getid3->fp);
128  $BlockData = fread($this->getid3->fp, 8);
129  $offset = 8;
130  $BlockName = substr($BlockData, 0, 4);
131  $BlockSize = Helper::LittleEndian2Int(substr($BlockData, 4, 4));
132 
133  if ($BlockName == 'OFRX') {
134  $BlockName = 'OFR ';
135  }
136  if (!isset($info['ofr'][$BlockName])) {
137  $info['ofr'][$BlockName] = array();
138  }
139  $thisfile_ofr_thisblock = &$info['ofr'][$BlockName];
140 
141  switch ($BlockName) {
142  case 'OFR ':
143 
144  // shortcut
145  $thisfile_ofr_thisblock['offset'] = $BlockOffset;
146  $thisfile_ofr_thisblock['size'] = $BlockSize;
147 
148  $info['audio']['encoder'] = 'OptimFROG 4.50 alpha';
149  switch ($BlockSize) {
150  case 12:
151  case 15:
152  // good
153  break;
154 
155  default:
156  $info['warning'][] = '"'.$BlockName.'" contains more data than expected (expected 12 or 15 bytes, found '.$BlockSize.' bytes)';
157  break;
158  }
159  $BlockData .= fread($this->getid3->fp, $BlockSize);
160 
161  $thisfile_ofr_thisblock['total_samples'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 6));
162  $offset += 6;
163  $thisfile_ofr_thisblock['raw']['sample_type'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 1));
164  $thisfile_ofr_thisblock['sample_type'] = $this->OptimFROGsampleTypeLookup($thisfile_ofr_thisblock['raw']['sample_type']);
165  $offset += 1;
166  $thisfile_ofr_thisblock['channel_config'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 1));
167  $thisfile_ofr_thisblock['channels'] = $thisfile_ofr_thisblock['channel_config'];
168  $offset += 1;
169  $thisfile_ofr_thisblock['sample_rate'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 4));
170  $offset += 4;
171 
172  if ($BlockSize > 12) {
173 
174  // OFR 4.504b or higher
175  $thisfile_ofr_thisblock['channels'] = $this->OptimFROGchannelConfigNumChannelsLookup($thisfile_ofr_thisblock['channel_config']);
176  $thisfile_ofr_thisblock['raw']['encoder_id'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 2));
177  $thisfile_ofr_thisblock['encoder'] = $this->OptimFROGencoderNameLookup($thisfile_ofr_thisblock['raw']['encoder_id']);
178  $offset += 2;
179  $thisfile_ofr_thisblock['raw']['compression'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 1));
180  $thisfile_ofr_thisblock['compression'] = $this->OptimFROGcompressionLookup($thisfile_ofr_thisblock['raw']['compression']);
181  $thisfile_ofr_thisblock['speedup'] = $this->OptimFROGspeedupLookup($thisfile_ofr_thisblock['raw']['compression']);
182  $offset += 1;
183 
184  $info['audio']['encoder'] = 'OptimFROG '.$thisfile_ofr_thisblock['encoder'];
185  $info['audio']['encoder_options'] = '--mode '.$thisfile_ofr_thisblock['compression'];
186 
187  if ((($thisfile_ofr_thisblock['raw']['encoder_id'] & 0xF0) >> 4) == 7) { // v4.507
188  if (strtolower(Helper::fileextension($info['filename'])) == 'ofs') {
189  // OptimFROG DualStream format is lossy, but as of v4.507 there is no way to tell the difference
190  // between lossless and lossy other than the file extension.
191  $info['audio']['dataformat'] = 'ofs';
192  $info['audio']['lossless'] = true;
193  }
194  }
195 
196  }
197 
198  $info['audio']['channels'] = $thisfile_ofr_thisblock['channels'];
199  $info['audio']['sample_rate'] = $thisfile_ofr_thisblock['sample_rate'];
200  $info['audio']['bits_per_sample'] = $this->OptimFROGbitsPerSampleTypeLookup($thisfile_ofr_thisblock['raw']['sample_type']);
201  break;
202 
203 
204  case 'COMP':
205  // unlike other block types, there CAN be multiple COMP blocks
206 
207  $COMPdata['offset'] = $BlockOffset;
208  $COMPdata['size'] = $BlockSize;
209 
210  if ($info['avdataoffset'] == 0) {
211  $info['avdataoffset'] = $BlockOffset;
212  }
213 
214  // Only interested in first 14 bytes (only first 12 needed for v4.50 alpha), not actual audio data
215  $BlockData .= fread($this->getid3->fp, 14);
216  fseek($this->getid3->fp, $BlockSize - 14, SEEK_CUR);
217 
218  $COMPdata['crc_32'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 4));
219  $offset += 4;
220  $COMPdata['sample_count'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 4));
221  $offset += 4;
222  $COMPdata['raw']['sample_type'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 1));
223  $COMPdata['sample_type'] = $this->OptimFROGsampleTypeLookup($COMPdata['raw']['sample_type']);
224  $offset += 1;
225  $COMPdata['raw']['channel_configuration'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 1));
226  $COMPdata['channel_configuration'] = $this->OptimFROGchannelConfigurationLookup($COMPdata['raw']['channel_configuration']);
227  $offset += 1;
228  $COMPdata['raw']['algorithm_id'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 2));
229  //$COMPdata['algorithm'] = OptimFROGalgorithmNameLookup($COMPdata['raw']['algorithm_id']);
230  $offset += 2;
231 
232  if ($info['ofr']['OFR ']['size'] > 12) {
233 
234  // OFR 4.504b or higher
235  $COMPdata['raw']['encoder_id'] = Helper::LittleEndian2Int(substr($BlockData, $offset, 2));
236  $COMPdata['encoder'] = $this->OptimFROGencoderNameLookup($COMPdata['raw']['encoder_id']);
237  $offset += 2;
238 
239  }
240 
241  if ($COMPdata['crc_32'] == 0x454E4F4E) {
242  // ASCII value of 'NONE' - placeholder value in v4.50a
243  $COMPdata['crc_32'] = false;
244  }
245 
246  $thisfile_ofr_thisblock[] = $COMPdata;
247  break;
248 
249  case 'HEAD':
250  $thisfile_ofr_thisblock['offset'] = $BlockOffset;
251  $thisfile_ofr_thisblock['size'] = $BlockSize;
252 
253  $RIFFdata .= fread($this->getid3->fp, $BlockSize);
254  break;
255 
256  case 'TAIL':
257  $thisfile_ofr_thisblock['offset'] = $BlockOffset;
258  $thisfile_ofr_thisblock['size'] = $BlockSize;
259 
260  if ($BlockSize > 0) {
261  $RIFFdata .= fread($this->getid3->fp, $BlockSize);
262  }
263  break;
264 
265  case 'RECV':
266  // block contains no useful meta data - simply note and skip
267 
268  $thisfile_ofr_thisblock['offset'] = $BlockOffset;
269  $thisfile_ofr_thisblock['size'] = $BlockSize;
270 
271  fseek($this->getid3->fp, $BlockSize, SEEK_CUR);
272  break;
273 
274 
275  case 'APET':
276  // APEtag v2
277 
278  $thisfile_ofr_thisblock['offset'] = $BlockOffset;
279  $thisfile_ofr_thisblock['size'] = $BlockSize;
280  $info['warning'][] = 'APEtag processing inside OptimFROG not supported in this version ('.$this->getid3->version().') of GetId3Core()';
281 
282  fseek($this->getid3->fp, $BlockSize, SEEK_CUR);
283  break;
284 
285 
286  case 'MD5 ':
287  // APEtag v2
288 
289  $thisfile_ofr_thisblock['offset'] = $BlockOffset;
290  $thisfile_ofr_thisblock['size'] = $BlockSize;
291 
292  if ($BlockSize == 16) {
293 
294  $thisfile_ofr_thisblock['md5_binary'] = fread($this->getid3->fp, $BlockSize);
295  $thisfile_ofr_thisblock['md5_string'] = Helper::PrintHexBytes($thisfile_ofr_thisblock['md5_binary'], true, false, false);
296  $info['md5_data_source'] = $thisfile_ofr_thisblock['md5_string'];
297 
298  } else {
299 
300  $info['warning'][] = 'Expecting block size of 16 in "MD5 " chunk, found '.$BlockSize.' instead';
301  fseek($this->getid3->fp, $BlockSize, SEEK_CUR);
302 
303  }
304  break;
305 
306 
307  default:
308  $thisfile_ofr_thisblock['offset'] = $BlockOffset;
309  $thisfile_ofr_thisblock['size'] = $BlockSize;
310 
311  $info['warning'][] = 'Unhandled OptimFROG block type "'.$BlockName.'" at offset '.$thisfile_ofr_thisblock['offset'];
312  fseek($this->getid3->fp, $BlockSize, SEEK_CUR);
313  break;
314  }
315  }
316  if (isset($info['ofr']['TAIL']['offset'])) {
317  $info['avdataend'] = $info['ofr']['TAIL']['offset'];
318  }
319 
320  $info['playtime_seconds'] = (float) $info['ofr']['OFR ']['total_samples'] / ($info['audio']['channels'] * $info['audio']['sample_rate']);
321  $info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
322 
323  // move the data chunk after all other chunks (if any)
324  // so that the RIFF parser doesn't see EOF when trying
325  // to skip over the data chunk
326  $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8);
327 
328  $getid3_temp = new GetId3Core();
329  $getid3_temp->openfile($this->getid3->filename);
330  $getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
331  $getid3_temp->info['avdataend'] = $info['avdataend'];
332  $getid3_riff = new Riff($getid3_temp);
333  $getid3_riff->ParseRIFFdata($RIFFdata);
334  $info['riff'] = $getid3_temp->info['riff'];
335 
336  unset($getid3_riff, $getid3_temp, $RIFFdata);
337 
338  return true;
339  }
static PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8')
Definition: Helper.php:36
static OptimFROGencoderNameLookup($EncoderID)
array $OptimFROGencoderSystemLookup
Definition: Optimfrog.php:434
static OptimFROGbitsPerSampleTypeLookup($SampleType)
array $OptimFROGbitsPerSampleTypeLookup
Definition: Optimfrog.php:372
static fileextension($filename, $numextensions=1)
Definition: Helper.php:628
fseek($bytes, $whence=SEEK_SET)
$info
Definition: example_052.php:80
static OptimFROGchannelConfigurationLookup($ChannelConfiguration)
array $OptimFROGchannelConfigurationLookup
Definition: Optimfrog.php:397
Create styles array
The data for the language used.
static OptimFROGspeedupLookup($CompressionID)
array $OptimFROGencoderSpeedupLookup
Definition: Optimfrog.php:487
static OptimFROGchannelConfigNumChannelsLookup($ChannelConfiguration)
array $OptimFROGchannelConfigNumChannelsLookup
Definition: Optimfrog.php:413
static LittleEndian2Int($byteword, $signed=false)
Definition: Helper.php:413
static OptimFROGcompressionLookup($CompressionID)
array $OptimFROGencoderModeLookup
Definition: Optimfrog.php:457
static OptimFROGsampleTypeLookup($SampleType)
array $OptimFROGsampleTypeLookup
Definition: Optimfrog.php:347
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

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