blob: 4535fb670bf82bb699e1fe30ce4acacd8f961985 [file] [log] [blame]
Steve Kondik55db0532017-06-12 11:27:18 -07001#ifndef VNCFLINGER_H
2#define VNCFLINGER_H
3
Steve Kondik77754522017-06-14 17:00:33 -07004#include <gui/CpuConsumer.h>
Steve Kondik55db0532017-06-12 11:27:18 -07005#include <ui/DisplayInfo.h>
6
7#include "rfb/rfb.h"
8
9#define VNC_PORT 5901
10
11namespace android {
12
Steve Kondik7225c7f2017-06-14 00:06:16 -070013class VNCFlinger {
Steve Kondik55db0532017-06-12 11:27:18 -070014public:
15 VNCFlinger(int argc, char **argv) :
16 mArgc(argc),
17 mArgv(argv),
18 mClientCount(0) {
19 }
20
Steve Kondik7225c7f2017-06-14 00:06:16 -070021 virtual ~VNCFlinger() {}
Steve Kondik55db0532017-06-12 11:27:18 -070022
23 virtual status_t start();
24 virtual status_t stop();
25
Steve Kondik7225c7f2017-06-14 00:06:16 -070026 virtual size_t addClient();
27 virtual size_t removeClient();
Steve Kondik55db0532017-06-12 11:27:18 -070028
Steve Kondikef4e8652017-06-14 15:07:54 -070029
Steve Kondik55db0532017-06-12 11:27:18 -070030private:
Steve Kondik7225c7f2017-06-14 00:06:16 -070031
Steve Kondik77754522017-06-14 17:00:33 -070032 class FrameListener : public CpuConsumer::FrameAvailableListener {
33 public:
34 FrameListener(VNCFlinger *vnc) : mVNC(vnc) {}
Steve Kondik55db0532017-06-12 11:27:18 -070035
Steve Kondik77754522017-06-14 17:00:33 -070036 virtual void onFrameAvailable(const BufferItem& item);
37
38 private:
39 FrameListener(FrameListener&) {}
40 VNCFlinger *mVNC;
41 };
42
43 virtual void eventLoop();
44
45 virtual status_t createVirtualDisplay();
46 virtual status_t destroyVirtualDisplay();
47 virtual status_t createVNCServer();
48
49 virtual void processFrame();
50
51 // vncserver callbacks
Steve Kondik55db0532017-06-12 11:27:18 -070052 static ClientGoneHookPtr onClientGone(rfbClientPtr cl);
53 static enum rfbNewClientAction onNewClient(rfbClientPtr cl);
Steve Kondikef4e8652017-06-14 15:07:54 -070054 static void onFrameStart(rfbClientPtr cl);
55 static void onFrameDone(rfbClientPtr cl, int result);
Steve Kondik55db0532017-06-12 11:27:18 -070056 static void rfbLogger(const char *format, ...);
Steve Kondik7225c7f2017-06-14 00:06:16 -070057
Steve Kondik77754522017-06-14 17:00:33 -070058 bool mRunning;
59 bool mFrameAvailable;
60
61 Mutex mEventMutex;
62 Mutex mUpdateMutex;
63
64 Condition mEventCond;
Steve Kondik7225c7f2017-06-14 00:06:16 -070065
Steve Kondik55db0532017-06-12 11:27:18 -070066 rfbScreenInfoPtr mVNCScreen;
67 uint8_t *mVNCBuf;
68
69 uint32_t mWidth, mHeight;
Steve Kondik55db0532017-06-12 11:27:18 -070070
71 sp<IBinder> mMainDpy;
72 DisplayInfo mMainDpyInfo;
Steve Kondik55db0532017-06-12 11:27:18 -070073
74 int mArgc;
75 char **mArgv;
76
77 size_t mClientCount;
Steve Kondik77754522017-06-14 17:00:33 -070078
79 sp<FrameListener> mListener;
80
81 // Producer side of queue, passed into the virtual display.
82 sp<IGraphicBufferProducer> mProducer;
83
84 // This receives frames from the virtual display and makes them available
85 sp<CpuConsumer> mCpuConsumer;
86
87 // The virtual display instance
88 sp<IBinder> mDpy;
89
Steve Kondik55db0532017-06-12 11:27:18 -070090};
91
92};
93#endif