1 /* Simple JPEG tag extractor and viewer. (c) Marcus Meissner 2003, LGPL */
21 if (1!=read(fileno(stdin),&c,1))
24 fprintf(stderr,"%02x",c);
29 rd(int len, char *data) {
34 if (c == -1) return -1;
35 if (c == 0xff) c = rb(1);
36 if (c == -1) return -1;
47 if (c == -1) return -1;
48 if (c!=0xff) return -1;
58 if (x1 == -1) return -1;
60 if (x2 == -1) return -1;
62 fprintf(stderr,"(%d)",x1);
67 skipdata(int len, int suppress) {
84 haslength(int marker) {
100 int major, minor, density, x, y, r, tx, ty ;
101 r = rb(1); if (r == -1) return -1;
104 if (major == -1) return -1;
106 if (minor == -1) return -1;
108 if (density == -1) return -1;
110 x = rb(1); if (x == -1) return -1;
111 r = rb(1); if (r == -1) return -1;
114 y = rb(1); if (y == -1) return -1;
115 r = rb(1); if (r == -1) return -1;
117 tx = rb(1); if (tx == -1) return -1;
118 ty = rb(1); if (ty == -1) return -1;
119 fprintf(stderr,"JFIF v%d.%d, dens %d, %dx%d, tn %dx%d\n", major, minor, density, x, y, tx, ty);
120 return skipdata(tx * ty * 3,1);
124 main(int argc, char **argv) {
129 fprintf(stderr,":unknown, aborting.\n");
132 fprintf(stderr,":SOI\n");
136 fprintf(stderr,":Error, end of file, aborting.\n");
147 comment = malloc(len - 2 + 1);
149 if (-1 == rd(len - 2, comment))
151 fprintf(stderr,":COM(%s)\n",comment);
155 int i,ns,ss,se,ahl,cs,td;
157 ns = rb(1);if (ns == -1) break;
158 fprintf(stderr,":SOS ");
160 cs = rb(1);if (cs == -1) break;
161 td = rb(1);if (td == -1) break;
162 fprintf(stderr,"[%d,%d:%d]",cs,(td>>4),td&0xf);
164 ss = rb(1); if (ss == -1) break;
165 se = rb(1); if (se == -1) break;
166 ahl = rb(1); if (ahl == -1) break;
167 fprintf(stderr,"ss=%d, se=%d, h=%d,l=%d\n",ss,se,(ahl>>4),ahl&0xf);
171 int bitcnt,x,y,nf,i,c,hv,tq;
172 m = rb(1); if (m == -1) break;
174 y = rb(1); if (y == -1) break;
175 m = rb(1); if (m == -1) break;
177 x = rb(1); if (x == -1) break;
178 m = rb(1); if (m == -1) break;
180 nf = rb(1); if (nf == -1) break;
182 fprintf(stderr,":SOF0,bitcnt=%d,x=%d,y=%d:\n",bitcnt,x,y);
184 c = rb(1); if (c == -1) break;
185 hv = rb(1); if (hv == -1) break;
186 tq = rb(1); if (tq == -1) break;
187 fprintf(stderr,"\t %02x = %d:%d, tq=%d\n",c,(hv>>4),hv&0xf,tq);
194 fprintf(stderr,":DHT(0x%02x)\n",m);
195 skipdata(len - 2 - 1,1);
199 fprintf(stderr,":DQT\n");
203 case APP1: case APP2:
206 fprintf(stderr,":APP0(");
210 fprintf(stderr,"%s):", name);
211 if (!strcmp(name,"JFIF")) {
214 if (-1==skipdata(len - 2 - 4,0)) {
217 fprintf(stderr,"\n");
222 fprintf(stderr,":Unknown marker\n");
224 if (-1==skipdata(len - 2,0)) {
227 fprintf(stderr,"\n");