66 lines
1.4 KiB
Go
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()
|
|
}
|