blob: 6e383330170eff444fc2dfcb522a79cbaedd4fd5 [file] [log] [blame]
Jorge E. Moreiraa18ff1a2019-12-17 18:20:56 -08001#include <webrtc/AdbWebSocketHandler.h>
2#include <webrtc/DTLS.h>
3#include <webrtc/MyWebSocketHandler.h>
4#include <webrtc/RTPSocketHandler.h>
5#include <webrtc/ServerState.h>
6#include <webrtc/STUNMessage.h>
7
8#include <https/HTTPServer.h>
9#include <https/PlainSocket.h>
10#include <https/RunLoop.h>
11#include <https/SafeCallbackable.h>
12#include <https/SSLSocket.h>
13#include <https/Support.h>
14#include <media/stagefright/foundation/hexdump.h>
15#include <media/stagefright/Utils.h>
16
17#include <iostream>
18#include <unordered_map>
19
20#if defined(TARGET_ANDROID)
21#include <gflags/gflags.h>
22
23DEFINE_string(
24 public_ip,
25 "0.0.0.0",
26 "Public IPv4 address of your server, a.b.c.d format");
27DEFINE_string(
28 assets_dir,
29 "webrtc",
30 "Directory with location of webpage assets.");
31DEFINE_string(
32 certs_dir,
33 "webrtc/certs",
34 "Directory to certificates.");
35
36DEFINE_int32(touch_fd, -1, "An fd to listen on for touch connections.");
37DEFINE_int32(keyboard_fd, -1, "An fd to listen on for keyboard connections.");
38
39DEFINE_string(adb, "", "Interface:port of local adb service.");
40#endif
41
42int main(int argc, char **argv) {
43#if defined(TARGET_ANDROID)
44 ::gflags::ParseCommandLineFlags(&argc, &argv, true);
45#else
46 (void)argc;
47 (void)argv;
48#endif
49
50 SSLSocket::Init();
51 DTLS::Init();
52
53 auto runLoop = RunLoop::main();
54
55 auto state = std::make_shared<ServerState>(
56 runLoop, ServerState::VideoFormat::VP8);
57
58#if 1
59 auto port = 8443; // Change to 8080 to use plain http instead of https.
60
61 auto httpd = std::make_shared<HTTPServer>(
62 runLoop,
63 "0.0.0.0",
64 port,
65 port == 8080
66 ? ServerSocket::TransportType::TCP
67 : ServerSocket::TransportType::TLS,
68 FLAGS_certs_dir + "/server.crt",
69 FLAGS_certs_dir + "/server.key");
70
71 const std::string index_html = FLAGS_assets_dir + "/index.html";
72 const std::string receive_js = FLAGS_assets_dir + "/js/receive.js";
73 const std::string logcat_js = FLAGS_assets_dir + "/js/logcat.js";
74 const std::string style_css = FLAGS_assets_dir + "/style.css";
75
76 httpd->addStaticFile("/index.html", index_html.c_str());
77 httpd->addStaticFile("/js/receive.js", receive_js.c_str());
78 httpd->addStaticFile("/js/logcat.js", logcat_js.c_str());
79 httpd->addStaticFile("/style.css", style_css.c_str());
80
81 httpd->addWebSocketHandlerFactory(
82 "/control",
83 [runLoop, state]{
84 auto id = state->acquireHandlerId();
85
86 auto handler =
87 std::make_shared<MyWebSocketHandler>(runLoop, state, id);
88
89 return std::make_pair(0 /* OK */, handler);
90 });
91
92#if defined(TARGET_ANDROID)
93 if (!FLAGS_adb.empty()) {
94 httpd->addWebSocketHandlerFactory(
95 "/control_adb",
96 [runLoop]{
97 auto handler = std::make_shared<AdbWebSocketHandler>(
98 runLoop, FLAGS_adb);
99
100 handler->run();
101
102 return std::make_pair(0 /* OK */, handler);
103 });
104 }
105#endif
106
107 httpd->run();
108#else
109 uint16_t receiverPort = 63843;
110 std::string receiverUFrag = "N1NB";
111 std::string receiverPassword = "deadbeef";
112
113 uint16_t senderPort = 63844;
114 std::string senderUFrag = "ABCD";
115 std::string senderPassword = "wooops";
116
117 auto sender = std::make_shared<RTPSocketHandler>(
118 runLoop,
119 RTPSocketHandler::Mode::CONTROLLER,
120 AF_INET,
121 senderPort,
122 false /* isChrome */);
123
124 sender->addSession(
125 senderUFrag,
126 senderPassword,
127 receiverUFrag,
128 receiverPassword);
129
130 sockaddr_in addr;
131 memset(&addr, 0, sizeof(addr));
132 addr.sin_family = AF_INET;
133 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
134 addr.sin_port = htons(senderPort);
135
136 sockaddr_storage senderAddr;
137 memcpy(&senderAddr, &addr, sizeof(addr));
138
139 auto receiver = std::make_shared<RTPSocketHandler>(
140 runLoop,
141 RTPSocketHandler::Mode::CONTROLLEE,
142 AF_INET,
143 receiverPort,
144 false /* isChrome */);
145
146 receiver->addSession(
147 receiverUFrag,
148 receiverPassword,
149 senderUFrag,
150 senderPassword,
151 senderAddr);
152
153 sender->run();
154 receiver->run();
155
156 receiver->kick();
157#endif
158
159 runLoop->run();
160
161 return 0;
162}