Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 45 additions & 10 deletions modules/ipu_desc/ipu75xa/FragmentsConfigurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@
#include "FragmentsConfigurator.h"
#include <math.h>

Ipu8FragmentsConfigurator::Ipu8FragmentsConfigurator(IStaticGraphConfig* staticGraph, OuterNode* node, uint32_t upscalerWidthGranularity)
: _staticGraph(staticGraph), _node(node), _upscalerWidthGranularity(upscalerWidthGranularity)
Ipu8FragmentsConfigurator::Ipu8FragmentsConfigurator(IStaticGraphConfig* staticGraph, OuterNode* node) : _staticGraph(staticGraph), _node(node)
{
}

Expand Down Expand Up @@ -390,16 +389,15 @@ StaticGraphStatus Ipu8FragmentsConfigurator::configFragmentsUpscaler(StaticGraph
auto scaleFactorW = static_cast<double>(resInfo->input_width - resInfo->input_crop.left - resInfo->input_crop.right) / resInfo->output_width;
auto scaleFactorH = static_cast<double>(resInfo->input_height - resInfo->input_crop.top - resInfo->input_crop.bottom) / resInfo->output_height;
auto scaleFactor = std::max(scaleFactorW, scaleFactorH);
uint32_t upscalerWidthGranularity = _upscalerWidthGranularity;
uint16_t inputUnits = static_cast<uint16_t>((resInfo->input_width - resInfo->input_crop.left - resInfo->input_crop.right) / upscalerWidthGranularity);

int32_t croppedInputWidth = resInfo->input_width - resInfo->input_crop.left - resInfo->input_crop.right;
int32_t outputWidth = resInfo->output_width;

// We would like to keep upscalerWidthGranularity as large as possible in order to minimize the number of pixels that cannot be used for upscaling
// (upscalerWidthGranularity is divided to stripes, so the larger it is the more accurately we can divide)
while (inputUnits % 4 == 0)
{
inputUnits /= 2;
upscalerWidthGranularity *= 2;
}
// Find the largest granularity that divides both
uint32_t upscalerWidthGranularity = calculateGcd(static_cast<uint32_t>(croppedInputWidth), static_cast<uint32_t>(outputWidth));
uint16_t inputUnits = static_cast<uint16_t>(croppedInputWidth / upscalerWidthGranularity);

int32_t leftPixel = runKernel->resolution_info->input_crop.left;
int32_t rightPixel = static_cast<uint16_t>(runKernel->resolution_info->input_width - runKernel->resolution_info->input_crop.right);
Expand Down Expand Up @@ -510,7 +508,7 @@ StaticGraphStatus Ipu8FragmentsConfigurator::configFragmentsUpscaler(StaticGraph

outputStartX += kernelFragments[stripe].upscalerFragDesc.fragmentInputCropLeft;

outputStartX = GRA_ROUND_UP(static_cast<uint16_t>(ceil(static_cast<double>(outputStartX) / scaleFactor)), 2);
outputStartX = GRA_ROUND_DOWN(static_cast<uint16_t>(floor(static_cast<double>(outputStartX) / scaleFactor)), 2);

_outputStartX[runKernel->kernel_uuid][stripe] = outputStartX;
}
Expand Down Expand Up @@ -780,6 +778,31 @@ StaticGraphStatus Ipu8FragmentsConfigurator::configFragmentsTnrFeeder(StaticGrap
}
}

// Update system API offsets

#ifdef STATIC_GRAPH_USE_IA_LEGACY_TYPES
if (runKernel->system_api.size != ((GRA_ROUND_UP(sizeof(SystemApiRecordHeader), 4)) + (sizeof(StaticGraphKernelSystemApiIoBuffer1_4))))
{
// TODO log error
return StaticGraphStatus::SG_ERROR;
}
#endif

auto systemApiHeader = static_cast<SystemApiRecordHeader*>(runKernel->system_api.data);
if (systemApiHeader->systemApiUuid != GraphResolutionConfiguratorHelper::getRunKernelIoBufferSystemApiUuid())
{
// TODO log error
return StaticGraphStatus::SG_ERROR;
}

StaticGraphKernelSystemApiIoBuffer1_4* systemApi = reinterpret_cast<StaticGraphKernelSystemApiIoBuffer1_4*>
(static_cast<int8_t*>(runKernel->system_api.data) + GRA_ROUND_UP(sizeof(SystemApiRecordHeader), 4));

for (uint8_t stripe = 0; stripe < _node->numberOfFragments; stripe++)
{
systemApi->x_output_offset_per_stripe[stripe] = _outputStartX[runKernel->kernel_uuid][stripe];
}

return StaticGraphStatus::SG_OK;
}

Expand Down Expand Up @@ -890,3 +913,15 @@ StaticGraphStatus Ipu8FragmentsConfigurator::copyFragments(StaticGraphRunKernel*

return StaticGraphStatus::SG_OK;
}

// Find the greatest common divisor, curtesy of CoPilot
uint32_t Ipu8FragmentsConfigurator::calculateGcd(uint32_t a, uint32_t b)
{
while (b != 0)
{
uint32_t t = b;
b = a % b;
a = t;
}
return a;
}
4 changes: 2 additions & 2 deletions modules/ipu_desc/ipu75xa/FragmentsConfigurator.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class Ipu8FragmentsConfigurator
static const int32_t MIN_STRIPE_WIDTH_BEFORE_TNR = 128;
static const int32_t MIN_STRIPE_WIDTH_AFTER_TNR = 64;
static const int32_t UPSCALER_MAX_OUTPUT_WIDTH = 4672;
Ipu8FragmentsConfigurator(IStaticGraphConfig* staticGraph, OuterNode* node, uint32_t upscalerWidthGranularity);
Ipu8FragmentsConfigurator(IStaticGraphConfig* staticGraph, OuterNode* node);

StaticGraphStatus configureFragments(std::vector<SmurfKernelInfo*>& smurfKernels);

Expand All @@ -55,13 +55,13 @@ class Ipu8FragmentsConfigurator
uint32_t getPlaneStartAddress(uint32_t sumOfPrevWidths, FormatType formatType, uint8_t plane);
uint16_t alignToFormatRestrictions(uint16_t size, FormatType bufferFormat);
bool validateDownscalerOutputWidth(StaticGraphFragmentDesc* stripe, uint16_t addition, int32_t stripeIndex, double scaleFactor, StaticGraphRunKernel* runKernel);
uint32_t calculateGcd(uint32_t a, uint32_t b);

OuterNode* _node = nullptr;
IStaticGraphConfig* _staticGraph = nullptr;

// Fragments binaries do not contain output start x, so we keep them here
std::map<uint32_t, std::vector<uint16_t>> _outputStartX;
uint32_t _upscalerWidthGranularity = 1;

// Save TNR resolutions for feeder configurations
StaticGraphFragmentDesc* _tnrScalerFragments = nullptr;
Expand Down
126 changes: 44 additions & 82 deletions modules/ipu_desc/ipu75xa/GraphResolutionConfigurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1189,7 +1189,7 @@ Ipu8GraphResolutionConfigurator::Ipu8GraphResolutionConfigurator(IStaticGraphCon

if (_node != nullptr && _node->GetNumberOfFragments() > 1)
{
_fragmentsConfigurator = new Ipu8FragmentsConfigurator(_staticGraph, _node, _upscalerStepW);
_fragmentsConfigurator = new Ipu8FragmentsConfigurator(_staticGraph, _node);
}

#endif
Expand Down Expand Up @@ -1434,10 +1434,14 @@ StaticGraphStatus Ipu8GraphResolutionConfigurator::getDownscalerInputRoi(const R
// Translate the ROI to input, using res hist of output
ResolutionRoi pipeInputRoi;

pipeInputRoi.left = static_cast<uint32_t>(((outputLeft + _originalCropOfOutput.left) * _widthIn2OutScale) + _originaHistoryOfOutput.left);
pipeInputRoi.right = static_cast<uint32_t>(((outputRight + _originalCropOfOutput.right) * _widthIn2OutScale) + _originaHistoryOfOutput.right);
pipeInputRoi.top = static_cast<uint32_t>(((outputTop + _originalCropOfOutput.top) * _heightIn2OutScale) + _originaHistoryOfOutput.top);
pipeInputRoi.bottom = static_cast<uint32_t>(((outputBottom + _originalCropOfOutput.bottom) * _heightIn2OutScale) + _originaHistoryOfOutput.bottom);
// _widthIn2OutScale and _heightIn2OutScale are relative to pipe input. History is relative to full sensor resolution
double widthHistScale = _widthIn2OutScale / _sensorHorizontalScaling;
double heightHistScale = _heightIn2OutScale / _sensorVerticalScaling;

pipeInputRoi.left = static_cast<uint32_t>(((outputLeft + _originalCropOfOutput.left) * widthHistScale) + _originaHistoryOfOutput.left);
pipeInputRoi.right = static_cast<uint32_t>(((outputRight + _originalCropOfOutput.right) * widthHistScale) + _originaHistoryOfOutput.right);
pipeInputRoi.top = static_cast<uint32_t>(((outputTop + _originalCropOfOutput.top) * heightHistScale) + _originaHistoryOfOutput.top);
pipeInputRoi.bottom = static_cast<uint32_t>(((outputBottom + _originalCropOfOutput.bottom) * heightHistScale) + _originaHistoryOfOutput.bottom);

// Translate ROI on input to ROI as input to downscaler
double scaleWidth = static_cast<double>(_downscalerRunKernel->resolution_history->input_width
Expand Down Expand Up @@ -1483,8 +1487,7 @@ StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelOfScalers(Reso
ret = StaticGraphStatus::SG_ERROR;
}

StaticGraphKernelResCrop EmptyCrop = { 0, 0, 0, 0 };
if (updateRunKernelCropper(_cropperRunKernel, roi, dsOutputWidth, dsOutputHeight, outputWidth, outputHeight, downscalerCropHist) != StaticGraphStatus::SG_OK)
if (updateRunKernelCropper(_cropperRunKernel, roi, _downscalerRunKernel->resolution_info, outputWidth, outputHeight) != StaticGraphStatus::SG_OK)
{
ret = StaticGraphStatus::SG_ERROR;
}
Expand All @@ -1496,8 +1499,7 @@ StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelOfScalers(Reso
updateRunKernelPassThrough(_downscalerRunKernel, inputWidth, inputHeight);

// Configure ESPA crop to output resolution (TNR ROI)
if (updateRunKernelCropper(_cropperRunKernel, roi, inputWidth, inputHeight, outputWidth, outputHeight,
downscalerCropHist) != StaticGraphStatus::SG_OK)
if (updateRunKernelCropper(_cropperRunKernel, roi, _downscalerRunKernel->resolution_info, outputWidth, outputHeight) != StaticGraphStatus::SG_OK)
{
ret = StaticGraphStatus::SG_ERROR;
}
Expand Down Expand Up @@ -1564,7 +1566,8 @@ StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelOfScalers(Reso
return ret;
}

StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelDownScaler(StaticGraphRunKernel* runKernel, ResolutionRoi& roi, uint32_t& outputWidth, uint32_t& outputHeight)
StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelDownScaler(StaticGraphRunKernel* runKernel, ResolutionRoi& roi,
uint32_t& outputWidth, uint32_t& outputHeight)
{
StaticGraphStatus ret = StaticGraphStatus::SG_OK;

Expand Down Expand Up @@ -1605,67 +1608,35 @@ StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelDownScaler(Sta
}

StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelCropper(StaticGraphRunKernel* runKernel, ResolutionRoi& roi,
uint32_t inputWidth, uint32_t inputHeight,
uint32_t outputWidth, uint32_t outputHeight,
StaticGraphKernelResCrop& downscalerCropHist)
StaticGraphKernelRes* downscalerResInfo,
uint32_t outputWidth, uint32_t outputHeight)
{

runKernel->resolution_info->input_width = inputWidth;
runKernel->resolution_info->input_height = inputHeight;
runKernel->resolution_info->input_width = downscalerResInfo->output_width;
runKernel->resolution_info->input_height = downscalerResInfo->output_height;

runKernel->resolution_info->output_width = outputWidth;
runKernel->resolution_info->output_height = outputHeight;

runKernel->resolution_info->input_crop.left = 0;
runKernel->resolution_info->input_crop.right = 0;
runKernel->resolution_info->input_crop.top = 0;
runKernel->resolution_info->input_crop.bottom = 0;
// Configure to crop the required amount.
int32_t totalHorizontalCrop = runKernel->resolution_info->input_width - outputWidth;

// In certain cases need to adjust negative and/or odd crop values.
if (downscalerCropHist.left & 1)
{
downscalerCropHist.left = downscalerCropHist.left - 1;
}
if (downscalerCropHist.right & 1)
{
downscalerCropHist.right = downscalerCropHist.right - 1;
}
if (downscalerCropHist.top & 1)
{
downscalerCropHist.top = downscalerCropHist.top - 1;
}
if (downscalerCropHist.bottom & 1)
{
downscalerCropHist.bottom = downscalerCropHist.bottom - 1;
}
// Now crop to TNR size if any more cropping is required, according to the required ROI
uint32_t cropLeft = roi.left;
uint32_t cropRight = roi.right;

// Configure to crop the required amount. First try to use the original DS cropping (Remove padding)
int32_t totalHorizontalCrop = inputWidth - outputWidth;

int32_t originalDsCrop = downscalerCropHist.left < 0 ? -downscalerCropHist.left : 0;
if (totalHorizontalCrop >= originalDsCrop && originalDsCrop > 0)
if (downscalerResInfo->input_crop.right > 0)
{
runKernel->resolution_info->input_crop.left = originalDsCrop;
totalHorizontalCrop -= originalDsCrop;

// Padding was handled, no need to handle again
downscalerCropHist.left = 0;
double scale = static_cast<double>(downscalerResInfo->output_width) /
(downscalerResInfo->input_width - downscalerResInfo->input_crop.left - downscalerResInfo->input_crop.right);
cropRight -= GRA_ROUND_UP(static_cast<uint32_t>(downscalerResInfo->input_crop.right * scale), 2);
}

originalDsCrop = downscalerCropHist.right < 0 ? -downscalerCropHist.right : 0;
if (totalHorizontalCrop >= originalDsCrop && originalDsCrop > 0)
{
runKernel->resolution_info->input_crop.right = originalDsCrop;
totalHorizontalCrop -= originalDsCrop;

// Padding was handled, no need to handle again
downscalerCropHist.right = 0;
}
// Calculate the crop after downscale, relatively to the desired crop before the downscale
cropLeft = (cropLeft + cropRight) == 0 ? 0 :
GRA_ROUND_DOWN(static_cast<int32_t>(GRA_ROUND(static_cast<double>(cropLeft) / (cropLeft + cropRight) * totalHorizontalCrop)), 2);

// Now crop symmetrically to TNR size if any more cropping is required
// :TODO: fix this for PTZ with striping since should take roi into account
runKernel->resolution_info->input_crop.left += GRA_ROUND_DOWN(static_cast<uint32_t>(static_cast<double>(totalHorizontalCrop)) / 2, 2);
runKernel->resolution_info->input_crop.right += (totalHorizontalCrop - GRA_ROUND_DOWN(static_cast<uint32_t>(static_cast<double>(totalHorizontalCrop)) / 2, 2));
runKernel->resolution_info->input_crop.left = cropLeft;
runKernel->resolution_info->input_crop.right = totalHorizontalCrop - cropLeft;

if (roi.left < static_cast<uint32_t>(runKernel->resolution_info->input_crop.left))
{
Expand All @@ -1678,33 +1649,24 @@ StaticGraphStatus Ipu8GraphResolutionConfigurator::updateRunKernelCropper(Static
runKernel->resolution_info->input_crop.right = roi.right;
}

// Configure to crop the required amount. First try to use the original DS cropping (Remove padding)
int32_t totalVerticalCrop = inputHeight - outputHeight;
int32_t totalVerticalCrop = runKernel->resolution_info->input_height - outputHeight;

originalDsCrop = downscalerCropHist.top < 0 ? -downscalerCropHist.top : 0;
if (totalVerticalCrop >= originalDsCrop && originalDsCrop > 0)
{
runKernel->resolution_info->input_crop.top = originalDsCrop;
totalVerticalCrop -= originalDsCrop;
// Now crop to TNR size if any more cropping is required, according to the required ROI
uint32_t cropTop = roi.top;
uint32_t cropBottom = roi.bottom;

// Padding was handled, no need to handle again
downscalerCropHist.top = 0;
}

originalDsCrop = downscalerCropHist.bottom < 0 ? -downscalerCropHist.bottom : 0;
if (totalVerticalCrop >= originalDsCrop && originalDsCrop > 0)
if (downscalerResInfo->input_crop.bottom > 0)
{
runKernel->resolution_info->input_crop.bottom = originalDsCrop;
totalVerticalCrop -= originalDsCrop;

// Padding was handled, no need to handle again
downscalerCropHist.bottom = 0;
double scale = static_cast<double>(downscalerResInfo->output_height) /
(downscalerResInfo->input_height - downscalerResInfo->input_crop.top - downscalerResInfo->input_crop.bottom);
cropBottom -= GRA_ROUND_UP(static_cast<uint32_t>(downscalerResInfo->input_crop.bottom * scale), 2);
}

// Now crop symmetrically to TNR size if any more cropping is required
// :TODO: fix this for PTZ with striping since should take roi into account
runKernel->resolution_info->input_crop.top += GRA_ROUND_DOWN(static_cast<uint32_t>(static_cast<double>(totalVerticalCrop)) / 2, 2);
runKernel->resolution_info->input_crop.bottom += (totalVerticalCrop - GRA_ROUND_DOWN(static_cast<uint32_t>(static_cast<double>(totalVerticalCrop)) / 2, 2));
cropTop = (cropTop + cropBottom) == 0 ? 0 :
GRA_ROUND_DOWN(static_cast<int32_t>(GRA_ROUND(static_cast<double>(cropTop) / (cropTop + cropBottom) * totalVerticalCrop)), 2);

runKernel->resolution_info->input_crop.top = cropTop;
runKernel->resolution_info->input_crop.bottom = totalVerticalCrop - cropTop;

if (roi.top < static_cast<uint32_t>(runKernel->resolution_info->input_crop.top))
{
Expand Down
5 changes: 2 additions & 3 deletions modules/ipu_desc/ipu75xa/GraphResolutionConfigurator.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
#pragma once
#include <vector>
#include <map>
#include <cstdint>
#include <stdint.h>

#define _USE_MATH_DEFINES
#define GRA_ROUND_UP(a,b) (((a) + ((b)-1)) / (b) * (b))
Expand Down Expand Up @@ -213,8 +213,7 @@ class Ipu8GraphResolutionConfigurator : public GraphResolutionConfigurator

StaticGraphStatus updateRunKernelDownScaler(StaticGraphRunKernel* runKernel, ResolutionRoi& roi, uint32_t& outputWidth, uint32_t& outputHeight);
StaticGraphStatus updateRunKernelUpScaler(StaticGraphRunKernel* runKernel, ResolutionRoi& roi, StaticGraphKernelResCrop& cropperKernelCrop, uint32_t outputWidth, uint32_t outputHeight);
StaticGraphStatus updateRunKernelCropper(StaticGraphRunKernel* runKernel, ResolutionRoi& roi, uint32_t inputWidth, uint32_t inputHeight,
uint32_t outputWidth, uint32_t outputHeight, StaticGraphKernelResCrop& downscalerCropHist);
StaticGraphStatus updateRunKernelCropper(StaticGraphRunKernel* runKernel, ResolutionRoi& roi, StaticGraphKernelRes* downscalerResInfo, uint32_t outputWidth, uint32_t outputHeight);
StaticGraphStatus updateRunKernelSmurf(SmurfKernelInfo* smurfInfo);

StaticGraphStatus SanityCheck();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#ifndef DATA_RANGE_H_
#define DATA_RANGE_H_

#include <cstdint>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

Expand Down
15 changes: 15 additions & 0 deletions modules/ipu_desc/ipu75xa/Ipu75xaStaticGraphReaderAutogen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,21 @@ std::pair<int, const GraphConfigurationHeader*> StaticGraphReader::GetGraphConfi
return std::make_pair(_binaryHeader.numberOfResolutions, _graphConfigurationHeaders);
}

GraphConfigurationKey* StaticGraphReader::GetFdGraphConfigurationKey(GraphConfigurationKey& settingsKey) const
{
for (uint32_t i = 0; i < _binaryHeader.numberOfResolutions; i++)
{
if (settingsKey.attributes == _graphConfigurationHeaders[i].settingsKey.attributes &&
(((settingsKey.preview.width != 0 && _graphConfigurationHeaders[i].settingsKey.preview.width == settingsKey.preview.width && _graphConfigurationHeaders[i].settingsKey.preview.height == settingsKey.preview.height) ||
(settingsKey.video.width != 0 && _graphConfigurationHeaders[i].settingsKey.video.width == settingsKey.video.width && _graphConfigurationHeaders[i].settingsKey.video.height == settingsKey.video.height)) &&
_graphConfigurationHeaders[i].settingsKey.postProcessingVideo.width != 0))
{
return &_graphConfigurationHeaders[i].settingsKey;
}
}
return NULL;
}

StaticGraphStatus StaticGraphReader::GetStaticGraphConfig(GraphConfigurationKey& settingsKey, IStaticGraphConfig** graph)
{
if (!_graphConfigurationHeaders || !_sensorModes || !_configurationData)
Expand Down
1 change: 1 addition & 0 deletions modules/ipu_desc/ipu75xa/Ipu75xaStaticGraphReaderAutogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class StaticGraphReader
StaticGraphStatus Init(StaticReaderBinaryData& binaryGraphSettings);
StaticGraphStatus GetStaticGraphConfig(GraphConfigurationKey& settingsKey, IStaticGraphConfig** graph);
std::pair<int, const GraphConfigurationHeader*> GetGraphConfigurationHeaders() const;
GraphConfigurationKey* GetFdGraphConfigurationKey(GraphConfigurationKey& settingsKey) const;
static const uint32_t staticGraphCommonHashCode = 1110027246; // autogenerated
private:
void GetSinkMappingConfiguration(GraphConfigurationHeader* baseGraphConfigurationHeader, VirtualSinkMapping* baseSinkMappingConfiguration,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#ifndef IPU_MANIFEST_DB_IPU7_PSYS_CB_BBPS_DESCRIPTORS_H
#define IPU_MANIFEST_DB_IPU7_PSYS_CB_BBPS_DESCRIPTORS_H

#include <cstdint>
#include <stdint.h>
#include "cb_payload_descriptor.h"

static payload_descriptor_t BBPS_0_descriptors = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#ifndef IPU_MANIFEST_DB_IPU7_PSYS_CB_LBFF_DESCRIPTORS_H
#define IPU_MANIFEST_DB_IPU7_PSYS_CB_LBFF_DESCRIPTORS_H

#include <cstdint>
#include <stdint.h>
#include "cb_payload_descriptor.h"

static payload_descriptor_t lbff_0_descriptors = {
Expand Down
Loading