Source code upload
[framework/connectivity/libgphoto2.git] / camlibs / sipix / xjpeg.c
1 /* Simple JPEG tag extractor and viewer. (c) Marcus Meissner 2003, LGPL */
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #define APP0    0xe0
8 #define APP1    0xe1
9 #define APP2    0xe2
10 #define DHT     0xc4
11 #define SOI     0xd8
12 #define DQT     0xdb
13 #define SOF0    0xc0
14 #define SOS     0xda
15 #define COM     0xfe
16
17 static int
18 rb(int suppress) {
19         unsigned char c;
20
21         if (1!=read(fileno(stdin),&c,1))
22                 return -1;
23         if (!suppress)
24                 fprintf(stderr,"%02x",c);
25         return c;
26 }
27
28 static int
29 rd(int len, char *data) {
30         unsigned int c,i;
31
32         for (i=0;i<len;i++) {
33                 c = rb(1);
34                 if (c == -1) return -1;
35                 if (c == 0xff) c = rb(1);
36                 if (c == -1) return -1;
37                 data[i] = c;
38         }
39         return len;
40 }
41
42 static int
43 getmarker(void) {
44         int c;
45         
46         c = rb(0);
47         if (c == -1) return -1;
48         if (c!=0xff) return -1;
49         c = rb(0);
50         return c;
51 }
52
53 static int
54 getlength(void) {
55         int x1,x2;
56         
57         x1 = rb(1);
58         if (x1 == -1) return -1;
59         x2 = rb(1);
60         if (x2 == -1) return -1;
61         x1 =  (x1 << 8) | x2;
62         fprintf(stderr,"(%d)",x1);
63         return x1;
64 }
65
66 static int
67 skipdata(int len, int suppress) {
68         int x,i;
69
70         for (i=0;i<len;i++) {
71                 x = rb(suppress);
72                 if (x == -1)
73                         return x;
74                 if (x == 0xff) {
75                         x = rb(suppress);
76                         if (x == -1)
77                                 return x;
78                 }
79         }
80         return 1;
81 }
82
83 static int
84 haslength(int marker) {
85         switch (marker) {
86         case SOI:       return 0;
87         case APP0:      return 1;
88         case APP1:      return 1;
89         case APP2:      return 1;
90         case DHT:       return 1;
91         case SOS:       return 1;
92         case DQT:       return 1;
93         case COM:       return 1;
94         default:        return 1;
95         }
96 }
97
98 static int
99 print_jfif() {
100         int major, minor, density, x, y, r, tx, ty ;
101         r = rb(1); if (r == -1) return -1;
102
103         major = rb(1);
104         if (major == -1) return -1;
105         minor = rb(1);
106         if (minor == -1) return -1;
107         density = rb(1);
108         if (density == -1) return -1;
109
110         x = rb(1); if (x == -1) return -1;
111         r = rb(1); if (r == -1) return -1;
112         x = (x << 8) | r;
113
114         y = rb(1); if (y == -1) return -1;
115         r = rb(1); if (r == -1) return -1;
116         y = (y << 8) | r;
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);
121 }
122
123 int
124 main(int argc, char **argv) {
125         int m, len;
126
127         m = getmarker();
128         if (m != SOI) {
129                 fprintf(stderr,":unknown, aborting.\n"); 
130                 return 1;
131         }
132         fprintf(stderr,":SOI\n");
133         while (1) {
134                 m = getmarker();
135                 if (m == -1) {
136                         fprintf(stderr,":Error, end of file, aborting.\n");
137                         break;
138                 }
139                 if (haslength(m))
140                         len = getlength();
141                 else
142                         len = 0;
143                 switch (m) {
144                 case COM: {
145                         char *comment;
146                         
147                         comment = malloc(len - 2 + 1);
148                         comment[len-2]='\0';
149                         if (-1 == rd(len - 2, comment))
150                                 break;
151                         fprintf(stderr,":COM(%s)\n",comment);
152                         break;
153                 }
154                 case SOS: {
155                         int i,ns,ss,se,ahl,cs,td;
156
157                         ns = rb(1);if (ns == -1) break;
158                         fprintf(stderr,":SOS ");
159                         for (i=0;i<ns;i++) {
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);
163                         }
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);
168                         break;
169                 }
170                 case SOF0: {
171                         int bitcnt,x,y,nf,i,c,hv,tq;
172                         m = rb(1); if (m == -1) break;
173                         bitcnt = m;
174                         y = rb(1); if (y == -1) break;
175                         m = rb(1); if (m == -1) break;
176                         y = (y<<8) | m;
177                         x = rb(1); if (x == -1) break;
178                         m = rb(1); if (m == -1) break;
179                         x = (x<<8) | m;
180                         nf = rb(1); if (nf == -1) break;
181
182                         fprintf(stderr,":SOF0,bitcnt=%d,x=%d,y=%d:\n",bitcnt,x,y);
183                         for (i=0;i<nf;i++) {
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);
188                         }
189                         break;
190                 }
191                 case DHT: {
192                         m = rb(1);
193                         if (m == -1) break;
194                         fprintf(stderr,":DHT(0x%02x)\n",m);
195                         skipdata(len - 2 - 1,1);
196                         break;
197                 }
198                 case DQT: {
199                         fprintf(stderr,":DQT\n");
200                         skipdata(len-2,1);
201                         break;
202                 }
203                 case APP1: case APP2:
204                 case APP0: {
205                         char name[5];
206                         fprintf(stderr,":APP0(");
207                         if (-1==rd(4,name))
208                                 break;
209                         name[4] = '\0';
210                         fprintf(stderr,"%s):", name);
211                         if (!strcmp(name,"JFIF")) {
212                                 print_jfif();
213                         } else {
214                                 if (-1==skipdata(len - 2 - 4,0)) {
215                                         break;
216                                 }
217                                 fprintf(stderr,"\n");
218                         }
219                         break;
220                 }
221                 default:
222                         fprintf(stderr,":Unknown marker\n");
223                         if (len) {
224                                 if (-1==skipdata(len - 2,0)) {
225                                         break;
226                                 }
227                                 fprintf(stderr,"\n");
228                         }
229                         break;
230                 }
231         }
232         return 0;
233 }