Commit graph

156 commits

Author SHA1 Message Date
sergystepanov
2b81c3fb87
Some optimizations (#387)
- Fixed broken image cache for the first stage RGBA frames. It was not a thread-safe one, which led to image tearing (parts of old images in multiple consecutive frames).
- 180 flip function for the OpenGL coordinate system has been moved into the rotation part.
- Optimized YUV converter.
- Optimized color converters:
  - Use __restrict pointers.
  - Draw image pixels with the faster bitwise operators and pointer arithmetic as 32/16bit LE numbers (may break on ARM devices like RPi). 
  - Pass uints for less num conversions.
  - Much faster XRGB -> RGBA conversion with Go's stdlib 32bit flip.
- Wrapped RGBA images into a custom struct in order to bypass opacity tests for the standard Go png functions, which needed for the PNG file export. Before that we set RGBx opacity byte explicitly during the pixel format conversions (much slower).
- Made Libretro core shutdown more deterministic. When we run a C core separately from the main Go process we have to make sure that the C core is not doing anything in its syscall while we stopping the emulator. Basically, a blocking call may be suspended on the Go's side while the other goroutines have no knowledge of that.
- Less info level logs.
- Added recording user label.
- Enabled RTCP sender reports by default, which may help with A/V sync.
- Check onMessage webrtc handler if it's set. May crash the program if not.
- Fixed some make dirs permissions.
- Enabled console colors (since MS has finally fixed their bloody Terminal).
- Disable log in some tests.
- Updated deps.
2023-01-31 22:22:03 +03:00
Sergey Stepanov
c641065564
Enable RTCP sender reports by default 2023-01-15 01:07:53 +03:00
Sergey Stepanov
2df0135604
Merge remote-tracking branch 'origin/master' 2023-01-15 01:07:04 +03:00
Sergey Stepanov
cd90bfe58d
Enable RTCP sender reports by default 2023-01-15 01:06:50 +03:00
Sergey Stepanov
d12218e9db
Enable RTCP sender reports by default 2023-01-15 01:05:08 +03:00
Sergey Stepanov
07bc3d3a39
Remove broken image cache for now 2023-01-11 17:08:55 +03:00
sergystepanov
3bd959b4ef
Refactored v3 (#350)
This PR contains refactored code.

**Changelog**
- Added new net code (the communication architecture was left intact).
- All network client IDs now have custom type `network.Uid` backed by github.com/rs/xid lib.
  ```
  The string representation of a UUID takes 32 bytes, and the new type will take just 16.
  Because of Golang JSON serialization problems with omitting zero-length empty slices (it can't) 
  and the need to use UID values as map keys (maps don't support slices as keys), 
  IDs are stored as strings (for now).
  ```
- A whole new WebSocket client/server implementation was added, as well as a new communication layer with synchronous and async call handlers.
  - WebSocket connections now support dedicated Ping/Pong frames as opposed to original ping text messages.
  - Used Gorilla WebSocket library doesn't allow concurrent (simultaneous) reads and writes, so this part was handled via send channel synchronization.
- New API structures can be found in the `pkg/api` folder.
- New communication protocol can be found in the `pkg/com/*` folder.
- Updated communication protocol is based on JSON-encoded messaging through WebSocket and has the following structure:
  ```
  Packet
    [id] string — a globally unique identification tag for the packet to track it trough a chain of requests.
    t uint8 — contains packet type information (i.e. INIT_PACKET, SDP_OFFER_PACKET, ...).
    [p] any — contains packet data (any type).

  Each packet is a text message in JSON-serialized form (WebSocket control frames obviously not).
  ```
  ```
  The main principle of this protocol and the duplex data exchange is:
  the one who initializes connection is called a client, and 
  the one who is being connected to is called a server. 
  With the current architecture, the coordinator is the server, the user browsers and workers are the clients.

            ____           ____
           ↓    ↑         ↑    ↓
     browser ⟶ coordinator ⟵ worker
       (c)          (s)         (c)

  One of the most crucial performance vise parts of these interactions is that 
  all the server-initiated calls to clients should be asynchronous!
  ```
  - In order to track synchronous calls (packets) with an asynchronous protocol, such as WebSocket, each packet may have an `id` that should be copied in all subsequent requests/responses.
  - The old `sessionID` param was replaced by `id` that should be stored inside the `p` (payload) part of the packet.
- It is possible to skip the default ping check for all connected workers on every user connection and just pick the first available with the new roundRobin param in the coordinator config file `coordinator.roundRobin: true/false`.
- Added a dedicated package for the system API (pkg/api/*).
- Added structured logging system (zerolog) for better logging and cloud services integration.
- Added a visual representation of the network message exchange in logs:
  ```
  ...
  01:00:01.1078 3f98 INF w → c Handshake ws://localhost:8000/wso
  01:00:01.1138  994 INF c ← w Handshake localhost:8000
  01:00:01.1148  994 INF c ← w Connect cid=cep.hrg
  01:00:01.1158  994 DBG c     connection id has been changed to cepl7obdrc3jv66kp2ug cid=cep.hrg
  01:00:01.1158 3f98 INF w → c Connect cid=cep.2ug
  01:00:01.1158  994 INF c     New worker / addr: localhost, ...
  01:00:01.1158 3f98 INF w     Connected to the coordinator localhost:8000 cid=cep.2ug
  01:00:02.5834  994 INF c ← u Handshake localhost:8000
  01:00:02.6175  994 INF c ← u Connect cid=cep.hs0
  01:00:02.6209  994 INF c     Search available workers cid=cep.hs0
  01:00:02.6214  994 INF c     Found next free worker cid=cep.hs0
  01:00:02.6220  994 INF c → u InitSession cid=cep.hs0
  01:00:02.6527  994 INF c ← u WebrtcInit cid=cep.hs0
  01:00:02.6527  994 INF c → w ᵇWebrtcInit cid=cep.hrg
  01:00:02.6537 3f98 INF w ← c WebrtcInit cid=cep.2ug
  01:00:02.6537 3f98 INF w     WebRTC start cid=cep.2ug
  ...
  ```
- Replaced a monstrous Prometheus metrics lib.
- Removed spflag dependency.
- Added new `version` config file param/constant for compatibility reasons.
- Bump the minimum required version for Go to 1.18 due to use of generics.
- Opus encoder now is cached and the default config is 96Kbps, complexity 5 (was 196Kbps, 8).
- Changed the default x264 quality parameters to `crf 23 / superfast / baseline` instead of `crf 17 / veryfast / main`.
- Added a separate WebRTC logging config param `webrtc.logLevel`.
- Worker now allocates much less memory.
- Optimized and fixed RGB to YUV converter.
- `--v=5` logging cmd flag was removed and replaced with the `debug` config parameter.


**Breaking changes (migration to v3)**
- Coordinator server API changes, see web/js/api/api.js.
- Coordinator client event API changes:
  - c `GAME_PLAYER_IDX_CHANGE` (string) -> `GAME_PLAYER_IDX` (number)
  - c `GAME_PLAYER_IDX` -> `GAME_PLAYER_IDX_SET`
  - c `MEDIA_STREAM_INITIALIZED` -> `WEBRTC_NEW_CONNECTION`
  - c `MEDIA_STREAM_SDP_AVAILABLE` -> `WEBRTC_SDP_OFFER`
  - c `MEDIA_STREAM_CANDIDATE_ADD` -> `WEBRTC_ICE_CANDIDATE_RECEIVED`
  - c `MEDIA_STREAM_CANDIDATE_FLUSH` -> `WEBRTC_ICE_CANDIDATES_FLUSH`
  - x `MEDIA_STREAM_READY` -> **removed**
  - c `CONNECTION_READY` -> `WEBRTC_CONNECTION_READY`
  - c `CONNECTION_CLOSED` -> `WEBRTC_CONNECTION_CLOSED`
  - c `GET_SERVER_LIST` -> `WORKER_LIST_FETCHED`
  - x `KEY_STATE_UPDATED` -> **removed**
  - n `WEBRTC_ICE_CANDIDATE_FOUND`
  - n `WEBRTC_SDP_ANSWER`
  - n `MESSAGE`
- `rtcp` module renamed to `webrtc`.
- Controller state equals Libretro controller state (changed order of bits), see: web/js/input/input.js.
- Added new `coordintaor.selector` config param that changes the selection algorithm for workers. By default it will select any free worker. Set this param to `ping` for the old behavior.
- Changed the name of the `webrtc.iceServers.url` config param to `webrtc.iceServers.urls`.
2023-01-09 23:20:22 +03:00
Sergey Stepanov
14b589477f
Disable save/load for libCo until it's fixed 2022-12-10 01:23:57 +03:00
Sergey Stepanov
e3b2175420
Update libretro.h 2022-12-01 22:54:04 +03:00
sergystepanov
6b6c391f81
Faster image processing (#382)
* Calculate frame duration in ns

* Reuse single OpenGL byte buffer

* Add threaded a/v processing

* Check min threads in opts

* Return missing audio sample
2022-11-24 13:44:00 +03:00
sergystepanov
d79e772471
Use custom OpenGL bindings (#378) 2022-08-18 22:18:25 +03:00
sergystepanov
8e49b05226
Add ICE config from the CLOUD_GAME_WEBRTC_ICESERVERS_0_ env vars (#377) 2022-08-17 23:06:27 +03:00
sergystepanov
54ee9a7af3
Savestate compression (#374)
Added the optional saveCompression configuration parameter which enables ZIP compression of the emulator states, reducing files sizes by the factor of 10x (most of these state files store zeroes).
2022-08-05 22:44:40 +03:00
sergystepanov
6da953ffc6
Add ARM64 MacOs mapping for core-auto-downloader (#376)
The auto-downloader had missing mapping for the darwin:arm64 os:arch mapping. Mupen64 (N64) is still missing in the official RetroArch repo https://buildbot.libretro.com/ and requires a manual build.
2022-08-02 15:03:23 +03:00
Sergey Stepanov
e214025bef
Disable excessive autosave logging 2022-07-26 12:28:02 +03:00
Valniae
1750d48b89
Timely auto save (#373)
Add autosave for the emulator states. Controlled with the autosaveSec param.
2022-07-26 12:25:36 +03:00
sergystepanov
e53cf45fa7
Main thread lock refactoring (#367)
Use slim main thread locking function for macOS instead of a lib.
2022-06-12 13:39:23 +03:00
Sergey Stepanov
af98bddb14
Remove emu mock leftovers 2022-06-10 01:22:13 +03:00
sergystepanov
b31d8a7029
Add new option for alt cores download (#368)
Add the new option for Libretro cores: `altRepo` true | false, which sets the second repo download config as primary.
That will add, for example, the option of using specific cores from a custom repo when something will be broken in the main repo.
2022-06-10 01:20:21 +03:00
Sergey Stepanov
0665c3e607
Remove heavy Google Cloud Storage lib 2022-04-11 09:22:06 +03:00
Sergey Stepanov
fac6cc4495
Generate xIds on the worker's side 2022-04-09 10:27:04 +03:00
Sergey Stepanov
c190177955
Show active workers in the debug mode 2022-04-08 20:11:28 +03:00
Sergey Stepanov
76c66339aa
Allow only available workers 2022-04-08 18:39:24 +03:00
sergystepanov
9ad3c98a7d
Rework worker selection feature (#365)
We add a new option for manual worker or machine (server with multiple workers) select, depending on the new coordinator option `coordinator.debug` which by default allows machine selection.
2022-04-07 21:04:30 +03:00
Sergey Stepanov
2a283e24db
Remove DebugHost and Environment config params 2021-12-30 11:06:35 +03:00
Sergey Stepanov
02a061a580
Extract audio buffer and resampler 2021-12-25 21:50:33 +03:00
Sergey Stepanov
2f841f8946
Add manual config mangling for worker 2021-12-21 23:23:15 +03:00
Sergey Stepanov
f688f3c5f4
Add optional lite ICE agent config param 2021-12-20 22:28:54 +03:00
Sergey Stepanov
589cda91f4
Add optional DTLS role config param 2021-12-20 22:18:43 +03:00
Sergey Stepanov
ad822a624d
Add optional Origin handling for Websockets 2021-12-15 17:58:49 +03:00
sergystepanov
1271aa8438
Game recording support (#356)
This feature adds the ability to record game sessions as raw a/v media files.
2021-12-04 14:20:38 +03:00
Sergey Stepanov
17bec2e987
Remove unused ReTime Pion interceptor 2021-11-22 20:03:35 +03:00
Sergey Stepanov
339750a978
Calculate emulation frames duration directly 2021-11-22 20:01:46 +03:00
sergystepanov
9acbecb813
WebRTC single port support (#354)
Add the new `webrtc.singlePort` config option which forces the WebRTC server to listen on this port only.
2021-11-02 17:05:31 +03:00
Sergey Stepanov
a73c0e8c5f
Update re-time interceptor.
Update re-time video frame interceptor to the latest pion WebRTC changes and keep it shared between all RTC peer connections.
2021-10-14 19:47:08 +03:00
Masaya Watanabe
c27e1fe2ab
Don't ignore cloud save download errors (#352) 2021-10-08 19:47:30 +03:00
Sergey Stepanov
be52ee18c5
Use default WebRTC codecs 2021-09-28 13:28:44 +03:00
Sergey Stepanov
891e397104
Update Buildbot arm file ext 2021-09-27 21:49:52 +03:00
Sergey Stepanov
03107ba902
Use unsigned return value for the Libretro frame rotation 2021-09-23 14:42:16 +03:00
sergystepanov
69ff8ae896
Update cloud data storage functionality (#349)
Add Oracle Data Storage support for cloud saves.
2021-09-20 10:17:59 +03:00
sergystepanov
47a9d70b74
Add the ability to set emulator ROM folder (#348)
Emulators now can load games with the same file extensions if you either place ROMs into the folder named as the emulator in the config file (libretro.core.list value) or any folder as you specify in the `libretro.core.list.{emulator}.folder` config param.
2021-08-30 19:50:35 +03:00
Sergey Stepanov
ed33460f38
Don't crash emulator on no core config 2021-08-26 15:22:01 +03:00
Sergey Stepanov
904b0ae1bb
Set coordinator server address to :http for cloudretro 2021-08-26 14:39:17 +03:00
Sergey Stepanov
25483b27b3
Enable http-01 challenge 2021-08-26 11:58:26 +03:00
Sergey Stepanov
5f941bf593
Use HTTPS redirect with HTTPS domain 2021-08-26 11:20:12 +03:00
Sergey Stepanov
048617373a
Use empty auto cert http handler 2021-08-25 23:13:27 +03:00
Sergey Stepanov
cd41759265
Try without auto cert wrapper redirect 2021-08-25 22:31:37 +03:00
sergystepanov
fb8ee791df
Update the prod deployment script (#341)
Test new deployment workflow.
2021-08-24 21:54:32 +03:00
Sergey Stepanov
c7b259f63d
Use zone prefix in the autocert whitelist 2021-08-16 23:34:41 +03:00
Sergey Stepanov
c865e83143
Expose a multi process mutex lock file config 2021-08-16 01:36:07 +03:00