Skip to content

Commit 57acbd4

Browse files
committed
Added get_codec_version()
1 parent 0732554 commit 57acbd4

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

Tests/test_file_avif.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,20 @@ class TestFileAvif:
9494
def test_version(self) -> None:
9595
version = features.version_module("avif")
9696
assert version is not None
97-
assert re.search(r"\d+\.\d+\.\d+$", version)
97+
assert re.search(r"^\d+\.\d+\.\d+$", version)
98+
99+
def test_codec_version(self) -> None:
100+
assert AvifImagePlugin.get_codec_version("unknown") is None
101+
102+
for codec_name in ("aom", "dav1d", "rav1e", "svt"):
103+
codec_version = AvifImagePlugin.get_codec_version(codec_name)
104+
if _avif.decoder_codec_available(
105+
codec_name
106+
) or _avif.encoder_codec_available(codec_name):
107+
assert codec_version is not None
108+
assert re.search(r"^v?\d+\.\d+\.\d+(-([a-z]\d)+)?$", codec_version)
109+
else:
110+
assert codec_version is None
98111

99112
def test_read(self) -> None:
100113
"""

src/PIL/AvifImagePlugin.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
DEFAULT_MAX_THREADS = 0
2121

2222

23+
def get_codec_version(codec_name: str) -> str | None:
24+
versions = _avif.codec_versions()
25+
for version in versions.split(", "):
26+
if version.split(" [")[0] == codec_name:
27+
return version.split(":")[-1].split(" ")[0]
28+
return None
29+
30+
2331
def _accept(prefix: bytes) -> bool | str:
2432
if prefix[4:8] != b"ftyp":
2533
return False

src/_avif.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,13 @@ _encoder_codec_available(PyObject *self, PyObject *args) {
182182
return PyBool_FromLong(is_available);
183183
}
184184

185+
PyObject *
186+
_codec_versions(PyObject *self, PyObject *args) {
187+
char buffer[256];
188+
avifCodecVersions(buffer);
189+
return PyUnicode_FromString(buffer);
190+
}
191+
185192
#if AVIF_VERSION >= 80200 // 0.8.2
186193
static int
187194
_add_codec_specific_options(avifEncoder *encoder, PyObject *opts) {
@@ -910,6 +917,7 @@ static PyMethodDef avifMethods[] = {
910917
{"AvifEncoder", AvifEncoderNew, METH_VARARGS},
911918
{"decoder_codec_available", _decoder_codec_available, METH_VARARGS},
912919
{"encoder_codec_available", _encoder_codec_available, METH_VARARGS},
920+
{"codec_versions", _codec_versions, METH_NOARGS},
913921
{NULL, NULL}
914922
};
915923

0 commit comments

Comments
 (0)