My TX2 connect to 3 AR0144 cameras.
I implement a test app based on argus camera api.
After that I do power up and power down test for 200 times.
I find instability issue.
- Failed to create CameraProvider issue (about 10 times)
- Acquire a frame failed issue when the first time(about 10 times)
- Acquire a frame failed issue after acquire some frames(about 10 times)
The following is my source code.
ArgusCamera::ArgusCamera() {
_camera_provider = UniqueObj<CameraProvider>(CameraProvider::create());
_icamera_provider = interface_cast<ICameraProvider>(_camera_provider);
if (!_icamera_provider) {
MLOG(AGENT, FATAL, "Failed to create CameraProvider");
}
// Get the camera devices
_icamera_provider->getCameraDevices(&_camera_devices);
if (_camera_devices.size() == 0) {
MLOG(AGENT, INFO, "No cameras available");
}
MLOG(AGENT, INFO, "_camera_devices.size() = %ld", _camera_devices.size());
for (int i = 0; i < MAX_CHANNEL; i++) {
_dmabuf[i] = -1;
}
}
bool ArgusCamera::create_session(unsigned int dev_index, int exposure_mode,
int exposure_val) {
if (dev_index > _camera_devices.size()) {
MLOG(AGENT, FATAL, "Invalid device index");
return false;
}
// create the new capture session
_session[dev_index] = UniqueObj<CaptureSession>(
_icamera_provider->createCaptureSession(_camera_devices[dev_index]));
if (!_session[dev_index]) {
MLOG(AGENT, FATAL, "Failed to create CaptureSession");
return false;
}
// createOutputStream
ICaptureSession *iCaptureSession =
interface_cast<ICaptureSession>(_session[dev_index]);
if (!iCaptureSession) {
MLOG(AGENT, FATAL, "Failed to get ICaptureSession interface");
return false;
}
UniqueObj<OutputStreamSettings> streamSettings(
iCaptureSession->createOutputStreamSettings(STREAM_TYPE_EGL));
IEGLOutputStreamSettings *iEGLStreamSettings =
interface_cast<IEGLOutputStreamSettings>(streamSettings);
if (!iEGLStreamSettings) {
MLOG(AGENT, FATAL, "Failed to create OutputStreamSettings");
return false;
}
iEGLStreamSettings->setPixelFormat(PIXEL_FMT_YCbCr_420_888);
#if 0
NvEglRenderer *renderer = NvEglRenderer::createEglRenderer(
"renderer0", DEFAULT_HEIGHT, DEFAULT_HEIGHT, 0, 0);
iEGLStreamSettings->setEGLDisplay(renderer->getEGLDisplay());
#endif
#if 0
EGLDisplay eglDisplay = EGL_NO_DISPLAY;
// Get default EGL display
eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (eglDisplay == EGL_NO_DISPLAY) {
printf("Cannot get EGL display.\n");
return EXIT_FAILURE;
}
iEGLStreamSettings->setEGLDisplay(eglDisplay);
#endif
iEGLStreamSettings->setResolution(
Size2D<uint32_t>(DEFAULT_WIDTH, DEFAULT_HEIGHT));
// iEGLStreamSettings->setEGLDisplay(g_display.get());
// iEGLStreamSettings->setMetadataEnable(true);
UniqueObj<OutputStream> outputStream(
iCaptureSession->createOutputStream(streamSettings.get()));
if (!outputStream) {
MLOG(AGENT, FATAL, "Failed to create OutputStream");
return false;
}
_output_stream[dev_index].reset(outputStream.release());
// Create the FrameConsumer.
_consumer[dev_index] = UniqueObj<FrameConsumer>(
FrameConsumer::create(_output_stream[dev_index].get()));
if (!_consumer[dev_index]) {
MLOG(AGENT, FATAL, "Failed to create FrameConsumer");
return false;
}
// Create capture request and enable output stream.
UniqueObj<Request> request(iCaptureSession->createRequest());
IRequest *iRequest = interface_cast<IRequest>(request);
if (!iRequest) {
MLOG(AGENT, FATAL, "Failed to create Request");
return false;
}
iRequest->enableOutputStream(_output_stream[dev_index].get());
// set fps
ISourceSettings *iSourceSettings =
interface_cast<ISourceSettings>(iRequest->getSourceSettings());
if (!iSourceSettings) {
MLOG(AGENT, FATAL, "Failed to get source settings interface");
return false;
}
if (iSourceSettings->setFrameDurationRange(
Range<uint64_t>(1e9 / CAPTURE_FPS)) != STATUS_OK) {
MLOG(AGENT, FATAL, "Failed to setFrameDurationRange");
return false;
}
// set manual exposure
if (exposure_mode == 1) {
// get the autocontrol settings and set the exposure compensation value
IAutoControlSettings *iAutoControlSettings = NULL;
iAutoControlSettings = interface_cast<IAutoControlSettings>(
iRequest->getAutoControlSettings());
if (!iAutoControlSettings) {
MLOG(AGENT, FATAL, "Failed to get IAutoControlSettings interface");
return false;
}
// lock AE
if (iAutoControlSettings->setAeLock(true) != STATUS_OK) {
MLOG(AGENT, FATAL, "Failed to set AE lock");
return false;
}
ISourceSettings *iSourceSettings =
interface_cast<ISourceSettings>(iRequest->getSourceSettings());
if (!iSourceSettings) {
MLOG(AGENT, FATAL, "Failed to get source settings interface");
return false;
}
if (iSourceSettings->setExposureTimeRange(exposure_val) != STATUS_OK) {
MLOG(AGENT, FATAL, "Failed to set exposure time range");
return false;
}
}
// Submit capture requests.
if (iCaptureSession->repeat(request.get()) != STATUS_OK) {
MLOG(AGENT, FATAL, "Failed to start repeat capture request");
return false;
}
return true;
}
bool ArgusCamera::capture_frame(unsigned int dev_index, unsigned char *buf) {
IFrameConsumer *iFrameConsumer =
interface_cast<IFrameConsumer>(_consumer[dev_index]);
// Acquire a frame.
UniqueObj<Frame> frame(iFrameConsumer->acquireFrame(1000 * 1000 * 1000));
IFrame *iFrame = interface_cast<IFrame>(frame);
if (!iFrame) {
MLOG(AGENT, FATAL, "Acquire a frame failed");
return false;
}
// Get the IImageNativeBuffer extension interface.
NV::IImageNativeBuffer *iNativeBuffer =
interface_cast<NV::IImageNativeBuffer>(iFrame->getImage());
if (!iNativeBuffer) {
MLOG(AGENT, FATAL, "IImageNativeBuffer not supported by Image");
return false;
}
// If we don't already have a buffer, create one from this image.
// Otherwise, just blit to our buffer.
// the fisrt time, we do not need to do copyToNvBuffer
if (_dmabuf[dev_index] == -1) {
_dmabuf[dev_index] = iNativeBuffer->createNvBuffer(
Size2D<uint32_t>(DEFAULT_WIDTH, DEFAULT_HEIGHT),
NvBufferColorFormat_YUV420, NvBufferLayout_Pitch);
if (!_dmabuf[dev_index]) {
MLOG(AGENT, FATAL, "Failed to create NvBuffer");
return false;
}
} else if (iNativeBuffer->copyToNvBuffer(_dmabuf[dev_index]) != STATUS_OK) {
MLOG(AGENT, FATAL, "Failed to copy frame to NvBuffer");
return false;
}
// copy data to out buf
void *pdata = NULL;
NvBufferMemMap(_dmabuf[dev_index], 0, NvBufferMem_Read, &pdata);
NvBufferMemSyncForCpu(_dmabuf[dev_index], 0, &pdata);
memcpy(buf, pdata, DEFAULT_WIDTH * DEFAULT_HEIGHT);
NvBufferMemUnMap(_dmabuf[dev_index], 0, &pdata);
return true;
}
the abnormal log:
2020/02/15 03:39:26.810 INFO AGENT [argus_camera_agent.cpp:207] start argus_camera_agent
2020/02/15 03:39:27.493 INFO AGENT [argus_camera.cpp:50] _camera_devices.size() = 3
2020/02/15 03:39:28.429 INFO AGENT [argus_camera_agent.cpp:112] start to capture first frame
2020/02/15 03:40:02.592 INFO AGENT [argus_camera_agent.cpp:134] camera 0 get 1800 frame
2020/02/15 03:40:02.603 INFO AGENT [argus_camera_agent.cpp:155] camera 1 get 1800 frame
2020/02/15 03:40:02.611 INFO AGENT [argus_camera_agent.cpp:176] camera 2 get 1800 frame
2020/02/15 03:40:32.698 INFO AGENT [argus_camera_agent.cpp:134] camera 0 get 3600 frame
2020/02/15 03:40:32.711 INFO AGENT [argus_camera_agent.cpp:155] camera 1 get 3600 frame
2020/02/15 03:40:32.718 INFO AGENT [argus_camera_agent.cpp:176] camera 2 get 3600 frame
2020/02/15 03:40:48.538 FATAL AGENT [argus_camera.cpp:206] Acquire a frame failed
2020/02/15 03:40:48.538 FATAL AGENT [argus_camera_agent.cpp:120] capture_frame failed
2020/02/15 03:40:48.538 FATAL AGENT [argus_camera_agent.cpp:185] capture_frame stopped
2020/02/15 03:40:49.628 INFO AGENT [argus_camera_agent.cpp:207] start argus_camera_agent
2020/02/15 03:40:49.773 FATAL AGENT [argus_camera.cpp:40] Failed to create CameraProvider
2020/02/15 03:40:51.396 INFO AGENT [argus_camera_agent.cpp:207] start argus_camera_agent
2020/02/15 03:40:52.049 INFO AGENT [argus_camera.cpp:50] _camera_devices.size() = 3
2020/02/15 03:40:52.748 INFO AGENT [argus_camera_agent.cpp:112] start to capture first frame
2020/02/15 03:42:29.839 INFO AGENT [argus_camera_agent.cpp:207] start argus_camera_agent
2020/02/15 03:42:30.457 INFO AGENT [argus_camera.cpp:50] _camera_devices.size() = 3
2020/02/15 03:42:31.427 INFO AGENT [argus_camera_agent.cpp:112] start to capture first frame
2020/02/15 03:42:42.702 FATAL AGENT [argus_camera.cpp:206] Acquire a frame failed
2020/02/15 03:42:42.702 FATAL AGENT [argus_camera_agent.cpp:162] capture_frame failed
2020/02/15 03:42:42.702 FATAL AGENT [argus_camera_agent.cpp:185] capture_frame stopped
2020/02/15 03:42:43.851 INFO AGENT [argus_camera_agent.cpp:207] start argus_camera_agent
2020/02/15 03:42:44.563 FATAL AGENT [argus_camera.cpp:40] Failed to create CameraProvider
2020/02/15 03:42:46.163 INFO AGENT [argus_camera_agent.cpp:207] start argus_camera_agent
2020/02/15 03:42:46.774 INFO AGENT [argus_camera.cpp:50] _camera_devices.size() = 3
2020/02/15 03:42:47.393 INFO AGENT [argus_camera_agent.cpp:112] start to capture first frame
2020/02/15 03:43:17.997 INFO AGENT [argus_camera_agent.cpp:134] camera 0 get 1800 frame
2020/02/15 03:43:18.009 INFO AGENT [argus_camera_agent.cpp:155] camera 1 get 1800 frame
2020/02/15 03:43:18.016 INFO AGENT [argus_camera_agent.cpp:176] camera 2 get 1800 frame
2020/02/15 03:43:48.294 INFO AGENT [argus_camera_agent.cpp:134] camera 0 get 3600 frame
2020/02/15 03:43:48.309 INFO AGENT [argus_camera_agent.cpp:155] camera 1 get 3600 frame
2020/02/15 03:43:48.314 INFO AGENT [argus_camera_agent.cpp:176] camera 2 get 3600 frame
the normal log:
2020/02/15 08:15:29.778 INFO AGENT [argus_camera_agent.cpp:207] start argus_camera_agent
2020/02/15 08:15:30.420 INFO AGENT [argus_camera.cpp:50] _camera_devices.size() = 3
2020/02/15 08:15:31.491 INFO AGENT [argus_camera_agent.cpp:112] start to capture first frame
2020/02/15 08:16:04.979 INFO AGENT [argus_camera_agent.cpp:134] camera 0 get 1800 frame
2020/02/15 08:16:04.990 INFO AGENT [argus_camera_agent.cpp:155] camera 1 get 1800 frame
2020/02/15 08:16:04.998 INFO AGENT [argus_camera_agent.cpp:176] camera 2 get 1800 frame
2020/02/15 08:16:34.893 INFO AGENT [argus_camera_agent.cpp:134] camera 0 get 3600 frame
2020/02/15 08:16:34.903 INFO AGENT [argus_camera_agent.cpp:155] camera 1 get 3600 frame
2020/02/15 08:16:34.911 INFO AGENT [argus_camera_agent.cpp:176] camera 2 get 3600 frame
2020/02/15 08:17:05.541 INFO AGENT [argus_camera_agent.cpp:134] camera 0 get 5400 frame
2020/02/15 08:17:05.552 INFO AGENT [argus_camera_agent.cpp:155] camera 1 get 5400 frame
2020/02/15 08:17:05.559 INFO AGENT [argus_camera_agent.cpp:176] camera 2 get 5400 frame
system version:
R32 (release), REVISION: 2.1, GCID: 16294929, BOARD: t186ref, EABI: aarch64, DATE: Tue Aug 13 04:45:36 UTC 2019
syslog:
Feb 15 03:40:47 miivii-tegra systemd[1]: Started PackageKit Daemon.
Feb 15 03:40:47 miivii-tegra nvargus-daemon[5759]: CAM: serial no file already exists, skips storing againSCF: Error NotSupported: AMR Sample data type is error, requested type is IspRawStats* (in src/components/amr/Sample.cpp, function typeError(), line 65)
Feb 15 03:40:47 miivii-tegra nvargus-daemon[5759]: SCF: Error NotSupported: (in src/components/amr/Sample.cpp, function get(), line 101)
Feb 15 03:40:47 miivii-tegra nvargus-daemon[5759]: SCF: Error NotSupported: (propagating from src/common/Amr.h, function getSampleObject(), line 488)
Feb 15 03:40:47 miivii-tegra nvargus-daemon[5759]: SCF: Error NotSupported: (propagating from src/components/ac_stages/AeAfApplyStage.cpp, function translateIspOutStatsToFrd(), line 281)
Feb 15 03:40:47 miivii-tegra nvargus-daemon[5759]: SCF: Error NotSupported: (propagating from src/components/ac_stages/AeAfApplyStage.cpp, function doHandleRequest(), line 618)
Feb 15 03:40:47 miivii-tegra nvargus-daemon[5759]: SCF: Error NotSupported: (propagating from src/components/stages/OrderedStage.cpp, function doExecute(), line 137)
Could you help me on this, thank you very much!