Message ID | 20220110165524.72978-5-jacopo@jmondi.org |
---|---|
State | Accepted |
Delegated to: | Jacopo Mondi |
Headers | show |
Series |
|
Related | show |
Hi Jacopo, On Tue, Jan 11, 2022 at 1:54 AM Jacopo Mondi <jacopo@jmondi.org> wrote: > > From: Hirokazu Honda <hiroh@chromium.org> > > When creating the list of StreamConfiguration to be requested to the camera, > map NV12 streams of equal size and format together, so that they will be > generated by using the YUV post-processor. > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Would you mind adding Signed-off-by: Hirokazu Honda <hiroh@chromium.org>? Best Regards, -Hiro > --- > src/android/camera_device.cpp | 32 +++++++++++++++++++++++++++++--- > 1 file changed, 29 insertions(+), 3 deletions(-) > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > index a44f199d25d8..4e44bcfa0852 100644 > --- a/src/android/camera_device.cpp > +++ b/src/android/camera_device.cpp > @@ -605,14 +605,40 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > continue; > } > > + /* > + * While gralloc usage flags are supposed to report usage > + * patterns to select a suitable buffer allocation strategy, in > + * practice they're also used to make other decisions, such as > + * selecting the actual format for the IMPLEMENTATION_DEFINED > + * HAL pixel format. To avoid issues, we thus have to set the > + * GRALLOC_USAGE_HW_CAMERA_WRITE flag unconditionally, even for > + * streams that will be produced in software. > + */ > + stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE; > + > + /* > + * If a CameraStream with the same size and format of the > + * current stream has already been requested, associate the two. > + */ > + auto iter = std::find_if( > + streamConfigs.begin(), streamConfigs.end(), > + [&size, &format](const Camera3StreamConfig &streamConfig) { > + return streamConfig.config.size == size && > + streamConfig.config.pixelFormat == format; > + }); > + if (iter != streamConfigs.end()) { > + /* Add usage to copy the buffer in streams[0] to stream. */ > + iter->streams[0].stream->usage |= GRALLOC_USAGE_SW_READ_OFTEN; > + stream->usage |= GRALLOC_USAGE_SW_WRITE_OFTEN; > + iter->streams.push_back({ stream, CameraStream::Type::Mapped }); > + continue; > + } > + > Camera3StreamConfig streamConfig; > streamConfig.streams = { { stream, CameraStream::Type::Direct } }; > 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. */ > -- > 2.34.1 >
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index a44f199d25d8..4e44bcfa0852 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -605,14 +605,40 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) continue; } + /* + * While gralloc usage flags are supposed to report usage + * patterns to select a suitable buffer allocation strategy, in + * practice they're also used to make other decisions, such as + * selecting the actual format for the IMPLEMENTATION_DEFINED + * HAL pixel format. To avoid issues, we thus have to set the + * GRALLOC_USAGE_HW_CAMERA_WRITE flag unconditionally, even for + * streams that will be produced in software. + */ + stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE; + + /* + * If a CameraStream with the same size and format of the + * current stream has already been requested, associate the two. + */ + auto iter = std::find_if( + streamConfigs.begin(), streamConfigs.end(), + [&size, &format](const Camera3StreamConfig &streamConfig) { + return streamConfig.config.size == size && + streamConfig.config.pixelFormat == format; + }); + if (iter != streamConfigs.end()) { + /* Add usage to copy the buffer in streams[0] to stream. */ + iter->streams[0].stream->usage |= GRALLOC_USAGE_SW_READ_OFTEN; + stream->usage |= GRALLOC_USAGE_SW_WRITE_OFTEN; + iter->streams.push_back({ stream, CameraStream::Type::Mapped }); + continue; + } + Camera3StreamConfig streamConfig; streamConfig.streams = { { stream, CameraStream::Type::Direct } }; 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. */