libcamera: vimc: Fill stride and frameSize at config validation

Fill the stride and frameSize fields of the StreamConfiguration at
configuration validation time instead of at camera configuration time.
This allows applications to get the stride when trying a configuration
without modifying the active configuration of the camera.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Paul Elder 2020-07-04 17:56:47 +09:00
parent d0395efd3a
commit 7c3831d2d1

View file

@ -72,9 +72,12 @@ public:
class VimcCameraConfiguration : public CameraConfiguration class VimcCameraConfiguration : public CameraConfiguration
{ {
public: public:
VimcCameraConfiguration(); VimcCameraConfiguration(VimcCameraData *data);
Status validate() override; Status validate() override;
private:
VimcCameraData *data_;
}; };
class PipelineHandlerVimc : public PipelineHandler class PipelineHandlerVimc : public PipelineHandler
@ -115,8 +118,8 @@ static const std::map<PixelFormat, uint32_t> pixelformats{
} /* namespace */ } /* namespace */
VimcCameraConfiguration::VimcCameraConfiguration() VimcCameraConfiguration::VimcCameraConfiguration(VimcCameraData *data)
: CameraConfiguration() : CameraConfiguration(), data_(data)
{ {
} }
@ -160,6 +163,17 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()
cfg.bufferCount = 4; cfg.bufferCount = 4;
V4L2DeviceFormat format = {};
format.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);
format.size = cfg.size;
int ret = data_->video_->tryFormat(&format);
if (ret)
return Invalid;
cfg.stride = format.planes[0].bpl;
cfg.frameSize = format.planes[0].size;
return status; return status;
} }
@ -171,8 +185,8 @@ PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager)
CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera, CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
const StreamRoles &roles) const StreamRoles &roles)
{ {
CameraConfiguration *config = new VimcCameraConfiguration();
VimcCameraData *data = cameraData(camera); VimcCameraData *data = cameraData(camera);
CameraConfiguration *config = new VimcCameraConfiguration(data);
if (roles.empty()) if (roles.empty())
return config; return config;
@ -282,7 +296,6 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)
return ret; return ret;
cfg.setStream(&data->stream_); cfg.setStream(&data->stream_);
cfg.stride = format.planes[0].bpl;
return 0; return 0;
} }