Definition at line 19 of file module.audio.lpac.php.
◆ Analyze()
Reimplemented from getid3_handler.
Definition at line 22 of file module.audio.lpac.php.
22 {
23 $info = &$this->getid3->info;
24
26 $LPACheader = $this->
fread(14);
27 if (substr($LPACheader, 0, 4) != 'LPAC') {
28 $this->
error(
'Expected "LPAC" at offset '.
$info[
'avdataoffset'].
', found "'.$StreamMarker.
'"');
29 return false;
30 }
31 $info[
'avdataoffset'] += 14;
32
33 $info[
'fileformat'] =
'lpac';
34 $info[
'audio'][
'dataformat'] =
'lpac';
35 $info[
'audio'][
'lossless'] =
true;
36 $info[
'audio'][
'bitrate_mode'] =
'vbr';
37
42
43 $info[
'lpac'][
'flags'][
'is_wave'] = (bool) ($flags[
'audio_type'] & 0x40);
44 $info[
'lpac'][
'flags'][
'stereo'] = (bool) ($flags[
'audio_type'] & 0x04);
45 $info[
'lpac'][
'flags'][
'24_bit'] = (bool) ($flags[
'audio_type'] & 0x02);
46 $info[
'lpac'][
'flags'][
'16_bit'] = (bool) ($flags[
'audio_type'] & 0x01);
47
48 if (
$info[
'lpac'][
'flags'][
'24_bit'] &&
$info[
'lpac'][
'flags'][
'16_bit']) {
49 $this->
warning(
'24-bit and 16-bit flags cannot both be set');
50 }
51
52 $info[
'lpac'][
'flags'][
'fast_compress'] = (bool) ($flags[
'parameters'] & 0x40000000);
53 $info[
'lpac'][
'flags'][
'random_access'] = (bool) ($flags[
'parameters'] & 0x08000000);
54 $info[
'lpac'][
'block_length'] = pow(2, (($flags[
'parameters'] & 0x07000000) >> 24)) * 256;
55 $info[
'lpac'][
'flags'][
'adaptive_prediction_order'] = (bool) ($flags[
'parameters'] & 0x00800000);
56 $info[
'lpac'][
'flags'][
'adaptive_quantization'] = (bool) ($flags[
'parameters'] & 0x00400000);
57 $info[
'lpac'][
'flags'][
'joint_stereo'] = (bool) ($flags[
'parameters'] & 0x00040000);
58 $info[
'lpac'][
'quantization'] = ($flags[
'parameters'] & 0x00001F00) >> 8;
59 $info[
'lpac'][
'max_prediction_order'] = ($flags[
'parameters'] & 0x0000003F);
60
61 if (
$info[
'lpac'][
'flags'][
'fast_compress'] && (
$info[
'lpac'][
'max_prediction_order'] != 3)) {
62 $this->
warning(
'max_prediction_order expected to be "3" if fast_compress is true, actual value is "'.
$info[
'lpac'][
'max_prediction_order'].
'"');
63 }
64 switch (
$info[
'lpac'][
'file_version']) {
65 case 6:
66 if (
$info[
'lpac'][
'flags'][
'adaptive_quantization']) {
67 $this->
warning(
'adaptive_quantization expected to be false in LPAC file stucture v6, actually true');
68 }
69 if (
$info[
'lpac'][
'quantization'] != 20) {
70 $this->
warning(
'Quantization expected to be 20 in LPAC file stucture v6, actually '.
$info[
'lpac'][
'flags'][
'Q']);
71 }
72 break;
73
74 default:
75
76 break;
77 }
78
79 $getid3_temp =
new getID3();
80 $getid3_temp->openfile($this->getid3->filename);
81 $getid3_temp->info =
$info;
83 $getid3_riff->Analyze();
84 $info[
'avdataoffset'] = $getid3_temp->info[
'avdataoffset'];
85 $info[
'riff'] = $getid3_temp->info[
'riff'];
86 $info[
'error'] = $getid3_temp->info[
'error'];
87 $info[
'warning'] = $getid3_temp->info[
'warning'];
88 $info[
'lpac'][
'comments'][
'comment'] = $getid3_temp->info[
'comments'];
89 $info[
'audio'][
'sample_rate'] = $getid3_temp->info[
'audio'][
'sample_rate'];
90 unset($getid3_temp, $getid3_riff);
91
92 $info[
'audio'][
'channels'] = (
$info[
'lpac'][
'flags'][
'stereo'] ? 2 : 1);
93
94 if (
$info[
'lpac'][
'flags'][
'24_bit']) {
95 $info[
'audio'][
'bits_per_sample'] =
$info[
'riff'][
'audio'][0][
'bits_per_sample'];
96 } elseif (
$info[
'lpac'][
'flags'][
'16_bit']) {
97 $info[
'audio'][
'bits_per_sample'] = 16;
98 } else {
99 $info[
'audio'][
'bits_per_sample'] = 8;
100 }
101
102 if (
$info[
'lpac'][
'flags'][
'fast_compress']) {
103
104 $info[
'audio'][
'encoder_options'] =
'-1';
105 } else {
106 switch (
$info[
'lpac'][
'max_prediction_order']) {
107 case 20:
108 $info[
'audio'][
'encoder_options'] =
'-2';
109 break;
110 case 30:
111 $info[
'audio'][
'encoder_options'] =
'-3';
112 break;
113 case 40:
114 $info[
'audio'][
'encoder_options'] =
'-4';
115 break;
116 case 60:
117 $info[
'audio'][
'encoder_options'] =
'-5';
118 break;
119 }
120 }
121
122 $info[
'playtime_seconds'] =
$info[
'lpac'][
'total_samples'] /
$info[
'audio'][
'sample_rate'];
123 $info[
'audio'][
'bitrate'] = ((
$info[
'avdataend'] -
$info[
'avdataoffset']) * 8) /
$info[
'playtime_seconds'];
124
125 return true;
126 }
fseek($bytes, $whence=SEEK_SET)
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
References $info, getid3_lib\BigEndian2Int(), getid3_handler\error(), getid3_handler\fread(), getid3_handler\fseek(), and getid3_handler\warning().
The documentation for this class was generated from the following file: