aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin Berger <j.david.berger@gmail.com>2018-03-15 16:26:11 -0600
committerJustin Berger <j.david.berger@gmail.com>2018-03-15 16:26:11 -0600
commita3faba1727a741fa43d4ad2a7b43cf93dcc1cadf (patch)
tree4913696519efa49c1bccc68a9df685d403507361 /src
parent49bade6bbcb351900f627f066b14a6826f6d7984 (diff)
downloadlibsurvive-a3faba1727a741fa43d4ad2a7b43cf93dcc1cadf.tar.gz
libsurvive-a3faba1727a741fa43d4ad2a7b43cf93dcc1cadf.tar.bz2
Cleaned up memory leaks
Diffstat (limited to 'src')
-rw-r--r--src/epnp/epnp.h1
-rw-r--r--src/epnp/opencv_shim.c53
-rw-r--r--src/poser_epnp.c4
-rwxr-xr-xsrc/survive.c7
-rw-r--r--src/survive_playback.c29
5 files changed, 41 insertions, 53 deletions
diff --git a/src/epnp/epnp.h b/src/epnp/epnp.h
index 9ca3a2e..0a42b04 100644
--- a/src/epnp/epnp.h
+++ b/src/epnp/epnp.h
@@ -46,6 +46,7 @@ typedef struct {
double cws_determinant;
} epnp;
+void epnp_dtor(epnp *self);
void epnp_set_internal_parameters(epnp *self, double uc, double vc, double fu, double fv);
void epnp_set_maximum_number_of_correspondences(epnp *self, int n);
void epnp_reset_correspondences(epnp *self);
diff --git a/src/epnp/opencv_shim.c b/src/epnp/opencv_shim.c
index d7886d0..df2765b 100644
--- a/src/epnp/opencv_shim.c
+++ b/src/epnp/opencv_shim.c
@@ -28,29 +28,7 @@ const int CV_64F = 0;
typedef double doublereal;
#define F77_FUNC(func) func##_
-/*
-extern int F77_FUNC(dgetrs)(char *trans, int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int
-*info);
-
-extern int F77_FUNC(dgetri)(int *n, double *a, int *lda, int *ipiv, double *work, int *lwork, int *info);
-extern int F77_FUNC(dgetrf)(int *m, int *n, double *a, int *lda, int *ipiv, int *info); /* blocked LU
-
-extern int F77_FUNC(dgesvd)(char *jobu, char *jobvt,
- int *m, int *n,
- double *a, int *lda, double *s, double *u, int *ldu,
- double *vt, int *ldvt, double *work, int *lwork,
- int *info);
-
-extern int F77_FUNC(dgesdd)(char *jobz,
- int *m, int *n, double *a, int *lda,
- double *s, double *u, int *ldu, double *vt, int *ldvt,
- double *work, int *lwork, int *iwork, int *info);
-
-extern int dgemm_(char *transa, char *transb, lapack_lapack_int *m, lapack_lapack_int *
- n, lapack_lapack_int *k, double *alpha, double *a, lapack_lapack_int *lda,
- double *b, lapack_lapack_int *ldb, double *beta, double *c, lapack_lapack_int
- *ldc);
-*/
+
void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src3, double beta, CvMat *dst, int tABC) {
lapack_int rows1 = src1->rows;
lapack_int cols1 = src1->cols;
@@ -85,7 +63,7 @@ void cvMulTransposed(const CvMat *src, CvMat *dst, int order, const CvMat *delta
lapack_int drows = dst->rows;
assert(drows == cols);
assert(order == 1 ? (dst->cols == src->cols) : (dst->cols == src->rows));
- assert(delta == 0); // THIS ISN'T IMPLEMENTED YET
+ assert(delta == 0 && "This isn't implemented yet");
double beta = 0;
bool isAT = order == 1;
@@ -93,16 +71,12 @@ void cvMulTransposed(const CvMat *src, CvMat *dst, int order, const CvMat *delta
lapack_int dstCols = dst->cols;
- cblas_dgemm(CblasRowMajor, isAT ? CblasTrans : CblasNoTrans, isBT ? CblasTrans : CblasNoTrans,
- cols, // isAT ? cols : rows,
- dstCols,
- rows, // isAT ? rows : cols,
+ cblas_dgemm(CblasRowMajor, isAT ? CblasTrans : CblasNoTrans, isBT ? CblasTrans : CblasNoTrans, cols, dstCols, rows,
scale,
src->data.db, cols, src->data.db, cols, beta,
dst->data.db, dstCols);
- // const CvMat* delta, double scale
}
void *cvAlloc(size_t size) { return malloc(size); }
@@ -242,14 +216,15 @@ double cvInvert(const CvMat *srcarr, CvMat *dstarr, int method) {
free(ipiv);
} else if (method == DECOMP_SVD) {
-
+ // TODO: There is no way this needs this many allocations,
+ // but in my defense I was very tired when I wrote this code
CvMat *w = cvCreateMat(1, MIN(dstarr->rows, dstarr->cols), dstarr->type);
CvMat *u = cvCreateMat(dstarr->cols, dstarr->cols, dstarr->type);
CvMat *v = cvCreateMat(dstarr->rows, dstarr->rows, dstarr->type);
- cvSVD(dstarr, w, u, v, 0);
-
CvMat *um = cvCreateMat(w->cols, w->cols, w->type);
+ cvSVD(dstarr, w, u, v, 0);
+
cvSetZero(um);
for (int i = 0; i < w->cols; i++) {
cvmSet(um, i, i, 1. / w->data.db[i]);
@@ -258,6 +233,12 @@ double cvInvert(const CvMat *srcarr, CvMat *dstarr, int method) {
CvMat *tmp = cvCreateMat(dstarr->cols, dstarr->rows, dstarr->type);
cvGEMM(v, um, 1, 0, 0, tmp, GEMM_1_T);
cvGEMM(tmp, u, 1, 0, 0, dstarr, GEMM_2_T);
+
+ cvReleaseMat(&tmp);
+ cvReleaseMat(&w);
+ cvReleaseMat(&u);
+ cvReleaseMat(&v);
+ cvReleaseMat(&um);
}
return 0;
}
@@ -333,11 +314,9 @@ int cvSolve(const CvMat *Aarr, const CvMat *xarr, CvMat *Barr, int method) {
assert(Barr->cols == xCpy->cols);
xCpy->rows = acols;
cvCopyTo(xCpy, Barr);
-/*
-Barr->data = xCpy->data;
-Barr->rows = acols;
-Barr->cols = xCpy->cols;
-*/
+
+ cvReleaseMat(&aCpy);
+ cvReleaseMat(&xCpy);
#ifdef DEBUG_PRINT
print_mat(Barr);
#endif
diff --git a/src/poser_epnp.c b/src/poser_epnp.c
index 21e61ae..7749c7b 100644
--- a/src/poser_epnp.c
+++ b/src/poser_epnp.c
@@ -85,6 +85,8 @@ static int opencv_solver_fullscene(SurviveObject *so, PoserDataFullScene *pdfs)
SurvivePose lighthouse = solve_correspondence(so, &pnp, true);
PoserData_lighthouse_pose_func(&pdfs->hdr, so, lh, &lighthouse);
+
+ epnp_dtor(&pnp);
}
return 0;
}
@@ -137,6 +139,8 @@ int PoserEPNP(SurviveObject *so, PoserData *pd) {
quatrotateabout(txPose.Rot, so->ctx->bsd[lh].Pose.Rot, pose.Rot);
PoserData_poser_raw_pose_func(pd, so, lh, &txPose);
}
+
+ epnp_dtor(&pnp);
}
return 0;
diff --git a/src/survive.c b/src/survive.c
index e09ae13..a27ba3e 100755
--- a/src/survive.c
+++ b/src/survive.c
@@ -340,7 +340,8 @@ void survive_close( SurviveContext * ctx )
{
PoserData pd;
pd.pt = POSERDATA_DISASSOCIATE;
- if( ctx->objs[i]->PoserFn ) ctx->objs[i]->PoserFn( ctx->objs[i], &pd );
+ if (ctx->objs[i]->PoserFn)
+ ctx->objs[i]->PoserFn(ctx->objs[i], &pd);
}
for( i = 0; i < oldct; i++ )
@@ -354,6 +355,10 @@ void survive_close( SurviveContext * ctx )
destroy_config_group(ctx->global_config_values);
destroy_config_group(ctx->lh_config);
+ for (i = 0; i < ctx->objs_ct; i++) {
+ free(ctx->objs[i]);
+ }
+
free( ctx->objs );
free( ctx->drivers );
free( ctx->driverpolls );
diff --git a/src/survive_playback.c b/src/survive_playback.c
index fe7af2b..c4564c4 100644
--- a/src/survive_playback.c
+++ b/src/survive_playback.c
@@ -160,6 +160,7 @@ static int playback_close(struct SurviveContext *ctx, void *_driver) {
if (driver->playback_file)
fclose(driver->playback_file);
driver->playback_file = 0;
+
return 0;
}
@@ -184,7 +185,11 @@ static int LoadConfig(SurvivePlaybackData *sv, SurviveObject *so) {
ct0conf[len] = 0;
printf("Loading config: %d\n", len);
- return survive_load_htc_config_format(ct0conf, len, so);
+ int rtn = survive_load_htc_config_format(ct0conf, len, so);
+
+ free(ct0conf);
+
+ return rtn;
}
int DriverRegPlayback(SurviveContext *ctx) {
@@ -217,20 +222,14 @@ int DriverRegPlayback(SurviveContext *ctx) {
SurviveObject *tr0 = survive_create_tr0(ctx, "Playback", sp);
SurviveObject *ww0 = survive_create_ww0(ctx, "Playback", sp);
- if (!LoadConfig(sp, hmd)) {
- survive_add_object(ctx, hmd);
- }
- if (!LoadConfig(sp, wm0)) {
- survive_add_object(ctx, wm0);
- }
- if (!LoadConfig(sp, wm1)) {
- survive_add_object(ctx, wm1);
- }
- if (!LoadConfig(sp, tr0)) {
- survive_add_object(ctx, tr0);
- }
- if (!LoadConfig(sp, ww0)) {
- survive_add_object(ctx, ww0);
+ SurviveObject *objs[] = {hmd, wm0, wm1, tr0, ww0, 0};
+
+ for (SurviveObject **obj = objs; *obj; obj++) {
+ if (!LoadConfig(sp, *obj)) {
+ survive_add_object(ctx, *obj);
+ } else {
+ free(*obj);
+ }
}
survive_add_driver(ctx, sp, playback_poll, playback_close, 0);