Skip to content

Commit

Permalink
v4l2: make CaptureStreamer an abstract class
Browse files Browse the repository at this point in the history
Fix error about reserve_buffers and queue methods not existing on
the cap field of Context.
  • Loading branch information
Demon000 authored and tomba committed Oct 31, 2024
1 parent d981c9a commit 7cdb767
Showing 1 changed file with 85 additions and 20 deletions.
105 changes: 85 additions & 20 deletions v4l2/videodev.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

from abc import ABC, ABCMeta, abstractmethod
import ctypes
import errno
import fcntl
Expand Down Expand Up @@ -185,7 +186,7 @@ def get_meta_capture_streamer(self, mem_type: v4l2.MemType,
raise NotImplementedError()


class CaptureStreamer():
class CaptureStreamer(ABC):
def __init__(self, vdev: VideoDevice, mem_type: v4l2.MemType, buf_type: v4l2.BufType) -> None:
self.vdev = vdev
self.mem_type = mem_type
Expand All @@ -208,12 +209,40 @@ def stream_off(self):
buf_type = ctypes.c_uint32(self.buf_type.value)
fcntl.ioctl(self.fd, v4l2.uapi.VIDIOC_STREAMOFF, buf_type, True)

@abstractmethod
def reserve_buffers(self, num_bufs: int): ...

@abstractmethod
def reserve_buffers_dmabuf(self, dmabuf_fds: list[int]): ...

@abstractmethod
def queue(self, vbuf: VideoBuffer): ...

@abstractmethod
def dequeue(self) -> VideoBuffer: ...

@property
@abstractmethod
def buffersizes(self) -> list[int]: ...

@property
@abstractmethod
def strides(self) -> list[int]: ...

@property
@abstractmethod
def framesize(self) -> int: ...

@property
@abstractmethod
def format(self) -> v4l2.PixelFormat | v4l2.MetaFormat: ...

@property
def fd(self):
return self.vdev.fd


class VideoCaptureStreamer(CaptureStreamer):
class VideoCaptureStreamer(CaptureStreamer, metaclass=ABCMeta):
def __init__(self, vdev: VideoDevice, mem_type: v4l2.MemType, buf_type: v4l2.BufType,
width: int, height: int, format: v4l2.PixelFormat) -> None:
super().__init__(vdev, mem_type, buf_type)
Expand All @@ -222,11 +251,27 @@ def __init__(self, vdev: VideoDevice, mem_type: v4l2.MemType, buf_type: v4l2.Buf

self.width = width
self.height = height
self.format = format

self.strides = [format.stride(width, i) for i in range(len(format.planes))]
self.buffersizes = [format.planesize(width, height, i) for i in range(len(format.planes))]
self.framesize = format.framesize(width, height)
self.__format = format
self.__strides = [format.stride(width, i) for i in range(len(format.planes))]
self.__buffersizes = [format.planesize(width, height, i) for i in range(len(format.planes))]
self.__framesize = format.framesize(width, height)

@property
def buffersizes(self):
return self.__buffersizes

@property
def framesize(self):
return self.__framesize

@property
def strides(self):
return self.__strides

@property
def format(self) -> v4l2.PixelFormat:
return self.__format

def reserve_buffers(self, num_bufs):
assert self.format.v4l2_fourcc
Expand Down Expand Up @@ -416,7 +461,7 @@ def __init__(self, vdev: VideoDevice, mem_type: v4l2.MemType, buf_type: v4l2.Buf
super().__init__(vdev, mem_type, buf_type)

self.size = size
self.format = format
self.__format = format

if isinstance(size, int):
w, h = (size, 1)
Expand All @@ -425,15 +470,25 @@ def __init__(self, vdev: VideoDevice, mem_type: v4l2.MemType, buf_type: v4l2.Buf

self.stride = format.stride(w)
self.buffersize = format.buffersize(w, h)
self.framesize = self.buffersize

# Just for compatibility with video streamers
self.strides = [self.stride]
self.buffersizes = [self.buffersize]
self.framesizes = [self.framesize]

self.set_format()

@property
def strides(self):
return [self.stride]

@property
def buffersizes(self):
return [self.buffersize]

@property
def framesize(self):
return self.buffersize

@property
def format(self) -> v4l2.MetaFormat:
return self.__format

def set_format(self):
v4lfmt = v4l2.uapi.v4l2_format()

Expand Down Expand Up @@ -509,19 +564,29 @@ def __init__(self, vdev: VideoDevice, mem_type: v4l2.MemType, buf_type: v4l2.Buf
super().__init__(vdev, mem_type, buf_type)

self.size = size
self.format = format
self.__format = format

self.stride = format.stride(size)
self.buffersize = self.stride
self.framesize = self.buffersize

# Just for compatibility with video streamers
self.strides = [self.stride]
self.buffersizes = [self.buffersize]
self.framesizes = [self.framesize]

self.set_format()

@property
def strides(self):
return [self.stride]

@property
def buffersizes(self):
return [self.buffersize]

@property
def framesize(self):
return self.buffersize

@property
def format(self) -> v4l2.MetaFormat:
return self.__format

def set_format(self):
v4lfmt = v4l2.uapi.v4l2_format()

Expand Down

0 comments on commit 7cdb767

Please sign in to comment.