diff --git a/av/filter/filter.pxd b/av/filter/filter.pxd index 27501ae57..0a7cd41a0 100644 --- a/av/filter/filter.pxd +++ b/av/filter/filter.pxd @@ -4,9 +4,7 @@ from av.descriptor cimport Descriptor cdef class Filter: - cdef const lib.AVFilter *ptr - cdef object _inputs cdef object _outputs cdef Descriptor _descriptor diff --git a/av/filter/filter.pyx b/av/filter/filter.py similarity index 70% rename from av/filter/filter.pyx rename to av/filter/filter.py index b6e7005f0..b348dd3e0 100644 --- a/av/filter/filter.pyx +++ b/av/filter/filter.py @@ -1,24 +1,26 @@ -cimport libav as lib +import cython +from cython.cimports import libav as lib +from cython.cimports.av.descriptor import wrap_avclass +from cython.cimports.av.filter.link import alloc_filter_pads -from av.descriptor cimport wrap_avclass -from av.filter.link cimport alloc_filter_pads +_cinit_sentinel = cython.declare(object, object()) -cdef object _cinit_sentinel = object() - - -cdef Filter wrap_filter(const lib.AVFilter *ptr): - cdef Filter filter_ = Filter(_cinit_sentinel) +@cython.cfunc +def wrap_filter(ptr: cython.pointer[cython.const[lib.AVFilter]]) -> Filter: + filter_: Filter = Filter(_cinit_sentinel) filter_.ptr = ptr return filter_ -cdef class Filter: +@cython.cclass +class Filter: def __cinit__(self, name): if name is _cinit_sentinel: return if not isinstance(name, str): raise TypeError("takes a filter name as a string") + self.ptr = lib.avfilter_get_by_name(name) if not self.ptr: raise ValueError(f"no filter {name}") @@ -60,19 +62,19 @@ def outputs(self): return self._outputs -cdef get_filter_names(): - names = set() - cdef const lib.AVFilter *ptr - cdef void *opaque = NULL +@cython.cfunc +def get_filter_names() -> set: + names: set = set() + ptr: cython.pointer[cython.const[lib.AVFilter]] + opaque: cython.p_void = cython.NULL while True: - ptr = lib.av_filter_iterate(&opaque) + ptr = lib.av_filter_iterate(cython.address(opaque)) if ptr: names.add(ptr.name) else: break return names -filters_available = get_filter_names() - +filters_available = get_filter_names() filter_descriptor = wrap_avclass(lib.avfilter_get_class()) diff --git a/av/utils.py b/av/utils.py index 3516be0e3..bdf11bbb5 100644 --- a/av/utils.py +++ b/av/utils.py @@ -14,11 +14,6 @@ def _decode(s: cython.pointer[cython.char], encoding, errors) -> str: return cython.cast(bytes, s).decode(encoding, errors) -@cython.cfunc -def _encode(s, encoding, errors) -> bytes: - return s.encode(encoding, errors) - - @cython.cfunc def avdict_to_dict( input: cython.pointer[lib.AVDictionary], encoding: str, errors: str