1c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim/*
2c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Copyright (C) 2014 The Android Open Source Project
3c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
4c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
5c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * you may not use this file except in compliance with the License.
6c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * You may obtain a copy of the License at
7c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
8c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
9c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
10c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Unless required by applicable law or agreed to in writing, software
11c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
12c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * See the License for the specific language governing permissions and
14c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * limitations under the License.
15c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim */
16c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
17d5cc4a281e7ce29d1e8687ff3394b57a3a549260Jae Seopackage android.media.tv;
18c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
19230204967978b65731f1dd85278aaadb26322a7fJeff Davidsonimport android.annotation.SystemApi;
20c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.os.Parcel;
21c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.os.Parcelable;
22c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.util.Log;
23c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
24c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim/**
25c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * @hide
26c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim */
27230204967978b65731f1dd85278aaadb26322a7fJeff Davidson@SystemApi
28c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimpublic class TvStreamConfig implements Parcelable {
29c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    static final String TAG = TvStreamConfig.class.getSimpleName();
30c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
31c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public final static int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1;
32c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public final static int STREAM_TYPE_BUFFER_PRODUCER = 2;
33c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
34c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mStreamId;
35c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mType;
36c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mMaxWidth;
37c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mMaxHeight;
38c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    /**
39c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim     * Generations are incremented once framework receives STREAM_CONFIGURATION_CHANGED event from
40c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim     * HAL module. Framework should throw away outdated configurations and get new configurations
41c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim     * via tv_input_device::get_stream_configurations().
42c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim     */
43c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mGeneration;
44c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
45c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public static final Parcelable.Creator<TvStreamConfig> CREATOR =
46c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            new Parcelable.Creator<TvStreamConfig>() {
47c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        @Override
48c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public TvStreamConfig createFromParcel(Parcel source) {
49c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            try {
50c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                return new Builder().
51c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                        streamId(source.readInt()).
52c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                        type(source.readInt()).
53c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                        maxWidth(source.readInt()).
54c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                        maxHeight(source.readInt()).
55c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                        generation(source.readInt()).build();
56c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            } catch (Exception e) {
57c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                Log.e(TAG, "Exception creating TvStreamConfig from parcel", e);
58c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                return null;
59c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            }
60c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
61c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
62c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        @Override
63c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public TvStreamConfig[] newArray(int size) {
64c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return new TvStreamConfig[size];
65c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
66c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    };
67c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
68c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private TvStreamConfig() {}
69c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
70c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getStreamId() {
71c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mStreamId;
72c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
73c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
74c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getType() {
75c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mType;
76c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
77c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
78c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getMaxWidth() {
79c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mMaxWidth;
80c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
81c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
82c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getMaxHeight() {
83c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mMaxHeight;
84c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
85c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
86c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getGeneration() {
87c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mGeneration;
88c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
89c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
9021aa3467cd14260418cc47334b656adf841a567cWonsik Kim    @Override
9121aa3467cd14260418cc47334b656adf841a567cWonsik Kim    public String toString() {
9221aa3467cd14260418cc47334b656adf841a567cWonsik Kim        StringBuilder b = new StringBuilder(128);
9321aa3467cd14260418cc47334b656adf841a567cWonsik Kim        b.append("TvStreamConfig {");
9421aa3467cd14260418cc47334b656adf841a567cWonsik Kim        b.append("mStreamId=").append(mStreamId).append(";");
9521aa3467cd14260418cc47334b656adf841a567cWonsik Kim        b.append("mType=").append(mType).append(";");
9621aa3467cd14260418cc47334b656adf841a567cWonsik Kim        b.append("mGeneration=").append(mGeneration).append("}");
9721aa3467cd14260418cc47334b656adf841a567cWonsik Kim        return b.toString();
9821aa3467cd14260418cc47334b656adf841a567cWonsik Kim    }
9921aa3467cd14260418cc47334b656adf841a567cWonsik Kim
100c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    // Parcelable
101c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    @Override
102c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int describeContents() {
103c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return 0;
104c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
105c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
106c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    @Override
107c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public void writeToParcel(Parcel dest, int flags) {
108c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mStreamId);
109c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mType);
110c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mMaxWidth);
111c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mMaxHeight);
112c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mGeneration);
113c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
114c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
115c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    /**
116c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim     * A helper class for creating a TvStreamConfig object.
117c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim     */
118c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public static final class Builder {
119c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        private Integer mStreamId;
120c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        private Integer mType;
121c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        private Integer mMaxWidth;
122c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        private Integer mMaxHeight;
123c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        private Integer mGeneration;
124c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
125c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public Builder() {
126c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
127c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
128c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public Builder streamId(int streamId) {
129c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            mStreamId = streamId;
130c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return this;
131c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
132c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
133c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public Builder type(int type) {
134c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            mType = type;
135c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return this;
136c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
137c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
138c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public Builder maxWidth(int maxWidth) {
139c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            mMaxWidth = maxWidth;
140c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return this;
141c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
142c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
143c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public Builder maxHeight(int maxHeight) {
144c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            mMaxHeight = maxHeight;
145c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return this;
146c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
147c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
148c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public Builder generation(int generation) {
149c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            mGeneration = generation;
150c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return this;
151c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
152c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
153c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public TvStreamConfig build() {
154c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            if (mStreamId == null || mType == null || mMaxWidth == null || mMaxHeight == null
155c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                    || mGeneration == null) {
156c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                throw new UnsupportedOperationException();
157c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            }
158c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
159c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            TvStreamConfig config = new TvStreamConfig();
160c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            config.mStreamId = mStreamId;
161c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            config.mType = mType;
162c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            config.mMaxWidth = mMaxWidth;
163c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            config.mMaxHeight = mMaxHeight;
164c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            config.mGeneration = mGeneration;
165c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return config;
166c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
167c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
1688f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim
1698f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim    @Override
1708f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim    public boolean equals(Object obj) {
1718f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim        if (obj == null) return false;
1728f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim        if (!(obj instanceof TvStreamConfig)) return false;
1738f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim
1748f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim        TvStreamConfig config = (TvStreamConfig) obj;
1758f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim        return config.mGeneration == mGeneration
1768f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim            && config.mStreamId == mStreamId
1778f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim            && config.mType == mType
1788f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim            && config.mMaxWidth == mMaxWidth
1798f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim            && config.mMaxHeight == mMaxHeight;
1808f24a8b60f9afc1aedb89e7ee80ce65515439600Wonsik Kim    }
181230204967978b65731f1dd85278aaadb26322a7fJeff Davidson}
182