1 /* 2 * Copyright 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.hardware.camera2.params; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.graphics.ImageFormat.Format; 22 import android.hardware.camera2.params.MultiResolutionStreamInfo; 23 import android.hardware.camera2.utils.HashCodeHelpers; 24 25 import java.util.Collection; 26 import java.util.List; 27 28 import static com.android.internal.util.Preconditions.*; 29 30 /** 31 * Immutable class to store an input configuration that is used to create a reprocessable capture 32 * session. 33 * 34 * @see android.hardware.camera2.CameraDevice#createReprocessableCaptureSession 35 * @see android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP 36 */ 37 public final class InputConfiguration { 38 39 private final int mWidth; 40 private final int mHeight; 41 private final int mFormat; 42 private final boolean mIsMultiResolution; 43 44 /** 45 * Create an input configuration with the width, height, and user-defined format. 46 * 47 * <p>Images of a user-defined format are accessible by applications. Use 48 * {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP} 49 * to query supported input formats</p> 50 * 51 * @param width Width of the input buffers. 52 * @param height Height of the input buffers. 53 * @param format Format of the input buffers. One of ImageFormat or PixelFormat constants. 54 * 55 * @see android.graphics.ImageFormat 56 * @see android.graphics.PixelFormat 57 * @see android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP 58 */ InputConfiguration(int width, int height, int format)59 public InputConfiguration(int width, int height, int format) { 60 mWidth = width; 61 mHeight = height; 62 mFormat = format; 63 mIsMultiResolution = false; 64 } 65 66 /** 67 * Create an input configuration with the format and a list of multi-resolution input stream 68 * info. 69 * 70 * <p>Use {@link 71 * android.hardware.camera2.CameraCharacteristics#SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP} 72 * to query supported multi-resolution input formats.</p> 73 * 74 * <p>To do reprocessing with variable resolution input, the application calls 75 * {@link android.media.ImageWriter#queueInputImage ImageWriter.queueInputImage} 76 * using an image from an {@link android.media.ImageReader ImageReader} or {@link 77 * android.hardware.camera2.MultiResolutionImageReader MultiResolutionImageReader}. See 78 * {@link android.hardware.camera2.CameraDevice#createReprocessCaptureRequest} for more 79 * details on camera reprocessing. 80 * </p> 81 * 82 * @param multiResolutionInputs A group of multi-resolution input info for the specified format. 83 * @param format Format of the input buffers. One of ImageFormat or PixelFormat constants. 84 * 85 * @see android.graphics.ImageFormat 86 * @see android.graphics.PixelFormat 87 * @see 88 * android.hardware.camera2.CameraCharacteristics#SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP 89 */ InputConfiguration(@onNull Collection<MultiResolutionStreamInfo> multiResolutionInputs, @Format int format)90 public InputConfiguration(@NonNull Collection<MultiResolutionStreamInfo> multiResolutionInputs, 91 @Format int format) { 92 checkCollectionNotEmpty(multiResolutionInputs, "Input multi-resolution stream info"); 93 MultiResolutionStreamInfo info = multiResolutionInputs.iterator().next(); 94 mWidth = info.getWidth(); 95 mHeight = info.getHeight(); 96 mFormat = format; 97 mIsMultiResolution = true; 98 } 99 100 /** 101 * @hide 102 */ InputConfiguration(int width, int height, int format, boolean isMultiResolution)103 public InputConfiguration(int width, int height, int format, boolean isMultiResolution) { 104 mWidth = width; 105 mHeight = height; 106 mFormat = format; 107 mIsMultiResolution = isMultiResolution; 108 } 109 110 /** 111 * Get the width of this input configuration. 112 * 113 * @return width of this input configuration. 114 */ getWidth()115 public int getWidth() { 116 return mWidth; 117 } 118 119 /** 120 * Get the height of this input configuration. 121 * 122 * @return height of this input configuration. 123 */ getHeight()124 public int getHeight() { 125 return mHeight; 126 } 127 128 /** 129 * Get the format of this input configuration. 130 * 131 * @return format of this input configuration. 132 */ getFormat()133 public int getFormat() { 134 return mFormat; 135 } 136 137 /** 138 * Whether this input configuration is of multi-resolution. 139 * 140 * <p>An multi-resolution InputConfiguration means that the reprocessing session created from it 141 * allows input images of different sizes.</p> 142 * 143 * @return this input configuration is multi-resolution or not. 144 */ isMultiResolution()145 public boolean isMultiResolution() { 146 return mIsMultiResolution; 147 } 148 149 /** 150 * Check if this InputConfiguration is equal to another InputConfiguration. 151 * 152 * <p>Two input configurations are equal if and only if they have the same widths, heights, and 153 * formats.</p> 154 * 155 * @param obj the object to compare this instance with. 156 * 157 * @return {@code true} if the objects were equal, {@code false} otherwise. 158 */ 159 @Override equals(@ullable Object obj)160 public boolean equals(@Nullable Object obj) { 161 if (!(obj instanceof InputConfiguration)) { 162 return false; 163 } 164 165 InputConfiguration otherInputConfig = (InputConfiguration) obj; 166 167 if (otherInputConfig.getWidth() == mWidth && 168 otherInputConfig.getHeight() == mHeight && 169 otherInputConfig.getFormat() == mFormat && 170 otherInputConfig.isMultiResolution() == mIsMultiResolution) { 171 return true; 172 } 173 return false; 174 } 175 176 /** 177 * {@inheritDoc} 178 */ 179 @Override hashCode()180 public int hashCode() { 181 return HashCodeHelpers.hashCode(mWidth, mHeight, mFormat, mIsMultiResolution ? 1 : 0); 182 } 183 184 /** 185 * Return this {@link InputConfiguration} as a string representation. 186 * 187 * <p> {@code "InputConfiguration(w:%d, h:%d, format:%d, isMultiResolution:%d)"}, 188 * where {@code %d} represents the width, height, format, and multi-resolution flag 189 * respectively.</p> 190 * 191 * @return string representation of {@link InputConfiguration} 192 */ 193 @Override toString()194 public String toString() { 195 return String.format("InputConfiguration(w:%d, h:%d, format:%d, isMultiResolution %b)", 196 mWidth, mHeight, mFormat, mIsMultiResolution); 197 } 198 } 199