Spaces:
Runtime error
Runtime error
Ticket Name: CCS/TDA2: unresolved symbol vcop_median3x3_char_cn, first referenced in ./vcop_median3x3_tb.obj | |
Query Text: | |
Part Number: TDA2 Tool/software: Code Composer Studio SDK_VISION_03_02_00_00\ti_components\algorithms\eve_sw_01_18_00_00\kernels\imgsiglib\vcop_median3x3\inc have vcop_median3x3_uchar_cn and vcop_median3x3_char_cn funcs i am building this sample (SDK_VISION_03_02_00_00\ti_components\algorithms\eve_sw_01_18_00_00\kernels\imgsiglib\vcop_median3x3 ) have this unresolved symbol vcop_median3x3_char_cn, first referenced in ./vcop_median3x3_tb.obj Problem THANKS! | |
Responses: | |
Hello, I apologize but it seems like the file vcop_median3x3_cn.c is missing from the release. Please create a directory src_C at the same level as src_kernelC and add the attached file to it. regards, Victor vcop_median3x3_cn.c /* | |
* module : EVE SW | |
* | |
* module description : Software for EVE core targeted for imaging and vision | |
* applications | |
* | |
* Copyright (C) 2009-2017 Texas Instruments Incorporated - http://www.ti.com/ | |
* ALL RIGHTS RESERVED | |
* | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <assert.h> | |
#include <math.h> | |
#include "vcop_median3x3_cn.h" | |
#define MAX(a, b) (a > b ? a : b) | |
#define MIN(a, b) (a < b ? a : b) | |
void vcop_median3x3_uchar_cn | |
( | |
unsigned char *in, | |
unsigned char *out, | |
unsigned char *scratch1, | |
unsigned char *scratch2, | |
int w_input, | |
int w_out, | |
int w_compute, | |
int h_compute | |
) | |
{ | |
int i, j, m, n, k; | |
int c2l, c2m, c2h; | |
int in0, in1; | |
int tmp; | |
int min_of_max, max_of_min; | |
int min_in, max_in, med_in, med_max, med_max_nxt; | |
int min, med, max; | |
int scratch_w = w_compute + 0; | |
/*-----------------------------------------------------------------------*/ | |
/* Initialize the output to zeros at the beginning. */ | |
/*-----------------------------------------------------------------------*/ | |
for ( i = 0; i < (int) h_compute * 3; i++) // lpend3 | |
{ | |
for (j = 0; j < scratch_w; j++ ) //lpend4 | |
{ | |
scratch1[( i * scratch_w) + j ] = 0; | |
} | |
} | |
for ( i = 0; i < w_compute; i++ ) | |
for ( j = 0; j < h_compute; j++ ) | |
out[j * w_compute + i ] = 0; | |
/*-----------------------------------------------------------------------*/ | |
/* This is the first loop where sets of three consecutive rows are */ | |
/* re ordered as min, med and max rows. Thus, the output of this loop */ | |
/* has a height of 3x that of the input array. */ | |
/*-----------------------------------------------------------------------*/ | |
for ( j = 0; j < (int) w_compute; j++) // lpend3 | |
{ | |
/*-------------------------------------------------------------------*/ | |
/* Initialize the columns to get started. */ | |
/*-------------------------------------------------------------------*/ | |
c2l = c2m = c2h = 0; | |
in0 = in1 = 0; | |
m = 0; | |
for (i = 0; i < (int) h_compute; i++ ) //lpend4 | |
{ | |
/*-----------------------------------------------------------*/ | |
/* Read in the latest column. */ | |
/*-----------------------------------------------------------*/ | |
c2l = in0; | |
c2m = in1; | |
c2h = in[( ( i + 0 ) * (w_input + 0) ) + j ]; | |
#ifdef __PRINT__ | |
printf("column values read in are:\n %x, %x, %x\n", c2l, c2m, c2h); | |
#endif | |
/*-----------------------------------------------------------*/ | |
/* Sort the latest column into low, middle and high values. */ | |
/*-----------------------------------------------------------*/ | |
in0 = c2m; | |
in1 = c2h; | |
if ( c2l > c2h ) { tmp = c2l; c2l = c2h; c2h = tmp; } | |
if ( c2l > c2m ) { tmp = c2l; c2l = c2m; c2m = tmp; } | |
if ( c2m > c2h ) { tmp = c2m; c2m = c2h; c2h = tmp; } | |
/*-----------------------------------------------------------*/ | |
/* Write the values out. */ | |
/*-----------------------------------------------------------*/ | |
m = (i * 3); | |
scratch1[( (m + 0) * scratch_w) + j] = c2l; | |
scratch1[( (m + 1) * scratch_w) + j] = c2m; | |
scratch1[( (m + 2) * scratch_w) + j] = c2h; | |
} | |
} | |
/*-----------------------------------------------------------------------*/ | |
/* This is the second loop where the max_of_min, min_of_max and */ | |
/* med_of_med values are evaluated in the horizontal direction taking */ | |
/* three consecutive values at a time and moving the pointer by one each */ | |
/* time in the horizontal direction. */ | |
/*-----------------------------------------------------------------------*/ | |
for ( i = 0; i < (int) (h_compute * 3); i+=3) // lpend3 | |
{ | |
for (j = 0; j < (int) scratch_w; j++ ) //lpend4 | |
{ | |
med_max = 0; | |
med_max_nxt = 0; | |
min_of_max = 255; | |
max_of_min = 0; | |
for ( k = 0; k < 3; k++) | |
{ | |
/*----------------------------------------------------------*/ | |
/* Read in the latest column and copy previous values as */ | |
/* current values. */ | |
/*----------------------------------------------------------*/ | |
min_in = scratch1[( ( i + 6 + 0 ) * scratch_w) + j + k]; | |
med_in = scratch1[( ( i + 6 + 1 ) * scratch_w) + j + k]; | |
max_in = scratch1[( ( i + 6 + 2 ) * scratch_w) + j + k]; | |
/*-----------------------------------------------------------*/ | |
/* Obtain the min_of_max, max_of_min and median of median */ | |
/* values, taking three at a time. */ | |
/*-----------------------------------------------------------*/ | |
max_of_min = MAX(max_of_min, min_in); | |
min_of_max = MIN(min_of_max, max_in); | |
if (med_in > med_max) { tmp = med_max; med_max = med_in; med_in = tmp; } | |
if (med_in > med_max_nxt) { tmp = med_max_nxt; med_max_nxt = med_in; med_in = tmp; } | |
} | |
/*-----------------------------------------------------------*/ | |
/* Write the values out. */ | |
/*-----------------------------------------------------------*/ | |
scratch2[( (i + 0) * scratch_w) + j] = max_of_min; | |
scratch2[( (i + 1) * scratch_w) + j] = med_max_nxt; | |
scratch2[( (i + 2) * scratch_w) + j] = min_of_max; | |
} | |
} | |
/*-----------------------------------------------------------------------*/ | |
/* This is the third loop where the true median is computed from the */ | |
/* previous result by taking the max_of_min, med_of_med and min_of_max */ | |
/* values in the vertical order. The resultant array has the same height */ | |
/* as that of the input. */ | |
/*-----------------------------------------------------------------------*/ | |
n = 0; | |
for ( i = 0; i < (int) h_compute * 3; i+=3) // lpend1 | |
{ | |
for (j = 0; j < (int) w_compute; j++) //lpend2 | |
{ | |
/*----------------------------------------------------------*/ | |
/* Read in the latest column. */ | |
/*----------------------------------------------------------*/ | |
min = scratch2[( ( i + 0 ) * scratch_w) + j]; | |
med = scratch2[( ( i + 1 ) * scratch_w) + j]; | |
max = scratch2[( ( i + 2 ) * scratch_w) + j]; | |
/*-----------------------------------------------------------*/ | |
/* Sort the latest column into low, middle and high values. */ | |
/*-----------------------------------------------------------*/ | |
if ( min > max ) { tmp = min; min = max; max = tmp; } | |
if ( min > med ) { tmp = min; min = med; med = tmp; } | |
if ( med > max ) { tmp = med; med = max; max = tmp; } | |
/*-----------------------------------------------------------*/ | |
/* Write the values out. */ | |
/*-----------------------------------------------------------*/ | |
n = (int) (i/3); | |
out[( n * w_compute) + j] = med; | |
} | |
} | |
return; | |
} | |
void vcop_median3x3_char_cn | |
( | |
signed char *in, | |
signed char *out, | |
signed char *scratch1, | |
signed char *scratch2, | |
int w_input, | |
int w_out, | |
int w_compute, | |
int h_compute | |
) | |
{ | |
int i, j, m, n, k; | |
int c2l, c2m, c2h; | |
int in0, in1; | |
int tmp; | |
int min_of_max, max_of_min; | |
int min_in, max_in, med_in, med_max, med_max_nxt; | |
int min, med, max; | |
int scratch_w = w_compute + 0; | |
/*-----------------------------------------------------------------------*/ | |
/* Initialize the output to zeros at the beginning. */ | |
/*-----------------------------------------------------------------------*/ | |
for ( i = 0; i < (int) h_compute * 3; i++) // lpend3 | |
{ | |
for (j = 0; j < scratch_w; j++ ) //lpend4 | |
{ | |
scratch1[( i * scratch_w) + j ] = 0; | |
} | |
} | |
for ( i = 0; i < w_compute; i++ ) | |
for ( j = 0; j < h_compute; j++ ) | |
out[j * w_compute + i ] = 0; | |
/*-----------------------------------------------------------------------*/ | |
/* This is the first loop where sets of three consecutive rows are */ | |
/* re ordered as min, med and max rows. Thus, the output of this loop */ | |
/* has a height of 3x that of the input array. */ | |
/*-----------------------------------------------------------------------*/ | |
for ( j = 0; j < (int) w_compute; j++) // lpend3 | |
{ | |
/*-------------------------------------------------------------------*/ | |
/* Initialize the columns to get started. */ | |
/*-------------------------------------------------------------------*/ | |
c2l = c2m = c2h = 0; | |
in0 = in1 = 0; | |
m = 0; | |
for (i = 0; i < (int) h_compute; i++ ) //lpend4 | |
{ | |
/*-----------------------------------------------------------*/ | |
/* Read in the latest column. */ | |
/*-----------------------------------------------------------*/ | |
c2l = in0; | |
c2m = in1; | |
c2h = in[( i * w_input ) + j ]; | |
#ifdef __PRINT__ | |
printf("column values read in are:\n %x, %x, %x\n", c2l, c2m, c2h); | |
#endif | |
/*-----------------------------------------------------------*/ | |
/* Sort the latest column into low, middle and high values. */ | |
/*-----------------------------------------------------------*/ | |
in0 = c2m; | |
in1 = c2h; | |
if ( c2l > c2h ) { tmp = c2l; c2l = c2h; c2h = tmp; } | |
if ( c2l > c2m ) { tmp = c2l; c2l = c2m; c2m = tmp; } | |
if ( c2m > c2h ) { tmp = c2m; c2m = c2h; c2h = tmp; } | |
/*-----------------------------------------------------------*/ | |
/* Write the values out. */ | |
/*-----------------------------------------------------------*/ | |
m = (i * 3); | |
scratch1[( (m + 0) * scratch_w) + j] = c2l; | |
scratch1[( (m + 1) * scratch_w) + j] = c2m; | |
scratch1[( (m + 2) * scratch_w) + j] = c2h; | |
} | |
} | |
/*-----------------------------------------------------------------------*/ | |
/* This is the second loop where the max_of_min, min_of_max and */ | |
/* med_of_med values are evaluated in the horizontal direction taking */ | |
/* three consecutive values at a time and moving the pointer by one each */ | |
/* time in the horizontal direction. */ | |
/*-----------------------------------------------------------------------*/ | |
for ( i = 0; i < (int) (h_compute * 3); i+=3) // lpend3 | |
{ | |
for (j = 0; j < (int) scratch_w; j++ ) //lpend4 | |
{ | |
med_max = -128; | |
med_max_nxt = -128; | |
min_of_max = 127; | |
max_of_min = -128; | |
for ( k = 0; k < 3; k++) | |
{ | |
/*----------------------------------------------------------*/ | |
/* Read in the latest column and copy previous values as */ | |
/* current values. */ | |
/*----------------------------------------------------------*/ | |
min_in = scratch1[( ( i + 6 + 0 ) * scratch_w) + j + k]; | |
med_in = scratch1[( ( i + 6 + 1 ) * scratch_w) + j + k]; | |
max_in = scratch1[( ( i + 6 + 2 ) * scratch_w) + j + k]; | |
/*-----------------------------------------------------------*/ | |
/* Obtain the min_of_max, max_of_min and median of median */ | |
/* values, taking three at a time. */ | |
/*-----------------------------------------------------------*/ | |
max_of_min = MAX(max_of_min, min_in); | |
min_of_max = MIN(min_of_max, max_in); | |
if (med_in > med_max) { tmp = med_max; med_max = med_in; med_in = tmp; } | |
if (med_in > med_max_nxt) { tmp = med_max_nxt; med_max_nxt = med_in; med_in = tmp; } | |
} | |
/*-----------------------------------------------------------*/ | |
/* Write the values out. */ | |
/*-----------------------------------------------------------*/ | |
scratch2[( (i + 0) * scratch_w) + j] = max_of_min; | |
scratch2[( (i + 1) * scratch_w) + j] = med_max_nxt; | |
scratch2[( (i + 2) * scratch_w) + j] = min_of_max; | |
} | |
} | |
/*-----------------------------------------------------------------------*/ | |
/* This is the third loop where the true median is computed from the */ | |
/* previous result by taking the max_of_min, med_of_med and min_of_max */ | |
/* values in the vertical order. The resultant array has the same height */ | |
/* as that of the input. */ | |
/*-----------------------------------------------------------------------*/ | |
n = 0; | |
for ( i = 0; i < (int) h_compute * 3; i+=3) // lpend1 | |
{ | |
for (j = 0; j < (int) w_compute; j++) //lpend2 | |
{ | |
/*----------------------------------------------------------*/ | |
/* Read in the latest column. */ | |
/*----------------------------------------------------------*/ | |
min = scratch2[( ( i + 0 ) * scratch_w) + j]; | |
med = scratch2[( ( i + 1 ) * scratch_w) + j]; | |
max = scratch2[( ( i + 2 ) * scratch_w) + j]; | |
/*-----------------------------------------------------------*/ | |
/* Sort the latest column into low, middle and high values. */ | |
/*-----------------------------------------------------------*/ | |
if ( min > max ) { tmp = min; min = max; max = tmp; } | |
if ( min > med ) { tmp = min; min = med; med = tmp; } | |
if ( med > max ) { tmp = med; med = max; max = tmp; } | |
/*-----------------------------------------------------------*/ | |
/* Write the values out. */ | |
/*-----------------------------------------------------------*/ | |
n = (int) (i/3); | |
out[( n * w_compute) + j] = med; | |
} | |
} | |
return; | |
} | |
Hi Victor thanks! but i think samples in SDK_VISION_03_04_00_00\ti_components\algorithms\eve_sw_01_19_00_00 all miss the .c file . can you share them at a site we can download if need. shuai | |
Shuai, You already asked a similar question in another thread and we have already mentioned that we don't release natural C. Please refer the following thread to see our answer https://e2e.ti.com/support/arm/automotive_processors/f/1021/p/723811/2670469#2670469 Regards, Anshu | |