Changeset 736 for soft/giet_vm/applications/mjpeg/mjpeg.c
- Timestamp:
- Dec 3, 2015, 4:40:49 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/applications/mjpeg/mjpeg.c
r723 r736 26 26 #include <stdlib.h> 27 27 #include "mjpeg.h" 28 #include <mapping_info.h> // for coprocessor types and modes 28 29 29 30 … … 39 40 uint32_t fd; // file descriptor for the file containing the MJPEG stream 40 41 42 // arrays of pointers on MWMR channels 41 43 mwmr_channel_t* tg_2_demux[256]; // one per cluster 42 44 mwmr_channel_t* demux_2_vld_data[256]; // one per cluster … … 46 48 mwmr_channel_t* iqzz_2_idct[256]; // one per cluster 47 49 mwmr_channel_t* idct_2_libu[256]; // one per cluster 50 51 // thread trdid ( for pthread_create() and pthread_join() ) 52 pthread_t trdid_tg; 53 pthread_t trdid_demux[256]; // one per cluster 54 pthread_t trdid_vld[256]; // one per cluster 55 pthread_t trdid_iqzz[256]; // one per cluster 56 pthread_t trdid_idct[256]; // one per cluster 57 pthread_t trdid_libu[256]; // one per cluster 48 58 49 59 user_lock_t tty_lock; // lock protecting shared TTY … … 113 123 uint32_t image_height; 114 124 115 PRINTF("\n[MJPEG] enter path for JPEG stream file\n> "); 116 giet_tty_gets( file_pathname , 256 ); 117 118 if ( file_pathname[0] == 0 ) 125 if ( INTERACTIVE_MODE ) 126 { 127 PRINTF("\n[MJPEG] enter path for JPEG stream file (default is plan_48.mjpg)\n> ") 128 giet_tty_gets( file_pathname , 256 ); 129 130 if ( file_pathname[0] == 0 ) 131 { 132 strcpy( file_pathname , "/misc/plan_48.mjpg" ); 133 image_width = 48; 134 image_height = 48; 135 } 136 else 137 { 138 PRINTF("\n[MJPEG] enter image width\n> ") 139 giet_tty_getw( &image_width ); 140 PRINTF("\n[MJPEG] enter image height\n> ") 141 giet_tty_getw( &image_height ); 142 PRINTF("\n") 143 } 144 } 145 else 119 146 { 120 147 strcpy( file_pathname , "/misc/plan_48.mjpg" ); 121 148 image_width = 48; 122 149 image_height = 48; 123 PRINTF("\n\n[MJPEG] use /misc/plan_48.mjpg\n" ); 124 } 125 else 126 { 127 PRINTF("\n[MJPEG] enter image width\n> "); 128 giet_tty_getw( &image_width ); 129 PRINTF("\n[MJPEG] enter image height\n> "); 130 giet_tty_getw( &image_height ); 131 PRINTF("\n"); 132 } 133 150 } 151 134 152 giet_pthread_assert( (image_width == fbf_width) && (image_height == fbf_height) , 135 153 "[MJPEG ERROR] image size doesn't fit frame buffer size"); 136 154 155 PRINTF("\n\n[MJPEG] starts for stream %s\n", file_pathname ) 156 137 157 // compute nblocks_h & nblocks_w 138 158 nblocks_w = fbf_width / 8; … … 201 221 202 222 // start CMA channel 203 giet_fbf_cma_start( 204 205 PRINTF("\n[MJPEG] main thread completes initialisation for %d cores\n", 223 giet_fbf_cma_start(); 224 225 PRINTF("\n[MJPEG] main thread completes initialisation for %d cores\n", 206 226 x_size * y_size * nprocs ) 207 227 208 // thread trdid for pthread_create() and pthread_join() 209 pthread_t trdid_tg; 210 pthread_t trdid_demux[256]; 211 pthread_t trdid_vld[256]; 212 pthread_t trdid_iqzz[256]; 213 pthread_t trdid_idct[256]; 214 pthread_t trdid_libu[256]; 215 228 mwmr_channel_t* ptr; 229 230 for ( n = 0 ; n < x_size*y_size ; n++ ) 231 { 232 ptr = tg_2_demux[n]; 233 PRINTF(" - tg_2_demux[%d] = %x / &lock = %x / &buf = %x / size = %d\n", 234 n, ptr, (uint32_t)&ptr->lock, (uint32_t)ptr->data, ptr->depth<<2 ) 235 236 ptr = demux_2_vld_data[n]; 237 PRINTF(" - demux_2_vld[%d] = %x / &lock = %x / &buf = %x / size = %d\n", 238 n, ptr, (uint32_t)&ptr->lock, (uint32_t)ptr->data, ptr->depth<<2 ) 239 240 ptr = vld_2_iqzz[n]; 241 PRINTF(" - vld_2_iqzz[%d] = %x / &lock = %x / &buf = %x / size = %d\n", 242 n, ptr, (uint32_t)&ptr->lock, (uint32_t)ptr->data, ptr->depth<<2 ) 243 244 ptr = iqzz_2_idct[n]; 245 PRINTF(" - iqzz_2_idct[%d] = %x / &lock = %x / &buf = %x / size = %d\n", 246 n, ptr, (uint32_t)&ptr->lock, (uint32_t)ptr->data, ptr->depth<<2 ) 247 248 ptr = idct_2_libu[n]; 249 PRINTF(" - idct_2_libu[%d] = %x / &lock = %x / &buf = %x / size = %d\n", 250 n, ptr, (uint32_t)&ptr->lock, (uint32_t)ptr->data, ptr->depth<<2 ) 251 } 252 253 // launch all threads : precise mapping is defined in the mjpeg.py file 216 254 uint32_t index; 217 218 // launch all threads : precise mapping is defined in the mjpeg.py file219 255 220 256 if ( giet_pthread_create( &trdid_tg, NULL, &tg , NULL ) ) 221 257 giet_pthread_exit( "error launching thread tg\n"); 222 258 223 for ( index = 0 ; index < (x_size * y_size) ; index++ ) 224 { 225 if ( giet_pthread_create( &trdid_demux[index], NULL, &demux , (void*)index ) ) 226 giet_pthread_exit( "error launching thread demux\n"); 227 228 if ( giet_pthread_create( &trdid_vld[index], NULL, &vld , (void*)index ) ) 229 giet_pthread_exit( "error launching thread vld\n"); 230 231 if ( giet_pthread_create( &trdid_iqzz[index], NULL, &iqzz , (void*)index ) ) 232 giet_pthread_exit( "error launching thread iqzz"); 233 234 if ( giet_pthread_create( &trdid_idct[index], NULL, &idct , (void*)index ) ) 235 giet_pthread_exit( "error launching thread idct\n"); 236 237 if ( giet_pthread_create( &trdid_libu[index], NULL, &libu , (void*)index ) ) 238 giet_pthread_exit( "error launching thread libu\n"); 259 for ( x = 0 ; x < x_size ; x++ ) 260 { 261 for ( y = 0 ; y < y_size ; y++ ) 262 { 263 index = x * y_size + y; 264 265 // DEMUX 266 if ( giet_pthread_create( &trdid_demux[index], NULL, &demux , (void*)index ) ) 267 giet_pthread_exit( "error launching thread demux\n"); 268 269 // VLD 270 if ( giet_pthread_create( &trdid_vld[index], NULL, &vld , (void*)index ) ) 271 giet_pthread_exit( "error launching thread vld\n"); 272 273 // IQZZ 274 if ( giet_pthread_create( &trdid_iqzz[index], NULL, &iqzz , (void*)index ) ) 275 giet_pthread_exit( "error launching thread iqzz"); 276 277 // IDCT 278 if ( USE_DCT_COPROC ) // allocate, initialise, and start hardware coprocessor 279 { 280 giet_coproc_channel_t in_channel; 281 giet_coproc_channel_t out_channel; 282 uint32_t cluster_xy = (x<<4) + y; 283 uint32_t coproc_type = 2; 284 uint32_t info; 285 286 // allocate DCT coprocessor 287 giet_coproc_alloc( cluster_xy , coproc_type , &info ); 288 289 // initialize channels 290 in_channel.channel_mode = MODE_MWMR; 291 in_channel.buffer_size = (iqzz_2_idct[index]->depth)<<2; 292 in_channel.buffer_vaddr = (uint32_t)(iqzz_2_idct[index]->data); 293 in_channel.status_vaddr = (uint32_t)(&iqzz_2_idct[index]->sts); 294 in_channel.lock_vaddr = (uint32_t)(&iqzz_2_idct[index]->lock); 295 296 giet_coproc_channel_init( cluster_xy , coproc_type , 0 , &in_channel ); 297 298 out_channel.channel_mode = MODE_MWMR; 299 out_channel.buffer_size = (idct_2_libu[index]->depth)<<2; 300 out_channel.buffer_vaddr = (uint32_t)(idct_2_libu[index]->data); 301 out_channel.status_vaddr = (uint32_t)(&idct_2_libu[index]->sts); 302 out_channel.lock_vaddr = (uint32_t)(&idct_2_libu[index]->lock); 303 304 giet_coproc_channel_init( cluster_xy , coproc_type , 1 , &out_channel ); 305 306 // start coprocessor 307 giet_coproc_run( cluster_xy , coproc_type ); 308 } 309 else // launches a software thread 310 { 311 if ( giet_pthread_create( &trdid_idct[index], NULL, &idct , (void*)index ) ) 312 giet_pthread_exit( "error launching thread idct\n"); 313 } 314 315 // LIBU 316 if ( giet_pthread_create( &trdid_libu[index], NULL, &libu , (void*)index ) ) 317 giet_pthread_exit( "error launching thread libu\n"); 318 } 239 319 } 240 320 … … 244 324 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for tg\n" ) } 245 325 246 for ( index = 0 ; index < (x_size * y_size) ; index++ ) 247 { 248 if ( giet_pthread_join( trdid_demux[index] , NULL ) ) 249 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for demux[%d]\n", index ) } 250 251 if ( giet_pthread_join( trdid_vld[index] , NULL ) ) 252 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for vld[%d]\n", index ) } 253 254 if ( giet_pthread_join( trdid_iqzz[index] , NULL ) ) 255 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for iqzz[%d]\n", index ) } 256 257 if ( giet_pthread_join( trdid_idct[index] , NULL ) ) 258 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for idct[%d]\n", index ) } 259 260 if ( giet_pthread_join( trdid_libu[index] , NULL ) ) 261 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for libu[%d]\n", index ) } 326 for ( x = 0 ; x < x_size ; x++ ) 327 { 328 for ( y = 0 ; y < y_size ; y++ ) 329 { 330 index = x * y_size + y; 331 332 if ( giet_pthread_join( trdid_demux[index] , NULL ) ) 333 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for demux[%d]\n", index ) } 334 335 if ( giet_pthread_join( trdid_vld[index] , NULL ) ) 336 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for vld[%d]\n", index ) } 337 338 if ( giet_pthread_join( trdid_iqzz[index] , NULL ) ) 339 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for iqzz[%d]\n", index ) } 340 341 if ( USE_DCT_COPROC == 0 ) 342 { 343 if ( giet_pthread_join( trdid_idct[index] , NULL ) ) 344 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for idct[%d]\n", index ) } 345 } 346 347 if ( giet_pthread_join( trdid_libu[index] , NULL ) ) 348 { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for libu[%d]\n", index ) } 349 350 if ( USE_DCT_COPROC ) 351 { 352 uint32_t cluster_xy = (x<<4) + y; 353 uint32_t coproc_type = 2; 354 giet_coproc_release( cluster_xy , coproc_type ); 355 } 356 } 262 357 } 263 358
Note: See TracChangeset
for help on using the changeset viewer.