37 {
38 $info = &$this->getid3->info;
39
40 fseek($this->getid3->fp,
$info[
'avdataoffset'], SEEK_SET);
41 $TIFFheader =
fread($this->getid3->fp, 4);
42
43 switch (substr($TIFFheader, 0, 2)) {
44 case 'II':
45 $info[
'tiff'][
'byte_order'] =
'Intel';
46 break;
47 case 'MM':
48 $info[
'tiff'][
'byte_order'] =
'Motorola';
49 break;
50 default:
51 $info[
'error'][] =
'Invalid TIFF byte order identifier ('.substr($TIFFheader, 0, 2).
') at offset '.
$info[
'avdataoffset'];
52
53 return false;
54 break;
55 }
56
57 $info[
'fileformat'] =
'tiff';
58 $info[
'video'][
'dataformat'] =
'tiff';
59 $info[
'video'][
'lossless'] =
true;
60 $info[
'tiff'][
'ifd'] = array();
61 $CurrentIFD = array();
62
63 $FieldTypeByteLength = array(1=>1, 2=>1, 3=>2, 4=>4, 5=>8);
64
66
67 while ($nextIFDoffset > 0) {
68
69 $CurrentIFD['offset'] = $nextIFDoffset;
70
71 fseek($this->getid3->fp,
$info[
'avdataoffset'] + $nextIFDoffset, SEEK_SET);
73
74 for ($i = 0; $i < $CurrentIFD['fieldcount']; $i++) {
75 $CurrentIFD[
'fields'][$i][
'raw'][
'tag'] = $this->
TIFFendian2Int(
fread($this->getid3->fp, 2),
$info[
'tiff'][
'byte_order']);
76 $CurrentIFD[
'fields'][$i][
'raw'][
'type'] = $this->
TIFFendian2Int(
fread($this->getid3->fp, 2),
$info[
'tiff'][
'byte_order']);
77 $CurrentIFD[
'fields'][$i][
'raw'][
'length'] = $this->
TIFFendian2Int(
fread($this->getid3->fp, 4),
$info[
'tiff'][
'byte_order']);
78 $CurrentIFD[
'fields'][$i][
'raw'][
'offset'] =
fread($this->getid3->fp, 4);
79
80 switch ($CurrentIFD['fields'][$i]['raw']['type']) {
81 case 1:
82 if ($CurrentIFD['fields'][$i]['raw']['length'] <= 4) {
83 $CurrentIFD[
'fields'][$i][
'value'] = $this->
TIFFendian2Int(substr($CurrentIFD[
'fields'][$i][
'raw'][
'offset'], 0, 1),
$info[
'tiff'][
'byte_order']);
84 } else {
85 $CurrentIFD[
'fields'][$i][
'offset'] = $this->
TIFFendian2Int($CurrentIFD[
'fields'][$i][
'raw'][
'offset'],
$info[
'tiff'][
'byte_order']);
86 }
87 break;
88
89 case 2:
90 if ($CurrentIFD['fields'][$i]['raw']['length'] <= 4) {
91 $CurrentIFD['fields'][$i]['value'] = substr($CurrentIFD['fields'][$i]['raw']['offset'], 3);
92 } else {
93 $CurrentIFD[
'fields'][$i][
'offset'] = $this->
TIFFendian2Int($CurrentIFD[
'fields'][$i][
'raw'][
'offset'],
$info[
'tiff'][
'byte_order']);
94 }
95 break;
96
97 case 3:
98 if ($CurrentIFD['fields'][$i]['raw']['length'] <= 2) {
99 $CurrentIFD[
'fields'][$i][
'value'] = $this->
TIFFendian2Int(substr($CurrentIFD[
'fields'][$i][
'raw'][
'offset'], 0, 2),
$info[
'tiff'][
'byte_order']);
100 } else {
101 $CurrentIFD[
'fields'][$i][
'offset'] = $this->
TIFFendian2Int($CurrentIFD[
'fields'][$i][
'raw'][
'offset'],
$info[
'tiff'][
'byte_order']);
102 }
103 break;
104
105 case 4:
106 if ($CurrentIFD['fields'][$i]['raw']['length'] <= 1) {
107 $CurrentIFD[
'fields'][$i][
'value'] = $this->
TIFFendian2Int($CurrentIFD[
'fields'][$i][
'raw'][
'offset'],
$info[
'tiff'][
'byte_order']);
108 } else {
109 $CurrentIFD[
'fields'][$i][
'offset'] = $this->
TIFFendian2Int($CurrentIFD[
'fields'][$i][
'raw'][
'offset'],
$info[
'tiff'][
'byte_order']);
110 }
111 break;
112
113 case 5:
114 break;
115 }
116 }
117
118 $info[
'tiff'][
'ifd'][] = $CurrentIFD;
119 $CurrentIFD = array();
121
122 }
123
124 foreach (
$info[
'tiff'][
'ifd'] as $IFDid => $IFDarray) {
125 foreach ($IFDarray['fields'] as $key => $fieldarray) {
126 switch ($fieldarray['raw']['tag']) {
127 case 256:
128 case 257:
129 case 258:
130 case 259:
131 if (!isset($fieldarray['value'])) {
132 fseek($this->getid3->fp, $fieldarray[
'offset'], SEEK_SET);
133 $info[
'tiff'][
'ifd'][$IFDid][
'fields'][$key][
'raw'][
'data'] =
fread($this->getid3->fp, $fieldarray[
'raw'][
'length'] * $FieldTypeByteLength[$fieldarray[
'raw'][
'type']]);
134
135 }
136 break;
137
138 case 270:
139 case 271:
140 case 272:
141 case 305:
142 case 306:
143 case 315:
144 case 316:
145 if (isset($fieldarray['value'])) {
146 $info[
'tiff'][
'ifd'][$IFDid][
'fields'][$key][
'raw'][
'data'] = $fieldarray[
'value'];
147 } else {
148 fseek($this->getid3->fp, $fieldarray[
'offset'], SEEK_SET);
149 $info[
'tiff'][
'ifd'][$IFDid][
'fields'][$key][
'raw'][
'data'] =
fread($this->getid3->fp, $fieldarray[
'raw'][
'length'] * $FieldTypeByteLength[$fieldarray[
'raw'][
'type']]);
150
151 }
152 break;
153 }
154 switch ($fieldarray['raw']['tag']) {
155 case 256:
156 $info[
'video'][
'resolution_x'] = $fieldarray[
'value'];
157 break;
158
159 case 257:
160 $info[
'video'][
'resolution_y'] = $fieldarray[
'value'];
161 break;
162
163 case 258:
164 if (isset($fieldarray['value'])) {
165 $info[
'video'][
'bits_per_sample'] = $fieldarray[
'value'];
166 } else {
167 $info[
'video'][
'bits_per_sample'] = 0;
168 for ($i = 0; $i < $fieldarray['raw']['length']; $i++) {
169 $info[
'video'][
'bits_per_sample'] += $this->
TIFFendian2Int(substr(
$info[
'tiff'][
'ifd'][$IFDid][
'fields'][$key][
'raw'][
'data'], $i * $FieldTypeByteLength[$fieldarray[
'raw'][
'type']], $FieldTypeByteLength[$fieldarray[
'raw'][
'type']]),
$info[
'tiff'][
'byte_order']);
170 }
171 }
172 break;
173
174 case 259:
176 break;
177
178 case 270:
179 case 271:
180 case 272:
181 case 305:
182 case 306:
183 case 315:
184 case 316:
186 if (isset(
$info[
'tiff'][
'comments'][$TIFFcommentName])) {
187 $info[
'tiff'][
'comments'][$TIFFcommentName][] =
$info[
'tiff'][
'ifd'][$IFDid][
'fields'][$key][
'raw'][
'data'];
188 } else {
189 $info[
'tiff'][
'comments'][$TIFFcommentName] = array(
$info[
'tiff'][
'ifd'][$IFDid][
'fields'][$key][
'raw'][
'data']);
190 }
191 break;
192
193 default:
194 break;
195 }
196 }
197 }
198
199 return true;
200 }
fseek($bytes, $whence=SEEK_SET)
TIFFcommentName($id)
@staticvar array $TIFFcommentName
TIFFcompressionMethod($id)
@staticvar array $TIFFcompressionMethod
TIFFendian2Int($bytestring, $byteorder)