When using gstreamer, nvcamerasrc seems to dynamically select the sensor mode from the device tree based on the input resolution. Is there a way to replicate that in Argus? Right now it seems to always choose mode 0, even if it’s not the default.
Think I found figured it out,
ISourceSettings has a setSensorMode method and ICameraProperties has getSensorModes
Getting the list of sensor modes:
// Create the CameraProvider object and get the core interface.
UniqueObj<CameraProvider> cameraProvider = UniqueObj<CameraProvider>(CameraProvider::create());
ICameraProvider *iCameraProvider = interface_cast<ICameraProvider>(cameraProvider);
if(!iCameraProvider) ORIGINATE_ERROR("Failed to create CameraProvider");
// Get the camera devices.
std::vector<CameraDevice*> cameraDevices;
iCameraProvider->getCameraDevices(&cameraDevices);
if(cameraDevices.size() == 0) ORIGINATE_ERROR("No cameras available");
// Get sensor mode
ICameraProperties *iCameraProperties = interface_cast<ICameraProperties>(cameraDevices[0]);
if(!iCameraProperties) ORIGINATE_ERROR("Failed to create ICameraProperties interface");
std::vector<SensorMode*> modes;
iCameraProperties->getBasicSensorModes(&modes);
printf("Available Sensor modes:\n");
for(size_t i = 0; i < modes.size(); i++)
{
ISensorMode *iSensorMode = interface_cast<ISensorMode>(modes[i]);
if(!iSensorMode) ORIGINATE_ERROR("Failed to create ISensorMode interface");
Size2D<uint32_t> size = iSensorMode->getResolution();
Range<uint64_t> framerate = iSensorMode->getFrameDurationRange();
printf("mode %zu: %u x %u, FR=%.0f\n", i, size.width(), size.height(), 1e9/framerate.min());
}
Setting the mode:
// Set framerate and sensor mode
ISourceSettings *iSourceSettings = interface_cast<ISourceSettings>(iRequest->getSourceSettings());
if(!iSourceSettings) ORIGINATE_ERROR("Failed to get ISourceSettings interface");
iSourceSettings->setSensorMode(modes[0]);