thresh = thresh_dark;
tparams.threshold = thresh;
- olTraceReInit(&trace_ctx, &tparams);
+ olTraceReInit(trace_ctx, &tparams);
olTraceFree(&result);
obj = olTrace(trace_ctx, frame->data[0], frame->linesize[0], &result);
} while ((time+frametime) < vidtime);
}
+ olTraceDeinit(trace_ctx);
+
for(i=0;i<FRAMES_BUF;i++)
olRenderFrame(200);
return iters;
}
-int olTraceInit(OLTraceCtx **pctx, OLTraceParams *params)
+static void alloc_bufs(OLTraceCtx *ctx)
{
- OLTraceCtx *ctx = malloc(sizeof(OLTraceCtx));
-
- ctx->p = *params;
ctx->tracebuf = malloc(ctx->p.width * ctx->p.height * sizeof(*ctx->tracebuf));
ctx->sb_size = ctx->p.width * 16;
ctx->pb = malloc(ctx->pb_size * sizeof(*ctx->pb));
ctx->pbp = ctx->pb;
ctx->pb_end = ctx->pb + ctx->pb_size;
+}
+static void free_bufs(OLTraceCtx *ctx)
+{
+ if (ctx->tracebuf)
+ free(ctx->tracebuf);
+ if (ctx->sb)
+ free(ctx->sb);
+ if (ctx->pb)
+ free(ctx->pb);
+}
+
+int olTraceInit(OLTraceCtx **pctx, OLTraceParams *params)
+{
+ OLTraceCtx *ctx = malloc(sizeof(OLTraceCtx));
+
+ ctx->p = *params;
+
+ alloc_bufs(ctx);
*pctx = ctx;
return 0;
}
-int olTraceReInit(OLTraceCtx **ctx, OLTraceParams *params)
+
+int olTraceReInit(OLTraceCtx *ctx, OLTraceParams *params)
{
- (*ctx)->p = *params;
+ if (ctx->p.mode != params->mode ||
+ ctx->p.width != params->width ||
+ ctx->p.height != params->height)
+ {
+ free_bufs(ctx);
+ ctx->p = *params;
+ alloc_bufs(ctx);
+ } else {
+ ctx->p = *params;
+ }
return 0;
}
}
}
-
void olTraceDeinit(OLTraceCtx *ctx)
{
+ if (!ctx)
+ return;
+
+ free_bufs(ctx);
+ free(ctx);
}
static void find_edges_thresh(OLTraceCtx *ctx, uint8_t *src, unsigned int stride)
} OLTraceResult;
int olTraceInit(OLTraceCtx **ctx, OLTraceParams *params);
-int olTraceReInit(OLTraceCtx **ctx, OLTraceParams *params);
+int olTraceReInit(OLTraceCtx *ctx, OLTraceParams *params);
int olTrace(OLTraceCtx *ctx, uint8_t *src, icoord stride, OLTraceResult *result);
void olTraceFree(OLTraceResult *result);