Using IBufferOutputStream without EGLDisplay?

We use TX2 in embedded product, which there’s no display and X11.

We modified samples/eglImage, and setEGLDisplay() to NULL.

But when running, following error reported:

Error BadParameter: No EGLDisplay
  • source code snippet:
    // create NvBuffer for camera.
    int bufferFds[CAMERA_BUFFER_NUM] = {0};
    EGLImageKHR bufferImages[CAMERA_BUFFER_NUM];
    std:map<EGLImageKHR, int> bufferMaps;
    UniqueObj<Buffer> bufferCamera[CAMERA_BUFFER_NUM];
    int bufferNum = 0;
    NvBufferCreateParams bufParams = {0};
    bufParams.width = width;
    bufParams.height = height;
    bufParams.layout = NvBufferLayout_BlockLinear;
    bufParams.colorFormat = NvBufferColorFormat_YUYV;
    bufParams.payloadType = NvBufferPayload_SurfArray;
    bufParams.nvbuf_tag = NvBufferTag_CAMERA;
    for (i = 0; i < CAMERA_BUFFER_NUM; i++) {
      if (NvBufferCreateEx(&bufferFds[i], &bufParams)) {
        LOG("[E] create buffer for camera failed! err=%d", errno);
        break;
      }
      bufferImages[i] = NvEGLImageFromFd(NULL, bufferFds[i]);
    }
 
    // create outputStream
    UniqueObj<OutputStreamSettings> streamSettings(
        iCaptureSession->createOutputStreamSettings(STREAM_TYPE_BUFFER));
    IBufferOutputStreamSettings *iStreamSettings =
        interface_cast<IBufferOutputStreamSettings>(streamSettings);
    iStreamSettings->setBufferType(BUFFER_TYPE_EGL_IMAGE);

    UniqueObj<OutputStream> outputStream(
        iCaptureSession->createOutputStream(streamSettings.get()));
    IBufferOutputStream *iBufferOutputStream =
        interface_cast<IBufferOutputStream>(outputStream);

    UniqueObj<BufferSettings> bufferSettings(
        iBufferOutputStream->createBufferSettings());
    IEGLImageBufferSettings *iBufferSettings =
        interface_cast<IEGLImageBufferSettings>(bufferSettings);

    for (int i = 0; i < CAMERA_BUFFER_NUM; i++) {
      iBufferSettings->setEGLDisplay(NULL);
      iBufferSettings->setEGLImage(bufferImages[i]);
      bufferCamera[i].reset(
          iBufferOutputStream->createBuffer(bufferSettings.get()));
    }
    ...

Hi,
Please try with EGL_DEFAULT_DISPLAY:

EGLDisplay egl_display;
egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

Although there is no display, you should still be able to get EGL_DEFAULT_DISPLAY. Please give it a try.

1 Like

@DaneLLL Yes, it works.

But now when call iCaptureSession->repeat(request.get()), following error reported:

		SCF: Error NotImplemented: Metadata-only not yet implemented in SCF (in src/components/CaptureSetupEngineImpl.cpp, function chooseGenInstFunc(), line 258)
		SCF: Error NotImplemented:  (propagating from src/components/CaptureSetupEngineImpl.cpp, function doGetInstructions(), line 2204)
		SCF: Error NotImplemented:  (propagating from src/components/CaptureSetupEngine.cpp, function getInstructionList(), line 300)
		SCF: Error NotImplemented:  (propagating from src/components/CaptureSetupEngine.cpp, function setupCC(), line 214)
		SCF: Error NotImplemented:  (propagating from src/api/Session.cpp, function capture(), line 815)
		(Argus) Error NotImplemented:  (propagating from src/api/ScfCaptureThread.cpp, function run(), line 109)

source code snippet:

   //create and submit request
    UniqueObj<Request> request(iCaptureSession->createRequest());
    IRequest *iRequest = interface_cast<IRequest>(request);
    //outputStream : IBufferOutputStream object
    iRequest->enableOutputStream(outputStream.get());

    // Error reported...
    if(iCaptureSession->repeat(request.get()) != STATUS_OK) ...    

Hi,
Please check this:
Libargus will not start without DisplayPort connected - #6 by WayneWWW

Some drivers are obligatory and cannot be removed, although you run in headless mode.

We tried on Tx2 Dev Kit Board with complete Jetpack, but same error still reported.

In addition, the error occurred when submitting requests…

Please double check it.

Thanks

I got it.

The NvBufferCreateParams not support NvBufferColorFormat_ABGR32, it works after modify to NvBufferColorFormat_NV12.

-    bufParams.colorFormat = NvBufferColorFormat_ABGR32;
+    bufParams.colorFormat = NvBufferColorFormat_NV12;