v1.0.0-rc.36

This commit is contained in:
2025-05-05 19:32:22 +02:00
parent 759243d1bf
commit 040cf08386
333 changed files with 22724 additions and 15251 deletions

View File

@@ -100,6 +100,7 @@ ZeroCopyReturnValue *ImageBuffer::GetImageSlot() {
// Clear image number/size
v[i].image_number = INT64_MIN;
v[i].image_size = 0;
v[i].indexed = false;
++zeromq_in_process;
@@ -118,13 +119,14 @@ int64_t ImageBuffer::GetAvailSlots() const {
return slot_count - zeromq_in_process;
}
void ImageBuffer::ReleaseSlot(uint32_t location, int64_t image_number, size_t image_size) {
void ImageBuffer::ReleaseSlot(uint32_t location, int64_t image_number, size_t image_size, bool indexed) {
std::unique_lock ul(m);
zeromq_in_process--;
v[location].zeromq_processing = false;
v[location].image_number = image_number;
v[location].image_size = image_size;
v[location].indexed = indexed;
free_slots.push(location);
cv_zeromq_done.notify_all();
@@ -144,8 +146,10 @@ bool ImageBuffer::GetImage(std::vector<uint8_t> &out_v, int64_t image_number) {
std::optional<uint32_t> val;
if (image_number < 0)
if (image_number == MaxImage)
val = getHandleMaxImage();
else if (image_number == MaxIndexedImage)
val = getHandleMaxIndexedImage();
else
val = getHandle(image_number);
@@ -206,6 +210,19 @@ std::optional<uint32_t> ImageBuffer::getHandleMaxImage() const {
return ret;
}
std::optional<uint32_t> ImageBuffer::getHandleMaxIndexedImage() const {
int64_t max_image_number = INT64_MIN;
std::optional<uint32_t> ret;
for (int i = 0; i < slot_count; i++) {
// if this is never true, then optional will remain empty
if (!v[i].zeromq_processing && v[i].image_number > max_image_number && v[i].image_number >= 0 && v[i].indexed) {
max_image_number = v[i].image_number;
ret = i;
}
}
return ret;
}
uint8_t *ImageBuffer::GetBufferLocation(size_t id) {
if (slot_size == 0)
throw JFJochException(JFJochExceptionCategory::WrongNumber, "Buffer not initialized");
@@ -233,9 +250,22 @@ ImageBufferStatus ImageBuffer::GetStatus() const {
std::unique_lock ul(m);
ret.total_slots = slot_count;
ret.available_slots = slot_count - zeromq_in_process;
ret.min_image_number = INT64_MAX;
ret.max_image_number = 0;
for (int i = 0; i < slot_count; i++) {
if (v[i].image_number >= 0)
if (v[i].image_number >= 0) {
if (ret.max_image_number < v[i].image_number)
ret.max_image_number = v[i].image_number;
if (ret.min_image_number > v[i].image_number)
ret.min_image_number = v[i].image_number;
ret.images_in_the_buffer.push_back(v[i].image_number);
}
}
if (ret.images_in_the_buffer.empty()) {
ret.min_image_number = 0;
ret.max_image_number = 0;
}
}
std::sort(ret.images_in_the_buffer.begin(), ret.images_in_the_buffer.end());