Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21aa3467 authored by Wonsik Kim's avatar Wonsik Kim
Browse files

TIF: fix TvInputHal bug for multiple devices

In addition, add toString() method to TvStreamConfig for easier
debugging.

Bug: 16561829, Bug: 16666251
Change-Id: Ic192aef30f4d193b73bac7bc93a1563aa9af4377
parent 11d2e53d
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -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() {
+62 −40
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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) {
@@ -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
@@ -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;
            }
            }


@@ -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;
            }
            }


+2 −0
Original line number Original line Diff line number Diff line
@@ -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) {