13 #ifndef ML_PAGED_IMAGE_H
14 #define ML_PAGED_IMAGE_H
46 #include <unordered_map>
52 class PagedImageCurrentlyUsedMemoryTracker;
74 struct ExtendedPageEntry;
79 NO_THREAD_SUPPORT = 0,
82 USE_MODULE_THREAD_SUPPORT = -1
143 inline bool isValid()
const {
return _isValid; }
147 inline void setValid(
bool flag =
true) { _isValid=flag; }
513 void* progressCallbackUserData =
nullptr);
522 void* progressCallbackUserData =
nullptr);
560 MLEXPORT bool arePropertiesLocked()
const {
return _propertiesLocked; }
563 MLEXPORT bool setPropertiesLocked(
bool locked);
566 inline bool _checkPropertyWriteAccess(
const char* methodName) {
567 if (_propertiesLocked) {
568 _showInvalidPropertyWriteAccessError(methodName);
570 return !_propertiesLocked;
574 void _showInvalidPropertyWriteAccessError(
const char* methodName);
576 PagedImage(
const PagedImage&) =
delete;
577 PagedImage&
operator=(
const PagedImage&) =
delete;
592 void _allocatePageList();
596 void static deleteMemoryBlockCallback(
void* data,
size_t size,
void* userData);
601 static bool registerDeletionCallback(
const ExtendedPageEntry* entry);
606 static bool deregisterDeletionCallback(
const ExtendedPageEntry* entry);
608 static ExtendedPageEntry* deletePageEntryFromMapUnsafe(std::unordered_map<MLint, ExtendedPageEntry *> &pageEntryMap,
620 CalculateOutputImageHandler* _calculateOutputImageHandler;
625 void* _calculateOutputImagePropertiesUserData;
628 bool _isExternalCalculateOutputImageHandler;
647 std::vector<PageEntry> _pageList;
650 std::unordered_map<MLint, ExtendedPageEntry*> _pageEntryMap;
653 mutable Mutex _pageAccessMutex;
656 bool _pageHandlesAreStoredInList;
669 bool _updateOfImagePropertiesNeeded;
677 bool _propertiesLocked;
681 bool _clampPagesToImageExtent;
685 MemoryImage _memoryImg;
688 std::string _stateInfoString;
697 std::vector<InputSubImageProperties> _inSubImageProps;
700 ThreadSupport _threadSupport;
704 mutable PagedImageCurrentlyUsedMemoryTracker* _currentlyUsedPageMemoryTracker;
714 static MLuint32 _pageCountLimitToUsePageEntryMap;
718 static const char*
const _pageAllocationMemoryProfileKey;
719 static const char*
const _pageCacheHitsCountProfileKey;
720 static const char*
const _pageCacheMissesCountProfileKey;
The strong handle of a MLMemoryBlock.
The weak handle of a MLMemoryBlock.
Base class for the calculation of pages of an output image (PagedImage) of a Module.
The Host is the central image processing class in the ML.
MLEXPORT void setImageExtent(const ImageVector &extent)
Sets the extent of the (sub)image.
This class encapsulates basic medical image properties:
MedicalImageProperties & operator=(const MedicalImageProperties &medicalImageProperties)
Assignment operator from an existing edicalImageProperties object to get a copy.
A memory cache for the complete output image of an output connector.
Base class for an image processing module of the ML.
The class PagedImage, representing a fragmented image that manages properties and data of an image lo...
MLint getInPlaceIndex() const
Returns optimization flag: returns the index of the input image whose input tile is used also as outp...
MLEXPORT void setInputSubImageDataType(int inputIndex, MLDataType dataType)
Sets the dataType for the given inputIndex.
MLEXPORT PagedImage(Module *module=nullptr, MLint outputIndex=-1)
Constructor.
MLEXPORT void setMaxVoxelValue(MLdouble maxval)
Sets the assumed maximum value to maxval. Overridden to perform access check.
MLEXPORT void clearPendingPageRequest(MLint pageID)
Clears a pending page request for the given page ID.
virtual MLEXPORT void setStateInfo(const std::string &info, MLErrorCode errorCode)
Sets the state information for this PagedImage to the string info and the MLErrorCode errorCode.
MLEXPORT MLErrorCode getTile(SubImageBox location, MLDataType dataType, void **data, const ScaleShiftData &scaleShiftData=ScaleShiftData(), MLRequestProgressCB *progressCallback=nullptr, void *progressCallbackUserData=nullptr)
See Host::getTile( module, outputIndex, location, dataType, data, scaleShiftData).
MLEXPORT void clearPageList()
Removes all pages of the page image and from the ML cache, and all page data chunks are freed if not ...
const MemoryImage & getMemoryImage() const
bool isValid() const
Returns whether image properties are valid and up-to-date.
MLEXPORT MLdouble getInterpolatedValue(const Vector3 &pos, MLint c=0, MLint t=0, MLint u=0, MLdouble outsideFillValue=0)
Returns the trilinearly interpolated image value at a given voxel position pos (center of a voxel is ...
MLEXPORT SubImageBox getPageBox(MLint pageID) const
Returns the rectangular region in the entire image covered by the page with ID pageID.
ImageVector getPageExtent() const
Returns the extent of a page.
MLEXPORT MLMemoryBlockHandle getPage(MLint pageID) const
Returns the pointer to the CachedBuffer containing the data of the page with the ID pageID.
void setInvalid()
Sets image properties invalid, i.e., isValid() returns false afterwards.
MLEXPORT void setPageExtent(const ImageVector &pageExtent)
Sets the extents of the pages to pageExtent.
MLEXPORT void setMinVoxelValue(MLdouble minval)
Sets the assumed minimum value to minval. Overridden to perform access check.
MLEXPORT MLDataType getInputSubImageDataType(int inputIndex) const
Returns the input subimage data type for the input image at inputIndex.
MLEXPORT ThreadSupport getThreadSupport() const
Returns the current thread support of the paged image.
virtual MLEXPORT void setStateInfoErrorCode(MLErrorCode errorCode)
Sets the state information as MLErrorCode errorCode for this instance.
MLEXPORT void setCalculateOutputImagePropertiesCB(CalculateOutputImagePropertiesCB *callback, void *userData)
Sets the callback and userdata for the calculation of the properties of this PagedImage if they need ...
void setValid(bool flag=true)
Sets image properties to valid/up-to-date, i.e., isValid() returns true afterwards.
MLEXPORT void setUpdateOfImagePropertiesNeeded(bool flag)
Sets whether the update of the image properties is needed, as the ML graph has changed since the last...
MLEXPORT PagedImage & getBypassSourceImage()
Returns the reference to the source image of a bypass chain.
MLEXPORT void setExternalCalculateOutputImageHandler(CalculateOutputImageHandler *handler)
Sets the pointer to the output image calculation interface handler, the ownership is NOT passed to th...
MLEXPORT MLMetaProfilePtr & getMetaProfile() const
Returns the MLMetaProfile for this paged image. Creates it if necessary.
ImageVector getPageStride() const
Returns the stride to get from one page to another.
MLEXPORT void removePage(MLint pageID)
This method removes a page with ID pageID from this instance.
virtual MLEXPORT const std::string & getStateInfoString() const
Returns the current state information string, which might explain the state of this instance.
static MLEXPORT void setPageCountLimitToUsePageEntryMap(MLuint32 limit)
Sets the limit of number of pages for using the page entry map instead of the page list.
MLuint32 getID()
Returns the current image ID that changes whenever the image changes and that is unique accross all i...
MLEXPORT void copyPages(const std::vector< MLint > &pageIDs, SubImage *subImage, const ScaleShiftData &scaleShiftData=ScaleShiftData()) const
Fills the subImage with contents of the Pages with the IDs pagesIDs The gray values are transformed l...
MLint getOutputIndex() const
Returns associated output index of Module instance if passed to constructor, -1 otherwise.
MLint getPageID(const ImageVector &voxelPosition) const
Returns the ID of that page that contains the image voxel position voxelPosition.
MLEXPORT void setInputSubImageIsReadOnly(int inputIndex, bool readOnly)
Sets the input subimage for the input image at inputIndex to readOnly.
MLEXPORT void setInputSubImageUseMemoryImage(int inputIndex, bool useMemoryImage)
Sets that the input subimage for the input image at inputIndex should use a memory image (this implic...
MLEXPORT void setInputSubImageScaleShift(int inputIndex, const ScaleShiftData &scaleShift)
Sets that the input subimage for the input image at inputIndex should be rescaled with the given scal...
MLEXPORT const InputSubImageProperties & getInputSubImageProperties(int inputIndex) const
Returns a const reference to the InputSubImageProperties of the given input image at inputIndex.
MLEXPORT void setThreadSupport(ThreadSupport support)
Sets the thread support of the paged image to the given value.
bool getClampPagesToImageExtent() const
See setClampPagesToImageExtent().
ML_FRIEND_TEST(PagedImageDeprecationTest, NewAPI)
MLEXPORT void setPage(MLint pageID, const MLMemoryBlockHandle &page)
Sets the given page handle as pagedata at pageID.
MLEXPORT bool updateOfImagePropertiesNeeded() const
Returns whether the update of the image properties is needed, as the ML graph has changed since the l...
void setBypassIndex(MLint index)
Sets the index of the input image whose pages should be used instead of the pages of this image.
virtual MLEXPORT void setImageProperties(const PagedImage &imageProperties)
Function to copy all associated characteristics from imageProperties.
MLint getBypassIndex() const
Returns the index of the input image whose pages should be used instead of the pages of this image or...
MLEXPORT ~PagedImage() override
Destructor.
ImageVector getPageSetExtent() const
Returns the extents of the page set covering the entire image extents.
void setImageExtent(MLint x, MLint y, MLint z=1, MLint c=1, MLint t=1, MLint u=1)
Sets the extents of the image to the extent (x,y,z,c,t,u) and clears the list of valid pages and its ...
static MLEXPORT void getPageIDs(std::vector< MLint > &pageIDs, const SubImageBox &subImageBox, const ImageVector &imageExtent, const ImageVector &pageExtent)
Clears pageIDs and inserts the IDs of all pages that need to be calculated to cover subImageBox compl...
void updateID()
Sets that the image has changed.
MLEXPORT bool getInputSubImageIsReadOnly(int inputIndex) const
Returns whether the input subimage at inputIndex is set to 'read-only'.
MLEXPORT void deletePageEntryFromDeletionCallback(ExtendedPageEntry *entry)
This method removes a page referenced by the page entry.
MemoryImage & getMemoryImage()
Allows access to a memory-cached output of the paged image.
bool hasExternalCalculateOutputImageHandler() const
Returns whether the CalculateOutputImageHandler is an external handler and should not be overwritten.
Module * getModule() const
Returns the associated Module instance if passed to the constructor, NULL otherwise.
MLEXPORT void setCalculateOutputImageHandler(CalculateOutputImageHandler *handler)
Sets the pointer to the output image calculation interface handler; the ownership is passed to the Pa...
ThreadSupport
Defines the multithreading support of the paged image.
MLEXPORT MLErrorCode getTile(SubImage &subImage, const ScaleShiftData &scaleShiftData=ScaleShiftData(), MLRequestProgressCB *progressCallback=nullptr, void *progressCallbackUserData=nullptr)
See Host::getTile( module, outputIndex, subImg, scaleShiftData).
static MLEXPORT MLuint32 getPageCountLimitToUsePageEntryMap()
Returns the limit of number of pages for using the page entry map instead of the page list.
ML_FRIEND_TEST(PagedImageDeprecationTest, DeprecatedAPI)
MLEXPORT void getPageIDs(std::vector< MLint > &pageIDs, const SubImageBox &subImageBox) const
Clears pageIDs and inserts the IDs of all pages that need to be calculated to cover subImageBox compl...
CalculateOutputImageHandler * getCalculateOutputImageHandler() const
Returns the pointer to the output image calculation interface.
MLEXPORT MLMemoryBlockHandle getPageOrCreatePageRequestOrAddToPendingRequest(MLint &pageID, TileRequest *tileRequest, PageRequest **newPageRequest)
Returns the valid page handle if it exists.
void setClampPagesToImageExtent(bool flag=true)
If enabled, the pages are clamped to the image extent, ensuring that pages on the border do not exten...
MLEXPORT MLint getNumPages() const
Returns the total number of pages in this output image, regardless of whether they are allocated.
void setPageExtent(MLint x, MLint y, MLint z=1, MLint c=1, MLint t=1, MLint u=1)
Sets the extents of the pages to the extent (x,y,z,c,t,u).
MLEXPORT void calculateImageProperties()
Updates the image properties via the Module::calculateOutputImageProperties or via CalculateOutputIma...
ML_FRIEND_TEST(TypedHandlersTest, SetupAndVerifyProperties)
virtual MLEXPORT MLErrorCode getStateInfoErrorCode() const
Returns the current state information as MLError code, which might explain the state of this instance...
MLEXPORT MLErrorCode updateImageProperties()
Updates the image properties of the PagedImage using the Host::updateImageProperties method.
void setInPlaceIndex(MLint inputIndex)
Sets optimization flag: when calculating a page in calculateOutputSubImage(), the output image page s...
MLEXPORT void initializeInputSubImageProperties(MLint numInputs)
Initializes the InSubImageProps for a given number of inputs; should only be called by the Host!
MLEXPORT void setDataType(MLDataType dataType) override
Sets the type of data to dataType. Overridden to perform access check.
MLEXPORT void clearPageListAndMemoryImage()
Removes all pages of the page image and from the ML cache, and all page data chunks are freed.
MLEXPORT void freeTile(void *data)
Same as corresponding Host::freeTile(void *data).
MLEXPORT const PagedImage * getInputImage(int inputIndex) const
Returns the input image at inputIndex of the associated Module.
MLEXPORT std::size_t getCachedPagesSizeInBytes() const
Returns the currently used cache size for pages in bytes.
MLEXPORT void validateInputSubImagePropertiesAfterCalculateOutputImageProperties()
Validates the properties and sets the data type where it was not set; should only be called by the Ho...
void setImageExtent(const SubImageBox &box)
Sets the extents of the image to box.getExtent() and updates all PagedImage settings.
virtual MLEXPORT void setImageExtent(const ImageVector &extent)
Sets the extents of the image to extent. The list of valid pages and its content are cleared.
MLEXPORT void setInputSubImagesAreReadOnly(bool readOnly=true)
Sets the read-only flag for all input images.
This class manages/represents a rectangular 6D image region that is organized linearly in memory.
VectorType getExtent() const
Returns the extents of the subimage region.
A TileRequest either represents the input subimage that is needed by a PageRequest or if it is a root...
MLint32 MLDataType
MLDataType.
MLint32 MLErrorCode
Type of an ML Error code.
boost::mutex Mutex
Defines a non-recursive mutex.
MLEXPORT std::ostream & operator<<(std::ostream &s, const ml::Field &v)
Overloads the operator '<<' for stream output of Field objects.
#define MLEXPORT
To export symbols from a DLL/shared object, we need to mark them with the MLEXPORT symbol.
void MLRequestProgressCB(void *usrData, double progress)
MLint64 MLint
A signed ML integer type with at least 64 bits used for index calculations on very large images even ...
void CalculateOutputImagePropertiesCB(void *userData, PagedImage *outImage)
Callback for the calculation of the output image properties for outputImage.
TScaleShiftData< MLdouble > ScaleShiftData
Double version of TScaleShiftData for maximum reasonable precision.
TImageVector< MLint > ImageVector
Defines the standard ImageVector type that is used by the ML for indexing and coordinates.