Skip to content

Commit dd3e197

Browse files
committed
Merge branch 'dynamic_filters'
Merge branch for supporting dynamic loaded filters
2 parents 6c8ec12 + 710d168 commit dd3e197

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

blosc2/blosc2_ext.pyx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ cdef extern from "blosc2.h":
409409

410410
ctypedef struct blosc2_filter:
411411
uint8_t id
412+
char* name
412413
blosc2_filter_forward_cb forward
413414
blosc2_filter_backward_cb backward
414415

@@ -1786,11 +1787,11 @@ def register_codec(codec_name, id, encoder=None, decoder=None, version=1):
17861787
if encoder is None:
17871788
codec.encoder = NULL
17881789
else:
1789-
codec.encoder = general_encoder
1790+
codec.encoder = <blosc2_codec_encoder_cb> general_encoder
17901791
if decoder is None:
17911792
codec.decoder = NULL
17921793
else:
1793-
codec.decoder = general_decoder
1794+
codec.decoder = <blosc2_codec_decoder_cb> general_decoder
17941795

17951796
rc = blosc2_register_codec(&codec)
17961797
if rc < 0:
@@ -1835,20 +1836,35 @@ cdef int general_backward(const uint8_t* input_buffer, uint8_t* output_buffer, i
18351836
return BLOSC2_ERROR_SUCCESS
18361837

18371838

1838-
def register_filter(id, forward, backward):
1839+
def register_filter(id, forward, backward, filter_name):
18391840
if id < BLOSC2_USER_REGISTERED_FILTERS_START or id > BLOSC2_USER_REGISTERED_FILTERS_STOP:
18401841
raise ValueError("`id` must be between ", BLOSC2_USER_REGISTERED_FILTERS_START,
18411842
" and ", BLOSC2_USER_REGISTERED_FILTERS_STOP)
1843+
if (forward is None and backward is not None) or (forward is not None and backward is None):
1844+
raise ValueError("both encoder and decoder must be given, or none")
18421845

18431846
cdef blosc2_filter filter
18441847
filter.id = id
1845-
filter.forward = general_forward
1846-
filter.backward = general_backward
1848+
if forward is None:
1849+
filter.forward = NULL
1850+
else:
1851+
filter.forward = <blosc2_filter_forward_cb> general_forward
1852+
if backward is None:
1853+
filter.backward = NULL
1854+
else:
1855+
filter.backward = <blosc2_filter_backward_cb> general_backward
1856+
if filter_name is None and not forward and not backward:
1857+
raise ValueError("You need to pass the filter name or the forward and backward functions")
1858+
if filter_name:
1859+
filter_name_ = filter_name.encode() if isinstance(filter_name, str) else filter_name
1860+
filter.name = <char *> malloc(strlen(filter_name_) + 1)
1861+
strcpy(filter.name, filter_name_)
1862+
18471863
rc = blosc2_register_filter(&filter)
18481864
if rc < 0:
18491865
raise RuntimeError("Error while registering filter")
1850-
1851-
blosc2.ufilters_registry[id] = (forward, backward)
1866+
if forward and backward:
1867+
blosc2.ufilters_registry[id] = (forward, backward)
18521868

18531869
def _check_rc(rc, message):
18541870
if rc < 0:

blosc2/core.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,7 +1472,7 @@ def decoder1(input, output, meta, schunk):
14721472
blosc2_ext.register_codec(codec_name, id, encoder, decoder, version)
14731473

14741474

1475-
def register_filter(id, forward, backward):
1475+
def register_filter(id, forward=None, backward=None, name=None):
14761476
"""Register an user defined filter.
14771477
14781478
Parameters
@@ -1482,10 +1482,15 @@ def register_filter(id, forward, backward):
14821482
forward: Python function
14831483
This will receive an input to apply the filter as a ndarray of dtype uint8, an output to fill
14841484
as a ndarray of dtype uint8, the filter meta and the corresponding `SChunk` instance.
1485+
If None then the filter name indicates a dynamic plugin which must be installed.
14851486
backward: Python function
14861487
This will receive an input as a ndarray of dtype uint8, an output to fill
14871488
as a ndarray of dtype uint8, the filter meta and the `SChunk` instance.
1488-
1489+
If None then the filter name indicates a dynamic plugin which must be installed.
1490+
name: str
1491+
The filter name.
1492+
If both `forward`and `backward` are None, this parameter must be passed to correctly
1493+
load the dynamic filter.
14891494
Returns
14901495
-------
14911496
out: None
@@ -1525,4 +1530,4 @@ def backward(input, output, meta, schunk):
15251530
"""
15261531
if id in blosc2.ufilters_registry.keys():
15271532
raise ValueError("Id already in use")
1528-
blosc2_ext.register_filter(id, forward, backward)
1533+
blosc2_ext.register_filter(id, forward, backward, name)

0 commit comments

Comments
 (0)