tskProcess.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:15k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <std.h>
  2. #include <tsk.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <csl.h>
  6. #include <csl_cache.h>
  7. #include <csl_dat.h>
  8. #include <chan.h>
  9. #include <scom.h>
  10. #include <utl.h>
  11. #include <ialg.h>
  12. #include "fvid.h"
  13. #include "celljpegenc_ti.h"
  14. #include "celljpegdec_ti.h"
  15. #include "appmain.h"
  16. #include "appThreads.h"
  17. #include "tskProcess.h"
  18. #include "appBiosObjects.h"
  19. #include "netmain.h" /*change*/
  20. //#include "cap_dis_size.h"
  21. IJPEGENC_Params   jpegencParams;
  22. IJPEGDEC_Params   jpegdecParams;
  23. #pragma DATA_SECTION(jpg_img,   ".user_data_ext")
  24. #pragma DATA_ALIGN( jpg_img,   128)
  25. unsigned char jpg_img[128 * 2000];
  26. #pragma DATA_ALIGN(dec_out_y, 128);
  27. #pragma DATA_ALIGN(dec_out_u, 128);
  28. #pragma DATA_ALIGN(dec_out_v, 128);
  29. unsigned char dec_out_y[720 * 480];
  30. unsigned char dec_out_u[360 * 240];
  31. unsigned char dec_out_v[360 * 240];
  32. static Void checkMsg();
  33. /*
  34. // Simple Motion Detection
  35. //
  36. // This code puts "sensors" on the screen and checks them
  37. // for change in intensity. A sensor is "tripped" when
  38. // there is a change in intensity beyond a set threshold.
  39. //
  40. */
  41. #define SPACING         40    /* Pixel spacing of "sensor" */
  42. #define YDELTATHRESH    12    /* Max delta Y the will not trip "sensor" */
  43. #define PIXPERSAMPLE    2     /* Number of pixels per sample location */
  44. #define SENSBUFSIZE     128*4 /* Must be multiple of 128 & large enough */
  45. #define XPIX            (720/SPACING)
  46. #define YPIX            (480/SPACING)
  47. #define PIXOFF(n)       ((n*SPACING)+(SPACING/2))
  48. #define SAMPLES         (XPIX*YPIX)
  49. #if (SAMPLES*PIXPERSAMPLE) > SENSBUFSIZE
  50. #error "BUFFER SIZE"
  51. #endif
  52. #pragma DATA_SECTION(img_sum1,  ".user_data_ext")
  53. #pragma DATA_ALIGN( img_sum1,   128)
  54. unsigned char img_sum1[SENSBUFSIZE];
  55. #pragma DATA_SECTION(img_sum2,   ".user_data_ext")
  56. #pragma DATA_ALIGN( img_sum2,   128)
  57. unsigned char img_sum2[SENSBUFSIZE];
  58. unsigned char *img_sum[2] = { img_sum1, img_sum2 };
  59. #pragma DATA_SECTION(dec_data, ".user_data_ext")
  60. #pragma DATA_ALIGN( dec_data,   128)
  61. unsigned char dec_data[SENSBUFSIZE];
  62. #pragma DATA_SECTION(tag_data, ".user_data_ext")
  63. #pragma DATA_ALIGN( tag_data,   128)
  64. unsigned char tag_data[384 * 32];
  65. #define TAGPITCH    336
  66. extern unsigned char charset;
  67. static void drawchar( unsigned char *ps, unsigned char c )
  68. {
  69.     int y,i;
  70.     unsigned char cdata;
  71.     unsigned char *pc = &charset + ((c-32)*16);
  72.     for( y=0; y<16; y++ )
  73.     {
  74.         cdata = *pc++;
  75.         for(i=0; i<8; i++)
  76.         {
  77.             if( cdata & 1 )
  78.             {
  79.                 *(ps) = 0xFF;
  80.                 *(ps+1) = 0xFF;
  81.                 *(ps+TAGPITCH) = 0xFF;
  82.                 *(ps+TAGPITCH+1) = 0xFF;
  83.             }
  84.             cdata >>= 1;
  85.             ps += 2;
  86.         }
  87.         ps += TAGPITCH*2 - 16;
  88.     }
  89. }
  90. static void drawstring( unsigned char *pBuf, char *pString )
  91. {
  92.     unsigned char c;
  93.     while( c = *pString++ )
  94.     {
  95.         drawchar( pBuf, c );
  96.         pBuf += 16;
  97.     }
  98. }
  99. static void tagScreen( unsigned char *pY )
  100. {
  101.     int y;
  102.     uint ms;
  103.     struct tm *ptm;
  104.     time_t secs;
  105.     char str[32];
  106.     secs = llTimerGetTime(&ms) + netcmdArgs[CMD_SETCLOCK];
  107.     ptm = localtime(&secs);
  108.     if( ptm->tm_year >= 30 )
  109.         ptm->tm_year -= 30;
  110.     else
  111.         ptm->tm_year += 70;
  112.     sprintf( str, "%02d/%02d/%02d %02d:%02d:%02d:%02d",
  113.         ptm->tm_mon+1, ptm->tm_mday, ptm->tm_year,
  114.         ptm->tm_hour, ptm->tm_min, ptm->tm_sec, ms/10 );
  115.     memset( tag_data, 0, 384 * 32);
  116.     drawstring( tag_data+8, str );
  117.     OEMCacheClean( tag_data, TAGPITCH*32 );
  118.     OEMCacheCleanSynch();
  119.     for( y=0; y<32; y++ )
  120.         DAT_copy( tag_data+(TAGPITCH*y), pY+(720*424)+(720*y)+32, TAGPITCH );
  121. }
  122. static int checkMotion( unsigned char *pY )
  123. {
  124.     static int idx = 0;
  125.     int x,y,i;
  126.     idx ^= 1;
  127.     OEMCacheClean( img_sum[idx], SAMPLES*PIXPERSAMPLE );
  128.     OEMCacheCleanSynch();
  129.     i = 0;
  130.     for( y=0; y<YPIX; y++ )
  131.         for( x=0; x<XPIX; x++ )
  132.         {
  133.             DAT_copy( pY + PIXOFF(x) + (PIXOFF(y)*720),
  134.                       img_sum[idx] + i, PIXPERSAMPLE );
  135.             i += PIXPERSAMPLE;
  136.         }
  137.     x = 0;
  138.     if( !netcmdArgs[CMD_SHOWDOTS] )
  139.     {
  140.         for( i=0; i<SAMPLES * PIXPERSAMPLE; i++ )
  141.         {
  142.             y = (int)img_sum1[i] - (int)img_sum2[i];
  143.             if( y < -YDELTATHRESH || y > YDELTATHRESH )
  144.                 x++;
  145.         }
  146.     }
  147.     else
  148.     {
  149.         for( i=0; i<SAMPLES * PIXPERSAMPLE; i++ )
  150.         {
  151.             y = (int)img_sum1[i] - (int)img_sum2[i];
  152.             if( y < -YDELTATHRESH || y > YDELTATHRESH )
  153.             {
  154.                 x++;
  155.                 dec_data[i] = 0xFF;
  156.             }
  157.             else
  158.             {
  159.                 dec_data[i] = 0x0;
  160.             }
  161.         }
  162.     }
  163.     // Return change in "tenths of percent"
  164.     return( (x*1000)/(SAMPLES*PIXPERSAMPLE) );
  165. }
  166. static void showMotion( unsigned char *pY )
  167. {
  168.     int x,y,i;
  169.     OEMCacheClean( dec_data, SAMPLES*PIXPERSAMPLE );
  170.     OEMCacheCleanSynch();
  171.     i = 0;
  172.     for( y=0; y<YPIX; y++ )
  173.         for( x=0; x<XPIX; x++ )
  174.         {
  175.             DAT_copy( dec_data + i, pY + PIXOFF(x) + (PIXOFF(y)*720),
  176.                       PIXPERSAMPLE );
  177.             i += PIXPERSAMPLE;
  178.         }
  179. }
  180. ThrProcess thrProcess;
  181. void tskProcessInit()
  182. {
  183.     int chanNum;
  184.     ICELL_Obj  *cell;
  185.     ICC_Handle  inputIcc;
  186.     ICC_Handle  outputIcc;
  187.     /*----------------------------------------------------*/
  188.     /* Call JPEG specific user initialization if any.     */
  189.     /*----------------------------------------------------*/
  190.     JPEGENC_TI_init();
  191.     JPEGDEC_TI_init();
  192.     /*----------------------------------------------------*/
  193.     /* Set up params for all XDAIS algorithms.            */
  194.     /*----------------------------------------------------*/
  195.     jpegencParams = IJPEGENC_PARAMS;
  196.     jpegdecParams = IJPEGDEC_PARAMS;
  197.     for (chanNum = 0; chanNum < PROCESSNUMCHANNELS ; chanNum++)
  198.     {
  199.         /*
  200.          * JPEGENC: create an input and output linear ICC:
  201.          * The address to the ICC's will be set in the thrProcessRun()
  202.          * function via the ICC_setBuf().
  203.          */
  204.         ICELL_Obj   defaultCell = ICELL_DEFAULT;
  205.         cell = &thrProcess.cellListEncode[(chanNum*PROCESSNUMCELLS) + 0];
  206.         *cell                = defaultCell;
  207.         cell->name           = "JPEGENC";
  208.         cell->cellFxns       = &JPEGENC_CELLFXNS;
  209.         cell->algFxns        = (IALG_Fxns *)&JPEGENC_IJPEGENC;
  210.         cell->algParams      = (IALG_Params *)&IJPEGENC_PARAMS;
  211.         cell->scrBucketIndex = THRIOSSCRBUCKET;
  212.         inputIcc  = (ICC_Handle)ICC_linearCreate(NULL, 0);
  213.         UTL_assert( inputIcc != NULL);
  214.         outputIcc = (ICC_Handle)ICC_linearCreate(NULL, 0);
  215.         UTL_assert( outputIcc != NULL);
  216.         // Only one input and one output ICC are needed.
  217.         CHAN_regCell( cell, &inputIcc, 1, &outputIcc, 1 );
  218.         // Setup Encode Parameters
  219.         thrProcess.cellListEncode[(chanNum*PROCESSNUMCELLS) + 0].algParams =
  220.                                                 (IALG_Params *)&IJPEGENC_PARAMS;
  221.         UTL_logDebug1("JPEGEncoder registerd Channel Number: %d", chanNum);
  222.         /*
  223.          * JPEGDEC: create an input and output linear ICC:
  224.          * The address to the ICC's will be set in the thrProcessRun()
  225.          * function via the ICC_setBuf().
  226.          */
  227.         cell = &thrProcess.cellListDecode[(chanNum*PROCESSNUMCHANNELS) + 0];
  228.         *cell                = defaultCell;
  229.         cell->name           = "JPEGDEC";
  230.         cell->cellFxns       = &JPEGDEC_CELLFXNS;
  231.         cell->algFxns        = (IALG_Fxns *)&JPEGDEC_IJPEGDEC;
  232.         cell->algParams      = (IALG_Params *)&IJPEGDEC_PARAMS;
  233.         cell->scrBucketIndex = THRIOSSCRBUCKET;
  234.         inputIcc  = (ICC_Handle)ICC_linearCreate(NULL, 0);
  235.         UTL_assert( inputIcc != NULL);
  236.         outputIcc = (ICC_Handle)ICC_linearCreate(NULL, 0);
  237.         UTL_assert( outputIcc != NULL);
  238.         // Only one input and one output ICC are needed.
  239.         CHAN_regCell( cell, &inputIcc, 1, &outputIcc, 1 );
  240.         // Setup Decode Parameters
  241.         thrProcess.cellListDecode[(chanNum*PROCESSNUMCELLS) + 0].algParams =
  242.                                                (IALG_Params *)&IJPEGDEC_PARAMS;
  243.         UTL_logDebug1("JPEGDecoder registerd Channel Number: %d", chanNum);
  244.     }
  245.     memset(dec_out_y, 0x0,  sizeof(dec_out_y));
  246.     memset(dec_out_u, 0x80, sizeof(dec_out_u));
  247.     memset(dec_out_v, 0x80, sizeof(dec_out_v));
  248.     CACHE_clean(CACHE_L2ALL, 0, 0);
  249.     CACHE_clean(CACHE_L2ALL, 0, 0);
  250. }
  251. void tskProcessStart()
  252. {
  253.     int chanNum;
  254.     for( chanNum=0; chanNum < PROCESSNUMCHANNELS; chanNum++ )
  255.     {
  256.         // open the encode channel: this causes the algorithms to be created
  257.         CHAN_open( &thrProcess.chanListEncode[chanNum],
  258.                    &thrProcess.cellListEncode[(chanNum*PROCESSNUMCELLS)],
  259.                    PROCESSNUMCELLS, NULL );
  260.         // open the decode channel: this causes the algorithms to be created
  261.         CHAN_open( &thrProcess.chanListDecode[chanNum],
  262.                    &thrProcess.cellListDecode[(chanNum*PROCESSNUMCELLS)],
  263.                    PROCESSNUMCELLS, NULL );
  264.     }
  265. }
  266. static Void checkMsg()
  267. {
  268.     CtrlMsg rxMsg;
  269.     Int index;
  270.     Int quality;
  271.     ICELL_Handle handle;
  272.     IJPEGENC_Params jpegencParams;
  273.     int cell_no;
  274.     // check message in "mbxProc"
  275.     while( MBX_pend( &mbxProcess, &rxMsg, 0) )
  276.     {
  277.         switch (rxMsg.cmd)
  278.         {
  279.             case MSGFRAMECHANGE:  // frame ratio value changed
  280.             {
  281.                 index = rxMsg.arg1;  // get the index number
  282.                 UTL_assert( (index >= 0) && (index < PROCESSNUMCHANNELS));
  283.                 // update the local value
  284.                 if (index < PROCESSNUMCHANNELS)
  285.                     thrProcess.frameRateControl[index] = rxMsg.arg2;
  286.                 break;
  287.             }
  288.             case MSGQUALCHANGE: //quality rate value changed
  289.             {
  290.                 index = rxMsg.arg1;  // get the index number
  291.                 UTL_assert( (index >= 0) && (index < PROCESSNUMCHANNELS));
  292.                 if (index < PROCESSNUMCHANNELS)
  293.                 {
  294.                     jpegencParams =  IJPEGENC_PARAMS;
  295.                     cell_no = rxMsg.arg2;
  296.                     UTL_assert( (cell_no >= 0) && (cell_no < PROCESSNUMCELLS));
  297.                     quality = rxMsg.arg3;
  298.                     UTL_assert( (quality >= 0) &&
  299.                                  (quality <= 100));
  300.                     jpegencParams.quality = quality;
  301.                     if ((quality > 0) && (quality <= 100))
  302.                     {
  303.                        handle = &(thrProcess.cellListEncode[index]);
  304.                        thrProcess.cellListEncode[cell_no].cellFxns->cellControl
  305.                        (
  306.                            handle,
  307.                           (IALG_Cmd) (IJPEG_SETSTATUS),
  308.                           (IALG_Status*)(&(jpegencParams))
  309.                        );
  310.                     }
  311.                }
  312.                break;
  313.             }
  314.             default:
  315.                 break;
  316.         }
  317.     }
  318. }
  319. extern int SystemReady;
  320. void tskProcess()
  321. {
  322.     int i;
  323.     ScomMessage *pMsgBuf;
  324.     ScomMessage scomMsg;
  325.     void *inBuf[3];
  326.     void *outBuf[3];
  327.     int  jpg_size;
  328.     int framenum=0;
  329.     CHAN_Handle chanHandle;
  330.     SCOM_Handle fromInputtoProc,fromProctoInput;
  331.     SCOM_Handle fromOuttoProc,fromProctoOut;
  332.     SCOM_Handle fromNettoProc,fromProctoNet;
  333.     fromInputtoProc = SCOM_open("INTOPROC");
  334.     fromProctoInput = SCOM_open("PROCTOIN");
  335.     fromProctoOut   = SCOM_open("PROCTOOUT");
  336.     fromOuttoProc   = SCOM_open("OUTTOPROC");
  337.     fromProctoNet   = SCOM_open("PROCTONET");
  338.     fromNettoProc   = SCOM_open("NETTOPROC");
  339.     while(1)
  340.     {
  341.         checkMsg();
  342.         framenum++;
  343.         for(i=0; i<PROCESSNUMCHANNELS; i++)
  344.         {
  345.             // Get Input Buffer
  346.             pMsgBuf = SCOM_getMsg(fromInputtoProc, SYS_FOREVER);
  347.             // If we're skipping this frame, just give the SCOM msg
  348.             // back to the input function and continue the for loop.
  349.             if( thrProcess.frameRateControl[i] != 0 &&
  350.                 (framenum % thrProcess.frameRateControl[i]) )
  351.             {
  352.                 // Tell the capture routine we're done
  353.                 SCOM_putMsg(fromProctoInput,pMsgBuf);
  354.                 continue;
  355.             }
  356.             if( netcmdArgs[CMD_SHOWCLOCK] )
  357.                 tagScreen( pMsgBuf->bufY );
  358.             //
  359.             // Handle Encode Channel
  360.             //
  361.             chanHandle = &thrProcess.chanListEncode[i];
  362.             chanHandle->state = CHAN_ACTIVE;
  363.             // Channel Input
  364.             inBuf[0] = pMsgBuf->bufY;
  365.             inBuf[1] = pMsgBuf->bufU;
  366.             inBuf[2] = pMsgBuf->bufV;
  367.             ICC_setBuf( chanHandle->cellSet[0].inputIcc[0],
  368.                         inBuf, sizeof(void *) * 3 );
  369.             // Channel Output
  370.             outBuf[0] = &jpg_size;
  371.             outBuf[1] = jpg_img;
  372.             ICC_setBuf( chanHandle->cellSet[0].outputIcc[0],
  373.                         outBuf, sizeof(void *) * 2 );
  374.             // Execute Channel
  375.             CHAN_execute( chanHandle, framenum );
  376.             //
  377.             // Pass JPG to network task
  378.             //
  379.             scomMsg.sizeLinear = jpg_size;
  380.             scomMsg.motion = checkMotion( pMsgBuf->bufY );
  381.             scomMsg.bufLinear  = jpg_img;
  382.             // Tell the capture routine we're done with its buffer
  383.             SCOM_putMsg( fromProctoInput, pMsgBuf );
  384.             // Give the JPG to networking
  385.             SCOM_putMsg( fromProctoNet, &scomMsg );
  386.             // Get our message buffer back from networking
  387.             pMsgBuf = SCOM_getMsg( fromNettoProc, SYS_FOREVER );
  388.             // JPG size may have changed
  389.             jpg_size = pMsgBuf->sizeLinear;
  390.             if( !jpg_size )
  391.                 continue;
  392.             //
  393.             // Handle Decode Channel
  394.             //
  395.             chanHandle = &thrProcess.chanListDecode[i];
  396.             chanHandle->state = CHAN_ACTIVE;
  397.             inBuf[0] = &jpg_size;
  398.             inBuf[1] = jpg_img;
  399.             ICC_setBuf( chanHandle->cellSet[0].inputIcc[0],
  400.                         inBuf, sizeof(void *) * 2 );
  401.             outBuf[0] = (void *)dec_out_y;
  402.             outBuf[1] = (void *)dec_out_u;
  403.             outBuf[2] = (void *)dec_out_v;
  404.             ICC_setBuf( chanHandle->cellSet[0].outputIcc[0],
  405.                         outBuf, sizeof(void *) * 3 );
  406.             // Execute Channel
  407.             CHAN_execute( chanHandle, framenum );
  408.             if( netcmdArgs[CMD_SHOWDOTS] )
  409.                 showMotion( dec_out_y );
  410.             // Send the buffer to the display task
  411.             scomMsg.bufY = (void *)dec_out_y;
  412.             scomMsg.bufU = (void *)dec_out_u;
  413.             scomMsg.bufV = (void *)dec_out_v;
  414.             SCOM_putMsg( fromProctoOut, &scomMsg );
  415.             // Get our message buffer back from display
  416.             SCOM_getMsg(fromOuttoProc, SYS_FOREVER);
  417.         }
  418.     }
  419. }