Morshues
Morshues

Reputation: 135

How to add multiple surfaces of SurfaceView after camera2 session created

I have an app saving camera images continuously by using ImageReader.

Now I have a requisite need to add multiple SurfaceView dynamically for showing different size of preview after camera session created.

Because the surface of ImageReader was added before session created like this:

mBuilder = mCameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
mBuilder!!.addTarget(mImageReader!!.surface)

val surfaces = ArrayList<Surface>()
surfaces.add(mImageReader!!.surface)
mCameraDevice!!.createCaptureSession(surfaces, mSessionCallback, mBackgroundHandler)

And my new SurfaceView will be create after createCaptureSession.

So how should I add another preview surface to device for receiver data from camera2?

Upvotes: 0

Views: 2020

Answers (1)

Eddy Talvala
Eddy Talvala

Reputation: 18137

This is not possible with the camera2 directly, for different output resolutions. If you need to change the resolution of an output, you have to create a new capture session with the new outputs you want.

If you want multiple SurfaceViews of the same size, you can use the surface sharing APIs added in API level 26 and later in OutputConfiguration (https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration).

If that's not sufficient, the other option is to connect the camera to a SurfaceTexture with the maximum SurfaceView resolution you might want, and then render lower resolution outputs from that via OpenGL, creating EGL windows for each new SurfaceView you want to draw to. That's a lot of code needed to set up the EGL context and rendering, but should be fairly efficient.

Upvotes: 2

Related Questions