diff --git a/av/video/frame.pyx b/av/video/frame.pyx index 6a3add3e1a4d86a619a80e34ca9a9f0dae1f1ab1..c2a6134be8baad5a00bd4b3e27ad5768f2b4c81c 100644 --- a/av/video/frame.pyx +++ b/av/video/frame.pyx @@ -66,10 +66,10 @@ cdef useful_array(VideoPlane plane, unsigned int bytes_per_pixel=1, str dtype='u import numpy as np cdef size_t total_line_size = abs(plane.line_size) cdef size_t useful_line_size = plane.width * bytes_per_pixel - arr = np.frombuffer(plane, np.dtype(dtype)) + arr = np.frombuffer(plane, np.uint8) if total_line_size != useful_line_size: arr = arr.reshape(-1, total_line_size)[:, 0:useful_line_size].reshape(-1) - return arr + return arr.view(np.dtype(dtype)) cdef class VideoFrame(Frame): diff --git a/tests/test_videoframe.py b/tests/test_videoframe.py index 09ab06b13dca5673551e572b06c51e3ce4471d22..6b9a99a4b9327a56f88c8bec5c202958062f7592 100644 --- a/tests/test_videoframe.py +++ b/tests/test_videoframe.py @@ -291,6 +291,17 @@ class TestVideoFrameNdarray(TestCase): # check endianness by examining red value of first pixel self.assertPixelValue16(frame.planes[0], array[0][0][0], "little") + def test_ndarray_rgb48le_align(self): + array = numpy.random.randint(0, 65536, size=(238, 318, 3), dtype=numpy.uint16) + frame = VideoFrame.from_ndarray(array, format="rgb48le") + self.assertEqual(frame.width, 318) + self.assertEqual(frame.height, 238) + self.assertEqual(frame.format.name, "rgb48le") + self.assertNdarraysEqual(frame.to_ndarray(), array) + + # check endianness by examining red value of first pixel + self.assertPixelValue16(frame.planes[0], array[0][0][0], "little") + def test_ndarray_rgba64be(self): array = numpy.random.randint(0, 65536, size=(480, 640, 4), dtype=numpy.uint16) frame = VideoFrame.from_ndarray(array, format="rgba64be")