Hi,
I am working on integrating the camera capture code into my project. Since we want to keep clean and clear, I plan to tear the code into pieces by the function of the code.
Here is an example like this:
class captureFunction {
public:
explicit captureFunction();
~captureFunction();
private:
ICaptureSession *iCaptureSession;
IBufferOutputStream *iBufferOutputStream;
UniqueObj<OutputStream> *outputStreamPtr;
UniqueObj<Request> *requestPtr;
IRequest *iRequest;
bool createCaptureSession();
bool createStream();
bool execute();
}
bool captureFunction::createCaptureSession() {
/* 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");
if (CAMERA_INDEX >= cameraDevices.size())
{
PRODUCER_PRINT("CAMERA_INDEX out of range. Fall back to 0\n");
CAMERA_INDEX = 0;
}
device = cameraDevices[0];
UniqueObj<CaptureSession> captureSession(
iCameraProvider->createCaptureSession(device));
iCaptureSession = interface_cast<ICaptureSession>(captureSession);
if (!iCaptureSession)
ORIGINATE_ERROR("Failed to get ICaptureSession interface");
return true;
}
bool captureFunction::createStream() {
/* Create the OutputStream */
UniqueObj<OutputStreamSettings> streamSettings(
iCaptureSession->createOutputStreamSettings(STREAM_TYPE_BUFFER));
IBufferOutputStreamSettings *iStreamSettings =
interface_cast<IBufferOutputStreamSettings>(streamSettings);
if (!iStreamSettings)
ORIGINATE_ERROR("Failed to get IBufferOutputStreamSettings interface");
return true;
}
bool captureFunction::execute() {
if (!createCaptureSession())
ORIGINATE_ERROR("Failed to get ICaptureSession interface");
if (!createStream())
ORIGINATE_ERROR("Failed to get IBufferOutputStreamSettings interface");
return true;
}
When I run the code, it will get segment fault
directly.
I already ran it normal if the two functions are in the same function as the code below.
/* 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");
if (CAMERA_INDEX >= cameraDevices.size())
{
PRODUCER_PRINT("CAMERA_INDEX out of range. Fall back to 0\n");
CAMERA_INDEX = 0;
}
/* Create the capture session using the first device and get the core interface */
UniqueObj<CaptureSession> captureSession(
iCameraProvider->createCaptureSession(cameraDevices[CAMERA_INDEX]));
iCaptureSession = interface_cast<ICaptureSession>(captureSession);
if (!iCaptureSession)
ORIGINATE_ERROR("Failed to get ICaptureSession interface");
/* Create the OutputStream */
PRODUCER_PRINT("Creating output stream\n");
UniqueObj<OutputStreamSettings> streamSettings(
iCaptureSession->createOutputStreamSettings(STREAM_TYPE_BUFFER));
IBufferOutputStreamSettings *iStreamSettings =
interface_cast<IBufferOutputStreamSettings>(streamSettings);
if (!iStreamSettings)
ORIGINATE_ERROR("Failed to get IBufferOutputStreamSettings interface");
/* Configure the OutputStream to use the EGLImage BufferType */
iStreamSettings->setBufferType(BUFFER_TYPE_EGL_IMAGE);
/* Create the preview stream */
UniqueObj<OutputStream> previewStream(iCaptureSession->createOutputStream(streamSettings.get()));
previewStreamPtr = &previewStream;
iPreviewBufferOutputStream = interface_cast<IBufferOutputStream>(previewStream);
So maybe I should change the type of iCaptureSession
if I want to use it in another function?
Thanks for your attention!
PS:
camera type: leopard IMX334-MIPI_R32.3.1_Xavier_NV 3864x2180@60fps
platform:Nvidia Jetson AGX Xavier Developer kit based on R32.3.1 (Jetpack 4.3).