summaryrefslogtreecommitdiffstats
path: root/src/jpeg.c
blob: c90fe5b6834cbb5aa43a10ff3ea27bb8d1ff240f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#define SOI_MK	0xFFD8		/* start of image	*/
#define APP_MK	0xFFE0		/* custom, up to FFEF */
#define COM_MK	0xFFFE		/* commment segment	*/
#define SOF_MK	0xFFC0		/* start of frame	*/
#define SOS_MK	0xFFDA		/* start of scan	*/
#define DHT_MK	0xFFC4		/* Huffman table	*/
#define DQT_MK	0xFFDB		/* Quant. table		*/
#define DRI_MK	0xFFDD		/* restart interval	*/
#define EOI_MK	0xFFD9		/* end of image		*/
#define MK_MSK	0xFFF0

#define get_size(fi) (((unsigned int)Image[fi]) << 8) + (unsigned int)Image[fi+1]

unsigned char GetJPEGHeaderInfo (unsigned char *Image,unsigned int *offset,unsigned int *x_size,unsigned int *y_size, unsigned char *depth)
{
	unsigned int aux;
	int hCounter = 0, hAantal;
  	/* First find the SOI marker: */
  		aux = get_size(hCounter); hCounter+=2;
  		if (aux != SOI_MK)
  		{ printf("INFO:\tNO SOI marker!\n"); return 0;}

    	printf("%ld:\tINFO:\tFound the SOI marker!\n", hCounter);

		/* Read first marker */
		while( (aux != EOI_MK) && (aux != 0))
		{
			aux = get_size(hCounter); hCounter+=2;
			switch(aux)
			{
			case APP_MK:
				hAantal = get_size(hCounter);
				printf("\tJFIF marker - APP0 Marker size: %i Count: %i\n", hAantal,hCounter);
				printf("\tversion: %02x%02x units %x Xdensity %i Ydensity %i Xthumbnail %i Ythumbnail %i",
				Image[hCounter+7],Image[hCounter+8],Image[hCounter+9],get_size(hCounter+10),get_size(hCounter+12)
				,Image[hCounter+14],Image[hCounter+15]);
				hCounter = hCounter + hAantal;
			break;
			case COM_MK:
				hAantal = get_size(hCounter);
				printf("\tcommment segment Marker size: %i Count: %i\n", hAantal,hCounter);
				hCounter = hCounter + hAantal;
			break;
			case SOF_MK:

			  hAantal= get_size(hCounter); 	/* header size */
				printf("\tSOF: %i Count: %i\n", hAantal,hCounter);
				hAantal= hCounter + get_size(hCounter);
				hCounter+=2;
	    	  /* load basic image parameters */
	    	  hCounter++;	/* precision, 8bit, don't care */
	    	  *y_size = get_size(hCounter); hCounter+=2;
	    	  *x_size = get_size(hCounter); hCounter+=2;

	    	  printf("\tINFO:\tImage size is %d by %d\n", *x_size, *y_size);

	    	  *depth = Image[hCounter];	/* # of components */

			  printf("\tINFO:\t");
			  switch (*depth)
			  {
			  	  case 1: printf("Monochrome"); break;
			  	  case 3: printf("Color"); break;
			  	  default: printf("Not a"); break;
			    }
			  printf(" JPEG image!\n");
			  hCounter = hAantal;

			break;
			case DHT_MK:
				hAantal = get_size(hCounter);
				printf("\tHuffman table size: %i Count: %i\n", hAantal,hCounter);
				hCounter = hCounter + hAantal;
			break;
			case DQT_MK:
				hAantal = get_size(hCounter);
				printf("\tQuant. table size: %i Count: %i\n", hAantal,hCounter);
				hCounter = hCounter + hAantal;
			break;
			default:
				hAantal = get_size(hCounter);
				printf("\tOverig nl: %04X Count: %i, aantal: %i\n", aux,hCounter, hAantal);
				hCounter = hCounter + get_size(hCounter);
			}
		}
	printf("\tEinde op: aux: %04X Count: %i \n", aux, hCounter);
	return 1;
}

unsigned char WriteJPEGHeaderInfo (unsigned char *Image,unsigned int offset,unsigned int x_size,unsigned int y_size, unsigned char depth)
{
	// SOI marker + JFIF marker - APP0 Marker size: 16 Count: 4

	// version: 0102 units 1 Xdensity 300 Ydensity 300 Xthumbnail 0 Ythumbnail 0
	// FF,D8,FF,E0,00,10,4A,46,49,46,00,01,02,01,01,2C,01,2C,00,00


	return 0;
}