Live video on the AT Protocol
79
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #378 from streamplace/eli/no-thumbnail-stall

media: fix stalling thumbnail

authored by

Eli Mallon and committed by
GitHub
5231d38c e25f01e5

+24 -6
+3 -3
pkg/media/thumbnail.go
··· 19 19 var encoder string 20 20 switch format { 21 21 case "jpeg": 22 - encoder = "jpegenc snapshot=true" 22 + encoder = "jpegenc" 23 23 case "png": 24 24 encoder = "pngenc snapshot=true" 25 25 default: 26 - log.Error(ctx, "media.Thumbnail: expected jpeg or png as format and recieved %s", format) 26 + log.Error(ctx, "media.Thumbnail: expected jpeg or png as format and received %s", format) 27 27 encoder = "pngenc snapshot=true" 28 28 } 29 29 30 30 pipelineSlice := []string{ 31 - "appsrc name=appsrc ! qtdemux name=demux ! decodebin ! videoconvert ! videoscale ! videorate ! capsfilter name=capsfilter caps=video/x-raw,width=[1,1280],height=[1,720],pixel-aspect-ratio=1/1,framerate=1/999999 ! queue ! ", 31 + "appsrc name=appsrc ! qtdemux name=demux ! decodebin ! videoconvert ! videoscale ! videorate ! capsfilter name=capsfilter caps=video/x-raw,width=[1,1280],height=[1,720],pixel-aspect-ratio=1/1,framerate=1/999999 ! ", 32 32 encoder, 33 33 " ! appsink name=appsink", 34 34 }
+21 -3
pkg/media/thumbnail_test.go
··· 36 36 if thumbnail.Len() == 0 { 37 37 return fmt.Errorf("thumbnail buffer is empty") 38 38 } 39 - require.Equal(t, thumbnail.Len(), 1418910) 39 + require.Equal(t, 1418910, thumbnail.Len()) 40 40 return nil 41 41 }) 42 42 g.Go(func() error { ··· 49 49 if thumbnail.Len() == 0 { 50 50 return fmt.Errorf("thumbnail buffer is empty") 51 51 } 52 - require.Equal(t, thumbnail.Len(), 140969) 52 + require.Equal(t, 140969, thumbnail.Len()) 53 53 return nil 54 54 }) 55 55 } ··· 61 61 62 62 // This segment once caused a segfault in gst-libav. 63 63 // It doesn't gotta work but it does gotta not crash. 64 - func TestKryptoniteThumbnail(t *testing.T) { 64 + func TestThumbnailKryptonite(t *testing.T) { 65 65 withNoGSTLeaks(t, func() { 66 66 inputFile, err := os.Open(remote.RemoteFixture("46c876d5e6c4124275b8856431833adaad31cb5246caca8ded9dc4d37de400a4/kryptonite-screenshot.mp4")) 67 67 require.NoError(t, err) ··· 75 75 require.Equal(t, 561486, thumbnail.Len()) 76 76 }) 77 77 } 78 + 79 + // This segment once caused the jpeg encoder to stall. 80 + // So now we have snapshot=false. 81 + func TestThumbnailStall(t *testing.T) { 82 + withNoGSTLeaks(t, func() { 83 + inputFile, err := os.Open(remote.RemoteFixture("aef704b702d24de7cf2ae453f4def763f3b39f4f353c8a1602f59cb995aafb53/broken-thumbnail.mp4")) 84 + require.NoError(t, err) 85 + defer inputFile.Close() 86 + bs, err := io.ReadAll(inputFile) 87 + require.NoError(t, err) 88 + thumbnail := bytes.Buffer{} 89 + err = Thumbnail(context.Background(), bytes.NewReader(bs), &thumbnail, "jpeg") 90 + require.NoError(t, err) 91 + // This is inconsistent. Which is concerning. 92 + require.Greater(t, thumbnail.Len(), 22000) 93 + require.Less(t, thumbnail.Len(), 25000) 94 + }) 95 + }