<Website>

getID3

PHK Home

File: /lib/module.audio.dts.php

Size:7547
Storage flags:strip

<?php



















class getid3_dts extends getid3_handler
{



const 
syncword "\x7F\xFE\x80\x01";

private 
$readBinDataOffset 0;




public static 
$syncwords = array(
=> "\x7F\xFE\x80\x01"
 
=> "\xFE\x7F\x01\x80"
 
=> "\x1F\xFF\xE8\x00"
 
=> "\xFF\x1F\x00\xE8"); 

public function 
Analyze() {
$info = &$this->getid3->info;
$info['fileformat'] = 'dts';

$this->fseek($info['avdataoffset']);
$DTSheader $this->fread(20); 


 
$sync substr($DTSheader04);
if ((
$encoding array_search($syncself::$syncwords)) !== false) {

$info['dts']['raw']['magic'] = $sync;
$this->readBinDataOffset 32;

} elseif (
$this->isDependencyFor('matroska')) {


 
$encoding 0;
$this->readBinDataOffset 0;

} else {

unset(
$info['fileformat']);
return 
$this->error('Expecting "'.implode('| 'array_map('getid3_lib::PrintHexBytes'self::$syncwords)).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($sync).'"');

}


 
$fhBS '';
for (
$word_offset 0$word_offset <= strlen($DTSheader); $word_offset += 2) {
switch (
$encoding) {
case 
0
 
$fhBS .= getid3_lib::BigEndian2Binsubstr($DTSheader$word_offset2) );
break;
case 
1
 
$fhBS .= getid3_lib::BigEndian2Bin(strrev(substr($DTSheader$word_offset2)));
break;
case 
2
 
$fhBS .= substr(getid3_lib::BigEndian2Binsubstr($DTSheader$word_offset2) ), 214);
break;
case 
3
 
$fhBS .= substr(getid3_lib::BigEndian2Bin(strrev(substr($DTSheader$word_offset2))), 214);
break;
}
}

$info['dts']['raw']['frame_type'] = $this->readBinData($fhBS1);
$info['dts']['raw']['deficit_samples'] = $this->readBinData($fhBS5);
$info['dts']['flags']['crc_present'] = (bool) $this->readBinData($fhBS1);
$info['dts']['raw']['pcm_sample_blocks'] = $this->readBinData($fhBS7);
$info['dts']['raw']['frame_byte_size'] = $this->readBinData($fhBS14);
$info['dts']['raw']['channel_arrangement'] = $this->readBinData($fhBS6);
$info['dts']['raw']['sample_frequency'] = $this->readBinData($fhBS4);
$info['dts']['raw']['bitrate'] = $this->readBinData($fhBS5);
$info['dts']['flags']['embedded_downmix'] = (bool) $this->readBinData($fhBS1);
$info['dts']['flags']['dynamicrange'] = (bool) $this->readBinData($fhBS1);
$info['dts']['flags']['timestamp'] = (bool) $this->readBinData($fhBS1);
$info['dts']['flags']['auxdata'] = (bool) $this->readBinData($fhBS1);
$info['dts']['flags']['hdcd'] = (bool) $this->readBinData($fhBS1);
$info['dts']['raw']['extension_audio'] = $this->readBinData($fhBS3);
$info['dts']['flags']['extended_coding'] = (bool) $this->readBinData($fhBS1);
$info['dts']['flags']['audio_sync_insertion'] = (bool) $this->readBinData($fhBS1);
$info['dts']['raw']['lfe_effects'] = $this->readBinData($fhBS2);
$info['dts']['flags']['predictor_history'] = (bool) $this->readBinData($fhBS1);
if (
$info['dts']['flags']['crc_present']) {
$info['dts']['raw']['crc16'] = $this->readBinData($fhBS16);
}
$info['dts']['flags']['mri_perfect_reconst'] = (bool) $this->readBinData($fhBS1);
$info['dts']['raw']['encoder_soft_version'] = $this->readBinData($fhBS4);
$info['dts']['raw']['copy_history'] = $this->readBinData($fhBS2);
$info['dts']['raw']['bits_per_sample'] = $this->readBinData($fhBS2);
$info['dts']['flags']['surround_es'] = (bool) $this->readBinData($fhBS1);
$info['dts']['flags']['front_sum_diff'] = (bool) $this->readBinData($fhBS1);
$info['dts']['flags']['surround_sum_diff'] = (bool) $this->readBinData($fhBS1);
$info['dts']['raw']['dialog_normalization'] = $this->readBinData($fhBS4);


$info['dts']['bitrate'] = self::bitrateLookup($info['dts']['raw']['bitrate']);
$info['dts']['bits_per_sample'] = self::bitPerSampleLookup($info['dts']['raw']['bits_per_sample']);
$info['dts']['sample_rate'] = self::sampleRateLookup($info['dts']['raw']['sample_frequency']);
$info['dts']['dialog_normalization'] = self::dialogNormalization($info['dts']['raw']['dialog_normalization'], $info['dts']['raw']['encoder_soft_version']);
$info['dts']['flags']['lossless'] = (($info['dts']['raw']['bitrate'] == 31) ? true false);
$info['dts']['bitrate_mode'] = (($info['dts']['raw']['bitrate'] == 30) ? 'vbr' 'cbr');
$info['dts']['channels'] = self::numChannelsLookup($info['dts']['raw']['channel_arrangement']);
$info['dts']['channel_arrangement'] = self::channelArrangementLookup($info['dts']['raw']['channel_arrangement']);

$info['audio']['dataformat'] = 'dts';
$info['audio']['lossless'] = $info['dts']['flags']['lossless'];
$info['audio']['bitrate_mode'] = $info['dts']['bitrate_mode'];
$info['audio']['bits_per_sample'] = $info['dts']['bits_per_sample'];
$info['audio']['sample_rate'] = $info['dts']['sample_rate'];
$info['audio']['channels'] = $info['dts']['channels'];
$info['audio']['bitrate'] = $info['dts']['bitrate'];
if (isset(
$info['avdataend']) && !empty($info['dts']['bitrate']) && is_numeric($info['dts']['bitrate'])) {
$info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($info['dts']['bitrate'] / 8);
if ((
$encoding == 2) || ($encoding == 3)) {

 
$info['playtime_seconds'] *= (14 16);
}
}
return 
true;
}

private function 
readBinData($bin$length) {
$data substr($bin$this->readBinDataOffset$length);
$this->readBinDataOffset += $length;

return 
bindec($data);
}

public static function 
bitrateLookup($index) {
static 
$lookup = array(
=> 32000,
=> 56000,
=> 64000,
=> 96000,
=> 112000,
=> 128000,
=> 192000,
=> 224000,
=> 256000,
=> 320000,
10 => 384000,
11 => 448000,
12 => 512000,
13 => 576000,
14 => 640000,
15 => 768000,
16 => 960000,
17 => 1024000,
18 => 1152000,
19 => 1280000,
20 => 1344000,
21 => 1408000,
22 => 1411200,
23 => 1472000,
24 => 1536000,
25 => 1920000,
26 => 2048000,
27 => 3072000,
28 => 3840000,
29 => 'open',
30 => 'variable',
31 => 'lossless',
);
return (isset(
$lookup[$index]) ? $lookup[$index] : false);
}

public static function 
sampleRateLookup($index) {
static 
$lookup = array(
=> 'invalid',
=> 8000,
=> 16000,
=> 32000,
=> 'invalid',
=> 'invalid',
=> 11025,
=> 22050,
=> 44100,
=> 'invalid',
10 => 'invalid',
11 => 12000,
12 => 24000,
13 => 48000,
14 => 'invalid',
15 => 'invalid',
);
return (isset(
$lookup[$index]) ? $lookup[$index] : false);
}

public static function 
bitPerSampleLookup($index) {
static 
$lookup = array(
=> 16,
=> 20,
=> 24,
=> 24,
);
return (isset(
$lookup[$index]) ? $lookup[$index] : false);
}

public static function 
numChannelsLookup($index) {
switch (
$index) {
case 
0:
return 
1;
break;
case 
1:
case 
2:
case 
3:
case 
4:
return 
2;
break;
case 
5:
case 
6:
return 
3;
break;
case 
7:
case 
8:
return 
4;
break;
case 
9:
return 
5;
break;
case 
10:
case 
11:
case 
12:
return 
6;
break;
case 
13:
return 
7;
break;
case 
14:
case 
15:
return 
8;
break;
}
return 
false;
}

public static function 
channelArrangementLookup($index) {
static 
$lookup = array(
=> 'A',
=> 'A + B (dual mono)',
=> 'L + R (stereo)',
=> '(L+R) + (L-R) (sum-difference)',
=> 'LT + RT (left and right total)',
=> 'C + L + R',
=> 'L + R + S',
=> 'C + L + R + S',
=> 'L + R + SL + SR',
=> 'C + L + R + SL + SR',
10 => 'CL + CR + L + R + SL + SR',
11 => 'C + L + R+ LR + RR + OV',
12 => 'CF + CR + LF + RF + LR + RR',
13 => 'CL + C + CR + L + R + SL + SR',
14 => 'CL + CR + L + R + SL1 + SL2 + SR1 + SR2',
15 => 'CL + C+ CR + L + R + SL + S + SR',
);
return (isset(
$lookup[$index]) ? $lookup[$index] : 'user-defined');
}

public static function 
dialogNormalization($index$version) {
switch (
$version) {
case 
7:
return 
$index;
break;
case 
6:
return 
16 $index;
break;
}
return 
false;
}

}

For more information about the PHK package format: http://phk.tekwire.net