11f213914c45c23c653f721690da2ce0718e63139Dongwon Kang/* 21f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * Copyright (C) 2014 The Android Open Source Project 31f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 41f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * Licensed under the Apache License, Version 2.0 (the "License"); 51f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * you may not use this file except in compliance with the License. 61f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * You may obtain a copy of the License at 71f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 81f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * http://www.apache.org/licenses/LICENSE-2.0 91f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 101f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * Unless required by applicable law or agreed to in writing, software 111f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * distributed under the License is distributed on an "AS IS" BASIS, 121f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * See the License for the specific language governing permissions and 141f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * limitations under the License. 151f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 161f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 171f213914c45c23c653f721690da2ce0718e63139Dongwon Kangpackage android.media.tv; 181f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 19cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seoimport android.annotation.IntDef; 20de08be8f79ea40f3dffae9edff4227704a5c0a3aJae Seoimport android.annotation.NonNull; 211f213914c45c23c653f721690da2ce0718e63139Dongwon Kangimport android.os.Bundle; 221f213914c45c23c653f721690da2ce0718e63139Dongwon Kangimport android.os.Parcel; 231f213914c45c23c653f721690da2ce0718e63139Dongwon Kangimport android.os.Parcelable; 24c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubangimport android.text.TextUtils; 251f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 26de08be8f79ea40f3dffae9edff4227704a5c0a3aJae Seoimport com.android.internal.util.Preconditions; 27de08be8f79ea40f3dffae9edff4227704a5c0a3aJae Seo 28cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seoimport java.lang.annotation.Retention; 29cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seoimport java.lang.annotation.RetentionPolicy; 30c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubangimport java.util.Objects; 31c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang 321f213914c45c23c653f721690da2ce0718e63139Dongwon Kang/** 331f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * Encapsulates the format of tracks played in {@link TvInputService}. 341f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 351f213914c45c23c653f721690da2ce0718e63139Dongwon Kangpublic final class TvTrackInfo implements Parcelable { 36cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo 37cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo /** @hide */ 38cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo @Retention(RetentionPolicy.SOURCE) 39cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo @IntDef({TYPE_AUDIO, TYPE_VIDEO, TYPE_SUBTITLE}) 40cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo public @interface Type {} 41cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo 421f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 43d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * The type value for audio tracks. 441f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 45d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public static final int TYPE_AUDIO = 0; 461f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 471f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 48d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * The type value for video tracks. 491f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 50d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public static final int TYPE_VIDEO = 1; 511f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 521f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 53d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * The type value for subtitle tracks. 541f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 55d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public static final int TYPE_SUBTITLE = 2; 56d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo 57d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private final int mType; 5810d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo private final String mId; 59d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private final String mLanguage; 603d04b7693428dd887c93e2ac7f4e90fd0cc87859Jae Seo private final CharSequence mDescription; 61d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private final int mAudioChannelCount; 62d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private final int mAudioSampleRate; 63d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private final int mVideoWidth; 64d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private final int mVideoHeight; 6547b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo private final float mVideoFrameRate; 6624ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo private final float mVideoPixelAspectRatio; 67a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo private final byte mVideoActiveFormatDescription; 68a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo 69d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private final Bundle mExtra; 70d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo 713d04b7693428dd887c93e2ac7f4e90fd0cc87859Jae Seo private TvTrackInfo(int type, String id, String language, CharSequence description, 72071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang int audioChannelCount, int audioSampleRate, int videoWidth, int videoHeight, 73a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo float videoFrameRate, float videoPixelAspectRatio, byte videoActiveFormatDescription, 74a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo Bundle extra) { 75d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mType = type; 7610d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo mId = id; 77d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mLanguage = language; 78071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang mDescription = description; 79d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mAudioChannelCount = audioChannelCount; 80d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mAudioSampleRate = audioSampleRate; 81d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mVideoWidth = videoWidth; 82d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mVideoHeight = videoHeight; 8347b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo mVideoFrameRate = videoFrameRate; 8424ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo mVideoPixelAspectRatio = videoPixelAspectRatio; 85a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo mVideoActiveFormatDescription = videoActiveFormatDescription; 86d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mExtra = extra; 87d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 881f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 89d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private TvTrackInfo(Parcel in) { 90d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mType = in.readInt(); 9110d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo mId = in.readString(); 92d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mLanguage = in.readString(); 93071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang mDescription = in.readString(); 94d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mAudioChannelCount = in.readInt(); 95d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mAudioSampleRate = in.readInt(); 96d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mVideoWidth = in.readInt(); 97d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mVideoHeight = in.readInt(); 9847b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo mVideoFrameRate = in.readFloat(); 9924ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo mVideoPixelAspectRatio = in.readFloat(); 100a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo mVideoActiveFormatDescription = in.readByte(); 101d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mExtra = in.readBundle(); 102d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 1031f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 1041f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 105d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * Returns the type of the track. The type should be one of the followings: 106d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * {@link #TYPE_AUDIO}, {@link #TYPE_VIDEO} and {@link #TYPE_SUBTITLE}. 1071f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 108cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo @Type 109d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final int getType() { 110d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return mType; 111d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 1121f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 1131f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 11410d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo * Returns the ID of the track. 11510d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo */ 11610d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo public final String getId() { 11710d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo return mId; 11810d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo } 11910d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo 12010d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo /** 121d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * Returns the language information encoded by either ISO 639-1 or ISO 639-2/T. If the language 122d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * is unknown or could not be determined, the corresponding value will be {@code null}. 1231f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 124d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final String getLanguage() { 125d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return mLanguage; 1261f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 1271f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 1281f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 129071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang * Returns a user readable description for the current track. 130071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang */ 1313d04b7693428dd887c93e2ac7f4e90fd0cc87859Jae Seo public final CharSequence getDescription() { 132071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang return mDescription; 133071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang } 134071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang 135071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang /** 1361f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Returns the audio channel count. Valid only for {@link #TYPE_AUDIO} tracks. 1376256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * 1386256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on an audio track 1391f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 140d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final int getAudioChannelCount() { 141d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_AUDIO) { 142d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not an audio track"); 1431f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 144d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return mAudioChannelCount; 1451f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 1461f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 1471f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 1481f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Returns the audio sample rate, in the unit of Hz. Valid only for {@link #TYPE_AUDIO} tracks. 1496256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * 1506256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on an audio track 1511f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 152d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final int getAudioSampleRate() { 153d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_AUDIO) { 154d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not an audio track"); 155d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 156d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return mAudioSampleRate; 1571f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 1581f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 1591f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 1601f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Returns the width of the video, in the unit of pixels. Valid only for {@link #TYPE_VIDEO} 1611f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * tracks. 1626256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * 1636256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 1641f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 165d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final int getVideoWidth() { 166d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_VIDEO) { 167d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not a video track"); 168d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 169d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return mVideoWidth; 1701f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 1711f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 1721f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 1731f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Returns the height of the video, in the unit of pixels. Valid only for {@link #TYPE_VIDEO} 1741f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * tracks. 1756256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * 1766256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 1771f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 178d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final int getVideoHeight() { 179d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_VIDEO) { 180d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not a video track"); 181d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 182d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return mVideoHeight; 1831f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 1841f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 1851f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 18647b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo * Returns the frame rate of the video, in the unit of fps (frames per second). Valid only for 18747b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo * {@link #TYPE_VIDEO} tracks. 1886256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * 1896256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 19047b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo */ 19147b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo public final float getVideoFrameRate() { 19247b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo if (mType != TYPE_VIDEO) { 19347b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo throw new IllegalStateException("Not a video track"); 19447b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo } 19547b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo return mVideoFrameRate; 19647b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo } 19747b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo 19847b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo /** 19924ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * Returns the pixel aspect ratio (the ratio of a pixel's width to its height) of the video. 20024ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * Valid only for {@link #TYPE_VIDEO} tracks. 2016256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * 2026256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 20324ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo */ 20424ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo public final float getVideoPixelAspectRatio() { 20524ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo if (mType != TYPE_VIDEO) { 20624ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo throw new IllegalStateException("Not a video track"); 20724ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo } 20824ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo return mVideoPixelAspectRatio; 20924ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo } 21024ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo 21124ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo /** 212a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * Returns the Active Format Description (AFD) code of the video. 213a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * Valid only for {@link #TYPE_VIDEO} tracks. 214a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * 215a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * <p>The complete list of values are defined in ETSI TS 101 154 V1.7.1 Annex B, ATSC A/53 Part 216a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * 4 and SMPTE 2016-1-2007. 2176256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * 2186256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 219a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo */ 220a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo public final byte getVideoActiveFormatDescription() { 221a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo if (mType != TYPE_VIDEO) { 222a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo throw new IllegalStateException("Not a video track"); 223a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo } 224a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo return mVideoActiveFormatDescription; 225a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo } 226a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo 227a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo /** 228d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * Returns the extra information about the current track. 2291f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 230d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final Bundle getExtra() { 231d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return mExtra; 2321f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 2331f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 2341f213914c45c23c653f721690da2ce0718e63139Dongwon Kang @Override 2351f213914c45c23c653f721690da2ce0718e63139Dongwon Kang public int describeContents() { 2361f213914c45c23c653f721690da2ce0718e63139Dongwon Kang return 0; 2371f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 2381f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 239d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo /** 240d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * Used to package this object into a {@link Parcel}. 241d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * 242d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param dest The {@link Parcel} to be written. 243d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param flags The flags used for parceling. 244d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo */ 2451f213914c45c23c653f721690da2ce0718e63139Dongwon Kang @Override 2461f213914c45c23c653f721690da2ce0718e63139Dongwon Kang public void writeToParcel(Parcel dest, int flags) { 247d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo dest.writeInt(mType); 24810d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo dest.writeString(mId); 249d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo dest.writeString(mLanguage); 2503d04b7693428dd887c93e2ac7f4e90fd0cc87859Jae Seo dest.writeString(mDescription != null ? mDescription.toString() : null); 251d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo dest.writeInt(mAudioChannelCount); 252d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo dest.writeInt(mAudioSampleRate); 253d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo dest.writeInt(mVideoWidth); 254d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo dest.writeInt(mVideoHeight); 25547b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo dest.writeFloat(mVideoFrameRate); 25624ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo dest.writeFloat(mVideoPixelAspectRatio); 257a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo dest.writeByte(mVideoActiveFormatDescription); 258d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo dest.writeBundle(mExtra); 2591f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 2601f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 261c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang @Override 262c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang public boolean equals(Object o) { 263c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang if (this == o) { 264c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang return true; 265c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang } 266c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang 267c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang if (!(o instanceof TvTrackInfo)) { 268c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang return false; 269c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang } 270c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang 271c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang TvTrackInfo obj = (TvTrackInfo) o; 272c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang return TextUtils.equals(mId, obj.mId) 273c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && mType == obj.mType 274c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && TextUtils.equals(mLanguage, obj.mLanguage) 275c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && TextUtils.equals(mDescription, obj.mDescription) 276c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && Objects.equals(mExtra, obj.mExtra) 277c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && (mType == TYPE_AUDIO 278c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang ? mAudioChannelCount == obj.mAudioChannelCount 279c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && mAudioSampleRate == obj.mAudioSampleRate 280c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang : (mType == TYPE_VIDEO 281c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang ? mVideoWidth == obj.mVideoWidth 282c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && mVideoHeight == obj.mVideoHeight 283c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && mVideoFrameRate == obj.mVideoFrameRate 284c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang && mVideoPixelAspectRatio == obj.mVideoPixelAspectRatio : true)); 285c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang } 286c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang 287c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang @Override 288c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang public int hashCode() { 289c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang return Objects.hashCode(mId); 290c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang } 291c2215d085640f31cf7cc96ab66dd8f4b4bdf976dshubang 292d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public static final Parcelable.Creator<TvTrackInfo> CREATOR = 293d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo new Parcelable.Creator<TvTrackInfo>() { 2941f213914c45c23c653f721690da2ce0718e63139Dongwon Kang @Override 2951f213914c45c23c653f721690da2ce0718e63139Dongwon Kang public TvTrackInfo createFromParcel(Parcel in) { 2961f213914c45c23c653f721690da2ce0718e63139Dongwon Kang return new TvTrackInfo(in); 2971f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 2981f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 2991f213914c45c23c653f721690da2ce0718e63139Dongwon Kang @Override 3001f213914c45c23c653f721690da2ce0718e63139Dongwon Kang public TvTrackInfo[] newArray(int size) { 3011f213914c45c23c653f721690da2ce0718e63139Dongwon Kang return new TvTrackInfo[size]; 3021f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 3031f213914c45c23c653f721690da2ce0718e63139Dongwon Kang }; 3041f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 3051f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 3061f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * A builder class for creating {@link TvTrackInfo} objects. 3071f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 3081f213914c45c23c653f721690da2ce0718e63139Dongwon Kang public static final class Builder { 30910d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo private final String mId; 31010d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo private final int mType; 311d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private String mLanguage; 3123d04b7693428dd887c93e2ac7f4e90fd0cc87859Jae Seo private CharSequence mDescription; 313d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private int mAudioChannelCount; 314d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private int mAudioSampleRate; 315d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private int mVideoWidth; 316d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private int mVideoHeight; 31747b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo private float mVideoFrameRate; 31824ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo private float mVideoPixelAspectRatio = 1.0f; 319a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo private byte mVideoActiveFormatDescription; 320d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo private Bundle mExtra; 3211f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 3221f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 323d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * Create a {@link Builder}. Any field that should be included in the {@link TvTrackInfo} 324d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * must be added. 3251f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 3261f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * @param type The type of the track. 32710d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo * @param id The ID of the track that uniquely identifies the current track among all the 32810d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo * other tracks in the same TV program. 3296256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalArgumentException if the type is not any of {@link #TYPE_AUDIO}, 3306256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * {@link #TYPE_VIDEO} and {@link #TYPE_SUBTITLE} 3311f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 332cdfbc488c675a9800dfc8f15aec24b65a7558d29Jae Seo public Builder(@Type int type, @NonNull String id) { 333d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (type != TYPE_AUDIO 334d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo && type != TYPE_VIDEO 335d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo && type != TYPE_SUBTITLE) { 3361f213914c45c23c653f721690da2ce0718e63139Dongwon Kang throw new IllegalArgumentException("Unknown type: " + type); 3371f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 338de08be8f79ea40f3dffae9edff4227704a5c0a3aJae Seo Preconditions.checkNotNull(id); 339d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mType = type; 34010d285ac06b3d3060c7d90d3dc196d4ac8367467Jae Seo mId = id; 3411f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 3421f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 3431f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 344d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * Sets the language information of the current track. 3451f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 346d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param language The language string encoded by either ISO 639-1 or ISO 639-2/T. 3471f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 348d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final Builder setLanguage(String language) { 349d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mLanguage = language; 350d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return this; 3511f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 3521f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 3531f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 354071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang * Sets a user readable description for the current track. 355071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang * 356071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang * @param description The user readable description. 357071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang */ 3583d04b7693428dd887c93e2ac7f4e90fd0cc87859Jae Seo public final Builder setDescription(CharSequence description) { 359071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang mDescription = description; 360071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang return this; 361071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang } 362071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang 363071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang /** 3641f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Sets the audio channel count. Valid only for {@link #TYPE_AUDIO} tracks. 3651f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 366d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param audioChannelCount The audio channel count. 3676256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on an audio track 3681f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 369d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final Builder setAudioChannelCount(int audioChannelCount) { 370d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_AUDIO) { 371d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not an audio track"); 372d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 373d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mAudioChannelCount = audioChannelCount; 3741f213914c45c23c653f721690da2ce0718e63139Dongwon Kang return this; 3751f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 3761f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 3771f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 3781f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Sets the audio sample rate, in the unit of Hz. Valid only for {@link #TYPE_AUDIO} 3791f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * tracks. 3801f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 381d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param audioSampleRate The audio sample rate. 3826256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on an audio track 3831f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 384d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final Builder setAudioSampleRate(int audioSampleRate) { 385d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_AUDIO) { 386d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not an audio track"); 387d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 388d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mAudioSampleRate = audioSampleRate; 389d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return this; 390d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 391d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo 392d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo /** 3931f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Sets the width of the video, in the unit of pixels. Valid only for {@link #TYPE_VIDEO} 3941f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * tracks. 395d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * 396d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param videoWidth The width of the video. 3976256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 398d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo */ 399d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final Builder setVideoWidth(int videoWidth) { 400d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_VIDEO) { 401d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not a video track"); 402d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 403d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mVideoWidth = videoWidth; 404d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo return this; 405d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 406d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo 407d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo /** 4081f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * Sets the height of the video, in the unit of pixels. Valid only for {@link #TYPE_VIDEO} 4091f81b1040f40a3233981f34268b11e5c9ad9f34cDongwon Kang * tracks. 410d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * 411d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param videoHeight The height of the video. 4126256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 413d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo */ 414d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final Builder setVideoHeight(int videoHeight) { 415d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo if (mType != TYPE_VIDEO) { 416d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo throw new IllegalStateException("Not a video track"); 417d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo } 418d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mVideoHeight = videoHeight; 4191f213914c45c23c653f721690da2ce0718e63139Dongwon Kang return this; 4201f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 4211f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 4221f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 42347b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo * Sets the frame rate of the video, in the unit fps (frames per rate). Valid only for 42447b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo * {@link #TYPE_VIDEO} tracks. 42547b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo * 42647b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo * @param videoFrameRate The frame rate of the video. 4276256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 42847b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo */ 42947b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo public final Builder setVideoFrameRate(float videoFrameRate) { 43047b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo if (mType != TYPE_VIDEO) { 43147b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo throw new IllegalStateException("Not a video track"); 43247b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo } 43347b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo mVideoFrameRate = videoFrameRate; 43447b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo return this; 43547b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo } 43647b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo 43747b9e4afc9dba512680c2b1e8b82d44232f4b5e0Jae Seo /** 43824ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * Sets the pixel aspect ratio (the ratio of a pixel's width to its height) of the video. 43924ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * Valid only for {@link #TYPE_VIDEO} tracks. 4400610e12733875a267f59d87a2a68aebbf486066eDongwon Kang * 4410610e12733875a267f59d87a2a68aebbf486066eDongwon Kang * <p>This is needed for applications to be able to scale the video properly for some video 44224ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * formats such as 720x576 4:3 and 720x576 16:9 where pixels are not square. By default, 44324ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * applications assume the value of 1.0 (square pixels), so it is not necessary to set the 44424ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * pixel aspect ratio for most video formats. 44524ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * 44624ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo * @param videoPixelAspectRatio The pixel aspect ratio of the video. 4476256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 44824ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo */ 44924ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo public final Builder setVideoPixelAspectRatio(float videoPixelAspectRatio) { 45024ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo if (mType != TYPE_VIDEO) { 45124ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo throw new IllegalStateException("Not a video track"); 45224ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo } 45324ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo mVideoPixelAspectRatio = videoPixelAspectRatio; 45424ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo return this; 45524ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo } 45624ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo 45724ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo /** 458a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * Sets the Active Format Description (AFD) code of the video. 459a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * Valid only for {@link #TYPE_VIDEO} tracks. 460a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * 461a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * <p>This is needed for applications to be able to scale the video properly based on the 462a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * information about where in the coded picture the active video is. 463a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * The complete list of values are defined in ETSI TS 101 154 V1.7.1 Annex B, ATSC A/53 Part 464a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * 4 and SMPTE 2016-1-2007. 465a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * 466a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo * @param videoActiveFormatDescription The AFD code of the video. 4676256e27c1b4fe2d0cef0aeed71dae72ef729c9efJae Seo * @throws IllegalStateException if not called on a video track 468a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo */ 469a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo public final Builder setVideoActiveFormatDescription(byte videoActiveFormatDescription) { 470a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo if (mType != TYPE_VIDEO) { 471a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo throw new IllegalStateException("Not a video track"); 472a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo } 473a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo mVideoActiveFormatDescription = videoActiveFormatDescription; 474a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo return this; 475a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo } 476a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo 477a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo /** 478d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * Sets the extra information about the current track. 4791f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 480d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo * @param extra The extra information. 4811f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 482d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo public final Builder setExtra(Bundle extra) { 483d5ce9759524740cfb02638fd1d7b44315957b422Jae Seo mExtra = new Bundle(extra); 4841f213914c45c23c653f721690da2ce0718e63139Dongwon Kang return this; 4851f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 4861f213914c45c23c653f721690da2ce0718e63139Dongwon Kang 4871f213914c45c23c653f721690da2ce0718e63139Dongwon Kang /** 4881f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * Creates a {@link TvTrackInfo} instance with the specified fields. 4891f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * 4901f213914c45c23c653f721690da2ce0718e63139Dongwon Kang * @return The new {@link TvTrackInfo} instance 4911f213914c45c23c653f721690da2ce0718e63139Dongwon Kang */ 4921f213914c45c23c653f721690da2ce0718e63139Dongwon Kang public TvTrackInfo build() { 493071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang return new TvTrackInfo(mType, mId, mLanguage, mDescription, mAudioChannelCount, 49424ed8072f5b7f221c5b69ff8216ff77b06f506e6Jae Seo mAudioSampleRate, mVideoWidth, mVideoHeight, mVideoFrameRate, 495a2a0c735ffeab4bd8413ff139b70bce8056bfd72Jae Seo mVideoPixelAspectRatio, mVideoActiveFormatDescription, mExtra); 4961f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 4971f213914c45c23c653f721690da2ce0718e63139Dongwon Kang } 498071b2c72a88eb11e83dcd9c3abd117b30a42d911Dongwon Kang} 499