| /* |
| * Copyright 2019 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.core; |
| |
| import android.util.Pair; |
| import android.util.Rational; |
| import android.util.Size; |
| import android.view.Surface; |
| |
| import androidx.annotation.NonNull; |
| import androidx.annotation.Nullable; |
| import androidx.annotation.RestrictTo; |
| import androidx.annotation.RestrictTo.Scope; |
| |
| import java.util.List; |
| import java.util.Set; |
| import java.util.UUID; |
| import java.util.concurrent.Executor; |
| |
| /** |
| * Config for a video capture use case. |
| * |
| * @hide In the earlier stage, the VideoCapture is deprioritized. |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public final class VideoCaptureConfig |
| implements UseCaseConfig<VideoCapture>, |
| ImageOutputConfig, |
| CameraDeviceConfig, |
| ThreadConfig { |
| |
| // Option Declarations: |
| // ********************************************************************************************* |
| |
| static final Option<Integer> OPTION_VIDEO_FRAME_RATE = |
| Option.create("camerax.core.videoCapture.recordingFrameRate", int.class); |
| static final Option<Integer> OPTION_BIT_RATE = |
| Option.create("camerax.core.videoCapture.bitRate", int.class); |
| static final Option<Integer> OPTION_INTRA_FRAME_INTERVAL = |
| Option.create("camerax.core.videoCapture.intraFrameInterval", int.class); |
| static final Option<Integer> OPTION_AUDIO_BIT_RATE = |
| Option.create("camerax.core.videoCapture.audioBitRate", int.class); |
| static final Option<Integer> OPTION_AUDIO_SAMPLE_RATE = |
| Option.create("camerax.core.videoCapture.audioSampleRate", int.class); |
| static final Option<Integer> OPTION_AUDIO_CHANNEL_COUNT = |
| Option.create("camerax.core.videoCapture.audioChannelCount", int.class); |
| static final Option<Integer> OPTION_AUDIO_RECORD_SOURCE = |
| Option.create("camerax.core.videoCapture.audioRecordSource", int.class); |
| static final Option<Integer> OPTION_AUDIO_MIN_BUFFER_SIZE = |
| Option.create("camerax.core.videoCapture.audioMinBufferSize", int.class); |
| |
| // ********************************************************************************************* |
| |
| private final OptionsBundle mConfig; |
| |
| VideoCaptureConfig(OptionsBundle config) { |
| mConfig = config; |
| } |
| |
| /** |
| * Returns the recording frames per second. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| public int getVideoFrameRate(int valueIfMissing) { |
| return retrieveOption(OPTION_VIDEO_FRAME_RATE, valueIfMissing); |
| } |
| |
| /** |
| * Returns the recording frames per second. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| public int getVideoFrameRate() { |
| return retrieveOption(OPTION_VIDEO_FRAME_RATE); |
| } |
| |
| /** |
| * Returns the encoding bit rate. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| public int getBitRate(int valueIfMissing) { |
| return retrieveOption(OPTION_BIT_RATE, valueIfMissing); |
| } |
| |
| /** |
| * Returns the encoding bit rate. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| public int getBitRate() { |
| return retrieveOption(OPTION_BIT_RATE); |
| } |
| |
| /** |
| * Returns the number of seconds between each key frame. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| public int getIFrameInterval(int valueIfMissing) { |
| return retrieveOption(OPTION_INTRA_FRAME_INTERVAL, valueIfMissing); |
| } |
| |
| /** |
| * Returns the number of seconds between each key frame. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| public int getIFrameInterval() { |
| return retrieveOption(OPTION_INTRA_FRAME_INTERVAL); |
| } |
| |
| /** |
| * Returns the audio encoding bit rate. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioBitRate(int valueIfMissing) { |
| return retrieveOption(OPTION_AUDIO_BIT_RATE, valueIfMissing); |
| } |
| |
| /** |
| * Returns the audio encoding bit rate. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioBitRate() { |
| return retrieveOption(OPTION_AUDIO_BIT_RATE); |
| } |
| |
| /** |
| * Returns the audio sample rate. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioSampleRate(int valueIfMissing) { |
| return retrieveOption(OPTION_AUDIO_SAMPLE_RATE, valueIfMissing); |
| } |
| |
| /** |
| * Returns the audio sample rate. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioSampleRate() { |
| return retrieveOption(OPTION_AUDIO_SAMPLE_RATE); |
| } |
| |
| /** |
| * Returns the audio channel count. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioChannelCount(int valueIfMissing) { |
| return retrieveOption(OPTION_AUDIO_CHANNEL_COUNT, valueIfMissing); |
| } |
| |
| /** |
| * Returns the audio channel count. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioChannelCount() { |
| return retrieveOption(OPTION_AUDIO_CHANNEL_COUNT); |
| } |
| |
| /** |
| * Returns the audio recording source. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioRecordSource(int valueIfMissing) { |
| return retrieveOption(OPTION_AUDIO_RECORD_SOURCE, valueIfMissing); |
| } |
| |
| /** |
| * Returns the audio recording source. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioRecordSource() { |
| return retrieveOption(OPTION_AUDIO_RECORD_SOURCE); |
| } |
| |
| /** |
| * Returns the audio minimum buffer size, in bytes. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioMinBufferSize(int valueIfMissing) { |
| return retrieveOption(OPTION_AUDIO_MIN_BUFFER_SIZE, valueIfMissing); |
| } |
| |
| /** |
| * Returns the audio minimum buffer size, in bytes. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getAudioMinBufferSize() { |
| return retrieveOption(OPTION_AUDIO_MIN_BUFFER_SIZE); |
| } |
| |
| // Start of the default implementation of Config |
| // ********************************************************************************************* |
| |
| // Implementations of Config default methods |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public boolean containsOption(@NonNull Option<?> id) { |
| return mConfig.containsOption(id); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public <ValueT> ValueT retrieveOption(@NonNull Option<ValueT> id) { |
| return mConfig.retrieveOption(id); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public <ValueT> ValueT retrieveOption(@NonNull Option<ValueT> id, |
| @Nullable ValueT valueIfMissing) { |
| return mConfig.retrieveOption(id, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public void findOptions(@NonNull String idStem, @NonNull OptionMatcher matcher) { |
| mConfig.findOptions(idStem, matcher); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Set<Option<?>> listOptions() { |
| return mConfig.listOptions(); |
| } |
| |
| // Implementations of TargetConfig default methods |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public Class<VideoCapture> getTargetClass( |
| @Nullable Class<VideoCapture> valueIfMissing) { |
| @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass() |
| Class<VideoCapture> storedClass = |
| (Class<VideoCapture>) retrieveOption( |
| OPTION_TARGET_CLASS, |
| valueIfMissing); |
| return storedClass; |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Class<VideoCapture> getTargetClass() { |
| @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass() |
| Class<VideoCapture> storedClass = |
| (Class<VideoCapture>) retrieveOption( |
| OPTION_TARGET_CLASS); |
| return storedClass; |
| } |
| |
| /** |
| * Retrieves the name of the target object being configured. |
| * |
| * <p>The name should be a value that can uniquely identify an instance of the object being |
| * configured. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| @Override |
| @Nullable |
| public String getTargetName(@Nullable String valueIfMissing) { |
| return retrieveOption(OPTION_TARGET_NAME, valueIfMissing); |
| } |
| |
| /** |
| * Retrieves the name of the target object being configured. |
| * |
| * <p>The name should be a value that can uniquely identify an instance of the object being |
| * configured. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| @Override |
| @NonNull |
| public String getTargetName() { |
| return retrieveOption(OPTION_TARGET_NAME); |
| } |
| |
| // Implementations of CameraDeviceConfig default methods |
| |
| /** |
| * Returns the lens-facing direction of the camera being configured. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| @Override |
| @Nullable |
| public CameraX.LensFacing getLensFacing(@Nullable CameraX.LensFacing valueIfMissing) { |
| return retrieveOption(OPTION_LENS_FACING, valueIfMissing); |
| } |
| |
| /** |
| * Retrieves the lens facing direction for the primary camera to be configured. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| @Override |
| @NonNull |
| public CameraX.LensFacing getLensFacing() { |
| return retrieveOption(OPTION_LENS_FACING); |
| } |
| |
| /** |
| * Returns the set of {@link CameraIdFilter} that filter out unavailable camera id. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>ValueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public CameraIdFilter getCameraIdFilter(@Nullable CameraIdFilter valueIfMissing) { |
| return retrieveOption(OPTION_CAMERA_ID_FILTER, valueIfMissing); |
| } |
| |
| /** |
| * Returns the set of {@link CameraIdFilter} that filter out unavailable camera id. |
| * |
| * @return The stored value, if it exists in the configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public CameraIdFilter getCameraIdFilter() { |
| return retrieveOption(OPTION_CAMERA_ID_FILTER); |
| } |
| |
| // Implementations of ImageOutputConfig default methods |
| |
| /** |
| * Retrieves the aspect ratio of the target intending to use images from this configuration. |
| * |
| * <p>This is the ratio of the target's width to the image's height, where the numerator of the |
| * provided {@link Rational} corresponds to the width, and the denominator corresponds to the |
| * height. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public Rational getTargetAspectRatioCustom(@Nullable Rational valueIfMissing) { |
| return retrieveOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM, valueIfMissing); |
| } |
| |
| /** |
| * Retrieves the aspect ratio of the target intending to use images from this configuration. |
| * |
| * <p>This is the ratio of the target's width to the image's height, where the numerator of the |
| * provided {@link Rational} corresponds to the width, and the denominator corresponds to the |
| * height. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @NonNull |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public Rational getTargetAspectRatioCustom() { |
| return retrieveOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM); |
| } |
| |
| /** |
| * Retrieves the aspect ratio of the target intending to use images from this configuration. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| @Nullable |
| @Override |
| public AspectRatio getTargetAspectRatio(@Nullable AspectRatio valueIfMissing) { |
| return retrieveOption(OPTION_TARGET_ASPECT_RATIO, valueIfMissing); |
| } |
| |
| /** |
| * Retrieves the aspect ratio of the target intending to use images from this configuration. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| @NonNull |
| @Override |
| public AspectRatio getTargetAspectRatio() { |
| return retrieveOption(OPTION_TARGET_ASPECT_RATIO); |
| } |
| |
| /** |
| * Retrieves the rotation of the target intending to use images from this configuration. |
| * |
| * <p>This is one of four valid values: {@link Surface#ROTATION_0}, {@link Surface#ROTATION_90}, |
| * {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}. Rotation values are relative to |
| * the device's "natural" rotation, {@link Surface#ROTATION_0}. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| @Override |
| @RotationValue |
| public int getTargetRotation(int valueIfMissing) { |
| return retrieveOption(OPTION_TARGET_ROTATION, valueIfMissing); |
| } |
| |
| /** |
| * Retrieves the rotation of the target intending to use images from this configuration. |
| * |
| * <p>This is one of four valid values: {@link Surface#ROTATION_0}, {@link Surface#ROTATION_90}, |
| * {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}. Rotation values are relative to |
| * the device's "natural" rotation, {@link Surface#ROTATION_0}. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| @Override |
| @RotationValue |
| public int getTargetRotation() { |
| return retrieveOption(OPTION_TARGET_ROTATION); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public Size getTargetResolution(@Nullable Size valueIfMissing) { |
| return retrieveOption(ImageOutputConfig.OPTION_TARGET_RESOLUTION, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Size getTargetResolution() { |
| return retrieveOption(ImageOutputConfig.OPTION_TARGET_RESOLUTION); |
| } |
| |
| /** |
| * Retrieves the default resolution of the target intending to use from this configuration. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| * @hide |
| */ |
| @Nullable |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public Size getDefaultResolution(@Nullable Size valueIfMissing) { |
| return retrieveOption(ImageOutputConfig.OPTION_DEFAULT_RESOLUTION, valueIfMissing); |
| } |
| |
| /** |
| * Retrieves the default resolution of the target intending to use from this configuration. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| * @hide |
| */ |
| @NonNull |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public Size getDefaultResolution() { |
| return retrieveOption(ImageOutputConfig.OPTION_DEFAULT_RESOLUTION); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public Size getMaxResolution(@Nullable Size valueIfMissing) { |
| return retrieveOption(OPTION_MAX_RESOLUTION, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Size getMaxResolution() { |
| return retrieveOption(OPTION_MAX_RESOLUTION); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public List<Pair<Integer, Size[]>> getSupportedResolutions( |
| @Nullable List<Pair<Integer, Size[]>> valueIfMissing) { |
| return retrieveOption(OPTION_SUPPORTED_RESOLUTIONS, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public List<Pair<Integer, Size[]>> getSupportedResolutions() { |
| return retrieveOption(OPTION_SUPPORTED_RESOLUTIONS); |
| } |
| |
| // Implementations of ThreadConfig default methods |
| |
| /** |
| * Returns the executor that will be used for background tasks. |
| * |
| * @param valueIfMissing The value to return if this configuration option has not been set. |
| * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this |
| * configuration. |
| */ |
| @Override |
| @Nullable |
| public Executor getBackgroundExecutor(@Nullable Executor valueIfMissing) { |
| return retrieveOption(OPTION_BACKGROUND_EXECUTOR, valueIfMissing); |
| } |
| |
| /** |
| * Returns the executor that will be used for background tasks. |
| * |
| * @return The stored value, if it exists in this configuration. |
| * @throws IllegalArgumentException if the option does not exist in this configuration. |
| */ |
| @Override |
| @NonNull |
| public Executor getBackgroundExecutor() { |
| return retrieveOption(OPTION_BACKGROUND_EXECUTOR); |
| } |
| |
| // Implementations of UseCaseConfig default methods |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public SessionConfig getDefaultSessionConfig(@Nullable SessionConfig valueIfMissing) { |
| return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public SessionConfig getDefaultSessionConfig() { |
| return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public SessionConfig.OptionUnpacker getSessionOptionUnpacker( |
| @Nullable SessionConfig.OptionUnpacker valueIfMissing) { |
| return retrieveOption(OPTION_SESSION_CONFIG_UNPACKER, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public SessionConfig.OptionUnpacker getSessionOptionUnpacker() { |
| return retrieveOption(OPTION_SESSION_CONFIG_UNPACKER); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public CaptureConfig getDefaultCaptureConfig(@Nullable CaptureConfig valueIfMissing) { |
| return retrieveOption(OPTION_DEFAULT_CAPTURE_CONFIG, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public CaptureConfig getDefaultCaptureConfig() { |
| return retrieveOption(OPTION_DEFAULT_CAPTURE_CONFIG); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public CaptureConfig.OptionUnpacker getCaptureOptionUnpacker( |
| @Nullable CaptureConfig.OptionUnpacker valueIfMissing) { |
| return retrieveOption(OPTION_CAPTURE_CONFIG_UNPACKER, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public CaptureConfig.OptionUnpacker getCaptureOptionUnpacker() { |
| return retrieveOption(OPTION_CAPTURE_CONFIG_UNPACKER); |
| } |
| |
| /** @hide */ |
| @Override |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getSurfaceOccupancyPriority(int valueIfMissing) { |
| return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @Override |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| public int getSurfaceOccupancyPriority() { |
| return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @Nullable |
| public UseCase.EventListener getUseCaseEventListener( |
| @Nullable UseCase.EventListener valueIfMissing) { |
| return retrieveOption(OPTION_USE_CASE_EVENT_LISTENER, valueIfMissing); |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public UseCase.EventListener getUseCaseEventListener() { |
| return retrieveOption(OPTION_USE_CASE_EVENT_LISTENER); |
| } |
| |
| // End of the default implementation of Config |
| // ********************************************************************************************* |
| |
| /** Builder for a {@link VideoCaptureConfig}. */ |
| public static final class Builder |
| implements |
| UseCaseConfig.Builder<VideoCapture, VideoCaptureConfig, Builder>, |
| ImageOutputConfig.Builder<Builder>, |
| CameraDeviceConfig.Builder<Builder>, |
| ThreadConfig.Builder<Builder> { |
| |
| private final MutableOptionsBundle mMutableConfig; |
| |
| /** Creates a new Builder object. */ |
| public Builder() { |
| this(MutableOptionsBundle.create()); |
| } |
| |
| private Builder(MutableOptionsBundle mutableConfig) { |
| mMutableConfig = mutableConfig; |
| |
| Class<?> oldConfigClass = |
| mutableConfig.retrieveOption(TargetConfig.OPTION_TARGET_CLASS, null); |
| if (oldConfigClass != null && !oldConfigClass.equals(VideoCapture.class)) { |
| throw new IllegalArgumentException( |
| "Invalid target class configuration for " |
| + Builder.this |
| + ": " |
| + oldConfigClass); |
| } |
| |
| setTargetClass(VideoCapture.class); |
| } |
| |
| /** |
| * Generates a Builder from another Config object |
| * |
| * @param configuration An immutable configuration to pre-populate this builder. |
| * @return The new Builder. |
| */ |
| @NonNull |
| public static Builder fromConfig(@NonNull VideoCaptureConfig configuration) { |
| return new Builder(MutableOptionsBundle.from(configuration)); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public MutableConfig getMutableConfig() { |
| return mMutableConfig; |
| } |
| |
| /** |
| * Builds an immutable {@link VideoCaptureConfig} from the current state. |
| * |
| * @return A {@link VideoCaptureConfig} populated with the current state. |
| */ |
| @Override |
| @NonNull |
| public VideoCaptureConfig build() { |
| // Error at runtime for using both setTargetResolution and setTargetAspectRatio on |
| // the same config. |
| if (getMutableConfig().retrieveOption(OPTION_TARGET_ASPECT_RATIO, null) != null |
| && getMutableConfig().retrieveOption(OPTION_TARGET_RESOLUTION, null) != null) { |
| throw new IllegalArgumentException( |
| "Cannot use both setTargetResolution and setTargetAspectRatio on the same " |
| + "config."); |
| } |
| return new VideoCaptureConfig(OptionsBundle.from(mMutableConfig)); |
| } |
| |
| /** |
| * Sets the recording frames per second. |
| * |
| * @param videoFrameRate The requested interval in seconds. |
| * @return The current Builder. |
| */ |
| @NonNull |
| public Builder setVideoFrameRate(int videoFrameRate) { |
| getMutableConfig().insertOption(OPTION_VIDEO_FRAME_RATE, videoFrameRate); |
| return this; |
| } |
| |
| /** |
| * Sets the encoding bit rate. |
| * |
| * @param bitRate The requested bit rate in bits per second. |
| * @return The current Builder. |
| */ |
| @NonNull |
| public Builder setBitRate(int bitRate) { |
| getMutableConfig().insertOption(OPTION_BIT_RATE, bitRate); |
| return this; |
| } |
| |
| /** |
| * Sets number of seconds between each key frame in seconds. |
| * |
| * @param interval The requested interval in seconds. |
| * @return The current Builder. |
| */ |
| @NonNull |
| public Builder setIFrameInterval(int interval) { |
| getMutableConfig().insertOption(OPTION_INTRA_FRAME_INTERVAL, interval); |
| return this; |
| } |
| |
| /** |
| * Sets the bit rate of the audio stream. |
| * |
| * @param bitRate The requested bit rate in bits/s. |
| * @return The current Builder. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @NonNull |
| public Builder setAudioBitRate(int bitRate) { |
| getMutableConfig().insertOption(OPTION_AUDIO_BIT_RATE, bitRate); |
| return this; |
| } |
| |
| /** |
| * Sets the sample rate of the audio stream. |
| * |
| * @param sampleRate The requested sample rate in bits/s. |
| * @return The current Builder. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @NonNull |
| public Builder setAudioSampleRate(int sampleRate) { |
| getMutableConfig().insertOption(OPTION_AUDIO_SAMPLE_RATE, sampleRate); |
| return this; |
| } |
| |
| /** |
| * Sets the number of audio channels. |
| * |
| * @param channelCount The requested number of audio channels. |
| * @return The current Builder. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @NonNull |
| public Builder setAudioChannelCount(int channelCount) { |
| getMutableConfig().insertOption(OPTION_AUDIO_CHANNEL_COUNT, channelCount); |
| return this; |
| } |
| |
| /** |
| * Sets the audio source. |
| * |
| * @param source The audio source. Currently only AudioSource.MIC is supported. |
| * @return The current Builder. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @NonNull |
| public Builder setAudioRecordSource(int source) { |
| getMutableConfig().insertOption(OPTION_AUDIO_RECORD_SOURCE, source); |
| return this; |
| } |
| |
| /** |
| * Sets the audio min buffer size. |
| * |
| * @param minBufferSize The requested audio minimum buffer size, in bytes. |
| * @return The current Builder. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @NonNull |
| public Builder setAudioMinBufferSize(int minBufferSize) { |
| getMutableConfig().insertOption(OPTION_AUDIO_MIN_BUFFER_SIZE, minBufferSize); |
| return this; |
| } |
| |
| // Implementations of TargetConfig.Builder default methods |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setTargetClass(@NonNull Class<VideoCapture> targetClass) { |
| getMutableConfig().insertOption(OPTION_TARGET_CLASS, targetClass); |
| |
| // If no name is set yet, then generate a unique name |
| if (null == getMutableConfig().retrieveOption(OPTION_TARGET_NAME, null)) { |
| String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID(); |
| setTargetName(targetName); |
| } |
| |
| return this; |
| } |
| |
| /** |
| * Sets the name of the target object being configured. |
| * |
| * <p>The name should be a value that can uniquely identify an instance of the object being |
| * configured. |
| * |
| * @param targetName A unique string identifier for the instance of the class being |
| * configured. |
| * @return the current Builder. |
| */ |
| @Override |
| @NonNull |
| public Builder setTargetName(@NonNull String targetName) { |
| getMutableConfig().insertOption(OPTION_TARGET_NAME, targetName); |
| return this; |
| } |
| |
| // Implementations of CameraDeviceConfig.Builder default methods |
| |
| /** |
| * Sets the primary camera to be configured based on the direction the lens is facing. |
| * |
| * <p>If multiple cameras exist with equivalent lens facing direction, the first ("primary") |
| * camera for that direction will be chosen. |
| * |
| * @param lensFacing The direction of the camera's lens. |
| * @return the current Builder. |
| */ |
| @Override |
| @NonNull |
| public Builder setLensFacing(@NonNull CameraX.LensFacing lensFacing) { |
| getMutableConfig().insertOption(OPTION_LENS_FACING, lensFacing); |
| return this; |
| } |
| |
| /** |
| * Sets a {@link CameraIdFilter} that filter out the unavailable camera id. |
| * |
| * <p>The camera id filter will be used to filter those cameras with lens facing |
| * specified in the config. |
| * |
| * @param cameraIdFilter The {@link CameraIdFilter}. |
| * @return the current Builder. |
| * @hide |
| */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setCameraIdFilter(@NonNull CameraIdFilter cameraIdFilter) { |
| getMutableConfig().insertOption(OPTION_CAMERA_ID_FILTER, cameraIdFilter); |
| return this; |
| } |
| |
| // Implementations of ImageOutputConfig.Builder default methods |
| |
| /** |
| * Sets the aspect ratio of the intended target for images from this configuration. |
| * |
| * <p>This is the ratio of the target's width to the image's height, where the numerator of |
| * the provided {@link Rational} corresponds to the width, and the denominator corresponds |
| * to the height. |
| * |
| * <p>The target aspect ratio is used as a hint when determining the resulting output aspect |
| * ratio which may differ from the request, possibly due to device constraints. |
| * Application code should check the resulting output's resolution. |
| * |
| * <p>This method can be used to request an aspect ratio that is not from the standard set |
| * of aspect ratios defined in the {@link AspectRatio}. |
| * |
| * <p>This method will remove any value set by setTargetAspectRatio(). |
| * |
| * <p>For VideoCapture the output is the output video file. |
| * |
| * @param aspectRatio A {@link Rational} representing the ratio of the target's width and |
| * height. |
| * @return The current Builder. |
| * @hide |
| */ |
| @NonNull |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public Builder setTargetAspectRatioCustom(@NonNull Rational aspectRatio) { |
| getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM, aspectRatio); |
| getMutableConfig().removeOption(OPTION_TARGET_ASPECT_RATIO); |
| return this; |
| } |
| |
| /** |
| * Sets the aspect ratio of the intended target for images from this configuration. |
| * |
| * <p>It is not allowed to set both target aspect ratio and target resolution on the same |
| * use case. |
| * |
| * <p>The target aspect ratio is used as a hint when determining the resulting output aspect |
| * ratio which may differ from the request, possibly due to device constraints. |
| * Application code should check the resulting output's resolution. |
| * |
| * @param aspectRatio A {@link AspectRatio} representing the ratio of the |
| * target's width and height. |
| * @return The current Builder. |
| */ |
| @NonNull |
| @Override |
| public Builder setTargetAspectRatio(@NonNull AspectRatio aspectRatio) { |
| getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio); |
| return this; |
| } |
| |
| /** |
| * Sets the rotation of the intended target for images from this configuration. |
| * |
| * <p>This is one of four valid values: {@link Surface#ROTATION_0}, {@link |
| * Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}. |
| * Rotation values are relative to the "natural" rotation, {@link Surface#ROTATION_0}. |
| * |
| * @param rotation The rotation of the intended target. |
| * @return The current Builder. |
| */ |
| @NonNull |
| @Override |
| public Builder setTargetRotation(@RotationValue int rotation) { |
| getMutableConfig().insertOption(OPTION_TARGET_ROTATION, rotation); |
| return this; |
| } |
| |
| /** |
| * Sets the resolution of the intended target from this configuration. |
| * |
| * <p>The target resolution attempts to establish a minimum bound for the image resolution. |
| * The actual image resolution will be the closest available resolution in size that is not |
| * smaller than the target resolution, as determined by the Camera implementation. However, |
| * if no resolution exists that is equal to or larger than the target resolution, the |
| * nearest available resolution smaller than the target resolution will be chosen. |
| * |
| * <p>It is not allowed to set both target aspect ratio and target resolution on the same |
| * use case. |
| * |
| * <p>The target aspect ratio will also be set the same as the aspect ratio of the provided |
| * {@link Size}. Make sure to set the target resolution with the correct orientation. |
| * |
| * @param resolution The target resolution to choose from supported output sizes list. |
| * @return The current Builder. |
| * @hide |
| */ |
| @NonNull |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public Builder setTargetResolution(@NonNull Size resolution) { |
| getMutableConfig().insertOption(OPTION_TARGET_RESOLUTION, resolution); |
| if (resolution != null) { |
| getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM, |
| new Rational(resolution.getWidth(), resolution.getHeight())); |
| } |
| return this; |
| } |
| |
| /** |
| * Sets the default resolution of the intended target from this configuration. |
| * |
| * @param resolution The default resolution to choose from supported output sizes list. |
| * @return The current Builder. |
| * @hide |
| */ |
| @NonNull |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public Builder setDefaultResolution(@NonNull Size resolution) { |
| getMutableConfig().insertOption(OPTION_DEFAULT_RESOLUTION, resolution); |
| return null; |
| } |
| |
| /** @hide */ |
| @NonNull |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| public Builder setMaxResolution(@NonNull Size resolution) { |
| getMutableConfig().insertOption(OPTION_MAX_RESOLUTION, resolution); |
| return this; |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setSupportedResolutions(@NonNull List<Pair<Integer, Size[]>> resolutions) { |
| getMutableConfig().insertOption(OPTION_SUPPORTED_RESOLUTIONS, resolutions); |
| return this; |
| } |
| |
| // Implementations of ThreadConfig.Builder default methods |
| |
| /** |
| * Sets the default executor that will be used for background tasks. |
| * |
| * @param executor The executor which will be used for background tasks. |
| * @return the current Builder. |
| */ |
| @Override |
| @NonNull |
| public Builder setBackgroundExecutor(@NonNull Executor executor) { |
| getMutableConfig().insertOption(OPTION_BACKGROUND_EXECUTOR, executor); |
| return this; |
| } |
| |
| // Implementations of UseCaseConfig.Builder default methods |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setDefaultSessionConfig(@NonNull SessionConfig sessionConfig) { |
| getMutableConfig().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig); |
| return this; |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setDefaultCaptureConfig(@NonNull CaptureConfig captureConfig) { |
| getMutableConfig().insertOption(OPTION_DEFAULT_CAPTURE_CONFIG, captureConfig); |
| return this; |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setSessionOptionUnpacker( |
| @NonNull SessionConfig.OptionUnpacker optionUnpacker) { |
| getMutableConfig().insertOption(OPTION_SESSION_CONFIG_UNPACKER, optionUnpacker); |
| return this; |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setCaptureOptionUnpacker( |
| @NonNull CaptureConfig.OptionUnpacker optionUnpacker) { |
| getMutableConfig().insertOption(OPTION_CAPTURE_CONFIG_UNPACKER, optionUnpacker); |
| return this; |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setSurfaceOccupancyPriority(int priority) { |
| getMutableConfig().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority); |
| return this; |
| } |
| |
| /** @hide */ |
| @RestrictTo(Scope.LIBRARY_GROUP) |
| @Override |
| @NonNull |
| public Builder setUseCaseEventListener( |
| @NonNull UseCase.EventListener useCaseEventListener) { |
| getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_LISTENER, useCaseEventListener); |
| return this; |
| } |
| } |
| } |