Skip to content
Open
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
27e4c8c
initial data buffer commit
henrypinkard Jan 31, 2025
f886b12
Factored out circularBuffer behind new API
henrypinkard Feb 1, 2025
ebbc1bd
finished concurrency for buffer slots
henrypinkard Feb 1, 2025
94125ee
most functionality in v2 buffer implemented
henrypinkard Feb 4, 2025
8efc90d
added metadata to buffer
henrypinkard Feb 5, 2025
0fd0823
fix compiler warnings
henrypinkard Feb 5, 2025
06fe9ae
cleanup
henrypinkard Feb 6, 2025
e468f0f
cleanup
henrypinkard Feb 6, 2025
93860a9
remove comment
henrypinkard Feb 6, 2025
b0aa28e
Merge branch 'data_buffer_new' of https://github.com/henrypinkard/mmC…
henrypinkard Feb 6, 2025
d87cc2e
modify SWIG to read image size dynamically for each image
henrypinkard Feb 7, 2025
c7883ee
fixed bugs, implementation seems to work just like circularbuffer
henrypinkard Feb 11, 2025
c29e114
add parallel copying and memory mapping
henrypinkard Feb 13, 2025
b7a02a0
switch to simpler mutexs
henrypinkard Feb 13, 2025
093fb1d
fix docs and clean up
henrypinkard Feb 13, 2025
f37b964
clean up and remove headers from buffer
henrypinkard Feb 13, 2025
8564b15
restored delted functions, refactor, and recycle buffer slots
henrypinkard Feb 13, 2025
9887ae9
lots of bug fixes and refactoring
henrypinkard Feb 13, 2025
23e1cc4
small perf improvements and bug fixes
henrypinkard Feb 14, 2025
37ab2cb
expose direct getting of pointers from corecallback for writing into …
henrypinkard Feb 14, 2025
8697a85
fix bug
henrypinkard Feb 14, 2025
6aae6b6
fix bug getting image without metadta and standardize internal pointe…
henrypinkard Feb 15, 2025
0f1b645
fix bit depth fn, which is not stored in v2 buffer, and map image poi…
henrypinkard Feb 15, 2025
567cb2b
remove unused typemap
henrypinkard Feb 15, 2025
a5a69b7
add ability to manipulate data pointers inside v2 buffer. Also make s…
henrypinkard Feb 15, 2025
1408c8e
fix bugs with snap. pointer-based taggedimages WIP
henrypinkard Feb 16, 2025
2847d1c
Refactor to Metadata to only maintain essential metadata in buffer
henrypinkard Feb 16, 2025
893642f
refactor and simplify to make safer pointer handling and less SWIG co…
henrypinkard Feb 17, 2025
6b2fd6d
Working bufferdatapointer class and snapimage
henrypinkard Feb 18, 2025
785e995
major refactor to make v2 buffer and buffer manager data type agnosti…
henrypinkard Feb 19, 2025
475e9c3
fix mmcorej compilation bugs
henrypinkard Feb 19, 2025
cd947e3
Many big fixes and got pointer-based image handling working
henrypinkard Feb 22, 2025
ca88de6
remove unused method
henrypinkard Feb 22, 2025
02cb17e
add method for getting raw pointer address
henrypinkard Feb 22, 2025
6a3e8d9
remove CMMError signature from internal buffermanager functions
henrypinkard Feb 28, 2025
3814ea9
remove errant bracket
henrypinkard Feb 28, 2025
bc1a9f1
fine-grained handling metadata categories and correct default behavior
henrypinkard Feb 28, 2025
6cc217e
fix metadata keyword
henrypinkard Feb 28, 2025
b15d252
fix bugs and rename from v2 to newdatabuffer
henrypinkard Feb 28, 2025
a9f20fa
allow retrieval of generic non image data
henrypinkard Feb 28, 2025
8a798e2
comment out acquirewriteslot mechanism for now
henrypinkard Feb 28, 2025
bc3ea3b
add commented out functions to MMCore interface
henrypinkard Feb 28, 2025
f5dec94
change to metadata bitmask
henrypinkard Mar 4, 2025
b2a3b69
clarified API for force reseting vs clearing and added safety checks
henrypinkard Mar 4, 2025
484ca34
add method for adding generic dat
henrypinkard Mar 4, 2025
8cd1e38
add autoclosable
henrypinkard Mar 4, 2025
e877874
clarify deprecations
henrypinkard Mar 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions MMCore/BufferDataPointer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
///////////////////////////////////////////////////////////////////////////////
// FILE: DataPointer.h
// PROJECT: Micro-Manager
// SUBSYSTEM: MMCore
//-----------------------------------------------------------------------------
// DESCRIPTION: A read-only wrapper class for accessing image data and metadata
// from a buffer slot. Provides safe access to image data by
// automatically releasing read access when the object is destroyed.
// Includes methods for retrieving pixel data and associated
// metadata..
//
// COPYRIGHT: Henry Pinkard, 2025
//
// LICENSE: This file is distributed under the "Lesser GPL" (LGPL) license.
// License text is included with the source distribution.
//
// This file is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES.
//
// AUTHOR: Henry Pinkard, 2/16/2025
///////////////////////////////////////////////////////////////////////////////

#pragma once

#include "MMCore.h"
#include "../MMDevice/ImageMetadata.h"
#include <mutex>
#include <random>

// This is needed for SWIG Java wrapping to differentiate its void*
// from the void* that MMCore uses for returning data
typedef const void* BufferDataPointerVoidStar;

/// A read-only wrapper for accessing image data and metadata from a buffer slot.
/// Automatically releases the read access when destroyed.
class BufferDataPointer {

public:

BufferDataPointer(BufferManager* bufferManager, DataPtr ptr)
: bufferManager_(bufferManager), ptr_(ptr), mutex_()
{
// check for null pointer
if (!ptr_) {
throw CMMError("Pointer is null");
}
// check for v2 buffer use
if (!bufferManager_->IsUsingV2Buffer()) {
throw CMMError("V2 buffer must be enabled for BufferDataPointer");
}
// throw an error if the pointer is not in the buffer
if (!bufferManager_->IsPointerInV2Buffer(ptr_)) {
throw CMMError("Pointer is not in the buffer");
}
}

// Returns a pointer to the pixel data (read-only)
BufferDataPointerVoidStar getData() const {
if (!ptr_) {
return nullptr;
}
return ptr_;
}

// Same as the above method, but this get wrapped by SWIG differently
// to return the actual
DataPtr getDataPointer() const {
if (!ptr_) {
return nullptr;
}
return ptr_;
}

void getImageProperties(int& width, int& height, int& byteDepth, int& nComponents) throw (CMMError) {
if (!bufferManager_ || !ptr_) {
throw CMMError("Invalid buffer manager or pointer");
}
Metadata md;
bufferManager_->ExtractMetadata(ptr_, md);
CMMCore::parseImageMetadata(md, width, height, byteDepth, nComponents);
}

// Fills the provided Metadata object with metadata extracted from the pointer.
// It encapsulates calling the core API function that copies metadata from the buffer.
void getMetadata(Metadata &md) const {
if (bufferManager_ && ptr_) {
bufferManager_->ExtractMetadata(ptr_, md);
}
}

// Destructor: releases the read access to the pointer if not already released
~BufferDataPointer() {
release();
}


// Explicitly release the pointer before destruction if needed
void release() {
std::lock_guard<std::mutex> lock(mutex_);
if (bufferManager_ && ptr_) {

int ret = bufferManager_->ReleaseReadAccess(ptr_);
if (ret != DEVICE_OK) {
throw CMMError("Failed to release read access to buffer");
}
ptr_ = nullptr; // Mark as released

}
}

unsigned getSizeBytes() const {
if (bufferManager_ && ptr_) {
return bufferManager_->GetDataSize(ptr_);
}
return 0;
}

private:
// Disable copy semantics to avoid double releasing the pointer
BufferDataPointer(const BufferDataPointer&);
BufferDataPointer& operator=(const BufferDataPointer&);

BufferManager* bufferManager_;
const void* ptr_;
mutable std::mutex mutex_;
};
Loading