aboutsummaryrefslogtreecommitdiff
path: root/libshims
diff options
context:
space:
mode:
Diffstat (limited to 'libshims')
-rw-r--r--libshims/Android.mk2
-rw-r--r--libshims/camera_shim.cpp26
-rw-r--r--libshims/gui/DisplayEventReceiver.h147
3 files changed, 172 insertions, 3 deletions
diff --git a/libshims/Android.mk b/libshims/Android.mk
index 2f633ac..5bf3e5b 100644
--- a/libshims/Android.mk
+++ b/libshims/Android.mk
@@ -31,6 +31,8 @@ LOCAL_SRC_FILES := \
camera_shim.cpp
LOCAL_SHARED_LIBRARIES := \
+ liblog \
+ libutils \
libgui \
libui
diff --git a/libshims/camera_shim.cpp b/libshims/camera_shim.cpp
index ec8b580..68e8ccc 100644
--- a/libshims/camera_shim.cpp
+++ b/libshims/camera_shim.cpp
@@ -16,8 +16,18 @@
#include <string>
+#include <utils/Errors.h>
+
#include <ui/GraphicBuffer.h>
+#include "gui/DisplayEventReceiver.h"
+#include <gui/IDisplayEventConnection.h>
+#include <gui/ISurfaceComposer.h>
+
+#include <private/gui/ComposerService.h>
+
+#include <private/gui/BitTube.h>
+
extern "C" void _ZN7android13GraphicBufferC1EjjijjjP13native_handleb(
const native_handle_t* handle,
android::GraphicBuffer::HandleWrapMethod method,
@@ -43,8 +53,18 @@ extern "C" void _ZN7android13GraphicBufferC1EjjijjP13native_handleb(
inFormat, static_cast<uint32_t>(1), static_cast<uint64_t>(inUsage), inStride);
}
-extern "C" void _ZN7android20DisplayEventReceiverC1ENS_16ISurfaceComposer11VsyncSourceE();
+namespace android {
-extern "C" void _ZN7android20DisplayEventReceiverC1Ev() {
- _ZN7android20DisplayEventReceiverC1ENS_16ISurfaceComposer11VsyncSourceE();
+DisplayEventReceiver::DisplayEventReceiver() {
+ status_t err;
+ sp<ISurfaceComposer> sf(ComposerService::getComposerService());
+ if (sf != NULL) {
+ mEventConnection = sf->createDisplayEventConnection(ISurfaceComposer::eVsyncSourceApp);
+ if (mEventConnection != NULL) {
+ mDataChannel = std::make_unique<gui::BitTube>();
+ err = mEventConnection->stealReceiveChannel(mDataChannel.get());
+ }
+ }
}
+
+}; // namespace android
diff --git a/libshims/gui/DisplayEventReceiver.h b/libshims/gui/DisplayEventReceiver.h
new file mode 100644
index 0000000..6354005
--- /dev/null
+++ b/libshims/gui/DisplayEventReceiver.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_GUI_DISPLAY_EVENT_H
+#define ANDROID_GUI_DISPLAY_EVENT_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <utils/Errors.h>
+#include <utils/RefBase.h>
+#include <utils/Timers.h>
+
+#include <binder/IInterface.h>
+#include <gui/ISurfaceComposer.h>
+
+// ----------------------------------------------------------------------------
+
+namespace android {
+
+// ----------------------------------------------------------------------------
+
+class IDisplayEventConnection;
+
+namespace gui {
+class BitTube;
+} // namespace gui
+
+static inline constexpr uint32_t fourcc(char c1, char c2, char c3, char c4) {
+ return static_cast<uint32_t>(c1) << 24 |
+ static_cast<uint32_t>(c2) << 16 |
+ static_cast<uint32_t>(c3) << 8 |
+ static_cast<uint32_t>(c4);
+}
+
+// ----------------------------------------------------------------------------
+class DisplayEventReceiver {
+public:
+ enum {
+ DISPLAY_EVENT_VSYNC = fourcc('v', 's', 'y', 'n'),
+ DISPLAY_EVENT_HOTPLUG = fourcc('p', 'l', 'u', 'g'),
+ };
+
+ struct Event {
+
+ struct Header {
+ uint32_t type;
+ uint32_t id;
+ nsecs_t timestamp __attribute__((aligned(8)));
+ };
+
+ struct VSync {
+ uint32_t count;
+ };
+
+ struct Hotplug {
+ bool connected;
+ };
+
+ Header header;
+ union {
+ VSync vsync;
+ Hotplug hotplug;
+ };
+ };
+
+public:
+ DisplayEventReceiver();
+ /*
+ * DisplayEventReceiver creates and registers an event connection with
+ * SurfaceFlinger. VSync events are disabled by default. Call setVSyncRate
+ * or requestNextVsync to receive them.
+ * Other events start being delivered immediately.
+ */
+ DisplayEventReceiver(
+ ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp);
+
+ /*
+ * ~DisplayEventReceiver severs the connection with SurfaceFlinger, new events
+ * stop being delivered immediately. Note that the queue could have
+ * some events pending. These will be delivered.
+ */
+ ~DisplayEventReceiver();
+
+ /*
+ * initCheck returns the state of DisplayEventReceiver after construction.
+ */
+ status_t initCheck() const;
+
+ /*
+ * getFd returns the file descriptor to use to receive events.
+ * OWNERSHIP IS RETAINED by DisplayEventReceiver. DO NOT CLOSE this
+ * file-descriptor.
+ */
+ int getFd() const;
+
+ /*
+ * getEvents reads events from the queue and returns how many events were
+ * read. Returns 0 if there are no more events or a negative error code.
+ * If NOT_ENOUGH_DATA is returned, the object has become invalid forever, it
+ * should be destroyed and getEvents() shouldn't be called again.
+ */
+ ssize_t getEvents(Event* events, size_t count);
+ static ssize_t getEvents(gui::BitTube* dataChannel, Event* events, size_t count);
+
+ /*
+ * sendEvents write events to the queue and returns how many events were
+ * written.
+ */
+ static ssize_t sendEvents(gui::BitTube* dataChannel, Event const* events, size_t count);
+
+ /*
+ * setVsyncRate() sets the Event::VSync delivery rate. A value of
+ * 1 returns every Event::VSync. A value of 2 returns every other event,
+ * etc... a value of 0 returns no event unless requestNextVsync() has
+ * been called.
+ */
+ status_t setVsyncRate(uint32_t count);
+
+ /*
+ * requestNextVsync() schedules the next Event::VSync. It has no effect
+ * if the vsync rate is > 0.
+ */
+ status_t requestNextVsync();
+
+private:
+ sp<IDisplayEventConnection> mEventConnection;
+ std::unique_ptr<gui::BitTube> mDataChannel;
+};
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+
+#endif // ANDROID_GUI_DISPLAY_EVENT_H