87 lines
2.1 KiB
Python
87 lines
2.1 KiB
Python
# type: ignore
|
|
from fractions import Fraction
|
|
|
|
import cython
|
|
from cython.cimports import libav as lib
|
|
from cython.cimports.av.error import err_check
|
|
|
|
# === DICTIONARIES ===
|
|
# ====================
|
|
|
|
|
|
@cython.cfunc
|
|
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
|
|
) -> dict:
|
|
element: cython.pointer[lib.AVDictionaryEntry] = cython.NULL
|
|
output: dict = {}
|
|
while True:
|
|
element = lib.av_dict_get(input, "", element, lib.AV_DICT_IGNORE_SUFFIX)
|
|
if element == cython.NULL:
|
|
break
|
|
output[_decode(element.key, encoding, errors)] = _decode(
|
|
element.value, encoding, errors
|
|
)
|
|
|
|
return output
|
|
|
|
|
|
@cython.cfunc
|
|
def dict_to_avdict(
|
|
dst: cython.pointer[cython.pointer[lib.AVDictionary]],
|
|
src: dict,
|
|
encoding: str,
|
|
errors: str,
|
|
):
|
|
lib.av_dict_free(dst)
|
|
for key, value in src.items():
|
|
err_check(
|
|
lib.av_dict_set(
|
|
dst, key.encode(encoding, errors), value.encode(encoding, errors), 0
|
|
)
|
|
)
|
|
|
|
|
|
# === FRACTIONS ===
|
|
# =================
|
|
|
|
|
|
@cython.cfunc
|
|
def avrational_to_fraction(
|
|
input: cython.pointer[cython.const[lib.AVRational]],
|
|
) -> object:
|
|
if input.num and input.den:
|
|
return Fraction(input.num, input.den)
|
|
return None
|
|
|
|
|
|
@cython.cfunc
|
|
def to_avrational(frac: object, input: cython.pointer[lib.AVRational]) -> cython.void:
|
|
input.num = frac.numerator
|
|
input.den = frac.denominator
|
|
|
|
|
|
@cython.cfunc
|
|
def check_ndarray(array: object, dtype: object, ndim: cython.int) -> cython.void:
|
|
"""
|
|
Check a numpy array has the expected data type and number of dimensions.
|
|
"""
|
|
if array.dtype != dtype:
|
|
raise ValueError(
|
|
f"Expected numpy array with dtype `{dtype}` but got `{array.dtype}`"
|
|
)
|
|
if array.ndim != ndim:
|
|
raise ValueError(
|
|
f"Expected numpy array with ndim `{ndim}` but got `{array.ndim}`"
|
|
)
|