1414#include < sstream>
1515#include < cstdlib>
1616#include < vector>
17- #include < cstdint>
1817#include < chrono>
1918#include < thread>
19+ #include < cstdio>
20+ #include < cstdint>
21+ #include < cstdlib>
2022
2123
2224
@@ -81,9 +83,9 @@ torch::ScalarType get_best_dtype() {
8183 }
8284}
8385
84- int bridge_tensor_elements (bridge_tensor_t &bt) {
85- int size = 1 ;
86- for (int i = 0 ; i < bt.dim ; ++i) {
86+ std:: size_t bridge_tensor_elements (bridge_tensor_t &bt) {
87+ std:: size_t size = 1 ;
88+ for (std:: size_t i = 0 ; i < bt.dim ; ++i) {
8789 size *= bt.sizes [i];
8890 }
8991 return size;
@@ -95,24 +97,39 @@ size_t bridge_tensor_size(bridge_tensor_t &bt) {
9597
9698void store_tensor (at::Tensor &input, float32_t * dest) {
9799 float32_t * data = input.data_ptr <float32_t >();
98- size_t bytes_size = sizeof (float32_t ) * input.numel ();
100+ std:: size_t bytes_size = sizeof (float32_t ) * input.numel ();
99101 // std::memmove(dest,data,bytes_size);
100102 std::memcpy (dest,data,bytes_size);
101103}
102104
103105bridge_tensor_t torch_to_bridge (at::Tensor &tensor) {
104106 bridge_tensor_t result;
105107 result.created_by_c = true ;
108+ result.was_freed = false ;
109+
106110 result.dim = tensor.dim ();
107- result.sizes = new int32_t [result.dim ];
108- for (int i = 0 ; i < result.dim ; ++i) {
109- result.sizes [i] = tensor.size (i);
111+
112+ std::size_t sizes_bytes = sizeof (uint32_t ) * result.dim ;
113+ result.sizes = static_cast <uint32_t *>(malloc (sizes_bytes));
114+ for (uint32_t i = 0 ; i < result.dim ; ++i) {
115+ result.sizes [i] = static_cast <uint32_t >(tensor.size (i));
110116 }
111- result.data = new float32_t [bridge_tensor_elements (result)];
117+
118+ std::size_t data_bytes = sizeof (float32_t ) * tensor.numel ();
119+ result.data = static_cast <float32_t *>(malloc (data_bytes));
112120 store_tensor (tensor, result.data );
113121 return result;
114122}
115123
124+ extern " C" void free_bridge_tensor (bridge_tensor_t bt) {
125+ if (bt.created_by_c && !bt.was_freed ) {
126+ free (bt.sizes );
127+ free (bt.data );
128+ bt.was_freed = true ;
129+ }
130+ }
131+
132+
116133at::Tensor bridge_to_torch (bridge_tensor_t &bt) {
117134 std::vector<int64_t > sizes_vec (bt.sizes , bt.sizes + bt.dim );
118135 auto shape = torch::IntArrayRef (sizes_vec);
@@ -229,7 +246,7 @@ extern "C" bridge_pt_model_t load_model(const uint8_t* model_path) {
229246
230247
231248
232- bridge_tensor_t model_forward (bridge_pt_model_t model, bridge_tensor_t input, bool is_vgg_based_model ) {
249+ extern " C " bridge_tensor_t model_forward (bridge_pt_model_t model, bridge_tensor_t input) {
233250 auto tn_mps = bridge_to_torch (input,best_device,true ,best_dtype);
234251 // tn_mps = tn_mps.permute({2, 0, 1}).contiguous();
235252 // tn_mps.unsqueeze_(0);//.contiguous();
@@ -243,24 +260,12 @@ bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input, bo
243260 // auto tn_out = o.squeeze(0).permute({1, 2, 0}).contiguous();
244261 auto tn_out = o.squeeze (0 ).contiguous ().permute ({1 , 2 , 0 }).contiguous ();
245262
246- if (is_vgg_based_model) {
247- tn_out.div_ (255.0 );
248- }
249-
250263 auto tn_out_cpu = tn_out.to (torch::kCPU ,torch::kFloat32 ,false ,true );
251264
252265 return torch_to_bridge (tn_out_cpu);
253266
254267}
255268
256- extern " C" bridge_tensor_t model_forward (bridge_pt_model_t model, bridge_tensor_t input) {
257- return model_forward (model, input, false );
258- }
259-
260- extern " C" bridge_tensor_t model_forward_style_transfer (bridge_pt_model_t model, bridge_tensor_t input) {
261- return model_forward (model, input, true );
262- }
263-
264269// std::tuple<uint64_t, uint64_t> get_cpu_frame_size(uint64_t width, uint64_t height, float32_t scale_factor) {
265270// // if (best_device == torch::kMPS || best_device == torch::kCUDA)
266271// if (accelerator_available())
0 commit comments