Files
questshock/modding/hacked/editor/movies/CompressionTask.go
T

66 lines
1.4 KiB
Go

package movies
import (
"context"
"github.com/inkyblackness/hacked/ss1/content/movie"
)
type compressionTask struct {
width int
height int
input movie.Scene
ctx context.Context
ctxCancel context.CancelFunc
resultChan chan compressionResult
}
type compressionResult interface{}
type compressionAborted struct{}
type compressionFailed struct{ err error }
type compressionFinished struct{ scene movie.HighResScene }
func newCompressionTask(scene movie.Scene, width, height int) *compressionTask {
task := &compressionTask{
width: width,
height: height,
input: scene,
resultChan: make(chan compressionResult),
}
task.ctx, task.ctxCancel = context.WithCancel(context.Background())
return task
}
func (task *compressionTask) run() {
defer close(task.resultChan)
highResScene, err := movie.HighResSceneFrom(task.ctx, task.input, task.width, task.height)
switch {
case task.ctx.Err() != nil:
task.resultChan <- compressionAborted{}
case err != nil:
task.resultChan <- compressionFailed{err: err}
default:
task.resultChan <- compressionFinished{scene: highResScene}
}
}
func (task *compressionTask) update() compressionResult {
select {
case result, ok := <-task.resultChan:
if ok {
return result
}
return compressionAborted{}
default:
return nil
}
}
func (task *compressionTask) cancel() {
task.ctxCancel()
}