Import variable from class element

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).

Please reference to MMAPI.

Thanks

Thanks a lot!
@ShaneCCC
But since I am a beginner, could you please give me a specific example or link or something?
Thank you again!

Get the same code by below command. Also check the MMAPI document.

sudo apt list -a nvidia-l4t-jetson-multimedia-api
sudo apt install nvidia-l4t-jetson-multimedia-api=32.4.3-20200625213407

https://docs.nvidia.com/jetson/archives/l4t-multimedia-archived/l4t-multimedia-3261/group__LibargusAPI.html

Thank you so much!

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.