Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions blueye/sdk/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -996,31 +996,45 @@ def resolution(self) -> int:
"""Set or get the camera resolution.

Args:
resolution (int): Set the camera in vertical pixels. Valid values are 720 or 1080.
resolution (int): Set the camera in vertical pixels. Valid values are 480, 720, 1080,
1440 or 2160.

Returns:
The camera resolution.
"""
self._update_camera_parameters()
if self._camera_parameters.resolution == blueye.protocol.Resolution.RESOLUTION_HD_720P:
if self._camera_parameters.resolution == blueye.protocol.Resolution.RESOLUTION_VGA_480P:
return 480
elif self._camera_parameters.resolution == blueye.protocol.Resolution.RESOLUTION_HD_720P:
return 720
elif (
self._camera_parameters.resolution == blueye.protocol.Resolution.RESOLUTION_FULLHD_1080P
):
return 1080
elif self._camera_parameters.resolution == blueye.protocol.Resolution.RESOLUTION_QHD_2K:
return 1440
elif self._camera_parameters.resolution == blueye.protocol.Resolution.RESOLUTION_UHD_4K:
return 2160

Comment on lines 1005 to 1018
@resolution.setter
def resolution(self, resolution: int):
if resolution not in (720, 1080):
if resolution not in (480, 720, 1080, 1440, 2160):
raise ValueError(
f"{resolution} is not a valid resolution. Valid values are 720 or 1080"
f"{resolution} is not a valid resolution. "
"Valid values are 480, 720, 1080, 1440 or 2160"
)
if self._camera_parameters is None:
self._update_camera_parameters()
if resolution == 720:
if resolution == 480:
self._camera_parameters.resolution = blueye.protocol.Resolution.RESOLUTION_VGA_480P
elif resolution == 720:
self._camera_parameters.resolution = blueye.protocol.Resolution.RESOLUTION_HD_720P
elif resolution == 1080:
self._camera_parameters.resolution = blueye.protocol.Resolution.RESOLUTION_FULLHD_1080P
elif resolution == 1440:
self._camera_parameters.resolution = blueye.protocol.Resolution.RESOLUTION_QHD_2K
elif resolution == 2160:
self._camera_parameters.resolution = blueye.protocol.Resolution.RESOLUTION_UHD_4K

self._parent_drone._req_rep_client.set_camera_parameters(self._camera_parameters)

Expand Down
65 changes: 65 additions & 0 deletions tests/test_camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,71 @@ def test_recording_resolution_invalid_type(mocked_camera):
mocked_camera.recording_resolution = "invalid_resolution"


@pytest.mark.parametrize(
"enum_value, expected",
[
(bp.Resolution.RESOLUTION_VGA_480P, 480),
(bp.Resolution.RESOLUTION_HD_720P, 720),
(bp.Resolution.RESOLUTION_FULLHD_1080P, 1080),
(bp.Resolution.RESOLUTION_QHD_2K, 1440),
(bp.Resolution.RESOLUTION_UHD_4K, 2160),
],
)
def test_resolution_getter(mocked_camera, enum_value, expected):
mocked_camera._parent_drone._req_rep_client.get_camera_parameters.return_value = (
bp.CameraParameters(resolution=enum_value)
)
assert mocked_camera.resolution == expected


@pytest.mark.parametrize(
"value, expected_enum",
[
(480, bp.Resolution.RESOLUTION_VGA_480P),
(720, bp.Resolution.RESOLUTION_HD_720P),
(1080, bp.Resolution.RESOLUTION_FULLHD_1080P),
(1440, bp.Resolution.RESOLUTION_QHD_2K),
(2160, bp.Resolution.RESOLUTION_UHD_4K),
],
)
def test_resolution_setter(mocked_camera, value, expected_enum):
mocked_camera._camera_parameters = bp.CameraParameters()
mocked_camera.resolution = value
assert mocked_camera._camera_parameters.resolution == expected_enum
mocked_camera._parent_drone._req_rep_client.set_camera_parameters.assert_called_once_with(
mocked_camera._camera_parameters
)


def test_resolution_setter_invalid_value(mocked_camera):
with pytest.raises(ValueError):
mocked_camera.resolution = 600


def test_streaming_protocol_getter(mocked_camera):
mocked_camera._parent_drone._req_rep_client.get_camera_parameters.return_value = (
bp.CameraParameters(streaming_protocol=bp.StreamingProtocol.STREAMING_PROTOCOL_RTSP_H264)
)
assert mocked_camera.streaming_protocol == bp.StreamingProtocol.STREAMING_PROTOCOL_RTSP_H264


def test_streaming_protocol_setter(mocked_camera):
mocked_camera._camera_parameters = bp.CameraParameters()
mocked_camera.streaming_protocol = bp.StreamingProtocol.STREAMING_PROTOCOL_RTSP_MJPEG
assert (
mocked_camera._camera_parameters.streaming_protocol
== bp.StreamingProtocol.STREAMING_PROTOCOL_RTSP_MJPEG
)
mocked_camera._parent_drone._req_rep_client.set_camera_parameters.assert_called_once_with(
mocked_camera._camera_parameters
)


def test_streaming_protocol_invalid_type(mocked_camera):
with pytest.raises(ValueError):
mocked_camera.streaming_protocol = "invalid_protocol"


def test_old_drones_use_resolution_field(mocked_camera):
# Set the version to a value that does not support separate recording resolution
mocked_camera._parent_drone.software_version_short = "4.3"
Expand Down
Loading