Loading api/system-current.txt +0 −3 Original line number Original line Diff line number Diff line Loading @@ -24903,7 +24903,6 @@ package android.media.tv { public class TvStreamConfig implements android.os.Parcelable { public class TvStreamConfig implements android.os.Parcelable { method public int describeContents(); method public int describeContents(); method public int getFlags(); method public int getGeneration(); method public int getGeneration(); method public int getMaxHeight(); method public int getMaxHeight(); method public int getMaxWidth(); method public int getMaxWidth(); Loading @@ -24911,7 +24910,6 @@ package android.media.tv { method public int getType(); method public int getType(); method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.media.tv.TvStreamConfig> CREATOR; field public static final android.os.Parcelable.Creator<android.media.tv.TvStreamConfig> CREATOR; field public static final int FLAG_MASK_SIGNAL_DETECTION = 1; // 0x1 field public static final int STREAM_TYPE_BUFFER_PRODUCER = 2; // 0x2 field public static final int STREAM_TYPE_BUFFER_PRODUCER = 2; // 0x2 field public static final int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; // 0x1 field public static final int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; // 0x1 } } Loading @@ -24919,7 +24917,6 @@ package android.media.tv { public static final class TvStreamConfig.Builder { public static final class TvStreamConfig.Builder { ctor public TvStreamConfig.Builder(); ctor public TvStreamConfig.Builder(); method public android.media.tv.TvStreamConfig build(); method public android.media.tv.TvStreamConfig build(); method public android.media.tv.TvStreamConfig.Builder flags(int); method public android.media.tv.TvStreamConfig.Builder generation(int); method public android.media.tv.TvStreamConfig.Builder generation(int); method public android.media.tv.TvStreamConfig.Builder maxHeight(int); method public android.media.tv.TvStreamConfig.Builder maxHeight(int); method public android.media.tv.TvStreamConfig.Builder maxWidth(int); method public android.media.tv.TvStreamConfig.Builder maxWidth(int); media/java/android/media/tv/TvInputManager.java +6 −6 Original line number Original line Diff line number Diff line Loading @@ -223,9 +223,10 @@ public final class TvInputManager { * State for {@link #getInputState(String)} and * State for {@link #getInputState(String)} and * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected. * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected. * * * <p>This state indicates that a source device is connected to the input port and in the normal * <p>This state indicates that a source device is connected to the input port and is in the * operation mode. It is mostly relevant to hardware inputs such as HDMI input. * normal operation mode. It is mostly relevant to hardware inputs such as HDMI input. This is * Non-hardware inputs are considered connected all the time. * the default state for any hardware inputs where their states are unknown. Non-hardware inputs * are considered connected all the time. */ */ public static final int INPUT_STATE_CONNECTED = 0; public static final int INPUT_STATE_CONNECTED = 0; Loading @@ -234,9 +235,8 @@ public final class TvInputManager { * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected but * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected but * in standby mode. * in standby mode. * * * <p>This state indicates that a source device is connected to the input port and in standby or * <p>This state indicates that a source device is connected to the input port but is in standby * low power mode. It is mostly relevant to hardware inputs such as HDMI inputs and Component * mode. It is mostly relevant to hardware inputs such as HDMI input. * inputs. */ */ public static final int INPUT_STATE_CONNECTED_STANDBY = 1; public static final int INPUT_STATE_CONNECTED_STANDBY = 1; Loading media/java/android/media/tv/TvStreamConfig.java +2 −27 Original line number Original line Diff line number Diff line Loading @@ -28,15 +28,8 @@ import android.util.Log; public class TvStreamConfig implements Parcelable { public class TvStreamConfig implements Parcelable { static final String TAG = TvStreamConfig.class.getSimpleName(); static final String TAG = TvStreamConfig.class.getSimpleName(); // Must be in sync with tv_input.h public final static int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; public final static int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; public final static int STREAM_TYPE_BUFFER_PRODUCER = 2; public final static int STREAM_TYPE_BUFFER_PRODUCER = 2; /** * A flag indicating whether the HAL is sure about signal at this stream. Note that * value of 0 here does not necessarily mean no signal. It just means that it may not have * signal and the underlying layer is not sure. */ public static final int FLAG_MASK_SIGNAL_DETECTION = 0x1; private int mStreamId; private int mStreamId; private int mType; private int mType; Loading @@ -48,10 +41,6 @@ public class TvStreamConfig implements Parcelable { * via tv_input_device::get_stream_configurations(). * via tv_input_device::get_stream_configurations(). */ */ private int mGeneration; private int mGeneration; /** * Flags for stream status. See FLAG_MASK_* for details. */ private int mFlags; public static final Parcelable.Creator<TvStreamConfig> CREATOR = public static final Parcelable.Creator<TvStreamConfig> CREATOR = new Parcelable.Creator<TvStreamConfig>() { new Parcelable.Creator<TvStreamConfig>() { Loading @@ -63,8 +52,7 @@ public class TvStreamConfig implements Parcelable { type(source.readInt()). type(source.readInt()). maxWidth(source.readInt()). maxWidth(source.readInt()). maxHeight(source.readInt()). maxHeight(source.readInt()). generation(source.readInt()). generation(source.readInt()).build(); flags(source.readInt()).build(); } catch (Exception e) { } catch (Exception e) { Log.e(TAG, "Exception creating TvStreamConfig from parcel", e); Log.e(TAG, "Exception creating TvStreamConfig from parcel", e); return null; return null; Loading Loading @@ -99,10 +87,6 @@ public class TvStreamConfig implements Parcelable { return mGeneration; return mGeneration; } } public int getFlags() { return mFlags; } @Override @Override public String toString() { public String toString() { return "TvStreamConfig {mStreamId=" + mStreamId + ";" + "mType=" + mType + ";mGeneration=" return "TvStreamConfig {mStreamId=" + mStreamId + ";" + "mType=" + mType + ";mGeneration=" Loading @@ -122,7 +106,6 @@ public class TvStreamConfig implements Parcelable { dest.writeInt(mMaxWidth); dest.writeInt(mMaxWidth); dest.writeInt(mMaxHeight); dest.writeInt(mMaxHeight); dest.writeInt(mGeneration); dest.writeInt(mGeneration); dest.writeInt(mFlags); } } /** /** Loading @@ -134,7 +117,6 @@ public class TvStreamConfig implements Parcelable { private Integer mMaxWidth; private Integer mMaxWidth; private Integer mMaxHeight; private Integer mMaxHeight; private Integer mGeneration; private Integer mGeneration; private int mFlags = 0; public Builder() { public Builder() { } } Loading Loading @@ -164,11 +146,6 @@ public class TvStreamConfig implements Parcelable { return this; return this; } } public Builder flags(int flag) { mFlags = flag; return this; } public TvStreamConfig build() { public TvStreamConfig build() { if (mStreamId == null || mType == null || mMaxWidth == null || mMaxHeight == null if (mStreamId == null || mType == null || mMaxWidth == null || mMaxHeight == null || mGeneration == null) { || mGeneration == null) { Loading @@ -181,7 +158,6 @@ public class TvStreamConfig implements Parcelable { config.mMaxWidth = mMaxWidth; config.mMaxWidth = mMaxWidth; config.mMaxHeight = mMaxHeight; config.mMaxHeight = mMaxHeight; config.mGeneration = mGeneration; config.mGeneration = mGeneration; config.mFlags = mFlags; return config; return config; } } } } Loading @@ -196,7 +172,6 @@ public class TvStreamConfig implements Parcelable { && config.mStreamId == mStreamId && config.mStreamId == mStreamId && config.mType == mType && config.mType == mType && config.mMaxWidth == mMaxWidth && config.mMaxWidth == mMaxWidth && config.mMaxHeight == mMaxHeight && config.mMaxHeight == mMaxHeight; && config.mFlags == mFlags; } } } } services/core/java/com/android/server/tv/TvInputHardwareManager.java +13 −25 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.tv; package com.android.server.tv; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED_STANDBY; import static android.media.tv.TvInputManager.INPUT_STATE_DISCONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_DISCONNECTED; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; Loading Loading @@ -110,6 +109,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { private int mCurrentIndex = 0; private int mCurrentIndex = 0; private int mCurrentMaxIndex = 0; private int mCurrentMaxIndex = 0; // TODO: Should handle STANDBY case. private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray(); private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray(); private final List<Message> mPendingHdmiDeviceEvents = new LinkedList<>(); private final List<Message> mPendingHdmiDeviceEvents = new LinkedList<>(); Loading Loading @@ -213,7 +213,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { String inputId = mHardwareInputIdMap.get(deviceId); String inputId = mHardwareInputIdMap.get(deviceId); if (inputId != null) { if (inputId != null) { mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, obtainStateFromConfigs(configs), 0, inputId).sendToTarget(); convertConnectedToState(configs.length > 0), 0, inputId).sendToTarget(); } } ITvInputHardwareCallback callback = connection.getCallbackLocked(); ITvInputHardwareCallback callback = connection.getCallbackLocked(); if (callback != null) { if (callback != null) { Loading Loading @@ -263,14 +263,13 @@ class TvInputHardwareManager implements TvInputHal.Callback { || connectionCallingUid != callingUid || connectionResolvedUserId != resolvedUserId; || connectionCallingUid != callingUid || connectionResolvedUserId != resolvedUserId; } } private int obtainStateFromConfigs(TvStreamConfig[] configs) { private int convertConnectedToState(boolean connected) { for (TvStreamConfig config : configs) { if (connected) { if ((config.getFlags() & TvStreamConfig.FLAG_MASK_SIGNAL_DETECTION) != 0) { return INPUT_STATE_CONNECTED; return INPUT_STATE_CONNECTED; } else { return INPUT_STATE_DISCONNECTED; } } } } return (configs.length > 0) ? INPUT_STATE_CONNECTED_STANDBY : INPUT_STATE_DISCONNECTED; } public void addHardwareInput(int deviceId, TvInputInfo info) { public void addHardwareInput(int deviceId, TvInputInfo info) { synchronized (mLock) { synchronized (mLock) { Loading @@ -294,14 +293,9 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } String inputId = mHardwareInputIdMap.get(hardwareInfo.getDeviceId()); String inputId = mHardwareInputIdMap.get(hardwareInfo.getDeviceId()); if (inputId != null && inputId.equals(info.getId())) { if (inputId != null && inputId.equals(info.getId())) { // No HDMI hotplug does not necessarily mean disconnected, as old devices may mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, // not report hotplug state correctly. Using INPUT_STATE_CONNECTED_STANDBY to convertConnectedToState(mHdmiStateMap.valueAt(i)), 0, // denote unknown state. inputId).sendToTarget(); int state = mHdmiStateMap.valueAt(i) ? INPUT_STATE_CONNECTED : INPUT_STATE_CONNECTED_STANDBY; mHandler.obtainMessage( ListenerHandler.STATE_CHANGED, state, 0, inputId).sendToTarget(); return; return; } } } } Loading @@ -309,7 +303,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { Connection connection = mConnections.get(deviceId); Connection connection = mConnections.get(deviceId); if (connection != null) { if (connection != null) { mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, obtainStateFromConfigs(connection.getConfigsLocked()), 0, convertConnectedToState(connection.getConfigsLocked().length > 0), 0, info.getId()).sendToTarget(); info.getId()).sendToTarget(); } } } } Loading Loading @@ -1199,14 +1193,8 @@ class TvInputHardwareManager implements TvInputHal.Callback { if (inputId == null) { if (inputId == null) { return; return; } } // No HDMI hotplug does not necessarily mean disconnected, as old devices may mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, // not report hotplug state correctly. Using INPUT_STATE_CONNECTED_STANDBY to convertConnectedToState(event.isConnected()), 0, inputId).sendToTarget(); // denote unknown state. int state = event.isConnected() ? INPUT_STATE_CONNECTED : INPUT_STATE_CONNECTED_STANDBY; mHandler.obtainMessage( ListenerHandler.STATE_CHANGED, state, 0, inputId).sendToTarget(); } } } } } } Loading services/core/jni/com_android_server_tv_TvInputHal.cpp +21 −60 Original line number Original line Diff line number Diff line Loading @@ -54,7 +54,6 @@ static struct { jmethodID maxWidth; jmethodID maxWidth; jmethodID maxHeight; jmethodID maxHeight; jmethodID generation; jmethodID generation; jmethodID flags; jmethodID build; jmethodID build; } gTvStreamConfigBuilderClassInfo; } gTvStreamConfigBuilderClassInfo; Loading Loading @@ -240,7 +239,7 @@ public: int addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface); int addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface); int removeStream(int deviceId, int streamId); int removeStream(int deviceId, int streamId); const tv_stream_config_ext_t* getStreamConfigs(int deviceId, int* numConfigs); const tv_stream_config_t* getStreamConfigs(int deviceId, int* numConfigs); void onDeviceAvailable(const tv_input_device_info_t& info); void onDeviceAvailable(const tv_input_device_info_t& info); void onDeviceUnavailable(int deviceId); void onDeviceUnavailable(int deviceId); Loading Loading @@ -289,15 +288,10 @@ private: sp<Looper> mLooper; sp<Looper> mLooper; KeyedVector<int, KeyedVector<int, Connection> > mConnections; KeyedVector<int, KeyedVector<int, Connection> > mConnections; tv_stream_config_ext_t* mConfigBuffer; int mConfigBufferSize; }; }; JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, tv_input_device_t* device, JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, tv_input_device_t* device, const sp<Looper>& looper) const sp<Looper>& looper) { : mConfigBuffer(NULL), mConfigBufferSize(0) { mThiz = env->NewWeakGlobalRef(thiz); mThiz = env->NewWeakGlobalRef(thiz); mDevice = device; mDevice = device; mCallback.notify = &JTvInputHal::notify; mCallback.notify = &JTvInputHal::notify; Loading @@ -312,10 +306,6 @@ JTvInputHal::~JTvInputHal() { JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mThiz); env->DeleteWeakGlobalRef(mThiz); mThiz = NULL; mThiz = NULL; if (mConfigBuffer != NULL) { delete[] mConfigBuffer; } } } JTvInputHal* JTvInputHal::createInstance(JNIEnv* env, jobject thiz, const sp<Looper>& looper) { JTvInputHal* JTvInputHal::createInstance(JNIEnv* env, jobject thiz, const sp<Looper>& looper) { Loading Loading @@ -364,14 +354,15 @@ int JTvInputHal::addOrUpdateStream(int deviceId, int streamId, const sp<Surface> if (connection.mSourceHandle == NULL && connection.mThread == NULL) { if (connection.mSourceHandle == NULL && connection.mThread == NULL) { // Need to configure stream // Need to configure stream int numConfigs = 0; int numConfigs = 0; const tv_stream_config_ext_t* configs = getStreamConfigs(deviceId, &numConfigs); const tv_stream_config_t* configs = NULL; if (configs == NULL) { if (mDevice->get_stream_configurations( mDevice, deviceId, &numConfigs, &configs) != 0) { ALOGE("Couldn't get stream configs"); ALOGE("Couldn't get stream configs"); return UNKNOWN_ERROR; return UNKNOWN_ERROR; } } int configIndex = -1; int configIndex = -1; for (int i = 0; i < numConfigs; ++i) { for (int i = 0; i < numConfigs; ++i) { if (configs[i].config.stream_id == streamId) { if (configs[i].stream_id == streamId) { configIndex = i; configIndex = i; break; break; } } Loading @@ -380,13 +371,13 @@ int JTvInputHal::addOrUpdateStream(int deviceId, int streamId, const sp<Surface> ALOGE("Cannot find a config with given stream ID: %d", streamId); ALOGE("Cannot find a config with given stream ID: %d", streamId); return BAD_VALUE; return BAD_VALUE; } } connection.mStreamType = configs[configIndex].config.type; connection.mStreamType = configs[configIndex].type; tv_stream_t stream; tv_stream_t stream; stream.stream_id = configs[configIndex].config.stream_id; stream.stream_id = configs[configIndex].stream_id; if (connection.mStreamType == TV_STREAM_TYPE_BUFFER_PRODUCER) { if (connection.mStreamType == TV_STREAM_TYPE_BUFFER_PRODUCER) { stream.buffer_producer.width = configs[configIndex].config.max_video_width; stream.buffer_producer.width = configs[configIndex].max_video_width; stream.buffer_producer.height = configs[configIndex].config.max_video_height; stream.buffer_producer.height = configs[configIndex].max_video_height; } } if (mDevice->open_stream(mDevice, deviceId, &stream) != 0) { if (mDevice->open_stream(mDevice, deviceId, &stream) != 0) { ALOGE("Couldn't add stream"); ALOGE("Couldn't add stream"); Loading Loading @@ -440,34 +431,13 @@ int JTvInputHal::removeStream(int deviceId, int streamId) { return NO_ERROR; return NO_ERROR; } } const tv_stream_config_ext_t* JTvInputHal::getStreamConfigs(int deviceId, int* numConfigs) { const tv_stream_config_t* JTvInputHal::getStreamConfigs(int deviceId, int* numConfigs) { const tv_stream_config_ext_t* configs = NULL; const tv_stream_config_t* configs = NULL; if (mDevice->common.version >= TV_INPUT_DEVICE_API_VERSION_0_2) { if (mDevice->get_stream_configurations_ext( mDevice, deviceId, numConfigs, &configs) != 0) { ALOGE("Couldn't get stream configs"); return NULL; } } else { const tv_stream_config_t* oldConfigs; if (mDevice->get_stream_configurations( if (mDevice->get_stream_configurations( mDevice, deviceId, numConfigs, &oldConfigs) != 0) { mDevice, deviceId, numConfigs, &configs) != 0) { ALOGE("Couldn't get stream configs"); ALOGE("Couldn't get stream configs"); return NULL; return NULL; } } if (mConfigBufferSize < *numConfigs) { mConfigBufferSize = (*numConfigs / 16 + 1) * 16; if (mConfigBuffer != NULL) { delete[] mConfigBuffer; } mConfigBuffer = new tv_stream_config_ext_t[mConfigBufferSize]; } for (int i = 0; i < *numConfigs; ++i) { mConfigBuffer[i].config = oldConfigs[i]; mConfigBuffer[i].flags = 0; } configs = mConfigBuffer; } return configs; return configs; } } Loading Loading @@ -659,7 +629,7 @@ static jobjectArray nativeGetStreamConfigs(JNIEnv* env, jclass clazz, jlong ptr, jint deviceId, jint generation) { jlong ptr, jint deviceId, jint generation) { JTvInputHal* tvInputHal = (JTvInputHal*)ptr; JTvInputHal* tvInputHal = (JTvInputHal*)ptr; int numConfigs = 0; int numConfigs = 0; const tv_stream_config_ext_t* configs = tvInputHal->getStreamConfigs(deviceId, &numConfigs); const tv_stream_config_t* configs = tvInputHal->getStreamConfigs(deviceId, &numConfigs); jobjectArray result = env->NewObjectArray(numConfigs, gTvStreamConfigClassInfo.clazz, NULL); jobjectArray result = env->NewObjectArray(numConfigs, gTvStreamConfigClassInfo.clazz, NULL); for (int i = 0; i < numConfigs; ++i) { for (int i = 0; i < numConfigs; ++i) { Loading @@ -667,20 +637,15 @@ static jobjectArray nativeGetStreamConfigs(JNIEnv* env, jclass clazz, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.constructor); gTvStreamConfigBuilderClassInfo.constructor); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.streamId, configs[i].config.stream_id); builder, gTvStreamConfigBuilderClassInfo.streamId, configs[i].stream_id); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.type, configs[i].config.type); builder, gTvStreamConfigBuilderClassInfo.type, configs[i].type); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.maxWidth, builder, gTvStreamConfigBuilderClassInfo.maxWidth, configs[i].max_video_width); configs[i].config.max_video_width); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.maxHeight, builder, gTvStreamConfigBuilderClassInfo.maxHeight, configs[i].max_video_height); configs[i].config.max_video_height); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.generation, generation); builder, gTvStreamConfigBuilderClassInfo.generation, generation); env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.flags, configs[i].flags); jobject config = env->CallObjectMethod(builder, gTvStreamConfigBuilderClassInfo.build); jobject config = env->CallObjectMethod(builder, gTvStreamConfigBuilderClassInfo.build); Loading Loading @@ -771,10 +736,6 @@ int register_android_server_tv_TvInputHal(JNIEnv* env) { gTvStreamConfigBuilderClassInfo.generation, gTvStreamConfigBuilderClassInfo.generation, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.clazz, "generation", "(I)Landroid/media/tv/TvStreamConfig$Builder;"); "generation", "(I)Landroid/media/tv/TvStreamConfig$Builder;"); GET_METHOD_ID( gTvStreamConfigBuilderClassInfo.flags, gTvStreamConfigBuilderClassInfo.clazz, "flags", "(I)Landroid/media/tv/TvStreamConfig$Builder;"); GET_METHOD_ID( GET_METHOD_ID( gTvStreamConfigBuilderClassInfo.build, gTvStreamConfigBuilderClassInfo.build, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.clazz, Loading Loading
api/system-current.txt +0 −3 Original line number Original line Diff line number Diff line Loading @@ -24903,7 +24903,6 @@ package android.media.tv { public class TvStreamConfig implements android.os.Parcelable { public class TvStreamConfig implements android.os.Parcelable { method public int describeContents(); method public int describeContents(); method public int getFlags(); method public int getGeneration(); method public int getGeneration(); method public int getMaxHeight(); method public int getMaxHeight(); method public int getMaxWidth(); method public int getMaxWidth(); Loading @@ -24911,7 +24910,6 @@ package android.media.tv { method public int getType(); method public int getType(); method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.media.tv.TvStreamConfig> CREATOR; field public static final android.os.Parcelable.Creator<android.media.tv.TvStreamConfig> CREATOR; field public static final int FLAG_MASK_SIGNAL_DETECTION = 1; // 0x1 field public static final int STREAM_TYPE_BUFFER_PRODUCER = 2; // 0x2 field public static final int STREAM_TYPE_BUFFER_PRODUCER = 2; // 0x2 field public static final int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; // 0x1 field public static final int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; // 0x1 } } Loading @@ -24919,7 +24917,6 @@ package android.media.tv { public static final class TvStreamConfig.Builder { public static final class TvStreamConfig.Builder { ctor public TvStreamConfig.Builder(); ctor public TvStreamConfig.Builder(); method public android.media.tv.TvStreamConfig build(); method public android.media.tv.TvStreamConfig build(); method public android.media.tv.TvStreamConfig.Builder flags(int); method public android.media.tv.TvStreamConfig.Builder generation(int); method public android.media.tv.TvStreamConfig.Builder generation(int); method public android.media.tv.TvStreamConfig.Builder maxHeight(int); method public android.media.tv.TvStreamConfig.Builder maxHeight(int); method public android.media.tv.TvStreamConfig.Builder maxWidth(int); method public android.media.tv.TvStreamConfig.Builder maxWidth(int);
media/java/android/media/tv/TvInputManager.java +6 −6 Original line number Original line Diff line number Diff line Loading @@ -223,9 +223,10 @@ public final class TvInputManager { * State for {@link #getInputState(String)} and * State for {@link #getInputState(String)} and * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected. * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected. * * * <p>This state indicates that a source device is connected to the input port and in the normal * <p>This state indicates that a source device is connected to the input port and is in the * operation mode. It is mostly relevant to hardware inputs such as HDMI input. * normal operation mode. It is mostly relevant to hardware inputs such as HDMI input. This is * Non-hardware inputs are considered connected all the time. * the default state for any hardware inputs where their states are unknown. Non-hardware inputs * are considered connected all the time. */ */ public static final int INPUT_STATE_CONNECTED = 0; public static final int INPUT_STATE_CONNECTED = 0; Loading @@ -234,9 +235,8 @@ public final class TvInputManager { * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected but * {@link TvInputCallback#onInputStateChanged(String, int)}: The input source is connected but * in standby mode. * in standby mode. * * * <p>This state indicates that a source device is connected to the input port and in standby or * <p>This state indicates that a source device is connected to the input port but is in standby * low power mode. It is mostly relevant to hardware inputs such as HDMI inputs and Component * mode. It is mostly relevant to hardware inputs such as HDMI input. * inputs. */ */ public static final int INPUT_STATE_CONNECTED_STANDBY = 1; public static final int INPUT_STATE_CONNECTED_STANDBY = 1; Loading
media/java/android/media/tv/TvStreamConfig.java +2 −27 Original line number Original line Diff line number Diff line Loading @@ -28,15 +28,8 @@ import android.util.Log; public class TvStreamConfig implements Parcelable { public class TvStreamConfig implements Parcelable { static final String TAG = TvStreamConfig.class.getSimpleName(); static final String TAG = TvStreamConfig.class.getSimpleName(); // Must be in sync with tv_input.h public final static int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; public final static int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; public final static int STREAM_TYPE_BUFFER_PRODUCER = 2; public final static int STREAM_TYPE_BUFFER_PRODUCER = 2; /** * A flag indicating whether the HAL is sure about signal at this stream. Note that * value of 0 here does not necessarily mean no signal. It just means that it may not have * signal and the underlying layer is not sure. */ public static final int FLAG_MASK_SIGNAL_DETECTION = 0x1; private int mStreamId; private int mStreamId; private int mType; private int mType; Loading @@ -48,10 +41,6 @@ public class TvStreamConfig implements Parcelable { * via tv_input_device::get_stream_configurations(). * via tv_input_device::get_stream_configurations(). */ */ private int mGeneration; private int mGeneration; /** * Flags for stream status. See FLAG_MASK_* for details. */ private int mFlags; public static final Parcelable.Creator<TvStreamConfig> CREATOR = public static final Parcelable.Creator<TvStreamConfig> CREATOR = new Parcelable.Creator<TvStreamConfig>() { new Parcelable.Creator<TvStreamConfig>() { Loading @@ -63,8 +52,7 @@ public class TvStreamConfig implements Parcelable { type(source.readInt()). type(source.readInt()). maxWidth(source.readInt()). maxWidth(source.readInt()). maxHeight(source.readInt()). maxHeight(source.readInt()). generation(source.readInt()). generation(source.readInt()).build(); flags(source.readInt()).build(); } catch (Exception e) { } catch (Exception e) { Log.e(TAG, "Exception creating TvStreamConfig from parcel", e); Log.e(TAG, "Exception creating TvStreamConfig from parcel", e); return null; return null; Loading Loading @@ -99,10 +87,6 @@ public class TvStreamConfig implements Parcelable { return mGeneration; return mGeneration; } } public int getFlags() { return mFlags; } @Override @Override public String toString() { public String toString() { return "TvStreamConfig {mStreamId=" + mStreamId + ";" + "mType=" + mType + ";mGeneration=" return "TvStreamConfig {mStreamId=" + mStreamId + ";" + "mType=" + mType + ";mGeneration=" Loading @@ -122,7 +106,6 @@ public class TvStreamConfig implements Parcelable { dest.writeInt(mMaxWidth); dest.writeInt(mMaxWidth); dest.writeInt(mMaxHeight); dest.writeInt(mMaxHeight); dest.writeInt(mGeneration); dest.writeInt(mGeneration); dest.writeInt(mFlags); } } /** /** Loading @@ -134,7 +117,6 @@ public class TvStreamConfig implements Parcelable { private Integer mMaxWidth; private Integer mMaxWidth; private Integer mMaxHeight; private Integer mMaxHeight; private Integer mGeneration; private Integer mGeneration; private int mFlags = 0; public Builder() { public Builder() { } } Loading Loading @@ -164,11 +146,6 @@ public class TvStreamConfig implements Parcelable { return this; return this; } } public Builder flags(int flag) { mFlags = flag; return this; } public TvStreamConfig build() { public TvStreamConfig build() { if (mStreamId == null || mType == null || mMaxWidth == null || mMaxHeight == null if (mStreamId == null || mType == null || mMaxWidth == null || mMaxHeight == null || mGeneration == null) { || mGeneration == null) { Loading @@ -181,7 +158,6 @@ public class TvStreamConfig implements Parcelable { config.mMaxWidth = mMaxWidth; config.mMaxWidth = mMaxWidth; config.mMaxHeight = mMaxHeight; config.mMaxHeight = mMaxHeight; config.mGeneration = mGeneration; config.mGeneration = mGeneration; config.mFlags = mFlags; return config; return config; } } } } Loading @@ -196,7 +172,6 @@ public class TvStreamConfig implements Parcelable { && config.mStreamId == mStreamId && config.mStreamId == mStreamId && config.mType == mType && config.mType == mType && config.mMaxWidth == mMaxWidth && config.mMaxWidth == mMaxWidth && config.mMaxHeight == mMaxHeight && config.mMaxHeight == mMaxHeight; && config.mFlags == mFlags; } } } }
services/core/java/com/android/server/tv/TvInputHardwareManager.java +13 −25 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.tv; package com.android.server.tv; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED_STANDBY; import static android.media.tv.TvInputManager.INPUT_STATE_DISCONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_DISCONNECTED; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; Loading Loading @@ -110,6 +109,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { private int mCurrentIndex = 0; private int mCurrentIndex = 0; private int mCurrentMaxIndex = 0; private int mCurrentMaxIndex = 0; // TODO: Should handle STANDBY case. private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray(); private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray(); private final List<Message> mPendingHdmiDeviceEvents = new LinkedList<>(); private final List<Message> mPendingHdmiDeviceEvents = new LinkedList<>(); Loading Loading @@ -213,7 +213,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { String inputId = mHardwareInputIdMap.get(deviceId); String inputId = mHardwareInputIdMap.get(deviceId); if (inputId != null) { if (inputId != null) { mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, obtainStateFromConfigs(configs), 0, inputId).sendToTarget(); convertConnectedToState(configs.length > 0), 0, inputId).sendToTarget(); } } ITvInputHardwareCallback callback = connection.getCallbackLocked(); ITvInputHardwareCallback callback = connection.getCallbackLocked(); if (callback != null) { if (callback != null) { Loading Loading @@ -263,14 +263,13 @@ class TvInputHardwareManager implements TvInputHal.Callback { || connectionCallingUid != callingUid || connectionResolvedUserId != resolvedUserId; || connectionCallingUid != callingUid || connectionResolvedUserId != resolvedUserId; } } private int obtainStateFromConfigs(TvStreamConfig[] configs) { private int convertConnectedToState(boolean connected) { for (TvStreamConfig config : configs) { if (connected) { if ((config.getFlags() & TvStreamConfig.FLAG_MASK_SIGNAL_DETECTION) != 0) { return INPUT_STATE_CONNECTED; return INPUT_STATE_CONNECTED; } else { return INPUT_STATE_DISCONNECTED; } } } } return (configs.length > 0) ? INPUT_STATE_CONNECTED_STANDBY : INPUT_STATE_DISCONNECTED; } public void addHardwareInput(int deviceId, TvInputInfo info) { public void addHardwareInput(int deviceId, TvInputInfo info) { synchronized (mLock) { synchronized (mLock) { Loading @@ -294,14 +293,9 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } String inputId = mHardwareInputIdMap.get(hardwareInfo.getDeviceId()); String inputId = mHardwareInputIdMap.get(hardwareInfo.getDeviceId()); if (inputId != null && inputId.equals(info.getId())) { if (inputId != null && inputId.equals(info.getId())) { // No HDMI hotplug does not necessarily mean disconnected, as old devices may mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, // not report hotplug state correctly. Using INPUT_STATE_CONNECTED_STANDBY to convertConnectedToState(mHdmiStateMap.valueAt(i)), 0, // denote unknown state. inputId).sendToTarget(); int state = mHdmiStateMap.valueAt(i) ? INPUT_STATE_CONNECTED : INPUT_STATE_CONNECTED_STANDBY; mHandler.obtainMessage( ListenerHandler.STATE_CHANGED, state, 0, inputId).sendToTarget(); return; return; } } } } Loading @@ -309,7 +303,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { Connection connection = mConnections.get(deviceId); Connection connection = mConnections.get(deviceId); if (connection != null) { if (connection != null) { mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, obtainStateFromConfigs(connection.getConfigsLocked()), 0, convertConnectedToState(connection.getConfigsLocked().length > 0), 0, info.getId()).sendToTarget(); info.getId()).sendToTarget(); } } } } Loading Loading @@ -1199,14 +1193,8 @@ class TvInputHardwareManager implements TvInputHal.Callback { if (inputId == null) { if (inputId == null) { return; return; } } // No HDMI hotplug does not necessarily mean disconnected, as old devices may mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, // not report hotplug state correctly. Using INPUT_STATE_CONNECTED_STANDBY to convertConnectedToState(event.isConnected()), 0, inputId).sendToTarget(); // denote unknown state. int state = event.isConnected() ? INPUT_STATE_CONNECTED : INPUT_STATE_CONNECTED_STANDBY; mHandler.obtainMessage( ListenerHandler.STATE_CHANGED, state, 0, inputId).sendToTarget(); } } } } } } Loading
services/core/jni/com_android_server_tv_TvInputHal.cpp +21 −60 Original line number Original line Diff line number Diff line Loading @@ -54,7 +54,6 @@ static struct { jmethodID maxWidth; jmethodID maxWidth; jmethodID maxHeight; jmethodID maxHeight; jmethodID generation; jmethodID generation; jmethodID flags; jmethodID build; jmethodID build; } gTvStreamConfigBuilderClassInfo; } gTvStreamConfigBuilderClassInfo; Loading Loading @@ -240,7 +239,7 @@ public: int addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface); int addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface); int removeStream(int deviceId, int streamId); int removeStream(int deviceId, int streamId); const tv_stream_config_ext_t* getStreamConfigs(int deviceId, int* numConfigs); const tv_stream_config_t* getStreamConfigs(int deviceId, int* numConfigs); void onDeviceAvailable(const tv_input_device_info_t& info); void onDeviceAvailable(const tv_input_device_info_t& info); void onDeviceUnavailable(int deviceId); void onDeviceUnavailable(int deviceId); Loading Loading @@ -289,15 +288,10 @@ private: sp<Looper> mLooper; sp<Looper> mLooper; KeyedVector<int, KeyedVector<int, Connection> > mConnections; KeyedVector<int, KeyedVector<int, Connection> > mConnections; tv_stream_config_ext_t* mConfigBuffer; int mConfigBufferSize; }; }; JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, tv_input_device_t* device, JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, tv_input_device_t* device, const sp<Looper>& looper) const sp<Looper>& looper) { : mConfigBuffer(NULL), mConfigBufferSize(0) { mThiz = env->NewWeakGlobalRef(thiz); mThiz = env->NewWeakGlobalRef(thiz); mDevice = device; mDevice = device; mCallback.notify = &JTvInputHal::notify; mCallback.notify = &JTvInputHal::notify; Loading @@ -312,10 +306,6 @@ JTvInputHal::~JTvInputHal() { JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mThiz); env->DeleteWeakGlobalRef(mThiz); mThiz = NULL; mThiz = NULL; if (mConfigBuffer != NULL) { delete[] mConfigBuffer; } } } JTvInputHal* JTvInputHal::createInstance(JNIEnv* env, jobject thiz, const sp<Looper>& looper) { JTvInputHal* JTvInputHal::createInstance(JNIEnv* env, jobject thiz, const sp<Looper>& looper) { Loading Loading @@ -364,14 +354,15 @@ int JTvInputHal::addOrUpdateStream(int deviceId, int streamId, const sp<Surface> if (connection.mSourceHandle == NULL && connection.mThread == NULL) { if (connection.mSourceHandle == NULL && connection.mThread == NULL) { // Need to configure stream // Need to configure stream int numConfigs = 0; int numConfigs = 0; const tv_stream_config_ext_t* configs = getStreamConfigs(deviceId, &numConfigs); const tv_stream_config_t* configs = NULL; if (configs == NULL) { if (mDevice->get_stream_configurations( mDevice, deviceId, &numConfigs, &configs) != 0) { ALOGE("Couldn't get stream configs"); ALOGE("Couldn't get stream configs"); return UNKNOWN_ERROR; return UNKNOWN_ERROR; } } int configIndex = -1; int configIndex = -1; for (int i = 0; i < numConfigs; ++i) { for (int i = 0; i < numConfigs; ++i) { if (configs[i].config.stream_id == streamId) { if (configs[i].stream_id == streamId) { configIndex = i; configIndex = i; break; break; } } Loading @@ -380,13 +371,13 @@ int JTvInputHal::addOrUpdateStream(int deviceId, int streamId, const sp<Surface> ALOGE("Cannot find a config with given stream ID: %d", streamId); ALOGE("Cannot find a config with given stream ID: %d", streamId); return BAD_VALUE; return BAD_VALUE; } } connection.mStreamType = configs[configIndex].config.type; connection.mStreamType = configs[configIndex].type; tv_stream_t stream; tv_stream_t stream; stream.stream_id = configs[configIndex].config.stream_id; stream.stream_id = configs[configIndex].stream_id; if (connection.mStreamType == TV_STREAM_TYPE_BUFFER_PRODUCER) { if (connection.mStreamType == TV_STREAM_TYPE_BUFFER_PRODUCER) { stream.buffer_producer.width = configs[configIndex].config.max_video_width; stream.buffer_producer.width = configs[configIndex].max_video_width; stream.buffer_producer.height = configs[configIndex].config.max_video_height; stream.buffer_producer.height = configs[configIndex].max_video_height; } } if (mDevice->open_stream(mDevice, deviceId, &stream) != 0) { if (mDevice->open_stream(mDevice, deviceId, &stream) != 0) { ALOGE("Couldn't add stream"); ALOGE("Couldn't add stream"); Loading Loading @@ -440,34 +431,13 @@ int JTvInputHal::removeStream(int deviceId, int streamId) { return NO_ERROR; return NO_ERROR; } } const tv_stream_config_ext_t* JTvInputHal::getStreamConfigs(int deviceId, int* numConfigs) { const tv_stream_config_t* JTvInputHal::getStreamConfigs(int deviceId, int* numConfigs) { const tv_stream_config_ext_t* configs = NULL; const tv_stream_config_t* configs = NULL; if (mDevice->common.version >= TV_INPUT_DEVICE_API_VERSION_0_2) { if (mDevice->get_stream_configurations_ext( mDevice, deviceId, numConfigs, &configs) != 0) { ALOGE("Couldn't get stream configs"); return NULL; } } else { const tv_stream_config_t* oldConfigs; if (mDevice->get_stream_configurations( if (mDevice->get_stream_configurations( mDevice, deviceId, numConfigs, &oldConfigs) != 0) { mDevice, deviceId, numConfigs, &configs) != 0) { ALOGE("Couldn't get stream configs"); ALOGE("Couldn't get stream configs"); return NULL; return NULL; } } if (mConfigBufferSize < *numConfigs) { mConfigBufferSize = (*numConfigs / 16 + 1) * 16; if (mConfigBuffer != NULL) { delete[] mConfigBuffer; } mConfigBuffer = new tv_stream_config_ext_t[mConfigBufferSize]; } for (int i = 0; i < *numConfigs; ++i) { mConfigBuffer[i].config = oldConfigs[i]; mConfigBuffer[i].flags = 0; } configs = mConfigBuffer; } return configs; return configs; } } Loading Loading @@ -659,7 +629,7 @@ static jobjectArray nativeGetStreamConfigs(JNIEnv* env, jclass clazz, jlong ptr, jint deviceId, jint generation) { jlong ptr, jint deviceId, jint generation) { JTvInputHal* tvInputHal = (JTvInputHal*)ptr; JTvInputHal* tvInputHal = (JTvInputHal*)ptr; int numConfigs = 0; int numConfigs = 0; const tv_stream_config_ext_t* configs = tvInputHal->getStreamConfigs(deviceId, &numConfigs); const tv_stream_config_t* configs = tvInputHal->getStreamConfigs(deviceId, &numConfigs); jobjectArray result = env->NewObjectArray(numConfigs, gTvStreamConfigClassInfo.clazz, NULL); jobjectArray result = env->NewObjectArray(numConfigs, gTvStreamConfigClassInfo.clazz, NULL); for (int i = 0; i < numConfigs; ++i) { for (int i = 0; i < numConfigs; ++i) { Loading @@ -667,20 +637,15 @@ static jobjectArray nativeGetStreamConfigs(JNIEnv* env, jclass clazz, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.constructor); gTvStreamConfigBuilderClassInfo.constructor); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.streamId, configs[i].config.stream_id); builder, gTvStreamConfigBuilderClassInfo.streamId, configs[i].stream_id); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.type, configs[i].config.type); builder, gTvStreamConfigBuilderClassInfo.type, configs[i].type); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.maxWidth, builder, gTvStreamConfigBuilderClassInfo.maxWidth, configs[i].max_video_width); configs[i].config.max_video_width); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.maxHeight, builder, gTvStreamConfigBuilderClassInfo.maxHeight, configs[i].max_video_height); configs[i].config.max_video_height); env->CallObjectMethod( env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.generation, generation); builder, gTvStreamConfigBuilderClassInfo.generation, generation); env->CallObjectMethod( builder, gTvStreamConfigBuilderClassInfo.flags, configs[i].flags); jobject config = env->CallObjectMethod(builder, gTvStreamConfigBuilderClassInfo.build); jobject config = env->CallObjectMethod(builder, gTvStreamConfigBuilderClassInfo.build); Loading Loading @@ -771,10 +736,6 @@ int register_android_server_tv_TvInputHal(JNIEnv* env) { gTvStreamConfigBuilderClassInfo.generation, gTvStreamConfigBuilderClassInfo.generation, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.clazz, "generation", "(I)Landroid/media/tv/TvStreamConfig$Builder;"); "generation", "(I)Landroid/media/tv/TvStreamConfig$Builder;"); GET_METHOD_ID( gTvStreamConfigBuilderClassInfo.flags, gTvStreamConfigBuilderClassInfo.clazz, "flags", "(I)Landroid/media/tv/TvStreamConfig$Builder;"); GET_METHOD_ID( GET_METHOD_ID( gTvStreamConfigBuilderClassInfo.build, gTvStreamConfigBuilderClassInfo.build, gTvStreamConfigBuilderClassInfo.clazz, gTvStreamConfigBuilderClassInfo.clazz, Loading