From c3d5ed33dd789287c5f0599aca389c3ae01ba294 Mon Sep 17 00:00:00 2001 From: totaam Date: Sat, 29 May 2021 22:37:40 +0700 Subject: [PATCH] #3031 remove memory_as_pybuffer and use PyMemoryView_FromMemory directly --- xpra/buffers/buffers.c | 4 ---- xpra/buffers/buffers.h | 2 -- xpra/buffers/membuf.pxd | 2 -- xpra/buffers/membuf.pyx | 6 +---- .../csc_cython/colorspace_converter.pyx | 21 ++++++++++-------- .../csc_libyuv/colorspace_converter.pyx | 9 +++++--- xpra/codecs/dec_avcodec2/decoder.pyx | 9 +++++--- xpra/codecs/webp/decoder.pyx | 22 ++++++++++--------- xpra/x11/bindings/ximage.pyx | 7 ++++-- 9 files changed, 42 insertions(+), 40 deletions(-) diff --git a/xpra/buffers/buffers.c b/xpra/buffers/buffers.c index 1694e8b7d4..c800716441 100644 --- a/xpra/buffers/buffers.c +++ b/xpra/buffers/buffers.c @@ -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)) { diff --git a/xpra/buffers/buffers.h b/xpra/buffers/buffers.h index bd73bc1ad0..4f0ec1aea8 100644 --- a/xpra/buffers/buffers.h +++ b/xpra/buffers/buffers.h @@ -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); diff --git a/xpra/buffers/membuf.pxd b/xpra/buffers/membuf.pxd index 8e05b6b7ac..2a317400a7 100644 --- a/xpra/buffers/membuf.pxd +++ b/xpra/buffers/membuf.pxd @@ -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 diff --git a/xpra/buffers/membuf.pyx b/xpra/buffers/membuf.pyx index 1feadaa1e2..b2129be73c 100644 --- a/xpra/buffers/membuf.pyx +++ b/xpra/buffers/membuf.pyx @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # This file is part of Xpra. -# Copyright (C) 2015-2020 Antoine Martin +# Copyright (C) 2015-2021 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -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": @@ -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) diff --git a/xpra/codecs/csc_cython/colorspace_converter.pyx b/xpra/codecs/csc_cython/colorspace_converter.pyx index abdc37faf2..2ab18e0fd1 100644 --- a/xpra/codecs/csc_cython/colorspace_converter.pyx +++ b/xpra/codecs/csc_cython/colorspace_converter.pyx @@ -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) @@ -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( (( buf) + self.offsets[i]), self.dst_sizes[i], True)) + planes.append(PyMemoryView_FromMemory( (( 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 = buf return out_image @@ -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 = memalign(self.buffer_size) cdef unsigned int stride = self.dst_strides[0] if image.is_thread_safe(): @@ -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( bgr48, 48) + return self.packed_image_wrapper( 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 = buf return out_image @@ -771,7 +774,7 @@ cdef class ColorspaceConverter: gbrp10_to_r210_copy( r210, gbrp10, w, h, src_stride, dst_stride) - return self.packed_image_wrapper( r210, 30) + return self.packed_image_wrapper( r210, 30) def YUV420P_to_RGBX(self, image): @@ -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( output_image, 24) + return self.packed_image_wrapper( output_image, 24) def GBRP_to_RGBX(self, image): @@ -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( output_image, 24) + return self.packed_image_wrapper( output_image, 24) def selftest(full=False): diff --git a/xpra/codecs/csc_libyuv/colorspace_converter.pyx b/xpra/codecs/csc_libyuv/colorspace_converter.pyx index 36857bac46..dd5cafe87f 100644 --- a/xpra/codecs/csc_libyuv/colorspace_converter.pyx +++ b/xpra/codecs/csc_libyuv/colorspace_converter.pyx @@ -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 @@ -458,7 +461,7 @@ 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( scaled_planes[i], self.scaled_size[i], True)) + planes.append(PyMemoryView_FromMemory( 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 = scaled_buffer @@ -466,7 +469,7 @@ cdef class ColorspaceConverter: #use output buffer directly: for i in range(self.planes): strides.append(self.out_stride[i]) - planes.append(memory_as_pybuffer( out_planes[i], self.out_size[i], True)) + planes.append(PyMemoryView_FromMemory( 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 = output_buffer diff --git a/xpra/codecs/dec_avcodec2/decoder.pyx b/xpra/codecs/dec_avcodec2/decoder.pyx index ca457a29e5..fccf2b2418 100644 --- a/xpra/codecs/dec_avcodec2/decoder.pyx +++ b/xpra/codecs/dec_avcodec2/decoder.pyx @@ -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() @@ -977,14 +980,14 @@ cdef class Decoder: size = height * stride outsize += size - out.append(memory_as_pybuffer(av_frame.data[i], size, True)) + out.append(PyMemoryView_FromMemory(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(av_frame.data[0], outsize, True) + out = PyMemoryView_FromMemory(av_frame.data[0], outsize, True) nplanes = 0 log("decompress_image() read back '%s' buffer: %s bytes", cs, outsize) diff --git a/xpra/codecs/webp/decoder.pyx b/xpra/codecs/webp/decoder.pyx index de949f7a12..613e9068ec 100644 --- a/xpra/codecs/webp/decoder.pyx +++ b/xpra/codecs/webp/decoder.pyx @@ -1,5 +1,5 @@ # This file is part of Xpra. -# Copyright (C) 2014-2018 Antoine Martin +# Copyright (C) 2014-2021 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -9,7 +9,7 @@ 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 @@ -17,6 +17,8 @@ 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": @@ -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( self.buffer_ptr, self.size, True) + return PyMemoryView_FromMemory( self.buffer_ptr, self.size, True) def free(self): if self.buffer_ptr!=0: @@ -289,16 +291,16 @@ def decompress_yuv(data, has_alpha=False): webp_check(WebPDecode(data, len(data), &config)) if alpha: planes = ( - memory_as_pybuffer( YUVA.y, y_size, True), - memory_as_pybuffer( YUVA.u, u_size, True), - memory_as_pybuffer( YUVA.v, v_size, True), - memory_as_pybuffer( YUVA.a, a_size, True), + PyMemoryView_FromMemory( YUVA.y, y_size, True), + PyMemoryView_FromMemory( YUVA.u, u_size, True), + PyMemoryView_FromMemory( YUVA.v, v_size, True), + PyMemoryView_FromMemory( YUVA.a, a_size, True), ) else: planes = ( - memory_as_pybuffer( YUVA.y, y_size, True), - memory_as_pybuffer( YUVA.u, u_size, True), - memory_as_pybuffer( YUVA.v, v_size, True), + PyMemoryView_FromMemory( YUVA.y, y_size, True), + PyMemoryView_FromMemory( YUVA.u, u_size, True), + PyMemoryView_FromMemory( 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 = buf diff --git a/xpra/x11/bindings/ximage.pyx b/xpra/x11/bindings/ximage.pyx index 939ea77168..e8b85fe94b 100644 --- a/xpra/x11/bindings/ximage.pyx +++ b/xpra/x11/bindings/ximage.pyx @@ -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 @@ -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) @@ -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( 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)