Commit graph

98 commits

Author SHA1 Message Date
sergystepanov
cbabe69f30
Track connected user count of workers. (#328)
If a worker (game) is shared, then without tracking players it's impossible to tell when it becomes available for a new game which leads to emulator share and crashes.
2021-07-05 19:11:12 +03:00
Sergey Stepanov
fffe4813c4
Use OS aware file path concat with ROMs 2021-06-26 22:32:23 +03:00
giongto35
bc6027bf2b
Fix override env flag (#316) 2021-05-23 23:52:59 +08:00
Sergey Stepanov
ae5260fb47
Handle recover in VPX tests 2021-05-07 13:09:47 +03:00
sergystepanov
3e2a650b14
Fix the main save file path
Broken file check by just room name without the .dat extension always fails.
2021-04-22 20:09:24 +03:00
Sergey Stepanov
a7d8e53dac
Add video encoder tests 2021-04-17 12:55:54 +03:00
Sergey Stepanov
efd8679de3
Fix some mistakes 2021-04-14 11:37:43 +03:00
sergystepanov
602b9ea47c
Make executables ready for static linking (#307)
* Disable CGO (C libs) for coordinator

Needed for static linking.

* Fix "error strings should not be capitalized (ST1005)"

* Fix SA1015

Using time.Tick leaks the underlying ticker, consider using it only in endless functions, tests and the main package, and use time.NewTicker here (SA1015)

* Fix SA9004

Only the first constant in this group has an explicit type (SA9004).

* Remove unused code in the webrtc package

* Fix S1000

Should use a simple channel send/receive instead of select with a single case (S1000).

* Force dir creation/check for core downloader

* Update Makefile release script

* Disable ASLR for worker builds

* Remove WORKER_BUILD_PARAMS flag from the CI

* Don't force recompilation in release

* Add Debian packages installer script

* Build worker app without libopusfile

* Test worker app without libopusfile

* Add opus wrapper without opusfile

* Make install.sh executable

* Add opus lib in Win builds

* Make insecure HTTPS requests when downloading libs

* Add ca-certificates for Docker build stage

go mod download works only with SSL certificates installed.

* Move libx264 wrapper into the repo

That way we can get rid of a lot of not needed external Go dependencies.

* Update the dependencies
2021-04-06 18:16:52 +03:00
sergystepanov
d778a7e084
Allow to disable default Pion interceptors (#306)
For performance reasons.
2021-03-30 21:57:46 +03:00
sergystepanov
cbab5a1c71
Add deprecation note for libx264 < v160 (#301)
Deprecation due to libx264 version below v160 shouldn't work properly, and it's hard to support both v155, v160 in Golang.
2021-03-26 18:51:10 +03:00
sergystepanov
c7e67d5c3e
Use just one video/audio RTP codec (#298)
Negate exact matches with multiple video codecs when a negotiated list of codecs will be stripped of partially matched ones.
As an example, if we want to use the h264 codec along with vp8 then in some browsers we'll have the exact match on vp8 and some partial matches on h264 (different browsers have different SDP Fmtp) which leads to the forced use of vp8 when the app is streaming h264.
As a workaround, we should add only one codec (vp8 or h264) into the list.
2021-03-19 17:25:48 +03:00
sergystepanov
ccf082e46b
Set controller types explicitly (#295) 2021-03-17 18:27:13 +03:00
sergystepanov
a779353569
Reduce coordinator dependencies tree (#292)
* Reduce coordinator dependencies tree

* Parallelize build/check

* Update dependencies
2021-03-15 13:08:15 +03:00
sergystepanov
d5780acc75
Fix Pion WebRTC codecs (#289)
Since Pion's webrtc v3.0.13 and this fix if both peers have some fmtp set then codecs should match exactly. By default Pion defines a list of supported codecs with fmtp set but different browsers set their own fmtp values by default as well therefore they may not match.
To fix this we can define our own list of codecs on the server with empty fmtp so it will match any client codecs.

See: e5c8c659ca/rtpcodec.go (L99)
2021-03-08 17:22:43 +03:00
sergystepanov
f4c3a8cfef
Add new YUV converter with avg color calc (#287)
Add new YUV converter with 2x2 pixel matrix YUV color estimation.

The new YUV color converter, as opposed to the original one, uses more precise color calculations based on four neighboring pixels' average color values which helps a great deal with image aliasing / shimmering artifacts.
By default, it runs in the multithreaded mode with the game frames sliced between 2*(CPU cores) goroutines.
In case if this estimation mode doesn't work as expected it is possible to switch back to the original mode.

The default encoder is switched to x264 since it's faster now.
2021-03-07 18:17:52 +03:00
sergystepanov
fa28197390
Refactor and update VPX codec (#285)
* Refactor and update VPX codec

* Add VPX codec options support

* Add generic video encoding pipe

* Tweak in/out channels for the pipe

* Update YUV encoder

* Clean VP8 encoder
2021-02-27 18:09:55 +03:00
sergystepanov
4c883cf8e4
Fix x264 build trash (#282)
* Check x264 lib version with some conditional hacks for versions < 159
2021-02-21 21:41:10 +03:00
Sergey Stepanov
98ca6e7ace
Skip normal ErrServerClosed errors 2021-02-21 16:13:29 +03:00
Sergey Stepanov
0f54e0fb15
Fix copy-by-value of sync.Lock in the monitoring server struct 2021-02-21 15:52:01 +03:00
sergystepanov
bd701f10fc
Use modified x264 lib (#275)
* Use modified x264 lib

* Add x264 system lib

* Set x264 version 155 for Debian (Buster)

* Add h264 config params

* Set vp8 codec
2021-02-21 13:51:44 +03:00
sergystepanov
92d0dd76f4
Refactor input for safe concurrency (#278)
* Extract input stuff

* Move d-pad option into the main screen

* Add mutex lock on the whole input user sessions struct
2021-02-19 20:33:58 +03:00
giongto35
5de666d4af
Fix small bug, to not response on Empty Packet 2021-02-16 22:30:43 +08:00
sergystepanov
7bc9661b3d
Add experimental core's SRAM save/load (#273)
* Add experimental core's SRAM save/load

* Clean room.go

* Update Save RAM states

* Update dependencies

* Extract emulator states into a separate module

* Google Cloud saves don't support save RAM persistence, but save state (.dat) files only.

* Add emulator storage path into the configuration file

* Verify offline storage path
2021-02-06 01:12:24 +03:00
Sergey Stepanov
69bc3cbb6f
Use new OPUS buffer every audio frame for less garbage 2021-01-21 19:25:19 +03:00
sergystepanov
76b7cafb71
Refactor OPUS encoder for quality and speed (#262)
* Refactor OPUS encoder for quality and speed.

Use OPUS low delay mode (https://www.opus-codec.org/docs/opus_api-1.1.3/group__opus__ctlvalues.html#ga592232fb39db60c1369989c5c5d19a07)

* Slightly tweak linear resample function and disable it on 48kHz input

* Rewrite OPUS encoder as a struct with some internal buffer

* Use OPUS 192Kbps preset by default

* Add encoder callback function on a full buffer

* Reuse OPUS output buffer

* Add write limiter for samples
2021-01-18 23:20:50 +03:00
Sergey Stepanov
f05e149b0e
Remove unnecessary logging 2021-01-13 20:48:12 +03:00
Sergey Stepanov
949f713060
Remove unnecessary rotation 2021-01-13 20:44:32 +03:00
Sergey Stepanov
9df10f5d12
Add explicit file close when reading game size 2021-01-12 04:32:51 +03:00
Sergey Stepanov
328236ed53
Add explicit file close when reading game size 2021-01-12 03:25:51 +03:00
Sergey Stepanov
70170a6c87
Use embedded mutex for emulator structs 2021-01-12 02:03:40 +03:00
Sergey Stepanov
fa46267e60
Fix wording 2021-01-11 02:41:59 +03:00
Sergey Stepanov
d141898794
Remove old game save files name separator 2021-01-11 02:35:01 +03:00
Sergey Stepanov
646e0d6039
Change wording for worker rooms and sessions inside 2021-01-11 02:31:31 +03:00
Sergey Stepanov
7984534fa7
Remove unused in workers ws upgrade function 2021-01-11 02:11:10 +03:00
Sergey Stepanov
6b8cad6ef8
Clean room run check condition 2021-01-11 02:09:49 +03:00
sergystepanov
924d6ade67
Fix Docker run for bridged Docker network in Windows, macOS (#259)
* Add port and IP config and env params for bridged Docker network in Windows, macOS

- CLOUD_GAME_WEBRTC_ICEIPMAP -- replaces IP of any ICE candidates on the server
- CLOUD_GAME_WEBRTC_ICEPORTS_MIN/MAX -- limits WebRTC random port range on the server
2021-01-08 22:43:15 +03:00
sergystepanov
a77985f44a
Add fallback repo for not found cores (#258)
* Add fallback repo for not found cores
2021-01-07 13:38:53 +03:00
sergystepanov
53d15728fb
Use an interceptor for changing video timestamps (#255) 2021-01-06 14:09:11 +03:00
Sergey Stepanov
8bed364bb3
Remove useless lock in the custom track sample struct 2021-01-05 00:22:37 +03:00
Sergey Stepanov
a3d08637e0
Show server modules info properly 2021-01-05 00:14:59 +03:00
sergystepanov
62d8240e7c
Migrate to pion/webrtc v3 (#254)
* Add initial pion/webrtc v3 migration

* Use custom timestamps when sending video packets

* Update dependencies
2021-01-04 21:09:03 +03:00
sergystepanov
980a97a526
Handle no config situation for workers (#253)
(experimental feature)

Before a worker can start, it should have a configuration file. In case if such a file is not found it may request configuration from the coordinator to which it connected.

Added example logic if a worker is needed to be blocked until a successful packet exchange with a coordinator is being made.

* Add error return for config loader

* Add config loaded flag to worker

* Add zone flag

* Add a custom mutex lock with timout

* Refactor worker runtime

* Refactor internal api

* Extract monitoring server config

* Extract worker HTTP(S) server

* Add generic sub-server interface

* Add internal coordinator API

* Add internal routes and handlers to worker

* Add internal worker API

* Refactor worker run

* Migrate serverId call to new API

* Add packet handler to cws

* Extract handlers for internal worker routes in coordinator

* Pass worker to the worker internal heandlers

* Cleanup worker handlers in coordinator

* Add closeRoom packet handler to the API

* Add GetRoom packet handler to the API

* Add RegisterRoom packet handler to the API

* Add IceCandidate packet handler to the API (internal and browser)

* Add Heartbeat packet handler to the API (internal and browser)

* Rename worker routes init function

* Extract worker/coordinator internal ws handlers

* Update timed locker

* Allow sequential timed locks

* Add config request from workers

* Add nil check for the route registration functions
2021-01-03 21:23:55 +03:00
Sergey Stepanov
6cee6061b6
Handle more core diff cases 2021-01-01 22:04:19 +03:00
sergystepanov
1fcf34ee02
Add new Libretro core manager module (#249)
* Add initial external configuration files support.

These external configuration files allow changing app params at the runtime without recompilation.

* Find config files with specified directory in the tests

* Add aspect ratio recalculation config

* Clean code

* Add new configuration files into the Docker container image

* Add shared core and config paths into the Libretro cores config

* Split ROM <-> Emulator mapping between workers and coordinators

* Extract coordinator config

* Add shared worker/coordinator server config

* Add explicit embedded shared worker/coordinator struct for auto-config reflection fill

* Remove default stun/turn servers from the config

* Extract and add new ice servers config structures

* Update coordinator config params

* Add auto emulation lib loader based on the runtime OS/arch

* Update configuration structures

* Remove shared config embedding

* Add missing network config params

* Add game library external config

* Remove unused config parameters

* Add WebRTC encoder external options

* Add user dir for config search

* Update config loader

* Update config

* Add generic downloader with Grab lib implementation

* Add a simple file downloader backed by the grab lib

* Add initial Libretro core repos abstractions

* Expose compression info for Libretro cores repository records

* Add pipe-based abstract file downloader

* Refactor downloader

* Refactor Libretro repos

* Add worker coresync stubs

* Add multiprocess-safe HTTP-based core manager implementation

* Remove Libretro cores from the repo

* Keep custom N64 cores in te repo for now

* Add Libretro cores repo select in the config

* Fix http manager repo switch

* Cleanup code

* Add greedy Libretro lib loader

* Don't crash when arch map is not set

* Disable dynamic recompiler for pcsx core by default since it's could cause a crash

* Use global Libretro dynalib handler

* Shorten the default Libretro cores store path

* Update zip extractor implementation

* Remove explicit fig lib field markings

* Add config note to the README file

* Add GitHub repo backend for the core downloader

* Fix GitHub repo param list in the manager factory

* Add env variables reader with CLOUD_GAME prefix

* Re-optimize ice server info struct custom marshaler
2020-12-31 13:24:27 +03:00
sergystepanov
bd6e146e64
Fix errors/misuse with OpenGL-based core API (#237)
* Follow Go standard for naming constants

* Use reformatted pixFormats for Libretro cores

* Use OpenGL 2.1 Core profile bindings for render instead 4.1

* Cleanup the code

* SDL attributes should be set before the sdl.Init call

* Use simple vertical frame flip function instead imaging lib with OpenGL renderer

* Use the separate control flow for the macOS OpenGL context handling

* Add OpenGL pixel type/format switch based on cores callback

* Use unified log instead of fmt

* Clean code

* Remove unnecessary SDL init flag

* Printout errors with SDL / OpenGL functions

* Add CGO Libretro logging output

* Use main thread lock for windows and OpenGL context

* Remove Darwin OS switch

* Add extended OpenGL version info print

* Update Libretro cores info print

* Add game library module (#232)

* Add game library

* Add missing local game lib files

* Add missing return statement

* Use v2 suffix

* Bump the dependencies

* Update Libretro modules to support headless test runners

* Port old savestates tests as example for Libretro cores runner testing

* Add n64 core example game and a test

* Update room tests for various games

* Add frame dump support for CI builds

* Add frame rendering to image output for core testing

* Update ROM frame exporter in tests

* Disable Docker image publishing

* Add frame rendering output for non-gl cores for CI

* Add auto GL context override for headless, gpu-less machines (e.g. Github CI Xeon)

* Add Windows CI headless cores frame render config

* Add missing Mesa OpenGL drivers to Ubuntu CI

* Add mupen n64 core download into CI tests

* Add Linux, macOS, Windows core frame render tests into CI

* Remove unnecessary var

* Add some comments

* Revert Y flip

* Move OpenGL into a separate package

* Add SDL package

* Update modules
2020-11-04 18:59:12 +08:00
sergystepanov
50762e95c7
Remove excessive Libretro pixel format logging (#244) 2020-11-02 00:51:53 +08:00
sergystepanov
8c55c6e142
Fix game sharing (#240)
Call save on the frontend and properly handle cloud save on the backend
2020-10-19 21:26:32 +08:00
sergystepanov
83efc733a8
Add game library module (#232)
* Add game library

* Add missing local game lib files

* Add missing return statement

* Use v2 suffix

* Bump the dependencies
2020-10-10 21:42:06 +08:00
sergystepanov
a42aebec88
Migrate to v2 suffix (#231) 2020-10-04 23:21:03 +08:00
sergystepanov
453087ed28
Remove duplicate worker addresses during ping check (client, server) (#234) 2020-10-03 23:53:46 +08:00