diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/apriltag.h b/apriltag/src/main/native/thirdparty/apriltag/include/apriltag.h index 895b3459b8..eb58a71d97 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/apriltag.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/apriltag.h @@ -269,7 +269,7 @@ void apriltag_detections_destroy(zarray_t *detections); // Renders the apriltag. // Caller is responsible for calling image_u8_destroy on the image -image_u8_t *apriltag_to_image(apriltag_family_t *fam, uint32_t idx); +image_u8_t *apriltag_to_image(apriltag_family_t *fam, int idx); #ifdef __cplusplus } diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/apriltag_pose.h b/apriltag/src/main/native/thirdparty/apriltag/include/apriltag_pose.h index 6bbe4a4e00..72993f1151 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/apriltag_pose.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/apriltag_pose.h @@ -63,7 +63,7 @@ void estimate_tag_pose_orthogonal_iteration( apriltag_pose_t* pose1, double* err2, apriltag_pose_t* pose2, - int nIters, + int nIters, double min_improvement_per_iteration); /** diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/homography.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/homography.h index c8cf2b7161..b1560c3729 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/homography.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/homography.h @@ -176,7 +176,7 @@ matd_t *homography_to_pose(const matd_t *H, double fx, double fy, double cx, dou // [ 0 0 C D ] // [ 0 0 -1 0 ] -matd_t *homography_to_model_view(const matd_t *H, double F, double G, double A, double B); +matd_t *homography_to_model_view(const matd_t *H, double F, double G, double A, double B, double C, double D); #ifdef __cplusplus } diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/image_u8x3.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/image_u8x3.h index 649779473c..4d1713dca5 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/image_u8x3.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/image_u8x3.h @@ -57,7 +57,7 @@ void image_u8x3_destroy(image_u8x3_t *im); int image_u8x3_write_pnm(const image_u8x3_t *im, const char *path); // only width 1 supported -void image_u8x3_draw_line(image_u8x3_t *im, float x0, float y0, float x1, float y1, uint8_t rgb[3]); +void image_u8x3_draw_line(image_u8x3_t *im, float x0, float y0, float x1, float y1, uint8_t rgb[3], int width); #ifdef __cplusplus } diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/matd.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/matd.h index a293321dec..3a79c56b05 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/matd.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/matd.h @@ -113,13 +113,13 @@ matd_t *matd_create_scalar(double v); * Retrieves the cell value for matrix 'm' at the given zero-based row and column index. * Performs more thorough validation checking than MATD_EL(). */ -double matd_get(const matd_t *m, unsigned int row, unsigned int col); +double matd_get(const matd_t *m, int row, int col); /** * Assigns the given value to the matrix cell at the given zero-based row and * column index. Performs more thorough validation checking than MATD_EL(). */ -void matd_put(matd_t *m, unsigned int row, unsigned int col, double value); +void matd_put(matd_t *m, int row, int col, double value); /** * Retrieves the scalar value of the given element ('m' must be a scalar). @@ -147,7 +147,7 @@ matd_t *matd_copy(const matd_t *m); * beyond the number of rows/columns of 'a'. It is the caller's responsibility to * call matd_destroy() on the returned matrix. */ -matd_t *matd_select(const matd_t *a, unsigned int r0, int r1, unsigned int c0, int c1); +matd_t *matd_select(const matd_t *a, int r0, int r1, int c0, int c1); /** * Prints the supplied matrix 'm' to standard output by applying the supplied diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/math_util.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/math_util.h index a68ed8bf8e..5434355a51 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/math_util.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/math_util.h @@ -27,19 +27,31 @@ either expressed or implied, of the Regents of The University of Michigan. #pragma once -#define _USE_MATH_DEFINES #include +#include #include #include #include +#include // memcpy #ifdef __cplusplus extern "C" { #endif +#ifndef M_TWOPI +# define M_TWOPI 6.2831853071795862319959 /* 2*pi */ +#endif + +#ifndef M_PI +# define M_PI 3.141592653589793238462643383279502884196 +#endif + #define to_radians(x) ( (x) * (M_PI / 180.0 )) #define to_degrees(x) ( (x) * (180.0 / M_PI )) +#define max(A, B) (A < B ? B : A) +#define min(A, B) (A < B ? A : B) + /* DEPRECATE, threshold meaningless without context. static inline int dequals(double a, double b) { @@ -99,7 +111,7 @@ static inline int irand(int bound) /** Map vin to [0, 2*PI) **/ static inline double mod2pi_positive(double vin) { - return vin - M_2_PI * floor(vin / M_2_PI); + return vin - M_TWOPI * floor(vin / M_TWOPI); } /** Map vin to [-PI, PI) **/ @@ -133,7 +145,7 @@ static inline int mod_positive(int vin, int mod) { static inline int theta_to_int(double theta, int max) { theta = mod2pi_ref(M_PI, theta); - int v = (int) (theta / M_2_PI * max); + int v = (int) (theta / M_TWOPI * max); if (v == max) v = 0; diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/pam.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/pam.h index 5e03a1308f..67fff6748d 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/pam.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/pam.h @@ -40,7 +40,7 @@ struct pam int depth; // bytes per pixel int maxval; // maximum value per channel, e.g. 255 for 8bpp - size_t datalen; // in bytes + int datalen; // in bytes uint8_t *data; }; diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/pthreads_cross.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/pthreads_cross.h index 39d28729bb..54f1865848 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/pthreads_cross.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/pthreads_cross.h @@ -30,7 +30,6 @@ SOFTWARE. #include #include #endif -#include #ifdef _WIN32 diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/string_util.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/string_util.h index 765f5a1d75..d0363b03f2 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/string_util.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/string_util.h @@ -202,7 +202,7 @@ bool str_matches_any(const char *haystack, const char **needles, int num_needles * * Note: startidx must be >= endidx */ -char *str_substring(const char *str, size_t startidx, size_t endidx); +char *str_substring(const char *str, size_t startidx, long endidx); /** * Retrieves the zero-based index of the beginning of the supplied substring diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/time_util.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/time_util.h index 58da911010..c42466b3a0 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/time_util.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/time_util.h @@ -40,8 +40,6 @@ typedef long long suseconds_t; inline int gettimeofday(struct timeval* tp, void* tzp) { - (void)tzp; - unsigned long t; t = time(NULL); tp->tv_sec = t / 1000; diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/zarray.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/zarray.h index 1c9da4a6a8..411ee7b649 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/zarray.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/zarray.h @@ -355,7 +355,7 @@ static inline void zarray_map(zarray_t *za, void (*f)(void*)) * * void map_function(element_type *element) */ - void zarray_vmap(zarray_t *za, void (*f)(void *)); + void zarray_vmap(zarray_t *za, void (*f)(void*)); /** * Removes all elements from the array and sets its size to zero. Pointers to diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/common/zmaxheap.h b/apriltag/src/main/native/thirdparty/apriltag/include/common/zmaxheap.h index 2f4a90d684..af9d1458c5 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/include/common/zmaxheap.h +++ b/apriltag/src/main/native/thirdparty/apriltag/include/common/zmaxheap.h @@ -39,7 +39,7 @@ struct zmaxheap_iterator { zmaxheap_t *zmaxheap_create(size_t el_sz); -void zmaxheap_vmap(zmaxheap_t *heap, void (*f)(void *)); +void zmaxheap_vmap(zmaxheap_t *heap, void (*f)(void*)); void zmaxheap_destroy(zmaxheap_t *heap); diff --git a/apriltag/src/main/native/thirdparty/apriltag/include/test/getline.h b/apriltag/src/main/native/thirdparty/apriltag/include/test/getline.h deleted file mode 100644 index ba190730c3..0000000000 --- a/apriltag/src/main/native/thirdparty/apriltag/include/test/getline.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include -#include -#include - -typedef intptr_t ssize_t; - -ssize_t apriltag_test_getline(char **lineptr, size_t *n, FILE *stream); diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/apriltag.c b/apriltag/src/main/native/thirdparty/apriltag/src/apriltag.c index b7e24c4bc2..bfff1ea9d5 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/apriltag.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/apriltag.c @@ -32,7 +32,6 @@ either expressed or implied, of the Regents of The University of Michigan. #include "apriltag.h" -#define _USE_MATH_DEFINES #include #include #include @@ -52,6 +51,10 @@ either expressed or implied, of the Regents of The University of Michigan. #include "apriltag_math.h" +#ifndef M_PI +# define M_PI 3.141592653589793238462643383279502884196 +#endif + #ifdef _WIN32 static inline void srandom(unsigned int seed) { @@ -226,7 +229,7 @@ static void quick_decode_init(apriltag_family_t *family, int maxhamming) errno = 0; - for (uint32_t i = 0; i < family->ncodes; i++) { + for (int i = 0; i < family->ncodes; i++) { uint64_t code = family->codes[i]; // add exact code (hamming = 0) @@ -443,10 +446,6 @@ static matd_t* homography_compute2(double c[4][4]) { } } - if (max_val_idx < 0) { - return NULL; - } - if (max_val < epsilon) { debug_print("WRN: Matrix is singular.\n"); return NULL; @@ -623,7 +622,7 @@ static float quad_decode(apriltag_detector_t* td, apriltag_family_t *family, ima graymodel_init(&whitemodel); graymodel_init(&blackmodel); - for (long unsigned int pattern_idx = 0; pattern_idx < sizeof(patterns)/(5*sizeof(float)); pattern_idx ++) { + for (int pattern_idx = 0; pattern_idx < sizeof(patterns)/(5*sizeof(float)); pattern_idx ++) { float *pattern = &patterns[pattern_idx * 5]; int is_white = pattern[4]; @@ -684,7 +683,7 @@ static float quad_decode(apriltag_detector_t* td, apriltag_family_t *family, ima double *values = calloc(family->total_width*family->total_width, sizeof(double)); int min_coord = (family->width_at_border - family->total_width)/2; - for (uint32_t i = 0; i < family->nbits; i++) { + for (int i = 0; i < family->nbits; i++) { int bity = family->bit_y[i]; int bitx = family->bit_x[i]; @@ -717,7 +716,7 @@ static float quad_decode(apriltag_detector_t* td, apriltag_family_t *family, ima sharpen(td, values, family->total_width); uint64_t rcode = 0; - for (uint32_t i = 0; i < family->nbits; i++) { + for (int i = 0; i < family->nbits; i++) { int bity = family->bit_y[i]; int bitx = family->bit_x[i]; rcode = (rcode << 1); @@ -1339,7 +1338,8 @@ zarray_t *apriltag_detector_detect(apriltag_detector_t *td, image_u8_t *im_orig) int k = (j + 1) & 3; image_u8x3_draw_line(out, det->p[j][0], det->p[j][1], det->p[k][0], det->p[k][1], - (uint8_t[]) { rgb[0], rgb[1], rgb[2] }); + (uint8_t[]) { rgb[0], rgb[1], rgb[2] }, + 1); } } @@ -1419,10 +1419,10 @@ void apriltag_detections_destroy(zarray_t *detections) zarray_destroy(detections); } -image_u8_t *apriltag_to_image(apriltag_family_t *fam, uint32_t idx) +image_u8_t *apriltag_to_image(apriltag_family_t *fam, int idx) { assert(fam != NULL); - assert(idx < fam->ncodes); + assert(idx >= 0 && idx < fam->ncodes); uint64_t code = fam->codes[idx]; @@ -1439,7 +1439,7 @@ image_u8_t *apriltag_to_image(apriltag_family_t *fam, uint32_t idx) } int border_start = (fam->total_width - fam->width_at_border)/2; - for (uint32_t i = 0; i < fam->nbits; i++) { + for (int i = 0; i < fam->nbits; i++) { if (code & (APRILTAG_U64_ONE << (fam->nbits - i - 1))) { im->buf[(fam->bit_y[i] + border_start)*im->stride + fam->bit_x[i] + border_start] = 255; } diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/apriltag_quad_thresh.c b/apriltag/src/main/native/thirdparty/apriltag/src/apriltag_quad_thresh.c index f8f6aff721..677f365765 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/apriltag_quad_thresh.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/apriltag_quad_thresh.c @@ -28,7 +28,6 @@ either expressed or implied, of the Regents of The University of Michigan. // limitation: image size must be <32768 in width and height. This is // because we use a fixed-point 16 bit integer representation with one // fractional bit. -#define _USE_MATH_DEFINES #include #include #include @@ -62,6 +61,10 @@ struct uint64_zarray_entry struct uint64_zarray_entry *next; }; +#ifndef M_PI +# define M_PI 3.141592653589793238462643383279502884196 +#endif + struct pt { // Note: these represent 2*actual value. @@ -265,13 +268,8 @@ void fit_line(struct line_fit_pt *lfps, int sz, int i0, int i1, double *lineparm } double length = sqrtf(M); - if (fabs(length) < 1e-12) { - lineparm[2] = lineparm[3] = 0; - } - else { - lineparm[2] = nx/length; - lineparm[3] = ny/length; - } + lineparm[2] = nx/length; + lineparm[3] = ny/length; } // sum of squared errors = @@ -438,7 +436,7 @@ int quad_segment_maxima(apriltag_detector_t *td, zarray_t *cluster, struct line_ double err01, err12, err23, err30; double mse01, mse12, mse23, mse30; - double params01[4], params12[4]; + double params01[4], params12[4], params23[4], params30[4]; // disallow quads where the angle is less than a critical value. double max_dot = td->qtp.cos_critical_rad; //25*M_PI/180); @@ -468,11 +466,11 @@ int quad_segment_maxima(apriltag_detector_t *td, zarray_t *cluster, struct line_ for (int m3 = m2+1; m3 < nmaxima; m3++) { int i3 = maxima[m3]; - fit_line(lfps, sz, i2, i3, NULL, &err23, &mse23); + fit_line(lfps, sz, i2, i3, params23, &err23, &mse23); if (mse23 > td->qtp.max_line_fit_mse) continue; - fit_line(lfps, sz, i3, i0, NULL, &err30, &mse30); + fit_line(lfps, sz, i3, i0, params30, &err30, &mse30); if (mse30 > td->qtp.max_line_fit_mse) continue; @@ -503,7 +501,7 @@ int quad_segment_maxima(apriltag_detector_t *td, zarray_t *cluster, struct line_ } // returns 0 if the cluster looks bad. -int quad_segment_agg(zarray_t *cluster, struct line_fit_pt *lfps, int indices[4]) +int quad_segment_agg(apriltag_detector_t *td, zarray_t *cluster, struct line_fit_pt *lfps, int indices[4]) { int sz = zarray_size(cluster); @@ -850,8 +848,43 @@ int fit_quad( // step for segmenting them into four lines. if (1) { ptsort((struct pt*) cluster->data, zarray_size(cluster)); + + // remove duplicate points. (A byproduct of our segmentation system.) + if (1) { + int outpos = 1; + + struct pt *last; + zarray_get_volatile(cluster, 0, &last); + + for (int i = 1; i < sz; i++) { + + struct pt *p; + zarray_get_volatile(cluster, i, &p); + + if (p->x != last->x || p->y != last->y) { + + if (i != outpos) { + struct pt *out; + zarray_get_volatile(cluster, outpos, &out); + memcpy(out, p, sizeof(struct pt)); + } + + outpos++; + } + + last = p; + } + + cluster->size = outpos; + sz = outpos; + } + } + if (sz < 24) + return 0; + + struct line_fit_pt *lfps = compute_lfps(sz, cluster, im); int indices[4]; @@ -859,7 +892,7 @@ int fit_quad( if (!quad_segment_maxima(td, cluster, lfps, indices)) goto finish; } else { - if (!quad_segment_agg(cluster, lfps, indices)) + if (!quad_segment_agg(td, cluster, lfps, indices)) goto finish; } @@ -870,10 +903,10 @@ int fit_quad( int i0 = indices[i]; int i1 = indices[(i+1)&3]; - double mse; - fit_line(lfps, sz, i0, i1, lines[i], NULL, &mse); + double err; + fit_line(lfps, sz, i0, i1, lines[i], NULL, &err); - if (mse > td->qtp.max_line_fit_mse) { + if (err > td->qtp.max_line_fit_mse) { res = 0; goto finish; } @@ -903,11 +936,11 @@ int fit_quad( double det = A00 * A11 - A10 * A01; // inverse. + double W00 = A11 / det, W01 = -A01 / det; if (fabs(det) < 0.001) { res = 0; goto finish; } - double W00 = A11 / det, W01 = -A01 / det; // solve double L0 = W00*B0 + W01*B1; @@ -980,7 +1013,7 @@ int fit_quad( #define DO_UNIONFIND2(dx, dy) if (im->buf[(y + dy)*s + x + dx] == v) unionfind_connect(uf, y*w + x, (y + dy)*w + x + dx); -static void do_unionfind_first_line(unionfind_t *uf, image_u8_t *im, int w, int s) +static void do_unionfind_first_line(unionfind_t *uf, image_u8_t *im, int h, int w, int s) { int y = 0; uint8_t v; @@ -995,7 +1028,7 @@ static void do_unionfind_first_line(unionfind_t *uf, image_u8_t *im, int w, int } } -static void do_unionfind_line2(unionfind_t *uf, image_u8_t *im, int w, int s, int y) +static void do_unionfind_line2(unionfind_t *uf, image_u8_t *im, int h, int w, int s, int y) { assert(y > 0); @@ -1041,7 +1074,7 @@ static void do_unionfind_task2(void *p) struct unionfind_task *task = (struct unionfind_task*) p; for (int y = task->y0; y < task->y1; y++) { - do_unionfind_line2(task->uf, task->im, task->w, task->s, y); + do_unionfind_line2(task->uf, task->im, task->h, task->w, task->s, y); } } @@ -1065,10 +1098,10 @@ static void do_quad_task(void *p) // a cluster should contain only boundary points around the // tag. it cannot be bigger than the whole screen. (Reject // large connected blobs that will be prohibitively slow to - // fit quads to.) A typical point along an edge is added two - // times (because it has 2 unique neighbors). The maximum - // perimeter is 2w+2h. - if (zarray_size(*cluster) > 2*(2*w+2*h)) { + // fit quads to.) A typical point along an edge is added three + // times (because it has 3 neighbors). The maximum perimeter + // is 2w+2h. + if (zarray_size(*cluster) > 3*(2*w+2*h)) { continue; } @@ -1498,12 +1531,12 @@ unionfind_t* connected_components(apriltag_detector_t *td, image_u8_t* threshim, unionfind_t *uf = unionfind_create(w * h); if (td->nthreads <= 1) { - do_unionfind_first_line(uf, threshim, w, ts); + do_unionfind_first_line(uf, threshim, h, w, ts); for (int y = 1; y < h; y++) { - do_unionfind_line2(uf, threshim, w, ts, y); + do_unionfind_line2(uf, threshim, h, w, ts, y); } } else { - do_unionfind_first_line(uf, threshim, w, ts); + do_unionfind_first_line(uf, threshim, h, w, ts); int sz = h; int chunksize = 1 + sz / (APRILTAG_TASKS_PER_THREAD_TARGET * td->nthreads); @@ -1533,7 +1566,7 @@ unionfind_t* connected_components(apriltag_detector_t *td, image_u8_t* threshim, // XXX stitch together the different chunks. for (int i = 1; i < ntasks; i++) { - do_unionfind_line2(uf, threshim, w, ts, tasks[i].y0 - 1); + do_unionfind_line2(uf, threshim, h, w, ts, tasks[i].y0 - 1); } free(tasks); @@ -1551,19 +1584,15 @@ zarray_t* do_gradient_clusters(image_u8_t* threshim, int ts, int y0, int y1, int mem_pools[mem_pool_idx] = calloc(mem_chunk_size, sizeof(struct uint64_zarray_entry)); for (int y = y0; y < y1; y++) { - bool connected_last = false; for (int x = 1; x < w-1; x++) { uint8_t v0 = threshim->buf[y*ts + x]; - if (v0 == 127) { - connected_last = false; + if (v0 == 127) continue; - } // XXX don't query this until we know we need it? uint64_t rep0 = unionfind_get_representative(uf, y*w + x); if (unionfind_get_set_size(uf, rep0) < 25) { - connected_last = false; continue; } @@ -1587,7 +1616,6 @@ zarray_t* do_gradient_clusters(image_u8_t* threshim, int ts, int y0, int y1, int // A possible optimization would be to combine entries // within the same cluster. - bool connected; #define DO_CONN(dx, dy) \ if (1) { \ uint8_t v1 = threshim->buf[(y + dy)*ts + x + dx]; \ @@ -1625,7 +1653,6 @@ zarray_t* do_gradient_clusters(image_u8_t* threshim, int ts, int y0, int y1, int \ struct pt p = { .x = 2*x + dx, .y = 2*y + dy, .gx = dx*((int) v1-v0), .gy = dy*((int) v1-v0)}; \ zarray_add(entry->cluster, &p); \ - connected = true; \ } \ } \ } @@ -1635,16 +1662,8 @@ zarray_t* do_gradient_clusters(image_u8_t* threshim, int ts, int y0, int y1, int DO_CONN(0, 1); // do 8 connectivity - if (!connected_last) { - // Checking 1, 1 on the previous x, y, and -1, 1 on the current - // x, y result in duplicate points in the final list. Only - // check the potential duplicate if adding this one won't - // create a duplicate. - DO_CONN(-1, 1); - } - connected = false; + DO_CONN(-1, 1); DO_CONN(1, 1); - connected_last = connected; } } #undef DO_CONN @@ -1809,8 +1828,7 @@ zarray_t* fit_quads(apriltag_detector_t *td, int w, int h, zarray_t* clusters, i normal_border |= !family->reversed_border; reversed_border |= family->reversed_border; } - if (td->quad_decimate > 1) - min_tag_width /= td->quad_decimate; + min_tag_width /= td->quad_decimate; if (min_tag_width < 3) { min_tag_width = 3; } @@ -1872,7 +1890,7 @@ zarray_t *apriltag_quad_thresh(apriltag_detector_t *td, image_u8_t *im) for (int x = 0; x < w; x++) { uint32_t v = unionfind_get_representative(uf, y*w+x); - if ((int)unionfind_get_set_size(uf, v) < td->qtp.min_cluster_pixels) + if (unionfind_get_set_size(uf, v) < td->qtp.min_cluster_pixels) continue; uint32_t color = colors[v]; diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/g2d.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/g2d.c index 64c9b1b334..e010643771 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/g2d.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/g2d.c @@ -33,6 +33,13 @@ either expressed or implied, of the Regents of The University of Michigan. #include "g2d.h" #include "common/math_util.h" +#ifdef _WIN32 +static inline long int random(void) +{ + return rand(); +} +#endif + double g2d_distance(const double a[2], const double b[2]) { return sqrtf(sq(a[0]-b[0]) + sq(a[1]-b[1])); @@ -120,7 +127,7 @@ int g2d_polygon_contains_point_ref(const zarray_t *poly, double q[2]) double acc_theta = 0; - double last_theta = 0; + double last_theta; for (int i = 0; i <= psz; i++) { double p[2]; @@ -321,7 +328,7 @@ int g2d_polygon_contains_point(const zarray_t *poly, double q[2]) int psz = zarray_size(poly); assert(psz > 0); - int last_quadrant = 0; + int last_quadrant; int quad_acc = 0; for (int i = 0; i <= psz; i++) { @@ -718,13 +725,6 @@ int g2d_polygon_rasterize(const zarray_t *poly, double y, double *x) */ #if 0 -#ifdef _WIN32 -static inline long int random(void) -{ - return rand(); -} -#endif - #include "timeprofile.h" int main(int argc, char *argv[]) diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/homography.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/homography.c index 5a34f68f3a..54ab47eb84 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/homography.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/homography.c @@ -357,7 +357,7 @@ matd_t *homography_to_pose(const matd_t *H, double fx, double fy, double cx, dou // [ 0 0 C D ] // [ 0 0 -1 0 ] -matd_t *homography_to_model_view(const matd_t *H, double F, double G, double A, double B) +matd_t *homography_to_model_view(const matd_t *H, double F, double G, double A, double B, double C, double D) { // Note that every variable that we compute is proportional to the scale factor of H. double R20 = -MATD_EL(H, 2, 0); diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8.c index b0a34903e5..eef6c046ea 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8.c @@ -211,7 +211,7 @@ int image_u8_write_pnm(const image_u8_t *im, const char *path) fprintf(f, "P5\n%d %d\n255\n", im->width, im->height); for (int y = 0; y < im->height; y++) { - if (im->width != (int32_t)fwrite(&im->buf[y*im->stride], 1, im->width, f)) { + if (im->width != fwrite(&im->buf[y*im->stride], 1, im->width, f)) { res = -2; goto finish; } @@ -265,9 +265,6 @@ void image_u8_draw_annulus(image_u8_t *im, float x0, float y0, float r0, float r void image_u8_draw_line(image_u8_t *im, float x0, float y0, float x1, float y1, int v, int width) { double dist = sqrtf((y1-y0)*(y1-y0) + (x1-x0)*(x1-x0)); - if (dist == 0) { - return; - } double delta = 0.5 / dist; // terrible line drawing code diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8x3.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8x3.c index 65556812a9..1463e5f1a7 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8x3.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/image_u8x3.c @@ -147,7 +147,7 @@ int image_u8x3_write_pnm(const image_u8x3_t *im, const char *path) // Only outputs to RGB fprintf(f, "P6\n%d %d\n255\n", im->width, im->height); - size_t linesz = im->width * 3; + int linesz = im->width * 3; for (int y = 0; y < im->height; y++) { if (linesz != fwrite(&im->buf[y*im->stride], 1, linesz, f)) { res = -1; @@ -163,7 +163,7 @@ finish: } // only width 1 supported -void image_u8x3_draw_line(image_u8x3_t *im, float x0, float y0, float x1, float y1, uint8_t rgb[3]) +void image_u8x3_draw_line(image_u8x3_t *im, float x0, float y0, float x1, float y1, uint8_t rgb[3], int width) { double dist = sqrtf((y1-y0)*(y1-y0) + (x1-x0)*(x1-x0)); double delta = 0.5 / dist; diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/matd.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/matd.c index 7c9088235a..f426890416 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/matd.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/matd.c @@ -105,18 +105,20 @@ matd_t *matd_identity(int dim) } // row and col are zero-based -TYPE matd_get(const matd_t *m, unsigned int row, unsigned int col) +TYPE matd_get(const matd_t *m, int row, int col) { assert(m != NULL); assert(!matd_is_scalar(m)); + assert(row >= 0); assert(row < m->nrows); + assert(col >= 0); assert(col < m->ncols); return MATD_EL(m, row, col); } // row and col are zero-based -void matd_put(matd_t *m, unsigned int row, unsigned int col, TYPE value) +void matd_put(matd_t *m, int row, int col, TYPE value) { assert(m != NULL); @@ -125,7 +127,9 @@ void matd_put(matd_t *m, unsigned int row, unsigned int col, TYPE value) return; } + assert(row >= 0); assert(row < m->nrows); + assert(col >= 0); assert(col < m->ncols); MATD_EL(m, row, col) = value; @@ -160,12 +164,12 @@ matd_t *matd_copy(const matd_t *m) return x; } -matd_t *matd_select(const matd_t * a, unsigned int r0, int r1, unsigned int c0, int c1) +matd_t *matd_select(const matd_t * a, int r0, int r1, int c0, int c1) { assert(a != NULL); - assert(r0 < a->nrows); - assert(c0 < a->ncols); + assert(r0 >= 0 && r0 < a->nrows); + assert(c0 >= 0 && c0 < a->ncols); int nrows = r1 - r0 + 1; int ncols = c1 - c0 + 1; @@ -188,8 +192,8 @@ void matd_print(const matd_t *m, const char *fmt) printf(fmt, MATD_EL(m, 0, 0)); printf("\n"); } else { - for (unsigned int i = 0; i < m->nrows; i++) { - for (unsigned int j = 0; j < m->ncols; j++) { + for (int i = 0; i < m->nrows; i++) { + for (int j = 0; j < m->ncols; j++) { printf(fmt, MATD_EL(m, i, j)); } printf("\n"); @@ -206,8 +210,8 @@ void matd_print_transpose(const matd_t *m, const char *fmt) printf(fmt, MATD_EL(m, 0, 0)); printf("\n"); } else { - for (unsigned int j = 0; j < m->ncols; j++) { - for (unsigned int i = 0; i < m->nrows; i++) { + for (int j = 0; j < m->ncols; j++) { + for (int i = 0; i < m->nrows; i++) { printf(fmt, MATD_EL(m, i, j)); } printf("\n"); @@ -237,10 +241,10 @@ matd_t *matd_multiply(const matd_t *a, const matd_t *b) assert(a->ncols == b->nrows); matd_t *m = matd_create(a->nrows, b->ncols); - for (unsigned int i = 0; i < m->nrows; i++) { - for (unsigned int j = 0; j < m->ncols; j++) { + for (int i = 0; i < m->nrows; i++) { + for (int j = 0; j < m->ncols; j++) { TYPE acc = 0; - for (unsigned int k = 0; k < a->ncols; k++) { + for (int k = 0; k < a->ncols; k++) { acc += MATD_EL(a, i, k) * MATD_EL(b, k, j); } MATD_EL(m, i, j) = acc; @@ -259,8 +263,8 @@ matd_t *matd_scale(const matd_t *a, double s) matd_t *m = matd_create(a->nrows, a->ncols); - for (unsigned int i = 0; i < m->nrows; i++) { - for (unsigned int j = 0; j < m->ncols; j++) { + for (int i = 0; i < m->nrows; i++) { + for (int j = 0; j < m->ncols; j++) { MATD_EL(m, i, j) = s * MATD_EL(a, i, j); } } @@ -277,8 +281,8 @@ void matd_scale_inplace(matd_t *a, double s) return; } - for (unsigned int i = 0; i < a->nrows; i++) { - for (unsigned int j = 0; j < a->ncols; j++) { + for (int i = 0; i < a->nrows; i++) { + for (int j = 0; j < a->ncols; j++) { MATD_EL(a, i, j) *= s; } } @@ -296,8 +300,8 @@ matd_t *matd_add(const matd_t *a, const matd_t *b) matd_t *m = matd_create(a->nrows, a->ncols); - for (unsigned int i = 0; i < m->nrows; i++) { - for (unsigned int j = 0; j < m->ncols; j++) { + for (int i = 0; i < m->nrows; i++) { + for (int j = 0; j < m->ncols; j++) { MATD_EL(m, i, j) = MATD_EL(a, i, j) + MATD_EL(b, i, j); } } @@ -317,8 +321,8 @@ void matd_add_inplace(matd_t *a, const matd_t *b) return; } - for (unsigned int i = 0; i < a->nrows; i++) { - for (unsigned int j = 0; j < a->ncols; j++) { + for (int i = 0; i < a->nrows; i++) { + for (int j = 0; j < a->ncols; j++) { MATD_EL(a, i, j) += MATD_EL(b, i, j); } } @@ -337,8 +341,8 @@ matd_t *matd_subtract(const matd_t *a, const matd_t *b) matd_t *m = matd_create(a->nrows, a->ncols); - for (unsigned int i = 0; i < m->nrows; i++) { - for (unsigned int j = 0; j < m->ncols; j++) { + for (int i = 0; i < m->nrows; i++) { + for (int j = 0; j < m->ncols; j++) { MATD_EL(m, i, j) = MATD_EL(a, i, j) - MATD_EL(b, i, j); } } @@ -358,8 +362,8 @@ void matd_subtract_inplace(matd_t *a, const matd_t *b) return; } - for (unsigned int i = 0; i < a->nrows; i++) { - for (unsigned int j = 0; j < a->ncols; j++) { + for (int i = 0; i < a->nrows; i++) { + for (int j = 0; j < a->ncols; j++) { MATD_EL(a, i, j) -= MATD_EL(b, i, j); } } @@ -375,8 +379,8 @@ matd_t *matd_transpose(const matd_t *a) matd_t *m = matd_create(a->ncols, a->nrows); - for (unsigned int i = 0; i < a->nrows; i++) { - for (unsigned int j = 0; j < a->ncols; j++) { + for (int i = 0; i < a->nrows; i++) { + for (int j = 0; j < a->ncols; j++) { MATD_EL(m, j, i) = MATD_EL(a, i, j); } } @@ -394,7 +398,7 @@ double matd_det_general(const matd_t *a) // The determinants of the L and U matrices are the products of // their respective diagonal elements double detL = 1; double detU = 1; - for (unsigned int i = 0; i < a->nrows; i++) { + for (int i = 0; i < a->nrows; i++) { detL *= matd_get(L, i, i); detU *= matd_get(U, i, i); } @@ -873,8 +877,6 @@ double matd_vec_dist_n(const matd_t *a, const matd_t *b, int n) (void) lena; (void) lenb; assert(n <= lena && n <= lenb); - (void)lena; - (void)lenb; double mag = 0.0; for (int i = 0; i < n; i++) @@ -910,7 +912,6 @@ double matd_vec_dot_product(const matd_t *a, const matd_t *b) int bdim = b->ncols*b->nrows; (void) bdim; assert(adim == bdim); - (void)bdim; double acc = 0; for (int i = 0; i < adim; i++) { @@ -959,8 +960,8 @@ TYPE matd_err_inf(const matd_t *a, const matd_t *b) TYPE maxf = 0; - for (unsigned int i = 0; i < a->nrows; i++) { - for (unsigned int j = 0; j < a->ncols; j++) { + for (int i = 0; i < a->nrows; i++) { + for (int j = 0; j < a->ncols; j++) { TYPE av = MATD_EL(a, i, j); TYPE bv = MATD_EL(b, i, j); @@ -1004,7 +1005,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // RS: cumulative right-handed transformations. matd_t *RS = matd_identity(A->ncols); - for (unsigned int hhidx = 0; hhidx < A->nrows; hhidx++) { + for (int hhidx = 0; hhidx < A->nrows; hhidx++) { if (hhidx < A->ncols) { // We construct the normal of the reflection plane: let u @@ -1064,7 +1065,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // LS = matd_op("F*M", LS, Q); // Implementation: take each row of LS, compute dot product with n, // subtract n (scaled by dot product) from it. - for (unsigned int i = 0; i < LS->nrows; i++) { + for (int i = 0; i < LS->nrows; i++) { double dot = 0; for (int j = 0; j < vlen; j++) dot += MATD_EL(LS, i, hhidx+j) * v[j]; @@ -1073,7 +1074,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) } // B = matd_op("M*F", Q, B); // should be Q', but Q is symmetric. - for (unsigned int i = 0; i < B->ncols; i++) { + for (int i = 0; i < B->ncols; i++) { double dot = 0; for (int j = 0; j < vlen; j++) dot += MATD_EL(B, hhidx+j, i) * v[j]; @@ -1122,7 +1123,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // MATD_EL(Q, i+1+hhidx, j+1+hhidx) -= 2*v[i]*v[j]; // RS = matd_op("F*M", RS, Q); - for (unsigned int i = 0; i < RS->nrows; i++) { + for (int i = 0; i < RS->nrows; i++) { double dot = 0; for (int j = 0; j < vlen; j++) dot += MATD_EL(RS, i, hhidx+1+j) * v[j]; @@ -1131,7 +1132,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) } // B = matd_op("F*M", B, Q); // should be Q', but Q is symmetric. - for (unsigned int i = 0; i < B->nrows; i++) { + for (int i = 0; i < B->nrows; i++) { double dot = 0; for (int j = 0; j < vlen; j++) dot += MATD_EL(B, i, hhidx+1+j) * v[j]; @@ -1150,7 +1151,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) assert(maxiters > 0); // reassure clang int iter; - double maxv = 0; // maximum non-zero value being reduced this iteration + double maxv; // maximum non-zero value being reduced this iteration double tol = 1E-10; @@ -1160,11 +1161,11 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // for each of the first B->ncols rows, which index has the // maximum absolute value? (used by method 1) - unsigned int *maxrowidx = malloc(sizeof(int)*B->ncols); - unsigned int lastmaxi, lastmaxj; + int *maxrowidx = malloc(sizeof(int)*B->ncols); + int lastmaxi, lastmaxj; if (find_max_method == 1) { - for (unsigned int i = 2; i < B->ncols; i++) + for (int i = 2; i < B->ncols; i++) maxrowidx[i] = max_idx(B, i, B->ncols); // note that we started the array at 2. That's because by setting @@ -1197,7 +1198,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // modified. Update maxrowidx accordingly. // now, EVERY row also had columns lastmaxi and lastmaxj modified. - for (unsigned int rowi = 0; rowi < B->ncols; rowi++) { + for (int rowi = 0; rowi < B->ncols; rowi++) { // the magnitude of the largest off-diagonal element // in this row. @@ -1270,8 +1271,8 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) maxv = -1; // only search top "square" portion - for (unsigned int i = 0; i < B->ncols; i++) { - for (unsigned int j = 0; j < B->ncols; j++) { + for (int i = 0; i < B->ncols; i++) { + for (int j = 0; j < B->ncols; j++) { if (i == j) continue; @@ -1336,7 +1337,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) */ // LS = matd_op("F*M", LS, QL); - for (unsigned int i = 0; i < LS->nrows; i++) { + for (int i = 0; i < LS->nrows; i++) { double vi = MATD_EL(LS, i, maxi); double vj = MATD_EL(LS, i, maxj); @@ -1345,7 +1346,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) } // RS = matd_op("F*M", RS, QR); // remember we'll transpose RS. - for (unsigned int i = 0; i < RS->nrows; i++) { + for (int i = 0; i < RS->nrows; i++) { double vi = MATD_EL(RS, i, maxi); double vj = MATD_EL(RS, i, maxj); @@ -1355,7 +1356,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // B = matd_op("M'*F*M", QL, B, QR); // The QL matrix mixes rows of B. - for (unsigned int i = 0; i < B->ncols; i++) { + for (int i = 0; i < B->ncols; i++) { double vi = MATD_EL(B, maxi, i); double vj = MATD_EL(B, maxj, i); @@ -1364,7 +1365,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) } // The QR matrix mixes columns of B. - for (unsigned int i = 0; i < B->nrows; i++) { + for (int i = 0; i < B->nrows; i++) { double vi = MATD_EL(B, i, maxi); double vj = MATD_EL(B, i, maxj); @@ -1387,7 +1388,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // U/LS. int *idxs = malloc(sizeof(int)*A->ncols); double *vals = malloc(sizeof(double)*A->ncols); - for (unsigned int i = 0; i < A->ncols; i++) { + for (int i = 0; i < A->ncols; i++) { idxs[i] = i; vals[i] = MATD_EL(B, i, i); } @@ -1397,7 +1398,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) do { changed = 0; - for (unsigned int i = 0; i + 1 < A->ncols; i++) { + for (int i = 0; i + 1 < A->ncols; i++) { if (fabs(vals[i+1]) > fabs(vals[i])) { int tmpi = idxs[i]; idxs[i] = idxs[i+1]; @@ -1415,7 +1416,7 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) matd_t *LP = matd_identity(A->nrows); matd_t *RP = matd_identity(A->ncols); - for (unsigned int i = 0; i < A->ncols; i++) { + for (int i = 0; i < A->ncols; i++) { MATD_EL(LP, idxs[i], idxs[i]) = 0; // undo the identity above MATD_EL(RP, idxs[i], idxs[i]) = 0; @@ -1443,8 +1444,8 @@ static matd_svd_t matd_svd_tall(matd_t *A, int flags) // make B exactly diagonal - for (unsigned int i = 0; i < B->nrows; i++) { - for (unsigned int j = 0; j < B->ncols; j++) { + for (int i = 0; i < B->nrows; i++) { + for (int j = 0; j < B->ncols; j++) { if (i != j) MATD_EL(B, i, j) = 0; } @@ -1521,11 +1522,11 @@ matd_plu_t *matd_plu(const matd_t *a) matd_plu_t *mlu = calloc(1, sizeof(matd_plu_t)); - for (unsigned int i = 0; i < a->nrows; i++) + for (int i = 0; i < a->nrows; i++) piv[i] = i; - for (unsigned int j = 0; j < a->ncols; j++) { - for (unsigned int i = 0; i < a->nrows; i++) { + for (int j = 0; j < a->ncols; j++) { + for (int i = 0; i < a->nrows; i++) { int kmax = i < j ? i : j; // min(i,j) // compute dot product of row i with column j (up through element kmax) @@ -1537,9 +1538,9 @@ matd_plu_t *matd_plu(const matd_t *a) } // find pivot and exchange if necessary. - unsigned int p = j; + int p = j; if (1) { - for (unsigned int i = j+1; i < lu->nrows; i++) { + for (int i = j+1; i < lu->nrows; i++) { if (fabs(MATD_EL(lu,i,j)) > fabs(MATD_EL(lu, p, j))) { p = i; } @@ -1578,7 +1579,7 @@ matd_plu_t *matd_plu(const matd_t *a) if (j < lu->ncols && j < lu->nrows && LUjj != 0) { LUjj = 1.0 / LUjj; - for (unsigned int i = j+1; i < lu->nrows; i++) + for (int i = j+1; i < lu->nrows; i++) MATD_EL(lu, i, j) *= LUjj; } } @@ -1604,7 +1605,7 @@ double matd_plu_det(const matd_plu_t *mlu) double det = mlu->pivsign; if (lu->nrows == lu->ncols) { - for (unsigned int i = 0; i < lu->ncols; i++) + for (int i = 0; i < lu->ncols; i++) det *= MATD_EL(lu, i, i); } @@ -1616,7 +1617,7 @@ matd_t *matd_plu_p(const matd_plu_t *mlu) matd_t *lu = mlu->lu; matd_t *P = matd_create(lu->nrows, lu->nrows); - for (unsigned int i = 0; i < lu->nrows; i++) { + for (int i = 0; i < lu->nrows; i++) { MATD_EL(P, mlu->piv[i], i) = 1; } @@ -1628,10 +1629,10 @@ matd_t *matd_plu_l(const matd_plu_t *mlu) matd_t *lu = mlu->lu; matd_t *L = matd_create(lu->nrows, lu->ncols); - for (unsigned int i = 0; i < lu->nrows; i++) { + for (int i = 0; i < lu->nrows; i++) { MATD_EL(L, i, i) = 1; - for (unsigned int j = 0; j < i; j++) { + for (int j = 0; j < i; j++) { MATD_EL(L, i, j) = MATD_EL(lu, i, j); } } @@ -1644,8 +1645,8 @@ matd_t *matd_plu_u(const matd_plu_t *mlu) matd_t *lu = mlu->lu; matd_t *U = matd_create(lu->ncols, lu->ncols); - for (unsigned int i = 0; i < lu->ncols; i++) { - for (unsigned int j = 0; j < lu->ncols; j++) { + for (int i = 0; i < lu->ncols; i++) { + for (int j = 0; j < lu->ncols; j++) { if (i <= j) MATD_EL(U, i, j) = MATD_EL(lu, i, j); } @@ -1663,14 +1664,14 @@ matd_t *matd_plu_solve(const matd_plu_t *mlu, const matd_t *b) matd_t *x = matd_copy(b); // permute right hand side - for (unsigned int i = 0; i < mlu->lu->nrows; i++) + for (int i = 0; i < mlu->lu->nrows; i++) memcpy(&MATD_EL(x, i, 0), &MATD_EL(b, mlu->piv[i], 0), sizeof(TYPE) * b->ncols); // solve Ly = b - for (unsigned int k = 0; k < mlu->lu->nrows; k++) { - for (unsigned int i = k+1; i < mlu->lu->nrows; i++) { + for (int k = 0; k < mlu->lu->nrows; k++) { + for (int i = k+1; i < mlu->lu->nrows; i++) { double LUik = -MATD_EL(mlu->lu, i, k); - for (unsigned int t = 0; t < b->ncols; t++) + for (int t = 0; t < b->ncols; t++) MATD_EL(x, i, t) += MATD_EL(x, k, t) * LUik; } } @@ -1678,12 +1679,12 @@ matd_t *matd_plu_solve(const matd_plu_t *mlu, const matd_t *b) // solve Ux = y for (int k = mlu->lu->ncols-1; k >= 0; k--) { double LUkk = 1.0 / MATD_EL(mlu->lu, k, k); - for (unsigned int t = 0; t < b->ncols; t++) + for (int t = 0; t < b->ncols; t++) MATD_EL(x, k, t) *= LUkk; for (int i = 0; i < k; i++) { double LUik = -MATD_EL(mlu->lu, i, k); - for (unsigned int t = 0; t < b->ncols; t++) + for (int t = 0; t < b->ncols; t++) MATD_EL(x, i, t) += MATD_EL(x, k, t) *LUik; } } @@ -1911,7 +1912,7 @@ void matd_ltransposetriangle_solve(matd_t *u, const TYPE *b, TYPE *x) for (int i = 0; i < n; i++) { x[i] /= MATD_EL(u, i, i); - for (unsigned int j = i+1; j < u->ncols; j++) { + for (int j = i+1; j < u->ncols; j++) { x[j] -= x[i] * MATD_EL(u, i, j); } } @@ -1941,7 +1942,7 @@ void matd_utriangle_solve(matd_t *u, const TYPE *b, TYPE *x) double diag = MATD_EL(u, i, i); - for (unsigned int j = i+1; j < u->ncols; j++) + for (int j = i+1; j < u->ncols; j++) bi -= MATD_EL(u, i, j)*x[j]; x[i] = bi / diag; @@ -1958,17 +1959,17 @@ matd_t *matd_chol_solve(const matd_chol_t *chol, const matd_t *b) // solve Ly = b ==> (U')y = b - for (unsigned int i = 0; i < u->nrows; i++) { - for (unsigned int j = 0; j < i; j++) { + for (int i = 0; i < u->nrows; i++) { + for (int j = 0; j < i; j++) { // b[i] -= L[i,j]*x[j]... replicated across columns of b // ==> i.e., ==> // b[i,k] -= L[i,j]*x[j,k] - for (unsigned int k = 0; k < b->ncols; k++) { + for (int k = 0; k < b->ncols; k++) { MATD_EL(x, i, k) -= MATD_EL(u, j, i)*MATD_EL(x, j, k); } } // x[i] = b[i] / L[i,i] - for (unsigned int k = 0; k < b->ncols; k++) { + for (int k = 0; k < b->ncols; k++) { MATD_EL(x, i, k) /= MATD_EL(u, i, i); } } @@ -1976,12 +1977,12 @@ matd_t *matd_chol_solve(const matd_chol_t *chol, const matd_t *b) // solve Ux = y for (int k = u->ncols-1; k >= 0; k--) { double LUkk = 1.0 / MATD_EL(u, k, k); - for (unsigned int t = 0; t < b->ncols; t++) + for (int t = 0; t < b->ncols; t++) MATD_EL(x, k, t) *= LUkk; for (int i = 0; i < k; i++) { double LUik = -MATD_EL(u, i, k); - for (unsigned int t = 0; t < b->ncols; t++) + for (int t = 0; t < b->ncols; t++) MATD_EL(x, i, t) += MATD_EL(x, k, t) *LUik; } } @@ -2017,8 +2018,8 @@ matd_t *matd_chol_inverse(matd_t *a) double matd_max(matd_t *m) { double d = -DBL_MAX; - for(unsigned int x=0; xnrows; x++) { - for(unsigned int y=0; yncols; y++) { + for(int x=0; xnrows; x++) { + for(int y=0; yncols; y++) { if(MATD_EL(m, x, y) > d) d = MATD_EL(m, x, y); } diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/pam.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/pam.c index de946bede2..a86b3fe26a 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/pam.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/pam.c @@ -181,7 +181,7 @@ int pam_write_file(pam_t *pam, const char *outpath) fprintf(f, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nTUPLTYPE %s\nENDHDR\n", pam->width, pam->height, pam->depth, pam->maxval, tupl); - size_t len = pam->width * pam->height * pam->depth; + int len = pam->width * pam->height * pam->depth; if (len != fwrite(pam->data, 1, len, f)) { fclose(f); return -2; diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg-idct.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg-idct.c index 099c68c7dd..ddbdde5037 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg-idct.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg-idct.c @@ -25,10 +25,13 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the Regents of The University of Michigan. */ -#define _USE_MATH_DEFINES #include #include +#ifndef M_PI +# define M_PI 3.141592653589793238462643383279502884196 +#endif + // 8 bits of fixed-point output // // This implementation has a worst-case complexity of 22 multiplies diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg.c index dca5368f98..1941c27b77 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/pjpeg.c @@ -423,7 +423,7 @@ static int pjpeg_decode_buffer(struct pjpeg_decode_state *pjd) if (code_pos + ncodes > 0xffff) return PJPEG_ERR_DHT; - for (unsigned int ci = 0; ci < ncodes; ci++) { + for (int ci = 0; ci < ncodes; ci++) { pjd->huff_codes[htidx][code_pos].nbits = nbits; pjd->huff_codes[htidx][code_pos].code = code; code_pos++; @@ -753,8 +753,8 @@ image_u8x3_t *pjpeg_to_u8x3_baseline(pjpeg_t *pj) if (Cr_factor_y == 1 && Cr_factor_x == 1 && Cb_factor_y == 1 && Cb_factor_x == 1) { - for (uint32_t y = 0; y < pj->height; y++) { - for (uint32_t x = 0; x < pj->width; x++) { + for (int y = 0; y < pj->height; y++) { + for (int x = 0; x < pj->width; x++) { int32_t y_val = Y->data[y*Y->stride + x] * 65536; int32_t cb_val = Cb->data[y*Cb->stride + x] - 128; int32_t cr_val = Cr->data[y*Cr->stride + x] - 128; @@ -769,8 +769,8 @@ image_u8x3_t *pjpeg_to_u8x3_baseline(pjpeg_t *pj) } } } else if (Cb_factor_y == Cr_factor_y && Cb_factor_x == Cr_factor_x) { - for (uint32_t by = 0; by < pj->height / Cb_factor_y; by++) { - for (uint32_t bx = 0; bx < pj->width / Cb_factor_x; bx++) { + for (int by = 0; by < pj->height / Cb_factor_y; by++) { + for (int bx = 0; bx < pj->width / Cb_factor_x; bx++) { int32_t cb_val = Cb->data[by*Cb->stride + bx] - 128; int32_t cr_val = Cr->data[by*Cr->stride + bx] - 128; @@ -800,8 +800,8 @@ image_u8x3_t *pjpeg_to_u8x3_baseline(pjpeg_t *pj) } } else { - for (uint32_t y = 0; y < pj->height; y++) { - for (uint32_t x = 0; x < pj->width; x++) { + for (int y = 0; y < pj->height; y++) { + for (int x = 0; x < pj->width; x++) { int32_t y_val = Y->data[y*Y->stride + x]; int32_t cb_val = Cb->data[(y / Cb_factor_y)*Cb->stride + (x / Cb_factor_x)] - 128; int32_t cr_val = Cr->data[(y / Cr_factor_y)*Cr->stride + (x / Cr_factor_x)] - 128; @@ -865,7 +865,6 @@ pjpeg_t *pjpeg_create_from_buffer(uint8_t *buf, int buflen, uint32_t flags, int int result = pjpeg_decode_buffer(&pjd); (void) result; assert(result == 0); - (void)result; } pjd.in = buf; diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/pthreads_cross.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/pthreads_cross.cpp similarity index 97% rename from apriltag/src/main/native/thirdparty/apriltag/src/common/pthreads_cross.c rename to apriltag/src/main/native/thirdparty/apriltag/src/common/pthreads_cross.cpp index d3734d294d..480e952183 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/pthreads_cross.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/pthreads_cross.cpp @@ -21,6 +21,7 @@ SOFTWARE. */ #include "common/pthreads_cross.h" +#include #ifdef _WIN32 @@ -229,10 +230,15 @@ void ms_to_timespec(struct timespec *ts, unsigned int ms) unsigned int timespec_to_ms(const struct timespec *abstime) { + DWORD t; + if (abstime == NULL) return INFINITE; - return ((abstime->tv_sec - time(NULL)) * 1000) + (abstime->tv_nsec / 1000000); + t = ((abstime->tv_sec - time(NULL)) * 1000) + (abstime->tv_nsec / 1000000); + if (t < 0) + t = 1; + return t; } unsigned int pcthread_get_num_procs(void) diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/string_util.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/string_util.c index f7da2b8d77..14726e7a7f 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/string_util.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/string_util.c @@ -38,7 +38,7 @@ either expressed or implied, of the Regents of The University of Michigan. struct string_buffer { char *s; - size_t alloc; + int alloc; size_t size; // as if strlen() was called; not counting terminating \0 }; @@ -130,7 +130,7 @@ int str_diff_idx(const char * a, const char * b) assert(a != NULL); assert(b != NULL); - size_t i = 0; + int i = 0; size_t lena = strlen(a); size_t lenb = strlen(b); @@ -293,7 +293,7 @@ char *str_tolowercase(char *s) assert(s != NULL); size_t slen = strlen(s); - for (size_t i = 0; i < slen; i++) { + for (int i = 0; i < slen; i++) { if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] + 'a' - 'A'; } @@ -306,7 +306,7 @@ char *str_touppercase(char *s) assert(s != NULL); size_t slen = strlen(s); - for (size_t i = 0; i < slen; i++) { + for (int i = 0; i < slen; i++) { if (s[i] >= 'a' && s[i] <= 'z') s[i] = s[i] - ('a' - 'A'); } @@ -499,13 +499,14 @@ char string_feeder_next(string_feeder_t *sf) char *string_feeder_next_length(string_feeder_t *sf, size_t length) { assert(sf != NULL); + assert(length >= 0); assert(sf->pos <= sf->len); if (sf->pos + length > sf->len) length = sf->len - sf->pos; char *substr = calloc(length+1, sizeof(char)); - for (size_t i = 0 ; i < length ; i++) + for (int i = 0 ; i < length ; i++) substr[i] = string_feeder_next(sf); return substr; } @@ -521,6 +522,7 @@ char string_feeder_peek(string_feeder_t *sf) char *string_feeder_peek_length(string_feeder_t *sf, size_t length) { assert(sf != NULL); + assert(length >= 0); assert(sf->pos <= sf->len); if (sf->pos + length > sf->len) @@ -548,11 +550,10 @@ void string_feeder_require(string_feeder_t *sf, const char *str) size_t len = strlen(str); - for (size_t i = 0; i < len; i++) { + for (int i = 0; i < len; i++) { char c = string_feeder_next(sf); (void) c; assert(c == str[i]); - (void)c; } } @@ -620,12 +621,15 @@ bool str_matches_any(const char *haystack, const char **needles, int num_needles return false; } -char *str_substring(const char *str, size_t startidx, size_t endidx) +char *str_substring(const char *str, size_t startidx, long endidx) { assert(str != NULL); - assert(startidx <= strlen(str)+1); - assert(endidx >= startidx); - assert(endidx <= strlen(str)+1); + assert(startidx >= 0 && startidx <= strlen(str)+1); + assert(endidx < 0 || endidx >= startidx); + assert(endidx < 0 || endidx <= strlen(str)+1); + + if (endidx < 0) + endidx = (long) strlen(str); size_t blen = endidx - startidx; // not counting \0 char *b = malloc(blen + 1); diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/workerpool.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/workerpool.c index 25dccd0a34..23415eb561 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/workerpool.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/workerpool.c @@ -30,7 +30,6 @@ either expressed or implied, of the Regents of The University of Michigan. #define __USE_GNU #include "common/pthreads_cross.h" #include -#include #include #include #ifdef _WIN32 @@ -52,7 +51,6 @@ struct workerpool { pthread_mutex_t mutex; pthread_cond_t startcond; // used to signal the availability of work - bool start_predicate; // predicate that prevents spurious wakeups on startcond pthread_cond_t endcond; // used to signal completion of all work int end_count; // how many threads are done? @@ -68,19 +66,26 @@ void *worker_thread(void *p) { workerpool_t *wp = (workerpool_t*) p; +// int cnt = 0; + while (1) { struct task *task; pthread_mutex_lock(&wp->mutex); - while (wp->taskspos == zarray_size(wp->tasks) || !wp->start_predicate) { + while (wp->taskspos == zarray_size(wp->tasks)) { wp->end_count++; +// printf("%"PRId64" thread %d did %d\n", utime_now(), pthread_self(), cnt); pthread_cond_broadcast(&wp->endcond); pthread_cond_wait(&wp->startcond, &wp->mutex); +// cnt = 0; +// printf("%"PRId64" thread %d awake\n", utime_now(), pthread_self()); } zarray_get_volatile(wp->tasks, wp->taskspos, &task); wp->taskspos++; +// cnt++; pthread_mutex_unlock(&wp->mutex); +// pthread_yield(); sched_yield(); // we've been asked to exit. @@ -100,7 +105,6 @@ workerpool_t *workerpool_create(int nthreads) workerpool_t *wp = calloc(1, sizeof(workerpool_t)); wp->nthreads = nthreads; wp->tasks = zarray_create(sizeof(struct task)); - wp->start_predicate = false; if (nthreads > 1) { wp->threads = calloc(wp->nthreads, sizeof(pthread_t)); @@ -117,13 +121,6 @@ workerpool_t *workerpool_create(int nthreads) return NULL; } } - - // Wait for the worker threads to be ready - pthread_mutex_lock(&wp->mutex); - while (wp->end_count < wp->nthreads) { - pthread_cond_wait(&wp->endcond, &wp->mutex); - } - pthread_mutex_unlock(&wp->mutex); } return wp; @@ -140,7 +137,6 @@ void workerpool_destroy(workerpool_t *wp) workerpool_add_task(wp, NULL, NULL); pthread_mutex_lock(&wp->mutex); - wp->start_predicate = true; pthread_cond_broadcast(&wp->startcond); pthread_mutex_unlock(&wp->mutex); @@ -168,13 +164,7 @@ void workerpool_add_task(workerpool_t *wp, void (*f)(void *p), void *p) t.f = f; t.p = p; - if (wp->nthreads > 1) { - pthread_mutex_lock(&wp->mutex); - zarray_add(wp->tasks, &t); - pthread_mutex_unlock(&wp->mutex); - } else { - zarray_add(wp->tasks, &t); - } + zarray_add(wp->tasks, &t); } void workerpool_run_single(workerpool_t *wp) @@ -192,9 +182,9 @@ void workerpool_run_single(workerpool_t *wp) void workerpool_run(workerpool_t *wp) { if (wp->nthreads > 1) { - pthread_mutex_lock(&wp->mutex); wp->end_count = 0; - wp->start_predicate = true; + + pthread_mutex_lock(&wp->mutex); pthread_cond_broadcast(&wp->startcond); while (wp->end_count < wp->nthreads) { @@ -202,10 +192,10 @@ void workerpool_run(workerpool_t *wp) pthread_cond_wait(&wp->endcond, &wp->mutex); } - wp->taskspos = 0; - wp->start_predicate = false; pthread_mutex_unlock(&wp->mutex); + wp->taskspos = 0; + zarray_clear(wp->tasks); } else { @@ -215,7 +205,7 @@ void workerpool_run(workerpool_t *wp) int workerpool_get_nprocs(void) { -#ifdef _WIN32 +#ifdef WIN32 SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return sysinfo.dwNumberOfProcessors; diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/zhash.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/zhash.c index b4a2ec0964..10eb6eb8a6 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/zhash.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/zhash.c @@ -352,7 +352,7 @@ void zhash_iterator_remove(zhash_iterator_t *zit) zit->last_entry--; } -void zhash_map_keys(zhash_t *zh, void (*f)(void*)) +void zhash_map_keys(zhash_t *zh, void (*f)(void *)) { assert(zh != NULL); if (f == NULL) @@ -368,7 +368,7 @@ void zhash_map_keys(zhash_t *zh, void (*f)(void*)) } } -void zhash_vmap_keys(zhash_t * zh, void (*f)(void*)) +void zhash_vmap_keys(zhash_t * zh, void (*f)(void *)) { assert(zh != NULL); if (f == NULL) @@ -385,7 +385,7 @@ void zhash_vmap_keys(zhash_t * zh, void (*f)(void*)) } } -void zhash_map_values(zhash_t * zh, void (*f)(void*)) +void zhash_map_values(zhash_t * zh, void (*f)(void *)) { assert(zh != NULL); if (f == NULL) @@ -400,7 +400,7 @@ void zhash_map_values(zhash_t * zh, void (*f)(void*)) } } -void zhash_vmap_values(zhash_t * zh, void (*f)(void*)) +void zhash_vmap_values(zhash_t * zh, void (*f)(void *)) { assert(zh != NULL); if (f == NULL) diff --git a/apriltag/src/main/native/thirdparty/apriltag/src/common/zmaxheap.c b/apriltag/src/main/native/thirdparty/apriltag/src/common/zmaxheap.c index af0cc1eedf..a073ae5a17 100644 --- a/apriltag/src/main/native/thirdparty/apriltag/src/common/zmaxheap.c +++ b/apriltag/src/main/native/thirdparty/apriltag/src/common/zmaxheap.c @@ -321,6 +321,7 @@ static void maxheapify(zmaxheap_t *heap, int parent) if (betterchild != parent) { heap->swap(heap, parent, betterchild); maxheapify(heap, betterchild); + return; } } @@ -375,6 +376,7 @@ void zmaxheap_test(void) // add a value int32_t v = (int32_t) (random() / 1000); float fv = v; + assert(v == fv); vals[sz] = v; zmaxheap_add(heap, &v, fv); @@ -393,13 +395,12 @@ void zmaxheap_test(void) } - int32_t outv = 0; - float outfv = 0; + int32_t outv; + float outfv; int res = zmaxheap_remove_max(heap, &outv, &outfv); if (sz == 0) { (void) res; assert(res == 0); - (void)res; } else { // printf("%d %d %d %f\n", sz, maxv, outv, outfv); assert(outv == outfv); diff --git a/upstream_utils/apriltag.py b/upstream_utils/apriltag.py index 822e018693..e03be24f6c 100755 --- a/upstream_utils/apriltag.py +++ b/upstream_utils/apriltag.py @@ -39,7 +39,6 @@ def copy_upstream_src(wpilib_root): src_files = walk_cwd_and_copy_if( lambda dp, f: (f.endswith(".c") or f.endswith(".cpp")) and not dp.startswith("./example") - and not dp.startswith("./test") and not f.endswith("getopt.c") and not "py" in f and not remove_tag(f), @@ -70,7 +69,7 @@ def copy_upstream_src(wpilib_root): def main(): name = "apriltag" url = "https://github.com/AprilRobotics/apriltag.git" - tag = "3806edf38ac4400153677e510c9f9dcb81f472c8" + tag = "ebdb2017e04b8e36f7d8a12ce60060416a905e12" patch_options = { "ignore_whitespace": True, diff --git a/upstream_utils/apriltag_patches/0001-apriltag_pose.c-Set-NULL-when-second-solution-could-.patch b/upstream_utils/apriltag_patches/0001-apriltag_pose.c-Set-NULL-when-second-solution-could-.patch index b10eb7cc30..d073f4701a 100644 --- a/upstream_utils/apriltag_patches/0001-apriltag_pose.c-Set-NULL-when-second-solution-could-.patch +++ b/upstream_utils/apriltag_patches/0001-apriltag_pose.c-Set-NULL-when-second-solution-could-.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 4 Dec 2022 11:01:56 -0800 -Subject: [PATCH 1/8] apriltag_pose.c: Set NULL when second solution could not +Subject: [PATCH 1/9] apriltag_pose.c: Set NULL when second solution could not be determined --- diff --git a/upstream_utils/apriltag_patches/0002-zmaxheapify-Avoid-return-of-void-expression.patch b/upstream_utils/apriltag_patches/0002-zmaxheapify-Avoid-return-of-void-expression.patch new file mode 100644 index 0000000000..a58e5a6672 --- /dev/null +++ b/upstream_utils/apriltag_patches/0002-zmaxheapify-Avoid-return-of-void-expression.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Johnson +Date: Sun, 4 Dec 2022 11:25:12 -0800 +Subject: [PATCH 2/9] zmaxheapify: Avoid return of void expression + +--- + common/zmaxheap.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/common/zmaxheap.c b/common/zmaxheap.c +index e04d03efa8a79163293eb306e9f4beab6e4a27df..e410664fd57dfa5ebd30e0680d77b008bb41801c 100644 +--- a/common/zmaxheap.c ++++ b/common/zmaxheap.c +@@ -320,7 +320,8 @@ static void maxheapify(zmaxheap_t *heap, int parent) + + if (betterchild != parent) { + heap->swap(heap, parent, betterchild); +- return maxheapify(heap, betterchild); ++ maxheapify(heap, betterchild); ++ return; + } + } + diff --git a/upstream_utils/apriltag_patches/0002-Avoid-unused-variable-warnings-in-release-builds.patch b/upstream_utils/apriltag_patches/0003-Avoid-unused-variable-warnings-in-release-builds.patch similarity index 65% rename from upstream_utils/apriltag_patches/0002-Avoid-unused-variable-warnings-in-release-builds.patch rename to upstream_utils/apriltag_patches/0003-Avoid-unused-variable-warnings-in-release-builds.patch index afaabc79dc..a07b53af90 100644 --- a/upstream_utils/apriltag_patches/0002-Avoid-unused-variable-warnings-in-release-builds.patch +++ b/upstream_utils/apriltag_patches/0003-Avoid-unused-variable-warnings-in-release-builds.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 4 Dec 2022 11:42:13 -0800 -Subject: [PATCH 2/8] Avoid unused variable warnings in release builds +Subject: [PATCH 3/9] Avoid unused variable warnings in release builds --- common/matd.c | 4 +++- @@ -11,10 +11,10 @@ Subject: [PATCH 2/8] Avoid unused variable warnings in release builds 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/common/matd.c b/common/matd.c -index 6b8a0405ce094536c395ad667fa640bda335fb6a..7c9088235aed537f5ecdc95f49424e362fb842eb 100644 +index 54449d9f27a4dae6d1422c37c71bdeeb046c94ba..f426890416dd021d7392b78bd19959c70f44247b 100644 --- a/common/matd.c +++ b/common/matd.c -@@ -870,7 +870,8 @@ double matd_vec_dist_n(const matd_t *a, const matd_t *b, int n) +@@ -874,7 +874,8 @@ double matd_vec_dist_n(const matd_t *a, const matd_t *b, int n) int lena = a->nrows*a->ncols; int lenb = b->nrows*b->ncols; @@ -22,18 +22,18 @@ index 6b8a0405ce094536c395ad667fa640bda335fb6a..7c9088235aed537f5ecdc95f49424e36 + (void) lena; + (void) lenb; assert(n <= lena && n <= lenb); - (void)lena; - (void)lenb; -@@ -907,6 +908,7 @@ double matd_vec_dot_product(const matd_t *a, const matd_t *b) + + double mag = 0.0; +@@ -909,6 +910,7 @@ double matd_vec_dot_product(const matd_t *a, const matd_t *b) assert(matd_is_vector(a) && matd_is_vector(b)); int adim = a->ncols*a->nrows; int bdim = b->ncols*b->nrows; + (void) bdim; assert(adim == bdim); - (void)bdim; + double acc = 0; diff --git a/common/pjpeg.c b/common/pjpeg.c -index 924ac04dd7602aea2eaad76076002785c7b32ba2..d410c11bf84b12fca6a38544d05b446879f8a38b 100644 +index 7e3d089ad849df67549a58873eb6574c85fda6ee..4a5dd028ee8a3d79fbe7a5abed30886cc6e40dae 100644 --- a/common/pjpeg.c +++ b/common/pjpeg.c @@ -863,6 +863,7 @@ pjpeg_t *pjpeg_create_from_buffer(uint8_t *buf, int buflen, uint32_t flags, int @@ -42,29 +42,29 @@ index 924ac04dd7602aea2eaad76076002785c7b32ba2..d410c11bf84b12fca6a38544d05b4468 int result = pjpeg_decode_buffer(&pjd); + (void) result; assert(result == 0); - (void)result; } + diff --git a/common/string_util.c b/common/string_util.c -index 16a9ffb7b02e37df6f09231e67914422af89f2a4..492eabfa09ef6219c6e74bfc7de6d4407ed913c7 100644 +index 4f0c98056b084af62a9a04bc8425e16dbdf9041a..3d86eb2f2d602a5b00c29952808368dc73c0b0cd 100644 --- a/common/string_util.c +++ b/common/string_util.c -@@ -550,6 +550,7 @@ void string_feeder_require(string_feeder_t *sf, const char *str) +@@ -552,6 +552,7 @@ void string_feeder_require(string_feeder_t *sf, const char *str) - for (size_t i = 0; i < len; i++) { + for (int i = 0; i < len; i++) { char c = string_feeder_next(sf); + (void) c; assert(c == str[i]); - (void)c; } + } diff --git a/common/zmaxheap.c b/common/zmaxheap.c -index 75de99502a70ec88b4dc51fda567c7e0c7bd852c..abbb549e41b6073f581b5c3216f024ed370b9212 100644 +index e410664fd57dfa5ebd30e0680d77b008bb41801c..2c671236bf07ed4c43e15c02f4bf10df76880cb9 100644 --- a/common/zmaxheap.c +++ b/common/zmaxheap.c -@@ -397,6 +397,7 @@ void zmaxheap_test() - float outfv = 0; +@@ -399,6 +399,7 @@ void zmaxheap_test() + float outfv; int res = zmaxheap_remove_max(heap, &outv, &outfv); if (sz == 0) { + (void) res; assert(res == 0); - (void)res; } else { + // printf("%d %d %d %f\n", sz, maxv, outv, outfv); diff --git a/upstream_utils/apriltag_patches/0003-Make-orthogonal_iteration-exit-early-upon-convergenc.patch b/upstream_utils/apriltag_patches/0004-Make-orthogonal_iteration-exit-early-upon-convergenc.patch similarity index 95% rename from upstream_utils/apriltag_patches/0003-Make-orthogonal_iteration-exit-early-upon-convergenc.patch rename to upstream_utils/apriltag_patches/0004-Make-orthogonal_iteration-exit-early-upon-convergenc.patch index a962c86e51..2a7c38f06c 100644 --- a/upstream_utils/apriltag_patches/0003-Make-orthogonal_iteration-exit-early-upon-convergenc.patch +++ b/upstream_utils/apriltag_patches/0004-Make-orthogonal_iteration-exit-early-upon-convergenc.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Tue, 10 Jan 2023 18:36:36 -0800 -Subject: [PATCH 3/8] Make orthogonal_iteration() exit early upon convergence +Subject: [PATCH 4/9] Make orthogonal_iteration() exit early upon convergence The current approach wastes iterations doing no work. Exiting early can give lower latencies and higher FPS. @@ -86,7 +86,7 @@ index f0003a2d187df13236992026ee6ff7f9d6f7aff9..782729225c3555edcfebb7d8a21f847a pose->R = pose1.R; pose->t = pose1.t; diff --git a/apriltag_pose.h b/apriltag_pose.h -index 07ee37b2cb4185bcbdb46d1c9ccec306f0f2e96d..6bbe4a4e000402f990b0a13b8b87e6becc8c48a8 100644 +index 07ee37b2cb4185bcbdb46d1c9ccec306f0f2e96d..72993f11514199754c452369bad32157b6d64eb1 100644 --- a/apriltag_pose.h +++ b/apriltag_pose.h @@ -63,7 +63,8 @@ void estimate_tag_pose_orthogonal_iteration( @@ -94,13 +94,13 @@ index 07ee37b2cb4185bcbdb46d1c9ccec306f0f2e96d..6bbe4a4e000402f990b0a13b8b87e6be double* err2, apriltag_pose_t* pose2, - int nIters); -+ int nIters, ++ int nIters, + double min_improvement_per_iteration); /** * Estimate tag pose. diff --git a/example/apriltag_demo.c b/example/apriltag_demo.c -index 6de90540fe2f22f5160f725bce03d50bb3967c74..ccd55cdceeaf46712891a7fab971b8b3c6afa950 100644 +index 6de90540fe2f22f5160f725bce03d50bb3967c74..841d7788756011b0c7237e989242d87de76b14ef 100644 --- a/example/apriltag_demo.c +++ b/example/apriltag_demo.c @@ -42,6 +42,7 @@ either expressed or implied, of the Regents of The University of Michigan. @@ -124,13 +124,13 @@ index 6de90540fe2f22f5160f725bce03d50bb3967c74..ccd55cdceeaf46712891a7fab971b8b3 + int nIters = 200; + estimate_tag_pose_orthogonal_iteration(&info, &err1, &pose1, &err2, &pose2, nIters, 1e-7); + -+ printf("Primary translation %f %f %f\nerror: %f\n", ++ printf("Primary translation %f %f %f\nerror: %f\n", + pose1.t->data[0], + pose1.t->data[1], + pose1.t->data[2], + err1 + ); -+ printf("Alt translation %f %f %f\nerror: %f\n", ++ printf("Alt translation %f %f %f\nerror: %f\n", + pose2.t->data[0], + pose2.t->data[1], + pose2.t->data[2], diff --git a/upstream_utils/apriltag_patches/0004-Fix-signed-left-shift-warning.patch b/upstream_utils/apriltag_patches/0005-Fix-signed-left-shift-warning.patch similarity index 90% rename from upstream_utils/apriltag_patches/0004-Fix-signed-left-shift-warning.patch rename to upstream_utils/apriltag_patches/0005-Fix-signed-left-shift-warning.patch index f14873186e..d621a45705 100644 --- a/upstream_utils/apriltag_patches/0004-Fix-signed-left-shift-warning.patch +++ b/upstream_utils/apriltag_patches/0005-Fix-signed-left-shift-warning.patch @@ -1,14 +1,14 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 19 Jul 2023 20:48:21 -0700 -Subject: [PATCH 4/8] Fix signed left shift warning +Subject: [PATCH 5/9] Fix signed left shift warning --- common/pjpeg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/pjpeg.c b/common/pjpeg.c -index d410c11bf84b12fca6a38544d05b446879f8a38b..dca5368f98e91307b58ed62f6f39c4494c0b0c74 100644 +index 4a5dd028ee8a3d79fbe7a5abed30886cc6e40dae..1941c27b7752a6a2420e8370451b0d29268f324d 100644 --- a/common/pjpeg.c +++ b/common/pjpeg.c @@ -594,7 +594,7 @@ static int pjpeg_decode_buffer(struct pjpeg_decode_state *pjd) diff --git a/upstream_utils/apriltag_patches/0005-Avoid-incompatible-pointer-warning.patch b/upstream_utils/apriltag_patches/0006-Avoid-incompatible-pointer-warning.patch similarity index 79% rename from upstream_utils/apriltag_patches/0005-Avoid-incompatible-pointer-warning.patch rename to upstream_utils/apriltag_patches/0006-Avoid-incompatible-pointer-warning.patch index 5713fe88f3..55825224e1 100644 --- a/upstream_utils/apriltag_patches/0005-Avoid-incompatible-pointer-warning.patch +++ b/upstream_utils/apriltag_patches/0006-Avoid-incompatible-pointer-warning.patch @@ -1,14 +1,14 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 19 Jul 2023 21:28:43 -0700 -Subject: [PATCH 5/8] Avoid incompatible pointer warning +Subject: [PATCH 6/9] Avoid incompatible pointer warning --- common/getopt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/getopt.c b/common/getopt.c -index 21ec6fb1ed2a72343206716d87c283196511b50b..339d43f171b50af97201e934e8bfdafc0fc833cc 100644 +index 7613b69c346f3f818688bb9f4704463367d877f6..71ae57bd83b2ed50c7f80f3e3952ddfcc53cb7bc 100644 --- a/common/getopt.c +++ b/common/getopt.c @@ -76,8 +76,9 @@ getopt_t *getopt_create() diff --git a/upstream_utils/apriltag_patches/0007-Fix-GCC-14-calloc-warning.patch b/upstream_utils/apriltag_patches/0007-Fix-GCC-14-calloc-warning.patch new file mode 100644 index 0000000000..04efe330f1 --- /dev/null +++ b/upstream_utils/apriltag_patches/0007-Fix-GCC-14-calloc-warning.patch @@ -0,0 +1,32 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Tyler Veness +Date: Sun, 23 Jun 2024 05:53:42 -0700 +Subject: [PATCH 7/9] Fix GCC 14 calloc() warning +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +``` +/home/tav/frc/wpilib/allwpilib/build-cmake-release/_deps/apriltaglib-src/common/zmaxheap.c: In function ‘zmaxheap_test’: +/home/tav/frc/wpilib/allwpilib/build-cmake-release/_deps/apriltaglib-src/common/zmaxheap.c:365:35: error: ‘calloc’ sizes specified with ‘sizeof’ in the earlier argument and not in the later argument [-Werror=calloc-transposed-args] + 365 | int32_t *vals = calloc(sizeof(int32_t), cap); + | ^~~~~~~ +/home/tav/frc/wpilib/allwpilib/build-cmake-release/_deps/apriltaglib-src/common/zmaxheap.c:365:35: note: earlier argument should specify number of elements, later size of each element +``` +--- + common/zmaxheap.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/common/zmaxheap.c b/common/zmaxheap.c +index 2c671236bf07ed4c43e15c02f4bf10df76880cb9..ed271420d229a98b56c7027f47d9830a78a97db1 100644 +--- a/common/zmaxheap.c ++++ b/common/zmaxheap.c +@@ -362,7 +362,7 @@ void zmaxheap_test() + { + int cap = 10000; + int sz = 0; +- int32_t *vals = calloc(sizeof(int32_t), cap); ++ int32_t *vals = calloc(cap, sizeof(int32_t)); + + zmaxheap_t *heap = zmaxheap_create(sizeof(int32_t)); + diff --git a/upstream_utils/apriltag_patches/0008-Remove-GCC-diagnostic-pragmas-on-windows.patch b/upstream_utils/apriltag_patches/0008-Remove-GCC-diagnostic-pragmas-on-windows.patch deleted file mode 100644 index 3d4dab486b..0000000000 --- a/upstream_utils/apriltag_patches/0008-Remove-GCC-diagnostic-pragmas-on-windows.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Ryan Blue -Date: Fri, 23 Aug 2024 02:50:24 -0400 -Subject: [PATCH 8/8] Remove GCC diagnostic pragmas on windows - ---- - common/pthreads_cross.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/common/pthreads_cross.c b/common/pthreads_cross.c -index d48b81a1bbafa15f1c8a5b4fec6a755847947ce6..907fa62f3cf11f8afbe51a3ca5a492111720d707 100644 ---- a/common/pthreads_cross.c -+++ b/common/pthreads_cross.c -@@ -44,10 +44,7 @@ int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routin - if (thread == NULL || start_routine == NULL) - return 1; - --#pragma GCC diagnostic push --#pragma GCC diagnostic ignored "-Wcast-function-type" - *thread = (HANDLE) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, arg, 0, NULL); --#pragma GCC diagnostic pop - if (*thread == NULL) - return 1; - return 0; diff --git a/upstream_utils/apriltag_patches/0006-Remove-calls-to-postscript_image.patch b/upstream_utils/apriltag_patches/0008-Remove-calls-to-postscript_image.patch similarity index 73% rename from upstream_utils/apriltag_patches/0006-Remove-calls-to-postscript_image.patch rename to upstream_utils/apriltag_patches/0008-Remove-calls-to-postscript_image.patch index 4b987801c2..3be4beca59 100644 --- a/upstream_utils/apriltag_patches/0006-Remove-calls-to-postscript_image.patch +++ b/upstream_utils/apriltag_patches/0008-Remove-calls-to-postscript_image.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Fri, 19 Jul 2024 21:45:29 -0700 -Subject: [PATCH 6/8] Remove calls to postscript_image() +Subject: [PATCH 8/9] Remove calls to postscript_image() --- apriltag.c | 5 ----- @@ -9,19 +9,19 @@ Subject: [PATCH 6/8] Remove calls to postscript_image() 2 files changed, 8 deletions(-) diff --git a/apriltag.c b/apriltag.c -index a513cb98b69b9cc1b7b74ecc10ce5ab1feccc541..2f9846437619897c871d267963f143886f71b577 100644 +index 3086228868281eaad5cc5382d305227757d4a5cf..b514d974971827e6a4f4f0a4fa12e6b0392d7282 100644 --- a/apriltag.c +++ b/apriltag.c -@@ -52,8 +52,6 @@ either expressed or implied, of the Regents of The University of Michigan. +@@ -51,8 +51,6 @@ either expressed or implied, of the Regents of The University of Michigan. #include "apriltag_math.h" -#include "common/postscript_utils.h" - - #ifdef _WIN32 - static inline void srandom(unsigned int seed) - { -@@ -1283,7 +1281,6 @@ zarray_t *apriltag_detector_detect(apriltag_detector_t *td, image_u8_t *im_orig) + #ifndef M_PI + # define M_PI 3.141592653589793238462643383279502884196 + #endif +@@ -1282,7 +1280,6 @@ zarray_t *apriltag_detector_detect(apriltag_detector_t *td, image_u8_t *im_orig) fprintf(f, "%f %f scale\n", scale, scale); fprintf(f, "0 %d translate\n", darker->height); fprintf(f, "1 -1 scale\n"); @@ -39,10 +39,10 @@ index a513cb98b69b9cc1b7b74ecc10ce5ab1feccc541..2f9846437619897c871d267963f14388 for (int i = 0; i < zarray_size(quads); i++) { diff --git a/apriltag_quad_thresh.c b/apriltag_quad_thresh.c -index 2b57774065d231abd5129acbc97e1a63e9e53d95..f8f6aff721ced5edad460512db7bb953296b92c6 100644 +index 735520c6b1dd7387c837e8922d2ecd68130b9b5c..677f365765493bcbf043b0841bb28016a0d3acde 100644 --- a/apriltag_quad_thresh.c +++ b/apriltag_quad_thresh.c -@@ -41,7 +41,6 @@ either expressed or implied, of the Regents of The University of Michigan. +@@ -40,7 +40,6 @@ either expressed or implied, of the Regents of The University of Michigan. #include "common/unionfind.h" #include "common/timeprofile.h" #include "common/zmaxheap.h" @@ -50,7 +50,7 @@ index 2b57774065d231abd5129acbc97e1a63e9e53d95..f8f6aff721ced5edad460512db7bb953 #include "common/math_util.h" #ifdef _WIN32 -@@ -1961,8 +1960,6 @@ zarray_t *apriltag_quad_thresh(apriltag_detector_t *td, image_u8_t *im) +@@ -1979,8 +1978,6 @@ zarray_t *apriltag_quad_thresh(apriltag_detector_t *td, image_u8_t *im) fprintf(f, "0 %d translate\n", im2->height); fprintf(f, "1 -1 scale\n"); diff --git a/upstream_utils/apriltag_patches/0007-Fix-clang-16-warnings.patch b/upstream_utils/apriltag_patches/0009-Fix-clang-16-warnings.patch similarity index 62% rename from upstream_utils/apriltag_patches/0007-Fix-clang-16-warnings.patch rename to upstream_utils/apriltag_patches/0009-Fix-clang-16-warnings.patch index 64973ccc6a..4fcf7f6793 100644 --- a/upstream_utils/apriltag_patches/0007-Fix-clang-16-warnings.patch +++ b/upstream_utils/apriltag_patches/0009-Fix-clang-16-warnings.patch @@ -1,51 +1,56 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Thu, 29 Jun 2023 22:14:05 -0700 -Subject: [PATCH 7/8] Fix clang 16 warnings +Subject: [PATCH 9/9] Fix clang 16 warnings --- - apriltag.c | 2 +- - apriltag.h | 2 +- - common/g2d.c | 2 +- - common/g2d.h | 2 +- - common/getopt.c | 2 +- - common/getopt.h | 2 +- - common/math_util.h | 4 ++-- - common/pthreads_cross.c | 6 +++--- - common/pthreads_cross.h | 2 +- - common/string_util.c | 2 +- - common/string_util.h | 2 +- - common/time_util.c | 4 ++-- - common/time_util.h | 4 ++-- - common/timeprofile.h | 2 +- - common/workerpool.c | 2 +- - common/workerpool.h | 2 +- - common/zmaxheap.c | 2 +- - tag16h5.c | 2 +- - tag16h5.h | 2 +- - tag25h9.c | 2 +- - tag25h9.h | 2 +- - tag36h10.c | 2 +- - tag36h10.h | 2 +- - tag36h11.c | 2 +- - tag36h11.h | 2 +- - tagCircle21h7.c | 2 +- - tagCircle21h7.h | 2 +- - tagCircle49h12.c | 2 +- - tagCircle49h12.h | 2 +- - tagCustom48h12.c | 2 +- - tagCustom48h12.h | 2 +- - tagStandard41h12.c | 2 +- - tagStandard41h12.h | 2 +- - tagStandard52h13.c | 2 +- - tagStandard52h13.h | 2 +- - 35 files changed, 40 insertions(+), 40 deletions(-) + apriltag.c | 2 +- + apriltag.h | 2 +- + common/g2d.c | 2 +- + common/g2d.h | 2 +- + common/getopt.c | 2 +- + common/getopt.h | 2 +- + common/math_util.h | 4 ++-- + common/pthreads_cross.cpp | 6 +++--- + common/pthreads_cross.h | 2 +- + common/string_util.c | 2 +- + common/string_util.h | 2 +- + common/time_util.c | 4 ++-- + common/time_util.h | 4 ++-- + common/timeprofile.h | 2 +- + common/workerpool.c | 8 ++++---- + common/workerpool.h | 2 +- + common/zarray.c | 2 +- + common/zarray.h | 2 +- + common/zhash.c | 8 ++++---- + common/zhash.h | 8 ++++---- + common/zmaxheap.c | 4 ++-- + common/zmaxheap.h | 2 +- + tag16h5.c | 2 +- + tag16h5.h | 2 +- + tag25h9.c | 2 +- + tag25h9.h | 2 +- + tag36h10.c | 2 +- + tag36h10.h | 2 +- + tag36h11.c | 2 +- + tag36h11.h | 2 +- + tagCircle21h7.c | 2 +- + tagCircle21h7.h | 2 +- + tagCircle49h12.c | 2 +- + tagCircle49h12.h | 2 +- + tagCustom48h12.c | 2 +- + tagCustom48h12.h | 2 +- + tagStandard41h12.c | 2 +- + tagStandard41h12.h | 2 +- + tagStandard52h13.c | 2 +- + tagStandard52h13.h | 2 +- + 40 files changed, 55 insertions(+), 55 deletions(-) diff --git a/apriltag.c b/apriltag.c -index 2f9846437619897c871d267963f143886f71b577..b7e24c4bc279643f478d810d494345216be991f1 100644 +index b514d974971827e6a4f4f0a4fa12e6b0392d7282..bfff1ea9d502b8ef08d00e61d4c75a967c06462b 100644 --- a/apriltag.c +++ b/apriltag.c -@@ -349,7 +349,7 @@ void apriltag_detector_clear_families(apriltag_detector_t *td) +@@ -352,7 +352,7 @@ void apriltag_detector_clear_families(apriltag_detector_t *td) zarray_clear(td->tag_families); } @@ -55,7 +60,7 @@ index 2f9846437619897c871d267963f143886f71b577..b7e24c4bc279643f478d810d49434521 apriltag_detector_t *td = (apriltag_detector_t*) calloc(1, sizeof(apriltag_detector_t)); diff --git a/apriltag.h b/apriltag.h -index 164ad8618f10ab2cbe489b813c9eed64be6e96e0..895b3459b8a84064989378fe533fd676964a1687 100644 +index 2d772cda60185de81fb279e83134074284b8e491..eb58a71d976ee84b94a232e3c778120a52f2b609 100644 --- a/apriltag.h +++ b/apriltag.h @@ -231,7 +231,7 @@ struct apriltag_detection @@ -68,10 +73,10 @@ index 164ad8618f10ab2cbe489b813c9eed64be6e96e0..895b3459b8a84064989378fe533fd676 // add a family to the apriltag detector. caller still "owns" the family. // a single instance should only be provided to one apriltag detector instance. diff --git a/common/g2d.c b/common/g2d.c -index ebb85e55975fd91c6fd6cde7830efa5185580e98..64c9b1b3342cc4b56de91733d720098bc9f09fff 100644 +index 4645f206e52ff14c20c04ec9601d20725339197b..e0106437717b872b8b9823135c076da7ba0a1e84 100644 --- a/common/g2d.c +++ b/common/g2d.c -@@ -38,7 +38,7 @@ double g2d_distance(const double a[2], const double b[2]) +@@ -45,7 +45,7 @@ double g2d_distance(const double a[2], const double b[2]) return sqrtf(sq(a[0]-b[0]) + sq(a[1]-b[1])); } @@ -94,7 +99,7 @@ index 21c21ac64d8988578f3c2d108a7a07d54e780954..5a0dd0b59869099e24453eda78ada1e5 void g2d_polygon_add(zarray_t *poly, double v[2]); diff --git a/common/getopt.c b/common/getopt.c -index 339d43f171b50af97201e934e8bfdafc0fc833cc..51fe9b9a8f61708cfd0704673fb95cac1b66ec75 100644 +index 71ae57bd83b2ed50c7f80f3e3952ddfcc53cb7bc..458ef7705019b73dcd4c9fa03fe15555ea087fcf 100644 --- a/common/getopt.c +++ b/common/getopt.c @@ -64,7 +64,7 @@ struct getopt @@ -107,7 +112,7 @@ index 339d43f171b50af97201e934e8bfdafc0fc833cc..51fe9b9a8f61708cfd0704673fb95cac getopt_t *gopt = (getopt_t*) calloc(1, sizeof(getopt_t)); diff --git a/common/getopt.h b/common/getopt.h -index 1f0366283bf5edd4f01b4dfcd9254ec2cc2abd8e..1b2d69c982d6ba0ca4a960eea9e03340ba753e0e 100644 +index 69dbb05c8286a9d5d301382fc44fdea8c8f7875e..75266f033a0485b22cc34ec08e894781b6658894 100644 --- a/common/getopt.h +++ b/common/getopt.h @@ -36,7 +36,7 @@ extern "C" { @@ -117,13 +122,13 @@ index 1f0366283bf5edd4f01b4dfcd9254ec2cc2abd8e..1b2d69c982d6ba0ca4a960eea9e03340 -getopt_t *getopt_create(); +getopt_t *getopt_create(void); void getopt_destroy(getopt_t *gopt); - void getopt_option_destroy_void(void *goo); + // Parse args. Returns 1 on success diff --git a/common/math_util.h b/common/math_util.h -index aa08883608a8aca5cc7828134ecb4cd6e9f06a61..a68ed8bf8eda0a9e23cc4d2784ccc6b7d82701c4 100644 +index 9271a01834501a311f28525ca460f61117524eab..5434355a512c1a6225bbfbf335caa279d17ed7aa 100644 --- a/common/math_util.h +++ b/common/math_util.h -@@ -74,13 +74,13 @@ static inline double sgn(double v) +@@ -86,13 +86,13 @@ static inline double sgn(double v) } // random number between [0, 1) @@ -139,11 +144,11 @@ index aa08883608a8aca5cc7828134ecb4cd6e9f06a61..a68ed8bf8eda0a9e23cc4d2784ccc6b7 { return randf()*2 - 1; } -diff --git a/common/pthreads_cross.c b/common/pthreads_cross.c -index 3403863f385c96d089db9652079b038fea3e5f51..d48b81a1bbafa15f1c8a5b4fec6a755847947ce6 100644 ---- a/common/pthreads_cross.c -+++ b/common/pthreads_cross.c -@@ -218,7 +218,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) +diff --git a/common/pthreads_cross.cpp b/common/pthreads_cross.cpp +index f7721912f9088bf84224943aa836a69356949f18..09d6ce6e97074f4ffbcef1ef6e06fd53ee22ff0f 100644 +--- a/common/pthreads_cross.cpp ++++ b/common/pthreads_cross.cpp +@@ -216,7 +216,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) return 0; } @@ -152,8 +157,8 @@ index 3403863f385c96d089db9652079b038fea3e5f51..d48b81a1bbafa15f1c8a5b4fec6a7558 return (int)SwitchToThread(); } -@@ -238,7 +238,7 @@ unsigned int timespec_to_ms(const struct timespec *abstime) - return ((abstime->tv_sec - time(NULL)) * 1000) + (abstime->tv_nsec / 1000000); +@@ -241,7 +241,7 @@ unsigned int timespec_to_ms(const struct timespec *abstime) + return t; } -unsigned int pcthread_get_num_procs() @@ -161,7 +166,7 @@ index 3403863f385c96d089db9652079b038fea3e5f51..d48b81a1bbafa15f1c8a5b4fec6a7558 { SYSTEM_INFO sysinfo; -@@ -249,7 +249,7 @@ unsigned int pcthread_get_num_procs() +@@ -252,7 +252,7 @@ unsigned int pcthread_get_num_procs() #else #include @@ -171,10 +176,10 @@ index 3403863f385c96d089db9652079b038fea3e5f51..d48b81a1bbafa15f1c8a5b4fec6a7558 return (unsigned int)sysconf(_SC_NPROCESSORS_ONLN); } diff --git a/common/pthreads_cross.h b/common/pthreads_cross.h -index 5970c679316037505ee4dc1e96ab9fda1f4f60d5..89ff7cc79ba93a5676fbc8663fcd7127cd1757d9 100644 +index 897a333573e88263b6ba58ec3d31031304c50e54..209c28f855efcbdf41424f11a302ba2794836796 100644 --- a/common/pthreads_cross.h +++ b/common/pthreads_cross.h -@@ -71,7 +71,7 @@ int sched_yield(void); +@@ -70,7 +70,7 @@ int sched_yield(void); #ifdef __cplusplus extern "C" { #endif @@ -184,7 +189,7 @@ index 5970c679316037505ee4dc1e96ab9fda1f4f60d5..89ff7cc79ba93a5676fbc8663fcd7127 void ms_to_timespec(struct timespec *ts, unsigned int ms); unsigned int timespec_to_ms(const struct timespec *abstime); diff --git a/common/string_util.c b/common/string_util.c -index 492eabfa09ef6219c6e74bfc7de6d4407ed913c7..f7da2b8d77960febe07c52f770a9c4e3bbda29f0 100644 +index 3d86eb2f2d602a5b00c29952808368dc73c0b0cd..14726e7a7f66a330b28ef326734cd7fd25e8d4dd 100644 --- a/common/string_util.c +++ b/common/string_util.c @@ -314,7 +314,7 @@ char *str_touppercase(char *s) @@ -197,7 +202,7 @@ index 492eabfa09ef6219c6e74bfc7de6d4407ed913c7..f7da2b8d77960febe07c52f770a9c4e3 string_buffer_t *sb = (string_buffer_t*) calloc(1, sizeof(string_buffer_t)); assert(sb != NULL); diff --git a/common/string_util.h b/common/string_util.h -index 6b5835553617ba16fc987edee5d2bc19e2824766..765f5a1d75e9327e6005e6d04db0c1da864ae91d 100644 +index 9a7cd1e4509e3eba102316330cd50df918f56aed..d0363b03f23a94c35ed3581ea40f6d8f3f2d4110 100644 --- a/common/string_util.h +++ b/common/string_util.h @@ -262,7 +262,7 @@ char *str_replace(const char *haystack, const char *needle, const char *replacem @@ -232,10 +237,10 @@ index 7a25f424068d798a8c65c69c6c17dd05b2e2b950..f3e3b0849bb8442ca1be6fda29ffcc79 struct timeval tv; gettimeofday (&tv, NULL); // blacklist-ignore diff --git a/common/time_util.h b/common/time_util.h -index c1840495a370e196e30d0ab432ddda12f4cc4819..58da911010f0030e81c2a33d6a5002f671d38145 100644 +index 207e95838126a503567bf21b4bc8a3f32774afd8..c42466b3a0acdd322bd33aa9c77df09adc6585f1 100644 --- a/common/time_util.h +++ b/common/time_util.h -@@ -58,10 +58,10 @@ extern "C" { +@@ -56,10 +56,10 @@ extern "C" { #endif typedef struct timeutil_rest timeutil_rest_t; @@ -262,17 +267,42 @@ index 8016386ed214de371eae619f4e887aef01852408..197d6ceb330a4414483bd9db66e091d4 timeprofile_t *tp = (timeprofile_t*) calloc(1, sizeof(timeprofile_t)); tp->stamps = zarray_create(sizeof(struct timeprofile_entry)); diff --git a/common/workerpool.c b/common/workerpool.c -index 6b73541c09025ef907e2c3c598343955a14c3e7e..25dccd0a341cfb3991e735d7a3b2bd6b8f6c299a 100644 +index a0170ef87978cb4cd2d3d8a198ffea471b6e40b2..23415eb5610751ae7f861f1deb7b25c8e56774a3 100644 --- a/common/workerpool.c +++ b/common/workerpool.c -@@ -213,7 +213,7 @@ void workerpool_run(workerpool_t *wp) +@@ -66,7 +66,7 @@ void *worker_thread(void *p) + { + workerpool_t *wp = (workerpool_t*) p; + +- int cnt = 0; ++// int cnt = 0; + + while (1) { + struct task *task; +@@ -77,13 +77,13 @@ void *worker_thread(void *p) + // printf("%"PRId64" thread %d did %d\n", utime_now(), pthread_self(), cnt); + pthread_cond_broadcast(&wp->endcond); + pthread_cond_wait(&wp->startcond, &wp->mutex); +- cnt = 0; ++// cnt = 0; + // printf("%"PRId64" thread %d awake\n", utime_now(), pthread_self()); + } + + zarray_get_volatile(wp->tasks, wp->taskspos, &task); + wp->taskspos++; +- cnt++; ++// cnt++; + pthread_mutex_unlock(&wp->mutex); + // pthread_yield(); + sched_yield(); +@@ -203,7 +203,7 @@ void workerpool_run(workerpool_t *wp) } } -int workerpool_get_nprocs() +int workerpool_get_nprocs(void) { - #ifdef _WIN32 + #ifdef WIN32 SYSTEM_INFO sysinfo; diff --git a/common/workerpool.h b/common/workerpool.h index 2c32ab1eb7f9fe1e803aef187d4af3aea9284238..070a983cbb0ce24450297dba2f58a903977c5a24 100644 @@ -284,11 +314,126 @@ index 2c32ab1eb7f9fe1e803aef187d4af3aea9284238..070a983cbb0ce24450297dba2f58a903 -int workerpool_get_nprocs(); +int workerpool_get_nprocs(void); +diff --git a/common/zarray.c b/common/zarray.c +index 43e6a7e0c6fb6d06414d6910e511d362ccc35354..fa1f8a25b6cad5661d70aa81b40b991126a9ac7c 100644 +--- a/common/zarray.c ++++ b/common/zarray.c +@@ -41,7 +41,7 @@ int zstrcmp(const void * a_pp, const void * b_pp) + return strcmp(a,b); + } + +-void zarray_vmap(zarray_t *za, void (*f)()) ++void zarray_vmap(zarray_t *za, void (*f)(void*)) + { + assert(za != NULL); + assert(f != NULL); +diff --git a/common/zarray.h b/common/zarray.h +index 22b4c2bb4773d5d80e33c14a7b4945ab18586939..411ee7b6495b4b37813d08dc42848ce96734fb39 100644 +--- a/common/zarray.h ++++ b/common/zarray.h +@@ -355,7 +355,7 @@ static inline void zarray_map(zarray_t *za, void (*f)(void*)) + * + * void map_function(element_type *element) + */ +- void zarray_vmap(zarray_t *za, void (*f)()); ++ void zarray_vmap(zarray_t *za, void (*f)(void*)); + + /** + * Removes all elements from the array and sets its size to zero. Pointers to +diff --git a/common/zhash.c b/common/zhash.c +index faf52233ed92f64b87ddbab255121c8202b13019..10eb6eb8a6e3ce70e51a117009dcbea3aa381d4c 100644 +--- a/common/zhash.c ++++ b/common/zhash.c +@@ -352,7 +352,7 @@ void zhash_iterator_remove(zhash_iterator_t *zit) + zit->last_entry--; + } + +-void zhash_map_keys(zhash_t *zh, void (*f)()) ++void zhash_map_keys(zhash_t *zh, void (*f)(void *)) + { + assert(zh != NULL); + if (f == NULL) +@@ -368,7 +368,7 @@ void zhash_map_keys(zhash_t *zh, void (*f)()) + } + } + +-void zhash_vmap_keys(zhash_t * zh, void (*f)()) ++void zhash_vmap_keys(zhash_t * zh, void (*f)(void *)) + { + assert(zh != NULL); + if (f == NULL) +@@ -385,7 +385,7 @@ void zhash_vmap_keys(zhash_t * zh, void (*f)()) + } + } + +-void zhash_map_values(zhash_t * zh, void (*f)()) ++void zhash_map_values(zhash_t * zh, void (*f)(void *)) + { + assert(zh != NULL); + if (f == NULL) +@@ -400,7 +400,7 @@ void zhash_map_values(zhash_t * zh, void (*f)()) + } + } + +-void zhash_vmap_values(zhash_t * zh, void (*f)()) ++void zhash_vmap_values(zhash_t * zh, void (*f)(void *)) + { + assert(zh != NULL); + if (f == NULL) +diff --git a/common/zhash.h b/common/zhash.h +index f3dee1aa40f6f2717fa23d7e7f856bd8864a99b3..9993a66e4aed22d998d58e10a5d0db0193fcff95 100644 +--- a/common/zhash.h ++++ b/common/zhash.h +@@ -259,7 +259,7 @@ void zhash_iterator_remove(zhash_iterator_t *zit); + * for the key, which the caller should not modify, as the hash table will not be + * re-indexed. The function may be NULL, in which case no action is taken. + */ +-void zhash_map_keys(zhash_t *zh, void (*f)()); ++void zhash_map_keys(zhash_t *zh, void (*f)(void *)); + + /** + * Calls the supplied function with a pointer to every value in the hash table in +@@ -267,7 +267,7 @@ void zhash_map_keys(zhash_t *zh, void (*f)()); + * for the value, which the caller may safely modify. The function may be NULL, + * in which case no action is taken. + */ +-void zhash_map_values(zhash_t *zh, void (*f)()); ++void zhash_map_values(zhash_t *zh, void (*f)(void *)); + + /** + * Calls the supplied function with a copy of every key in the hash table in +@@ -280,7 +280,7 @@ void zhash_map_values(zhash_t *zh, void (*f)()); + * Use with non-pointer keys (i.e. integer, double, etc.) will likely cause a + * segmentation fault. + */ +-void zhash_vmap_keys(zhash_t *vh, void (*f)()); ++void zhash_vmap_keys(zhash_t *vh, void (*f)(void *)); + + /** + * Calls the supplied function with a copy of every value in the hash table in +@@ -293,7 +293,7 @@ void zhash_vmap_keys(zhash_t *vh, void (*f)()); + * Use with non-pointer values (i.e. integer, double, etc.) will likely cause a + * segmentation fault. + */ +-void zhash_vmap_values(zhash_t *vh, void (*f)()); ++void zhash_vmap_values(zhash_t *vh, void (*f)(void *)); + + /** + * Returns an array which contains copies of all of the hash table's keys, in no diff --git a/common/zmaxheap.c b/common/zmaxheap.c -index abbb549e41b6073f581b5c3216f024ed370b9212..af0cc1eedfc63670c51e5818444b6bc2d67d2c3a 100644 +index ed271420d229a98b56c7027f47d9830a78a97db1..a073ae5a17fdd5f11f4e17d56cc05548113f6a6c 100644 --- a/common/zmaxheap.c +++ b/common/zmaxheap.c -@@ -357,7 +357,7 @@ void zmaxheap_iterator_finish(zmaxheap_iterator_t *it) +@@ -167,7 +167,7 @@ void zmaxheap_add(zmaxheap_t *heap, void *p, float v) + } + } + +-void zmaxheap_vmap(zmaxheap_t *heap, void (*f)()) ++void zmaxheap_vmap(zmaxheap_t *heap, void (*f)(void*)) + { + assert(heap != NULL); + assert(f != NULL); +@@ -358,7 +358,7 @@ void zmaxheap_iterator_finish(zmaxheap_iterator_t *it) maxheapify(heap, i); } @@ -297,6 +442,19 @@ index abbb549e41b6073f581b5c3216f024ed370b9212..af0cc1eedfc63670c51e5818444b6bc2 { int cap = 10000; int sz = 0; +diff --git a/common/zmaxheap.h b/common/zmaxheap.h +index f0020f92e7a46c4814f30d77c189931e0e276d18..af9d1458c518e365828a5dd3bb7050cf57d2ce9b 100644 +--- a/common/zmaxheap.h ++++ b/common/zmaxheap.h +@@ -39,7 +39,7 @@ struct zmaxheap_iterator { + + zmaxheap_t *zmaxheap_create(size_t el_sz); + +-void zmaxheap_vmap(zmaxheap_t *heap, void (*f)()); ++void zmaxheap_vmap(zmaxheap_t *heap, void (*f)(void*)); + + void zmaxheap_destroy(zmaxheap_t *heap); + diff --git a/tag16h5.c b/tag16h5.c index 775f33c7e2d91af83e4a62949cadebdce34e3eb9..e38302a1d2ca2a2344a775569aed266d063a8861 100644 --- a/tag16h5.c @@ -350,10 +508,10 @@ index 9197c8b367d4b2047cb7d9882dfc11092f0b3dce..6e0107d28f3c3da6ae148a9005077427 #ifdef __cplusplus diff --git a/tag36h10.c b/tag36h10.c -index 9c02c34c5db82f693191acc8975ef514f04588d5..e103748df2ac11201959747e182a17c3f4710b11 100644 +index 44a129e74b135e803e2324cea179ac3001718e14..843dc4e9dcb3fbde3d86ce0a7d18703f7c358c15 100644 --- a/tag36h10.c +++ b/tag36h10.c -@@ -2350,7 +2350,7 @@ static uint64_t codedata[2320] = { +@@ -2323,7 +2323,7 @@ static uint64_t codedata[2320] = { 0x0000000447b9e7acUL, 0x0000000d9f564f30UL, };