diff options
author | 2024-08-08 17:12:13 +0000 | |
---|---|---|
committer | 2024-08-08 17:12:13 +0000 | |
commit | f77005128a391025c16fb65c47a4272ac003cbf1 (patch) | |
tree | ba73e2b475e3c567d47abee1bccca5a99184c02d /internal/media/processingmedia.go | |
parent | [feature] Add `db-postgres-connection-string` option (#3178) (diff) | |
download | gotosocial-f77005128a391025c16fb65c47a4272ac003cbf1.tar.xz |
[performance] move thumbnail generation to go code where possible (#3183)
* wrap thumbnailing code to handle generation natively where possible
* more code comments!
* add even more code comments!
* add code comments about blurhash generation
* maintain image rotation if contained in exif data
* move rotation before resizing
* ensure pix_fmt actually selected by ffprobe, check for alpha layer with gifs
* use linear instead of nearest-neighbour for resizing
* work with image "orientation" instead of "rotation". use default 75% quality for both webp and jpeg generation
* add header to new file
* use thumb extension when getting thumb mime type
* update test models and tests with new media processing
* add suggested code comments
* add note about thumbnail filter count reducing memory usage
Diffstat (limited to 'internal/media/processingmedia.go')
-rw-r--r-- | internal/media/processingmedia.go | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 1d286bda7..b89bbb41d 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -230,31 +230,26 @@ func (p *ProcessingMedia) store(ctx context.Context) error { p.media.FileMeta.Small.Size = (thumbWidth * thumbHeight) p.media.FileMeta.Small.Aspect = aspect - // Generate a thumbnail image from input image path. - thumbpath, err = ffmpegGenerateThumb(ctx, temppath, + // Determine if blurhash needs generating. + needBlurhash := (p.media.Blurhash == "") + var newBlurhash string + + // Generate thumbnail, and new blurhash if need from media. + thumbpath, newBlurhash, err = generateThumb(ctx, temppath, thumbWidth, thumbHeight, + result.orientation, + result.PixFmt(), + needBlurhash, ) if err != nil { return gtserror.Newf("error generating image thumb: %w", err) } - if p.media.Blurhash == "" { - // Generate blurhash (if not already) from thumbnail. - p.media.Blurhash, err = generateBlurhash(thumbpath) - if err != nil { - return gtserror.Newf("error generating thumb blurhash: %w", err) - } + if needBlurhash { + // Set newly determined blurhash. + p.media.Blurhash = newBlurhash } - - // Calculate final media attachment thumbnail path. - p.media.Thumbnail.Path = uris.StoragePathForAttachment( - p.media.AccountID, - string(TypeAttachment), - string(SizeSmall), - p.media.ID, - "webp", - ) } // Calculate final media attachment file path. @@ -279,6 +274,18 @@ func (p *ProcessingMedia) store(ctx context.Context) error { p.media.File.FileSize = int(filesz) if thumbpath != "" { + // Determine final thumbnail ext. + thumbExt := getExtension(thumbpath) + + // Calculate final media attachment thumbnail path. + p.media.Thumbnail.Path = uris.StoragePathForAttachment( + p.media.AccountID, + string(TypeAttachment), + string(SizeSmall), + p.media.ID, + thumbExt, + ) + // Copy thumbnail file into storage at path. thumbsz, err := p.mgr.state.Storage.PutFile(ctx, p.media.Thumbnail.Path, @@ -290,6 +297,18 @@ func (p *ProcessingMedia) store(ctx context.Context) error { // Set final determined thumbnail size. p.media.Thumbnail.FileSize = int(thumbsz) + + // Determine thumbnail content-type from thumb ext. + p.media.Thumbnail.ContentType = getMimeType(thumbExt) + + // Generate a media attachment thumbnail URL. + p.media.Thumbnail.URL = uris.URIForAttachment( + p.media.AccountID, + string(TypeAttachment), + string(SizeSmall), + p.media.ID, + thumbExt, + ) } // Generate a media attachment URL. @@ -301,22 +320,10 @@ func (p *ProcessingMedia) store(ctx context.Context) error { ext, ) - // Generate a media attachment thumbnail URL. - p.media.Thumbnail.URL = uris.URIForAttachment( - p.media.AccountID, - string(TypeAttachment), - string(SizeSmall), - p.media.ID, - "webp", - ) - // Get mimetype for the file container // type, falling back to generic data. p.media.File.ContentType = getMimeType(ext) - // Set the known thumbnail content type. - p.media.Thumbnail.ContentType = "image/webp" - // We can now consider this cached. p.media.Cached = util.Ptr(true) |