source: soft/giet_vm/applications/mjpeg/iqzz.c @ 743

Last change on this file since 743 was 736, checked in by alain, 9 years ago

Modify the mjpeg application to support an optional
DCT hardware coprocessor.

File size: 5.4 KB
Line 
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(...)    lock_acquire( &tty_lock ); \
16                       giet_tty_printf(__VA_ARGS__);  \
17                       lock_release( &tty_lock );
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)
69if ( (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)
105if ( (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
128if ( (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
Note: See TracBrowser for help on using the repository browser.