16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2008, Nils Hasler, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Author: Bill McCord 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intuitive Automata 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// capture video from a socket connection 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_highgui.h" 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <android/log.h> 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <errno.h> 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <netdb.h> 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <unistd.h> 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define LOGV(...) __android_log_print(ANDROID_LOG_SILENT, LOG_TAG, __VA_ARGS__) 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define LOG_TAG "CVJNI" 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef NDEBUG 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_WARN(message) 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_WARN(message) fprintf(stderr, "warning: %s (%s:%d)\n", message, __FILE__, __LINE__) 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IMAGE( i, x, y, n ) *(( unsigned char * )(( i )->imageData \ 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn + ( x ) * sizeof( unsigned char ) * 3 \ 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn + ( y ) * ( i )->widthStep ) + ( n )) 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass CVCapture_Socket : public CvCapture 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CVCapture_Socket() 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pAddrInfo = 0; 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn width = 0; 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn height = 0; 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn readBufSize = 0; 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn readBuf = 0; 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame = 0; 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~CVCapture_Socket() 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn close(); 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool open(const char* _address, const char* _port, int _width, int _height); 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void close(); 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual double getProperty(int); 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool setProperty(int, double); 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool grabFrame(); 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual IplImage* retrieveFrame(); 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn struct addrinfo *pAddrInfo; 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int width; // the width of the images received over the socket 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int height; // the height of the images received over the socket 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long readBufSize; // the length of the read buffer 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char *readBuf; // the read buffer 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IplImage* frame; 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// The open method simply initializes some variables we will need later. 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool CVCapture_Socket::open(const char* _address, const char* _port, int _width, int _height) 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Free the addrinfo if it was allocated. 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (pAddrInfo) 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn freeaddrinfo(pAddrInfo); 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pAddrInfo = 0; 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Check the easy stuff first. 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn width = _width; 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn height = _height; 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (width <= 0 || height <= 0) 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("Invalid width or height!"); 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Setup a new addrinfo to support a streaming socket at the given address and port. 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn struct addrinfo hints; 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memset(&hints, 0, sizeof hints); 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hints.ai_socktype = SOCK_STREAM; 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hints.ai_flags = AI_NUMERICHOST; 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int error = getaddrinfo(_address, _port, &hints, &pAddrInfo); 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (error) 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char buffer[100]; 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sprintf(buffer, "getaddrinfo error: %s", gai_strerror(error)); 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("%s", buffer); 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn freeaddrinfo(pAddrInfo); 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pAddrInfo = 0; 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn readBufSize = width * height * sizeof(int); 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn readBuf = (char*)malloc(readBufSize); 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (!readBuf) 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("out of memory error"); 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn freeaddrinfo(pAddrInfo); 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pAddrInfo = 0; 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return true; 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Close cleans up all of our state and cached data. 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid CVCapture_Socket::close() 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("Setting simple vars to 0"); 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn width = 0; 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn height = 0; 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn readBufSize = 0; 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("Freeing Addr Info"); 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (pAddrInfo) 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn freeaddrinfo(pAddrInfo); 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pAddrInfo = 0; 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("Freeing Buffer"); 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (readBuf) 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn free(readBuf); 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn readBuf = 0; 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("Releasing Image"); 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (frame) 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseImage( &frame ); 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame = 0; 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("Done closing Capture Socket"); 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Helper to load pixels from a byte stream received over a socket. 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic IplImage* loadPixels(char* pixels, int width, int height) { 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int x, y, pos, int_size = sizeof(int); 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for ( y = 0; y < height; y++ ) { 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pos = y * width * int_size; 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for ( x = 0; x < width; x++, pos += int_size ) { 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // blue 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IMAGE( img, x, y, 0 ) = pixels[pos + 3] & 0xFF; 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // green 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IMAGE( img, x, y, 1 ) = pixels[pos + 2] & 0xFF; 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // red 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IMAGE( img, x, y, 2 ) = pixels[pos + 1] & 0xFF; 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return img; 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Grabs a frame (image) from a socket. 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool CVCapture_Socket::grabFrame() 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // First ensure that our addrinfo and read buffer are allocated. 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (pAddrInfo == 0 || readBuf == 0) 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("You haven't opened the socket capture yet!"); 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Establish the socket. 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int sockd = socket(pAddrInfo->ai_family, pAddrInfo->ai_socktype, pAddrInfo->ai_protocol); 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (sockd < 0 || errno != 0) 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char buffer[100]; 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sprintf(buffer, "Failed to create socket, errno = %d", errno); 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("%s", buffer); 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ::close(sockd); 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Now connect to the socket. 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (connect(sockd, pAddrInfo->ai_addr, pAddrInfo->ai_addrlen) < 0 || errno != 0) 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char buffer[100]; 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sprintf(buffer, "socket connection errorno = %d", errno); 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("%s", buffer); 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ::close(sockd); 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Release the image if it hasn't been already because we are going to overwrite it. 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (frame) 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseImage( &frame ); 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame = 0; 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Read the socket until we have filled the data with the space allocated OR run 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // out of data which we treat as an error. 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long read_count, total_read = 0; 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while (total_read < readBufSize) 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn read_count = read(sockd, &readBuf[total_read], readBufSize); 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (read_count <= 0 || errno != 0) 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char buffer[100]; 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sprintf(buffer, "socket read errorno = %d", errno); 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("%s", buffer); 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn total_read += read_count; 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // If we read all of the data we expected, we will load the frame from the pixels. 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (total_read == readBufSize) 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame = loadPixels(readBuf, width, height); 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("full read of pixels failed"); 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Close the socket and return the frame! 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ::close(sockd); 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return frame != 0; 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIplImage* CVCapture_Socket::retrieveFrame() 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return frame; 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble CVCapture_Socket::getProperty(int id) 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("unknown/unhandled property"); 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return 0; 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool CVCapture_Socket::setProperty(int id, double value) 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn LOGV("unknown/unhandled property"); 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvCapture* cvCreateCameraCapture_Socket( const char *address, const char *port, int width, int height ) 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CVCapture_Socket* capture = new CVCapture_Socket; 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if ( capture-> open(address, port, width, height) ) 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return capture; 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn delete capture; 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return 0; 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 303