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

Commit add8929f authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Consume video frames

An input device currently reads video frames, and stores them into local
queue. We limit the queue size to 10 frames.

Here, we add the step where an input mapper would consume the video
frames from the video device for a given input device, and then pass
them onto the input listener.

Test: integration tested by checking that frames are processed correctly
in input hal. To check if frames are processed correctly, look at the
active touch area and print a log message when the total area exceeds a
certain threshold.
Bug: 111480215

Change-Id: Ifc519389e12b44540e9a54fd273241f9f7cd057d
parent 12598681
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1028,6 +1028,16 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
    return event - buffer;
}

std::vector<TouchVideoFrame> EventHub::getVideoFrames(int32_t deviceId) {
    AutoMutex _l(mLock);

    Device* device = getDeviceLocked(deviceId);
    if (!device || !device->videoDevice) {
        return {};
    }
    return device->videoDevice->consumeFrames();
}

void EventHub::wake() {
    ALOGV("wake() called");

+4 −2
Original line number Diff line number Diff line
@@ -6483,11 +6483,13 @@ void TouchInputMapper::dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32
        }
    }

    NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), 
    const int32_t deviceId = getDeviceId();
    std::vector<TouchVideoFrame> frames = mDevice->getEventHub()->getVideoFrames(deviceId);
    NotifyMotionArgs args(mContext->getNextSequenceNum(), when, deviceId,
            source, mViewport.displayId, policyFlags,
            action, actionButton, flags, metaState, buttonState, edgeFlags,
            deviceTimestamp, pointerCount, pointerProperties, pointerCoords,
            xPrecision, yPrecision, downTime, /* videoFrames */ {});
            xPrecision, yPrecision, downTime, std::move(frames));
    getListener()->notifyMotion(&args);
}

+2 −0
Original line number Diff line number Diff line
@@ -211,6 +211,7 @@ public:
     * Returns the number of events obtained, or 0 if the timeout expired.
     */
    virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) = 0;
    virtual std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) = 0;

    /*
     * Query current input state.
@@ -303,6 +304,7 @@ public:
            const int32_t* keyCodes, uint8_t* outFlags) const;

    virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize);
    virtual std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId);

    virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const;
    virtual bool hasLed(int32_t deviceId, int32_t led) const;
+4 −0
Original line number Diff line number Diff line
@@ -692,6 +692,10 @@ private:
        return 1;
    }

    virtual std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) {
        return {};
    }

    virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
        Device* device = getDevice(deviceId);
        if (device) {