Memory leaks on Arguslib

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?

Hi pavlos, please share a patch that we can directly apply on oneShot sample and how you check memory increase. Do you run ‘top’ to check the memory usage?

Hi pavlos,
For continuous JPEG encoding, you should refer to

tegra_multimedia_api\argus\samples\yuvJpeg
tegra_multimedia_api\samples

tegra_multimedia_api\argus\samples\yuvJpeg
tegra_multimedia_api\samples\09_camera_jpeg_capture

9_camera_jpeg_capture

Hello,

Thank you for your reply.

We found a solution to the issue. The memory increase was caused by the fact the we were not getting the image metadata. Once the metadata were read the memory increase stoppped.

Is that behaviour expected with arguslib ?