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

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

Introduce application mjpeg.

File size: 4.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     QTable[64];    // Quantisation Table / 1 byte per pixel
42    int16_t     bufin[64];     // Input data buffer  / 2 bytes per pixel
43    int32_t     bufout[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]\n", index, x, y, p )
58
59    uint32_t image = index;
60
61    while ( image < MAX_IMAGES ) // one image per iteration
62    {
63        // read the quantization coefs from mwmr_in_quanti (one byte per coef)
64        mwmr_read( mwmr_in_quanti , (uint32_t*)QTable , 16 );
65
66#if (DEBUG_IQZZ > 1)
67PRINTF("\nIQZZ[%d] get quantisation coefs for image %d\n", index , image )
68#endif
69
70        for ( block = 0 ; block < nblocks ; ++block ) 
71        {
72            // read one block from mwmr_in_data (2 bytes per pixel)
73            mwmr_read( mwmr_in_data , (uint32_t*)bufin , 32 );
74
75            // unquantify & UnZZ each pixel
76            for ( i = 0 ; i < 64 ; ++i ) 
77            {
78                bufout[G_ZZ[i]] = bufin[i] * QTable[i];
79            }
80   
81            // write one block to IDCT / 4 bytes per pixel
82            mwmr_write( mwmr_out_data , (uint32_t*)bufout , 64 );
83
84#if (DEBUG_IQZZ > 1)
85PRINTF("\nIQZZ[%d] completes block %d/%d in image %d\n", 
86       index , block , nblocks , image )
87PRINTF("  %d  %d  %d  %d  %d  %d  %d  %d\n"
88       "  %d  %d  %d  %d  %d  %d  %d  %d\n"
89       "  %d  %d  %d  %d  %d  %d  %d  %d\n"
90       "  %d  %d  %d  %d  %d  %d  %d  %d\n"
91       "  %d  %d  %d  %d  %d  %d  %d  %d\n"
92       "  %d  %d  %d  %d  %d  %d  %d  %d\n"
93       "  %d  %d  %d  %d  %d  %d  %d  %d\n"
94       "  %d  %d  %d  %d  %d  %d  %d  %d\n",
95       bufout[0] , bufout[1] , bufout[2] , bufout[3] , bufout[4] , bufout[5] , bufout[6] , bufout[7] ,
96       bufout[8] , bufout[9] , bufout[10], bufout[11], bufout[12], bufout[13], bufout[14], bufout[15],
97       bufout[16], bufout[17], bufout[18], bufout[19], bufout[20], bufout[21], bufout[22], bufout[23],
98       bufout[24], bufout[25], bufout[26], bufout[27], bufout[28], bufout[29], bufout[30], bufout[31],
99       bufout[32], bufout[33], bufout[34], bufout[35], bufout[36], bufout[37], bufout[38], bufout[39],
100       bufout[40], bufout[41], bufout[42], bufout[43], bufout[44], bufout[45], bufout[46], bufout[47],
101       bufout[48], bufout[49], bufout[50], bufout[51], bufout[52], bufout[53], bufout[54], bufout[55],
102       bufout[56], bufout[57], bufout[58], bufout[59], bufout[60], bufout[61], bufout[62], bufout[63])
103#endif
104        }  // end for blocks
105
106#if DEBUG_IQZZ
107PRINTF("\nIQZZ[%d] completes image %d at cycle %d\n", index , image , giet_proctime() )
108#endif
109
110        image = image + x_size* y_size;
111
112    } // end while(1) on images
113
114    giet_pthread_exit( "iqzz completed" );
115
116} // end iqzz()
117
Note: See TracBrowser for help on using the repository browser.