Loading media/java/android/media/tv/TvStreamConfig.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -88,6 +88,16 @@ public class TvStreamConfig implements Parcelable { return mGeneration; return mGeneration; } } @Override public String toString() { StringBuilder b = new StringBuilder(128); b.append("TvStreamConfig {"); b.append("mStreamId=").append(mStreamId).append(";"); b.append("mType=").append(mType).append(";"); b.append("mGeneration=").append(mGeneration).append("}"); return b.toString(); } // Parcelable // Parcelable @Override @Override public int describeContents() { public int describeContents() { Loading services/core/java/com/android/server/tv/TvInputHal.java +62 −40 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.os.HandlerThread; import android.os.Message; import android.os.Message; import android.view.Surface; import android.view.Surface; import android.util.Slog; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; import java.util.LinkedList; import java.util.LinkedList; import java.util.Queue; import java.util.Queue; Loading Loading @@ -62,26 +64,31 @@ final class TvInputHal implements Handler.Callback { int generation); int generation); private static native void nativeClose(long ptr); private static native void nativeClose(long ptr); private Object mLock = new Object(); private long mPtr = 0; private long mPtr = 0; private final Callback mCallback; private final Callback mCallback; private final Handler mHandler; private final Handler mHandler; private int mStreamConfigGeneration = 0; private SparseIntArray mStreamConfigGenerations = new SparseIntArray(); private TvStreamConfig[] mStreamConfigs; private SparseArray<TvStreamConfig[]> mStreamConfigs = new SparseArray<>();; public TvInputHal(Callback callback) { public TvInputHal(Callback callback) { mCallback = callback; mCallback = callback; mHandler = new Handler(this); mHandler = new Handler(this); } } public synchronized void init() { public void init() { synchronized (mLock) { mPtr = nativeOpen(); mPtr = nativeOpen(); } } } public synchronized int addStream(int deviceId, Surface surface, TvStreamConfig streamConfig) { public int addStream(int deviceId, Surface surface, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { if (mPtr == 0) { return ERROR_NO_INIT; return ERROR_NO_INIT; } } if (mStreamConfigGeneration != streamConfig.getGeneration()) { int generation = mStreamConfigGenerations.get(deviceId, 0); if (generation != streamConfig.getGeneration()) { return ERROR_STALE_CONFIG; return ERROR_STALE_CONFIG; } } if (nativeAddStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) { if (nativeAddStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) { Loading @@ -90,12 +97,15 @@ final class TvInputHal implements Handler.Callback { return ERROR_UNKNOWN; return ERROR_UNKNOWN; } } } } } public synchronized int removeStream(int deviceId, TvStreamConfig streamConfig) { public int removeStream(int deviceId, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { if (mPtr == 0) { return ERROR_NO_INIT; return ERROR_NO_INIT; } } if (mStreamConfigGeneration != streamConfig.getGeneration()) { int generation = mStreamConfigGenerations.get(deviceId, 0); if (generation != streamConfig.getGeneration()) { return ERROR_STALE_CONFIG; return ERROR_STALE_CONFIG; } } if (nativeRemoveStream(mPtr, deviceId, streamConfig.getStreamId()) == 0) { if (nativeRemoveStream(mPtr, deviceId, streamConfig.getStreamId()) == 0) { Loading @@ -104,16 +114,20 @@ final class TvInputHal implements Handler.Callback { return ERROR_UNKNOWN; return ERROR_UNKNOWN; } } } } } public synchronized void close() { public void close() { synchronized (mLock) { if (mPtr != 0l) { if (mPtr != 0l) { nativeClose(mPtr); nativeClose(mPtr); } } } } } private synchronized void retrieveStreamConfigs(int deviceId) { private void retrieveStreamConfigsLocked(int deviceId) { ++mStreamConfigGeneration; int generation = mStreamConfigGenerations.get(deviceId, 0) + 1; mStreamConfigs = nativeGetStreamConfigs(mPtr, deviceId, mStreamConfigGeneration); mStreamConfigs.put(deviceId, nativeGetStreamConfigs(mPtr, deviceId, generation)); mStreamConfigGenerations.put(deviceId, generation); } } // Called from native // Called from native Loading Loading @@ -145,12 +159,16 @@ final class TvInputHal implements Handler.Callback { public boolean handleMessage(Message msg) { public boolean handleMessage(Message msg) { switch (msg.what) { switch (msg.what) { case EVENT_DEVICE_AVAILABLE: { case EVENT_DEVICE_AVAILABLE: { TvStreamConfig[] configs; TvInputHardwareInfo info = (TvInputHardwareInfo)msg.obj; TvInputHardwareInfo info = (TvInputHardwareInfo)msg.obj; retrieveStreamConfigs(info.getDeviceId()); synchronized (mLock) { retrieveStreamConfigsLocked(info.getDeviceId()); if (DEBUG) { if (DEBUG) { Slog.d(TAG, "EVENT_DEVICE_AVAILABLE: info = " + info); Slog.d(TAG, "EVENT_DEVICE_AVAILABLE: info = " + info); } } mCallback.onDeviceAvailable(info, mStreamConfigs); configs = mStreamConfigs.get(info.getDeviceId()); } mCallback.onDeviceAvailable(info, configs); break; break; } } Loading @@ -164,12 +182,16 @@ final class TvInputHal implements Handler.Callback { } } case EVENT_STREAM_CONFIGURATION_CHANGED: { case EVENT_STREAM_CONFIGURATION_CHANGED: { TvStreamConfig[] configs; int deviceId = msg.arg1; int deviceId = msg.arg1; synchronized (mLock) { if (DEBUG) { if (DEBUG) { Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId); Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId); } } retrieveStreamConfigs(deviceId); retrieveStreamConfigsLocked(deviceId); mCallback.onStreamConfigurationChanged(deviceId, mStreamConfigs); configs = mStreamConfigs.get(deviceId); } mCallback.onStreamConfigurationChanged(deviceId, configs); break; break; } } Loading services/core/jni/com_android_server_tv_TvInputHal.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -351,6 +351,8 @@ int JTvInputHal::addStream(int deviceId, int streamId, const sp<Surface>& surfac 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].type; tv_stream_t stream; tv_stream_t stream; stream.stream_id = configs[configIndex].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) { Loading Loading
media/java/android/media/tv/TvStreamConfig.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -88,6 +88,16 @@ public class TvStreamConfig implements Parcelable { return mGeneration; return mGeneration; } } @Override public String toString() { StringBuilder b = new StringBuilder(128); b.append("TvStreamConfig {"); b.append("mStreamId=").append(mStreamId).append(";"); b.append("mType=").append(mType).append(";"); b.append("mGeneration=").append(mGeneration).append("}"); return b.toString(); } // Parcelable // Parcelable @Override @Override public int describeContents() { public int describeContents() { Loading
services/core/java/com/android/server/tv/TvInputHal.java +62 −40 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.os.HandlerThread; import android.os.Message; import android.os.Message; import android.view.Surface; import android.view.Surface; import android.util.Slog; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; import java.util.LinkedList; import java.util.LinkedList; import java.util.Queue; import java.util.Queue; Loading Loading @@ -62,26 +64,31 @@ final class TvInputHal implements Handler.Callback { int generation); int generation); private static native void nativeClose(long ptr); private static native void nativeClose(long ptr); private Object mLock = new Object(); private long mPtr = 0; private long mPtr = 0; private final Callback mCallback; private final Callback mCallback; private final Handler mHandler; private final Handler mHandler; private int mStreamConfigGeneration = 0; private SparseIntArray mStreamConfigGenerations = new SparseIntArray(); private TvStreamConfig[] mStreamConfigs; private SparseArray<TvStreamConfig[]> mStreamConfigs = new SparseArray<>();; public TvInputHal(Callback callback) { public TvInputHal(Callback callback) { mCallback = callback; mCallback = callback; mHandler = new Handler(this); mHandler = new Handler(this); } } public synchronized void init() { public void init() { synchronized (mLock) { mPtr = nativeOpen(); mPtr = nativeOpen(); } } } public synchronized int addStream(int deviceId, Surface surface, TvStreamConfig streamConfig) { public int addStream(int deviceId, Surface surface, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { if (mPtr == 0) { return ERROR_NO_INIT; return ERROR_NO_INIT; } } if (mStreamConfigGeneration != streamConfig.getGeneration()) { int generation = mStreamConfigGenerations.get(deviceId, 0); if (generation != streamConfig.getGeneration()) { return ERROR_STALE_CONFIG; return ERROR_STALE_CONFIG; } } if (nativeAddStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) { if (nativeAddStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) { Loading @@ -90,12 +97,15 @@ final class TvInputHal implements Handler.Callback { return ERROR_UNKNOWN; return ERROR_UNKNOWN; } } } } } public synchronized int removeStream(int deviceId, TvStreamConfig streamConfig) { public int removeStream(int deviceId, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { if (mPtr == 0) { return ERROR_NO_INIT; return ERROR_NO_INIT; } } if (mStreamConfigGeneration != streamConfig.getGeneration()) { int generation = mStreamConfigGenerations.get(deviceId, 0); if (generation != streamConfig.getGeneration()) { return ERROR_STALE_CONFIG; return ERROR_STALE_CONFIG; } } if (nativeRemoveStream(mPtr, deviceId, streamConfig.getStreamId()) == 0) { if (nativeRemoveStream(mPtr, deviceId, streamConfig.getStreamId()) == 0) { Loading @@ -104,16 +114,20 @@ final class TvInputHal implements Handler.Callback { return ERROR_UNKNOWN; return ERROR_UNKNOWN; } } } } } public synchronized void close() { public void close() { synchronized (mLock) { if (mPtr != 0l) { if (mPtr != 0l) { nativeClose(mPtr); nativeClose(mPtr); } } } } } private synchronized void retrieveStreamConfigs(int deviceId) { private void retrieveStreamConfigsLocked(int deviceId) { ++mStreamConfigGeneration; int generation = mStreamConfigGenerations.get(deviceId, 0) + 1; mStreamConfigs = nativeGetStreamConfigs(mPtr, deviceId, mStreamConfigGeneration); mStreamConfigs.put(deviceId, nativeGetStreamConfigs(mPtr, deviceId, generation)); mStreamConfigGenerations.put(deviceId, generation); } } // Called from native // Called from native Loading Loading @@ -145,12 +159,16 @@ final class TvInputHal implements Handler.Callback { public boolean handleMessage(Message msg) { public boolean handleMessage(Message msg) { switch (msg.what) { switch (msg.what) { case EVENT_DEVICE_AVAILABLE: { case EVENT_DEVICE_AVAILABLE: { TvStreamConfig[] configs; TvInputHardwareInfo info = (TvInputHardwareInfo)msg.obj; TvInputHardwareInfo info = (TvInputHardwareInfo)msg.obj; retrieveStreamConfigs(info.getDeviceId()); synchronized (mLock) { retrieveStreamConfigsLocked(info.getDeviceId()); if (DEBUG) { if (DEBUG) { Slog.d(TAG, "EVENT_DEVICE_AVAILABLE: info = " + info); Slog.d(TAG, "EVENT_DEVICE_AVAILABLE: info = " + info); } } mCallback.onDeviceAvailable(info, mStreamConfigs); configs = mStreamConfigs.get(info.getDeviceId()); } mCallback.onDeviceAvailable(info, configs); break; break; } } Loading @@ -164,12 +182,16 @@ final class TvInputHal implements Handler.Callback { } } case EVENT_STREAM_CONFIGURATION_CHANGED: { case EVENT_STREAM_CONFIGURATION_CHANGED: { TvStreamConfig[] configs; int deviceId = msg.arg1; int deviceId = msg.arg1; synchronized (mLock) { if (DEBUG) { if (DEBUG) { Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId); Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId); } } retrieveStreamConfigs(deviceId); retrieveStreamConfigsLocked(deviceId); mCallback.onStreamConfigurationChanged(deviceId, mStreamConfigs); configs = mStreamConfigs.get(deviceId); } mCallback.onStreamConfigurationChanged(deviceId, configs); break; break; } } Loading
services/core/jni/com_android_server_tv_TvInputHal.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -351,6 +351,8 @@ int JTvInputHal::addStream(int deviceId, int streamId, const sp<Surface>& surfac 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].type; tv_stream_t stream; tv_stream_t stream; stream.stream_id = configs[configIndex].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) { Loading