1 | ///////////////////////////////////////////////////////////////////////////////////////// |
---|
2 | // File : iqzz.c |
---|
3 | // Date : octobre 2015 |
---|
4 | // author : Alain Greiner |
---|
5 | ///////////////////////////////////////////////////////////////////////////////////////// |
---|
6 | // This file define the code of the IQZZ (Invert Quantisation) thread for MJPEG. |
---|
7 | ///////////////////////////////////////////////////////////////////////////////////////// |
---|
8 | |
---|
9 | #include <stdio.h> |
---|
10 | #include <mwmr_channel.h> |
---|
11 | #include <stdint.h> |
---|
12 | #include "mjpeg.h" |
---|
13 | |
---|
14 | // macro to use a shared TTY |
---|
15 | #define PRINTF(...) do { lock_acquire( &tty_lock ); \ |
---|
16 | giet_tty_printf(__VA_ARGS__); \ |
---|
17 | lock_release( &tty_lock ); } while(0); |
---|
18 | |
---|
19 | ////////////////////////////////////////////////////////////// |
---|
20 | __attribute__ ((constructor)) void iqzz( unsigned int index ) |
---|
21 | ////////////////////////////////////////////////////////////// |
---|
22 | { |
---|
23 | const uint8_t G_ZZ[64] = |
---|
24 | { |
---|
25 | 0 , 1, 8, 16, 9, 2, 3, 10, |
---|
26 | 17, 24, 32, 25, 18, 11, 4, 5, |
---|
27 | 12, 19, 26, 33, 40, 48, 41, 34, |
---|
28 | 27, 20, 13, 6, 7, 14, 21, 28, |
---|
29 | 35, 42, 49, 56, 57, 50, 43, 36, |
---|
30 | 29, 22, 15, 23, 30, 37, 44, 51, |
---|
31 | 58, 59, 52, 45, 38, 31, 39, 46, |
---|
32 | 53, 60, 61, 54, 47, 55, 62, 63 |
---|
33 | }; |
---|
34 | |
---|
35 | mwmr_channel_t* mwmr_in_data = vld_2_iqzz[index]; |
---|
36 | mwmr_channel_t* mwmr_in_quanti = demux_2_iqzz[index]; |
---|
37 | mwmr_channel_t* mwmr_out_data = iqzz_2_idct[index]; |
---|
38 | |
---|
39 | uint32_t block; |
---|
40 | uint32_t i; |
---|
41 | uint8_t QT[64]; // Quantisation Table / 1 byte per pixel |
---|
42 | int16_t bin[64]; // Input data buffer / 2 bytes per pixel |
---|
43 | int32_t bout[64]; // Output data buffer / 4 bytes per pixel |
---|
44 | |
---|
45 | uint32_t nblocks = nblocks_w * nblocks_h; |
---|
46 | |
---|
47 | // get platform parameters |
---|
48 | uint32_t x_size; |
---|
49 | uint32_t y_size; |
---|
50 | uint32_t nprocs; |
---|
51 | giet_procs_number( &x_size , &y_size , &nprocs ); |
---|
52 | |
---|
53 | // get processor coordinates |
---|
54 | uint32_t x, y, p; |
---|
55 | giet_proc_xyp( &x , &y , &p ); |
---|
56 | |
---|
57 | PRINTF("\n[MJPEG] thread IQZZ[%d] starts on P[%d,%d,%d] / trdid = %x\n", |
---|
58 | index , x , y , p, (uint32_t)trdid_iqzz[index] ); |
---|
59 | |
---|
60 | |
---|
61 | uint32_t image = index; |
---|
62 | |
---|
63 | while ( image < MAX_IMAGES ) // one image per iteration |
---|
64 | { |
---|
65 | // read the quantization coefs from mwmr_in_quanti (one byte per coef) |
---|
66 | mwmr_read( mwmr_in_quanti , (uint32_t*)QT , 16 ); |
---|
67 | |
---|
68 | #if (DEBUG_IQZZ > 1) |
---|
69 | if ( (index == DEBUG_CLUSTER_INDEX) || (DEBUG_CLUSTER_INDEX == 0XFFFFFFFF) ) |
---|
70 | PRINTF("\nIQZZ[%d] get quantisation coefs for image %d\n" |
---|
71 | "%d %d %d %d %d %d %d %d\n" |
---|
72 | "%d %d %d %d %d %d %d %d\n" |
---|
73 | "%d %d %d %d %d %d %d %d\n" |
---|
74 | "%d %d %d %d %d %d %d %d\n" |
---|
75 | "%d %d %d %d %d %d %d %d\n" |
---|
76 | "%d %d %d %d %d %d %d %d\n" |
---|
77 | "%d %d %d %d %d %d %d %d\n" |
---|
78 | "%d %d %d %d %d %d %d %d\n", |
---|
79 | index , image , |
---|
80 | QT[ 0],QT[ 1],QT[ 2],QT[ 3],QT[ 4],QT[ 5],QT[ 6],QT[ 7], |
---|
81 | QT[ 8],QT[ 9],QT[10],QT[11],QT[12],QT[13],QT[14],QT[15], |
---|
82 | QT[16],QT[17],QT[18],QT[19],QT[20],QT[21],QT[22],QT[23], |
---|
83 | QT[24],QT[25],QT[26],QT[27],QT[28],QT[29],QT[30],QT[31], |
---|
84 | QT[32],QT[33],QT[34],QT[35],QT[36],QT[37],QT[38],QT[39], |
---|
85 | QT[40],QT[41],QT[42],QT[43],QT[44],QT[45],QT[46],QT[47], |
---|
86 | QT[48],QT[49],QT[50],QT[51],QT[52],QT[53],QT[54],QT[55], |
---|
87 | QT[56],QT[57],QT[58],QT[59],QT[60],QT[61],QT[62],QT[63] ); |
---|
88 | #endif |
---|
89 | |
---|
90 | for ( block = 0 ; block < nblocks ; ++block ) |
---|
91 | { |
---|
92 | // read one block from mwmr_in_data (2 bytes per pixel) |
---|
93 | mwmr_read( mwmr_in_data , (uint32_t*)bin , 32 ); |
---|
94 | |
---|
95 | // unquantify & UnZZ each pixel |
---|
96 | for ( i = 0 ; i < 64 ; ++i ) |
---|
97 | { |
---|
98 | bout[G_ZZ[i]] = bin[i] * QT[i]; |
---|
99 | } |
---|
100 | |
---|
101 | // write one block to IDCT / 4 bytes per pixel |
---|
102 | mwmr_write( mwmr_out_data , (uint32_t*)bout , 64 ); |
---|
103 | |
---|
104 | #if (DEBUG_IQZZ > 1) |
---|
105 | if ( (index == DEBUG_CLUSTER_INDEX) || (DEBUG_CLUSTER_INDEX == 0XFFFFFFFF) ) |
---|
106 | PRINTF("\nIQZZ[%d] completes block %d/%d in image %d\n" |
---|
107 | " %d %d %d %d %d %d %d %d\n" |
---|
108 | " %d %d %d %d %d %d %d %d\n" |
---|
109 | " %d %d %d %d %d %d %d %d\n" |
---|
110 | " %d %d %d %d %d %d %d %d\n" |
---|
111 | " %d %d %d %d %d %d %d %d\n" |
---|
112 | " %d %d %d %d %d %d %d %d\n" |
---|
113 | " %d %d %d %d %d %d %d %d\n" |
---|
114 | " %d %d %d %d %d %d %d %d\n", |
---|
115 | index , block , nblocks , image , |
---|
116 | bout[0] , bout[1] , bout[2] , bout[3] , bout[4] , bout[5] , bout[6] , bout[7] , |
---|
117 | bout[8] , bout[9] , bout[10], bout[11], bout[12], bout[13], bout[14], bout[15], |
---|
118 | bout[16], bout[17], bout[18], bout[19], bout[20], bout[21], bout[22], bout[23], |
---|
119 | bout[24], bout[25], bout[26], bout[27], bout[28], bout[29], bout[30], bout[31], |
---|
120 | bout[32], bout[33], bout[34], bout[35], bout[36], bout[37], bout[38], bout[39], |
---|
121 | bout[40], bout[41], bout[42], bout[43], bout[44], bout[45], bout[46], bout[47], |
---|
122 | bout[48], bout[49], bout[50], bout[51], bout[52], bout[53], bout[54], bout[55], |
---|
123 | bout[56], bout[57], bout[58], bout[59], bout[60], bout[61], bout[62], bout[63]); |
---|
124 | #endif |
---|
125 | } // end for blocks |
---|
126 | |
---|
127 | #if DEBUG_IQZZ |
---|
128 | if ( (index == DEBUG_CLUSTER_INDEX) || (DEBUG_CLUSTER_INDEX == 0XFFFFFFFF) ) |
---|
129 | PRINTF("\nIQZZ[%d] completes image %d at cycle %d\n", index , image , giet_proctime() ); |
---|
130 | #endif |
---|
131 | |
---|
132 | image = image + x_size* y_size; |
---|
133 | |
---|
134 | } // end while(1) on images |
---|
135 | |
---|
136 | giet_pthread_exit( "IQZZ completed" ); |
---|
137 | |
---|
138 | } // end iqzz() |
---|
139 | |
---|