Hello. I just noticed some leaks to the Argus lib. I edited the one shot sample to aquire frames at best effort and the memory usage of the argus_deamon process is keep increase. Here is my code
int main(int argc, char** argv)
{
printf("Executing Argus Sample: %s\n", basename(argv[0]));
ArgusSamples::Value<uint32_t> cameraIndex(DEFAULT_CAMERA_INDEX);
ArgusSamples::Options options(basename(argv[0]));
options.addOption(ArgusSamples::createValueOption
("device", 'd', "INDEX", "Camera index.", cameraIndex));
if (!options.parse(argc, argv))
return EXIT_FAILURE;
if (options.requestedExit())
return EXIT_SUCCESS;
const uint64_t FIVE_SECONDS_IN_NANOSECONDS = 5000000000;
std::vector<Argus::CameraDevice*> cameraDevices;
/*
Set up Argus API Framework, identify available camera devices, and create
a capture session for the first available device
*/
Argus::UniqueObj<Argus::CameraProvider> cameraProvider(Argus::CameraProvider::create());
Argus::ICameraProvider *iCameraProvider =
Argus::interface_cast<Argus::ICameraProvider>(cameraProvider);
EXIT_IF_NULL(iCameraProvider, "Cannot get core camera provider interface");
printf("Argus Version: %s\n", iCameraProvider->getVersion().c_str());
Argus::Status status = iCameraProvider->getCameraDevices(&cameraDevices);
EXIT_IF_NOT_OK(status, "Failed to get camera devices");
EXIT_IF_NULL(cameraDevices.size(), "No camera devices available");
if (cameraDevices.size() <= cameraIndex.get())
{
printf("Camera device specifed on command line is not available\n");
return EXIT_FAILURE;
}
Argus::UniqueObj<Argus::CaptureSession> captureSession(
iCameraProvider->createCaptureSession(cameraDevices[cameraIndex.get()], &status));
Argus::ICaptureSession *iSession =
Argus::interface_cast<Argus::ICaptureSession>(captureSession);
EXIT_IF_NULL(iSession, "Cannot get Capture Session Interface");
/*
Creates the stream between the Argus camera image capturing
sub-system (producer) and the image acquisition code (consumer). A consumer object is
created from the stream to be used to request the image frame. A successfully submitted
capture request activates the stream's functionality to eventually make a frame available
for acquisition.
*/
Argus::UniqueObj<Argus::OutputStreamSettings> streamSettings(
iSession->createOutputStreamSettings());
Argus::IOutputStreamSettings *iStreamSettings =
Argus::interface_cast<Argus::IOutputStreamSettings>(streamSettings);
EXIT_IF_NULL(iStreamSettings, "Cannot get OutputStreamSettings Interface");
iStreamSettings->setPixelFormat(Argus::PIXEL_FMT_YCbCr_420_888);
iStreamSettings->setResolution(Argus::Size2D<uint32_t>(640, 480));
iStreamSettings->setMetadataEnable(true);
Argus::UniqueObj<Argus::OutputStream> stream(
iSession->createOutputStream(streamSettings.get()));
Argus::IStream *iStream = Argus::interface_cast<Argus::IStream>(stream);
EXIT_IF_NULL(iStream, "Cannot get OutputStream Interface");
Argus::UniqueObj<EGLStream::FrameConsumer> consumer(
EGLStream::FrameConsumer::create(stream.get()));
EGLStream::IFrameConsumer *iFrameConsumer =
Argus::interface_cast<EGLStream::IFrameConsumer>(consumer);
EXIT_IF_NULL(iFrameConsumer, "Failed to initialize Consumer");
while(1) {
Argus::UniqueObj<Argus::Request> request(
iSession->createRequest(Argus::CAPTURE_INTENT_STILL_CAPTURE));
Argus::IRequest *iRequest = Argus::interface_cast<Argus::IRequest>(request);
EXIT_IF_NULL(iRequest, "Failed to get capture request interface");
status = iRequest->enableOutputStream(stream.get());
EXIT_IF_NOT_OK(status, "Failed to enable stream in capture request");
uint32_t requestId = iSession->capture(request.get());
EXIT_IF_NULL(requestId, "Failed to submit capture request");
/*
Acquire a frame generated by the capture request, get the image from the frame
and create a .JPG file of the captured image
*/
Argus::UniqueObj<EGLStream::Frame> frame(
iFrameConsumer->acquireFrame(FIVE_SECONDS_IN_NANOSECONDS, &status));
EGLStream::IFrame *iFrame = Argus::interface_cast<EGLStream::IFrame>(frame);
EXIT_IF_NULL(iFrame, "Failed to get IFrame interface");
EGLStream::Image *image = iFrame->getImage();
EXIT_IF_NULL(image, "Failed to get Image from iFrame->getImage()");
EGLStream::IImageJPEG *iImageJPEG = Argus::interface_cast<EGLStream::IImageJPEG>(image);
EXIT_IF_NULL(iImageJPEG, "Failed to get ImageJPEG Interface");
status = iImageJPEG->writeJPEG("oneShot.jpg");
EXIT_IF_NOT_OK(status, "Failed to write JPEG");
printf("Capture frame\n");
}
return EXIT_SUCCESS;
}
Is there any allocation of the argus camera that I have to free by myself?