X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=otherlibs%2Fcvcam%2Fsrc%2Funix%2Frender.cpp;fp=otherlibs%2Fcvcam%2Fsrc%2Funix%2Frender.cpp;h=0000000000000000000000000000000000000000;hb=e4c14cdbdf2fe805e79cd96ded236f57e7b89060;hp=796fc16a39a1556fcb9f9ef23a0373f01482749c;hpb=454138ff8a20f6edb9b65a910101403d8b520643;p=opencv diff --git a/otherlibs/cvcam/src/unix/render.cpp b/otherlibs/cvcam/src/unix/render.cpp deleted file mode 100644 index 796fc16..0000000 --- a/otherlibs/cvcam/src/unix/render.cpp +++ /dev/null @@ -1,390 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// Intel License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000, Intel Corporation, all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's 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. -// -// * The name of Intel Corporation may not 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 Intel Corporation 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. -// -//M*/ - -#include "render.h" -#include "convert.h" - -#include -#include -#include -#include -#include - -#define RENDER_FRAMERATE 1 - -#define Assert(exp) \ - if( !(exp) ) \ - { \ - printf("Assertion: %s %s: %d\n", #exp, __FILE__, __LINE__);\ - assert(exp); \ - } - -static void icvvResizeImage( int src_w, int src_h, int src_s, char* src, - int dst_w, int dst_h, int dst_s, char* dst, - int depth ) -{ - - int x, y; - - int* x_array = (int*)malloc(sizeof(int) * dst_w); - int* y_array = (int*)malloc(sizeof(int) * dst_h); - float x_step = (float)(src_w - 1) / (dst_w - 1); - float y_step = (float)(src_h - 1) / (dst_h - 1); - char* _src; - - Assert( src ); - Assert( dst ); - Assert( src_w > 0 && src_h > 0 && src_s >= src_w * depth / 8 ); - Assert( dst_w > 0 && dst_h > 0 && dst_s >= dst_w * depth / 8 ); - - if( src_w == dst_w && src_h == dst_h && src_s == dst_s ) - { - memcpy( dst, src, src_s * src_h ); - return; - } - - - for( x = 0; x < dst_w; x++ ) - x_array[x] = (int)(x_step * x + 0.5); - for( y = 0; y < dst_h; y++ ) - y_array[y] = (int)(y_step * y + 0.5); - - Assert(x_array[dst_w - 1] == src_w - 1); - Assert(y_array[dst_h - 1] == src_h - 1); - - switch( depth ) - { - case 8: - for( y = 0; y < dst_h; y++, dst += dst_s ) - { - _src = src + y_array[y] * src_s; - for( x = 0; x < dst_w; x++ ) - { - int offset = x_array[x]; - dst[x] = _src[offset]; - } - } - break; - case 16: - for( y = 0; y < dst_h; y++, dst += dst_s ) - { - _src = src + y_array[y] * src_s; - for( x = 0; x < dst_w; x++ ) - { - int offset = x_array[x]; - ((short*)dst)[x] = ((short*)_src)[offset]; - } - } - break; - case 24: - for( y = 0; y < dst_h; y++, dst += dst_s ) - { - _src = src + y_array[y] * src_s; - for( x = 0; x < dst_w; x++ ) - { - int offset = x_array[x] * 3; - dst[x * 3] = _src[offset]; - dst[x * 3 + 1] = _src[offset + 1]; - dst[x * 3 + 2] = _src[offset + 2]; - } - } - break; - case 32: - for( y = 0; y < dst_h; y++, dst += dst_s ) - { - _src = src + y_array[y] * src_s; - for( x = 0; x < dst_w; x++ ) - { - int offset = x_array[x]; - ((int*)dst)[x] = ((int*)_src)[offset]; - } - } - break; - } - - free(x_array); - free(y_array); -} -int icvVideoRenderStart(int cameraid) -{ - pthread_t thread; - - if( !cameras[cameraid].rendered) - return 0; - - if( !cameras[cameraid].window) - return 0; - - if(pthread_create(&thread, NULL, icvVideoRender, (void*)cameraid)) - { - fprintf(stderr, "icvVideoRenderStart: failed create thread for rendering"); - return 0; - } - - return 1; -} - -//////////////////////////////////////////////////////////////////////////////// -void* icvVideoRender(void* data) -{ - int cameraid = (int)data; - CvVideoCamera *const camera = &(cameras[cameraid]); - Display* display; - int screen_num; - GC gc; - char* display_name = NULL; - Window window = camera->window; - XWindowAttributes windowattr; - Visual* visual; - int windowdepth; - XImage* image; - XShmSegmentInfo xshmseg; - int width = (camera->renderwidth>0)?camera->renderwidth:camera->videopp.width; - int height = camera->renderheight?camera->renderheight:camera->videopp.height; - int picturedepth = camera->videopp.picture.depth; - int pixelsize; - XGCValues values; - IplImage* iplimage; - time_t start, now; - int frames = 0; - float rate = 0; - Status XShm; - uchar* imgdata = NULL; - uchar* tmpbuff = NULL; - - pthread_mutex_lock(&(camera->capturestatemutex)); - if(camera->capturestate != CAPTURING) - { - pthread_mutex_unlock(&(camera->capturestatemutex)); - pthread_exit( NULL ); - } - camera->renderstate=1; - pthread_cond_signal(&(camera->capturestatecond)); - pthread_mutex_unlock(&(camera->capturestatemutex)); - XInitThreads(); - - if ( (display=XOpenDisplay(display_name)) == NULL ) - - { - fprintf( stderr, "cvVideo: cannot connect to X server %s\n", - XDisplayName(display_name)); - pthread_exit( NULL ); - } - - screen_num = DefaultScreen(display); - - if (XGetWindowAttributes(display, window, - &windowattr) == 0) - { - fprintf(stderr, "icvVideoRender: failed to get window attributes.\n" ); - pthread_exit(NULL); - } - - if(windowattr.map_state == IsUnmapped) - { - fprintf(stderr, "icvVideoRender: window is not mapped \n" ); - pthread_exit(NULL); - } - - windowdepth = windowattr.depth; - visual = windowattr.visual; - - pixelsize = icvVideoWindowPixelsize(windowdepth); - - XShm = XShmQueryExtension(display); - if(XShm) - { - image = XShmCreateImage(display, visual, windowdepth, ZPixmap, NULL, - &xshmseg, width, height ); - - assert(image); - - xshmseg.shmid = shmget (IPC_PRIVATE, - width*height*pixelsize, IPC_CREAT|0777); - - assert(xshmseg.shmid != -1); - xshmseg.shmaddr = image->data=(char*)shmat (xshmseg.shmid, 0, 0) ; - - xshmseg.readOnly = False; - - XShmAttach (display, &xshmseg); - } - else - { - imgdata = (uchar*)malloc(width*height*icvVideoWindowPixelsize(windowdepth)) ; - image = XCreateImage(display, visual, windowdepth, ZPixmap, 0, - (char*)imgdata, width, - height, 8, - icvVideoWindowPixelsize(windowdepth) - *width); - - assert(image); - XInitImage(image); - } - - gc = XCreateGC(display,window,0, &values ); -#ifdef RENDER_FRAMERATE - start = time(NULL); -#endif - - pthread_mutex_lock(&(camera->capturestatemutex)); - while((camera->capturestate == CAPTURING) && (camera->rendered)) - { - pthread_mutex_unlock(&(camera->capturestatemutex)); - pthread_mutex_lock(&(camera->updatedmutex)); - while(camera->updated == 0) - pthread_cond_wait(&(camera->updatedcond), &(camera->updatedmutex)); - camera->updated = 0; - pthread_mutex_unlock(&(camera->updatedmutex)); - if(cvcamGetProperty(cameraid, "raw_image",&iplimage )) - { - assert(image->data); - if(camera->callback != NULL) - camera->callback(iplimage); - if((width==camera->videopp.width)&& - (height==camera->videopp.height)) - { - icvvConvert(width, height, width*picturedepth/8, picturedepth, - iplimage->imageData, width*pixelsize, pixelsize*8, image->data - ); - cvReleaseImage(&iplimage); - } - else - { - tmpbuff = (uchar*)malloc(camera->videopp.width*camera->videopp.height* - pixelsize) ; - - icvvConvert(camera->videopp.width, camera->videopp.height, - camera->videopp.width*picturedepth/8, picturedepth, - iplimage->imageData, camera->videopp.width*pixelsize, - pixelsize*8, (char*)tmpbuff); - cvReleaseImage(&iplimage); - - icvvResizeImage(camera->videopp.width, - camera->videopp.height, - (camera->videopp.width)*pixelsize, (char*)tmpbuff, - width, height,width*pixelsize, image->data, pixelsize*8); - - free(tmpbuff); - - } - - //fprintf(stdout, "cvVideoRendering:image converted!!!!\n"); - - if(XShm) - { - XShmPutImage(display, window, gc, - image,0,0,0,0, width, - height, False); - } - else - { - XPutImage(display, window, gc, - image,0,0,0,0, width, - height); - } - - XSync(display, False); -#ifdef RENDER_FRAMERATE - now = time(NULL); - frames++; - if (now-start) - rate = frames/(float)(now-start); - if((frames%30) == 0) - fprintf(stdout, "camera %d fps = %f\n", cameraid, rate); -#endif - }//if(cvcamGetProperty(CAMERA, "raw_image",&image )) - - // stop here if we're paused - pthread_mutex_lock(&(camera->pausemutex)); - pthread_mutex_unlock(&(camera->pausemutex)); - pthread_mutex_lock(&(camera->capturestatemutex)); - }//while (camera->state == CAPTURING && camera->rendered) - pthread_mutex_unlock(&(camera->capturestatemutex)); - - pthread_mutex_lock(&(camera->capturestatemutex)); -#if 0 - if(camera->state != CAPTURING) { - // we ended because the camera is not capturing anymore - while (camera->capturestate != FINISHED ) - { - pthread_cond_wait(&(camera->capturestatecond),&(camera->capturestatemutex)); - } - } -#endif - camera->renderstate=0; - pthread_cond_signal(&(camera->capturestatecond)); - pthread_mutex_unlock(&(camera->capturestatemutex)); - - XShmDetach (display, &xshmseg); - XDestroyImage (image); - XFreeGC(display,gc); - shmdt (xshmseg.shmaddr); - shmctl (xshmseg.shmid, IPC_RMID, 0); - if(imgdata) - free(imgdata); - pthread_exit(NULL); -} - -//////////////////////////////////////////////////////////////////////////////// -int icvVideoWindowPixelsize(int depth) -{ - switch (depth) - { - case 32: - return 4; - - case 24: - return 4; - - case 16: - return 2; - - case 8: - return 1; - - default: - return 0; - } - return 0; -} - -////////////////////////////////////////////////////////////////////////////////