cimport libav as lib
from .option cimport Option, OptionChoice, wrap_option, wrap_option_choice
cdef object _cinit_sentinel = object()
cdef Descriptor wrap_avclass(const lib.AVClass *ptr):
if ptr == NULL:
return None
cdef Descriptor obj = Descriptor(_cinit_sentinel)
obj.ptr = ptr
return obj
cdef class Descriptor:
def __cinit__(self, sentinel):
if sentinel is not _cinit_sentinel:
raise RuntimeError("Cannot construct av.Descriptor")
@property
def name(self):
return self.ptr.class_name if self.ptr.class_name else None
@property
def options(self):
cdef const lib.AVOption *ptr = self.ptr.option
cdef const lib.AVOption *choice_ptr
cdef Option option
cdef OptionChoice option_choice
cdef bint choice_is_default
if self._options is None:
options = []
ptr = self.ptr.option
while ptr != NULL and ptr.name != NULL:
if ptr.type == lib.AV_OPT_TYPE_CONST:
ptr += 1
continue
choices = []
if ptr.unit != NULL: # option has choices (matching const options)
choice_ptr = self.ptr.option
while choice_ptr != NULL and choice_ptr.name != NULL:
if choice_ptr.type != lib.AV_OPT_TYPE_CONST or choice_ptr.unit != ptr.unit:
choice_ptr += 1
continue
choice_is_default = (choice_ptr.default_val.i64 == ptr.default_val.i64 or
ptr.type == lib.AV_OPT_TYPE_FLAGS and
choice_ptr.default_val.i64 & ptr.default_val.i64)
option_choice = wrap_option_choice(choice_ptr, choice_is_default)
choices.append(option_choice)
choice_ptr += 1
option = wrap_option(tuple(choices), ptr)
options.append(option)
ptr += 1
self._options = tuple(options)
return self._options
def __repr__(self):
return f"<{self.__class__.__name__} {self.name} at 0x{id(self):x}>"