diff options
author | 2024-07-12 09:39:47 +0000 | |
---|---|---|
committer | 2024-07-12 09:39:47 +0000 | |
commit | cde2fb6244a791b3c5b746112e3a8be3a79f39a4 (patch) | |
tree | 6079d6fb66d90ffbe8c1623525bb86829c162459 /vendor/codeberg.org/gruf/go-ffmpreg/util/funcs.go | |
parent | [chore] Add interaction policy gtsmodels (#3075) (diff) | |
download | gotosocial-cde2fb6244a791b3c5b746112e3a8be3a79f39a4.tar.xz |
[feature] support processing of (many) more media types (#3090)
* initial work replacing our media decoding / encoding pipeline with ffprobe + ffmpeg
* specify the video codec to use when generating static image from emoji
* update go-storage library (fixes incompatibility after updating go-iotools)
* maintain image aspect ratio when generating a thumbnail for it
* update readme to show go-ffmpreg
* fix a bunch of media tests, move filesize checking to callers of media manager for more flexibility
* remove extra debug from error message
* fix up incorrect function signatures
* update PutFile to just use regular file copy, as changes are file is on separate partition
* fix remaining tests, remove some unneeded tests now we're working with ffmpeg/ffprobe
* update more tests, add more code comments
* add utilities to generate processed emoji / media outputs
* fix remaining tests
* add test for opus media file, add license header to utility cmds
* limit the number of concurrently available ffmpeg / ffprobe instances
* reduce number of instances
* further reduce number of instances
* fix envparsing test with configuration variables
* update docs and configuration with new media-{local,remote}-max-size variables
Diffstat (limited to 'vendor/codeberg.org/gruf/go-ffmpreg/util/funcs.go')
-rw-r--r-- | vendor/codeberg.org/gruf/go-ffmpreg/util/funcs.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-ffmpreg/util/funcs.go b/vendor/codeberg.org/gruf/go-ffmpreg/util/funcs.go new file mode 100644 index 000000000..4b584cf41 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-ffmpreg/util/funcs.go @@ -0,0 +1,65 @@ +package util + +import ( + "context" + "os" + "path" + "strconv" + "time" + + "github.com/tetratelabs/wazero/api" +) + +// Wasm_Tempnam wraps Go_Tempnam to fulfill wazero's api.GoModuleFunc, +// the argument definition is (i32, i32) and return definition is (i32). +// NOTE: the calling module MUST have access to exported malloc / free. +func Wasm_Tempnam(ctx context.Context, mod api.Module, stack []uint64) { + dirptr := api.DecodeU32(stack[0]) + pfxptr := api.DecodeU32(stack[1]) + dir := readString(ctx, mod, dirptr, 0) + pfx := readString(ctx, mod, pfxptr, 0) + tmpstr := Go_Tempnam(dir, pfx) + tmpptr := writeString(ctx, mod, tmpstr) + stack[0] = api.EncodeU32(tmpptr) +} + +// Go_Tempname is functionally similar to C's tempnam. +func Go_Tempnam(dir, prefix string) string { + now := time.Now().Unix() + prefix = path.Join(dir, prefix) + for i := 0; i < 1000; i++ { + n := murmur2(uint32(now + int64(i))) + name := prefix + strconv.FormatUint(uint64(n), 10) + _, err := os.Stat(name) + if err == nil { + continue + } else if os.IsNotExist(err) { + return name + } else { + panic(err) + } + } + panic("too many attempts") +} + +// murmur2 is a simple uint32 murmur2 hash +// impl with fixed seed and input size. +func murmur2(k uint32) (h uint32) { + const ( + // seed ^ bitlen + s = uint32(2147483647) ^ 8 + + M = 0x5bd1e995 + R = 24 + ) + h = s + k *= M + k ^= k >> R + k *= M + h *= M + h ^= k + h ^= h >> 13 + h *= M + h ^= h >> 15 + return +} |