85 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright 2023 The MediaPipe Authors.
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| ==============================================================================*/
 | |
| 
 | |
| #include "mediapipe/tasks/c/components/containers/embedding_result_converter.h"
 | |
| 
 | |
| #include <algorithm>
 | |
| #include <cstdint>
 | |
| #include <cstdlib>
 | |
| 
 | |
| #include "mediapipe/tasks/c/components/containers/embedding_result.h"
 | |
| #include "mediapipe/tasks/cc/components/containers/embedding_result.h"
 | |
| 
 | |
| namespace mediapipe::tasks::c::components::containers {
 | |
| 
 | |
| void CppConvertToEmbeddingResult(
 | |
|     const mediapipe::tasks::components::containers::EmbeddingResult& in,
 | |
|     EmbeddingResult* out) {
 | |
|   out->has_timestamp_ms = in.timestamp_ms.has_value();
 | |
|   out->timestamp_ms = out->has_timestamp_ms ? in.timestamp_ms.value() : 0;
 | |
| 
 | |
|   out->embeddings_count = in.embeddings.size();
 | |
|   out->embeddings =
 | |
|       out->embeddings_count ? new Embedding[out->embeddings_count] : nullptr;
 | |
| 
 | |
|   for (uint32_t i = 0; i < out->embeddings_count; ++i) {
 | |
|     auto embedding_in = in.embeddings[i];
 | |
|     auto& embedding_out = out->embeddings[i];
 | |
|     if (!embedding_in.float_embedding.empty()) {
 | |
|       // Handle float embeddings
 | |
|       embedding_out.values_count = embedding_in.float_embedding.size();
 | |
|       embedding_out.float_embedding = new float[embedding_out.values_count];
 | |
| 
 | |
|       std::copy(embedding_in.float_embedding.begin(),
 | |
|                 embedding_in.float_embedding.end(),
 | |
|                 embedding_out.float_embedding);
 | |
| 
 | |
|       embedding_out.quantized_embedding = nullptr;
 | |
|     } else if (!embedding_in.quantized_embedding.empty()) {
 | |
|       // Handle quantized embeddings
 | |
|       embedding_out.values_count = embedding_in.quantized_embedding.size();
 | |
|       embedding_out.quantized_embedding = new char[embedding_out.values_count];
 | |
| 
 | |
|       std::copy(embedding_in.quantized_embedding.begin(),
 | |
|                 embedding_in.quantized_embedding.end(),
 | |
|                 embedding_out.quantized_embedding);
 | |
| 
 | |
|       embedding_out.float_embedding = nullptr;
 | |
|     }
 | |
| 
 | |
|     embedding_out.head_index = embedding_in.head_index;
 | |
|     embedding_out.head_name = embedding_in.head_name.has_value()
 | |
|                                   ? strdup(embedding_in.head_name->c_str())
 | |
|                                   : nullptr;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void CppCloseEmbeddingResult(EmbeddingResult* in) {
 | |
|   for (uint32_t i = 0; i < in->embeddings_count; ++i) {
 | |
|     auto embedding_in = in->embeddings[i];
 | |
| 
 | |
|     delete[] embedding_in.float_embedding;
 | |
|     delete[] embedding_in.quantized_embedding;
 | |
|     embedding_in.float_embedding = nullptr;
 | |
|     embedding_in.quantized_embedding = nullptr;
 | |
| 
 | |
|     free(embedding_in.head_name);
 | |
|   }
 | |
|   delete[] in->embeddings;
 | |
|   in->embeddings = nullptr;
 | |
| }
 | |
| 
 | |
| }  // namespace mediapipe::tasks::c::components::containers
 |