00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef ENVISION_ENVISION_SMOKETEST_C_DEFINED
00039 #define ENVISION_ENVISION_SMOKETEST_C_DEFINED
00040
00041 #include "Envision/env_alloc.h"
00042 #include "Envision/env_c_math_ops.h"
00043 #include "Envision/env_image.h"
00044 #include "Envision/env_image_ops.h"
00045 #include "Envision/env_log.h"
00046 #include "Envision/env_params.h"
00047 #include "Envision/env_stdio_interface.h"
00048 #include "Envision/env_visual_cortex.h"
00049
00050 #include <stdio.h>
00051 #include <stdlib.h>
00052 #include <sys/types.h>
00053 #include <sys/wait.h>
00054 #include <unistd.h>
00055
00056
00057
00058 static void* malloc_thunk(env_size_t n)
00059 {
00060 return malloc(n);
00061 }
00062
00063
00064 static void run_evc(char **fnames, size_t nnames)
00065 {
00066 struct env_params envp;
00067 env_params_set_defaults(&envp);
00068
00069 envp.maxnorm_type = ENV_VCXNORM_MAXNORM;
00070 envp.scale_bits = 16;
00071
00072 env_assert_set_handler(&env_stdio_assert_handler);
00073 env_allocation_init(&malloc_thunk, &free);
00074
00075 struct env_visual_cortex ivc;
00076 env_visual_cortex_init(&ivc, &envp);
00077
00078 for (int n = 0; n < nnames; ++n)
00079 {
00080 struct env_dims indims;
00081 struct env_rgb_pixel* input = 0;
00082
00083 input = env_stdio_parse_rgb(fnames[n], &indims);
00084
00085 struct env_image ivcout = env_img_initializer;
00086 struct env_image intens = env_img_initializer;
00087 struct env_image color = env_img_initializer;
00088 struct env_image ori = env_img_initializer;
00089 #ifdef ENV_WITH_DYNAMIC_CHANNELS
00090 struct env_image flicker = env_img_initializer;
00091 struct env_image motion = env_img_initializer;
00092 #endif
00093
00094 env_visual_cortex_input(&ivc, &envp,
00095 "visualcortex",
00096 input, 0, indims,
00097 0,
00098 0,
00099 &ivcout,
00100 &intens, &color, &ori
00101 #ifdef ENV_WITH_DYNAMIC_CHANNELS
00102 , &flicker, &motion
00103 #endif
00104 );
00105
00106 env_deallocate(input);
00107 input = 0;
00108
00109 env_visual_cortex_rescale_ranges(
00110 &ivcout, &intens, &color, &ori
00111 #ifdef ENV_WITH_DYNAMIC_CHANNELS
00112 , &flicker, &motion
00113 #endif
00114 );
00115
00116 env_img_make_empty(&ivcout);
00117 env_img_make_empty(&intens);
00118 env_img_make_empty(&color);
00119 env_img_make_empty(&ori);
00120 #ifdef ENV_WITH_DYNAMIC_CHANNELS
00121 env_img_make_empty(&flicker);
00122 env_img_make_empty(&motion);
00123 #endif
00124 }
00125
00126 env_visual_cortex_destroy(&ivc);
00127
00128 env_allocation_cleanup();
00129 }
00130
00131
00132 int main(int argc, const char** argv)
00133 {
00134 if (argc != 2)
00135 {
00136 fprintf(stderr,
00137 "usage: %s niter\n",
00138 argv[0]);
00139 return 1;
00140 }
00141
00142 const int niter = atoi(argv[1]);
00143
00144 const pid_t self = getpid();
00145
00146 srand(self);
00147
00148 for (int i = 0; i < niter; ++i)
00149 {
00150 char fnames0[3][64];
00151 char *fnames[3];
00152 fnames[0] = &fnames0[0][0];
00153 fnames[1] = &fnames0[1][0];
00154 fnames[2] = &fnames0[2][0];
00155 const int w = 1 + rand() % 2000;
00156 const int h = 1 + rand() % 2000;
00157
00158 for (int n = 0; n < 3; ++n)
00159 {
00160 snprintf(fnames[n], sizeof(fnames[n]),
00161 "smoketest-%d-%d-%06d.pnm",
00162 (int) self, i, n);
00163
00164 FILE* f = fopen(fnames[n], "w");
00165 if (f == 0)
00166 {
00167 fprintf(stderr, "couldn't open %s for writing\n",
00168 fnames[n]);
00169 exit(-1);
00170 }
00171
00172 fprintf(f, "P6\n%d %d\n255\n", w, h);
00173
00174 for (int x = 0; x < 3*w*h; ++x)
00175 {
00176 const unsigned char val = rand() % 256;
00177 fwrite(&val, 1, 1, f);
00178 }
00179
00180 fclose(f);
00181 }
00182
00183 fprintf(stderr, "running iter %d/%d with dims %dx%d... ",
00184 i+1, niter, w, h);
00185 fflush(stderr);
00186
00187 const pid_t child = fork();
00188
00189 if (child < 0)
00190 {
00191 fprintf(stderr, "fork() failed\n");
00192 exit(-1);
00193 }
00194 else if (child > 0)
00195 {
00196
00197 int status;
00198 const pid_t p = waitpid(child, &status, 0);
00199 if (p != child)
00200 {
00201 fprintf(stderr, "waitpid() failed\n");
00202 exit(-1);
00203 }
00204
00205 if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
00206 {
00207
00208 for (int n = 0; n < 3; ++n)
00209 {
00210 if (unlink(fnames[n]) != 0)
00211 {
00212 fprintf(stderr,
00213 "unlink() failed\n");
00214 exit(-1);
00215 }
00216 }
00217 fprintf(stderr, "iter %d/%d ok\n",
00218 i+1, niter);
00219 }
00220 else
00221 {
00222 fprintf(stderr, "iter %d/%d FAILED!\n",
00223 i+1, niter);
00224 }
00225
00226 continue;
00227 }
00228
00229
00230
00231 run_evc(fnames, 3);
00232
00233 exit(0);
00234 }
00235
00236 return 0;
00237 }
00238
00239
00240
00241
00242
00243
00244
00245
00246 #endif // ENVISION_ENVISION_SMOKETEST_C_DEFINED