From c7aceff185f6abda40c4a58badc0397477a9bc52 Mon Sep 17 00:00:00 2001 From: Alexander Piskun Date: Fri, 10 Feb 2023 16:04:32 +0300 Subject: [PATCH] Added ability to pass `memoryview` object to ImageDecoder --- src/decode.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/decode.c b/src/decode.c index 7a9b956c5..7a97a1e32 100644 --- a/src/decode.c +++ b/src/decode.c @@ -116,12 +116,24 @@ _dealloc(ImagingDecoderObject *decoder) { static PyObject * _decode(ImagingDecoderObject *decoder, PyObject *args) { + PyObject *input_object, *memview = NULL; + Py_buffer *memview_buf; UINT8 *buffer; Py_ssize_t bufsize; int status; ImagingSectionCookie cookie; - if (!PyArg_ParseTuple(args, "y#", &buffer, &bufsize)) { + if (!PyArg_ParseTuple(args, "O", &input_object)) { + return NULL; + } + + if (PyMemoryView_Check(input_object)) { + memview = PyMemoryView_FromObject(input_object); + memview_buf = PyMemoryView_GET_BUFFER(memview); + buffer = memview_buf->buf; + bufsize = memview_buf->len; + } + else if (!PyArg_ParseTuple(args, "y#", &buffer, &bufsize)) { return NULL; } @@ -135,6 +147,7 @@ _decode(ImagingDecoderObject *decoder, PyObject *args) { ImagingSectionLeave(&cookie); } + Py_XDECREF(memview); return Py_BuildValue("ii", status, decoder->state.errcode); }