Skip to content

Commit

Permalink
#3031 remove memory_as_pybuffer and use PyMemoryView_FromMemory directly
Browse files Browse the repository at this point in the history
  • Loading branch information
totaam committed May 29, 2021
1 parent 0ae6941 commit c3d5ed3
Show file tree
Hide file tree
Showing 9 changed files with 42 additions and 40 deletions.
4 changes: 0 additions & 4 deletions xpra/buffers/buffers.c
Expand Up @@ -7,10 +7,6 @@

#include "Python.h"

PyObject *_memory_as_pybuffer(void *ptr, Py_ssize_t buf_len, int readonly) {
return PyMemoryView_FromMemory(ptr, buf_len, readonly);
}

int _object_as_buffer(PyObject *obj, const void ** buffer, Py_ssize_t * buffer_len) {
Py_buffer *rpybuf;
if (PyMemoryView_Check(obj)) {
Expand Down
2 changes: 0 additions & 2 deletions xpra/buffers/buffers.h
Expand Up @@ -7,6 +7,4 @@

#include "Python.h"

PyObject *_memory_as_pybuffer(void* ptr, Py_ssize_t buf_len, int readonly);
int _object_as_buffer(PyObject *obj, const void ** buffer, Py_ssize_t * buffer_len);
int _object_as_write_buffer(PyObject *obj, void ** buffer, Py_ssize_t * buffer_len);
2 changes: 0 additions & 2 deletions xpra/buffers/membuf.pxd
Expand Up @@ -17,8 +17,6 @@ ctypedef void dealloc_callback(const void *p, size_t l, void *arg)
cdef void *memalign(size_t size) nogil


cdef object memory_as_pybuffer(void* ptr, Py_ssize_t buf_len, int readonly)

cdef int object_as_buffer(object obj, const void ** buffer, Py_ssize_t * buffer_len)

cdef unsigned long long xxh64(const void* input, size_t length, unsigned long long seed) nogil
Expand Down
6 changes: 1 addition & 5 deletions xpra/buffers/membuf.pyx
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# This file is part of Xpra.
# Copyright (C) 2015-2020 Antoine Martin <antoine@xpra.org>
# Copyright (C) 2015-2021 Antoine Martin <antoine@xpra.org>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

Expand All @@ -26,7 +26,6 @@ cdef extern from "memalign.h":
int MEMALIGN_ALIGNMENT

cdef extern from "buffers.h":
object _memory_as_pybuffer(void* ptr, Py_ssize_t buf_len, int readonly)
int _object_as_buffer(object obj, const void ** buffer, Py_ssize_t * buffer_len)

cdef extern from "xxhash.h":
Expand Down Expand Up @@ -57,9 +56,6 @@ cdef void *memalign(size_t size) nogil:
return xmemalign(size)


cdef object memory_as_pybuffer(void* ptr, Py_ssize_t buf_len, int readonly):
return _memory_as_pybuffer(ptr, buf_len, readonly)

cdef int object_as_buffer(object obj, const void ** buffer, Py_ssize_t * buffer_len):
return _object_as_buffer(obj, buffer, buffer_len)

Expand Down
21 changes: 12 additions & 9 deletions xpra/codecs/csc_cython/colorspace_converter.pyx
Expand Up @@ -18,9 +18,12 @@ from xpra.codecs.codec_constants import csc_spec, get_subsampling_divs
from xpra.codecs.image_wrapper import ImageWrapper

from libc.stdint cimport uint8_t, uintptr_t # pylint: disable=syntax-error
from xpra.buffers.membuf cimport memory_as_pybuffer, memalign, object_as_buffer
from xpra.buffers.membuf cimport memalign, object_as_buffer


cdef extern from "Python.h":
object PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)

cdef extern from "stdlib.h":
void free(void *ptr)

Expand Down Expand Up @@ -613,7 +616,7 @@ cdef class ColorspaceConverter:
cdef unsigned char i
for i in range(3):
strides.append(self.dst_strides[i])
planes.append(memory_as_pybuffer(<void *> ((<uintptr_t> buf) + self.offsets[i]), self.dst_sizes[i], True))
planes.append(PyMemoryView_FromMemory(<char *> ((<uintptr_t> buf) + self.offsets[i]), self.dst_sizes[i], True))
out_image = CythonImageWrapper(0, 0, self.dst_width, self.dst_height, planes, self.dst_format, bpp, strides, ImageWrapper.PLANAR_3)
out_image.cython_buffer = <uintptr_t> buf
return out_image
Expand Down Expand Up @@ -682,7 +685,7 @@ cdef class ColorspaceConverter:
assert buf_len>=Vstride*image.get_height()//2, "buffer for V plane is too small: %s bytes, expected at least %s" % (buf_len, Vstride*image.get_height()//2)

#allocate output buffer:
cdef void *output_image = memalign(self.buffer_size)
cdef char *output_image = <char *> memalign(self.buffer_size)
cdef unsigned int stride = self.dst_strides[0]

if image.is_thread_safe():
Expand Down Expand Up @@ -723,10 +726,10 @@ cdef class ColorspaceConverter:
r210_to_BGR48_copy(bgr48, r210, w, h, src_stride, dst_stride)
else:
r210_to_BGR48_copy(bgr48, r210, w, h, src_stride, dst_stride)
return self.packed_image_wrapper(<void *> bgr48, 48)
return self.packed_image_wrapper(<char *> bgr48, 48)

cdef packed_image_wrapper(self, void *buf, unsigned char bpp=24):
pybuf = memory_as_pybuffer(buf, self.dst_sizes[0], True)
cdef packed_image_wrapper(self, char *buf, unsigned char bpp=24):
pybuf = PyMemoryView_FromMemory(buf, self.dst_sizes[0], True)
out_image = CythonImageWrapper(0, 0, self.dst_width, self.dst_height, pybuf, self.dst_format, bpp, self.dst_strides[0], ImageWrapper.PACKED)
out_image.cython_buffer = <uintptr_t> buf
return out_image
Expand Down Expand Up @@ -771,7 +774,7 @@ cdef class ColorspaceConverter:
gbrp10_to_r210_copy(<uintptr_t> r210, gbrp10,
w, h,
src_stride, dst_stride)
return self.packed_image_wrapper(<void *> r210, 30)
return self.packed_image_wrapper(<char *> r210, 30)


def YUV420P_to_RGBX(self, image):
Expand Down Expand Up @@ -852,7 +855,7 @@ cdef class ColorspaceConverter:
output_image[o + Bindex] = clamp(BY * Y + BU * U + BV * V)
if Bpp==4:
output_image[o + Xindex] = 255
return self.packed_image_wrapper(<void *> output_image, 24)
return self.packed_image_wrapper(<char *> output_image, 24)


def GBRP_to_RGBX(self, image):
Expand Down Expand Up @@ -914,7 +917,7 @@ cdef class ColorspaceConverter:
output_image[o+Bdst] = Bptr[sx]
output_image[o+Xdst] = 255
o += 4
return self.packed_image_wrapper(<void *> output_image, 24)
return self.packed_image_wrapper(<char *> output_image, 24)


def selftest(full=False):
Expand Down
9 changes: 6 additions & 3 deletions xpra/codecs/csc_libyuv/colorspace_converter.pyx
Expand Up @@ -11,13 +11,16 @@ log = Logger("csc", "libyuv")

from xpra.codecs.codec_constants import get_subsampling_divs, csc_spec
from xpra.codecs.image_wrapper import ImageWrapper
from xpra.buffers.membuf cimport getbuf, MemBuf, memalign, object_as_buffer, memory_as_pybuffer #pylint: disable=syntax-error
from xpra.buffers.membuf cimport getbuf, MemBuf, memalign, object_as_buffer #pylint: disable=syntax-error

from xpra.monotonic_time cimport monotonic_time
from libc.stdint cimport uint8_t, uintptr_t
from libc.stdlib cimport free


cdef extern from "Python.h":
object PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)

cdef extern from "../../buffers/memalign.h":
unsigned int MEMALIGN_ALIGNMENT

Expand Down Expand Up @@ -458,15 +461,15 @@ cdef class ColorspaceConverter:
log("libyuv.ScalePlane %i times, took %.1fms", self.planes, 1000.0*elapsed)
for i in range(self.planes):
strides.append(self.scaled_stride[i])
planes.append(memory_as_pybuffer(<void *> scaled_planes[i], self.scaled_size[i], True))
planes.append(PyMemoryView_FromMemory(<char *> scaled_planes[i], self.scaled_size[i], True))
self.frames += 1
out_image = YUVImageWrapper(0, 0, self.dst_width, self.dst_height, planes, self.dst_format, 24, strides, 1, self.planes)
out_image.cython_buffer = <uintptr_t> scaled_buffer
else:
#use output buffer directly:
for i in range(self.planes):
strides.append(self.out_stride[i])
planes.append(memory_as_pybuffer(<void *> out_planes[i], self.out_size[i], True))
planes.append(PyMemoryView_FromMemory(<char *> out_planes[i], self.out_size[i], True))
self.frames += 1
out_image = YUVImageWrapper(0, 0, self.dst_width, self.dst_height, planes, self.dst_format, 24, strides, 1, self.planes)
out_image.cython_buffer = <uintptr_t> output_buffer
Expand Down
9 changes: 6 additions & 3 deletions xpra/codecs/dec_avcodec2/decoder.pyx
Expand Up @@ -16,13 +16,16 @@ from xpra.codecs.codec_constants import get_subsampling_divs
from xpra.codecs.image_wrapper import ImageWrapper
from xpra.codecs.libav_common.av_log cimport override_logger, restore_logger, av_error_str #@UnresolvedImport pylint: disable=syntax-error
from xpra.codecs.libav_common.av_log import suspend_nonfatal_logging, resume_nonfatal_logging
from xpra.buffers.membuf cimport memalign, object_as_buffer, memory_as_pybuffer
from xpra.buffers.membuf cimport memalign, object_as_buffer

from libc.stdint cimport uintptr_t, uint8_t
from libc.stdlib cimport free
from libc.string cimport memset, memcpy


cdef extern from "Python.h":
object PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)

cdef extern from "register_compat.h":
void register_all()

Expand Down Expand Up @@ -977,14 +980,14 @@ cdef class Decoder:
size = height * stride
outsize += size

out.append(memory_as_pybuffer(<void *>av_frame.data[i], size, True))
out.append(PyMemoryView_FromMemory(<char *>av_frame.data[i], size, True))
strides.append(stride)
log("decompress_image() read back '%s' plane: %s bytes", cs[i:i+1], size)
else:
#RGB mode: "out" is a single buffer
strides = av_frame.linesize[0]+av_frame.linesize[1]+av_frame.linesize[2]
outsize = self.codec_ctx.height * strides
out = memory_as_pybuffer(<void *>av_frame.data[0], outsize, True)
out = PyMemoryView_FromMemory(<char *>av_frame.data[0], outsize, True)
nplanes = 0
log("decompress_image() read back '%s' buffer: %s bytes", cs, outsize)

Expand Down
22 changes: 12 additions & 10 deletions xpra/codecs/webp/decoder.pyx
@@ -1,5 +1,5 @@
# This file is part of Xpra.
# Copyright (C) 2014-2018 Antoine Martin <antoine@xpra.org>
# Copyright (C) 2014-2021 Antoine Martin <antoine@xpra.org>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

Expand All @@ -9,14 +9,16 @@ from xpra.log import Logger
log = Logger("encoder", "webp")

from xpra.codecs.image_wrapper import ImageWrapper
from xpra.buffers.membuf cimport memalign, memory_as_pybuffer #pylint: disable=syntax-error
from xpra.buffers.membuf cimport memalign #pylint: disable=syntax-error

from libc.stdint cimport uint8_t, uint32_t, uintptr_t
from libc.stdlib cimport free

cdef extern from *:
ctypedef unsigned long size_t

cdef extern from "Python.h":
object PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)

cdef extern from "webp/decode.h":

Expand Down Expand Up @@ -178,7 +180,7 @@ cdef class WebpBufferWrapper:

def get_pixels(self):
assert self.buffer_ptr>0, "WebpBufferWrapper has already been freed!"
return memory_as_pybuffer(<void *> self.buffer_ptr, self.size, True)
return PyMemoryView_FromMemory(<char *> self.buffer_ptr, self.size, True)

def free(self):
if self.buffer_ptr!=0:
Expand Down Expand Up @@ -289,16 +291,16 @@ def decompress_yuv(data, has_alpha=False):
webp_check(WebPDecode(data, len(data), &config))
if alpha:
planes = (
memory_as_pybuffer(<void *> YUVA.y, y_size, True),
memory_as_pybuffer(<void *> YUVA.u, u_size, True),
memory_as_pybuffer(<void *> YUVA.v, v_size, True),
memory_as_pybuffer(<void *> YUVA.a, a_size, True),
PyMemoryView_FromMemory(<char *> YUVA.y, y_size, True),
PyMemoryView_FromMemory(<char *> YUVA.u, u_size, True),
PyMemoryView_FromMemory(<char *> YUVA.v, v_size, True),
PyMemoryView_FromMemory(<char *> YUVA.a, a_size, True),
)
else:
planes = (
memory_as_pybuffer(<void *> YUVA.y, y_size, True),
memory_as_pybuffer(<void *> YUVA.u, u_size, True),
memory_as_pybuffer(<void *> YUVA.v, v_size, True),
PyMemoryView_FromMemory(<char *> YUVA.y, y_size, True),
PyMemoryView_FromMemory(<char *> YUVA.u, u_size, True),
PyMemoryView_FromMemory(<char *> YUVA.v, v_size, True),
)
img = YUVImageWrapper(0, 0, w, h, planes, "YUV420P", (3+alpha)*8, strides, 3+alpha, ImageWrapper.PLANAR_3+alpha)
img.cython_buffer = <uintptr_t> buf
Expand Down
7 changes: 5 additions & 2 deletions xpra/x11/bindings/ximage.pyx
Expand Up @@ -7,7 +7,7 @@
#cython: auto_pickle=False, language_level=3

from xpra.os_util import bytestostr
from xpra.buffers.membuf cimport memory_as_pybuffer, object_as_buffer #pylint: disable=syntax-error
from xpra.buffers.membuf cimport object_as_buffer #pylint: disable=syntax-error
from xpra.monotonic_time cimport monotonic_time
from xpra.x11.bindings.display_source import get_display_name
from xpra.log import Logger
Expand Down Expand Up @@ -44,6 +44,9 @@ cdef inline unsigned int MIN(unsigned int a, unsigned int b):
###################################
# Headers, python magic
###################################
cdef extern from "Python.h":
object PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)

cdef extern from "stdlib.h":
int posix_memalign(void **memptr, size_t alignment, size_t size)

Expand Down Expand Up @@ -382,7 +385,7 @@ cdef class XImageWrapper:
cdef void *pix_ptr = self.get_pixels_ptr()
if pix_ptr==NULL:
return None
return memory_as_pybuffer(pix_ptr, self.get_size(), False)
return PyMemoryView_FromMemory(<char *> pix_ptr, self.get_size(), False)

def get_sub_image(self, unsigned int x, unsigned int y, unsigned int w, unsigned int h):
assert w>0 and h>0, "invalid sub-image size: %ix%i" % (w, h)
Expand Down

0 comments on commit c3d5ed3

Please sign in to comment.