Ensure camera controls are read from the camera when changing stream
This commit is contained in:
parent
c7d84e2674
commit
bc7204f554
1 changed files with 15 additions and 2 deletions
|
|
@ -432,11 +432,15 @@ class StreamingPiCamera2(BaseCamera, ABC):
|
||||||
def _create_picam_config_from_mode_info(
|
def _create_picam_config_from_mode_info(
|
||||||
self,
|
self,
|
||||||
picam: Picamera2,
|
picam: Picamera2,
|
||||||
|
controls: dict[str, Any],
|
||||||
mode_info: PiCamera2StreamingMode,
|
mode_info: PiCamera2StreamingMode,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
"""Create the dictionary to pass to ``Picamera2.configure``."""
|
"""Create the dictionary to pass to ``Picamera2.configure``.
|
||||||
controls = self._get_persistent_controls()
|
|
||||||
|
|
||||||
|
:param controls: The controls for the camera. Note that running
|
||||||
|
``_get_persistent_controls()`` should be done before getting the picamera
|
||||||
|
lock to ensure that the current settings are read from the camera.
|
||||||
|
"""
|
||||||
if mode_info.scaler_crop is not None:
|
if mode_info.scaler_crop is not None:
|
||||||
controls["ScalerCrop"] = mode_info.scaler_crop
|
controls["ScalerCrop"] = mode_info.scaler_crop
|
||||||
|
|
||||||
|
|
@ -465,6 +469,9 @@ class StreamingPiCamera2(BaseCamera, ABC):
|
||||||
raise ValueError(f"Unknown mode {mode}")
|
raise ValueError(f"Unknown mode {mode}")
|
||||||
self.streaming_mode = mode
|
self.streaming_mode = mode
|
||||||
|
|
||||||
|
# This must be before getting the picamera hardware lock.
|
||||||
|
controls = self._get_persistent_controls()
|
||||||
|
|
||||||
mode_info = self.streaming_modes[mode]
|
mode_info = self.streaming_modes[mode]
|
||||||
|
|
||||||
with self._streaming_picamera() as picam:
|
with self._streaming_picamera() as picam:
|
||||||
|
|
@ -474,6 +481,7 @@ class StreamingPiCamera2(BaseCamera, ABC):
|
||||||
picam.stop_encoder() # make sure there are no other encoders going
|
picam.stop_encoder() # make sure there are no other encoders going
|
||||||
stream_config = self._create_picam_config_from_mode_info(
|
stream_config = self._create_picam_config_from_mode_info(
|
||||||
picam=picam,
|
picam=picam,
|
||||||
|
controls=controls,
|
||||||
mode_info=mode_info,
|
mode_info=mode_info,
|
||||||
)
|
)
|
||||||
picam.configure(stream_config)
|
picam.configure(stream_config)
|
||||||
|
|
@ -540,10 +548,15 @@ class StreamingPiCamera2(BaseCamera, ABC):
|
||||||
yield cam
|
yield cam
|
||||||
else:
|
else:
|
||||||
streaming_mode_info = self.streaming_modes[required_streaming_mode]
|
streaming_mode_info = self.streaming_modes[required_streaming_mode]
|
||||||
|
|
||||||
|
# This must be before getting the picamera hardware lock.
|
||||||
|
controls = self._get_persistent_controls()
|
||||||
|
|
||||||
with self._streaming_picamera(pause_stream=True) as cam:
|
with self._streaming_picamera(pause_stream=True) as cam:
|
||||||
LOGGER.debug("Reconfiguring camera for full resolution capture")
|
LOGGER.debug("Reconfiguring camera for full resolution capture")
|
||||||
stream_config = self._create_picam_config_from_mode_info(
|
stream_config = self._create_picam_config_from_mode_info(
|
||||||
picam=cam,
|
picam=cam,
|
||||||
|
controls=controls,
|
||||||
mode_info=streaming_mode_info,
|
mode_info=streaming_mode_info,
|
||||||
)
|
)
|
||||||
cam.configure(stream_config)
|
cam.configure(stream_config)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue