194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin/*
294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * Copyright (C) 2014 The Android Open Source Project
394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin *
494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * you may not use this file except in compliance with the License.
694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * You may obtain a copy of the License at
794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin *
894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin *
1094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * Unless required by applicable law or agreed to in writing, software
1194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
1294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * See the License for the specific language governing permissions and
1494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * limitations under the License.
1594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin */
1694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
179c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkinpackage android.hardware.camera2.params;
1894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
1994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkinimport static com.android.internal.util.Preconditions.*;
209c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkinimport static android.hardware.camera2.params.StreamConfigurationMap.checkArgumentFormatInternal;
2194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
2294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkinimport android.graphics.ImageFormat;
239c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkinimport android.hardware.camera2.CameraCharacteristics;
243c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.utils.HashCodeHelpers;
259c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkinimport android.graphics.PixelFormat;
2694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkinimport android.util.Size;
2794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
2894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin/**
2994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * Immutable class to store a time duration for any given format/size combination.
3094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin *
3194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * @see CameraCharacteristics#SCALER_AVAILABLE_STREAM_CONFIGURATIONS
3294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * @see CameraCharacteristics#SCALER_AVAILABLE_MIN_FRAME_DURATIONS
3394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * @see CameraCharacteristics#SCALER_AVAILABLE_STALL_DURATIONS
3494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin *
3594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin * @hide
3694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin */
3794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkinpublic final class StreamConfigurationDuration {
3894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
3994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
4094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * Create a new {@link StreamConfigurationDuration}.
4194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
4294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @param format image format
4394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @param width image width, in pixels (positive)
4494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @param height image height, in pixels (positive)
4594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @param durationNs duration in nanoseconds (non-negative)
4694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
4794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @throws IllegalArgumentException
4894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *          if width/height were not positive, or durationNs was negative
4994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *          or if the format was not user-defined in ImageFormat/PixelFormat
5094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *              (IMPL_DEFINED is OK)
5194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
5294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
5394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @hide
5494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
5594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public StreamConfigurationDuration(
5694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            final int format, final int width, final int height, final long durationNs) {
5794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        mFormat =  checkArgumentFormatInternal(format);
5894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        mWidth = checkArgumentPositive(width, "width must be positive");
593c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        mHeight = checkArgumentPositive(height, "height must be positive");
6094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        mDurationNs = checkArgumentNonnegative(durationNs, "durationNs must be non-negative");
6194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
6294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
6394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
649c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkin     * Get the internal image {@code format} in this stream configuration duration
6594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
6694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @return an integer format
6794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
6894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @see ImageFormat
699c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkin     * @see PixelFormat
7094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
7194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public final int getFormat() {
7294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return mFormat;
7394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
7494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
7594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
7694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
7794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * Return the width of the stream configuration duration.
7894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
7994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @return width > 0
8094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
8194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public int getWidth() {
8294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return mWidth;
8394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
8494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
8594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
8694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * Return the height of the stream configuration duration
8794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
8894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @return height > 0
8994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
9094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public int getHeight() {
9194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return mHeight;
9294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
9394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
9494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
9594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * Convenience method to return the size of this stream configuration duration.
9694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
9794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @return a Size with positive width and height
9894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
9994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public Size getSize() {
10094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return new Size(mWidth, mHeight);
10194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
10294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
10394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
10494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * Get the time duration (in nanoseconds).
10594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
10694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @return long >= 0
10794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
10894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public long getDuration() {
10994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return mDurationNs;
11094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
11194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
11294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
11394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * Check if this {@link StreamConfigurationDuration} is equal to another
11494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * {@link StreamConfigurationDuration}.
11594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
11694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * <p>Two vectors are only equal if and only if each of the respective elements is equal.</p>
11794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
11894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @return {@code true} if the objects were equal, {@code false} otherwise
11994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
12094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    @Override
12194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public boolean equals(final Object obj) {
12294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        if (obj == null) {
12394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            return false;
12494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        }
12594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        if (this == obj) {
12694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            return true;
12794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        }
12894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        if (obj instanceof StreamConfigurationDuration) {
12994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            final StreamConfigurationDuration other = (StreamConfigurationDuration) obj;
13094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            return mFormat == other.mFormat &&
13194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin                    mWidth == other.mWidth &&
13294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin                    mHeight == other.mHeight &&
13394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin                    mDurationNs == other.mDurationNs;
13494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        }
13594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return false;
13694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
13794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
13894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
13994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * {@inheritDoc}
14094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
14194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    @Override
14294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public int hashCode() {
14394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return HashCodeHelpers.hashCode(mFormat, mWidth, mHeight,
14494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin                (int) mDurationNs, (int)(mDurationNs >>> Integer.SIZE));
14594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
14694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
14794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    private final int mFormat;
14894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    private final int mWidth;
14994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    private final int mHeight;
15094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    private final long mDurationNs;
15194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin}
152