tofiCompute.cpp
Go to the documentation of this file.
1 // Copyright (c) 2022 Analog Devices, Inc-> All Rights Reserved.
2 // This software is proprietary to Analog Devices, Inc. and its licensors.
3 
4 #include <cstdint>
5 #include <iostream>
6 #include <math.h>
7 #include <string.h>
8 
9 #include "algorithms.h"
10 #include "tofi_compute.h"
11 #include "tofi_error.h"
12 
13 #define GEN_XYZ_ITERATIONS 20
14 
15 typedef struct {
16  int n_depth;
17  int n_ab;
18  int n_conf;
20 } PrivateData;
21 
22 TofiComputeContext *InitTofiCompute(const void *p_tofi_cal_config,
23  uint32_t *p_status) {
25  PrivateData *privDataObj = new PrivateData;
26 
27  // Extract the number of bits for: Depth, AB, Confidence
28  TofiXYZDealiasData *ccb_data = (TofiXYZDealiasData *)p_tofi_cal_config;
29  uint16_t bits = ccb_data->Freq[0];
30  privDataObj->n_depth = bits & 0x001F;
31  privDataObj->n_ab = (bits & 0x03E0) >> 5;
32  privDataObj->n_conf = (bits & 0x3C00) >> 10;
33 
34  // Generate the X, Y, Z tables
35  memset(&privDataObj->xyz_table, 0, sizeof(privDataObj->xyz_table));
36 
37  int n_cols = ccb_data->n_cols;
38  int n_rows = ccb_data->n_rows;
39 
40  int status = Algorithms::GenerateXYZTables(
41  &privDataObj->xyz_table.p_x_table, &privDataObj->xyz_table.p_y_table,
42  &privDataObj->xyz_table.p_z_table, &(ccb_data->camera_intrinsics),
43  ccb_data->n_sensor_rows, ccb_data->n_sensor_cols, n_rows, n_cols,
44  ccb_data->n_offset_rows, ccb_data->n_offset_cols,
45  ccb_data->row_bin_factor, ccb_data->col_bin_factor, GEN_XYZ_ITERATIONS);
46  if (status != 0 || !privDataObj->xyz_table.p_x_table ||
47  !privDataObj->xyz_table.p_y_table || !privDataObj->xyz_table.p_z_table)
48  return nullptr;
49 
50  // Set context
51  Obj->n_cols = 0;
52  Obj->n_rows = 0;
53  Obj->p_ab_frame = 0;
54  Obj->p_cal_config = (void *)p_tofi_cal_config;
55  Obj->p_conf_frame = 0;
56  Obj->p_depth16_frame = 0;
57  Obj->p_depth_frame = 0;
58  Obj->p_tofi_processor_config = (void *)privDataObj;
59  Obj->p_xyz_frame = 0;
60  return Obj;
61 };
62 
63 #define NUM_BITS(Input, n_pos, n_bits) (((1 << n_bits) - 1) & (Input >> n_pos))
64 
65 static uint32_t
66 DeInterleaveDepth(uint8_t *p_frame_data, uint32_t n_bits_in_depth,
67  uint32_t n_bits_in_conf, uint32_t n_bits_in_ab,
68  uint32_t n_bytes, uint32_t width, uint32_t height,
69  uint16_t *p_depth, uint16_t *p_conf, uint16_t *p_ab) {
70  uint8_t *input_buffer = p_frame_data;
71 
72  uint16_t *out_depth = p_depth;
73  uint16_t *out_conf = p_conf;
74  uint16_t *out_ab = p_ab;
75 
76  uint32_t n_pos_conf = (16 - n_bits_in_depth) ? 16 - n_bits_in_depth : 8;
77  uint32_t n_depth_conf = n_bits_in_depth + n_bits_in_conf;
78  uint32_t div = n_depth_conf % 8;
79  uint32_t n_count_conf = n_bits_in_ab ? n_depth_conf / 8 : 0;
80  uint32_t n_pos_ab = div ? 4 : 0;
81  uint32_t is_conf = n_depth_conf == 16 ? 0 : 2;
82  uint32_t n_ab_count = n_bits_in_ab == 8 ? 0 : n_count_conf + 1;
83 
84  uint32_t n_pixels = width * height;
85 
86  for (uint32_t pix_id = 0; pix_id < n_pixels; pix_id++) {
87  input_buffer = p_frame_data + pix_id * n_bytes;
88 
89  uint16_t temp = input_buffer[0] | (uint16_t)(input_buffer[1] << 8);
90  out_depth[pix_id] = NUM_BITS(temp, 0, n_bits_in_depth);
91 
92  if (out_conf) {
93  temp = input_buffer[1] | (uint16_t)(input_buffer[is_conf] << 8);
94  out_conf[pix_id] = NUM_BITS(temp, n_pos_conf, n_bits_in_conf);
95  }
96 
97  if (out_ab) {
98  temp = input_buffer[n_count_conf] |
99  (uint16_t)(input_buffer[n_ab_count] << 8);
100  out_ab[pix_id] = NUM_BITS(temp, n_pos_ab, n_bits_in_ab);
101  }
102  }
103  return 0;
104 }
105 
106 int TofiCompute(const uint16_t *const input_frame,
107  TofiComputeContext *const p_tofi_compute_context,
108  TemperatureInfo *p_temperature) {
109 
110  TofiXYZDealiasData *ccb_data =
111  (TofiXYZDealiasData *)p_tofi_compute_context->p_cal_config;
112  int n_cols = ccb_data->n_cols;
113  int n_rows = ccb_data->n_rows;
114 
115  PrivateData *p =
116  (PrivateData *)p_tofi_compute_context->p_tofi_processor_config;
117  int n_depth = p->n_depth;
118  int n_ab = p->n_ab;
119  int n_conf = p->n_conf;
120  int n_sum_bits = n_depth + n_conf + n_ab;
121  int n_bytes = n_sum_bits / 8;
122 
123  int status = DeInterleaveDepth(
124  (uint8_t *)input_frame, n_depth, n_conf, n_ab, n_bytes, n_cols, n_rows,
125  p_tofi_compute_context->p_depth_frame,
126  (uint16_t *)p_tofi_compute_context->p_conf_frame,
127  p_tofi_compute_context->p_ab_frame);
128 
129  if (status != 0) {
130  std::cout << "Unable to deinterleave frame data !" << std::endl;
131  }
132 
133  // Compute Point cloud if needed (when a location address to XYZ is provided)
134  if (p_tofi_compute_context->p_xyz_frame) {
135  status = Algorithms::ComputeXYZ(
136  p_tofi_compute_context->p_depth_frame, &p->xyz_table,
137  p_tofi_compute_context->p_xyz_frame, n_rows, n_cols);
138 
139  if (status != 0) {
140  std::cout << "Unable to compute XYZ !" << std::endl;
141  }
142  }
143 
144  return 0;
145 };
146 
147 void FreeTofiCompute(TofiComputeContext *p_tofi_compute_context) {
148  PrivateData *p =
149  (PrivateData *)p_tofi_compute_context->p_tofi_processor_config;
150  // Free tabels x, y, z
151  if (p->xyz_table.p_x_table) {
152  free((void *)p->xyz_table.p_x_table);
153  }
154  if (p->xyz_table.p_y_table) {
155  free((void *)p->xyz_table.p_y_table);
156  }
157  if (p->xyz_table.p_z_table) {
158  free((void *)p->xyz_table.p_z_table);
159  }
160  delete p;
161  delete p_tofi_compute_context;
162 };
TofiComputeContext::p_ab_frame
uint16_t * p_ab_frame
Pointer to the AB Frame.
Definition: tofi_compute.h:47
height
GLint GLsizei GLsizei height
Definition: glcorearb.h:2768
TofiXYZDealiasData::col_bin_factor
uint8_t col_bin_factor
Definition: tofi_camera_intrinsics.h:39
TofiComputeContext::p_depth_frame
uint16_t * p_depth_frame
Pointer to the Depth Frame.
Definition: tofi_compute.h:46
algorithms.h
TofiComputeContext::p_xyz_frame
int16_t * p_xyz_frame
Pointer to the XYZ Frame.
Definition: tofi_compute.h:49
TofiXYZDealiasData::n_offset_cols
uint16_t n_offset_cols
Definition: tofi_camera_intrinsics.h:41
InitTofiCompute
TofiComputeContext * InitTofiCompute(const void *p_tofi_cal_config, uint32_t *p_status)
Definition: tofiCompute.cpp:22
TofiComputeContext::p_depth16_frame
uint16_t * p_depth16_frame
Pointer to the Depth16 Frame.
Definition: tofi_compute.h:52
TofiXYZDealiasData::camera_intrinsics
CameraIntrinsics camera_intrinsics
Definition: tofi_camera_intrinsics.h:46
if
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END if(!upb_strtable_init(&intern->table, UPB_CTYPE_UINT64))
Definition: php/ext/google/protobuf/map.c:232
TofiXYZDealiasData::n_cols
int n_cols
Definition: tofi_camera_intrinsics.h:36
TofiComputeContext::p_cal_config
void * p_cal_config
Pointer to the Calibration config data.
Definition: tofi_compute.h:51
NUM_BITS
#define NUM_BITS(Input, n_pos, n_bits)
Definition: tofiCompute.cpp:63
TofiXYZDealiasData::n_rows
int n_rows
Definition: tofi_camera_intrinsics.h:35
TofiXYZDealiasData::Freq
uint16_t Freq[MAX_N_FREQS]
Definition: tofi_camera_intrinsics.h:45
GEN_XYZ_ITERATIONS
#define GEN_XYZ_ITERATIONS
Definition: tofiCompute.cpp:13
TemperatureInfo
Definition: tofi_compute.h:30
tofi_error.h
FreeTofiCompute
void FreeTofiCompute(TofiComputeContext *p_tofi_compute_context)
Definition: tofiCompute.cpp:147
PrivateData::n_conf
int n_conf
Definition: tofiCompute.cpp:18
PrivateData::n_ab
int n_ab
Definition: tofiCompute.cpp:17
p
const char * p
Definition: gmock-matchers_test.cc:3863
TofiComputeContext::n_cols
uint32_t n_cols
Number of columns.
Definition: tofi_compute.h:45
TofiXYZDealiasData::row_bin_factor
uint8_t row_bin_factor
Definition: tofi_camera_intrinsics.h:38
PrivateData::n_depth
int n_depth
Definition: tofiCompute.cpp:16
TofiComputeContext
Function to get the version for TOF Depth Compute Engine Library.
Definition: tofi_compute.h:43
DeInterleaveDepth
static uint32_t DeInterleaveDepth(uint8_t *p_frame_data, uint32_t n_bits_in_depth, uint32_t n_bits_in_conf, uint32_t n_bits_in_ab, uint32_t n_bytes, uint32_t width, uint32_t height, uint16_t *p_depth, uint16_t *p_conf, uint16_t *p_ab)
Definition: tofiCompute.cpp:66
TofiComputeContext::n_rows
uint32_t n_rows
Number of rows.
Definition: tofi_compute.h:44
TofiCompute
int TofiCompute(const uint16_t *const input_frame, TofiComputeContext *const p_tofi_compute_context, TemperatureInfo *p_temperature)
Definition: tofiCompute.cpp:106
Algorithms::GenerateXYZTables
static uint32_t GenerateXYZTables(const float **pp_x_table, const float **pp_y_table, const float **pp_z_table, CameraIntrinsics *p_intr_data, uint32_t n_sensor_rows, uint32_t n_sensor_cols, uint32_t n_out_rows, uint32_t n_out_cols, uint32_t n_offset_rows, uint32_t n_offset_cols, uint8_t row_bin_factor, uint8_t col_bin_factor, uint8_t iter)
Definition: algorithms.cpp:30
TofiXYZDealiasData::n_sensor_cols
uint16_t n_sensor_cols
Definition: tofi_camera_intrinsics.h:43
XYZTable::p_y_table
const float * p_y_table
Pointer to the radial correction Y Table.
Definition: tofi_config.h:36
Algorithms::ComputeXYZ
static uint32_t ComputeXYZ(const uint16_t *p_depth, XYZTable *p_xyz_data, int16_t *p_xyz_image, uint32_t n_rows, uint32_t n_cols)
Definition: algorithms.cpp:161
XYZTable
Definition: tofi_config.h:34
TofiComputeContext::p_tofi_processor_config
void * p_tofi_processor_config
Pointer to the Processor Config.
Definition: tofi_compute.h:50
TofiXYZDealiasData::n_offset_rows
uint16_t n_offset_rows
Definition: tofi_camera_intrinsics.h:40
tofi_compute.h
PrivateData
Definition: tofiCompute.cpp:15
TofiXYZDealiasData::n_sensor_rows
uint16_t n_sensor_rows
Definition: tofi_camera_intrinsics.h:42
TofiComputeContext::p_conf_frame
float * p_conf_frame
Pointer to the Confidence Frame.
Definition: tofi_compute.h:48
XYZTable::p_x_table
const float * p_x_table
Pointer to the radial correction X Table.
Definition: tofi_config.h:35
TofiXYZDealiasData
Definition: tofi_camera_intrinsics.h:34
PrivateData::xyz_table
XYZTable xyz_table
Definition: tofiCompute.cpp:19
width
GLint GLsizei width
Definition: glcorearb.h:2768
XYZTable::p_z_table
const float * p_z_table
Pointer to the radial correction Z Table.
Definition: tofi_config.h:37


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:07:00