1 | ///////////////////////////////////////////////////////////////////////////////////////// |
---|
2 | // File : libu.c |
---|
3 | // Date : octobre 2015 |
---|
4 | // author : Alain Greiner |
---|
5 | ///////////////////////////////////////////////////////////////////////////////////////// |
---|
6 | // This file define the code of the LIBU (line building) thread for MJPEG application. |
---|
7 | // This function execute an infinite loop on a stream of decompressed images. |
---|
8 | // The image size is fbf_width * fbf_height pixels. Each pixel is one byte. |
---|
9 | // The LIBU[index] thread read all blocks of a given image to fill its private |
---|
10 | // bufout[index] buffer, that is part of a FBF_CMA chbuf. |
---|
11 | // For each image: |
---|
12 | // - it checks that buf_out[index] is empty (released by the CMA peripheral). |
---|
13 | // - it move all blocks fom the input MWMR channel to the bufout[index] buffer. |
---|
14 | // - it request the CMA peripheral to display the image stored in bufout[index] |
---|
15 | // - It register the date of display in the date[] array for intrumentation. |
---|
16 | ///////////////////////////////////////////////////////////////////////////////////////// |
---|
17 | |
---|
18 | #include <stdio.h> |
---|
19 | #include <mwmr_channel.h> |
---|
20 | #include <stdint.h> |
---|
21 | #include <stdlib.h> |
---|
22 | #include "mjpeg.h" |
---|
23 | |
---|
24 | // macro to use a shared TTY |
---|
25 | #define PRINTF(...) lock_acquire( &tty_lock ); \ |
---|
26 | giet_tty_printf(__VA_ARGS__); \ |
---|
27 | lock_release( &tty_lock ); |
---|
28 | |
---|
29 | ////////////////////////////////////////////////////////////// |
---|
30 | __attribute__ ((constructor)) void libu( unsigned int index ) |
---|
31 | ////////////////////////////////////////////////////////////// |
---|
32 | { |
---|
33 | mwmr_channel_t* input = idct_2_libu[index]; |
---|
34 | |
---|
35 | uint32_t time; |
---|
36 | |
---|
37 | uint8_t bufin[64]; |
---|
38 | uint32_t line; |
---|
39 | uint32_t column; |
---|
40 | |
---|
41 | // get platform parameters |
---|
42 | uint32_t x_size; |
---|
43 | uint32_t y_size; |
---|
44 | uint32_t nprocs; |
---|
45 | giet_procs_number( &x_size , &y_size , &nprocs ); |
---|
46 | |
---|
47 | // get processor coordinates |
---|
48 | unsigned int x , y , p; |
---|
49 | giet_proc_xyp( &x ,&y , &p ); |
---|
50 | |
---|
51 | // private TTY allocation |
---|
52 | // giet_tty_alloc( 0 ); |
---|
53 | |
---|
54 | PRINTF("\n[MJPEG] thread LIBU[%d] starts on P[%d,%d,%d] / trdid = %x\n", |
---|
55 | index , x , y , p, (uint32_t)trdid_libu[index] ) |
---|
56 | |
---|
57 | uint32_t image = index; |
---|
58 | |
---|
59 | while( image < MAX_IMAGES ) // one image per iteration |
---|
60 | { |
---|
61 | // check CMA buffer empty |
---|
62 | giet_fbf_cma_check( index ); |
---|
63 | |
---|
64 | // two loops on blocks to build image |
---|
65 | for ( line = 0 ; line < nblocks_h ; ++line ) |
---|
66 | { |
---|
67 | for ( column = 0 ; column < nblocks_w ; ++column ) |
---|
68 | { |
---|
69 | // move one block from input MWMR channel (one byte per pixel |
---|
70 | mwmr_read( input , (uint32_t*)bufin , 16 ); |
---|
71 | |
---|
72 | // copy block to cma_buf |
---|
73 | unsigned int i; |
---|
74 | unsigned int src; |
---|
75 | unsigned int dst; |
---|
76 | for ( i = 0; i < 8 ; ++i ) |
---|
77 | { |
---|
78 | src = (i * 8); |
---|
79 | dst = ((line * 8 + i) * fbf_width) + (column * 8); |
---|
80 | |
---|
81 | // copy 8 bytes to cma_buf[index] |
---|
82 | memcpy( &cma_buf[index][dst] , &bufin[src] , 8 ); |
---|
83 | } |
---|
84 | |
---|
85 | #if (DEBUG_LIBU > 1) |
---|
86 | if ( (index == DEBUG_CLUSTER_INDEX) || (DEBUG_CLUSTER_INDEX == 0XFFFFFFFF) ) |
---|
87 | { PRINTF("\nLIBU[%d] copy block[%d] for image %d\n", |
---|
88 | index, line * nblocks_w + column , image ) } |
---|
89 | #endif |
---|
90 | } |
---|
91 | |
---|
92 | } // end loops on blocks |
---|
93 | |
---|
94 | // request CMA to display image |
---|
95 | giet_fbf_cma_display( index ); |
---|
96 | |
---|
97 | // get date of display |
---|
98 | time = giet_proctime(); |
---|
99 | |
---|
100 | #if DEBUG_LIBU |
---|
101 | if ( (index == DEBUG_CLUSTER_INDEX) || (DEBUG_CLUSTER_INDEX == 0XFFFFFFFF) ) |
---|
102 | { PRINTF("\nLIBU[%d] completes image %d at cycle %d\n", index , image , time ) } |
---|
103 | #endif |
---|
104 | // register date of display for instrumentation |
---|
105 | date[image] = time; |
---|
106 | |
---|
107 | image = image + x_size*y_size; |
---|
108 | |
---|
109 | } // end while on images |
---|
110 | |
---|
111 | giet_pthread_exit( "LIBU completed" ); |
---|
112 | |
---|
113 | } // end libu() |
---|
114 | |
---|