| /* |
| * Copyright (C) 2018 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 android.media; |
| |
| import android.annotation.IntDef; |
| import android.annotation.NonNull; |
| import android.annotation.TestApi; |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| |
| import java.util.HashMap; |
| import java.util.Locale; |
| import java.util.Map; |
| |
| |
| /** |
| * The AudioPresentation class encapsulates the information that describes an audio presentation |
| * which is available in next generation audio content. |
| * |
| * Used by {@link MediaExtractor} {@link MediaExtractor#getAudioPresentations(int)} and |
| * {@link AudioTrack} {@link AudioTrack#setPresentation(AudioPresentation)} to query available |
| * presentations and to select one. |
| * |
| * A list of available audio presentations in a media source can be queried using |
| * {@link MediaExtractor#getAudioPresentations(int)}. This list can be presented to a user for |
| * selection. |
| * An AudioPresentation can be passed to an offloaded audio decoder via |
| * {@link AudioTrack#setPresentation(AudioPresentation)} to request decoding of the selected |
| * presentation. An audio stream may contain multiple presentations that differ by language, |
| * accessibility, end point mastering and dialogue enhancement. An audio presentation may also have |
| * a set of description labels in different languages to help the user to make an informed |
| * selection. |
| */ |
| public final class AudioPresentation { |
| private final int mPresentationId; |
| private final int mProgramId; |
| private final Map<String, String> mLabels; |
| private final String mLanguage; |
| |
| /** @hide */ |
| @IntDef( |
| value = { |
| MASTERING_NOT_INDICATED, |
| MASTERED_FOR_STEREO, |
| MASTERED_FOR_SURROUND, |
| MASTERED_FOR_3D, |
| MASTERED_FOR_HEADPHONE, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| public @interface MasteringIndicationType {} |
| |
| private final @MasteringIndicationType int mMasteringIndication; |
| private final boolean mAudioDescriptionAvailable; |
| private final boolean mSpokenSubtitlesAvailable; |
| private final boolean mDialogueEnhancementAvailable; |
| |
| /** |
| * No preferred reproduction channel layout. |
| */ |
| public static final int MASTERING_NOT_INDICATED = 0; |
| /** |
| * Stereo speaker layout. |
| */ |
| public static final int MASTERED_FOR_STEREO = 1; |
| /** |
| * Two-dimensional (e.g. 5.1) speaker layout. |
| */ |
| public static final int MASTERED_FOR_SURROUND = 2; |
| /** |
| * Three-dimensional (e.g. 5.1.2) speaker layout. |
| */ |
| public static final int MASTERED_FOR_3D = 3; |
| /** |
| * Prerendered for headphone playback. |
| */ |
| public static final int MASTERED_FOR_HEADPHONE = 4; |
| |
| /** |
| * @hide |
| */ |
| @TestApi |
| public AudioPresentation(int presentationId, |
| int programId, |
| @NonNull Map<String, String> labels, |
| @NonNull String language, |
| @MasteringIndicationType int masteringIndication, |
| boolean audioDescriptionAvailable, |
| boolean spokenSubtitlesAvailable, |
| boolean dialogueEnhancementAvailable) { |
| this.mPresentationId = presentationId; |
| this.mProgramId = programId; |
| this.mLanguage = language; |
| this.mMasteringIndication = masteringIndication; |
| this.mAudioDescriptionAvailable = audioDescriptionAvailable; |
| this.mSpokenSubtitlesAvailable = spokenSubtitlesAvailable; |
| this.mDialogueEnhancementAvailable = dialogueEnhancementAvailable; |
| |
| this.mLabels = new HashMap<String, String>(labels); |
| } |
| |
| /** |
| * The framework uses this presentation id to select an audio presentation rendered by a |
| * decoder. Presentation id is typically sequential, but does not have to be. |
| * @hide |
| */ |
| @TestApi |
| public int getPresentationId() { |
| return mPresentationId; |
| } |
| |
| /** |
| * The framework uses this program id to select an audio presentation rendered by a decoder. |
| * Program id can be used to further uniquely identify the presentation to a decoder. |
| * @hide |
| */ |
| @TestApi |
| public int getProgramId() { |
| return mProgramId; |
| } |
| |
| /** |
| * @return a map of available text labels for this presentation. Each label is indexed by its |
| * locale corresponding to the language code as specified by ISO 639-2. Either ISO 639-2/B |
| * or ISO 639-2/T could be used. |
| */ |
| public Map<Locale, String> getLabels() { |
| Map<Locale, String> localeLabels = new HashMap<>(); |
| for (Map.Entry<String, String> entry : mLabels.entrySet()) { |
| localeLabels.put(new Locale(entry.getKey()), entry.getValue()); |
| } |
| return localeLabels; |
| } |
| |
| /** |
| * @return the locale corresponding to audio presentation's ISO 639-1/639-2 language code. |
| */ |
| public Locale getLocale() { |
| return new Locale(mLanguage); |
| } |
| |
| /** |
| * @return the mastering indication of the audio presentation. |
| * See {@link #MASTERING_NOT_INDICATED}, {@link #MASTERED_FOR_STEREO}, |
| * {@link #MASTERED_FOR_SURROUND}, {@link #MASTERED_FOR_3D}, {@link #MASTERED_FOR_HEADPHONE} |
| */ |
| @MasteringIndicationType |
| public int getMasteringIndication() { |
| return mMasteringIndication; |
| } |
| |
| /** |
| * Indicates whether an audio description for the visually impaired is available. |
| * @return {@code true} if audio description is available. |
| */ |
| public boolean hasAudioDescription() { |
| return mAudioDescriptionAvailable; |
| } |
| |
| /** |
| * Indicates whether spoken subtitles for the visually impaired are available. |
| * @return {@code true} if spoken subtitles are available. |
| */ |
| public boolean hasSpokenSubtitles() { |
| return mSpokenSubtitlesAvailable; |
| } |
| |
| /** |
| * Indicates whether dialogue enhancement is available. |
| * @return {@code true} if dialogue enhancement is available. |
| */ |
| public boolean hasDialogueEnhancement() { |
| return mDialogueEnhancementAvailable; |
| } |
| } |