123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
- /*
- * This file contains public declarations for the H5Z (data filter) developer
- * support routines.
- */
- #ifndef _H5Zdevelop_H
- #define _H5Zdevelop_H
- /* Include package's public header */
- #include "H5Zpublic.h"
- /*****************/
- /* Public Macros */
- /*****************/
- /**
- * Current version of the H5Z_class_t struct
- */
- #define H5Z_CLASS_T_VERS (1)
- /*******************/
- /* Public Typedefs */
- /*******************/
- /**
- * Structure for filter callback property
- */
- typedef struct H5Z_cb_t {
- H5Z_filter_func_t func;
- void * op_data;
- } H5Z_cb_t;
- /**
- * \brief This callback determines if a filter can be applied to the dataset
- * with the characteristics provided
- *
- * \dcpl_id
- * \type_id
- * \space_id
- *
- * \return \htri_t
- *
- * \details Before a dataset gets created, the \ref H5Z_can_apply_func_t
- * callbacks for any filters used in the dataset creation property list
- * are called with the dataset's dataset creation property list, the
- * dataset's datatype and a dataspace describing a chunk (for chunked
- * dataset storage).
- *
- * The \ref H5Z_can_apply_func_t callback must determine if the
- * combination of the dataset creation property list setting, the
- * datatype and the dataspace represent a valid combination to apply
- * this filter to. For example, some cases of invalid combinations may
- * involve the filter not operating correctly on certain datatypes (or
- * certain datatype sizes), or certain sizes of the chunk dataspace.
- *
- * The \ref H5Z_can_apply_func_t callback can be the NULL pointer, in
- * which case, the library will assume that it can apply to any
- * combination of dataset creation property list values, datatypes and
- * dataspaces.
- *
- * The \ref H5Z_can_apply_func_t callback returns positive a valid
- * combination, zero for an invalid combination and negative for an
- * error.
- */
- //! <!-- [H5Z_can_apply_func_t_snip] -->
- typedef htri_t (*H5Z_can_apply_func_t)(hid_t dcpl_id, hid_t type_id, hid_t space_id);
- //! <!-- [H5Z_can_apply_func_t_snip] -->
- /**
- * \brief The filter operation callback function, defining a filter's operation
- * on data
- *
- * \dcpl_id
- * \type_id
- * \space_id
- *
- * \return \herr_t
- *
- * \details After the \ref H5Z_can_apply_func_t callbacks are checked for new
- * datasets, the \ref H5Z_set_local_func_t callbacks for any filters
- * used in the dataset creation property list are called. These
- * callbacks receive the dataset's private copy of the dataset creation
- * property list passed in to H5Dcreate() (i.e. not the actual property
- * list passed in to H5Dcreate()) and the datatype ID passed in to
- * H5Dcreate() (which is not copied and should not be modified) and a
- * dataspace describing the chunk (for chunked dataset storage) (which
- * should also not be modified).
- *
- * The \ref H5Z_set_local_func_t callback must set any parameters that
- * are specific to this dataset, based on the combination of the
- * dataset creation property list values, the datatype and the
- * dataspace. For example, some filters perform different actions based
- * on different datatypes (or datatype sizes) or different number of
- * dimensions or dataspace sizes.
- *
- * The \ref H5Z_set_local_func_t callback can be the NULL pointer, in
- * which case, the library will assume that there are no
- * dataset-specific settings for this filter.
- *
- * The \ref H5Z_set_local_func_t callback must return non-negative on
- * success and negative for an error.
- */
- //! <!-- [H5Z_set_local_func_t_snip] -->
- typedef herr_t (*H5Z_set_local_func_t)(hid_t dcpl_id, hid_t type_id, hid_t space_id);
- //! <!-- [H5Z_set_local_func_t_snip] -->
- /**
- * \brief The filter operation callback function, defining a filter's operation
- * on data
- *
- * \param[in] flags Bit vector specifying certain general properties of the filter
- * \param[in] cd_nelmts Number of elements in \p cd_values
- * \param[in] cd_values Auxiliary data for the filter
- * \param[in] nbytes The number of valid bytes in \p buf to be filtered
- * \param[in,out] buf_size The size of \p buf
- * \param[in,out] buf The filter buffer
- *
- * \return Returns the number of valid bytes of data contained in \p buf. In the
- * case of failure, the return value is 0 (zero) and all pointer
- * arguments are left unchanged.
- *
- * \details A filter gets definition flags and invocation flags (defined
- * above), the client data array and size defined when the filter was
- * added to the pipeline, the size in bytes of the data on which to
- * operate, and pointers to a buffer and its allocated size.
- *
- * The filter should store the result in the supplied buffer if
- * possible, otherwise it can allocate a new buffer, freeing the
- * original. The allocated size of the new buffer should be returned
- * through the \p buf_size pointer and the new buffer through the \p
- * buf pointer.
- *
- * The return value from the filter is the number of bytes in the
- * output buffer. If an error occurs then the function should return
- * zero and leave all pointer arguments unchanged.
- */
- //! <!-- [H5Z_func_t_snip] -->
- typedef size_t (*H5Z_func_t)(unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[],
- size_t nbytes, size_t *buf_size, void **buf);
- //! <!-- [H5Z_func_t_snip] -->
- /**
- * The filter table maps filter identification numbers to structs that
- * contain a pointers to the filter function and timing statistics.
- */
- //! <!-- [H5Z_class2_t_snip] -->
- typedef struct H5Z_class2_t {
- int version; /**< Version number of the H5Z_class_t struct */
- H5Z_filter_t id; /**< Filter ID number */
- unsigned encoder_present; /**< Does this filter have an encoder? */
- unsigned decoder_present; /**< Does this filter have a decoder? */
- const char * name; /**< Comment for debugging */
- H5Z_can_apply_func_t can_apply; /**< The "can apply" callback for a filter */
- H5Z_set_local_func_t set_local; /**< The "set local" callback for a filter */
- H5Z_func_t filter; /**< The actual filter function */
- } H5Z_class2_t;
- //! <!-- [H5Z_class2_t_snip] -->
- /********************/
- /* Public Variables */
- /********************/
- /*********************/
- /* Public Prototypes */
- /*********************/
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * \ingroup H5Z
- *
- * \brief Registers a new filter with the HDF5 library
- *
- * \param[in] cls A pointer to a buffer for the struct containing the
- * filter-definition
- *
- * \return \herr_t
- *
- * \details H5Zregister() registers a new filter with the HDF5 library.
- *
- * \details Making a new filter available to an application is a two-step
- * process. The first step is to write the three filter callback
- * functions described below: \c can_apply, \c set_local, and \c
- * filter. This call to H5Zregister(), registering the filter with the
- * library, is the second step. The can_apply and set_local fields can
- * be set to NULL if they are not required for the filter being
- * registered.
- *
- * H5Zregister() accepts a single parameter, a pointer to a buffer for
- * the \p cls data structure. That data structure must conform to one
- * of the following definitions:
- * \snippet this H5Z_class1_t_snip
- * or
- * \snippet this H5Z_class2_t_snip
- *
- * \c version is a library-defined value reporting the version number
- * of the #H5Z_class_t struct. This currently must be set to
- * #H5Z_CLASS_T_VERS.
- *
- * \c id is the identifier for the new filter. This is a user-defined
- * value between #H5Z_FILTER_RESERVED and #H5Z_FILTER_MAX. These
- * values are defined in the HDF5 source file H5Zpublic.h, but the
- * symbols #H5Z_FILTER_RESERVED and #H5Z_FILTER_MAX should always be
- * used instead of the literal values.
- *
- * \c encoder_present is a library-defined value indicating whether
- * the filter’s encoding capability is available to the application.
- *
- * \c decoder_present is a library-defined value indicating whether
- * the filter’s encoding capability is available to the application.
- *
- * \c name is a descriptive comment used for debugging, may contain a
- * descriptive name for the filter, and may be the null pointer.
- *
- * \c can_apply, described in detail below, is a user-defined callback
- * function which determines whether the combination of the dataset
- * creation property list values, the datatype, and the dataspace
- * represent a valid combination to apply this filter to.
- *
- * \c set_local, described in detail below, is a user-defined callback
- * function which sets any parameters that are specific to this
- * dataset, based on the combination of the dataset creation property
- * list values, the datatype, and the dataspace.
- *
- * \c filter, described in detail below, is a user-defined callback
- * function which performs the action of the filter.
- *
- * The statistics associated with a filter are not reset by this
- * function; they accumulate over the life of the library.
- *
- * #H5Z_class_t is a macro which maps to either H5Z_class1_t or
- * H5Z_class2_t, depending on the needs of the application. To affect
- * only this macro, H5Z_class_t_vers may be defined to either 1 or 2.
- * Otherwise, it will behave in the same manner as other API
- * compatibility macros. See API Compatibility Macros in HDF5 for more
- * information. H5Z_class1_t matches the #H5Z_class_t structure that is
- * used in the 1.6.x versions of the HDF5 library.
- *
- * H5Zregister() will automatically detect which structure type has
- * been passed in, regardless of the mapping of the #H5Z_class_t macro.
- * However, the application must make sure that the fields are filled
- * in according to the correct structure definition if the macro is
- * used to declare the structure.
- *
- * \Bold{The callback functions:}\n Before H5Zregister() can link a
- * filter into an application, three callback functions must be
- * defined as described in the HDF5 library header file H5Zpublic.h.
- *
- * When a filter is applied to the fractal heap for a group (e.g.,
- * when compressing group metadata) and if the can apply and set local
- * callback functions have been defined for that filter, HDF5 passes
- * the value -1 for all parameters for those callback functions. This
- * is done to ensure that the filter will not be applied to groups if
- * it relies on these parameters, as they are not applicable to group
- * fractal heaps; to operate on group fractal heaps, a filter must be
- * capable of operating on an opaque block of binary data.
- *
- * The \Emph{can apply} callback function must return a positive value
- * for a valid combination, zero for an invalid combination, and a
- * negative value for an error.
- * \snippet this H5Z_can_apply_func_t_snip
- *
- * Before a dataset is created, the \Emph{can apply} callbacks for any
- * filters used in the dataset creation property list are called with
- * the dataset's dataset creation property list, \c dcpl_id, the
- * dataset's datatype, \p type_id, and a dataspace describing a chunk,
- * \p space_id, (for chunked dataset storage).
- *
- * This callback must determine whether the combination of the dataset
- * creation property list settings, the datatype, and the dataspace
- * represent a valid combination to which to apply this filter. For
- * example, an invalid combination may involve the filter not
- * operating correctly on certain datatypes, on certain datatype
- * sizes, or on certain sizes of the chunk dataspace. If this filter
- * is enabled through H5Pset_filter() as optional and the can apply
- * function returns 0, the library will skip the filter in the filter
- * pipeline.
- *
- * This callback can be the NULL pointer, in which case the library
- * will assume that the filter can be applied to a dataset with any
- * combination of dataset creation property list values, datatypes,
- * and dataspaces.
- *
- * The \Emph{set local} callback function is defined as follows:
- * \snippet this H5Z_set_local_func_t_snip
- *
- * After the can apply callbacks are checked for a new dataset, the
- * \Emph{set local} callback functions for any filters used in the
- * dataset creation property list are called. These callbacks receive
- * \c dcpl_id, the dataset's private copy of the dataset creation
- * property list passed in to H5Dcreate() (i.e. not the actual
- * property list passed in to H5Dcreate()); \c type_id, the datatype
- * identifier passed in to H5Dcreate(), which is not copied and should
- * not be modified; and \c space_id, a dataspace describing the chunk
- * (for chunked dataset storage), which should also not be modified.
- *
- * The set local callback must set any filter parameters that are
- * specific to this dataset, based on the combination of the dataset
- * creation property list values, the datatype, and the dataspace. For
- * example, some filters perform different actions based on different
- * datatypes, datatype sizes, numbers of dimensions, or dataspace
- * sizes.
- *
- * The \Emph{set local} callback may be the NULL pointer, in which
- * case, the library will assume that there are no dataset-specific
- * settings for this filter.
- *
- * The \Emph{set local} callback function must return a non-negative
- * value on success and a negative value for an error.
- *
- * The \Emph{filter operation} callback function, defining the
- * filter's operation on the data, is defined as follows:
- * \snippet this H5Z_func_t_snip
- *
- * The parameters \c flags, \c cd_nelmts, and \c cd_values are the
- * same as for the function H5Pset_filter(). The one exception is that
- * an additional flag, #H5Z_FLAG_REVERSE, is set when the filter is
- * called as part of the input pipeline.
- *
- * The parameter \c buf points to the input buffer which has a size of
- * \c buf_size bytes, \c nbytes of which are valid data.
- *
- * The filter should perform the transformation in place if possible.
- * If the transformation cannot be done in place, then the filter
- * should allocate a new buffer with malloc() and assign it to \c buf,
- * assigning the allocated size of that buffer to \c buf_size. The old
- * buffer should be freed by calling free().
- *
- * If successful, the \Emph{filter operation} callback function
- * returns the number of valid bytes of data contained in \c buf. In
- * the case of failure, the return value is 0 (zero) and all pointer
- * arguments are left unchanged.
- *
- * \version 1.8.6 Return type for the \Emph{can apply} callback function,
- * \ref H5Z_can_apply_func_t, changed to \ref htri_t.
- * \version 1.8.5 Semantics of the \Emph{can apply} and \Emph{set local}
- * callback functions changed to accommodate the use of filters
- * with group fractal heaps.
- * \version 1.8.3 #H5Z_class_t renamed to H5Z_class2_t, H5Z_class1_t structure
- * introduced for backwards compatibility with release 1.6.x,
- * and #H5Z_class_t macro introduced in this release. Function
- * modified to accept either structure type.
- * \version 1.8.0 The fields \c version, \c encoder_present, and
- * \c decoder_present were added to the #H5Z_class_t \c struct
- * in this release.
- * \version 1.6.0 This function was substantially revised in Release 1.6.0 with
- * a new #H5Z_class_t struct and new set local and can apply
- * callback functions.
- *
- */
- H5_DLL herr_t H5Zregister(const void *cls);
- /**
- * \ingroup H5Z
- *
- * \brief Unregisters a filter.
- *
- * \param[in] id Identifier of the filter to be unregistered.
- * \return \herr_t
- *
- * \details H5Zunregister() unregisters the filter specified in \p id.
- *
- * \details This function first iterates through all opened datasets and
- * groups. If an open object that uses this filter is found, the
- * function will fail with a message indicating that an object using
- * the filter is still open. All open files are then flushed to make
- * sure that all cached data that may use this filter are written out.
- *
- * If the application is a parallel program, all processes that
- * participate in collective data write should call this function to
- * ensure that all data is flushed.
- *
- * After a call to H5Zunregister(), the filter specified in filter
- * will no longer be available to the application.
- *
- * \version 1.8.12 Function modified to check for open objects using the
- * filter.
- * \since 1.6.0
- */
- H5_DLL herr_t H5Zunregister(H5Z_filter_t id);
- #ifdef __cplusplus
- }
- #endif
- /* Symbols defined for compatibility with previous versions of the HDF5 API.
- *
- * Use of these symbols is deprecated.
- */
- #ifndef H5_NO_DEPRECATED_SYMBOLS
- /**
- * The filter table maps filter identification numbers to structs that
- * contain a pointers to the filter function and timing statistics.
- */
- //! <!-- [H5Z_class1_t_snip] -->
- typedef struct H5Z_class1_t {
- H5Z_filter_t id; /**< Filter ID number */
- const char * name; /**< Comment for debugging */
- H5Z_can_apply_func_t can_apply; /**< The "can apply" callback for a filter */
- H5Z_set_local_func_t set_local; /**< The "set local" callback for a filter */
- H5Z_func_t filter; /**< The actual filter function */
- } H5Z_class1_t;
- //! <!-- [H5Z_class1_t_snip] -->
- #endif /* H5_NO_DEPRECATED_SYMBOLS */
- #endif /* _H5Zdevelop_H */
|