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