From 2ff8c152962255820b6c4b693f5f930ec2ac4c80 Mon Sep 17 00:00:00 2001 From: Sebastian <sebastian@baldr.asgard> Date: Tue, 22 Oct 2019 17:35:48 +0300 Subject: [PATCH] use OpenCV if available --- python/ftl/libde265.py | 43 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/python/ftl/libde265.py b/python/ftl/libde265.py index b3830e0f5..74a1dcedb 100644 --- a/python/ftl/libde265.py +++ b/python/ftl/libde265.py @@ -10,15 +10,12 @@ Requirements: try: import cv2 as cv - - # TODO: test - def resize(img, size): - return cv.resize(img, dsize=reversed(size), interpolation=cv.INTER_CUBIC) + def _resize(img, size): + return cv.resize(img, dsize=tuple(reversed(size)), interpolation=cv.INTER_CUBIC) except ImportError: from skimage.transform import resize as resize_skimage - - def resize(img, size): + def _resize(img, size): # skimage resize() return dtype float64, convert back to uint8 # order: 0 nn, 1 bilinear, 3 bicubic return (resize_skimage(img, size, order=3, mode="constant", cval=0) * 255).astype(np.uint8) @@ -123,16 +120,16 @@ libde265.de265_get_image_plane.restype = ctypes.POINTER(ctypes.c_char) class Decoder: def __init__(self, size, threads=1): - self.size_ = size - self.more_ = ctypes.c_int() - self.out_stride_ = ctypes.c_int() - self.ctx_ = libde265.de265_new_decoder() - err = libde265.de265_start_worker_threads(self.ctx_, threads) + self._size = size + self._more = ctypes.c_int() + self._out_stride = ctypes.c_int() + self._ctx = libde265.de265_new_decoder() + err = libde265.de265_start_worker_threads(self._ctx, threads) if err: raise Exception(self.get_error_str(err)) def __del__(self): - libde265.de265_free_decoder(self.ctx_) + libde265.de265_free_decoder(self._ctx) def get_error_str(self, code): return libde265.de265_get_error_text(code).decode("ascii") @@ -141,13 +138,13 @@ class Decoder: if not isinstance(data, bytes): raise ValueError("expected bytes") - err = libde265.de265_push_data(self.ctx_, data, len(data), None, None) + err = libde265.de265_push_data(self._ctx, data, len(data), None, None) if err: raise Exception(self.get_error_str(err)) def push_end_of_frame(self): - err = libde265.de265_push_end_of_frame(self.ctx_) + err = libde265.de265_push_end_of_frame(self._ctx) if err: raise Exception(self.get_error_str(err)) @@ -156,21 +153,21 @@ class Decoder: if not isinstance(data, bytes): raise ValueError("expected bytes") - err = libde265.de265_push_NAL(self.ctx_, data, len(data), None, None) + err = libde265.de265_push_NAL(self._ctx, data, len(data), None, None) if err: raise Exception(self.get_error_str(err)) def decode(self): - err = libde265.de265_decode(self.ctx_, self.more_) + err = libde265.de265_decode(self._ctx, self._more) if err and err != libde265error.DE265_ERROR_WAITING_FOR_INPUT_DATA: raise Exception(self.get_error_str(err)) - return self.more_.value != 0 + return self._more.value != 0 def flush_data(self): - err = libde265.de265_flush_data(self.ctx_) + err = libde265.de265_flush_data(self._ctx) if err: raise Exception(self.get_error_str(err)) @@ -180,12 +177,12 @@ class Decoder: Returns next decoded frame. Image in YCbCr format. If no frame available returns None. ''' - img = libde265.de265_get_next_picture(self.ctx_) + img = libde265.de265_get_next_picture(self._ctx) if not img: return None - res = np.zeros((self.size_[0], self.size_[1], 3), dtype=np.uint8) + res = np.zeros((self._size[0], self._size[1], 3), dtype=np.uint8) for c in range(0, 3): size = (libde265.de265_get_image_height(img, c), @@ -196,11 +193,11 @@ class Decoder: if bpp != 8: raise NotImplementedError("unsupported bits per pixel %i" % bpp) - img_ptr = libde265.de265_get_image_plane(img, c, self.out_stride_) + img_ptr = libde265.de265_get_image_plane(img, c, self._out_stride) ch = np.frombuffer(img_ptr[:size[0] * size[1]], dtype=np.uint8) ch.shape = size - res[:,:,c] = resize(ch, self.size_) + res[:,:,c] = _resize(ch, self._size) - return res + return res \ No newline at end of file -- GitLab