mirror of
https://github.com/giongto35/cloud-game.git
synced 2026-01-23 10:35:44 +00:00
* 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
92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
// credit to https://github.com/poi5305/go-yuv2webRTC/blob/master/webrtc/webrtc.go
|
|
package util
|
|
|
|
import (
|
|
"image"
|
|
"log"
|
|
"os/user"
|
|
"unsafe"
|
|
|
|
"github.com/giongto35/cloud-game/v2/pkg/encoder"
|
|
)
|
|
|
|
// https://stackoverflow.com/questions/9465815/rgb-to-yuv420-algorithm-efficiency
|
|
|
|
/*
|
|
void rgba2yuv(void * destination, void * source, int width, int height, int stride) {
|
|
const int image_size = width * height;
|
|
unsigned char * rgba = source;
|
|
unsigned char * dst_y = destination;
|
|
unsigned char * dst_u = destination + image_size;
|
|
unsigned char * dst_v = destination + image_size + image_size / 4;
|
|
|
|
int i, x, y;
|
|
// Y plane
|
|
for (y = 0; y < height; ++y) {
|
|
for (x = 0; x < width; ++x) {
|
|
i = y * (width + stride) + x;
|
|
* dst_y++ = ((66 * rgba[4 * i] + 129 * rgba[4 * i + 1] + 25 * rgba[4 * i + 2]) >> 8) + 16;
|
|
}
|
|
}
|
|
|
|
// U plane
|
|
for (y = 0; y < height; y += 2) {
|
|
for (x = 0; x < width; x += 2) {
|
|
i = y * (width + stride) + x;
|
|
* dst_u++ = ((-38 * rgba[4 * i] + -74 * rgba[4 * i + 1] + 112 * rgba[4 * i + 2]) >> 8) + 128;
|
|
}
|
|
}
|
|
|
|
// V plane
|
|
for (y = 0; y < height; y += 2) {
|
|
for (x = 0; x < width; x += 2) {
|
|
i = y * (width + stride) + x;
|
|
* dst_v++ = ((112 * rgba[4 * i] + -94 * rgba[4 * i + 1] + -18 * rgba[4 * i + 2]) >> 8) + 128;
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
import "C"
|
|
|
|
// RgbaToYuv convert to yuv from rgba
|
|
func RgbaToYuv(rgba *image.RGBA) []byte {
|
|
w := rgba.Rect.Max.X
|
|
h := rgba.Rect.Max.Y
|
|
size := int(float32(w*h) * 1.5)
|
|
stride := rgba.Stride - w*4
|
|
yuv := make([]byte, size, size)
|
|
C.rgba2yuv(unsafe.Pointer(&yuv[0]), unsafe.Pointer(&rgba.Pix[0]), C.int(w), C.int(h), C.int(stride))
|
|
return yuv
|
|
}
|
|
|
|
// RgbaToYuvInplace convert to yuv from rgba inplace to yuv. Avoid reallocation
|
|
func RgbaToYuvInplace(rgba *image.RGBA, yuv []byte, width, height int) {
|
|
stride := rgba.Stride - width*4
|
|
C.rgba2yuv(unsafe.Pointer(&yuv[0]), unsafe.Pointer(&rgba.Pix[0]), C.int(width), C.int(height), C.int(stride))
|
|
}
|
|
|
|
var homeDir string
|
|
|
|
func init() {
|
|
u, err := user.Current()
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
homeDir = u.HomeDir
|
|
}
|
|
|
|
// GetSavePath returns save location of game based on roomID
|
|
func GetSavePath(roomID string) string {
|
|
return savePath(roomID)
|
|
}
|
|
|
|
func savePath(hash string) string {
|
|
return homeDir + "/.cr/save/" + hash + ".dat"
|
|
}
|
|
|
|
// GetVideoEncoder returns video encoder based on some qualification.
|
|
// Actually Android is only supporting VP8 but H264 has better encoding performance
|
|
// TODO: Better use useragent attribute from frontend
|
|
func GetVideoEncoder(isMobile bool) encoder.VideoCodec {
|
|
return encoder.VPX
|
|
}
|