blob: 0a4ed396ad53c7fce59e72674dd1f0a1fa584c1c [file] [log] [blame]
Yin-Chia Yeh35286a22015-03-09 16:53:14 -07001/*
2 * Copyright (C) 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
18package android.hardware.camera2.params;
19
20import android.hardware.camera2.CameraDevice;
Yin-Chia Yeh981e0562015-03-12 13:39:26 -070021import android.util.Log;
Yin-Chia Yeh35286a22015-03-09 16:53:14 -070022import android.view.Surface;
Yin-Chia Yeh981e0562015-03-12 13:39:26 -070023import android.os.Parcel;
24import android.os.Parcelable;
Yin-Chia Yeh35286a22015-03-09 16:53:14 -070025
26import static com.android.internal.util.Preconditions.*;
27
28/**
Yin-Chia Yeh981e0562015-03-12 13:39:26 -070029 * A class for describing camera output, which contains a {@link Surface} and its specific
Yin-Chia Yeh35286a22015-03-09 16:53:14 -070030 * configuration for creating capture session.
31 *
32 * @see CameraDevice#createCaptureSession
33 *
34 * @hide
35 */
Yin-Chia Yeh981e0562015-03-12 13:39:26 -070036public final class OutputConfiguration implements Parcelable {
Yin-Chia Yeh35286a22015-03-09 16:53:14 -070037
38 /**
39 * Rotation constant: 0 degree rotation (no rotation)
40 */
41 public static final int ROTATION_0 = 0;
42
43 /**
44 * Rotation constant: 90 degree counterclockwise rotation.
45 */
46 public static final int ROTATION_90 = 1;
47
48 /**
49 * Rotation constant: 180 degree counterclockwise rotation.
50 */
51 public static final int ROTATION_180 = 2;
52
53 /**
54 * Rotation constant: 270 degree counterclockwise rotation.
55 */
56 public static final int ROTATION_270 = 3;
57
58 /**
59 * Create a new immutable SurfaceConfiguration instance.
60 *
61 * @param surface
62 * A Surface for camera to output to.
63 *
64 * <p>This constructor creates a default configuration</p>
65 *
66 */
67 public OutputConfiguration(Surface surface) {
68 checkNotNull(surface, "Surface must not be null");
69 mSurface = surface;
70 mRotation = ROTATION_0;
71 }
72
73 /**
74 * Create a new immutable SurfaceConfiguration instance.
75 *
76 * <p>This constructor takes an argument for desired camera rotation</p>
77 *
78 * @param surface
79 * A Surface for camera to output to.
80 * @param rotation
81 * The desired rotation to be applied on camera output. Value must be one of
82 * ROTATION_[0, 90, 180, 270]. Note that when the rotation is 90 or 270 degree,
83 * application should make sure corresponding surface size has width and height
84 * transposed corresponding to the width and height without rotation. For example,
85 * if application needs camera to capture 1280x720 picture and rotate it by 90 degree,
86 * application should set rotation to {@code ROTATION_90} and make sure the
87 * corresponding Surface size is 720x1280. Note that {@link CameraDevice} might
88 * throw {@code IllegalArgumentException} if device cannot perform such rotation.
89 *
90 */
91 public OutputConfiguration(Surface surface, int rotation) {
92 checkNotNull(surface, "Surface must not be null");
93 checkArgumentInRange(rotation, ROTATION_0, ROTATION_270, "Rotation constant");
94 mSurface = surface;
95 mRotation = rotation;
96 }
97
98 /**
Yin-Chia Yeh981e0562015-03-12 13:39:26 -070099 * Create an OutputConfiguration from Parcel.
100 */
101 private OutputConfiguration(Parcel source) {
102 int rotation = source.readInt();
103 Surface surface = Surface.CREATOR.createFromParcel(source);
104 checkNotNull(surface, "Surface must not be null");
105 checkArgumentInRange(rotation, ROTATION_0, ROTATION_270, "Rotation constant");
106 mSurface = surface;
107 mRotation = rotation;
108 }
109
110 /**
Yin-Chia Yeh35286a22015-03-09 16:53:14 -0700111 * Get the {@link Surface} associated with this {@link OutputConfiguration}.
112 *
113 * @return the {@link Surface} associated with this {@link OutputConfiguration}.
114 */
115 public Surface getSurface() {
116 return mSurface;
117 }
118
119 /**
120 * Get the rotation associated with this {@link OutputConfiguration}.
121 *
122 * @return the rotation associated with this {@link OutputConfiguration}.
123 * Value will be one of ROTATION_[0, 90, 180, 270]
124 */
125 public int getRotation() {
126 return mRotation;
127 }
128
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700129 public static final Parcelable.Creator<OutputConfiguration> CREATOR =
130 new Parcelable.Creator<OutputConfiguration>() {
131 @Override
132 public OutputConfiguration createFromParcel(Parcel source) {
133 try {
134 OutputConfiguration outputConfiguration = new OutputConfiguration(source);
135 return outputConfiguration;
136 } catch (Exception e) {
137 Log.e(TAG, "Exception creating OutputConfiguration from parcel", e);
138 return null;
139 }
140 }
141
142 @Override
143 public OutputConfiguration[] newArray(int size) {
144 return new OutputConfiguration[size];
145 }
146 };
147
148 @Override
149 public int describeContents() {
150 return 0;
151 }
152
153 @Override
154 public void writeToParcel(Parcel dest, int flags) {
155 if (dest == null) {
156 throw new IllegalArgumentException("dest must not be null");
157 }
158 dest.writeInt(mRotation);
159 mSurface.writeToParcel(dest, flags);
160 }
161
162 private static final String TAG = "OutputConfiguration";
Yin-Chia Yeh35286a22015-03-09 16:53:14 -0700163 private final Surface mSurface;
164 private final int mRotation;
165}