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