from libc.stdint cimport uint64_t from fractions import Fraction cimport libav as lib from av.error cimport err_check # === DICTIONARIES === # ==================== cdef _decode(char *s, encoding, errors): return (<bytes>s).decode(encoding, errors) cdef bytes _encode(s, encoding, errors): return s.encode(encoding, errors) cdef dict avdict_to_dict(lib.AVDictionary *input, str encoding, str errors): cdef lib.AVDictionaryEntry *element = NULL cdef dict output = {} while True: element = lib.av_dict_get(input, "", element, lib.AV_DICT_IGNORE_SUFFIX) if element == NULL: break output[_decode(element.key, encoding, errors)] = _decode(element.value, encoding, errors) return output cdef dict_to_avdict(lib.AVDictionary **dst, dict src, str encoding, str errors): lib.av_dict_free(dst) for key, value in src.items(): err_check( lib.av_dict_set( dst, _encode(key, encoding, errors), _encode(value, encoding, errors), 0 ) ) # === FRACTIONS === # ================= cdef object avrational_to_fraction(const lib.AVRational *input): if input.num and input.den: return Fraction(input.num, input.den) cdef void to_avrational(object frac, lib.AVRational *input): input.num = frac.numerator input.den = frac.denominator # === OTHER === # ============= cdef check_ndarray(object array, object dtype, int ndim): """ 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}`") cdef flag_in_bitfield(uint64_t bitfield, uint64_t flag): # Not every flag exists in every version of FFMpeg, so we define them to 0. if not flag: return None return bool(bitfield & flag) # === BACKWARDS COMPAT === from .error import err_check
Memory