Message ID | 20200702213654.2129054-3-kieran.bingham@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Kieran, Thanks for your patch. On 2020-07-02 22:36:47 +0100, Kieran Bingham wrote: > Rather than converting pixelformats through the map, and then > dereferencing the iterator later, create a helper to explicitly return a > PixelFormat type. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> > --- > src/android/camera_device.cpp | 28 ++++++++++++++++++++-------- > src/android/camera_device.h | 1 + > 2 files changed, 21 insertions(+), 8 deletions(-) > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > index f788c11e7254..b9031ff0c2a4 100644 > --- a/src/android/camera_device.cpp > +++ b/src/android/camera_device.cpp > @@ -923,6 +923,19 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > return requestTemplate->get(); > } > > +PixelFormat CameraDevice::toPixelFormat(int format) > +{ > + /* Translate Android format code to libcamera pixel format. */ > + auto it = formatsMap_.find(format); > + if (it == formatsMap_.end()) { > + LOG(HAL, Error) << "Requested format " << utils::hex(format) > + << " not supported"; > + return PixelFormat(); > + } > + > + return it->second; > +} > + > /* > * Inspect the stream_list to produce a list of StreamConfiguration to > * be use to configure the Camera. > @@ -932,11 +945,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > for (unsigned int i = 0; i < stream_list->num_streams; ++i) { > camera3_stream_t *stream = stream_list->streams[i]; > > + PixelFormat format = toPixelFormat(stream->format); > + > LOG(HAL, Info) << "Stream #" << i > << ", direction: " << stream->stream_type > << ", width: " << stream->width > << ", height: " << stream->height > - << ", format: " << utils::hex(stream->format); > + << ", format: " << utils::hex(stream->format) > + << " (" << format.toString() << ")"; > } > > /* Only one stream is supported. */ > @@ -947,13 +963,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > camera3_stream_t *camera3Stream = stream_list->streams[0]; > > /* Translate Android format code to libcamera pixel format. */ > - auto it = formatsMap_.find(camera3Stream->format); > - if (it == formatsMap_.end()) { > - LOG(HAL, Error) << "Requested format " > - << utils::hex(camera3Stream->format) > - << " not supported"; > + PixelFormat format = toPixelFormat(camera3Stream->format); > + if (!format.isValid()) > return -EINVAL; > - } > > /* > * Hardcode viewfinder role, replacing the generated configuration > @@ -969,7 +981,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > StreamConfiguration *streamConfiguration = &config_->at(0); > streamConfiguration->size.width = camera3Stream->width; > streamConfiguration->size.height = camera3Stream->height; > - streamConfiguration->pixelFormat = it->second; > + streamConfiguration->pixelFormat = format; > > switch (config_->validate()) { > case CameraConfiguration::Valid: > diff --git a/src/android/camera_device.h b/src/android/camera_device.h > index ed11410a5577..5bd6cf416156 100644 > --- a/src/android/camera_device.h > +++ b/src/android/camera_device.h > @@ -72,6 +72,7 @@ private: > std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize(); > void notifyShutter(uint32_t frameNumber, uint64_t timestamp); > void notifyError(uint32_t frameNumber, camera3_stream_t *stream); > + libcamera::PixelFormat toPixelFormat(int format); > std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, > int64_t timestamp); > > -- > 2.25.1 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
Hi Kieran, On Thu, Jul 02, 2020 at 10:36:47PM +0100, Kieran Bingham wrote: > Rather than converting pixelformats through the map, and then > dereferencing the iterator later, create a helper to explicitly return a > PixelFormat type. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Looks good, thanks Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> > --- > src/android/camera_device.cpp | 28 ++++++++++++++++++++-------- > src/android/camera_device.h | 1 + > 2 files changed, 21 insertions(+), 8 deletions(-) > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > index f788c11e7254..b9031ff0c2a4 100644 > --- a/src/android/camera_device.cpp > +++ b/src/android/camera_device.cpp > @@ -923,6 +923,19 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > return requestTemplate->get(); > } > > +PixelFormat CameraDevice::toPixelFormat(int format) > +{ > + /* Translate Android format code to libcamera pixel format. */ > + auto it = formatsMap_.find(format); > + if (it == formatsMap_.end()) { > + LOG(HAL, Error) << "Requested format " << utils::hex(format) > + << " not supported"; > + return PixelFormat(); > + } > + > + return it->second; > +} > + > /* > * Inspect the stream_list to produce a list of StreamConfiguration to > * be use to configure the Camera. > @@ -932,11 +945,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > for (unsigned int i = 0; i < stream_list->num_streams; ++i) { > camera3_stream_t *stream = stream_list->streams[i]; > > + PixelFormat format = toPixelFormat(stream->format); > + > LOG(HAL, Info) << "Stream #" << i > << ", direction: " << stream->stream_type > << ", width: " << stream->width > << ", height: " << stream->height > - << ", format: " << utils::hex(stream->format); > + << ", format: " << utils::hex(stream->format) > + << " (" << format.toString() << ")"; > } > > /* Only one stream is supported. */ > @@ -947,13 +963,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > camera3_stream_t *camera3Stream = stream_list->streams[0]; > > /* Translate Android format code to libcamera pixel format. */ > - auto it = formatsMap_.find(camera3Stream->format); > - if (it == formatsMap_.end()) { > - LOG(HAL, Error) << "Requested format " > - << utils::hex(camera3Stream->format) > - << " not supported"; > + PixelFormat format = toPixelFormat(camera3Stream->format); > + if (!format.isValid()) > return -EINVAL; > - } > > /* > * Hardcode viewfinder role, replacing the generated configuration > @@ -969,7 +981,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > StreamConfiguration *streamConfiguration = &config_->at(0); > streamConfiguration->size.width = camera3Stream->width; > streamConfiguration->size.height = camera3Stream->height; > - streamConfiguration->pixelFormat = it->second; > + streamConfiguration->pixelFormat = format; > > switch (config_->validate()) { > case CameraConfiguration::Valid: > diff --git a/src/android/camera_device.h b/src/android/camera_device.h > index ed11410a5577..5bd6cf416156 100644 > --- a/src/android/camera_device.h > +++ b/src/android/camera_device.h > @@ -72,6 +72,7 @@ private: > std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize(); > void notifyShutter(uint32_t frameNumber, uint64_t timestamp); > void notifyError(uint32_t frameNumber, camera3_stream_t *stream); > + libcamera::PixelFormat toPixelFormat(int format); > std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, > int64_t timestamp); > > -- > 2.25.1 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
Sorry, one nit On Thu, Jul 02, 2020 at 10:36:47PM +0100, Kieran Bingham wrote: > Rather than converting pixelformats through the map, and then > dereferencing the iterator later, create a helper to explicitly return a > PixelFormat type. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > src/android/camera_device.cpp | 28 ++++++++++++++++++++-------- > src/android/camera_device.h | 1 + > 2 files changed, 21 insertions(+), 8 deletions(-) > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > index f788c11e7254..b9031ff0c2a4 100644 > --- a/src/android/camera_device.cpp > +++ b/src/android/camera_device.cpp > @@ -923,6 +923,19 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > return requestTemplate->get(); > } > > +PixelFormat CameraDevice::toPixelFormat(int format) > +{ > + /* Translate Android format code to libcamera pixel format. */ > + auto it = formatsMap_.find(format); > + if (it == formatsMap_.end()) { > + LOG(HAL, Error) << "Requested format " << utils::hex(format) > + << " not supported"; > + return PixelFormat(); > + } > + > + return it->second; > +} > + > /* > * Inspect the stream_list to produce a list of StreamConfiguration to > * be use to configure the Camera. > @@ -932,11 +945,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > for (unsigned int i = 0; i < stream_list->num_streams; ++i) { > camera3_stream_t *stream = stream_list->streams[i]; > > + PixelFormat format = toPixelFormat(stream->format); > + > LOG(HAL, Info) << "Stream #" << i > << ", direction: " << stream->stream_type > << ", width: " << stream->width > << ", height: " << stream->height > - << ", format: " << utils::hex(stream->format); > + << ", format: " << utils::hex(stream->format) > + << " (" << format.toString() << ")"; Is it a good idea to report the mapped format when priting information about the android requested streams ? Just wondering... > } > > /* Only one stream is supported. */ > @@ -947,13 +963,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > camera3_stream_t *camera3Stream = stream_list->streams[0]; > > /* Translate Android format code to libcamera pixel format. */ > - auto it = formatsMap_.find(camera3Stream->format); > - if (it == formatsMap_.end()) { > - LOG(HAL, Error) << "Requested format " > - << utils::hex(camera3Stream->format) > - << " not supported"; > + PixelFormat format = toPixelFormat(camera3Stream->format); > + if (!format.isValid()) > return -EINVAL; > - } > > /* > * Hardcode viewfinder role, replacing the generated configuration > @@ -969,7 +981,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > StreamConfiguration *streamConfiguration = &config_->at(0); > streamConfiguration->size.width = camera3Stream->width; > streamConfiguration->size.height = camera3Stream->height; > - streamConfiguration->pixelFormat = it->second; > + streamConfiguration->pixelFormat = format; > > switch (config_->validate()) { > case CameraConfiguration::Valid: > diff --git a/src/android/camera_device.h b/src/android/camera_device.h > index ed11410a5577..5bd6cf416156 100644 > --- a/src/android/camera_device.h > +++ b/src/android/camera_device.h > @@ -72,6 +72,7 @@ private: > std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize(); > void notifyShutter(uint32_t frameNumber, uint64_t timestamp); > void notifyError(uint32_t frameNumber, camera3_stream_t *stream); > + libcamera::PixelFormat toPixelFormat(int format); > std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, > int64_t timestamp); > > -- > 2.25.1 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
Hi Jacopo, On 03/07/2020 10:04, Jacopo Mondi wrote: > Sorry, one nit > > On Thu, Jul 02, 2020 at 10:36:47PM +0100, Kieran Bingham wrote: >> Rather than converting pixelformats through the map, and then >> dereferencing the iterator later, create a helper to explicitly return a >> PixelFormat type. >> >> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> >> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> >> --- >> src/android/camera_device.cpp | 28 ++++++++++++++++++++-------- >> src/android/camera_device.h | 1 + >> 2 files changed, 21 insertions(+), 8 deletions(-) >> >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp >> index f788c11e7254..b9031ff0c2a4 100644 >> --- a/src/android/camera_device.cpp >> +++ b/src/android/camera_device.cpp >> @@ -923,6 +923,19 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) >> return requestTemplate->get(); >> } >> >> +PixelFormat CameraDevice::toPixelFormat(int format) >> +{ >> + /* Translate Android format code to libcamera pixel format. */ >> + auto it = formatsMap_.find(format); >> + if (it == formatsMap_.end()) { >> + LOG(HAL, Error) << "Requested format " << utils::hex(format) >> + << " not supported"; >> + return PixelFormat(); >> + } >> + >> + return it->second; >> +} >> + >> /* >> * Inspect the stream_list to produce a list of StreamConfiguration to >> * be use to configure the Camera. >> @@ -932,11 +945,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) >> for (unsigned int i = 0; i < stream_list->num_streams; ++i) { >> camera3_stream_t *stream = stream_list->streams[i]; >> >> + PixelFormat format = toPixelFormat(stream->format); >> + >> LOG(HAL, Info) << "Stream #" << i >> << ", direction: " << stream->stream_type >> << ", width: " << stream->width >> << ", height: " << stream->height >> - << ", format: " << utils::hex(stream->format); >> + << ", format: " << utils::hex(stream->format) >> + << " (" << format.toString() << ")"; > > Is it a good idea to report the mapped format when priting information > about the android requested streams ? Just wondering... > It certainly helps to know what the stream configurations are: Without: > <line-prefix-snip> Stream #0, direction: 0, width: 2560, height: 1920, format: 0x00000023 > <line-prefix-snip> Stream #1, direction: 0, width: 2560, height: 1920, format: 0x00000021 With: > <line-prefix-snip> Stream #0, direction: 0, width: 2560, height: 1920, format: 0x00000023 (NV12) > <line-prefix-snip> Stream #1, direction: 0, width: 2560, height: 1920, format: 0x00000021 (MJPEG) Otherwise, we can add a toString() on the android formats of course, But it also really helps in the cros-camera-tests too to see when a format is requested that we don't yet handle: > <line-prefix-snip> Stream #0, direction: 0, width: 320, height: 240, format: 0x20203859 (<INVALID>) -- Kieran >> } >> >> /* Only one stream is supported. */ >> @@ -947,13 +963,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) >> camera3_stream_t *camera3Stream = stream_list->streams[0]; >> >> /* Translate Android format code to libcamera pixel format. */ >> - auto it = formatsMap_.find(camera3Stream->format); >> - if (it == formatsMap_.end()) { >> - LOG(HAL, Error) << "Requested format " >> - << utils::hex(camera3Stream->format) >> - << " not supported"; >> + PixelFormat format = toPixelFormat(camera3Stream->format); >> + if (!format.isValid()) >> return -EINVAL; >> - } >> >> /* >> * Hardcode viewfinder role, replacing the generated configuration >> @@ -969,7 +981,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) >> StreamConfiguration *streamConfiguration = &config_->at(0); >> streamConfiguration->size.width = camera3Stream->width; >> streamConfiguration->size.height = camera3Stream->height; >> - streamConfiguration->pixelFormat = it->second; >> + streamConfiguration->pixelFormat = format; >> >> switch (config_->validate()) { >> case CameraConfiguration::Valid: >> diff --git a/src/android/camera_device.h b/src/android/camera_device.h >> index ed11410a5577..5bd6cf416156 100644 >> --- a/src/android/camera_device.h >> +++ b/src/android/camera_device.h >> @@ -72,6 +72,7 @@ private: >> std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize(); >> void notifyShutter(uint32_t frameNumber, uint64_t timestamp); >> void notifyError(uint32_t frameNumber, camera3_stream_t *stream); >> + libcamera::PixelFormat toPixelFormat(int format); >> std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, >> int64_t timestamp); >> >> -- >> 2.25.1 >> >> _______________________________________________ >> libcamera-devel mailing list >> libcamera-devel@lists.libcamera.org >> https://lists.libcamera.org/listinfo/libcamera-devel
Hi Kieran On Fri, Jul 03, 2020 at 10:19:58AM +0100, Kieran Bingham wrote: > Hi Jacopo, > > > On 03/07/2020 10:04, Jacopo Mondi wrote: > > Sorry, one nit > > > > On Thu, Jul 02, 2020 at 10:36:47PM +0100, Kieran Bingham wrote: > >> Rather than converting pixelformats through the map, and then > >> dereferencing the iterator later, create a helper to explicitly return a > >> PixelFormat type. > >> > >> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > >> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > >> --- > >> src/android/camera_device.cpp | 28 ++++++++++++++++++++-------- > >> src/android/camera_device.h | 1 + > >> 2 files changed, 21 insertions(+), 8 deletions(-) > >> > >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > >> index f788c11e7254..b9031ff0c2a4 100644 > >> --- a/src/android/camera_device.cpp > >> +++ b/src/android/camera_device.cpp > >> @@ -923,6 +923,19 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > >> return requestTemplate->get(); > >> } > >> > >> +PixelFormat CameraDevice::toPixelFormat(int format) > >> +{ > >> + /* Translate Android format code to libcamera pixel format. */ > >> + auto it = formatsMap_.find(format); > >> + if (it == formatsMap_.end()) { > >> + LOG(HAL, Error) << "Requested format " << utils::hex(format) > >> + << " not supported"; > >> + return PixelFormat(); > >> + } > >> + > >> + return it->second; > >> +} > >> + > >> /* > >> * Inspect the stream_list to produce a list of StreamConfiguration to > >> * be use to configure the Camera. > >> @@ -932,11 +945,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > >> for (unsigned int i = 0; i < stream_list->num_streams; ++i) { > >> camera3_stream_t *stream = stream_list->streams[i]; > >> > >> + PixelFormat format = toPixelFormat(stream->format); > >> + > >> LOG(HAL, Info) << "Stream #" << i > >> << ", direction: " << stream->stream_type > >> << ", width: " << stream->width > >> << ", height: " << stream->height > >> - << ", format: " << utils::hex(stream->format); > >> + << ", format: " << utils::hex(stream->format) > >> + << " (" << format.toString() << ")"; > > > > Is it a good idea to report the mapped format when priting information > > about the android requested streams ? Just wondering... > > > > It certainly helps to know what the stream configurations are: > > Without: > > > <line-prefix-snip> Stream #0, direction: 0, width: 2560, height: 1920, format: 0x00000023 > > <line-prefix-snip> Stream #1, direction: 0, width: 2560, height: 1920, format: 0x00000021 > > With: > > > <line-prefix-snip> Stream #0, direction: 0, width: 2560, height: 1920, format: 0x00000023 (NV12) > > <line-prefix-snip> Stream #1, direction: 0, width: 2560, height: 1920, format: 0x00000021 (MJPEG) > > > Otherwise, we can add a toString() on the android formats of course, > > But it also really helps in the cros-camera-tests too to see when a > format is requested that we don't yet handle: > > > <line-prefix-snip> Stream #0, direction: 0, width: 320, height: 240, format: 0x20203859 (<INVALID>) > All good, it was an honest question as the mapping is something we implement, not something provided by the framework, and initially the printout was meant to indentify what we receive > -- > Kieran > > > > >> } > >> > >> /* Only one stream is supported. */ > >> @@ -947,13 +963,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > >> camera3_stream_t *camera3Stream = stream_list->streams[0]; > >> > >> /* Translate Android format code to libcamera pixel format. */ > >> - auto it = formatsMap_.find(camera3Stream->format); > >> - if (it == formatsMap_.end()) { > >> - LOG(HAL, Error) << "Requested format " > >> - << utils::hex(camera3Stream->format) > >> - << " not supported"; > >> + PixelFormat format = toPixelFormat(camera3Stream->format); > >> + if (!format.isValid()) > >> return -EINVAL; > >> - } > >> > >> /* > >> * Hardcode viewfinder role, replacing the generated configuration > >> @@ -969,7 +981,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) > >> StreamConfiguration *streamConfiguration = &config_->at(0); > >> streamConfiguration->size.width = camera3Stream->width; > >> streamConfiguration->size.height = camera3Stream->height; > >> - streamConfiguration->pixelFormat = it->second; > >> + streamConfiguration->pixelFormat = format; > >> > >> switch (config_->validate()) { > >> case CameraConfiguration::Valid: > >> diff --git a/src/android/camera_device.h b/src/android/camera_device.h > >> index ed11410a5577..5bd6cf416156 100644 > >> --- a/src/android/camera_device.h > >> +++ b/src/android/camera_device.h > >> @@ -72,6 +72,7 @@ private: > >> std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize(); > >> void notifyShutter(uint32_t frameNumber, uint64_t timestamp); > >> void notifyError(uint32_t frameNumber, camera3_stream_t *stream); > >> + libcamera::PixelFormat toPixelFormat(int format); > >> std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, > >> int64_t timestamp); > >> > >> -- > >> 2.25.1 > >> > >> _______________________________________________ > >> libcamera-devel mailing list > >> libcamera-devel@lists.libcamera.org > >> https://lists.libcamera.org/listinfo/libcamera-devel > > -- > Regards > -- > Kieran
Hi Jacopo, On 03/07/2020 10:40, Jacopo Mondi wrote: > Hi Kieran > > On Fri, Jul 03, 2020 at 10:19:58AM +0100, Kieran Bingham wrote: >> Hi Jacopo, >> >> >> On 03/07/2020 10:04, Jacopo Mondi wrote: >>> Sorry, one nit >>> >>> On Thu, Jul 02, 2020 at 10:36:47PM +0100, Kieran Bingham wrote: >>>> Rather than converting pixelformats through the map, and then >>>> dereferencing the iterator later, create a helper to explicitly return a >>>> PixelFormat type. >>>> >>>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> >>>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> >>>> --- >>>> src/android/camera_device.cpp | 28 ++++++++++++++++++++-------- >>>> src/android/camera_device.h | 1 + >>>> 2 files changed, 21 insertions(+), 8 deletions(-) >>>> >>>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp >>>> index f788c11e7254..b9031ff0c2a4 100644 >>>> --- a/src/android/camera_device.cpp >>>> +++ b/src/android/camera_device.cpp >>>> @@ -923,6 +923,19 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) >>>> return requestTemplate->get(); >>>> } >>>> >>>> +PixelFormat CameraDevice::toPixelFormat(int format) >>>> +{ >>>> + /* Translate Android format code to libcamera pixel format. */ >>>> + auto it = formatsMap_.find(format); >>>> + if (it == formatsMap_.end()) { >>>> + LOG(HAL, Error) << "Requested format " << utils::hex(format) >>>> + << " not supported"; >>>> + return PixelFormat(); >>>> + } >>>> + >>>> + return it->second; >>>> +} >>>> + >>>> /* >>>> * Inspect the stream_list to produce a list of StreamConfiguration to >>>> * be use to configure the Camera. >>>> @@ -932,11 +945,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) >>>> for (unsigned int i = 0; i < stream_list->num_streams; ++i) { >>>> camera3_stream_t *stream = stream_list->streams[i]; >>>> >>>> + PixelFormat format = toPixelFormat(stream->format); >>>> + >>>> LOG(HAL, Info) << "Stream #" << i >>>> << ", direction: " << stream->stream_type >>>> << ", width: " << stream->width >>>> << ", height: " << stream->height >>>> - << ", format: " << utils::hex(stream->format); >>>> + << ", format: " << utils::hex(stream->format) >>>> + << " (" << format.toString() << ")"; >>> >>> Is it a good idea to report the mapped format when priting information >>> about the android requested streams ? Just wondering... >>> >> >> It certainly helps to know what the stream configurations are: >> >> Without: >> >>> <line-prefix-snip> Stream #0, direction: 0, width: 2560, height: 1920, format: 0x00000023 >>> <line-prefix-snip> Stream #1, direction: 0, width: 2560, height: 1920, format: 0x00000021 >> >> With: >> >>> <line-prefix-snip> Stream #0, direction: 0, width: 2560, height: 1920, format: 0x00000023 (NV12) >>> <line-prefix-snip> Stream #1, direction: 0, width: 2560, height: 1920, format: 0x00000021 (MJPEG) >> >> >> Otherwise, we can add a toString() on the android formats of course, >> >> But it also really helps in the cros-camera-tests too to see when a >> format is requested that we don't yet handle: >> >>> <line-prefix-snip> Stream #0, direction: 0, width: 320, height: 240, format: 0x20203859 (<INVALID>) >> > > All good, it was an honest question as the mapping is something we > implement, not something provided by the framework, and initially the > printout was meant to indentify what we receive I understand, I hope the () help identify that distinction. I feel it's very useful to know at the point we print all the requested streams what format /we/ interpret that to be though. I'd probably like to see the 0x20203859 converted to the relevant android string too, but still keep the libcamera conversion (we have to convert it anyway) so we know if we were able to map successfully or not. Still, that can happen later if we need to go that far. > >> -- >> Kieran >> >> >> >>>> } >>>> >>>> /* Only one stream is supported. */ >>>> @@ -947,13 +963,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) >>>> camera3_stream_t *camera3Stream = stream_list->streams[0]; >>>> >>>> /* Translate Android format code to libcamera pixel format. */ >>>> - auto it = formatsMap_.find(camera3Stream->format); >>>> - if (it == formatsMap_.end()) { >>>> - LOG(HAL, Error) << "Requested format " >>>> - << utils::hex(camera3Stream->format) >>>> - << " not supported"; >>>> + PixelFormat format = toPixelFormat(camera3Stream->format); >>>> + if (!format.isValid()) >>>> return -EINVAL; >>>> - } >>>> >>>> /* >>>> * Hardcode viewfinder role, replacing the generated configuration >>>> @@ -969,7 +981,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) >>>> StreamConfiguration *streamConfiguration = &config_->at(0); >>>> streamConfiguration->size.width = camera3Stream->width; >>>> streamConfiguration->size.height = camera3Stream->height; >>>> - streamConfiguration->pixelFormat = it->second; >>>> + streamConfiguration->pixelFormat = format; >>>> >>>> switch (config_->validate()) { >>>> case CameraConfiguration::Valid: >>>> diff --git a/src/android/camera_device.h b/src/android/camera_device.h >>>> index ed11410a5577..5bd6cf416156 100644 >>>> --- a/src/android/camera_device.h >>>> +++ b/src/android/camera_device.h >>>> @@ -72,6 +72,7 @@ private: >>>> std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize(); >>>> void notifyShutter(uint32_t frameNumber, uint64_t timestamp); >>>> void notifyError(uint32_t frameNumber, camera3_stream_t *stream); >>>> + libcamera::PixelFormat toPixelFormat(int format); >>>> std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, >>>> int64_t timestamp); >>>> >>>> -- >>>> 2.25.1 >>>> >>>> _______________________________________________ >>>> libcamera-devel mailing list >>>> libcamera-devel@lists.libcamera.org >>>> https://lists.libcamera.org/listinfo/libcamera-devel >> >> -- >> Regards >> -- >> Kieran
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index f788c11e7254..b9031ff0c2a4 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -923,6 +923,19 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) return requestTemplate->get(); } +PixelFormat CameraDevice::toPixelFormat(int format) +{ + /* Translate Android format code to libcamera pixel format. */ + auto it = formatsMap_.find(format); + if (it == formatsMap_.end()) { + LOG(HAL, Error) << "Requested format " << utils::hex(format) + << " not supported"; + return PixelFormat(); + } + + return it->second; +} + /* * Inspect the stream_list to produce a list of StreamConfiguration to * be use to configure the Camera. @@ -932,11 +945,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) for (unsigned int i = 0; i < stream_list->num_streams; ++i) { camera3_stream_t *stream = stream_list->streams[i]; + PixelFormat format = toPixelFormat(stream->format); + LOG(HAL, Info) << "Stream #" << i << ", direction: " << stream->stream_type << ", width: " << stream->width << ", height: " << stream->height - << ", format: " << utils::hex(stream->format); + << ", format: " << utils::hex(stream->format) + << " (" << format.toString() << ")"; } /* Only one stream is supported. */ @@ -947,13 +963,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) camera3_stream_t *camera3Stream = stream_list->streams[0]; /* Translate Android format code to libcamera pixel format. */ - auto it = formatsMap_.find(camera3Stream->format); - if (it == formatsMap_.end()) { - LOG(HAL, Error) << "Requested format " - << utils::hex(camera3Stream->format) - << " not supported"; + PixelFormat format = toPixelFormat(camera3Stream->format); + if (!format.isValid()) return -EINVAL; - } /* * Hardcode viewfinder role, replacing the generated configuration @@ -969,7 +981,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) StreamConfiguration *streamConfiguration = &config_->at(0); streamConfiguration->size.width = camera3Stream->width; streamConfiguration->size.height = camera3Stream->height; - streamConfiguration->pixelFormat = it->second; + streamConfiguration->pixelFormat = format; switch (config_->validate()) { case CameraConfiguration::Valid: diff --git a/src/android/camera_device.h b/src/android/camera_device.h index ed11410a5577..5bd6cf416156 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -72,6 +72,7 @@ private: std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize(); void notifyShutter(uint32_t frameNumber, uint64_t timestamp); void notifyError(uint32_t frameNumber, camera3_stream_t *stream); + libcamera::PixelFormat toPixelFormat(int format); std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, int64_t timestamp);