URL
https://opencores.org/ocsvn/mb-jpeg/mb-jpeg/trunk
Subversion Repositories mb-jpeg
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 32 to Rev 33
- ↔ Reverse comparison
Rev 32 → Rev 33
/trunk/encoder/dct.h
0,0 → 1,21
|
#include <math.h> |
#include <stdio.h> |
|
/* |
Function Name: dct |
|
Operation: Find the 8x8 DCT of an array using separable DCT |
First, finds 1-d DCT along rows, storing the result in inter[][] |
Then, 1-d DCT along columns of inter[][] is found |
|
Input: pixels is the 8x8 input array |
|
Output: dct is the 8x8 output array |
*/ |
|
|
|
void dct(signed char pixels[8][8], signed short dct[8][8]); |
|
void IDCT(short input[8][8], signed char output[8][8]); |
/trunk/encoder/weights.h
0,0 → 1,514
signed int weights[512] = { |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16384, |
16069, |
13623, |
9102, |
3196, |
-3196, |
-9102, |
-13623, |
-16069, |
15137, |
6270, |
-6270, |
-15137, |
-15137, |
-6270, |
6270, |
15137, |
13623, |
-3196, |
-16069, |
-9103, |
9102, |
16069, |
3196, |
-13623, |
11585, |
-11585, |
-11585, |
11585, |
11585, |
-11585, |
-11585, |
11585, |
9102, |
-16069, |
3196, |
13623, |
-13623, |
-3197, |
16069, |
-9102, |
6270, |
-15137, |
15137, |
-6270, |
-6270, |
15137, |
-15137, |
6270, |
3196, |
-9103, |
13623, |
-16069, |
16069, |
-13623, |
9102, |
-3196 |
}; |
/trunk/encoder/huffman.c
0,0 → 1,718
#pragma argsused |
/* |
Only encoder |
This version works correctly, it is tested with testcase.jpg |
The translation into real huffman codes works. |
Changed: If huffman wants to send 0xFFxx (FF in one byte) than there must be 0x00 inserted between FF and xx |
possible fault in finish send: |
-must it be filled up with zeros? YES |
-must it be filled up to one bye? or 2 byte? --> in this code there is filled up to 2 bytes, but I (joris) thinks this must be filled up to 1 byte. |
still dont know |
- 24-11-05 code clean up |
- 24-11-05 tables added for color |
|
|
|
Block numbers: |
Y = 0 |
cb =1 |
cr= 2 |
*/ |
//--------------------------------------------------------------------------- |
#pragma hdrstop |
#include <stdio.h> |
#ifdef __MICROBLAZE |
#include "xup2pro.h" |
#endif |
//=========================================================================== |
void PrintMatrix(char* pixelmatrix) |
{ |
int i; |
// printf("MATRIX= \n"); |
// for (i=0;i<64;i++) printf("%d |",pixelmatrix[i]); |
// printf("\n"); |
} |
//=========================================================================== |
void FillMatrix( char* pixelmatrix,int select) |
{ |
int i; |
if (select== 0) |
{ |
for (i=0;i<64;i++) pixelmatrix[i]=0; |
pixelmatrix[0]=6; |
pixelmatrix[1]=-4; |
pixelmatrix[2]=15; |
pixelmatrix[3]=4; |
pixelmatrix[7]=-1; |
pixelmatrix[11]=2; |
pixelmatrix[12]=2; |
pixelmatrix[20]=-1; |
|
} |
else if (select == 1 ) |
{ |
for (i=0;i<64;i++) pixelmatrix[i]=0; |
pixelmatrix[0]=36; |
pixelmatrix[1]=-1; |
pixelmatrix[2]=1; |
pixelmatrix[3]=-2; |
pixelmatrix[4]=3; |
pixelmatrix[5]=-5; |
pixelmatrix[6]=0; |
pixelmatrix[7]=7; |
pixelmatrix[8]=4; |
pixelmatrix[9]=-10; |
pixelmatrix[12]=8; |
pixelmatrix[13]=-16; |
pixelmatrix[14]=17; |
pixelmatrix[33]=30; |
pixelmatrix[34]=-63; |
pixelmatrix[35]=-32; |
pixelmatrix[36]=50; |
pixelmatrix[40]=-100; |
pixelmatrix[41]=121; |
pixelmatrix[42]=100; |
pixelmatrix[47]=-3; |
pixelmatrix[48]=-2; |
pixelmatrix[49]=-7; |
pixelmatrix[50]=-15; |
pixelmatrix[51]=3; |
pixelmatrix[52]=7; |
} |
} |
//=========================================================================== |
void ConvertDCMagnitudeC(unsigned char magnitude,unsigned short int *out, unsigned short int *lenght) |
{ |
switch (magnitude) { |
case 0x00 : *out=0x0000; *lenght=2; break; |
case 0x01 : *out=0x0001; *lenght=2; break; |
case 0x02 : *out=0x0002; *lenght=2; break; |
case 0x03 : *out=0x0006; *lenght=3; break; |
case 0x04 : *out=0x000e; *lenght=4; break; |
case 0x05 : *out=0x001e; *lenght=5; break; |
case 0x06 : *out=0x003e; *lenght=6; break; |
case 0x07 : *out=0x007e; *lenght=7; break; |
case 0x08 : *out=0x00fe; *lenght=8; break; |
case 0x09 : *out=0x01fe; *lenght=9; break; |
case 0x0a : *out=0x03fe; *lenght=10; break; |
case 0x0b : *out=0x07fe; *lenght=11; break; |
} |
} |
//=========================================================================== |
void ConvertACMagnitudeC(unsigned char magnitude,unsigned short int *out, unsigned short int *lenght) |
{ |
switch (magnitude) { |
case 0x00 : *lenght=0x02; *out=0x0000; break; //1010 |
case 0x01 : *lenght=0x02; *out=0x0001; break; //00 |
case 0x02 : *lenght=0x03; *out=0x0004; break; //01 |
case 0x03 : *lenght=0x04; *out=0x000a; break; //100 |
case 0x04 : *lenght=0x05; *out=0x0018; break; //1011 |
case 0x05 : *lenght=0x05; *out=0x0019; break; //11010 |
case 0x06 : *lenght=0x06; *out=0x0038; break; //1111000 |
case 0x07 : *lenght=0x07; *out=0x0078; break; //11111000 |
case 0x08 : *lenght=0x09; *out=0x01f4; break; //1111110110 |
case 0x09 : *lenght=0x0a; *out=0x03f6; break; //1111111110000010 |
case 0x0A : *lenght=0x0c; *out=0x0ff4; break; //1111111110000011 |
case 0x11 : *lenght=0x04; *out=0x000b; break; //1100 |
case 0x12 : *lenght=0x06; *out=0x0039; break; //11011 |
case 0x13 : *lenght=0x08; *out=0x00f6; break; //1111001 |
case 0x14 : *lenght=0x09; *out=0x01f5; break; //111110110 |
case 0x15 : *lenght=0x0b; *out=0x07f6; break; //11111110110 |
case 0x16 : *lenght=0x0c; *out=0x0ff5; break; //1111111110000100 |
case 0x17 : *lenght=0x10; *out=0xff88; break; //1111111110000101 |
case 0x18 : *lenght=0x10; *out=0xff89; break; //1111111110000110 |
case 0x19 : *lenght=0x10; *out=0xff8a; break; //1111111110000111 |
case 0x1A : *lenght=0x10; *out=0xff8b; break; //1111111110001000 |
case 0x21 : *lenght=0x05; *out=0x001a; break; //11100 |
case 0x22 : *lenght=0x08; *out=0x00f7; break; //11111001 |
case 0x23 : *lenght=0x0a; *out=0x03f7; break; //1111110111 |
case 0x24 : *lenght=0x0c; *out=0x0ff6; break; //111111110100 |
case 0x25 : *lenght=0x0f; *out=0x7fc2; break; //1111111110001001 |
case 0x26 : *lenght=0x10; *out=0xff8c; break; //1111111110001010 |
case 0x27 : *lenght=0x10; *out=0xff8d; break; //1111111110001011 |
case 0x28 : *lenght=0x10; *out=0xff8e; break; //1111111110001100 |
case 0x29 : *lenght=0x10; *out=0xff8f; break; //1111111110001101 |
case 0x2A : *lenght=0x10; *out=0xff90; break; //1111111110001110 |
case 0x31 : *lenght=0x05; *out=0x001b; break; //111010 |
case 0x32 : *lenght=0x08; *out=0x00f8; break; //111110111 |
case 0x33 : *lenght=0x0a; *out=0x03f8; break; //111111110101 |
case 0x34 : *lenght=0x0c; *out=0x0ff7; break; //1111111110001111 |
case 0x35 : *lenght=0x10; *out=0xff91; break; //1111111110010000 |
case 0x36 : *lenght=0x10; *out=0xff92; break; //1111111110010001 |
case 0x37 : *lenght=0x10; *out=0xff93; break; //1111111110010010 |
case 0x38 : *lenght=0x10; *out=0xff94; break; //1111111110010011 |
case 0x39 : *lenght=0x10; *out=0xff95; break; //1111111110010100 |
case 0x3A : *lenght=0x10; *out=0xff96; break; //1111111110010101 |
case 0x41 : *lenght=0x06; *out=0x003a; break; //111011 |
case 0x42 : *lenght=0x09; *out=0x01f6; break; //1111111000 |
case 0x43 : *lenght=0x10; *out=0xff97; break; //1111111110010110 |
case 0x44 : *lenght=0x10; *out=0xff98; break; //1111111110010111 |
case 0x45 : *lenght=0x10; *out=0xff99; break; //1111111110011000 |
case 0x46 : *lenght=0x10; *out=0xff9a; break; //1111111110011001 |
case 0x47 : *lenght=0x10; *out=0xff9b; break; //1111111110011010 |
case 0x48 : *lenght=0x10; *out=0xff9c; break; //1111111110011011 |
case 0x49 : *lenght=0x10; *out=0xff9d; break; //1111111110011100 |
case 0x4A : *lenght=0x10; *out=0xff9e; break; //1111111110011101 |
case 0x51 : *lenght=0x06; *out=0x003b; break; //1111010 |
case 0x52 : *lenght=0x0a; *out=0x03f9; break; //11111110111 |
case 0x53 : *lenght=0x10; *out=0xff9f; break; //1111111110011110 |
case 0x54 : *lenght=0x10; *out=0xffa0; break; //1111111110011111 |
case 0x55 : *lenght=0x10; *out=0xffa1; break; //1111111110100000 |
case 0x56 : *lenght=0x10; *out=0xFFA2; break; //1111111110100001 |
case 0x57 : *lenght=0x10; *out=0xFFA3; break; //1111111110100010 |
case 0x58 : *lenght=0x10; *out=0xFFA4; break; //1111111110100011 |
case 0x59 : *lenght=0x10; *out=0xFFA5; break; //1111111110100100 |
case 0x5A : *lenght=0x10; *out=0xFFA6; break; //1111111110100101 |
case 0x61 : *lenght=0x07; *out=0x0079; break; //1111011 |
case 0x62 : *lenght=0x0b; *out=0x07f7; break; //111111110110 |
case 0x63 : *lenght=0x10; *out=0xffa7; break; //1111111110100110 |
case 0x64 : *lenght=0x10; *out=0xffa8; break; //1111111110100111 |
case 0x65 : *lenght=0x10; *out=0xffa9; break; //1111111110101000 |
case 0x66 : *lenght=0x10; *out=0xffaa; break; //1111111110101001 |
case 0x67 : *lenght=0x10; *out=0xffab; break; //1111111110101010 |
case 0x68 : *lenght=0x10; *out=0xFFAc; break; //1111111110101011 |
case 0x69 : *lenght=0x10; *out=0xFFAf; break; //1111111110101100 |
case 0x6A : *lenght=0x10; *out=0xFFAe; break; //1111111110101101 |
case 0x71 : *lenght=0x07; *out=0x007a; break; //11111010 |
case 0x72 : *lenght=0x0b; *out=0x07f8; break; //111111110111 |
case 0x73 : *lenght=0x10; *out=0xffaf; break; //1111111110101110 |
case 0x74 : *lenght=0x10; *out=0xffb0; break; //1111111110101111 |
case 0x75 : *lenght=0x10; *out=0xFFB1; break; //1111111110110000 |
case 0x76 : *lenght=0x10; *out=0xFFB2; break; //111111110110001 |
case 0x77 : *lenght=0x10; *out=0xFFB3; break; //111111110110010 |
case 0x78 : *lenght=0x10; *out=0xFFB4; break; //111111110110011 |
case 0x79 : *lenght=0x10; *out=0xFFB5; break; //1111111110110100 |
case 0x7A : *lenght=0x10; *out=0xFFB6; break; //1111111110110101 |
case 0x81 : *lenght=0x08; *out=0x00f9; break; //111111000 |
case 0x82 : *lenght=0x10; *out=0xffb7; break; //111111111000000 |
case 0x83 : *lenght=0x10; *out=0xFFB8; break; //1111111110110110 |
case 0x84 : *lenght=0x10; *out=0xFFB9; break; //1111111110110111 |
case 0x85 : *lenght=0x10; *out=0xFFBa; break; //1111111110111000 |
case 0x86 : *lenght=0x10; *out=0xFFBb; break; //1111111110111001 |
case 0x87 : *lenght=0x10; *out=0xFFBc; break; //1111111110111010 |
case 0x88 : *lenght=0x10; *out=0xFFBd; break; //1111111110111011 |
case 0x89 : *lenght=0x10; *out=0xFFBe; break; //1111111110111100 |
case 0x8A : *lenght=0x10; *out=0xFFBf; break; //1111111110111101 |
case 0x91 : *lenght=0x09; *out=0x01f7; break; //111111001 |
case 0x92 : *lenght=0x10; *out=0xffc0; break; //1111111110111110 |
case 0x93 : *lenght=0x10; *out=0xffc1; break; //1111111110111111 |
case 0x94 : *lenght=0x10; *out=0xFFC2; break; //1111111111000000 |
case 0x95 : *lenght=0x10; *out=0xFFC3; break; //1111111111000001 |
case 0x96 : *lenght=0x10; *out=0xFFC4; break; //1111111111000010 |
case 0x97 : *lenght=0x10; *out=0xFFC5; break; //1111111111000011 |
case 0x98 : *lenght=0x10; *out=0xFFC6; break; //1111111111000100 |
case 0x99 : *lenght=0x10; *out=0xFFC7; break; //1111111111000101 |
case 0x9A : *lenght=0x10; *out=0xFFC8; break; //1111111111000110 |
case 0xA1 : *lenght=0x09; *out=0x01f8; break; //111111010 |
case 0xA2 : *lenght=0x10; *out=0xffc9; break; //1111111111000111 |
case 0xA3 : *lenght=0x10; *out=0xFFCa; break; //1111111111001000 |
case 0xA4 : *lenght=0x10; *out=0xFFCb; break; //1111111111001001 |
case 0xA5 : *lenght=0x10; *out=0xFFCc; break; //1111111111001010 |
case 0xA6 : *lenght=0x10; *out=0xFFCd; break; //1111111111001011 |
case 0xA7 : *lenght=0x10; *out=0xFFCe; break; //1111111111001100 |
case 0xA8 : *lenght=0x10; *out=0xFFCf; break; //1111111111001101 |
case 0xA9 : *lenght=0x10; *out=0xFFd0; break; //1111111111001110 |
case 0xAA : *lenght=0x10; *out=0xFFd1; break; //1111111111001111 |
case 0xB1 : *lenght=0x09; *out=0x01f9; break; //1111111001 |
case 0xB2 : *lenght=0x10; *out=0xFFD2; break; //1111111111010000 |
case 0xB3 : *lenght=0x10; *out=0xFFD3; break; //1111111111010001 |
case 0xB4 : *lenght=0x10; *out=0xFFD4; break; //1111111111010010 |
case 0xB5 : *lenght=0x10; *out=0xFFD5; break; //1111111111010011 |
case 0xB6 : *lenght=0x10; *out=0xFFD6; break; //1111111111010100 |
case 0xB7 : *lenght=0x10; *out=0xFFD7; break; //1111111111010101 |
case 0xB8 : *lenght=0x10; *out=0xFFD8; break; //1111111111010110 |
case 0xB9 : *lenght=0x10; *out=0xFFD9; break; //1111111111010111 |
case 0xBA : *lenght=0x10; *out=0xFFDa; break; //1111111111011000 |
case 0xC1 : *lenght=0x09; *out=0x01fa; break; //1111111010 |
case 0xC2 : *lenght=0x10; *out=0xFFDb; break; //1111111111011001 |
case 0xC3 : *lenght=0x10; *out=0xFFDc; break; //1111111111011010 |
case 0xC4 : *lenght=0x10; *out=0xFFDd; break; //1111111111011011 |
case 0xC5 : *lenght=0x10; *out=0xFFDe; break; //1111111111011100 |
case 0xC6 : *lenght=0x10; *out=0xFFDf; break; //1111111111011101 |
case 0xC7 : *lenght=0x10; *out=0xFFe0; break; //1111111111011110 |
case 0xC8 : *lenght=0x10; *out=0xFFe1; break; //1111111111011111 |
case 0xC9 : *lenght=0x10; *out=0xFFe2; break; //1111111111100000 |
case 0xCA : *lenght=0x10; *out=0xFFe3; break; //1111111111100001 |
case 0xD1 : *lenght=0x0b; *out=0x07f9; break; //11111111000 |
case 0xD2 : *lenght=0x10; *out=0xFFE4; break; //1111111111100010 |
case 0xD3 : *lenght=0x10; *out=0xFFE5; break; //1111111111100011 |
case 0xD4 : *lenght=0x10; *out=0xFFE6; break; //1111111111100100 |
case 0xD5 : *lenght=0x10; *out=0xFFE7; break; //1111111111100101 |
case 0xD6 : *lenght=0x10; *out=0xFFE8; break; //1111111111100110 |
case 0xD7 : *lenght=0x10; *out=0xFFE9; break; //1111111111100111 |
case 0xD8 : *lenght=0x10; *out=0xFFEa; break; //1111111111101000 |
case 0xD9 : *lenght=0x10; *out=0xFFEb; break; //1111111111101001 |
case 0xDA : *lenght=0x10; *out=0xFFEc; break; //1111111111101010 |
case 0xE1 : *lenght=0x0e; *out=0x3fe0; break; //1111111111101011 |
case 0xE2 : *lenght=0x10; *out=0xffed; break; //1111111111101100 |
case 0xE3 : *lenght=0x10; *out=0xFFEe; break; //1111111111101101 |
case 0xE4 : *lenght=0x10; *out=0xFFEf; break; //1111111111101110 |
case 0xE5 : *lenght=0x10; *out=0xFFf0; break; //1111111111101111 |
case 0xE6 : *lenght=0x10; *out=0xFFF1; break; //1111111111110000 |
case 0xE7 : *lenght=0x10; *out=0xFFF2; break; //1111111111110001 |
case 0xE8 : *lenght=0x10; *out=0xFFF3; break; //1111111111110010 |
case 0xE9 : *lenght=0x10; *out=0xFFF4; break; //1111111111110011 |
case 0xEA : *lenght=0x10; *out=0xFFF5; break; //1111111111110100 |
case 0xF0 : *lenght=0x0a; *out=0x03fa; break; //11111111001 |
case 0xF1 : *lenght=0x0f; *out=0x7fc3; break; //1111111111110101 |
case 0xF2 : *lenght=0x10; *out=0xFFF6; break; //1111111111110110 |
case 0xF3 : *lenght=0x10; *out=0xFFF7; break; //1111111111110111 |
case 0xF4 : *lenght=0x10; *out=0xFFF8; break; //1111111111111000 |
case 0xF5 : *lenght=0x10; *out=0xFFF9; break; //1111111111111001 |
case 0xF6 : *lenght=0x10; *out=0xFFFA; break; //1111111111111010 |
case 0xF7 : *lenght=0x10; *out=0xFFFB; break; //1111111111111011 |
case 0xF8 : *lenght=0x10; *out=0xFFFC; break; //1111111111111100 |
case 0xF9 : *lenght=0x10; *out=0xFFFD; break; //1111111111111101 |
case 0xFA : *lenght=0x10; *out=0xFFFE; break; //1111111111111110 |
#ifndef __MICROBLAZE |
default : printf("WAARDE STAAT NIET IN TABEL!!!!!!!!!!!!!!!!!!!!\n");break; |
#endif |
} |
// printf("magnitude= %x out= %x lenght= %d \n",magnitude,*out,*lenght); |
return; |
} |
//=========================================================================== |
void ConvertDCMagnitudeY(unsigned char magnitude,unsigned short int *out, unsigned short int *lenght) |
{ |
switch (magnitude) { |
case 0x00 : *out=0x0000; *lenght=2; break; |
case 0x01 : *out=0x0002; *lenght=3; break; |
case 0x02 : *out=0x0003; *lenght=3; break; |
case 0x03 : *out=0x0004; *lenght=3; break; |
case 0x04 : *out=0x0005; *lenght=3; break; |
case 0x05 : *out=0x0006; *lenght=3; break; |
case 0x06 : *out=0x000e; *lenght=4; break; |
case 0x07 : *out=0x001e; *lenght=5; break; |
case 0x08 : *out=0x003e; *lenght=6; break; |
case 0x09 : *out=0x007e; *lenght=7; break; |
case 0x0a : *out=0x00fe; *lenght=8; break; |
case 0x0b : *out=0x01fe; *lenght=9; break; |
} |
} |
//=========================================================================== |
void ConvertACMagnitudeY(unsigned char magnitude,unsigned short int *out, unsigned short int *lenght) |
{ |
switch (magnitude) { |
case 0x00 : *lenght=4; *out=0xFFFA; break; //1010 |
case 0x01 : *lenght=2; *out=0xFFF0; break; //00 |
case 0x02 : *lenght=2; *out=0xFFF1; break; //01 |
case 0x03 : *lenght=3; *out=0xFFF4; break; //100 |
case 0x04 : *lenght=4; *out=0xFFFB; break; //1011 |
case 0x05 : *lenght=5; *out=0xFFFA; break; //11010 |
case 0x06 : *lenght=7; *out=0xFFF8; break; //1111000 |
case 0x07 : *lenght=8; *out=0xFFF8; break; //11111000 |
case 0x08 : *lenght=10; *out=0xFFF6; break; //1111110110 |
case 0x09 : *lenght=16; *out=0xFF82; break; //1111111110000010 |
case 0x0A : *lenght=16; *out=0xFF83; break; //1111111110000011 |
case 0x11 : *lenght=4; *out=0xFFFC; break; //1100 |
case 0x12 : *lenght=5; *out=0xFFFB; break; //11011 |
case 0x13 : *lenght=7; *out=0xFFF9; break; //1111001 |
case 0x14 : *lenght=9; *out=0xFFF6; break; //111110110 |
case 0x15 : *lenght=11; *out=0xFFF6; break; //11111110110 |
case 0x16 : *lenght=16; *out=0xFF84; break; //1111111110000100 |
case 0x17 : *lenght=16; *out=0xFF85; break; //1111111110000101 |
case 0x18 : *lenght=16; *out=0xFF86; break; //1111111110000110 |
case 0x19 : *lenght=16; *out=0xFF87; break; //1111111110000111 |
case 0x1A : *lenght=16; *out=0xFF88; break; //1111111110001000 |
case 0x21 : *lenght=5; *out=0xFFFC; break; //11100 |
case 0x22 : *lenght=8; *out=0xFFF9; break; //11111001 |
case 0x23 : *lenght=10; *out=0xFFF7; break; //1111110111 |
case 0x24 : *lenght=12; *out=0xFFF4; break; //111111110100 |
case 0x25 : *lenght=16; *out=0xFF89; break; //1111111110001001 |
case 0x26 : *lenght=16; *out=0xFF8A; break; //1111111110001010 |
case 0x27 : *lenght=16; *out=0xFF8B; break; //1111111110001011 |
case 0x28 : *lenght=16; *out=0xFF8C; break; //1111111110001100 |
case 0x29 : *lenght=16; *out=0xFF8D; break; //1111111110001101 |
case 0x2A : *lenght=16; *out=0xFF8E; break; //1111111110001110 |
case 0x31 : *lenght=6; *out=0xFFFA; break; //111010 |
case 0x32 : *lenght=9; *out=0xFFF7; break; //111110111 |
case 0x33 : *lenght=12; *out=0xFFF5; break; //111111110101 |
case 0x34 : *lenght=16; *out=0xFF8F; break; //1111111110001111 |
case 0x35 : *lenght=16; *out=0xFF90; break; //1111111110010000 |
case 0x36 : *lenght=16; *out=0xFF91; break; //1111111110010001 |
case 0x37 : *lenght=16; *out=0xFF92; break; //1111111110010010 |
case 0x38 : *lenght=16; *out=0xFF93; break; //1111111110010011 |
case 0x39 : *lenght=16; *out=0xFF94; break; //1111111110010100 |
case 0x3A : *lenght=16; *out=0xFF95; break; //1111111110010101 |
case 0x41 : *lenght=6; *out=0xFFFB; break; //111011 |
case 0x42 : *lenght=10; *out=0xFFF8; break; //1111111000 |
case 0x43 : *lenght=16; *out=0xFF96; break; //1111111110010110 |
case 0x44 : *lenght=16; *out=0xFF97; break; //1111111110010111 |
case 0x45 : *lenght=16; *out=0xFF98; break; //1111111110011000 |
case 0x46 : *lenght=16; *out=0xFF99; break; //1111111110011001 |
case 0x47 : *lenght=16; *out=0xFF9A; break; //1111111110011010 |
case 0x48 : *lenght=16; *out=0xFF9B; break; //1111111110011011 |
case 0x49 : *lenght=16; *out=0xFF9C; break; //1111111110011100 |
case 0x4A : *lenght=16; *out=0xFF9D; break; //1111111110011101 |
case 0x51 : *lenght=7; *out=0xFFFA; break; //1111010 |
case 0x52 : *lenght=11; *out=0xFFF7; break; //11111110111 |
case 0x53 : *lenght=16; *out=0xFF9E; break; //1111111110011110 |
case 0x54 : *lenght=16; *out=0xFF9F; break; //1111111110011111 |
case 0x55 : *lenght=16; *out=0xFFA0; break; //1111111110100000 |
case 0x56 : *lenght=16; *out=0xFFA1; break; //1111111110100001 |
case 0x57 : *lenght=16; *out=0xFFA2; break; //1111111110100010 |
case 0x58 : *lenght=16; *out=0xFFA3; break; //1111111110100011 |
case 0x59 : *lenght=16; *out=0xFFA4; break; //1111111110100100 |
case 0x5A : *lenght=16; *out=0xFFA5; break; //1111111110100101 |
case 0x61 : *lenght=7; *out=0xFFFB; break; //1111011 |
case 0x62 : *lenght=12; *out=0xFFF6; break; //111111110110 |
case 0x63 : *lenght=16; *out=0xFFA6; break; //1111111110100110 |
case 0x64 : *lenght=16; *out=0xFFA7; break; //1111111110100111 |
case 0x65 : *lenght=16; *out=0xFFA8; break; //1111111110101000 |
case 0x66 : *lenght=16; *out=0xFFA9; break; //1111111110101001 |
case 0x67 : *lenght=16; *out=0xFFAA; break; //1111111110101010 |
case 0x68 : *lenght=16; *out=0xFFAB; break; //1111111110101011 |
case 0x69 : *lenght=16; *out=0xFFAC; break; //1111111110101100 |
case 0x6A : *lenght=16; *out=0xFFAD; break; //1111111110101101 |
case 0x71 : *lenght=8; *out=0xFFFA; break; //11111010 |
case 0x72 : *lenght=12; *out=0xFFF7; break; //111111110111 |
case 0x73 : *lenght=16; *out=0xFFAE; break; //1111111110101110 |
case 0x74 : *lenght=16; *out=0xFFAF; break; //1111111110101111 |
case 0x75 : *lenght=16; *out=0xFFB0; break; //1111111110110000 |
case 0x76 : *lenght=16; *out=0xFFB1; break; //111111110110001 |
case 0x77 : *lenght=16; *out=0xFFB2; break; //111111110110010 |
case 0x78 : *lenght=16; *out=0xFFB3; break; //111111110110011 |
case 0x79 : *lenght=16; *out=0xFFB4; break; //1111111110110100 |
case 0x7A : *lenght=16; *out=0xFFB5; break; //1111111110110101 |
case 0x81 : *lenght=9; *out=0xFFF8; break; //111111000 |
case 0x82 : *lenght=15; *out=0xFFC0; break; //111111111000000 |
case 0x83 : *lenght=16; *out=0xFFB6; break; //1111111110110110 |
case 0x84 : *lenght=16; *out=0xFFB7; break; //1111111110110111 |
case 0x85 : *lenght=16; *out=0xFFB8; break; //1111111110111000 |
case 0x86 : *lenght=16; *out=0xFFB9; break; //1111111110111001 |
case 0x87 : *lenght=16; *out=0xFFBA; break; //1111111110111010 |
case 0x88 : *lenght=16; *out=0xFFBB; break; //1111111110111011 |
case 0x89 : *lenght=16; *out=0xFFBC; break; //1111111110111100 |
case 0x8A : *lenght=16; *out=0xFFBD; break; //1111111110111101 |
case 0x91 : *lenght=9; *out=0xFFF9; break; //111111001 |
case 0x92 : *lenght=16; *out=0xFFBE; break; //1111111110111110 |
case 0x93 : *lenght=16; *out=0xFFBF; break; //1111111110111111 |
case 0x94 : *lenght=16; *out=0xFFC0; break; //1111111111000000 |
case 0x95 : *lenght=16; *out=0xFFC1; break; //1111111111000001 |
case 0x96 : *lenght=16; *out=0xFFC2; break; //1111111111000010 |
case 0x97 : *lenght=16; *out=0xFFC3; break; //1111111111000011 |
case 0x98 : *lenght=16; *out=0xFFC4; break; //1111111111000100 |
case 0x99 : *lenght=16; *out=0xFFC5; break; //1111111111000101 |
case 0x9A : *lenght=16; *out=0xFFC6; break; //1111111111000110 |
case 0xA1 : *lenght=9; *out=0xFFFA; break; //111111010 |
case 0xA2 : *lenght=16; *out=0xFFC7; break; //1111111111000111 |
case 0xA3 : *lenght=16; *out=0xFFC8; break; //1111111111001000 |
case 0xA4 : *lenght=16; *out=0xFFC9; break; //1111111111001001 |
case 0xA5 : *lenght=16; *out=0xFFCA; break; //1111111111001010 |
case 0xA6 : *lenght=16; *out=0xFFCB; break; //1111111111001011 |
case 0xA7 : *lenght=16; *out=0xFFCC; break; //1111111111001100 |
case 0xA8 : *lenght=16; *out=0xFFCD; break; //1111111111001101 |
case 0xA9 : *lenght=16; *out=0xFFCE; break; //1111111111001110 |
case 0xAA : *lenght=16; *out=0xFFCF; break; //1111111111001111 |
case 0xB1 : *lenght=10; *out=0xFFF9; break; //1111111001 |
case 0xB2 : *lenght=16; *out=0xFFD0; break; //1111111111010000 |
case 0xB3 : *lenght=16; *out=0xFFD1; break; //1111111111010001 |
case 0xB4 : *lenght=16; *out=0xFFD2; break; //1111111111010010 |
case 0xB5 : *lenght=16; *out=0xFFD3; break; //1111111111010011 |
case 0xB6 : *lenght=16; *out=0xFFD4; break; //1111111111010100 |
case 0xB7 : *lenght=16; *out=0xFFD5; break; //1111111111010101 |
case 0xB8 : *lenght=16; *out=0xFFD6; break; //1111111111010110 |
case 0xB9 : *lenght=16; *out=0xFFD7; break; //1111111111010111 |
case 0xBA : *lenght=16; *out=0xFFD8; break; //1111111111011000 |
case 0xC1 : *lenght=10; *out=0xFFFA; break; //1111111010 |
case 0xC2 : *lenght=16; *out=0xFFD9; break; //1111111111011001 |
case 0xC3 : *lenght=16; *out=0xFFDA; break; //1111111111011010 |
case 0xC4 : *lenght=16; *out=0xFFDB; break; //1111111111011011 |
case 0xC5 : *lenght=16; *out=0xFFDC; break; //1111111111011100 |
case 0xC6 : *lenght=16; *out=0xFFDD; break; //1111111111011101 |
case 0xC7 : *lenght=16; *out=0xFFDE; break; //1111111111011110 |
case 0xC8 : *lenght=16; *out=0xFFDF; break; //1111111111011111 |
case 0xC9 : *lenght=16; *out=0xFFE0; break; //1111111111100000 |
case 0xCA : *lenght=16; *out=0xFFE1; break; //1111111111100001 |
case 0xD1 : *lenght=11; *out=0xFFF8; break; //11111111000 |
case 0xD2 : *lenght=16; *out=0xFFE2; break; //1111111111100010 |
case 0xD3 : *lenght=16; *out=0xFFE3; break; //1111111111100011 |
case 0xD4 : *lenght=16; *out=0xFFE4; break; //1111111111100100 |
case 0xD5 : *lenght=16; *out=0xFFE5; break; //1111111111100101 |
case 0xD6 : *lenght=16; *out=0xFFE6; break; //1111111111100110 |
case 0xD7 : *lenght=16; *out=0xFFE7; break; //1111111111100111 |
case 0xD8 : *lenght=16; *out=0xFFE8; break; //1111111111101000 |
case 0xD9 : *lenght=16; *out=0xFFE9; break; //1111111111101001 |
case 0xDA : *lenght=16; *out=0xFFEA; break; //1111111111101010 |
case 0xE1 : *lenght=16; *out=0xFFEB; break; //1111111111101011 |
case 0xE2 : *lenght=16; *out=0xFFEC; break; //1111111111101100 |
case 0xE3 : *lenght=16; *out=0xFFED; break; //1111111111101101 |
case 0xE4 : *lenght=16; *out=0xFFEE; break; //1111111111101110 |
case 0xE5 : *lenght=16; *out=0xFFEF; break; //1111111111101111 |
case 0xE6 : *lenght=16; *out=0xFFF0; break; //1111111111110000 |
case 0xE7 : *lenght=16; *out=0xFFF1; break; //1111111111110001 |
case 0xE8 : *lenght=16; *out=0xFFF2; break; //1111111111110010 |
case 0xE9 : *lenght=16; *out=0xFFF3; break; //1111111111110011 |
case 0xEA : *lenght=16; *out=0xFFF4; break; //1111111111110100 |
case 0xF0 : *lenght=11; *out=0xFFF9; break; //11111111001 |
case 0xF1 : *lenght=16; *out=0xFFF5; break; //1111111111110101 |
case 0xF2 : *lenght=16; *out=0xFFF6; break; //1111111111110110 |
case 0xF3 : *lenght=16; *out=0xFFF7; break; //1111111111110111 |
case 0xF4 : *lenght=16; *out=0xFFF8; break; //1111111111111000 |
case 0xF5 : *lenght=16; *out=0xFFF9; break; //1111111111111001 |
case 0xF6 : *lenght=16; *out=0xFFFA; break; //1111111111111010 |
case 0xF7 : *lenght=16; *out=0xFFFB; break; //1111111111111011 |
case 0xF8 : *lenght=16; *out=0xFFFC; break; //1111111111111100 |
case 0xF9 : *lenght=16; *out=0xFFFD; break; //1111111111111101 |
case 0xFA : *lenght=16; *out=0xFFFE; break; //1111111111111110 |
#ifndef __MICROBLAZE |
default : printf("WAARDE STAAT NIET IN TABEL!!!!!!!!!!!!!!!!!!!!\n");break; |
#endif |
} |
// printf("magnitude= %x out= %x lenght= %d \n",magnitude,*out,*lenght); |
return; |
} |
//=========================================================================== |
char Extend (char additional, unsigned char magnitude) |
{ |
int vt= 1 << (magnitude-1); |
if ( additional < vt ) return (additional + (-1 << magnitude) + 1); |
else return additional; |
} |
//=========================================================================== |
void ReverseExtend (char value, unsigned char *magnitude, unsigned char *bits) |
{ |
// printf("reverseextend value= %d\n",*magnitude); |
if (value >=0) |
{ |
*bits=value; |
} |
else |
{ |
value=-value; |
*bits=~value; |
} |
*magnitude=0; |
while (value !=0) |
{ |
value>>=1; |
++*magnitude; |
} |
// printf("reverseextend magnitude= %d bits= %d",magnitude,bits); |
return; |
} |
|
static int __count3=0; |
|
//=========================================================================== |
void WriteRawBits16(unsigned char amount_bits, unsigned int bits, unsigned int *remaining,unsigned char *amount_remaining, FILE* file) //*remaining needs bo be more than 8 bits because 8 bits could be added and ther ecould already be up ot 7 bits in *remaining |
// this function collects bits to send |
// if there less than 16 bits collected, nothing is send and these bits are stored in *remaining. In *amount_remaining there is stated how much bits are stored in *remaining |
// if more than 16 bits are collected, 16 bits are send and the remaining bits are stored again |
{ |
unsigned short int send; |
unsigned int mask; |
unsigned char send2; |
int count; |
|
#ifdef __MICROBLAZE |
if (__count3<16) { |
xil_printf("%x %x, ", amount_bits, bits); |
__count3++; |
if ((__count3&0x07)==0) xil_printf("\r\n"); |
} |
#else |
if (__count3<16) { |
printf(" %x %x, ", amount_bits, bits); |
__count3++; |
if ((__count3&0x07)==0) printf("\r\n"); |
} |
#endif |
|
|
mask=0x00; //init mask |
*remaining=(*remaining<<amount_bits); //shift to make place for the new bits |
for (count=amount_bits; count>0; count--) mask=(mask<<1)|0x01; //create mask for adding bit |
*remaining=*remaining | (bits&mask); //add bits |
*amount_remaining=*amount_remaining + amount_bits; //change *amount_remaining to the correct new value |
if (*amount_remaining >= 16) //are there more than 16 bits in buffer, send 16 bits |
{ |
|
#ifndef __MICROBLAZE |
if (*amount_remaining >= 32 ) printf("ERROR, more bits to send %d",*amount_remaining); |
#endif |
|
send=*remaining>>(*amount_remaining-16); //this value can be send/stored (in art this can be dony by selecting bits) |
send2=(send & 0xFF00) >>8; |
#ifdef __MICROBLAZE |
sysace_fwrite(&send2,1,1,file); |
#else |
fwrite(&send2,1,1,file); |
#endif |
if (send2==0xFF) |
{ |
send2=0x00; |
#ifdef __MICROBLAZE |
sysace_fwrite(&send2,1,1,file); |
#else |
fwrite(&send2,1,1,file); |
#endif |
} |
send2=send & 0xFF; |
#ifdef __MICROBLAZE |
sysace_fwrite(&send2,1,1,file); |
#else |
fwrite(&send2,1,1,file); |
#endif |
if (send2==0xFF) |
{ |
send2=0x00; |
#ifdef __MICROBLAZE |
sysace_fwrite(&send2,1,1,file); |
#else |
fwrite(&send2,1,1,file); |
#endif |
} |
*amount_remaining=*amount_remaining-16; //descrease by 16 because these are send |
} |
return; |
} |
//=========================================================================== |
void HuffmanEncodeFinishSend(unsigned int *remaining,unsigned char *amount_remaining, FILE* file) |
// There are still some bits left to send at the end of the 8x8 matrix (or maybe the file), |
// the remaining bits are filled up with ones and send |
// possible fault: -must it be filled up with ones? |
{ |
unsigned short int send; |
unsigned int mask; |
int count; |
mask=0x00; //init mask |
if (*amount_remaining >= 8) // //2 bytes to send, send first byte |
{ |
send=*remaining>>(*amount_remaining-8); //shift so that first byte is ready to send |
#ifdef __MICROBLAZE |
sysace_fwrite(&send,1,1,file); |
#else |
fwrite(&send,1,1,file); |
#endif |
if (send==0xFF) //is this still needed???? |
{ |
send=0x00; |
#ifdef __MICROBLAZE |
sysace_fwrite(&send,1,1,file); |
#else |
fwrite(&send,1,1,file); |
#endif |
} |
*amount_remaining=*amount_remaining -8; // lower the value to the amount of bits that still needs to be send |
} |
if (*amount_remaining >= 0) //there is a last byte to send |
{ |
send=*remaining<<(8-*amount_remaining); //shift the last bits to send to the front of the byte |
mask=0x00; //init mask |
for (count=(8-*amount_remaining); count>0; count--) mask=(mask<<1)|0x01; //create mask to fill byte up with ones |
send=send | mask; //add the ones to the byte |
#ifdef __MICROBLAZE |
sysace_fwrite(&send,1,1,file); |
#else |
fwrite(&send,1,1,file); |
#endif |
*amount_remaining=0x00; //is this needed? |
} |
return; |
} |
//=========================================================================== |
void HuffmanEncodeUsingDCTable(unsigned char magnitude,unsigned int *remaining,unsigned char *amount_remaining, FILE* file) |
// Translate magnitude into needed data (from table) and send it |
{ |
unsigned char send; |
unsigned short int huffmancode, huffmanlengt; |
ConvertDCMagnitudeY(magnitude, &huffmancode, &huffmanlengt); |
WriteRawBits16(huffmanlengt,huffmancode,remaining,amount_remaining, file); |
//printf("Write DC magnitude= %2x \n",magnitude); |
//WriteRawBits16(0x08,magnitude,remaining,amount_remaining, file); |
return; |
} |
//=========================================================================== |
void HuffmanEncodeUsingACTable(unsigned char mag,unsigned int *remaining,unsigned char *amount_remaining, FILE* file) |
// Translate magnitude into needed data (from table) and send it |
{ |
unsigned char send; |
unsigned short int huffmancode, huffmanlengt; |
ConvertACMagnitudeY(mag, &huffmancode, &huffmanlengt); |
WriteRawBits16(huffmanlengt,huffmancode,remaining,amount_remaining, file); |
return; |
} |
//=========================================================================== |
char EncodeDataUnit(char dataunit[64], char last_dc_value, FILE* file, unsigned int *remaining, unsigned char *amount_remaining, unsigned int color) |
{ |
char difference; |
unsigned char magnitude,zerorun,ii,ert; |
unsigned int bits; |
unsigned char bits_char; |
//init |
// PrintMatrix(dataunit) ; |
difference = dataunit[0] - last_dc_value; |
last_dc_value=dataunit[0]; |
ReverseExtend(difference, &magnitude,&bits_char); |
bits=bits_char; |
HuffmanEncodeUsingDCTable(magnitude,remaining,amount_remaining, file); |
WriteRawBits16(magnitude,bits,remaining,amount_remaining, file); |
zerorun=0; |
ii=1; |
while ( ii < 64 ) |
{ |
if (dataunit[ii] != 0 ) |
{ |
while ( zerorun >= 16 ) |
{ |
HuffmanEncodeUsingACTable(0xF0,remaining,amount_remaining,file); |
zerorun=zerorun-16; |
// printf("16 zeros: %d\n",zerorun); |
} |
ReverseExtend(dataunit[ii],&magnitude,&bits_char); |
bits=bits_char; |
ert= ((int)zerorun *16); //ERROR !!!!!!!!!!! |
ert=ert + magnitude; |
HuffmanEncodeUsingACTable(ert,remaining,amount_remaining,file); |
WriteRawBits16(magnitude,bits,remaining,amount_remaining, file); |
zerorun=0; |
} |
else zerorun=zerorun+1; |
ii++; |
} |
if ( zerorun != 0 ) |
{ |
HuffmanEncodeUsingACTable(0x00,remaining,amount_remaining,file); |
// printf("NUL DE REST IS NUL\n"); |
} |
// HuffmanEncodeFinishSend(remaining,amount_remaining,file); |
return last_dc_value; |
} |
|
#if 0 |
//=========================================================================== |
void DecodeDataUnit(char *coefficients[64], char last_dc_value, char value) |
{ |
char ii; |
char lowbits,highbits,extrabits; |
//decode DC |
|
|
//decode AC |
//set coefficients to 0 |
for (ii=0;ii<64;ii++) *coefficients[ii]=0x00; //for the next optimu\ization step: don't write 0 before beginning, these value are overwritten. Only write 0 is you know tha value is 0, now you only write each value once, not twice is the value ain't 0. |
while (ii<64) |
{ |
// value= DecodeUsingACTable(); |
lowbits = value && 0x0F; |
highbits = (value && 0xF0 ) >>4; |
|
if (lowbits != 0x00) |
{ |
// extrabits = ReadRawBits(lowbits); |
ii=ii+highbits; |
*coefficients[ii]=Extend(extrabits,lowbits); |
ii++; |
} |
else |
{ |
if (highbits==0xF) ii=ii+16; //run of 16 zeros |
else if (highbits == 0x0) ii=64; //the rest are zeros |
} |
} |
} |
//=========================================================================== |
#endif |
|
|
/trunk/encoder/main.c
0,0 → 1,305
#ifdef __MICROBLAZE |
|
#include <stdio.h> |
#include <stdlib.h> |
|
#include "xup2pro.h" |
|
#include "zzq.h" |
#include "io.h" |
#include "huffman.h" |
#include "dct.h" |
|
char* bmpimage; |
int bmpsize; |
|
INFOHEADER _bmpheader; |
|
static signed char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE*3],YMatrix[MATRIX_SIZE][MATRIX_SIZE],CrMatrix[MATRIX_SIZE][MATRIX_SIZE],CbMatrix[MATRIX_SIZE][MATRIX_SIZE]; |
static signed short temp[MATRIX_SIZE][MATRIX_SIZE], dctresult[MATRIX_SIZE][MATRIX_SIZE]; |
static signed char output[MATRIX_SIZE][MATRIX_SIZE]; |
static signed char bitstream[NUMBER_OF_PIXELS] ; |
static unsigned char header[389]; |
|
int ejpgl_error(int errno, void* remark); |
|
int main() |
{ |
SYSACE_FILE *infile; |
SYSACE_FILE *outfile; |
SYSACE_FILE* outfile2; |
|
int i; |
INFOHEADER *bmpheader; |
JPEGHEADER *jpegheader; |
unsigned int col, cols, row, rows, remaining,component; |
unsigned char amount_remaining, Ydcvalue, Cbdcvalue, Crdcvalue ; |
int encode, compression; |
|
encode = 1; |
compression = 0; |
|
bmpimage=(unsigned char*)0x70000000; |
bmpsize=0; |
|
xil_printf("\r\nBMP2JPG Code Compiled at %s %s\r\n", __DATE__, __TIME__); |
|
bmpheader=&_bmpheader; |
|
if ((infile = sysace_fopen("image01.bmp", "r")) == NULL) { |
ejpgl_error(eOPENINPUT_FILE, 0); |
} |
|
bmpsize = sysace_fread(bmpimage, 1, 65536, infile); |
xil_printf("bmpsize %d\r\n", bmpsize); |
if (bmpsize==65536) { |
ejpgl_error(eLARGE_INPUTFILE, 0); |
} |
|
if ((outfile2 = sysace_fopen("image01b.bmp", "w")) == NULL) { |
ejpgl_error(eOPENOUTPUT_FILE, 0); |
} |
sysace_fwrite(bmpimage, 1, bmpsize, outfile2); |
sysace_fclose(outfile2); |
|
if (getbmpheader(infile,bmpheader) == 0) { //File is a valid BMP |
ejpgl_error(eINVALID_BMP, 0); |
} |
|
xil_printf("Image width: %d pixels\r\n", bmpheader->width); |
xil_printf("Image height: %d pixels\r\n", bmpheader->height); |
|
rows = bmpheader->height>>3; |
cols = bmpheader->width>>3; |
remaining=0x00; |
amount_remaining=0x00; |
Ydcvalue = 0x00; |
Crdcvalue = 0x00; |
Cbdcvalue = 0x00; |
|
if ((outfile = sysace_fopen("image01.jpg", "w")) == NULL) { |
ejpgl_error(eOPENOUTPUT_FILE, 0); |
} |
|
writejpegheader(outfile,bmpheader); |
|
for (row = 0; row < rows; row++) { |
for (col = 0; col < cols; col++) { |
readbmpfile(infile,pixelmatrix,row,col,bmpheader); |
RGB2YCrCb(pixelmatrix,YMatrix,CrMatrix,CbMatrix); |
for(component=0;component<3;component++) { |
switch (component) { |
case 0 ://Y-encoding |
dct(YMatrix,dctresult); |
zzq(dctresult,bitstream,compression,encode); |
Ydcvalue = EncodeDataUnit(bitstream,Ydcvalue,outfile, &remaining, &amount_remaining,component); |
break; |
case 1 ://Cr-encoding |
dct(CrMatrix,dctresult); |
zzq(dctresult,bitstream,compression,encode); |
Crdcvalue = EncodeDataUnit(bitstream,Crdcvalue,outfile, &remaining, &amount_remaining,component); |
break; |
case 2 ://Cb-encoding |
dct(CbMatrix,dctresult); |
zzq(dctresult,bitstream,compression,encode); |
Cbdcvalue = EncodeDataUnit(bitstream,Cbdcvalue,outfile, &remaining, &amount_remaining,component); |
break; |
} |
} |
} |
} |
HuffmanEncodeFinishSend(&remaining,&amount_remaining,outfile); |
xil_printf("\r\nProcessed %d %dx%d-blocks.\r\n",(row-1)*cols+col,MATRIX_SIZE,MATRIX_SIZE); |
writejpegfooter(outfile); |
|
|
sysace_fclose(outfile); |
sysace_fclose(infile); |
return 0; |
|
} |
|
int ejpgl_error(int errno, void* remark) { |
|
xil_printf("--> Error %d\r\n", errno); |
exit(1); |
|
} |
|
|
|
#else |
|
//--------------------------------------------------------------------------- |
typedef union { /* block of pixel-space values */ |
unsigned char block[8][8]; |
unsigned char linear[64]; |
} PBlock; |
|
typedef union { /* block of frequency-space values */ |
int block[8][8]; |
int linear[64]; |
} FBlock; |
|
#include <stdio.h> |
#include <stdlib.h> |
#ifndef __MICROBLAZE |
#include <windows.h> |
#endif |
#include "zzq.h" |
#include "io.h" |
#include "huffman.h" |
#include "dct.h" |
#pragma hdrstop |
|
|
//--------------------------------------------------------------------------- |
|
INFOHEADER _bmpheader; |
|
#pragma argsused |
int main(int argc, char* argv[]) |
{ |
int encode, compression,i; |
signed char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE*3],YMatrix[MATRIX_SIZE][MATRIX_SIZE],CrMatrix[MATRIX_SIZE][MATRIX_SIZE],CbMatrix[MATRIX_SIZE][MATRIX_SIZE]; |
/*= {{124, 105, 139, 95, 143, 98, 132, 114}, |
{105, 157, 61, 187, 51, 176, 80, 132}, |
{139, 61, 205, 17, 221, 32, 176, 98}, |
{95, 187, 17, 239, 0, 221, 51, 143}, |
{143, 51, 221, 0, 239, 17, 187, 95}, |
{98, 176, 32, 221, 17, 205, 61, 139}, |
{132, 80, 176, 51, 187, 61, 157, 105}, |
{114, 132, 98, 143, 95, 139, 105, 124}}; */ |
signed short temp[MATRIX_SIZE][MATRIX_SIZE], dctresult[MATRIX_SIZE][MATRIX_SIZE]; |
signed char output[MATRIX_SIZE][MATRIX_SIZE]; |
signed char bitstream[NUMBER_OF_PIXELS] ;//= {15,0,-2,-1,-1,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
unsigned char header[389]; |
FILE *infile, *outfile; |
INFOHEADER *bmpheader; |
JPEGHEADER *jpegheader; |
#ifndef __MICROBLAZE |
LARGE_INTEGER st, en; |
#endif |
unsigned int col, cols, row, rows, remaining,component; |
unsigned char amount_remaining, Ydcvalue, Cbdcvalue, Crdcvalue ; |
|
|
// bmpheader = (INFOHEADER *)malloc(sizeof(INFOHEADER)); |
bmpheader=&_bmpheader; |
|
switch (argc) { |
case 3 : |
encode = 0; |
break; |
case 4 : |
encode = 1; |
break; |
case 5 : |
encode = 1; |
compression = atoi(argv[4]); |
break; |
default : |
printf("invalid number of parameters\n\nUSAGE: jpegcodec source_file destination_file [/E] [compression_rate]\n"); |
printf("\nsource_file \t\t location of original file"); |
printf("\ndestination_file \t location of the new file"); |
printf("\n/E \t\t\t When set the source_file will be encoded to JPEG \n\t\t\t otherwise it will be decoded to BMP."); |
printf("\ncompression_rate \t specifies the compression ratio, defaults to the\n\t\t\t standard compression ratio. (Only valid when /D is set)\n"); |
system("PAUSE"); |
return 0; |
} |
|
infile = fopen(argv[1],"rb"); |
if (infile == NULL) { |
printf("Input file %s does not exist!\n\nUSAGE: jpegcodec source_file destination_file [/E] [compression_rate]\n",argv[1]); |
printf("\nsource_file \t\t location of original file"); |
printf("\ndestination_file \t location of the new file"); |
printf("\n/E \t\t\t When set the source_file will be encoded to JPEG \n\t\t\t otherwise it will be decoded to BMP."); |
printf("\ncompression_rate \t specifies the compression ratio, defaults to the\n\t\t\t standard compression ratio. (Only valid when /D is set)\n"); |
system("PAUSE"); |
} |
else { //start codec |
outfile = fopen(argv[2],"wb"); |
#ifndef __MICROBLAZE |
QueryPerformanceCounter(&st); |
#endif |
if(encode) { //encode infile to JPEG |
if (getbmpheader(infile,bmpheader)) { //File is a valid BMP |
printf("\nImage width: %d pixels", bmpheader->width); |
printf("\nImage height: %d pixels", bmpheader->height); |
rows = bmpheader->height>>3; |
cols = bmpheader->width>>3; |
remaining=0x00; |
amount_remaining=0x00; |
Ydcvalue = 0x00; |
Crdcvalue = 0x00; |
Cbdcvalue = 0x00; |
writejpegheader(outfile,bmpheader); |
|
for (row = 0; row < rows; row++) { |
for (col = 0; col < cols; col++) { |
readbmpfile(infile,pixelmatrix,row,col,bmpheader); |
RGB2YCrCb(pixelmatrix,YMatrix,CrMatrix,CbMatrix); |
for(component=0;component<3;component++) |
{ |
switch (component) { |
case 0 ://Y-encoding |
dct(YMatrix,dctresult); |
zzq(dctresult,bitstream,compression,encode); |
Ydcvalue = EncodeDataUnit(bitstream,Ydcvalue,outfile, &remaining, &amount_remaining,component); |
break; |
case 1 ://Cr-encoding |
dct(CrMatrix,dctresult); |
zzq(dctresult,bitstream,compression,encode); |
Crdcvalue = EncodeDataUnit(bitstream,Crdcvalue,outfile, &remaining, &amount_remaining,component); |
break; |
case 2 ://Cb-encoding |
dct(CbMatrix,dctresult); |
zzq(dctresult,bitstream,compression,encode); |
Cbdcvalue = EncodeDataUnit(bitstream,Cbdcvalue,outfile, &remaining, &amount_remaining,component); |
break; |
} |
} |
} |
} |
HuffmanEncodeFinishSend(&remaining,&amount_remaining,outfile); |
printf("\nProcessed %d %dx%d-blocks.",(row-1)*cols+col,MATRIX_SIZE,MATRIX_SIZE); |
//write JPEG footer |
writejpegfooter(outfile); |
|
} |
else { |
printf("\n%s is not a valid BMP-file",argv[1]); |
} |
|
} else { //decode infile to BMP |
|
// readjpegfile(infile,inputbuffer); |
// huffmancodec(inputbuffer,bitstream,encode); |
// zzq(pixelmatrix,bitstream,compression,encode); |
// DCT(dctmatrix,outputbuffer,encode); |
// writebmp(outputbuffer);*/ |
} |
|
fclose(outfile); |
fclose(infile); |
/* infile = fopen("test.jpg","rb"); |
outfile = fopen("header.h","wb"); |
fread(header,389,1,infile); |
for(i=0;i<389;i++) |
fprintf(outfile,"0x%x, ",header[i]); |
fclose(outfile); |
fclose(infile); */ |
#ifndef __MICROBLAZE |
QueryPerformanceCounter(&en); |
printf("\nExecution time: %f seconds",(double)(en.QuadPart-st.QuadPart)/1000000); |
#endif |
// free(bmpheader); |
} |
printf("\n\nHit ENTER to close this window."); |
getchar(); |
return 0; |
} |
//--------------------------------------------------------------------------- |
|
#endif |
|
/trunk/encoder/xup2pro.h
0,0 → 1,50
#ifndef _XUP2PRO_H |
#define _XUP2PRO_H |
|
// Microblaze related declaration |
|
#include <xparameters.h> |
#include <sysace_stdio.h> |
|
#include "xio.h" |
|
#define __XUPV2P |
|
|
// XUP2P board related declaration |
|
#ifdef __XUPV2P |
#define JPG_ADDRESS 0x70000000 |
#define JPG_MAXSIZE 0x10000 |
#define BMP_ADDRESS 0x70010000 |
#define BMP_MAXSIZE 0x10000 |
#else |
#define JPG_MAXSIZE 0x400000 |
#define BMP_MAXSIZE 0x1c00000 |
#endif |
|
// JPEG decoder related declaration |
|
extern unsigned char* jpgimage; |
extern char* bmpimage; |
extern unsigned long jpgsize; |
extern int bmpsize; |
|
// function declaration |
|
#define eOPENINPUT_FILE 1 |
#define eOPENOUTPUT_FILE 2 |
#define eINVALID_BMP 3 |
#define eLARGE_INPUTFILE 4 |
|
#ifndef htonl |
#define htonl(x) ((((x)&0xff000000)>>24) | (((x)&0x00ff0000)>>8) | (((x)&0x0000ff00)<<8) | (((x)&0x000000ff)<<24)) |
#endif |
|
#ifndef hton |
#define hton(x) ((((x) & 0xff00)>>8) | (((x) &0x00ff)<<8)) |
#endif |
|
#endif |
|
|
/trunk/encoder/zzq.c
0,0 → 1,94
//--------------------------------------------------------------------------- |
#include <stdio.h> |
#include "zzq.h" |
#pragma hdrstop |
//--------------------------------------------------------------------------- |
#pragma argsused |
|
static unsigned char quantization_table[MATRIX_SIZE][MATRIX_SIZE] ={ |
{4, 3, 3, 4, 4, 5, 6, 6}, |
{3, 3, 4, 4, 5, 6, 6, 6}, |
{4, 4, 4, 4, 5, 6, 6, 6}, |
{4, 4, 4, 5, 6, 6, 6, 6}, |
{4, 4, 5, 6, 6, 7, 7, 6}, |
{4, 5, 6, 6, 6, 7, 7, 6}, |
{6, 6, 6, 6, 7, 7, 7, 7}, |
{6, 6, 6, 7, 7, 7, 7, 7} |
}; |
|
//static int __count3=0; |
|
void zzq(signed short pixelmatrix[MATRIX_SIZE][MATRIX_SIZE], signed char *bitstream, int compression, int encode) |
{ |
int i, x, y, jumped, deltax, deltay; |
|
x = y = deltax = deltay = jumped = 0; |
// printf("\nZigZag order pixelmatrix:\n\n"); |
for(i=0;i<NUMBER_OF_PIXELS;i++) |
{ |
if (encode == 0) { |
pixelmatrix[y][x] = (bitstream[i]*quantization_table[y][x]); |
} else { |
if(pixelmatrix[y][x]>0) |
bitstream[i] = (pixelmatrix[y][x]>>quantization_table[y][x]); |
else |
bitstream[i] = -((-pixelmatrix[y][x])>>quantization_table[y][x]); |
// printf("%i ",bitstream[i]); |
#if 0 |
#ifdef __MICROBLAZE |
if (__count3<256*3) { |
xil_printf("%x ", bitstream[i]); |
__count3++; |
if ((__count3&0x0f)==0) xil_printf("\r\n"); |
} |
#else |
if (__count3<256*3) { |
printf(" %x ", bitstream[i]); |
__count3++; |
if ((__count3&0x0f)==0) printf("\r\n"); |
} |
#endif |
#endif |
} |
|
if((y == 0) || (y == MATRIX_SIZE-1)) { //on top or bottom side of matrix |
if(!jumped) { //first jump to element on the right |
x++; |
jumped = 1; |
} else { //modify direction |
if(i<(NUMBER_OF_PIXELS>>1)) { |
deltax = -1; |
deltay = 1; |
} else { |
deltax = 1; |
deltay = -1; |
} |
x += deltax; |
y += deltay; |
jumped = 0; |
} |
} else if ((x == 0) || (x == MATRIX_SIZE-1)) { //on left or right side of matrix |
if(!jumped) { //jump to element below |
y++; |
jumped = 1; |
} else { //modify direction |
if(i<(NUMBER_OF_PIXELS>>1)) { |
deltax = 1; |
deltay = -1; |
} else { |
deltax = -1; |
deltay = 1; |
} |
x += deltax; |
y += deltay; |
jumped = 0; |
} |
} |
else {//not on the edges of the matrix |
x += deltax; |
y += deltay; |
} |
} |
} |
//--------------------------------------------------------------------------- |
|
/trunk/encoder/io.c
0,0 → 1,374
//--------------------------------------------------------------------------- |
#include <stdio.h> |
#ifdef __MICROBLAZE |
#include "xup2pro.h" |
#endif |
|
#include "io.h" |
#pragma hdrstop |
//--------------------------------------------------------------------------- |
#pragma argsused |
|
JPEGHEADER _jpegheader; |
|
unsigned char qtable[64] = {16, 8, 8, 16, 12, 8, 16, 16, 16, 16, 16, 16, 16, 16, |
16, 32, 32, 16, 16, 16, 16, 32, 32, 32, 32, 32, 64, 64, 64, 64, 64, 64, 64, 64, 64, |
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 128, 128, 128, 128, 128, 64, 64, |
128, 128, 128, 128, 128, 64, 128, 128, 128}; |
|
unsigned char huffmancount[4][16] = {{0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //standard DC table count |
{0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7D}, //standard AC table count |
{0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //standard DC table count |
{0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7D}}; //standard AC table count |
|
unsigned char huffDCvalues[12] ={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b};// {0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E}; |
unsigned char huffACvalues[162] = {0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, |
0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, |
0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, |
0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, |
0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, |
0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, |
0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, |
0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, |
0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA}; |
|
//old huffman table, and propably a incorrect one. |
/*{0x00, 0x01, 0x04, 0x0A, 0x0B, 0x0C, 0x1A, 0x1B, 0x1C, 0x3A, 0x3B, 0x78, 0x79, 0x7A, 0x7B, 0xF8, 0xF9, 0xFA, 0xF6, |
0xF7, 0xF8, 0xF9, 0xFA, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xF6, 0xF7, 0xF8, 0xF9, 0xF4, 0xF5, 0xF6, 0xF7, 0xC0, 0x82, |
0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, |
0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, |
0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, |
0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, |
0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, |
0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, |
0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE};*/ |
|
int getbmpheader(FILE * file, INFOHEADER *header) |
{ |
int retval; |
#ifdef __MICROBLAZE |
|
// sysace_fread(header, 1, 14, file); |
// retval = sysace_fread(header, 1, sizeof(INFOHEADER), file); |
|
memcpy(header, bmpimage+14, sizeof(INFOHEADER)); |
|
header->size = htonl(header->size); |
header->width = htonl(header->width); |
header->height = htonl(header->height); |
header->planes = hton(header->planes); |
header->bits = hton(header->bits); |
header->compression = htonl(header->compression); |
header->imagesize = htonl(header->imagesize); |
header->xresolution = htonl(header->xresolution); |
header->yresolution= htonl(header->yresolution); |
header->ncolours= htonl(header->ncolours); |
header->importantcolours= htonl(header->importantcolours); |
|
return 1; |
|
#else |
fseek(file,14,SEEK_SET); |
retval = fread(header, sizeof(INFOHEADER), 1, file); |
#endif |
|
return retval; |
} |
/* |
int getjpegheader(FILE * file, JPEGHEADER *header) |
{ |
unsigned int retval; |
|
return retval; |
} |
|
void writebmpheader(FILE * file, BMPHEADER *header) |
{ |
//write header |
|
//fill file with 0's |
fwrite(0, 1, header->info.width*header->info.height, file); |
} |
*/ |
void writejpegheader(FILE * file, INFOHEADER *header) |
{ |
JPEGHEADER *jpegheader; |
unsigned int headersize, huffmantablesize, previoussize; |
unsigned char QTcount, i, j, components, id, huffmantablecount; |
unsigned short length, headerlength; |
|
//Number of Quatization Tables |
QTcount = 2; |
headerlength = 12; //12 bytes are needed for the markers |
huffmantablecount = 4; // // 2 AC and 2 DC tables |
huffmantablesize = 0; |
jpegheader = &_jpegheader;//(JPEGHEADER *)malloc(550); |
|
jpegheader->SOIMarker[0] = 0xff; |
jpegheader->SOIMarker[1] = 0xd8; |
|
//APP0 segment |
jpegheader->app0.APP0Marker[0] = 0xff; |
jpegheader->app0.APP0Marker[1] = 0xe0; |
|
headerlength += 16; //APP0 marker is always 16 bytes long |
jpegheader->app0.Length[0] = 0x00; |
jpegheader->app0.Length[1] = 0x10; |
jpegheader->app0.Identifier[0] = 0x4a; |
jpegheader->app0.Identifier[1] = 0x46; |
jpegheader->app0.Identifier[2] = 0x49; |
jpegheader->app0.Identifier[3] = 0x46; |
jpegheader->app0.Identifier[4] = 0x00; |
jpegheader->app0.Version[0] = 0x01; |
jpegheader->app0.Version[1] = 0x00; |
jpegheader->app0.Units = 0x00; |
jpegheader->app0.XDensity[0] = 0x00; |
jpegheader->app0.XDensity[1] = 0x01; |
jpegheader->app0.YDensity[0] = 0x00; |
jpegheader->app0.YDensity[1] = 0x01; |
jpegheader->app0.ThumbWidth = 0x00; |
jpegheader->app0.ThumbHeight = 0x00; |
|
//Quantization Table Segment |
jpegheader->qt.QTMarker[0] = 0xff; |
jpegheader->qt.QTMarker[1] = 0xdb; |
length = (QTcount<<6) + QTcount + 2; |
headerlength += length; |
jpegheader->qt.Length[0] = (length & 0xff00)>>8; |
jpegheader->qt.Length[1] = length & 0xff; |
// jpegheader->qt.QTInfo = 0x00; // index = 0, precision = 0 |
//write Quantization table to header |
i = 0; |
/* jpegheader->qt.QTInfo[0] = 0; |
for(i=0;i<64;i++) { |
jpegheader->qt.QTInfo[i+1] = qtable[i]; |
} |
jpegheader->qt.QTInfo[65] = 1; |
for(i=0;i<64;i++) { |
jpegheader->qt.QTInfo[i+66] = qtable[i]; |
} */ |
for (id=0; id<QTcount; id++) { |
jpegheader->qt.QTInfo[(id<<6)+id] = id; |
for(i=0;i<64;i++) { |
jpegheader->qt.QTInfo[i+1+id+(id<<6)] = qtable[i]; |
} |
} |
|
//Start of Frame segment |
jpegheader->sof0.SOF0Marker[0] = 0xff; |
jpegheader->sof0.SOF0Marker[1] = 0xc0; |
if(header->bits == 8) { |
components = 0x01; |
} |
else { |
components = 0x03; |
} |
length = 8 + 3*components; |
headerlength += length; |
jpegheader->sof0.Length[0] = (length & 0xff00) >> 8; |
jpegheader->sof0.Length[1] = length & 0xff; |
jpegheader->sof0.DataPrecision = 0x08; |
jpegheader->sof0.ImageHeight[0] = (header->height & 0xff00) >> 8; |
jpegheader->sof0.ImageHeight[1] = header->height & 0xff; |
jpegheader->sof0.ImageWidth[0] = (header->width & 0xff00) >> 8; |
jpegheader->sof0.ImageWidth[1] = header->width & 0xff; |
#ifdef __MICROBLAZE |
xil_printf("--->%d %d %d %d\r\n", jpegheader->sof0.ImageHeight[0], jpegheader->sof0.ImageHeight[1], jpegheader->sof0.ImageWidth[0], jpegheader->sof0.ImageWidth[1]); |
#else |
printf("--->%d %d %d %d\r\n", jpegheader->sof0.ImageHeight[0], jpegheader->sof0.ImageHeight[1], jpegheader->sof0.ImageWidth[0], jpegheader->sof0.ImageWidth[1]); |
#endif |
jpegheader->sof0.Components = components; |
for (i=0; i < components; i++) { |
jpegheader->sof0.ComponentInfo[i][0] = i+1; //color component |
jpegheader->sof0.ComponentInfo[i][1] = 0x11; //no sampling has been done |
jpegheader->sof0.ComponentInfo[i][2] = (i==0)? 0x00 : 0x01; //quantization table ID |
} |
//Start of Huffman Table Segment |
|
jpegheader->ht.HTMarker[0] = 0xff; |
jpegheader->ht.HTMarker[1] = 0xc4; |
|
//Set dummy HT segment length |
length = 0;//tablecount*17; |
jpegheader->ht.Length[0] = (length & 0xff00) >> 8; |
jpegheader->ht.Length[1] = length & 0xff; |
previoussize = 0; |
for (id=0; id < huffmantablecount; id++) { |
huffmantablesize = 0; |
switch (id) { |
case 0 : jpegheader->ht.HuffmanInfo[previoussize] = 0x00; |
break; |
case 1 : jpegheader->ht.HuffmanInfo[previoussize] = 0x10; |
break; |
case 2 : jpegheader->ht.HuffmanInfo[previoussize] = 0x01; |
break; |
case 3 : jpegheader->ht.HuffmanInfo[previoussize] = 0x11; |
break; |
} |
for (i=1; i <= 16; i++) { |
jpegheader->ht.HuffmanInfo[i+previoussize] = huffmancount[id][i-1]; |
huffmantablesize += huffmancount[id][i-1]; |
} |
|
for (i=0; i < huffmantablesize; i++) { |
jpegheader->ht.HuffmanInfo[i+previoussize+17] = (id%2 == 1)? huffACvalues[i] : huffDCvalues[i]; |
} |
previoussize += huffmantablesize + 17; |
} |
//Set real HT segment length |
length = 2+previoussize; |
headerlength += length; |
jpegheader->ht.Length[0] = (length & 0xff00) >> 8; |
jpegheader->ht.Length[1] = length & 0xff; |
//Reset marker segment |
/* jpegheader->dri.DRIMarker[0] = 0xff; |
jpegheader->dri.DRIMarker[1] = 0xdd; |
jpegheader->dri.Length[0] = 0x00; |
jpegheader->dri.Length[1] = 0x04; |
jpegheader->dri.RestartInteral[0] = 0x00; //no restart markers |
jpegheader->dri.RestartInteral[1] = 0x00; //no restart markers |
headerlength += 6; //length of DRI segment |
*/ |
//Start of Scan Header Segment |
jpegheader->sos.SOSMarker[0] = 0xff; |
jpegheader->sos.SOSMarker[1] = 0xda; |
length = 6 + (components<<1); |
headerlength += length; |
jpegheader->sos.Length[0] = (length & 0xff00) >> 8; |
jpegheader->sos.Length[1] = length & 0xff; |
jpegheader->sos.ComponentCount = components; //number of color components in the image |
jpegheader->sos.Component[0][0] = 0x01; //Y component |
jpegheader->sos.Component[0][1] = 0x00; //indexes of huffman tables for Y-component |
if (components == 0x03) { |
jpegheader->sos.Component[1][0] = 0x02; //the CB component |
jpegheader->sos.Component[1][1] = 0x11; //indexes of huffman tables for CB-component |
jpegheader->sos.Component[2][0] = 0x03; //The CR component |
jpegheader->sos.Component[2][1] = 0x11; //indexes of huffman tables for CR-component |
} |
//following bytes are ignored since progressive scan is not to be implemented |
jpegheader->sos.Ignore[0] = 0x00; |
jpegheader->sos.Ignore[1] = 0x3f; |
jpegheader->sos.Ignore[2] = 0x00; |
|
#ifdef __MICROBLAZE |
sysace_fwrite(jpegheader, 1, headerlength, file); |
xil_printf("jpeg header size %x\r\n", headerlength); |
#else |
fwrite(jpegheader,headerlength,1,file); |
printf("jpeg header size %x\r\n", headerlength); |
#endif |
|
} |
|
void writejpegfooter(FILE * file) |
{ |
unsigned char footer[2]; |
footer[0] = 0xff; |
footer[1] = 0xd9; |
#ifdef __MICROBLAZE |
sysace_fwrite(footer, 1, sizeof(footer), file); |
#else |
// fseek(file,0,SEEK_END); |
fwrite(footer,sizeof(footer),1,file); |
#endif |
} |
|
static unsigned char buffer[MATRIX_SIZE*3]; |
static int __count2=0; |
|
void readbmpfile(FILE * file, signed char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE*3], unsigned int mrow, unsigned int mcol, INFOHEADER * header) |
{ |
unsigned int row, col; |
int offset; |
|
for(row = 0;row < MATRIX_SIZE; row++) { |
//Find first point of row in the matrix to be read. |
#ifdef __MICROBLAZE |
// sysace_fread(buffer, 1, MATRIX_SIZE*3, file); |
offset = bmpsize-3*header->width*(row + 1 + mrow*MATRIX_SIZE)+MATRIX_SIZE*3*mcol; |
memcpy(buffer, bmpimage + offset, MATRIX_SIZE*3); |
#else |
fseek(file,-(3*header->width*(row + 1 + mrow*MATRIX_SIZE)-(MATRIX_SIZE*3)*mcol),SEEK_END); |
//Read row from matrix |
fread(buffer, 1, MATRIX_SIZE*3, file); |
//copy row into pixelmatrix |
#endif |
for(col = 0; col < MATRIX_SIZE*3; col++) { |
pixelmatrix[row][col] = buffer[col]- 128; |
#if 0 |
#ifdef __MICROBLAZE |
if (__count2<4*24*8) { |
xil_printf("%x ", pixelmatrix[row][col]); |
__count2++; |
if ((__count2&0x0f)==0) xil_printf("\r\n"); |
} |
#else |
if (__count2<4*24*8) { |
printf(" %x ", pixelmatrix[row][col]); |
__count2++; |
if ((__count2&0x0f)==0) printf("\r\n"); |
} |
#endif |
#endif |
} |
} |
} |
/*USED VALUES OF ROY's CODE THIS MIGHT LEAD TO PROBLEMS*/ |
signed char RGB2Y (int r, int g, int b) { |
return ((66*r + 129*g + 25*b + 128)>>8)+128; |
} |
/*USED VALUES OF ROY's CODE THIS MIGHT LEAD TO PROBLEMS*/ |
signed char RGB2Cr (int r, int g, int b) { |
return ((-38*r - 74*g + 112*b + 128)>>8)+128; |
} |
/*USED VALUES OF ROY's CODE THIS MIGHT LEAD TO PROBLEMS*/ |
signed char RGB2Cb (int r, int g, int b) { |
return ((112*r - 94*g - 18*b + 128)>>8)+128; |
} |
|
static int __count1=120; |
|
void RGB2YCrCb(signed char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE*3],signed char YMatrix[MATRIX_SIZE][MATRIX_SIZE],signed char CrMatrix[MATRIX_SIZE][MATRIX_SIZE],signed char CbMatrix[MATRIX_SIZE][MATRIX_SIZE]) |
{ |
unsigned int row, col; |
for(row = 0;row < MATRIX_SIZE; row++) { |
for(col = 0; col < MATRIX_SIZE; col++) { |
YMatrix[row][col] = RGB2Y(pixelmatrix[row][col*3+2],pixelmatrix[row][col*3+1],pixelmatrix[row][col*3]) - 128; |
CrMatrix[row][col] = RGB2Cr(pixelmatrix[row][col*3+2],pixelmatrix[row][col*3+1],pixelmatrix[row][col*3]) - 128; |
CbMatrix[row][col] = RGB2Cb(pixelmatrix[row][col*3+2],pixelmatrix[row][col*3+1],pixelmatrix[row][col*3]) - 128; |
#if 0 |
#ifdef __MICROBLAZE |
if (__count1<64) { |
xil_printf("-------------->%x %x %x\r\n", YMatrix[row][col], CrMatrix[row][col], CbMatrix[row][col]); |
__count1++; |
} |
#else |
if (__count1<64) { |
printf("-------------->%x %x %x\r\n", YMatrix[row][col], CrMatrix[row][col], CbMatrix[row][col]); |
__count1++; |
} |
#endif |
#endif |
} |
} |
} |
/* |
void readjpegfile(FILE * file, unsigned char bitstream[]) |
{ |
} |
|
|
void writebmpfile(FILE * file, unsigned char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE], unsigned int mrow, unsigned int mcol, unsigned int width) |
{ |
unsigned int row; |
for(row = 0;row < MATRIX_SIZE; row++) { |
//Find first point of row in the matrix to be read. |
fseek(file,-(width*(row + 1 + mrow*MATRIX_SIZE)-(MATRIX_SIZE*mcol)),SEEK_END); |
//Read row from matrix |
fwrite(pixelmatrix[row], 1, MATRIX_SIZE, file); |
} |
} |
|
void writejpegfile(FILE * file, unsigned char bitstream[]) |
{ |
} */ |
/trunk/encoder/huffman.h
0,0 → 1,11
#ifndef _HUFFMAN_H |
#define _HUFFMAN_H 1 |
|
char EncodeDataUnit(char dataunit[NUMBER_OF_PIXELS], char last_dc_value, FILE* file, unsigned int *remaining, unsigned char *amount_remaining, unsigned int component); |
|
void HuffmanEncodeFinishSend(unsigned int *remaining,unsigned char *amount_remaining, FILE* file); |
|
#else |
#error "ERROR file huffman.h multiple times included" |
#endif /* --- _HUFFMAN_H --- */ |
|
/trunk/encoder/types.h
0,0 → 1,10
typedef union { /* block of pixel-space values */ |
unsigned char block[8][8]; |
unsigned char linear[64]; |
} PBlock; |
|
typedef union { /* block of frequency-space values */ |
int block[8][8]; |
int linear[64]; |
} FBlock; |
|
/trunk/encoder/zzq.h
0,0 → 1,18
#ifndef _ZZQ_H |
#define _ZZQ_H 1 |
|
#define MATRIX_SIZE 8 |
#define NUMBER_OF_PIXELS MATRIX_SIZE*MATRIX_SIZE |
|
|
|
|
/* |
* ZigZag order the pixelmatrix and quantify its values, if endode == 0 the |
* inverse operation will be caried out. |
*/ |
void zzq(signed short pixelmatrix[MATRIX_SIZE][MATRIX_SIZE], signed char *bitstream, int compression, int encode); |
#else |
#error "ERROR file zzq.h multiple times included" |
#endif /* --- _ZZQ_H --- */ |
|
/trunk/encoder/dct.c
0,0 → 1,144
|
#include <stdio.h> |
#include "dct.h" |
#include "weights.h" |
|
|
/* |
Function Name: dct |
|
Operation: Find the 8x8 DCT of an array using separable DCT |
First, finds 1-d DCT along rows, storing the result in inter[][] |
Then, 1-d DCT along columns of inter[][] is found |
|
Input: pixels is the 8x8 input array |
|
Output: dct is the 8x8 output array |
*/ |
signed int max_val = 0; |
static int __count=0; |
|
void dct(signed char pixels[8][8], signed short dct[8][8]) |
{ |
FILE * file; |
int inr, inc; /* rows and columns of input image */ |
int intr, intc; /* rows and columns of intermediate image */ |
int outr, outc; /* rows and columns of dct */ |
int f_val; /* cumulative sum */ |
int inter[8][8]; /* stores intermediate result */ |
int i,j,k; |
k=0; |
// file = fopen("weights.h","w+"); |
// fprintf(file,"double weights1[512] = {"); |
/* find 1-d dct along rows */ |
#if 0 |
|
#ifdef __MICROBLAZE |
if (__count<4) { |
for (i=0; i<8; i++) |
for (j=0; j<8; j++) |
xil_printf("%x ", pixels[i][j]); |
xil_printf("\r\n"); |
} |
#else |
if (__count<4) { |
for (i=0; i<8; i++) |
for (j=0; j<8; j++) |
printf(" %x ", pixels[i][j]); |
printf("\r\n"); |
} |
#endif |
#endif |
|
for (intr=0; intr<8; intr++) |
for (intc=0; intc<8; intc++) { |
for (i=0,f_val=0; i<8; i++) { |
|
f_val += (pixels[intr][i]* weights[k]);//cos((double)(2*i+1)*(double)intc*PI/16); |
k++; |
// fprintf(file, "\n%.0f,",cos((double)(2*i+1)*(double)intc*PI/16)*16384); |
} |
if (intc!=0) |
inter[intr][intc] = f_val>>15; |
else |
inter[intr][intc] = (11585*(f_val>>14))>>15; |
|
} |
// fprintf(file,"\n};"); |
// fclose(file); |
k=0; |
/* find 1-d dct along columns */ |
for (outc=0; outc<8; outc++) |
for (outr=0; outr<8; outr++) { |
for (i=0,f_val=0; i<8; i++) { |
f_val += (inter[i][outc] *weights[k]); |
k++; |
} |
if (outr!=0) |
dct[outr][outc] = f_val>>15; |
else |
dct[outr][outc] = (11585*(f_val>>14)>>15); |
} |
#if 0 |
#ifdef __MICROBLAZE |
if (__count<4) { |
for (i=0; i<8; i++) |
for (j=0; j<8; j++) |
xil_printf("%x ", dct[i][j]); |
xil_printf("\r\n"); |
__count++; |
} |
#else |
if (__count<4) { |
for (i=0; i<8; i++) |
for (j=0; j<8; j++) |
printf(" %x ", dct[i][j]); |
printf("\r\n"); |
__count++; |
} |
#endif |
#endif |
|
} |
|
/***************************************************************** |
UNCOMMENT THIS SECTION TO TEST 2D DCT |
*****************************************************************/ |
|
/* |
main() |
{ |
|
unsigned char inputmatrix[8][8]; |
unsigned char outputmatrix[8][8]; |
unsigned int i,j; |
|
|
printf("Input Matrix (8*8) :-\n"); |
for (i=0; i<8; i++){ |
printf("\n"); |
for (j=0;j<8;j++){ |
inputmatrix[i][j] = i*8+j; |
printf("%4d",inputmatrix[i][j]); |
} |
|
} |
|
|
|
dct(inputmatrix,outputmatrix); |
|
printf("\n\nOutput Matrix (8*8) :-\n"); |
|
for (i=0; i<8; i++){ |
printf("\n"); |
for (j=0;j<8;j++){ |
printf("%4d",outputmatrix[i][j]); |
|
} |
|
} |
printf("\n"); |
|
} |
*/ |
/trunk/encoder/io.h
0,0 → 1,136
#ifndef _IO_H |
#define _IO_H 1 |
#define MATRIX_SIZE 8 |
typedef struct { |
unsigned int size; /* Header size in bytes */ |
int width,height; /* Width and height of image */ |
unsigned short int planes; /* Number of colour planes */ |
unsigned short int bits; /* Bits per pixel */ |
unsigned int compression; /* Compression type */ |
unsigned int imagesize; /* Image size in bytes */ |
int xresolution,yresolution; /* Pixels per meter */ |
unsigned int ncolours; /* Number of colours */ |
unsigned int importantcolours; /* Important colours */ |
unsigned char palette[1024]; /* Storage for palette */ |
} INFOHEADER; |
|
typedef struct { |
int restofheader; //TODO |
INFOHEADER info; /* Information header */ |
} BMPHEADER; |
|
typedef struct { |
unsigned int row; /* Width and height of image */ |
unsigned int col; /* Width and height of image */ |
} BLOCKINFO; |
|
typedef struct { |
unsigned char QTMarker[2]; |
unsigned char Length[2]; |
unsigned char QTInfo[130]; //bit 0..3: number of QT (0..3, otherwise error) |
// bit 4..7: precision of QT, 0 = 8 bit, otherwise 16 bit |
// unsigned char ValuesQT[]; //max 192 values. 64*(precision+1) bytes |
} QTINFO; |
|
typedef struct { |
unsigned char HTMarker[2]; |
unsigned char Length[2]; |
unsigned char HuffmanInfo[416]; //Array containing ALL huffman information |
//For each color component holds: |
//First byte is used as info byte, followed by 16 bytes with values used |
//for counting the different huffman codes, finally the corresponding |
//huffman codes will follow. This sequence can repeat it self for |
//different Huffman tables, both DC or AC tables. |
|
//The structure of the information byte is as follows: |
//bit 0..3 : number of HT (0..3, otherwise error) |
//bit 4 : type of HT, 0 = DC table, 1 = AC table |
//bit 5..7 : not used, must be 0 (Used for progressive scan JPEG) |
} HTINFO; |
|
|
typedef struct { |
unsigned char APP0Marker[2]; |
unsigned char Length[2]; |
unsigned char Identifier[5]; |
unsigned char Version[2]; |
unsigned char Units; |
unsigned char XDensity[2]; |
unsigned char YDensity[2]; |
unsigned char ThumbWidth; |
unsigned char ThumbHeight; |
} APP0INFO; |
|
typedef struct { |
unsigned char SOF0Marker[2]; |
unsigned char Length[2]; |
unsigned char DataPrecision; //This is in bits/sample, usually 8 (12 and 16 not supported by most software). |
unsigned char ImageHeight[2]; |
unsigned char ImageWidth[2]; |
unsigned char Components; //Usually 1 = grey scaled, 3 = color YcbCr or YIQ 4 = color CMYK |
unsigned char ComponentInfo[3][3]; //Read each component data of 3 bytes. It contains, |
//(component Id(1byte)(1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), |
//sampling factors (1byte) (bit 0-3 vertical., 4-7 horizontal.), |
//quantization table number (1 byte)). |
} SOF0INFO; |
|
typedef struct { |
unsigned char SOSMarker[2]; |
unsigned char Length[2]; //This must be equal to 6+2*(number of components in scan). |
unsigned char ComponentCount; //This must be >= 1 and <=4 (otherwise error), usually 1 or 3 |
unsigned char Component[3][2]; // For each component, read 2 bytes. It contains, |
//1 byte Component Id (1=Y, 2=Cb, 3=Cr, 4=I, 5=Q), |
//1 byte Huffman table to use : |
//bit 0..3 : AC table (0..3) |
//bit 4..7 : DC table (0..3) |
unsigned char Ignore[3]; //We have to skip 3 bytes |
} SOSINFO; |
|
typedef struct { |
unsigned char DRIMarker[2]; |
unsigned char Length[2]; |
unsigned char RestartInteral[2]; // Interval of the restart markers |
} DRIINFO; |
|
typedef struct { |
unsigned char SOIMarker[2]; //Start of image marker |
APP0INFO app0; |
QTINFO qt; |
SOF0INFO sof0; |
HTINFO ht; |
// DRIINFO dri; |
SOSINFO sos; |
} JPEGHEADER; |
|
/* |
* Read BMP header and return it in header, for now only the width and height |
* are returned, since the other values are of no use. |
*/ |
int getbmpheader(FILE * file, INFOHEADER *header); |
|
int getjpegheader(FILE * file, JPEGHEADER *header); |
|
void writebmpheader(FILE * file, BMPHEADER *header); |
|
void writejpegheader(FILE * file, INFOHEADER *header); |
|
void writejpegfooter(FILE * file); |
|
/* |
* Read BMP to retrieve 8*8 block starting at horizontal position mcol*8, and |
* vertical position mrow*8 in the image. This block is returned in pixelmatrix. |
* |
*/ |
void readbmpfile(FILE * file, signed char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE*3], unsigned int mrow, unsigned int mcol, INFOHEADER * header); |
|
void RGB2YCrCb(signed char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE*3],signed char YMatrix[MATRIX_SIZE][MATRIX_SIZE],signed char CrMatrix[MATRIX_SIZE][MATRIX_SIZE],signed char CbMatrix[MATRIX_SIZE][MATRIX_SIZE]); |
|
void readjpegfile(FILE * file, unsigned char bitstream[]); |
|
void writebmpfile(FILE * file, unsigned char pixelmatrix[MATRIX_SIZE][MATRIX_SIZE], unsigned int mrow, unsigned int mcol, unsigned int width); |
|
void writejpegfile(FILE * file, unsigned char bitstream[]); |
#else |
#error "ERROR file io.h multiple times included" |
#endif /* --- _IO_H --- */ |
|
/trunk/encoder/header.h
0,0 → 1,136
0xff, 0xd8, 0xff, 0xe0, 0x0, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x10, 0x8, 0x8, 0x10, 0xc, 0x8, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x80, 0x80, 0x80, 0x1, 0x10, 0x8, 0x8, 0x10, 0xc, 0x8, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x80, 0x80, 0x80, 0xff, 0xc0, 0x0, 0xb, 0x8, 0x1, 0x20, 0x1, 0xb0, 0x1, 0x1, 0x11, 0x0, 0xff, 0xc4, 0x0, 0xd2, 0x0, 0x0, 0x1, 0x5, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0x10, 0x0, 0x2, 0x1, 0x3, 0x3, 0x2, 0x4, 0x3, 0x5, 0x5, 0x4, 0x4, 0x0, 0x0, 0x1, 0x7d, 0x1, 0x2, 0x3, 0x0, 0x4, 0x11, 0x5, 0x12, 0x21, 0x31, 0x41, 0x6, 0x13, 0x51, 0x61, 0x7, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x8, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x9, 0xa, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x0, 0x8, 0x1, 0x1, 0x0, 0x0, 0x3f, 0x0, |