blob: 1298d8044568a0cd64e5a3dbf8a04ebccf5014af [file] [log] [blame]
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.util.Size;
import android.view.Surface;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* A builder implementation to help OEM build the {@link Camera2OutputConfigImpl} instance.
* Implementation will be provided in the stub.
*/
@SuppressLint("UnknownNullness")
public class Camera2OutputConfigImplBuilder {
static AtomicInteger sLastId = new AtomicInteger(0);
private OutputConfigImplImpl mOutputConfig;
private int mSurfaceGroupId;
private String mPhysicalCameraId;
private List<Camera2OutputConfigImpl> mSurfaceSharingConfigs;
private Camera2OutputConfigImplBuilder(OutputConfigImplImpl outputConfig) {
mOutputConfig = outputConfig;
}
private int getNextId() {
return sLastId.getAndIncrement();
}
/**
* Creates a {@link Camera2OutputConfigImpl} that represents a {@link android.media.ImageReader}
* with the given parameters.
*/
public static Camera2OutputConfigImplBuilder newImageReaderConfig(
Size size, int imageFormat, int maxImages) {
return new Camera2OutputConfigImplBuilder(
new ImageReaderOutputConfigImplImpl(size, imageFormat, maxImages));
}
/**
* Creates a {@link Camera2OutputConfigImpl} that represents a MultiResolutionImageReader with
* the given parameters.
*/
public static Camera2OutputConfigImplBuilder newMultiResolutionImageReaderConfig(
int imageFormat, int maxImages) {
return new Camera2OutputConfigImplBuilder(
new MultiResolutionImageReaderOutputConfigImplImpl(imageFormat, maxImages));
}
/**
* Creates a {@link Camera2OutputConfigImpl} that contains the Surface directly.
*/
public static Camera2OutputConfigImplBuilder newSurfaceConfig(Surface surface) {
return new Camera2OutputConfigImplBuilder(new SurfaceOutputConfigImplImpl(surface));
}
/**
* Adds a {@link Camera2SessionConfigImpl} to be shared with current config.
*/
public Camera2OutputConfigImplBuilder addSurfaceSharingOutputConfig(
Camera2OutputConfigImpl camera2OutputConfig) {
if (mSurfaceSharingConfigs == null) {
mSurfaceSharingConfigs = new ArrayList<>();
}
mSurfaceSharingConfigs.add(camera2OutputConfig);
return this;
}
/**
* Sets a physical camera id.
*/
public Camera2OutputConfigImplBuilder setPhysicalCameraId(String physicalCameraId) {
mPhysicalCameraId = physicalCameraId;
return this;
}
/**
* Sets surface group id.
*/
public Camera2OutputConfigImplBuilder setSurfaceGroupId(int surfaceGroupId) {
mSurfaceGroupId = surfaceGroupId;
return this;
}
/**
* Build a {@link Camera2OutputConfigImpl} instance.
*/
public Camera2OutputConfigImpl build() {
mOutputConfig.setId(getNextId());
mOutputConfig.setPhysicalCameraId(mPhysicalCameraId);
mOutputConfig.setSurfaceGroup(mSurfaceGroupId);
mOutputConfig.setSurfaceSharingConfigs(mSurfaceSharingConfigs);
return mOutputConfig;
}
private static class OutputConfigImplImpl implements Camera2OutputConfigImpl {
private int mId;
private int mSurfaceGroup;
private String mPhysicalCameraId;
private List<Camera2OutputConfigImpl> mSurfaceSharingConfigs;
OutputConfigImplImpl() {
mId = -1;
mSurfaceGroup = 0;
mPhysicalCameraId = null;
mSurfaceSharingConfigs = null;
}
@Override
public int getId() {
return mId;
}
@Override
public int getSurfaceGroupId() {
return mSurfaceGroup;
}
@Override
public String getPhysicalCameraId() {
return mPhysicalCameraId;
}
@Override
public List<Camera2OutputConfigImpl> getSurfaceSharingOutputConfigs() {
return mSurfaceSharingConfigs;
}
public void setId(int id) {
mId = id;
}
public void setSurfaceGroup(int surfaceGroup) {
mSurfaceGroup = surfaceGroup;
}
public void setPhysicalCameraId(String physicalCameraId) {
mPhysicalCameraId = physicalCameraId;
}
public void setSurfaceSharingConfigs(
List<Camera2OutputConfigImpl> surfaceSharingConfigs) {
mSurfaceSharingConfigs = surfaceSharingConfigs;
}
}
private static class SurfaceOutputConfigImplImpl extends OutputConfigImplImpl
implements SurfaceOutputConfigImpl {
private Surface mSurface;
SurfaceOutputConfigImplImpl(Surface surface) {
mSurface = surface;
}
@Override
public Surface getSurface() {
return mSurface;
}
}
private static class ImageReaderOutputConfigImplImpl extends OutputConfigImplImpl
implements ImageReaderOutputConfigImpl {
private Size mSize;
private int mImageFormat;
private int mMaxImages;
ImageReaderOutputConfigImplImpl(Size size, int imageFormat, int maxImages) {
mSize = size;
mImageFormat = imageFormat;
mMaxImages = maxImages;
}
@Override
public Size getSize() {
return mSize;
}
@Override
public int getImageFormat() {
return mImageFormat;
}
@Override
public int getMaxImages() {
return mMaxImages;
}
}
private static class MultiResolutionImageReaderOutputConfigImplImpl extends OutputConfigImplImpl
implements MultiResolutionImageReaderOutputConfigImpl {
private int mImageFormat;
private int mMaxImages;
MultiResolutionImageReaderOutputConfigImplImpl(int imageFormat, int maxImages) {
mImageFormat = imageFormat;
mMaxImages = maxImages;
}
@Override
public int getImageFormat() {
return mImageFormat;
}
@Override
public int getMaxImages() {
return mMaxImages;
}
}
}