1
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 /* JPEG stream markers: */
6 #define JPEG_MARKER 0xFF
7
8 /* Start of Image, End of Image */
9 #define JPEG_SOI 0xD8
10 #define JPEG_EOI 0xD9
11
12 #define JPEG_JFIF 0xE0
13
14 /* encoding markers, quantization tables and Huffman tables */
15 #define JPEG_QUANT 0xDB
16 #define JPEG_HUFF 0xC4
17
18 /* image markers, start of frame and start of scan */
19 #define JPEG_SOF0 0xC0
20 #define JPEG_SOF1 0xC1
21 #define JPEG_SOF2 0xC2
22 #define JPEG_SOS 0xDA
23
printJpegStream(FILE * f)24 void printJpegStream(FILE *f)
25 {
26 int c, l;
27
28 while(!feof(f))
29 {
30 if(fgetc(f) != JPEG_MARKER)
31 {
32 printf("Jpeg marker not found!\n");
33 break;
34 }
35
36 switch(c=fgetc(f))
37 {
38 case JPEG_SOI: printf("SOI\n"); break;
39 case JPEG_EOI: printf("EOI\n"); break;
40 case JPEG_JFIF: printf("JFIF\n"); break;
41 case JPEG_QUANT: printf("Quantization table\n"); break;
42 case JPEG_HUFF: printf("Huffman table\n"); break;
43 case JPEG_SOF0: printf("Start of frame 0\n"); break;
44 case JPEG_SOF1: printf("Start of frame 1\n"); break;
45 case JPEG_SOF2: printf("Start of frame 2\n"); break;
46 case JPEG_SOS: printf("Start of scan\n"); break;
47 default: printf("Unknown JPEG block: %02x\n", c);
48 }
49
50 if(c==JPEG_SOS)
51 break;
52
53 if(c != JPEG_SOI && c != JPEG_EOI)
54 {
55 int tmp_char = fgetc(f);
56 if (!feof(f)) {
57 l = (tmp_char << 8) + fgetc(f);
58 printf("%i bytes\n", l);
59
60 for(l-=2; l>0; --l)
61 fgetc(f);
62 }
63 }
64 }
65 }
66
main(int argc,char * argv[])67 int main(int argc, char *argv[])
68 {
69 FILE *f;
70
71 f = fopen(argv[1], "rb");
72
73 if(argc<1)
74 {
75 printf("Gimme file name\n");
76 exit(1);
77 }
78
79 if(!f)
80 {
81 printf("Couldn't open file %s!\n", argv[1]);
82 exit(1);
83 }
84
85 printJpegStream(f);
86 exit(0);
87 }
88