diff -ur cvcapture-0.2.0.orig/config.m4 cvcapture-0.2.0/config.m4 --- cvcapture-0.2.0.orig/config.m4 2008-02-26 11:53:05.000000000 +0900 +++ cvcapture-0.2.0/config.m4 2008-02-26 11:53:23.000000000 +0900 @@ -39,12 +39,12 @@ AC_MSG_CHECKING(PHP version) AC_TRY_COMPILE([#include ], [ -#if PHP_VERSION_ID < 40000 -#error this extension requires at least PHP version 4.0.0 +#if PHP_MAJOR_VERSION < 4 || (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION < 4) +#error this extension requires at least PHP version 4.4.0 #endif ], [AC_MSG_RESULT(ok)], -[AC_MSG_ERROR([need at least PHP 4.0.0])]) +[AC_MSG_ERROR([need at least PHP 4.4.0])]) export CPPFLAGS="$OLD_CPPFLAGS" diff -ur cvcapture-0.2.0.orig/cvcapture.c cvcapture-0.2.0/cvcapture.c --- cvcapture-0.2.0.orig/cvcapture.c 2008-02-26 11:53:05.000000000 +0900 +++ cvcapture-0.2.0/cvcapture.c 2008-02-26 11:53:23.000000000 +0900 @@ -164,21 +164,65 @@ Capture from camera. */ PHP_FUNCTION(cv_camera_capture) { - const char * filename = NULL; int filename_len = 0; - long index = 0; + long index = CV_CAP_ANY; zval * size = NULL; - - + char *fullpath; + CvCapture *capture; + IplImage *image; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lz", &filename, &filename_len, &index, &size) == FAILURE) { return; } - php_error(E_WARNING, "cv_camera_capture: not yet implemented"); RETURN_FALSE; + if (strlen(filename) != filename_len || + (fullpath = expand_filepath(filename, NULL TSRMLS_CC)) == NULL) + { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong filename given"); + RETURN_FALSE; + } - RETURN_FALSE; + if (php_check_open_basedir(fullpath TSRMLS_CC) || + (PG(safe_mode) && !php_checkuid(fullpath, NULL, CHECKUID_CHECK_FILE_AND_DIR))) + { + efree(fullpath); + RETURN_FALSE; + } + + capture = cvCreateCameraCapture((int)index); + if (capture == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create camera capture"); + efree(fullpath); + RETURN_FALSE; + } + + image = cvQueryFrame(capture); + if (image == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot retrieve image"); + cvReleaseCapture(&capture); + efree(fullpath); + RETURN_FALSE; + } + + if (!cvSaveImage(fullpath, image)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot save image to '%s'", filename); + cvReleaseCapture(&capture); + efree(fullpath); + RETURN_FALSE; + } + + if (size != NULL) { + CvSize imgsize = cvGetSize(image); + zval_dtor(size); + array_init(size); + add_next_index_long(size, (long)imgsize.width); + add_next_index_long(size, (long)imgsize.height); + } + + cvReleaseCapture(&capture); + efree(fullpath); + RETURN_TRUE; } /* }}} cv_camera_capture */ @@ -187,22 +231,81 @@ Capture from video file. */ PHP_FUNCTION(cv_file_capture) { - const char * dst_filename = NULL; int dst_filename_len = 0; const char * src_filename = NULL; int src_filename_len = 0; zval * size = NULL; - - + char *dst_fullpath, *src_fullpath; + CvCapture *capture; + IplImage *image; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|z", &dst_filename, &dst_filename_len, &src_filename, &src_filename_len, &size) == FAILURE) { return; } - php_error(E_WARNING, "cv_file_capture: not yet implemented"); RETURN_FALSE; + if (strlen(dst_filename) != dst_filename_len || + (dst_fullpath = expand_filepath(dst_filename, NULL TSRMLS_CC)) == NULL) + { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong destination filename given"); + RETURN_FALSE; + } + + if (strlen(src_filename) != src_filename_len || + (src_fullpath = expand_filepath(src_filename, NULL TSRMLS_CC)) == NULL) + { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong source filename given"); + efree(dst_fullpath); + RETURN_FALSE; + } + + if (php_check_open_basedir(dst_fullpath TSRMLS_CC) || + php_check_open_basedir(src_fullpath TSRMLS_CC) || + (PG(safe_mode) && (!php_checkuid(dst_fullpath, NULL, CHECKUID_CHECK_FILE_AND_DIR) || + !php_checkuid(src_fullpath, NULL, CHECKUID_CHECK_FILE_AND_DIR)))) + { + efree(src_fullpath); + efree(dst_fullpath); + RETURN_FALSE; + } - RETURN_FALSE; + capture = cvCreateFileCapture(src_fullpath); + if (capture == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create file capture from '%s'", src_fullpath); + efree(src_fullpath); + efree(dst_fullpath); + RETURN_FALSE; + } + + image = cvQueryFrame(capture); + if (image == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot retrieve image"); + cvReleaseCapture(&capture); + efree(src_fullpath); + efree(dst_fullpath); + RETURN_FALSE; + } + + if (!cvSaveImage(dst_fullpath, image)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot save image to '%s'", dst_fullpath); + cvReleaseCapture(&capture); + efree(src_fullpath); + efree(dst_fullpath); + RETURN_FALSE; + } + + if (size != NULL) { + CvSize imgsize = cvGetSize(image); + zval_dtor(size); + array_init(size); + add_next_index_long(size, (long)imgsize.width); + add_next_index_long(size, (long)imgsize.height); + } + + cvReleaseCapture(&capture); + efree(src_fullpath); + efree(dst_fullpath); + RETURN_TRUE; } /* }}} cv_file_capture */ @@ -214,15 +317,17 @@ CvCapture * return_res; long return_res_id = -1; - long index = 0; - - + long index = CV_CAP_ANY; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &index) == FAILURE) { return; } - php_error(E_WARNING, "cv_create_camera_capture: not yet implemented"); RETURN_FALSE; + return_res = cvCreateCameraCapture((int)index); + if (return_res == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create camera capture"); + RETURN_FALSE; + } ZEND_REGISTER_RESOURCE(return_value, return_res, le_cvcapture); } @@ -238,15 +343,34 @@ const char * filename = NULL; int filename_len = 0; - - + char *fullpath; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) { return; } - php_error(E_WARNING, "cv_create_file_capture: not yet implemented"); RETURN_FALSE; + if (strlen(filename) != filename_len || + (fullpath = expand_filepath(filename, NULL TSRMLS_CC)) == NULL) + { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong filename given"); + RETURN_FALSE; + } + + if (php_check_open_basedir(fullpath TSRMLS_CC) || + (PG(safe_mode) && !php_checkuid(fullpath, NULL, CHECKUID_CHECK_FILE_AND_DIR))) + { + efree(fullpath); + RETURN_FALSE; + } + + return_res = cvCreateFileCapture(fullpath); + if (return_res == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create file capture from '%s'", fullpath); + efree(fullpath); + RETURN_FALSE; + } + efree(fullpath); ZEND_REGISTER_RESOURCE(return_value, return_res, le_cvcapture); } /* }}} cv_create_file_capture */ @@ -263,19 +387,51 @@ const char * filename = NULL; int filename_len = 0; zval * size = NULL; - - + char *fullpath; + IplImage *image; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|z", &capture, &filename, &filename_len, &size) == FAILURE) { return; } ZEND_FETCH_RESOURCE(res_capture, CvCapture *, &capture, capture_id, "cvcapture", le_cvcapture); + if (strlen(filename) != filename_len || + (fullpath = expand_filepath(filename, NULL TSRMLS_CC)) == NULL) + { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong filename given"); + RETURN_FALSE; + } + + if (php_check_open_basedir(fullpath TSRMLS_CC) || + (PG(safe_mode) && !php_checkuid(fullpath, NULL, CHECKUID_CHECK_FILE_AND_DIR))) + { + efree(fullpath); + RETURN_FALSE; + } + + image = cvQueryFrame(res_capture); + if (image == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot retrieve image"); + efree(fullpath); + RETURN_FALSE; + } + if (!cvSaveImage(fullpath, image)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot save image to '%s'", filename); + efree(fullpath); + RETURN_FALSE; + } - php_error(E_WARNING, "cv_save_capture: not yet implemented"); RETURN_FALSE; + if (size != NULL) { + CvSize imgsize = cvGetSize(image); + zval_dtor(size); + array_init(size); + add_next_index_long(size, (long)imgsize.width); + add_next_index_long(size, (long)imgsize.height); + } - RETURN_FALSE; + efree(fullpath); + RETURN_TRUE; } /* }}} cv_save_capture */ diff -ur cvcapture-0.2.0.orig/php_cvcapture.h cvcapture-0.2.0/php_cvcapture.h --- cvcapture-0.2.0.orig/php_cvcapture.h 2008-02-26 11:53:05.000000000 +0900 +++ cvcapture-0.2.0/php_cvcapture.h 2008-02-26 11:53:23.000000000 +0900 @@ -104,7 +104,7 @@ ZEND_ARG_INFO(1, size) ZEND_END_ARG_INFO() #else /* PHP 4.x */ -#define cv_camera_capture_arg_info NULL +#define cv_camera_capture_arg_info third_arg_force_ref #endif PHP_FUNCTION(cv_file_capture); @@ -115,7 +115,7 @@ ZEND_ARG_INFO(1, size) ZEND_END_ARG_INFO() #else /* PHP 4.x */ -#define cv_file_capture_arg_info NULL +#define cv_file_capture_arg_info third_arg_force_ref #endif PHP_FUNCTION(cv_create_camera_capture); @@ -144,7 +144,7 @@ ZEND_ARG_INFO(1, size) ZEND_END_ARG_INFO() #else /* PHP 4.x */ -#define cv_save_capture_arg_info NULL +#define cv_save_capture_arg_info third_arg_force_ref #endif #ifdef __cplusplus