Skip to content

Commit

Permalink
android: camera_device: Update gralloc usage flags for streams
Browse files Browse the repository at this point in the history
When configuring streams, the camera HAL is supposed to update the
gralloc usage flags to reflect the operations it will need to do on the
stream buffers. Failure to do so leads to incorrect format selection by
gralloc for the HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED format, as
gralloc will not take into consideration the need of the camera to
access the buffers.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
  • Loading branch information
pinchartl committed Mar 5, 2021
1 parent 38f7c2a commit de1b994
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion src/android/camera_device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1539,6 +1539,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
streamConfig.config.size = size;
streamConfig.config.pixelFormat = format;
streamConfigs.push_back(std::move(streamConfig));

/* This stream will be produced by hardware. */
stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE;
}

/* Now handle the MJPEG streams, adding a new stream if required. */
Expand All @@ -1548,7 +1551,8 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)

/* Search for a compatible stream in the non-JPEG ones. */
for (size_t i = 0; i < streamConfigs.size(); ++i) {
const auto &cfg = streamConfigs[i].config;
Camera3StreamConfig &streamConfig = streamConfigs[i];
const auto &cfg = streamConfig.config;

/*
* \todo The PixelFormat must also be compatible with
Expand All @@ -1563,6 +1567,13 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)

type = CameraStream::Type::Mapped;
index = i;

/*
* The source stream will be read by software to
* produce the JPEG stream.
*/
camera3_stream_t *stream = streamConfig.streams[0].stream;
stream->usage |= GRALLOC_USAGE_SW_READ_OFTEN;
break;
}

Expand Down Expand Up @@ -1590,6 +1601,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
index = streamConfigs.size() - 1;
}

/* The JPEG stream will be produced by software. */
jpegStream->usage |= GRALLOC_USAGE_SW_WRITE_OFTEN;

streamConfigs[index].streams.push_back({ jpegStream, type });
}

Expand Down

0 comments on commit de1b994

Please sign in to comment.