移植opencv 到codec engine 成功

之前网上有个opencv dsp加速之类,是基于c6acces的,比较麻烦,我干脆全部移植到codec当中去。在videnc_copy中成功编译,在dm3730上跑,也成功,速度还好。达芬奇davince平台都可以这样干了。后期在8148上面试试速度。如果达芬奇平台启动时间够快,做车载运用,将是比较好的选择。以下是个测试程序

[cpp] view plain copy print ?
  1. /*  
  2.  * Copyright (c) 2010, Texas Instruments Incorporated 
  3.  * All rights reserved. 
  4.  * 
  5.  * Redistribution and use in source and binary forms, with or without 
  6.  * modification, are permitted provided that the following conditions 
  7.  * are met: 
  8.  * 
  9.  * *  Redistributions of source code must retain the above copyright 
  10.  *    notice, this list of conditions and the following disclaimer. 
  11.  * 
  12.  * *  Redistributions in binary form must reproduce the above copyright 
  13.  *    notice, this list of conditions and the following disclaimer in the 
  14.  *    documentation and/or other materials provided with the distribution. 
  15.  * 
  16.  * *  Neither the name of Texas Instruments Incorporated nor the names of 
  17.  *    its contributors may be used to endorse or promote products derived 
  18.  *    from this software without specific prior written permission. 
  19.  * 
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
  22.  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  23.  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
  24.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  25.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  26.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
  27.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  28.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  29.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
  30.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  31.  *  
  32.  */  
  33. /* 
  34.  *  ======== videnc_copy.c ======== 
  35.  *  Video Encoder "copy" algorithm. 
  36.  * 
  37.  *  This file contains an implementation of the deprecated IVIDENC interface 
  38.  *  as defined by xDM 0.9. 
  39.  */  
  40. #include <xdc/std.h>  
  41. #include <string.h>  
  42.   
  43. #include <ti/xdais/dm/ividenc.h>  
  44. #include <ti/sdo/ce/trace/gt.h>  
  45.   
  46. #include <ti/sdo/ce/Engine.h>  
  47. #include <ti/sdo/ce/osal/Memory.h>  
  48. #include <ti/sdo/ce/CERuntime.h>  
  49.   
  50. #include <ti/bios/include/std.h>  
  51. #include <ti/bios/include/mem.h>  
  52. #include <ti/bios/include/bcache.h>  
  53.   
  54. #include "videnc_copy_ti.h"  
  55. #include "videnc_copy_ti_priv.h"  
  56. #include "cv.h"  
  57. #include "cxcore.h"  
  58.   
  59. /* buffer definitions */  
  60. #define MININBUFS       1  
  61. #define MINOUTBUFS      1  
  62. #define MININBUFSIZE    1  
  63. #define MINOUTBUFSIZE   1  
  64.   
  65.   
  66.   
  67. IplImage* pImg = NULL;   
  68. IplImage* pCannyImg = NULL;  
  69. static Int8 *xxx = NULL;  
  70.   
  71. #define SIZEOFIMG ((320)*(240)*(3)*(sizeof(char)))  
  72.   
  73. static Memory_AllocParams MemParams = {  
  74.         Memory_CONTIGHEAP,  
  75.         Memory_CACHED,  
  76.         8,  
  77.         0  
  78. };  
  79.   
  80. extern IALG_Fxns VIDENCCOPY_TI_IALG;  
  81.   
  82. #define IALGFXNS  \  
  83.         &VIDENCCOPY_TI_IALG,        /* module ID */                         \  
  84.         VIDENCCOPY_TI_activate,     /* activate */                          \  
  85.         VIDENCCOPY_TI_alloc,        /* alloc */                             \  
  86.         NULL,                       /* control (NULL => no control ops) */  \  
  87.         VIDENCCOPY_TI_deactivate,   /* deactivate */                        \  
  88.         VIDENCCOPY_TI_free,         /* free */                              \  
  89.         VIDENCCOPY_TI_initObj,      /* init */                              \  
  90.         NULL,                       /* moved */                             \  
  91.         NULL                        /* numAlloc (NULL => IALG_MAXMEMRECS) */  
  92.   
  93. /* 
  94.  *  ======== VIDENCCOPY_TI_IVIDENC ======== 
  95.  *  This structure defines TI's implementation of the IVIDENC interface 
  96.  *  for the VIDENCCOPY_TI module. 
  97.  */  
  98. IVIDENC_Fxns VIDENCCOPY_TI_VIDENCCOPY = {    /* module_vendor_interface */  
  99.         {IALGFXNS},  
  100.         VIDENCCOPY_TI_process,  
  101.         VIDENCCOPY_TI_control,  
  102. };  
  103.   
  104.   
  105. XDAS_Int16 width;  
  106. XDAS_Int16 height;  
  107. XDAS_UInt8* pResult_rgb_dsp;  
  108. XDAS_UInt8 rectCount =0;  
  109.   
  110.   
  111. /* 
  112.  *  ======== VIDENCCOPY_TI_IALG ======== 
  113.  *  This structure defines TI's implementation of the IALG interface 
  114.  *  for the VIDENCCOPY_TI module. 
  115.  */  
  116. #ifdef _TI_  
  117. /* satisfy xDAIS symbol requirement without any overhead */  
  118. asm("_VIDENCCOPY_TI_IALG .set _VIDENCCOPY_TI_VIDENCCOPY");  
  119.   
  120. #else   
  121.   
  122. /* 
  123.  *  We duplicate the structure here to allow this code to be compiled and 
  124.  *  run non-DSP platforms at the expense of unnecessary data space 
  125.  *  consumed by the definition below. 
  126.  */  
  127. IALG_Fxns VIDENCCOPY_TI_IALG = {      /* module_vendor_interface */  
  128.         IALGFXNS  
  129. };  
  130.   
  131. #endif  
  132.   
  133. /* tracing information */  
  134. #define GTNAME "ti.sdo.ce.examples.codecs.videnc_copy"  
  135. static GT_Mask curTrace = {NULL,NULL};  
  136.   
  137. #ifdef USE_ACPY3  
  138.   
  139. /* Implementation of IDMA3 interface functions & IDMA3_Fxns vtable */  
  140. #include <ti/bios/include/std.h>  
  141. #include <ti/xdais/idma3.h>  
  142. #include <ti/sdo/fc/acpy3/acpy3.h>  
  143.   
  144. #define NUM_LOGICAL_CH 1  
  145.   
  146. /* 
  147.  *  ======== VIDENCCOPY_TI_dmaChangeChannels ======== 
  148.  *  Update instance object with new logical channel. 
  149.  */  
  150. Void VIDENCCOPY_TI_dmaChangeChannels(IALG_Handle handle,  
  151.         IDMA3_ChannelRec dmaTab[])  
  152. {  
  153.     VIDENCCOPY_TI_Obj *videncObj = (Void *)handle;  
  154.   
  155.     GT_2trace(curTrace, GT_ENTER,  
  156.             "VIDENCCOPY_TI_dmaChangeChannels(0x%x, 0x%x)\n", handle, dmaTab);  
  157.   
  158.     videncObj->dmaHandle1D1D8B = dmaTab[0].handle;  
  159. }  
  160.   
  161.   
  162. /* 
  163.  *  ======== VIDENCCOPY_TI_dmaGetChannelCnt ======== 
  164.  *  Return max number of logical channels requested. 
  165.  */  
  166. Uns VIDENCCOPY_TI_dmaGetChannelCnt(Void)  
  167. {  
  168.     GT_0trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaGetChannelCnt()\n");  
  169.   
  170.     return (NUM_LOGICAL_CH);  
  171. }  
  172.   
  173.   
  174. /* 
  175.  *  ======== VIDENCCOPY_TI_dmaGetChannels ======== 
  176.  *  Declare DMA resource requirement/holdings. 
  177.  */  
  178. Uns VIDENCCOPY_TI_dmaGetChannels(IALG_Handle handle, IDMA3_ChannelRec dmaTab[])  
  179. {  
  180.     VIDENCCOPY_TI_Obj *videncObj = (Void *)handle;  
  181.     int i;  
  182.   
  183.     GT_2trace(curTrace, GT_ENTER,  
  184.             "VIDENCCOPY_TI_dmaGetChannels(0x%x, 0x%x)\n", handle, dmaTab);  
  185.   
  186.     /* Initial values on logical channels */  
  187.     dmaTab[0].handle = videncObj->dmaHandle1D1D8B;  
  188.   
  189.     dmaTab[0].numTransfers = 1;  
  190.     dmaTab[0].numWaits = 1;  
  191.   
  192.     /* 
  193.      * Request logical DMA channels for use with ACPY3 
  194.      * AND with environment size obtained from ACPY3 implementation 
  195.      * AND with low priority. 
  196.      */  
  197.     for (i = 0; i < NUM_LOGICAL_CH; i++) {  
  198.         dmaTab[i].priority = IDMA3_PRIORITY_LOW;  
  199.         dmaTab[i].persistent = FALSE;  
  200.         dmaTab[i].protocol = &ACPY3_PROTOCOL;  
  201.     }  
  202.   
  203.     return (NUM_LOGICAL_CH);  
  204. }  
  205.   
  206.   
  207. /* 
  208.  *  ======== VIDENCCOPY_TI_dmaInit ======== 
  209.  *  Initialize instance object with granted logical channel. 
  210.  */  
  211. Int VIDENCCOPY_TI_dmaInit(IALG_Handle handle, IDMA3_ChannelRec dmaTab[])  
  212. {  
  213.     VIDENCCOPY_TI_Obj *videncObj = (Void *)handle;  
  214.   
  215.     GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaInit(0x%x, 0x%x)\n",  
  216.             handle, dmaTab);  
  217.   
  218.     videncObj->dmaHandle1D1D8B = dmaTab[0].handle;  
  219.   
  220.     return (IALG_EOK);  
  221. }  
  222.   
  223.   
  224. /* 
  225.  *  ======== VIDENCCOPY_TI_IDMA3 ======== 
  226.  *  This structure defines TI's implementation of the IDMA3 interface 
  227.  *  for the VIDENCCOPY_TI module. 
  228.  */  
  229. IDMA3_Fxns VIDENCCOPY_TI_IDMA3 = {      /* module_vendor_interface */  
  230.         &VIDENCCOPY_TI_IALG,              /* IALG functions */  
  231.         VIDENCCOPY_TI_dmaChangeChannels,  /* ChangeChannels */  
  232.         VIDENCCOPY_TI_dmaGetChannelCnt,   /* GetChannelCnt */  
  233.         VIDENCCOPY_TI_dmaGetChannels,     /* GetChannels */  
  234.         VIDENCCOPY_TI_dmaInit             /* initialize logical channels */  
  235. };  
  236.   
  237. #endif  
  238.   
  239. /* 
  240.  *  ======== VIDENCCOPY_TI_activate ======== 
  241.  */  
  242. Void VIDENCCOPY_TI_activate(IALG_Handle handle)  
  243. {  
  244.     GT_1trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_activate(0x%x)\n", handle);  
  245. }  
  246.   
  247.   
  248. /* 
  249.  *  ======== VIDENCCOPY_TI_deactivate ======== 
  250.  */  
  251. Void VIDENCCOPY_TI_deactivate(IALG_Handle handle)  
  252. {  
  253.     GT_1trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_deactivate(0x%x)\n", handle);  
  254. }  
  255.   
  256.   
  257. /* 
  258.  *  ======== VIDENCCOPY_TI_alloc ======== 
  259.  */  
  260. Int VIDENCCOPY_TI_alloc(const IALG_Params *algParams,  
  261.         IALG_Fxns **pf, IALG_MemRec memTab[])  
  262. {  
  263.     if (curTrace.modName == NULL) {   /* initialize GT (tracing) */  
  264.         GT_create(&curTrace, GTNAME);  
  265.     }  
  266.   
  267.     GT_3trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_alloc(0x%x, 0x%x, 0x%x)\n",  
  268.             algParams, pf, memTab);  
  269.   
  270.     /* Request memory for my object */  
  271.     memTab[0].size = sizeof(VIDENCCOPY_TI_Obj);  
  272.     memTab[0].alignment = 0;  
  273.     memTab[0].space = IALG_EXTERNAL;  
  274.     memTab[0].attrs = IALG_PERSIST;  
  275.   
  276.     memTab[1].size = SIZEOFIMG;  
  277.     memTab[1].alignment = 0;  
  278.     memTab[1].space = IALG_EXTERNAL;  
  279.     memTab[1].attrs = IALG_PERSIST;  
  280.   
  281.   
  282.     //img_opencv =cvCreateImage(cvSize(320,240),8,3);  
  283.   
  284.   
  285.     return (2);  
  286. }  
  287.   
  288.   
  289. /* 
  290.  *  ======== VIDENCCOPY_TI_free ======== 
  291.  */  
  292. Int VIDENCCOPY_TI_free(IALG_Handle handle, IALG_MemRec memTab[])  
  293. {  
  294.     GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_free(0x%lx, 0x%lx)\n",  
  295.             handle, memTab);  
  296.   
  297.     VIDENCCOPY_TI_alloc(NULL, NULL, memTab);  
  298.   
  299.     memTab[1].size = SIZEOFIMG;  
  300.     memTab[1].alignment = 0;  
  301.     memTab[1].space = IALG_EXTERNAL;  
  302.     memTab[1].attrs = IALG_PERSIST;  
  303.     memTab[1].base = pResult_rgb_dsp;  
  304.     //free(pResult_rgb_dsp);  
  305.   
  306.     //cvReleaseImage(&img_opencv);  
  307.   
  308.     return (2);  
  309. }  
  310.   
  311.   
  312. /* 
  313.  *  ======== VIDENCCOPY_TI_initObj ======== 
  314.  */  
  315. Int VIDENCCOPY_TI_initObj(IALG_Handle handle,  
  316.         const IALG_MemRec memTab[], IALG_Handle p,  
  317.         const IALG_Params *algParams)  
  318. {  
  319.     GT_4trace(curTrace, GT_ENTER,  
  320.             "VIDENCCOPY_TI_initObj(0x%x, 0x%x, 0x%x, 0x%x)\n", handle, memTab,  
  321.             p, algParams);  
  322.   
  323.     pResult_rgb_dsp =(unsigned char *) memTab[1].base;  
  324.   
  325.     return (IALG_EOK);  
  326. }  
  327.   
  328.   
  329. #if 0  
  330. CV_IMPL  void*  cvAlloc( size_t size )  
  331.                         {  
  332.   
  333.     CV_FUNCNAME( "cvAlloc" );  
  334.   
  335.     //IALG_MemRec *memTab = malloc( sizeof(IALG_MemRec));  
  336.     void * ptr;  
  337.   
  338.     __BEGIN__;  
  339.   
  340.     ptr= (void *)malloc(size);  
  341.   
  342.   
  343.     __END__;  
  344.   
  345.     return  ptr;  
  346.                         }  
  347.   
  348.   
  349. CV_IMPL  void  cvFree_( void* ptr )  
  350. {  
  351.     CV_FUNCNAME( "cvFree_" );  
  352.   
  353.     __BEGIN__;  
  354.   
  355.     free( ptr );  
  356.   
  357.     __END__;  
  358. }  
  359. #endif  
  360.   
  361. static unsigned char buf_dsp_x[320*240*2];  
  362. static unsigned char image_Y_dsp_x[320*240*2];  
  363.   
  364. inline void yuv_to_rgb16_dsp(unsigned char y,  
  365.         unsigned char u,  
  366.         unsigned char v,  
  367.         unsigned char *rgb)  
  368. {  
  369.     register int r,g,b;  
  370.     int rgb16;  
  371.   
  372.     r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;  
  373.     g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u -128) ) >> 10;  
  374.     b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;  
  375.   
  376.     r = r > 255 ? 255 : r < 0 ? 0 : r;  
  377.     g = g > 255 ? 255 : g < 0 ? 0 : g;  
  378.     b = b > 255 ? 255 : b < 0 ? 0 : b;  
  379.   
  380.     rgb16 = (int)(((r >> 3)<<11) | ((g >> 2) << 5)| ((b >> 3) << 0));  
  381.   
  382.     *rgb = (unsigned char)(rgb16 & 0xFF);  
  383.     rgb++;  
  384.     *rgb = (unsigned char)((rgb16 & 0xFF00) >> 8);  
  385. }  
  386.   
  387. void convert(unsigned char *buf, unsigned char *rgb, int width, int height) {  
  388.     int x, y, z = 0;  
  389.     int blocks;  
  390.   
  391.     blocks = (width * height) * 2;  
  392.   
  393.     for (y = 0; y < blocks; y += 4) {  
  394.         unsigned char Y1, Y2, U, V;  
  395.   
  396.         Y1 = buf[y + 0];  
  397.         U = buf[y + 1];  
  398.         Y2 = buf[y + 2];  
  399.         V = buf[y + 3];  
  400.   
  401.         yuv_to_rgb16_dsp(Y1, U, V, &rgb[y]);  
  402.         yuv_to_rgb16_dsp(Y2, U, V, &rgb[y + 2]);  
  403.     }  
  404. }  
  405.   
  406. void YtoRGB(unsigned char *Outrgb, unsigned char *pSrcbuf, int width, int height)  
  407. {  
  408.   
  409.   
  410.     int x,y,z=0;  
  411.     int blocks;  
  412.   
  413.     blocks = (width * height) * 2;  
  414.   
  415.     for (y = 0; y < blocks; y+=4) {  
  416.         unsigned char Y1, Y2, U, V;  
  417.   
  418.         ///////////////////////////////////////  
  419.         Y1 =*pSrcbuf;  
  420.         pSrcbuf++;  
  421.   
  422.         Y2 =*pSrcbuf;  
  423.         pSrcbuf++;  
  424.   
  425.         yuv_to_rgb16_dsp(Y1, 0x80, 0x80, &Outrgb[y]);  
  426.         yuv_to_rgb16_dsp(Y2, 0x80, 0x80, &Outrgb[y + 2]);  
  427.     }  
  428.   
  429.   
  430.   
  431. }  
  432.   
  433. #define Memory_DEFAULTALIGNMENT ((xdc_UInt)(-1))  
  434.   
  435.   
  436.   
  437. void convert_dsp(unsigned char *buf, unsigned char *rgb, int width, int height)  
  438. {  
  439.     int x,y,z=0;  
  440.     int blocks;  
  441.   
  442.     blocks = (width * height) * 2;  
  443.   
  444.     for (y = 0; y < blocks; y+=4) {  
  445.         unsigned char Y1, Y2, U, V;  
  446.   
  447.         ///////////////////////////////////////  
  448.         Y1 = buf[y + 0];  
  449.         U = buf[y + 1];  
  450.         Y2 = buf[y + 2];  
  451.         V = buf[y + 3];  
  452.         //////////////////////////////////////  
  453.   
  454.         yuv_to_rgb16_dsp(Y1, U, V, &rgb[y]);  
  455.         yuv_to_rgb16_dsp(Y2, U, V, &rgb[y + 2]);  
  456.         //yuv_to_rgb16(Y1, 0x80, 0x80, &rgb[y]);  
  457.         //yuv_to_rgb16(Y2, 0x80, 0x80, &rgb[y + 2]);  
  458.     }  
  459. }  
  460.   
  461. #if 1  
  462. void YuyvToY_dsp(unsigned char *Srbuf, unsigned char *pDstbuf, int width, int height)  
  463. {  
  464.   
  465.   
  466.     int x,y,z=0;  
  467.     int blocks;  
  468.   
  469.     blocks = (width * height) * 2;  
  470.   
  471.     for (y = 0; y < blocks; y+=4) {  
  472.         ///////////////////////////////////////  
  473.         *pDstbuf =  Srbuf[y + 0];  
  474.         pDstbuf++;  
  475.         *pDstbuf = Srbuf[y+2];  
  476.         pDstbuf++;  
  477.     }  
  478. }  
  479. #endif  
  480.   
  481.   
  482.   
  483. inline void yuv_to_rgb24(unsigned char y, unsigned char u, unsigned char v,  
  484.         unsigned char *rgb) {  
  485.   
  486.     register int r, g, b;  
  487.   
  488.   
  489.     r = (1192 * (y - 16) + 1634 * (v - 128)) >> 10;  
  490.     g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128)) >> 10;  
  491.     b = (1192 * (y - 16) + 2066 * (u - 128)) >> 10;  
  492.   
  493.     r = r > 255 ? 255 : r < 0 ? 0 : r;  
  494.     g = g > 255 ? 255 : g < 0 ? 0 : g;  
  495.     b = b > 255 ? 255 : b < 0 ? 0 : b;  
  496.   
  497.     *rgb = r;  
  498.     rgb++;  
  499.     *rgb = g;  
  500.     rgb++;  
  501.     *rgb = b;  
  502.   
  503.   
  504.   
  505. #if 0  
  506.     rgb16 = (int) (((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3) << 0));  
  507.   
  508.     *rgb = (unsigned char) (rgb16 & 0xFF);  
  509.     rgb++;  
  510.     *rgb = (unsigned char) ((rgb16 & 0xFF00) >> 8);  
  511. #endif  
  512. }  
  513.   
  514.   
  515. void YUVToRGB24(unsigned char *buf, unsigned char *rgb, int width, int height) {  
  516.   
  517.   
  518.     int  y = 0;  
  519.     int j = 0;  
  520.     int blocks;  
  521.   
  522.     blocks = (width * height) * 2;  
  523.   
  524.   
  525.     for (y = 0; y < blocks; y += 4) {  
  526.         unsigned char Y1, Y2, U1, V1;  
  527.   
  528.         Y1 = buf[y + 0];  
  529.         U1 = buf[y + 1];  
  530.         Y2 = buf[y + 2];  
  531.         V1 = buf[y + 3];  
  532.   
  533.   
  534.         yuv_to_rgb24(Y1, U1, V1, &rgb[j]);  
  535.         yuv_to_rgb24(Y2, U1, V1, &rgb[j + 3]);  
  536.         j +=6;  
  537.     }  
  538.   
  539. }  
  540.   
  541. void YUVToRGB24_8(unsigned char *buf, unsigned char *rgb, int width, int height) {  
  542.   
  543.   
  544.     int  y = 0;  
  545.     int j = 0;  
  546.     int blocks;  
  547.   
  548.     blocks = (width * height) * 2;  
  549.   
  550.   
  551.     for (y = 0; y < blocks; y += 8) {  
  552.         unsigned char Y1, Y2, U1, V1;  
  553.         unsigned char Y1_1, Y2_1, U1_1, V1_1;  
  554.   
  555.         Y1 = buf[y + 0];  
  556.         U1 = buf[y + 1];  
  557.         Y2 = buf[y + 2];  
  558.         V1 = buf[y + 3];  
  559.   
  560.         // V1 = buf[y + 1];  
  561.         //U1 = buf[y + 3];  
  562.   
  563.         Y1_1 = buf[y + 4];  
  564.         U1_1 = buf[y + 5];  
  565.         Y2_1 = buf[y + 6];  
  566.         V1_1 = buf[y + 7];  
  567.   
  568.         // V1_1 = buf[y + 7];  
  569.         // U1_1 = buf[y + 5];  
  570.   
  571.   
  572.   
  573.   
  574.         yuv_to_rgb24(Y1, U1, V1, &rgb[j]);  
  575.         yuv_to_rgb24(Y2, U1, V1, &rgb[j + 3]);  
  576.   
  577.         yuv_to_rgb24(Y1_1, U1_1, V1_1, &rgb[j + 6]);  
  578.         yuv_to_rgb24(Y2_1, U1_1, V1_1, &rgb[j + 9]);  
  579.         j +=12;  
  580.     }  
  581.   
  582. }  
  583.   
  584. static Ptr myMemalign(UInt32 size, UInt32 align)  
  585. {  
  586.     UInt32     alignSize;  
  587.     UInt32     alignBytes;  
  588.     UInt32     remainBytes;  
  589.     Ptr        buf;  
  590.     Ptr        alignBuf;  
  591.     UInt32     tmpAlign;  
  592.     UInt32    *addrPtr;  
  593.   
  594.   
  595.     /* 
  596.      *  Must at least align on 32-bit boundary since we're storing the 
  597.      *  32-bit address of the malloc'd buffer. 
  598.      */  
  599.     alignBytes = (align < sizeof(UInt32)) ? sizeof(UInt32) : align;  
  600.   
  601.     /* 
  602.      *  We will allocate a buffer larger than "size", to allow for alignment 
  603.      *  and to store the address and original size of the buffer returned by 
  604.      *  malloc() at the end of the buffer. 
  605.      *  Make size a multiple of 32-bits so it will be easier to find the 
  606.      *  address of the buffer returned by malloc().  
  607.      */  
  608.     alignSize = size;  
  609.     if ((remainBytes = alignSize & (sizeof(UInt32) - 1)) != 0) {  
  610.         /* size is not a multiple of 32-bits */  
  611.         alignSize += sizeof(UInt32) - remainBytes;  
  612.         remainBytes = sizeof(UInt32) - remainBytes;  
  613.     }  
  614.   
  615.     /* Add 2 32-bit words to store address and original size of buffer */  
  616.     alignSize += sizeof(UInt32) * 2;  
  617.   
  618.     alignSize += alignBytes;  
  619.   
  620.     /* malloc the buffer! */  
  621.     if ((buf = malloc(alignSize)) == NULL) {  
  622.         return (NULL);  
  623.     }  
  624.   
  625.     /* Get the aligned address */  
  626.     tmpAlign = (UInt32)buf & (alignBytes - 1);  
  627.     if (tmpAlign) {  
  628.         alignBuf = (Void *)((UInt32)buf + alignBytes - tmpAlign);  
  629.     }  
  630.     else {  
  631.         /* The buffer was already aligned */  
  632.         alignBuf = buf;  
  633.     }  
  634.   
  635.     /* Store the malloc'd address and original size for freeing later. */  
  636.     addrPtr = (UInt32 *)((UInt32)alignBuf + size + remainBytes);  
  637.     *addrPtr = (UInt32)buf;  
  638.     *(addrPtr + 1) = alignSize;  
  639.   
  640.     return (alignBuf);  
  641. }  
  642.   
  643. /* 
  644.  *  ======== VIDENCCOPY_TI_process ======== 
  645.  */  
  646. XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs,  
  647.         XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs)  
  648. {  
  649.     XDAS_Int32 curBuf;  
  650.     XDAS_UInt32 minSamples;  
  651.     int i,j;  
  652.     int  width,height;  
  653.     unsigned char * ptr;  
  654.     unsigned char *temp;  
  655.   
  656.   
  657.   
  658.   
  659.   
  660. #ifdef USE_ACPY3  
  661.     const Uint32 maxTransferChunkSize       = 0xffff;  
  662.     Uint32       thisTransferChunkSize      = 0x0;  
  663.     Uint32       remainingTransferChunkSize;  
  664.     Uint32       thisTransferSrcAddr, thisTransferDstAddr;  
  665.   
  666.     ACPY3_Params params;  
  667.     VIDENCCOPY_TI_Obj *videncObj = (VIDENCCOPY_TI_Obj *)h;  
  668. #endif   
  669.   
  670.     GT_5trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_process(0x%x, 0x%x, 0x%x, "  
  671.             "0x%x, 0x%x)\n", h, inBufs, outBufs, inArgs, outArgs);  
  672.   
  673.     /* validate arguments - this codec only supports "base" xDM. */  
  674.     if ((inArgs->size != sizeof(*inArgs)) ||  
  675.             (outArgs->size != sizeof(*outArgs))) {  
  676.   
  677.         GT_2trace(curTrace, GT_ENTER,  
  678.                 "VIDENCCOPY_TI_process, unsupported size "  
  679.                 "(0x%x, 0x%x)\n", inArgs->size, outArgs->size);  
  680.   
  681.         return (IVIDENC_EFAIL);  
  682.     }  
  683.   
  684. #ifdef USE_ACPY3  
  685.     /* 
  686.      * Activate Channel  scratch DMA channels. 
  687.      */  
  688.     ACPY3_activate(videncObj->dmaHandle1D1D8B);  
  689. #endif  
  690.   
  691.     /* outArgs->bytesGenerated reports the total number of bytes generated */  
  692.     outArgs->bytesGenerated = 0;  
  693.   
  694.     /* 
  695.      * A couple constraints for this simple "copy" codec: 
  696.      *    - Video encoding presumes a single input buffer, so only one input 
  697.      *      buffer will be encoded, regardless of inBufs->numBufs. 
  698.      *    - Given a different size of an input and output buffers, only 
  699.      *      encode (i.e., copy) the lesser of the sizes. 
  700.      */  
  701.   
  702.   
  703.   
  704.     for (curBuf = 0; (curBuf < inBufs->numBufs) &&  
  705.     (curBuf < outBufs->numBufs); curBuf++) {  
  706.   
  707.         /* there's an available in and out buffer, how many samples? */  
  708.         minSamples = inBufs->bufSizes[curBuf] < outBufs->bufSizes[curBuf] ?  
  709.                 inBufs->bufSizes[curBuf] : outBufs->bufSizes[curBuf];  
  710.   
  711.         //////////////////////////////////////////////////////////////////////  
  712. #if 0   
  713.         YuyvToY_dsp((unsigned char *)inBufs->bufs[curBuf], (unsigned char *)buf_dsp_x, 320,240);  
  714.   
  715.         for(i =0; i < 240; i++)  
  716.             for(j =0; j < 160; j++)    
  717.             {  
  718.                 //*((unsigned char *)buf_dsp_x+ i*320+ j) = 0x80;  
  719.                 //*((unsigned char *)buf_dsp+ i*640+ j) = 0x80;  
  720.             }  
  721.         YtoRGB((unsigned char *)outBufs->bufs[curBuf], (unsigned char *)buf_dsp_x, 320,240);  
  722. #endif   
  723.   
  724.         // convert_dsp(inBufs->bufs[curBuf],outBufs->bufs[curBuf],320, 240);  
  725.         //convert(inBufs->bufs[curBuf], outBufs->bufs[curBuf], 320, 240);  
  726.         // memcpy(outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples);  
  727.   
  728.         //YUVToRGB24((unsigned char *)inBufs->bufs[curBuf],(unsigned char *)outBufs->bufs[curBuf], 320, 240);  
  729.   
  730.         //////////////////////////////////////////////////////////////////////////  
  731.   
  732.         //#ifdef USE_ACPY3  
  733. #if 0  
  734.   
  735.         thisTransferSrcAddr        = (Uint32)inBufs->bufs[curBuf];  
  736.         thisTransferDstAddr        = (Uint32)outBufs->bufs[curBuf];  
  737.         remainingTransferChunkSize = minSamples;  
  738.   
  739.         while (remainingTransferChunkSize > 0) {  
  740.   
  741.             if (remainingTransferChunkSize > maxTransferChunkSize) {  
  742.                 thisTransferChunkSize = maxTransferChunkSize;  
  743.             }  
  744.             else {  
  745.                 thisTransferChunkSize = remainingTransferChunkSize;  
  746.             }  
  747.   
  748.             /* Configure the logical channel */  
  749.             params.transferType = ACPY3_1D1D;  
  750.             params.srcAddr      = (void *)thisTransferSrcAddr;  
  751.             params.dstAddr      = (void *)thisTransferDstAddr;  
  752.             params.elementSize  = thisTransferChunkSize;  
  753.             params.numElements  = 1;  
  754.             params.waitId       = 0;  
  755.             params.numFrames    = 1;  
  756.   
  757.             remainingTransferChunkSize -= thisTransferChunkSize;  
  758.             thisTransferSrcAddr += thisTransferChunkSize;  
  759.             thisTransferDstAddr += thisTransferChunkSize;  
  760.   
  761.             /* Configure logical dma channel */  
  762.             ACPY3_configure(videncObj->dmaHandle1D1D8B, ¶ms, 0);  
  763.   
  764.             /* Use DMA to copy data */  
  765.             ACPY3_start(videncObj->dmaHandle1D1D8B);  
  766.   
  767.             /* wait for transfer to finish  */  
  768.             ACPY3_wait(videncObj->dmaHandle1D1D8B);  
  769.         }  
  770.         GT_1trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> "  
  771.                 "ACPY3 Processed %d bytes.\n", minSamples);  
  772. #else   
  773.         GT_3trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> "  
  774.                 "memcpy (0x%x, 0x%x, %d)\n",  
  775.                 outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples);  
  776.   
  777.         /* process the data: read input, produce output */  
  778.   
  779.   
  780.         //YUVToRGB24((unsigned char *)inBufs->bufs[curBuf],(unsigned char *)outBufs->bufs[curBuf], 320, 240);  
  781.   
  782.         // ptr = (unsigned char *)pImg->imageData  
  783. #if 0  
  784.         for(i = 0; i <120; i++){  
  785.             ptr =(unsigned char *)(pImg->imageData + i*3*320);  
  786.             for(j = 0; j <320; j++){  
  787.                 *( ptr+3*j + 0) = 80;  
  788.                 *( ptr+3*j + 1)  = 80;  
  789.                 *( ptr+3*j + 2)  = 80;  
  790.             }  
  791.         }  
  792.   
  793.         //cvCanny(pImg, pCannyImg, 50, 150, 3);  
  794.         memcpy( (unsigned char *)outBufs->bufs[curBuf],(unsigned char *)pImg->imageData, 320*240*3);  
  795. #else  
  796.   
  797.   
  798.   
  799.         //cvCanny(pImg, pCannyImg, 50, 150, 3);  
  800.         //memcpy( (unsigned char *)outBufs->bufs[curBuf],(unsigned char *)pImg->imageData, 320*240*3);  
  801.         //temp = (unsigned char *)malloc(320 * 240 *3);  
  802.         //temp = (unsigned char *)pResult_rgb_dsp;  
  803.         //temp = (unsigned char *)Memory_contigAlloc(320*240*3,8);  
  804.         // temp = (unsigned char *)myMemalign(320*240*3,8);  
  805.   
  806.         pImg = cvCreateImage(cvSize(320,240),8,3);   
  807.         pCannyImg = cvCreateImage(cvSize(320,240),8,3);  
  808.   
  809.   
  810.   
  811.   
  812.         memcpy((unsigned char *)pImg->imageData, (unsigned char *)inBufs->bufs[curBuf], 320*240*3);  
  813.   
  814.         for(i = 0; i <120; i++){  
  815.             ptr =((unsigned char *)pImg->imageData+i*3*320);  
  816.             for(j = 0; j < 320; j++){  
  817.   
  818.                 ptr[3*j + 0] = 255;  
  819.                 ptr[3*j + 1] = 255;  
  820.                 ptr[3*j + 2] = 255;  
  821.             }  
  822.         }  
  823.   
  824.   
  825.         //  cvCanny(pImg, pCannyImg, 50, 150, 3);  
  826.         cvLine( pImg, cvPoint(15,15), cvPoint(75,15), CV_RGB(255, 0, 0), 3 ,1,0 );  
  827.         cvLine( pImg, cvPoint(75,15), cvPoint(75,75), CV_RGB(255, 0, 0), 3 ,1,0 );  
  828.         cvRectangle(pImg, cvPoint(75,75), cvPoint(120,120), CV_RGB(0, 255, 0), 3, 1, 0);  
  829.         memcpy((unsigned char *)outBufs->bufs[curBuf], (unsigned char *)pImg->imageData, minSamples);  
  830.         //memcpy(outBufs->bufs[curBuf], temp, minSamples);  
  831. #endif  
  832.         //memcpy(outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples);  
  833. #endif  
  834.         //Memory_contigFree(temp,320*240*3);  
  835.         cvReleaseImage(&pImg);  
  836.         cvReleaseImage(&pCannyImg);  
  837.         outArgs->bytesGenerated += minSamples;  
  838.     }  
  839.   
  840.     /* Fill out the rest of the outArgs struct */  
  841.     outArgs->extendedError = 0;  
  842.     outArgs->encodedFrameType = 0;    /* TODO */  
  843.     outArgs->inputFrameSkip = IVIDEO_FRAME_ENCODED;  
  844.     outArgs->reconBufs.numBufs = 0;   /* important: indicate no reconBufs */  
  845.   
  846.     return (IVIDENC_EOK);  
  847. }  
  848.   
  849.   
  850. /* 
  851.  *  ======== VIDENCCOPY_TI_control ======== 
  852.  */  
  853. XDAS_Int32 VIDENCCOPY_TI_control(IVIDENC_Handle handle, IVIDENC_Cmd id,  
  854.         IVIDENC_DynamicParams *params, IVIDENC_Status *status)  
  855. {  
  856.     XDAS_Int32 retVal;  
  857.   
  858.     GT_4trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_control(0x%x, 0x%x, 0x%x, "  
  859.             "0x%x)\n", handle, id, params, status);  
  860.   
  861.     /* validate arguments - this codec only supports "base" xDM. */  
  862.     if ((params->size != sizeof(*params)) ||  
  863.             (status->size != sizeof(*status))) {  
  864.   
  865.         GT_2trace(curTrace, GT_ENTER,  
  866.                 "VIDENCCOPY_TI_control, unsupported size "  
  867.                 "(0x%x, 0x%x)\n", params->size, status->size);  
  868.   
  869.         return (IVIDENC_EFAIL);  
  870.     }  
  871.   
  872.     switch (id) {  
  873.     case XDM_GETSTATUS:  
  874.     case XDM_GETBUFINFO:  
  875.         status->extendedError = 0;  
  876.   
  877.         status->bufInfo.minNumInBufs = MININBUFS;  
  878.         status->bufInfo.minNumOutBufs = MINOUTBUFS;  
  879.         status->bufInfo.minInBufSize[0] = MININBUFSIZE;  
  880.         status->bufInfo.minOutBufSize[0] = MINOUTBUFSIZE;  
  881.   
  882.         retVal = IVIDENC_EOK;  
  883.   
  884.         break;  
  885.   
  886.     case XDM_SETPARAMS:  
  887.     case XDM_SETDEFAULT:  
  888.     case XDM_RESET:  
  889.     case XDM_FLUSH:  
  890.         /* TODO - for now just return success. */  
  891.   
  892.         retVal = IVIDENC_EOK;  
  893.         break;  
  894.   
  895.     default:  
  896.         /* unsupported cmd */  
  897.         retVal = IVIDENC_EFAIL;  
  898.   
  899.         break;  
  900.     }  
  901.   
  902.     return (retVal);  
  903. }  
  904. /* 
  905.  *  @(#) ti.sdo.ce.examples.codecs.videnc_copy; 1, 0, 0,262; 12-2-2010 21:23:15; /db/atree/library/trees/ce/ce-r11x/src/ xlibrary 
  906.  
  907.  */  

你可能感兴趣的:(移植opencv 到codec engine 成功)