v1.0.0-rc.36
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user