Browse Source

Process animated images singlethreaded

DarthSim 4 years ago
parent
commit
73a5d794f3
2 changed files with 4 additions and 52 deletions
  1. 0 39
      panic_group.go
  2. 4 13
      process.go

+ 0 - 39
panic_group.go

@@ -1,39 +0,0 @@
-package main
-
-import "sync"
-
-type panicGroup struct {
-	wg      sync.WaitGroup
-	errOnce sync.Once
-	err     error
-}
-
-func (g *panicGroup) Wait() error {
-	g.wg.Wait()
-	return g.err
-}
-
-func (g *panicGroup) Go(f func() error) {
-	g.wg.Add(1)
-
-	go func() {
-		defer g.wg.Done()
-		defer func() {
-			if r := recover(); r != nil {
-				if err, ok := r.(error); ok {
-					g.errOnce.Do(func() {
-						g.err = err
-					})
-				} else {
-					panic(r)
-				}
-			}
-		}()
-
-		if err := f(); err != nil {
-			g.errOnce.Do(func() {
-				g.err = err
-			})
-		}
-	}()
-}

+ 4 - 13
process.go

@@ -542,13 +542,8 @@ func transformAnimated(ctx context.Context, img *vipsImage, data []byte, po *pro
 	po.Watermark.Enabled = false
 	po.Watermark.Enabled = false
 	defer func() { po.Watermark.Enabled = watermarkEnabled }()
 	defer func() { po.Watermark.Enabled = watermarkEnabled }()
 
 
-	var errg panicGroup
-
 	frames := make([]*vipsImage, framesCount)
 	frames := make([]*vipsImage, framesCount)
 	defer func() {
 	defer func() {
-		// Ensure all frames are processed before freeing
-		errg.Wait()
-
 		for _, frame := range frames {
 		for _, frame := range frames {
 			if frame != nil {
 			if frame != nil {
 				frame.Clear()
 				frame.Clear()
@@ -563,17 +558,13 @@ func transformAnimated(ctx context.Context, img *vipsImage, data []byte, po *pro
 			return err
 			return err
 		}
 		}
 
 
-		frame.CopyMemory()
-
 		frames[i] = frame
 		frames[i] = frame
 
 
-		errg.Go(func() error {
-			return transformImage(ctx, frame, nil, po, imgtype)
-		})
-	}
+		if err = transformImage(ctx, frame, nil, po, imgtype); err != nil {
+			return err
+		}
 
 
-	if err = errg.Wait(); err != nil {
-		return err
+		frame.CopyMemory()
 	}
 	}
 
 
 	checkTimeout(ctx)
 	checkTimeout(ctx)