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