vnc: Simplify everything
Previous design was using extra threads needlessly and had some
hacky data sharing going on. Slim this down to just two classes
and utilize threads appropriately.
diff --git a/src/VNCFlinger.h b/src/VNCFlinger.h
index 8c026b9..4535fb6 100644
--- a/src/VNCFlinger.h
+++ b/src/VNCFlinger.h
@@ -1,8 +1,7 @@
#ifndef VNCFLINGER_H
#define VNCFLINGER_H
-#include "VirtualDisplay.h"
-
+#include <gui/CpuConsumer.h>
#include <ui/DisplayInfo.h>
#include "rfb/rfb.h"
@@ -27,39 +26,67 @@
virtual size_t addClient();
virtual size_t removeClient();
- virtual void markFrame(void* frame, size_t stride);
private:
- virtual status_t setup_l();
- virtual void release_l();
+ class FrameListener : public CpuConsumer::FrameAvailableListener {
+ public:
+ FrameListener(VNCFlinger *vnc) : mVNC(vnc) {}
+ virtual void onFrameAvailable(const BufferItem& item);
+
+ private:
+ FrameListener(FrameListener&) {}
+ VNCFlinger *mVNC;
+ };
+
+ virtual void eventLoop();
+
+ virtual status_t createVirtualDisplay();
+ virtual status_t destroyVirtualDisplay();
+ virtual status_t createVNCServer();
+
+ virtual void processFrame();
+
+ // vncserver callbacks
static ClientGoneHookPtr onClientGone(rfbClientPtr cl);
static enum rfbNewClientAction onNewClient(rfbClientPtr cl);
static void onFrameStart(rfbClientPtr cl);
static void onFrameDone(rfbClientPtr cl, int result);
static void rfbLogger(const char *format, ...);
- Condition mCondition;
+ bool mRunning;
+ bool mFrameAvailable;
+
+ Mutex mEventMutex;
+ Mutex mUpdateMutex;
+
+ Condition mEventCond;
rfbScreenInfoPtr mVNCScreen;
uint8_t *mVNCBuf;
uint32_t mWidth, mHeight;
- bool mRotate;
sp<IBinder> mMainDpy;
DisplayInfo mMainDpyInfo;
-
- Mutex mMutex;
- static Mutex sUpdateMutex;
-
- sp<VirtualDisplay> mVirtualDisplay;
int mArgc;
char **mArgv;
size_t mClientCount;
+
+ sp<FrameListener> mListener;
+
+ // Producer side of queue, passed into the virtual display.
+ sp<IGraphicBufferProducer> mProducer;
+
+ // This receives frames from the virtual display and makes them available
+ sp<CpuConsumer> mCpuConsumer;
+
+ // The virtual display instance
+ sp<IBinder> mDpy;
+
};
};