From 63302e378b6e6660c19b13b9a75fe68ac03fa5e9 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Wed, 23 Jul 2025 09:34:07 +0100 Subject: [PATCH 1/3] tests: Add encoder import test This ensures the correct default encoder is selected for the running platform. Signed-off-by: Naushir Patuck --- tests/encoder_import.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/encoder_import.py diff --git a/tests/encoder_import.py b/tests/encoder_import.py new file mode 100644 index 00000000..ee8b31fa --- /dev/null +++ b/tests/encoder_import.py @@ -0,0 +1,15 @@ +from picamera2 import Picamera2 +from picamera2.encoders import H264Encoder +from picamera2.platform import Platform + +encoder = H264Encoder(bitrate=1000000) +encoder_name = encoder.__class__.__name__ +platform = Picamera2.platform + +if platform == Platform.VC4: + error = encoder_name != "H264Encoder" +elif platform == Platform.PISP: + error = encoder_name != "LibavH264Encoder" + +if error: + print("ERROR: Unexpected encoder, got", encoder_name, "for platform", platform) From dd36d2fc9daac74eb6b9455511cdcb0e7189d46e Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Wed, 23 Jul 2025 08:57:23 +0100 Subject: [PATCH 2/3] encoders: Fix for typo in videodev2 import This typo was missed by the tests as the __init__ function for the encoder module was also incorrect. Use the get_platform() function to correctly retrieve the running platform. Signed-off-by: Naushir Patuck --- picamera2/encoders/__init__.py | 11 +++-------- picamera2/encoders/v4l2_encoder.py | 2 +- tests/test_list.txt | 1 + 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/picamera2/encoders/__init__.py b/picamera2/encoders/__init__.py index a530f7f6..912dd579 100644 --- a/picamera2/encoders/__init__.py +++ b/picamera2/encoders/__init__.py @@ -2,20 +2,15 @@ import videodev2 +from picamera2.platform import Platform, get_platform + from .encoder import Encoder, Quality from .jpeg_encoder import JpegEncoder from .libav_h264_encoder import LibavH264Encoder from .libav_mjpeg_encoder import LibavMjpegEncoder from .multi_encoder import MultiEncoder -_hw_encoder_available = False -try: - with open('/dev/video11', 'rb', buffering=0) as fd: - caps = videodev2.v4l2_capability() - fcntl.ioctl(fd, videodev2.VIDIOC_QUERYCAP, caps) - _hw_encoder_available = (caps.card.decode('utf-8') == "bcm2835-codec-encode") -except Exception: - pass +_hw_encoder_available = get_platform() == Platform.VC4 if _hw_encoder_available: from .h264_encoder import H264Encoder diff --git a/picamera2/encoders/v4l2_encoder.py b/picamera2/encoders/v4l2_encoder.py index 7fee57c9..204e1b49 100644 --- a/picamera2/encoders/v4l2_encoder.py +++ b/picamera2/encoders/v4l2_encoder.py @@ -7,7 +7,7 @@ import select import threading -from vidoedev2 import * +from videodev2 import * from picamera2.encoders.encoder import Encoder diff --git a/tests/test_list.txt b/tests/test_list.txt index 66914916..fe53bac3 100644 --- a/tests/test_list.txt +++ b/tests/test_list.txt @@ -74,6 +74,7 @@ tests/display_transform_null.py tests/display_transform_qt.py tests/easy_video2.py tests/egl_leak.py +tests/encoder_import.py tests/encoder_start_stop.py tests/ffmpeg_abort.py tests/grey_world.py From 0deca439d3587175435b9d23040367b286d3f3ac Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Wed, 23 Jul 2025 10:46:32 +0100 Subject: [PATCH 3/3] v4l2_encoder: Use the correct field name for timestamp values This follows the videobuf2.h naming convention. Signed-off-by: Naushir Patuck --- picamera2/encoders/v4l2_encoder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/picamera2/encoders/v4l2_encoder.py b/picamera2/encoders/v4l2_encoder.py index 204e1b49..2928edfd 100644 --- a/picamera2/encoders/v4l2_encoder.py +++ b/picamera2/encoders/v4l2_encoder.py @@ -254,7 +254,7 @@ def thread_poll(self, buf_available): b = self.bufs[buf.index][0].read(buf.m.planes[0].bytesused) self.bufs[buf.index][0].seek(0) if self._check_for_picture(b): - self.outputframe(b, keyframe, (buf.timestamp.secs * 1000000) + buf.timestamp.usecs) + self.outputframe(b, keyframe, (buf.timestamp.tv_sec * 1000000) + buf.timestamp.tv_usec) # Requeue encoded buffer buf = v4l2_buffer() @@ -299,8 +299,8 @@ def _encode(self, stream, request): buf.field = V4L2_FIELD_NONE buf.memory = V4L2_MEMORY_DMABUF buf.length = 1 - buf.timestamp.secs = timestamp_us // 1000000 - buf.timestamp.usecs = timestamp_us % 1000000 + buf.timestamp.tv_sec = timestamp_us // 1000000 + buf.timestamp.tv_usec = timestamp_us % 1000000 buf.m.planes = planes buf.m.planes[0].m.fd = fd buf.m.planes[0].bytesused = cfg.frame_size