Message ID | 20200714104212.48683-10-jacopo@jmondi.org |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Jacopo, Thank you for the patch. On Tue, Jul 14, 2020 at 12:42:01PM +0200, Jacopo Mondi wrote: > Report StreamFormats associated to each StreamConfiguration generated > by the IPU3 pipeline handler. > > The StreamFormats are generated differently for RAW and processed > streams, with the former using the sensor enumerated resolutions and > the latter using a continuous range of sizes constructed by matching the > sensor capabilities with the platform constraints. > > Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > src/libcamera/pipeline/ipu3/ipu3.cpp | 45 +++++++++++++++++++--------- > 1 file changed, 31 insertions(+), 14 deletions(-) > > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp > index 517d9bd11fbf..b480d41f89ab 100644 > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp > @@ -313,7 +313,10 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, > > Size sensorResolution = data->cio2_.sensor()->resolution(); > for (const StreamRole role : roles) { > - StreamConfiguration cfg = {}; > + std::map<PixelFormat, std::vector<SizeRange>> streamFormats; > + unsigned int bufferCount; > + PixelFormat pixelFormat; > + Size size; > > switch (role) { > case StreamRole::StillCapture: > @@ -322,18 +325,26 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, > * output constraints and required frame margin > * by rounding down to the closest alignment. > */ > - cfg.size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE); > - cfg.size.width = utils::alignDown(cfg.size.width - 1, > - IMGU_OUTPUT_WIDTH_MARGIN); > - cfg.size.height = utils::alignDown(cfg.size.height - 1, > - IMGU_OUTPUT_HEIGHT_MARGIN); > - cfg.pixelFormat = formats::NV12; > - cfg.bufferCount = IPU3_BUFFER_COUNT; > + size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE); > + size.width = utils::alignDown(size.width - 1, > + IMGU_OUTPUT_WIDTH_MARGIN); > + size.height = utils::alignDown(size.height - 1, > + IMGU_OUTPUT_HEIGHT_MARGIN); > + pixelFormat = formats::NV12; > + bufferCount = IPU3_BUFFER_COUNT; > + streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } }; > > break; > > case StreamRole::StillCaptureRaw: { > - cfg = data->cio2_.generateConfiguration(sensorResolution); > + StreamConfiguration cio2Config = > + data->cio2_.generateConfiguration(sensorResolution); > + pixelFormat = cio2Config.pixelFormat; > + size = cio2Config.size; > + bufferCount = cio2Config.bufferCount; > + > + for (const PixelFormat &format : data->cio2_.formats()) > + streamFormats[format] = data->cio2_.sizes(); > > break; > } > @@ -345,11 +356,12 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, > * capped to the maximum sensor resolution and aligned > * to the ImgU output constraints. > */ > - cfg.size = sensorResolution.boundedTo({ 1280, 720 }) > - .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN, > - IMGU_OUTPUT_HEIGHT_ALIGN); > - cfg.pixelFormat = formats::NV12; > - cfg.bufferCount = IPU3_BUFFER_COUNT; > + size = sensorResolution.boundedTo({ 1280, 720 }) > + .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN, > + IMGU_OUTPUT_HEIGHT_ALIGN); > + pixelFormat = formats::NV12; > + bufferCount = IPU3_BUFFER_COUNT; > + streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } }; > > break; > } > @@ -361,6 +373,11 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, > return nullptr; > } > > + StreamFormats formats(streamFormats); > + StreamConfiguration cfg(formats); > + cfg.size = size; > + cfg.pixelFormat = pixelFormat; > + cfg.bufferCount = bufferCount; > config->addConfiguration(cfg); > } >
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 517d9bd11fbf..b480d41f89ab 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -313,7 +313,10 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, Size sensorResolution = data->cio2_.sensor()->resolution(); for (const StreamRole role : roles) { - StreamConfiguration cfg = {}; + std::map<PixelFormat, std::vector<SizeRange>> streamFormats; + unsigned int bufferCount; + PixelFormat pixelFormat; + Size size; switch (role) { case StreamRole::StillCapture: @@ -322,18 +325,26 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, * output constraints and required frame margin * by rounding down to the closest alignment. */ - cfg.size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE); - cfg.size.width = utils::alignDown(cfg.size.width - 1, - IMGU_OUTPUT_WIDTH_MARGIN); - cfg.size.height = utils::alignDown(cfg.size.height - 1, - IMGU_OUTPUT_HEIGHT_MARGIN); - cfg.pixelFormat = formats::NV12; - cfg.bufferCount = IPU3_BUFFER_COUNT; + size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE); + size.width = utils::alignDown(size.width - 1, + IMGU_OUTPUT_WIDTH_MARGIN); + size.height = utils::alignDown(size.height - 1, + IMGU_OUTPUT_HEIGHT_MARGIN); + pixelFormat = formats::NV12; + bufferCount = IPU3_BUFFER_COUNT; + streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } }; break; case StreamRole::StillCaptureRaw: { - cfg = data->cio2_.generateConfiguration(sensorResolution); + StreamConfiguration cio2Config = + data->cio2_.generateConfiguration(sensorResolution); + pixelFormat = cio2Config.pixelFormat; + size = cio2Config.size; + bufferCount = cio2Config.bufferCount; + + for (const PixelFormat &format : data->cio2_.formats()) + streamFormats[format] = data->cio2_.sizes(); break; } @@ -345,11 +356,12 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, * capped to the maximum sensor resolution and aligned * to the ImgU output constraints. */ - cfg.size = sensorResolution.boundedTo({ 1280, 720 }) - .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN, - IMGU_OUTPUT_HEIGHT_ALIGN); - cfg.pixelFormat = formats::NV12; - cfg.bufferCount = IPU3_BUFFER_COUNT; + size = sensorResolution.boundedTo({ 1280, 720 }) + .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN, + IMGU_OUTPUT_HEIGHT_ALIGN); + pixelFormat = formats::NV12; + bufferCount = IPU3_BUFFER_COUNT; + streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } }; break; } @@ -361,6 +373,11 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, return nullptr; } + StreamFormats formats(streamFormats); + StreamConfiguration cfg(formats); + cfg.size = size; + cfg.pixelFormat = pixelFormat; + cfg.bufferCount = bufferCount; config->addConfiguration(cfg); }