Ignore:
Timestamp:
Dec 3, 2015, 4:40:49 PM (9 years ago)
Author:
alain
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/applications/mjpeg/mjpeg.c

    r723 r736  
    2626#include <stdlib.h>
    2727#include "mjpeg.h"
     28#include <mapping_info.h>     // for coprocessor types and modes
    2829
    2930
     
    3940uint32_t         fd;    // file descriptor for the file containing the MJPEG stream
    4041
     42// arrays of pointers on MWMR channels
    4143mwmr_channel_t*  tg_2_demux[256];         // one per cluster
    4244mwmr_channel_t*  demux_2_vld_data[256];   // one per cluster
     
    4648mwmr_channel_t*  iqzz_2_idct[256];        // one per cluster
    4749mwmr_channel_t*  idct_2_libu[256];        // one per cluster
     50
     51// thread trdid ( for pthread_create() and pthread_join() )
     52pthread_t   trdid_tg;
     53pthread_t   trdid_demux[256];             // one per cluster
     54pthread_t   trdid_vld[256];               // one per cluster
     55pthread_t   trdid_iqzz[256];              // one per cluster
     56pthread_t   trdid_idct[256];              // one per cluster
     57pthread_t   trdid_libu[256];              // one per cluster
    4858
    4959user_lock_t      tty_lock;                // lock protecting shared TTY
     
    113123    uint32_t      image_height;
    114124
    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
    119146    {
    120147        strcpy( file_pathname , "/misc/plan_48.mjpg" );
    121148        image_width  = 48;
    122149        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   
    134152    giet_pthread_assert( (image_width == fbf_width) && (image_height == fbf_height) ,
    135153                         "[MJPEG ERROR] image size doesn't fit frame buffer size");
    136154 
     155    PRINTF("\n\n[MJPEG] starts for stream %s\n", file_pathname )
     156
    137157    // compute nblocks_h & nblocks_w
    138158    nblocks_w = fbf_width / 8;
     
    201221
    202222    // 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",
    206226           x_size * y_size * nprocs )
    207227
    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
    216254    uint32_t index;
    217 
    218     // launch all threads : precise mapping is defined in the mjpeg.py file
    219255
    220256    if ( giet_pthread_create( &trdid_tg, NULL, &tg , NULL ) )
    221257    giet_pthread_exit( "error launching thread tg\n");
    222258
    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        }
    239319    }
    240320
     
    244324    { PRINTF("\n[MJPEG ERROR] calling giet_pthread_join() for tg\n" ) }
    245325
    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        }
    262357    }
    263358
Note: See TracChangeset for help on using the changeset viewer.