Files
voice_bridge/venv/lib/python3.12/site-packages/av/utils.py
2026-01-09 10:28:44 +11:00

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}`"
)