DSP

移植opencv 到codec engine 成功

2019-07-13 20:06发布

之前网上有个opencv dsp加速之类,是基于c6acces的,比较麻烦,我干脆全部移植到codec当中去。在videnc_copy中成功编译,在dm3730上跑,也成功,速度还好。达芬奇davince平台都可以这样干了。后期在8148上面试试速度。如果达芬奇平台启动时间够快,做车载运用,将是比较好的选择。以下是个测试程序 /* * Copyright (c) 2010, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * ======== videnc_copy.c ======== * Video Encoder "copy" algorithm. * * This file contains an implementation of the deprecated IVIDENC interface * as defined by xDM 0.9. */ #include #include #include #include #include #include #include #include #include #include #include "videnc_copy_ti.h" #include "videnc_copy_ti_priv.h" #include "cv.h" #include "cxcore.h" /* buffer definitions */ #define MININBUFS 1 #define MINOUTBUFS 1 #define MININBUFSIZE 1 #define MINOUTBUFSIZE 1 IplImage* pImg = NULL; IplImage* pCannyImg = NULL; static Int8 *xxx = NULL; #define SIZEOFIMG ((320)*(240)*(3)*(sizeof(char))) static Memory_AllocParams MemParams = { Memory_CONTIGHEAP, Memory_CACHED, 8, 0 }; extern IALG_Fxns VIDENCCOPY_TI_IALG; #define IALGFXNS &VIDENCCOPY_TI_IALG, /* module ID */ VIDENCCOPY_TI_activate, /* activate */ VIDENCCOPY_TI_alloc, /* alloc */ NULL, /* control (NULL => no control ops) */ VIDENCCOPY_TI_deactivate, /* deactivate */ VIDENCCOPY_TI_free, /* free */ VIDENCCOPY_TI_initObj, /* init */ NULL, /* moved */ NULL /* numAlloc (NULL => IALG_MAXMEMRECS) */ /* * ======== VIDENCCOPY_TI_IVIDENC ======== * This structure defines TI's implementation of the IVIDENC interface * for the VIDENCCOPY_TI module. */ IVIDENC_Fxns VIDENCCOPY_TI_VIDENCCOPY = { /* module_vendor_interface */ {IALGFXNS}, VIDENCCOPY_TI_process, VIDENCCOPY_TI_control, }; XDAS_Int16 width; XDAS_Int16 height; XDAS_UInt8* pResult_rgb_dsp; XDAS_UInt8 rectCount =0; /* * ======== VIDENCCOPY_TI_IALG ======== * This structure defines TI's implementation of the IALG interface * for the VIDENCCOPY_TI module. */ #ifdef _TI_ /* satisfy xDAIS symbol requirement without any overhead */ asm("_VIDENCCOPY_TI_IALG .set _VIDENCCOPY_TI_VIDENCCOPY"); #else /* * We duplicate the structure here to allow this code to be compiled and * run non-DSP platforms at the expense of unnecessary data space * consumed by the definition below. */ IALG_Fxns VIDENCCOPY_TI_IALG = { /* module_vendor_interface */ IALGFXNS }; #endif /* tracing information */ #define GTNAME "ti.sdo.ce.examples.codecs.videnc_copy" static GT_Mask curTrace = {NULL,NULL}; #ifdef USE_ACPY3 /* Implementation of IDMA3 interface functions & IDMA3_Fxns vtable */ #include #include #include #define NUM_LOGICAL_CH 1 /* * ======== VIDENCCOPY_TI_dmaChangeChannels ======== * Update instance object with new logical channel. */ Void VIDENCCOPY_TI_dmaChangeChannels(IALG_Handle handle, IDMA3_ChannelRec dmaTab[]) { VIDENCCOPY_TI_Obj *videncObj = (Void *)handle; GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaChangeChannels(0x%x, 0x%x) ", handle, dmaTab); videncObj->dmaHandle1D1D8B = dmaTab[0].handle; } /* * ======== VIDENCCOPY_TI_dmaGetChannelCnt ======== * Return max number of logical channels requested. */ Uns VIDENCCOPY_TI_dmaGetChannelCnt(Void) { GT_0trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaGetChannelCnt() "); return (NUM_LOGICAL_CH); } /* * ======== VIDENCCOPY_TI_dmaGetChannels ======== * Declare DMA resource requirement/holdings. */ Uns VIDENCCOPY_TI_dmaGetChannels(IALG_Handle handle, IDMA3_ChannelRec dmaTab[]) { VIDENCCOPY_TI_Obj *videncObj = (Void *)handle; int i; GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaGetChannels(0x%x, 0x%x) ", handle, dmaTab); /* Initial values on logical channels */ dmaTab[0].handle = videncObj->dmaHandle1D1D8B; dmaTab[0].numTransfers = 1; dmaTab[0].numWaits = 1; /* * Request logical DMA channels for use with ACPY3 * AND with environment size obtained from ACPY3 implementation * AND with low priority. */ for (i = 0; i < NUM_LOGICAL_CH; i++) { dmaTab[i].priority = IDMA3_PRIORITY_LOW; dmaTab[i].persistent = FALSE; dmaTab[i].protocol = &ACPY3_PROTOCOL; } return (NUM_LOGICAL_CH); } /* * ======== VIDENCCOPY_TI_dmaInit ======== * Initialize instance object with granted logical channel. */ Int VIDENCCOPY_TI_dmaInit(IALG_Handle handle, IDMA3_ChannelRec dmaTab[]) { VIDENCCOPY_TI_Obj *videncObj = (Void *)handle; GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaInit(0x%x, 0x%x) ", handle, dmaTab); videncObj->dmaHandle1D1D8B = dmaTab[0].handle; return (IALG_EOK); } /* * ======== VIDENCCOPY_TI_IDMA3 ======== * This structure defines TI's implementation of the IDMA3 interface * for the VIDENCCOPY_TI module. */ IDMA3_Fxns VIDENCCOPY_TI_IDMA3 = { /* module_vendor_interface */ &VIDENCCOPY_TI_IALG, /* IALG functions */ VIDENCCOPY_TI_dmaChangeChannels, /* ChangeChannels */ VIDENCCOPY_TI_dmaGetChannelCnt, /* GetChannelCnt */ VIDENCCOPY_TI_dmaGetChannels, /* GetChannels */ VIDENCCOPY_TI_dmaInit /* initialize logical channels */ }; #endif /* * ======== VIDENCCOPY_TI_activate ======== */ Void VIDENCCOPY_TI_activate(IALG_Handle handle) { GT_1trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_activate(0x%x) ", handle); } /* * ======== VIDENCCOPY_TI_deactivate ======== */ Void VIDENCCOPY_TI_deactivate(IALG_Handle handle) { GT_1trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_deactivate(0x%x) ", handle); } /* * ======== VIDENCCOPY_TI_alloc ======== */ Int VIDENCCOPY_TI_alloc(const IALG_Params *algParams, IALG_Fxns **pf, IALG_MemRec memTab[]) { if (curTrace.modName == NULL) { /* initialize GT (tracing) */ GT_create(&curTrace, GTNAME); } GT_3trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_alloc(0x%x, 0x%x, 0x%x) ", algParams, pf, memTab); /* Request memory for my object */ memTab[0].size = sizeof(VIDENCCOPY_TI_Obj); memTab[0].alignment = 0; memTab[0].space = IALG_EXTERNAL; memTab[0].attrs = IALG_PERSIST; memTab[1].size = SIZEOFIMG; memTab[1].alignment = 0; memTab[1].space = IALG_EXTERNAL; memTab[1].attrs = IALG_PERSIST; //img_opencv =cvCreateImage(cvSize(320,240),8,3); return (2); } /* * ======== VIDENCCOPY_TI_free ======== */ Int VIDENCCOPY_TI_free(IALG_Handle handle, IALG_MemRec memTab[]) { GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_free(0x%lx, 0x%lx) ", handle, memTab); VIDENCCOPY_TI_alloc(NULL, NULL, memTab); memTab[1].size = SIZEOFIMG; memTab[1].alignment = 0; memTab[1].space = IALG_EXTERNAL; memTab[1].attrs = IALG_PERSIST; memTab[1].base = pResult_rgb_dsp; //free(pResult_rgb_dsp); //cvReleaseImage(&img_opencv); return (2); } /* * ======== VIDENCCOPY_TI_initObj ======== */ Int VIDENCCOPY_TI_initObj(IALG_Handle handle, const IALG_MemRec memTab[], IALG_Handle p, const IALG_Params *algParams) { GT_4trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_initObj(0x%x, 0x%x, 0x%x, 0x%x) ", handle, memTab, p, algParams); pResult_rgb_dsp =(unsigned char *) memTab[1].base; return (IALG_EOK); } #if 0 CV_IMPL void* cvAlloc( size_t size ) { CV_FUNCNAME( "cvAlloc" ); //IALG_MemRec *memTab = malloc( sizeof(IALG_MemRec)); void * ptr; __BEGIN__; ptr= (void *)malloc(size); __END__; return ptr; } CV_IMPL void cvFree_( void* ptr ) { CV_FUNCNAME( "cvFree_" ); __BEGIN__; free( ptr ); __END__; } #endif static unsigned char buf_dsp_x[320*240*2]; static unsigned char image_Y_dsp_x[320*240*2]; inline void yuv_to_rgb16_dsp(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb) { register int r,g,b; int rgb16; r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10; g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u -128) ) >> 10; b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10; r = r > 255 ? 255 : r < 0 ? 0 : r; g = g > 255 ? 255 : g < 0 ? 0 : g; b = b > 255 ? 255 : b < 0 ? 0 : b; rgb16 = (int)(((r >> 3)<<11) | ((g >> 2) << 5)| ((b >> 3) << 0)); *rgb = (unsigned char)(rgb16 & 0xFF); rgb++; *rgb = (unsigned char)((rgb16 & 0xFF00) >> 8); } void convert(unsigned char *buf, unsigned char *rgb, int width, int height) { int x, y, z = 0; int blocks; blocks = (width * height) * 2; for (y = 0; y < blocks; y += 4) { unsigned char Y1, Y2, U, V; Y1 = buf[y + 0]; U = buf[y + 1]; Y2 = buf[y + 2]; V = buf[y + 3]; yuv_to_rgb16_dsp(Y1, U, V, &rgb[y]); yuv_to_rgb16_dsp(Y2, U, V, &rgb[y + 2]); } } void YtoRGB(unsigned char *Outrgb, unsigned char *pSrcbuf, int width, int height) { int x,y,z=0; int blocks; blocks = (width * height) * 2; for (y = 0; y < blocks; y+=4) { unsigned char Y1, Y2, U, V; /////////////////////////////////////// Y1 =*pSrcbuf; pSrcbuf++; Y2 =*pSrcbuf; pSrcbuf++; yuv_to_rgb16_dsp(Y1, 0x80, 0x80, &Outrgb[y]); yuv_to_rgb16_dsp(Y2, 0x80, 0x80, &Outrgb[y + 2]); } } #define Memory_DEFAULTALIGNMENT ((xdc_UInt)(-1)) void convert_dsp(unsigned char *buf, unsigned char *rgb, int width, int height) { int x,y,z=0; int blocks; blocks = (width * height) * 2; for (y = 0; y < blocks; y+=4) { unsigned char Y1, Y2, U, V; /////////////////////////////////////// Y1 = buf[y + 0]; U = buf[y + 1]; Y2 = buf[y + 2]; V = buf[y + 3]; ////////////////////////////////////// yuv_to_rgb16_dsp(Y1, U, V, &rgb[y]); yuv_to_rgb16_dsp(Y2, U, V, &rgb[y + 2]); //yuv_to_rgb16(Y1, 0x80, 0x80, &rgb[y]); //yuv_to_rgb16(Y2, 0x80, 0x80, &rgb[y + 2]); } } #if 1 void YuyvToY_dsp(unsigned char *Srbuf, unsigned char *pDstbuf, int width, int height) { int x,y,z=0; int blocks; blocks = (width * height) * 2; for (y = 0; y < blocks; y+=4) { /////////////////////////////////////// *pDstbuf = Srbuf[y + 0]; pDstbuf++; *pDstbuf = Srbuf[y+2]; pDstbuf++; } } #endif inline void yuv_to_rgb24(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb) { register int r, g, b; r = (1192 * (y - 16) + 1634 * (v - 128)) >> 10; g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128)) >> 10; b = (1192 * (y - 16) + 2066 * (u - 128)) >> 10; r = r > 255 ? 255 : r < 0 ? 0 : r; g = g > 255 ? 255 : g < 0 ? 0 : g; b = b > 255 ? 255 : b < 0 ? 0 : b; *rgb = r; rgb++; *rgb = g; rgb++; *rgb = b; #if 0 rgb16 = (int) (((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3) << 0)); *rgb = (unsigned char) (rgb16 & 0xFF); rgb++; *rgb = (unsigned char) ((rgb16 & 0xFF00) >> 8); #endif } void YUVToRGB24(unsigned char *buf, unsigned char *rgb, int width, int height) { int y = 0; int j = 0; int blocks; blocks = (width * height) * 2; for (y = 0; y < blocks; y += 4) { unsigned char Y1, Y2, U1, V1; Y1 = buf[y + 0]; U1 = buf[y + 1]; Y2 = buf[y + 2]; V1 = buf[y + 3]; yuv_to_rgb24(Y1, U1, V1, &rgb[j]); yuv_to_rgb24(Y2, U1, V1, &rgb[j + 3]); j +=6; } } void YUVToRGB24_8(unsigned char *buf, unsigned char *rgb, int width, int height) { int y = 0; int j = 0; int blocks; blocks = (width * height) * 2; for (y = 0; y < blocks; y += 8) { unsigned char Y1, Y2, U1, V1; unsigned char Y1_1, Y2_1, U1_1, V1_1; Y1 = buf[y + 0]; U1 = buf[y + 1]; Y2 = buf[y + 2]; V1 = buf[y + 3]; // V1 = buf[y + 1]; //U1 = buf[y + 3]; Y1_1 = buf[y + 4]; U1_1 = buf[y + 5]; Y2_1 = buf[y + 6]; V1_1 = buf[y + 7]; // V1_1 = buf[y + 7]; // U1_1 = buf[y + 5]; yuv_to_rgb24(Y1, U1, V1, &rgb[j]); yuv_to_rgb24(Y2, U1, V1, &rgb[j + 3]); yuv_to_rgb24(Y1_1, U1_1, V1_1, &rgb[j + 6]); yuv_to_rgb24(Y2_1, U1_1, V1_1, &rgb[j + 9]); j +=12; } } static Ptr myMemalign(UInt32 size, UInt32 align) { UInt32 alignSize; UInt32 alignBytes; UInt32 remainBytes; Ptr buf; Ptr alignBuf; UInt32 tmpAlign; UInt32 *addrPtr; /* * Must at least align on 32-bit boundary since we're storing the * 32-bit address of the malloc'd buffer. */ alignBytes = (align < sizeof(UInt32)) ? sizeof(UInt32) : align; /* * We will allocate a buffer larger than "size", to allow for alignment * and to store the address and original size of the buffer returned by * malloc() at the end of the buffer. * Make size a multiple of 32-bits so it will be easier to find the * address of the buffer returned by malloc(). */ alignSize = size; if ((remainBytes = alignSize & (sizeof(UInt32) - 1)) != 0) { /* size is not a multiple of 32-bits */ alignSize += sizeof(UInt32) - remainBytes; remainBytes = sizeof(UInt32) - remainBytes; } /* Add 2 32-bit words to store address and original size of buffer */ alignSize += sizeof(UInt32) * 2; alignSize += alignBytes; /* malloc the buffer! */ if ((buf = malloc(alignSize)) == NULL) { return (NULL); } /* Get the aligned address */ tmpAlign = (UInt32)buf & (alignBytes - 1); if (tmpAlign) { alignBuf = (Void *)((UInt32)buf + alignBytes - tmpAlign); } else { /* The buffer was already aligned */ alignBuf = buf; } /* Store the malloc'd address and original size for freeing later. */ addrPtr = (UInt32 *)((UInt32)alignBuf + size + remainBytes); *addrPtr = (UInt32)buf; *(addrPtr + 1) = alignSize; return (alignBuf); } /* * ======== VIDENCCOPY_TI_process ======== */ XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs, XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs) { XDAS_Int32 curBuf; XDAS_UInt32 minSamples; int i,j; int width,height; unsigned char * ptr; unsigned char *temp; #ifdef USE_ACPY3 const Uint32 maxTransferChunkSize = 0xffff; Uint32 thisTransferChunkSize = 0x0; Uint32 remainingTransferChunkSize; Uint32 thisTransferSrcAddr, thisTransferDstAddr; ACPY3_Params params; VIDENCCOPY_TI_Obj *videncObj = (VIDENCCOPY_TI_Obj *)h; #endif GT_5trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_process(0x%x, 0x%x, 0x%x, " "0x%x, 0x%x) ", h, inBufs, outBufs, inArgs, outArgs); /* validate arguments - this codec only supports "base" xDM. */ if ((inArgs->size != sizeof(*inArgs)) || (outArgs->size != sizeof(*outArgs))) { GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_process, unsupported size " "(0x%x, 0x%x) ", inArgs->size, outArgs->size); return (IVIDENC_EFAIL); } #ifdef USE_ACPY3 /* * Activate Channel scratch DMA channels. */ ACPY3_activate(videncObj->dmaHandle1D1D8B); #endif /* outArgs->bytesGenerated reports the total number of bytes generated */ outArgs->bytesGenerated = 0; /* * A couple constraints for this simple "copy" codec: * - Video encoding presumes a single input buffer, so only one input * buffer will be encoded, regardless of inBufs->numBufs. * - Given a different size of an input and output buffers, only * encode (i.e., copy) the lesser of the sizes. */ for (curBuf = 0; (curBuf < inBufs->numBufs) && (curBuf < outBufs->numBufs); curBuf++) { /* there's an available in and out buffer, how many samples? */ minSamples = inBufs->bufSizes[curBuf] < outBufs->bufSizes[curBuf] ? inBufs->bufSizes[curBuf] : outBufs->bufSizes[curBuf]; ////////////////////////////////////////////////////////////////////// #if 0 YuyvToY_dsp((unsigned char *)inBufs->bufs[curBuf], (unsigned char *)buf_dsp_x, 320,240); for(i =0; i < 240; i++) for(j =0; j < 160; j++) { //*((unsigned char *)buf_dsp_x+ i*320+ j) = 0x80; //*((unsigned char *)buf_dsp+ i*640+ j) = 0x80; } YtoRGB((unsigned char *)outBufs->bufs[curBuf], (unsigned char *)buf_dsp_x, 320,240); #endif // convert_dsp(inBufs->bufs[curBuf],outBufs->bufs[curBuf],320, 240); //convert(inBufs->bufs[curBuf], outBufs->bufs[curBuf], 320, 240); // memcpy(outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples); //YUVToRGB24((unsigned char *)inBufs->bufs[curBuf],(unsigned char *)outBufs->bufs[curBuf], 320, 240); ////////////////////////////////////////////////////////////////////////// //#ifdef USE_ACPY3 #if 0 thisTransferSrcAddr = (Uint32)inBufs->bufs[curBuf]; thisTransferDstAddr = (Uint32)outBufs->bufs[curBuf]; remainingTransferChunkSize = minSamples; while (remainingTransferChunkSize > 0) { if (remainingTransferChunkSize > maxTransferChunkSize) { thisTransferChunkSize = maxTransferChunkSize; } else { thisTransferChunkSize = remainingTransferChunkSize; } /* Configure the logical channel */ params.transferType = ACPY3_1D1D; params.srcAddr = (void *)thisTransferSrcAddr; params.dstAddr = (void *)thisTransferDstAddr; params.elementSize = thisTransferChunkSize; params.numElements = 1; params.waitId = 0; params.numFrames = 1; remainingTransferChunkSize -= thisTransferChunkSize; thisTransferSrcAddr += thisTransferChunkSize; thisTransferDstAddr += thisTransferChunkSize; /* Configure logical dma channel */ ACPY3_configure(videncObj->dmaHandle1D1D8B, ¶ms, 0); /* Use DMA to copy data */ ACPY3_start(videncObj->dmaHandle1D1D8B); /* wait for transfer to finish */ ACPY3_wait(videncObj->dmaHandle1D1D8B); } GT_1trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> " "ACPY3 Processed %d bytes. ", minSamples); #else GT_3trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> " "memcpy (0x%x, 0x%x, %d) ", outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples); /* process the data: read input, produce output */ //YUVToRGB24((unsigned char *)inBufs->bufs[curBuf],(unsigned char *)outBufs->bufs[curBuf], 320, 240); // ptr = (unsigned char *)pImg->imageData #if 0 for(i = 0; i <120; i++){ ptr =(unsigned char *)(pImg->imageData + i*3*320); for(j = 0; j <320; j++){ *( ptr+3*j + 0) = 80; *( ptr+3*j + 1) = 80; *( ptr+3*j + 2) = 80; } } //cvCanny(pImg, pCannyImg, 50, 150, 3); memcpy( (unsigned char *)outBufs->bufs[curBuf],(unsigned char *)pImg->imageData, 320*240*3); #else //cvCanny(pImg, pCannyImg, 50, 150, 3); //memcpy( (unsigned char *)outBufs->bufs[curBuf],(unsigned char *)pImg->imageData, 320*240*3); //temp = (unsigned char *)malloc(320 * 240 *3); //temp = (unsigned char *)pResult_rgb_dsp; //temp = (unsigned char *)Memory_contigAlloc(320*240*3,8); // temp = (unsigned char *)myMemalign(320*240*3,8); pImg = cvCreateImage(cvSize(320,240),8,3); pCannyImg = cvCreateImage(cvSize(320,240),8,3); memcpy((unsigned char *)pImg->imageData, (unsigned char *)inBufs->bufs[curBuf], 320*240*3); for(i = 0; i <120; i++){ ptr =((unsigned char *)pImg->imageData+i*3*320); for(j = 0; j < 320; j++){ ptr[3*j + 0] = 255; ptr[3*j + 1] = 255; ptr[3*j + 2] = 255; } } // cvCanny(pImg, pCannyImg, 50, 150, 3); cvLine( pImg, cvPoint(15,15), cvPoint(75,15), CV_RGB(255, 0, 0), 3 ,1,0 ); cvLine( pImg, cvPoint(75,15), cvPoint(75,75), CV_RGB(255, 0, 0), 3 ,1,0 ); cvRectangle(pImg, cvPoint(75,75), cvPoint(120,120), CV_RGB(0, 255, 0), 3, 1, 0); memcpy((unsigned char *)outBufs->bufs[curBuf], (unsigned char *)pImg->imageData, minSamples); //memcpy(outBufs->bufs[curBuf], temp, minSamples); #endif //memcpy(outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples); #endif //Memory_contigFree(temp,320*240*3); cvReleaseImage(&pImg); cvReleaseImage(&pCannyImg); outArgs->bytesGenerated += minSamples; } /* Fill out the rest of the outArgs struct */ outArgs->extendedError = 0; outArgs->encodedFrameType = 0; /* TODO */ outArgs->inputFrameSkip = IVIDEO_FRAME_ENCODED; outArgs->reconBufs.numBufs = 0; /* important: indicate no reconBufs */ return (IVIDENC_EOK); } /* * ======== VIDENCCOPY_TI_control ======== */ XDAS_Int32 VIDENCCOPY_TI_control(IVIDENC_Handle handle, IVIDENC_Cmd id, IVIDENC_DynamicParams *params, IVIDENC_Status *status) { XDAS_Int32 retVal; GT_4trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_control(0x%x, 0x%x, 0x%x, " "0x%x) ", handle, id, params, status); /* validate arguments - this codec only supports "base" xDM. */ if ((params->size != sizeof(*params)) || (status->size != sizeof(*status))) { GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_control, unsupported size " "(0x%x, 0x%x) ", params->size, status->size); return (IVIDENC_EFAIL); } switch (id) { case XDM_GETSTATUS: case XDM_GETBUFINFO: status->extendedError = 0; status->bufInfo.minNumInBufs = MININBUFS; status->bufInfo.minNumOutBufs = MINOUTBUFS; status->bufInfo.minInBufSize[0] = MININBUFSIZE; status->bufInfo.minOutBufSize[0] = MINOUTBUFSIZE; retVal = IVIDENC_EOK; break; case XDM_SETPARAMS: case XDM_SETDEFAULT: case XDM_RESET: case XDM_FLUSH: /* TODO - for now just return success. */ retVal = IVIDENC_EOK; break; default: /* unsupported cmd */ retVal = IVIDENC_EFAIL; break; } return (retVal); } /* * @(#) 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 */