/* Multiply Quantization table with quality factor to get LQT and CQT */ void initialize_quantization_tables(UINT32 quality_factor) { UINT16 i, index; UINT32 value; UINT8 luminance_quant_table[] = { 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 }; UINT8 chrominance_quant_table[] = { 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 }; for(i = 0; i < 64; i++) { index = zigzag_table[i]; /* luminance quantization table * quality factor */ value = luminance_quant_table[i] * quality_factor; value = (value + 0x200) >> 10; if(value == 0) value = 1; else if(value > 255) value = 255; Lqt[index] = (UINT8) value; ILqt[i] = DSP_Division(0x8000, value); /* chrominance quantization table * quality factor */ value = chrominance_quant_table[i] * quality_factor; value = (value + 0x200) >> 10; if(value == 0) value = 1; else if(value > 255) value = 255; Cqt[index] = (UINT8) value; ICqt[i] = DSP_Division(0x8000, value); } }
/* Will use constant Quantization tables to make it faster */ void initialize_quantization_tables (struct JPEG_ENCODER_STRUCTURE * jpeg_encoder_structure) { UINT16 i, index; UINT32 value; /* comment next line to use JPEG default tables*/ #define QCAM_TABLES #ifndef QCAM_TABLES /* JPEG default tables (good Quality) */ static UINT8 luminance_quant_table [] = { 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 }; static UINT8 chrominance_quant_table [] = { 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 }; #else /* quickcam 5000pro tables (very good quality) */ static UINT8 luminance_quant_table [] = { 0x04, 0x02, 0x03, 0x03, 0x03, 0x02, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0a, 0x06, 0x06, 0x05, 0x05, 0x06, 0x0c, 0x08, 0x09, 0x07, 0x0a, 0x0e, 0x0c, 0x0f, 0x0f, 0x0e, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x17, 0x13, 0x10, 0x11, 0x15, 0x11, 0x0d, 0x0e, 0x14, 0x1a, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x19, 0x0f, 0x13, 0x1c, 0x1e, 0x1c, 0x19, 0x1e, 0x17, 0x19, 0x19, 0x18 }; static UINT8 chrominance_quant_table [] = { 0x04, 0x04, 0x04, 0x06, 0x05, 0x06, 0x0b, 0x06, 0x06, 0x0b, 0x18, 0x10, 0x0e, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }; #endif /* static UINT8 qtable_jpeg_flattened[] = * { 18, 23, 22, 28, 34, 44, 50, 55, * 24, 24, 26, 31, 36, 53, 54, 52, * 26, 25, 28, 34, 44, 53, 58, 52, * 26, 29, 33, 38, 50, 65, 63, 55, * 30, 33, 43, 52, 58, 73, 71, 61, * 34, 41, 52, 56, 63, 71, 74, 67, * 49, 56, 62, 65, 71, 77, 77, 70, * 59, 67, 68, 69, 74, 70, 71, 70}; * * static UINT8 qtable_semiuniform[] = * { 16, 32, 64, 64, 64, 64, 64, 64, * 32, 64, 64, 64, 64, 64, 64, 64, * 64, 64, 64, 64, 64, 64, 64, 64, * 64, 64, 64, 64, 64, 64, 64, 64, * 64, 64, 64, 64, 64, 64, 64, 64, * 64, 64, 64, 64, 64, 64, 64, 64, * 64, 64, 64, 64, 64, 64, 64, 64, * 64, 64, 64, 64, 64, 64, 64, 64 }; * * static UINT8 qtable_uniform[] = * { 100, 100, 100, 100, 100, 100, 100, 100, * 100, 100, 100, 100, 100, 100, 100, 100, * 100, 100, 100, 100, 100, 100, 100, 100, * 100, 100, 100, 100, 100, 100, 100, 100, * 100, 100, 100, 100, 100, 100, 100, 100, * 100, 100, 100, 100, 100, 100, 100, 100, * 100, 100, 100, 100, 100, 100, 100, 100, * 100, 100, 100, 100, 100, 100, 100, 100 }; * * static UINT8 qtable_none[] = * { 1, 1, 1, 1, 1, 1, 1, 1, * 1, 1, 1, 1, 1, 1, 1, 1, * 1, 1, 1, 1, 1, 1, 1, 1, * 1, 1, 1, 1, 1, 1, 1, 1, * 1, 1, 1, 1, 1, 1, 1, 1, * 1, 1, 1, 1, 1, 1, 1, 1, * 1, 1, 1, 1, 1, 1, 1, 1, * 1, 1, 1, 1, 1, 1, 1, 1 }; * * static UINT8 qtable_jpeg_squashed[] = { //4*sqrt(jpeg_flat) * 18, 19, 19, 21, 23, 27, 28, 30, * 20, 20, 21, 22, 24, 29, 30, 29, * 21, 20, 21, 23, 27, 29, 31, 29, * 21, 22, 23, 25, 28, 32, 32, 30, * 22, 23, 26, 29, 31, 34, 34, 31, * 23, 26, 29, 30, 32, 34, 35, 33, * 28, 30, 32, 32, 34, 35, 35, 34, * 31, 33, 33, 33, 35, 34, 34, 34 }; */ for (i=0; i<64; i++) { index = zigzag_table [i]; value= luminance_quant_table [i]; jpeg_encoder_structure->Lqt [index] = (UINT8) value; jpeg_encoder_structure->ILqt [i] = DSP_Division (0x8000, value); value = chrominance_quant_table [i]; jpeg_encoder_structure->Cqt[index] = (UINT8) value; jpeg_encoder_structure->ICqt [i] = DSP_Division (0x8000, value); } }