forked from jshiffer/matterbridge
53cafa9f3d
This commit adds support for go/cgo tgs conversion when building with the -tags `cgo` The default binaries are still "pure" go and uses the old way of converting. * Move lottie_convert.py conversion code to its own file * Add optional libtgsconverter * Update vendor * Apply suggestions from code review * Update bridge/helper/libtgsconverter.go Co-authored-by: Wim <wim@42.be>
363 lines
9.6 KiB
Go
363 lines
9.6 KiB
Go
package webpanimation
|
|
|
|
/*
|
|
#cgo CFLAGS: -Wno-pointer-sign -DHAVE_CONFIG_H
|
|
#cgo !windows LDFLAGS: -lm
|
|
|
|
#include "webp_encode.h"
|
|
#include "webp_mux.h"
|
|
*/
|
|
import "C"
|
|
import (
|
|
"errors"
|
|
"unsafe"
|
|
)
|
|
|
|
type WebPMuxError int
|
|
|
|
const (
|
|
WebpMuxAbiVersion = 0x0108
|
|
WebpEncoderAbiVersion = 0x020f
|
|
)
|
|
|
|
const (
|
|
WebpMuxOk = WebPMuxError(C.WEBP_MUX_OK)
|
|
WebpMuxNotFound = WebPMuxError(C.WEBP_MUX_NOT_FOUND)
|
|
WebpMuxInvalidArgument = WebPMuxError(C.WEBP_MUX_INVALID_ARGUMENT)
|
|
WebpMuxBadData = WebPMuxError(C.WEBP_MUX_BAD_DATA)
|
|
WebpMuxMemoryError = WebPMuxError(C.WEBP_MUX_MEMORY_ERROR)
|
|
WebpMuxNotEnoughData = WebPMuxError(C.WEBP_MUX_NOT_ENOUGH_DATA)
|
|
)
|
|
|
|
type WebPPicture C.WebPPicture
|
|
type WebPAnimEncoder C.WebPAnimEncoder
|
|
type WebPAnimEncoderOptions C.WebPAnimEncoderOptions
|
|
type WebPData C.WebPData
|
|
type WebPMux C.WebPMux
|
|
type WebPMuxAnimParams C.WebPMuxAnimParams
|
|
type webPConfig struct {
|
|
webpConfig *C.WebPConfig
|
|
}
|
|
|
|
type WebPConfig interface {
|
|
getRawPointer() *C.WebPConfig
|
|
SetLossless(v int)
|
|
GetLossless() int
|
|
SetMethod(v int)
|
|
SetImageHint(v int)
|
|
SetTargetSize(v int)
|
|
SetTargetPSNR(v float32)
|
|
SetSegments(v int)
|
|
SetSnsStrength(v int)
|
|
SetFilterStrength(v int)
|
|
SetFilterSharpness(v int)
|
|
SetAutofilter(v int)
|
|
SetAlphaCompression(v int)
|
|
SetAlphaFiltering(v int)
|
|
SetPass(v int)
|
|
SetShowCompressed(v int)
|
|
SetPreprocessing(v int)
|
|
SetPartitions(v int)
|
|
SetPartitionLimit(v int)
|
|
SetEmulateJpegSize(v int)
|
|
SetThreadLevel(v int)
|
|
SetLowMemory(v int)
|
|
SetNearLossless(v int)
|
|
SetExact(v int)
|
|
SetUseDeltaPalette(v int)
|
|
SetUseSharpYuv(v int)
|
|
SetAlphaQuality(v int)
|
|
SetFilterType(v int)
|
|
SetQuality(v float32)
|
|
}
|
|
|
|
func WebPDataClear(webPData *WebPData) {
|
|
C.WebPDataClear((*C.WebPData)(unsafe.Pointer(webPData)))
|
|
}
|
|
|
|
func WebPMuxDelete(webPMux *WebPMux) {
|
|
C.WebPMuxDelete((*C.WebPMux)(unsafe.Pointer(webPMux)))
|
|
}
|
|
|
|
func WebPPictureFree(webPPicture *WebPPicture) {
|
|
C.WebPPictureFree((*C.WebPPicture)(unsafe.Pointer(webPPicture)))
|
|
}
|
|
|
|
func WebPAnimEncoderDelete(webPAnimEncoder *WebPAnimEncoder) {
|
|
C.WebPAnimEncoderDelete((*C.WebPAnimEncoder)(unsafe.Pointer(webPAnimEncoder)))
|
|
}
|
|
|
|
func (wmap *WebPMuxAnimParams) SetBgcolor(v uint32) {
|
|
((*C.WebPMuxAnimParams)(wmap)).bgcolor = (C.uint32_t)(v)
|
|
}
|
|
|
|
func (wmap *WebPMuxAnimParams) SetLoopCount(v int) {
|
|
(*C.WebPMuxAnimParams)(wmap).loop_count = (C.int)(v)
|
|
}
|
|
|
|
func WebPPictureInit(webPPicture *WebPPicture) int {
|
|
return int(C.WebPPictureInit((*C.WebPPicture)(unsafe.Pointer(webPPicture))))
|
|
}
|
|
|
|
func (wpp *WebPPicture) SetWidth(v int) {
|
|
((*C.WebPPicture)(wpp)).width = (C.int)(v)
|
|
}
|
|
|
|
func (wpp *WebPPicture) SetHeight(v int) {
|
|
((*C.WebPPicture)(wpp)).height = (C.int)(v)
|
|
}
|
|
|
|
func (wpp WebPPicture) GetWidth() int {
|
|
return int(((C.WebPPicture)(wpp)).width)
|
|
}
|
|
|
|
func (wpp WebPPicture) GetHeight() int {
|
|
return int(((C.WebPPicture)(wpp)).height)
|
|
}
|
|
|
|
func (wpp *WebPPicture) SetUseArgb(v int) {
|
|
((*C.WebPPicture)(wpp)).use_argb = (C.int)(v)
|
|
}
|
|
|
|
func (wpd WebPData) GetBytes() []byte {
|
|
return C.GoBytes(unsafe.Pointer(((C.WebPData)(wpd)).bytes), (C.int)(((C.WebPData)(wpd)).size))
|
|
}
|
|
|
|
func WebPDataInit(webPData *WebPData) {
|
|
C.WebPDataInit((*C.WebPData)(unsafe.Pointer(webPData)))
|
|
}
|
|
|
|
// NewWebpConfig create webpconfig instance
|
|
func NewWebpConfig() WebPConfig {
|
|
webpcfg := &webPConfig{}
|
|
webpcfg.webpConfig = &C.WebPConfig{}
|
|
WebPConfigInitInternal(webpcfg)
|
|
return webpcfg
|
|
}
|
|
|
|
func WebPConfigInitInternal(config WebPConfig) int {
|
|
return int(C.WebPConfigInitInternal(
|
|
config.getRawPointer(),
|
|
(C.WebPPreset)(0),
|
|
(C.float)(75.0),
|
|
(C.int)(WebpEncoderAbiVersion),
|
|
))
|
|
}
|
|
|
|
func (webpCfg *webPConfig) getRawPointer() *C.WebPConfig {
|
|
return webpCfg.webpConfig
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetLossless(v int) {
|
|
webpCfg.webpConfig.lossless = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) GetLossless() int {
|
|
return int(webpCfg.webpConfig.lossless)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetMethod(v int) {
|
|
webpCfg.webpConfig.method = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetImageHint(v int) {
|
|
webpCfg.webpConfig.image_hint = (C.WebPImageHint)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetTargetSize(v int) {
|
|
webpCfg.webpConfig.target_size = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetTargetPSNR(v float32) {
|
|
webpCfg.webpConfig.target_PSNR = (C.float)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetSegments(v int) {
|
|
webpCfg.webpConfig.segments = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetSnsStrength(v int) {
|
|
webpCfg.webpConfig.sns_strength = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetFilterStrength(v int) {
|
|
webpCfg.webpConfig.filter_strength = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetFilterSharpness(v int) {
|
|
webpCfg.webpConfig.filter_sharpness = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetAutofilter(v int) {
|
|
webpCfg.webpConfig.autofilter = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetAlphaCompression(v int) {
|
|
webpCfg.webpConfig.alpha_compression = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetAlphaFiltering(v int) {
|
|
webpCfg.webpConfig.alpha_filtering = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetPass(v int) {
|
|
webpCfg.webpConfig.pass = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetShowCompressed(v int) {
|
|
webpCfg.webpConfig.show_compressed = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetPreprocessing(v int) {
|
|
webpCfg.webpConfig.preprocessing = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetPartitions(v int) {
|
|
webpCfg.webpConfig.partitions = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetPartitionLimit(v int) {
|
|
webpCfg.webpConfig.partition_limit = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetEmulateJpegSize(v int) {
|
|
webpCfg.webpConfig.emulate_jpeg_size = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetThreadLevel(v int) {
|
|
webpCfg.webpConfig.thread_level = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetLowMemory(v int) {
|
|
webpCfg.webpConfig.low_memory = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetNearLossless(v int) {
|
|
webpCfg.webpConfig.near_lossless = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetExact(v int) {
|
|
webpCfg.webpConfig.exact = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetUseDeltaPalette(v int) {
|
|
webpCfg.webpConfig.use_delta_palette = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetUseSharpYuv(v int) {
|
|
webpCfg.webpConfig.use_sharp_yuv = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetAlphaQuality(v int) {
|
|
webpCfg.webpConfig.alpha_quality = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetFilterType(v int) {
|
|
webpCfg.webpConfig.filter_type = (C.int)(v)
|
|
}
|
|
|
|
func (webpCfg *webPConfig) SetQuality(v float32) {
|
|
webpCfg.webpConfig.quality = (C.float)(v)
|
|
}
|
|
|
|
func (encOptions *WebPAnimEncoderOptions) GetAnimParams() WebPMuxAnimParams {
|
|
return WebPMuxAnimParams(((*C.WebPAnimEncoderOptions)(encOptions)).anim_params)
|
|
}
|
|
|
|
func (encOptions *WebPAnimEncoderOptions) SetAnimParams(v WebPMuxAnimParams) {
|
|
((*C.WebPAnimEncoderOptions)(encOptions)).anim_params = (C.WebPMuxAnimParams)(v)
|
|
}
|
|
|
|
func (encOptions *WebPAnimEncoderOptions) SetMinimizeSize(v int) {
|
|
((*C.WebPAnimEncoderOptions)(encOptions)).minimize_size = (C.int)(v)
|
|
}
|
|
|
|
func (encOptions *WebPAnimEncoderOptions) SetKmin(v int) {
|
|
((*C.WebPAnimEncoderOptions)(encOptions)).kmin = (C.int)(v)
|
|
}
|
|
|
|
func (encOptions *WebPAnimEncoderOptions) SetKmax(v int) {
|
|
((*C.WebPAnimEncoderOptions)(encOptions)).kmax = (C.int)(v)
|
|
}
|
|
|
|
func (encOptions *WebPAnimEncoderOptions) SetAllowMixed(v int) {
|
|
((*C.WebPAnimEncoderOptions)(encOptions)).allow_mixed = (C.int)(v)
|
|
}
|
|
|
|
func (encOptions *WebPAnimEncoderOptions) SetVerbose(v int) {
|
|
((*C.WebPAnimEncoderOptions)(encOptions)).verbose = (C.int)(v)
|
|
}
|
|
|
|
func WebPAnimEncoderOptionsInitInternal(webPAnimEncoderOptions *WebPAnimEncoderOptions) int {
|
|
return int(C.WebPAnimEncoderOptionsInitInternal(
|
|
(*C.WebPAnimEncoderOptions)(unsafe.Pointer(webPAnimEncoderOptions)),
|
|
(C.int)(WebpMuxAbiVersion),
|
|
))
|
|
}
|
|
|
|
func WebPPictureImportRGBA(data []byte, stride int, webPPicture *WebPPicture) error {
|
|
res := int(C.WebPPictureImportRGBA(
|
|
(*C.WebPPicture)(unsafe.Pointer(webPPicture)),
|
|
(*C.uint8_t)(unsafe.Pointer(&data[0])),
|
|
(C.int)(stride),
|
|
))
|
|
if res == 0 {
|
|
return errors.New("error: WebPPictureImportBGRA")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func WebPAnimEncoderNewInternal(width, height int, webPAnimEncoderOptions *WebPAnimEncoderOptions) *WebPAnimEncoder {
|
|
return (*WebPAnimEncoder)(C.WebPAnimEncoderNewInternal(
|
|
(C.int)(width),
|
|
(C.int)(height),
|
|
(*C.WebPAnimEncoderOptions)(unsafe.Pointer(webPAnimEncoderOptions)),
|
|
(C.int)(WebpMuxAbiVersion),
|
|
))
|
|
}
|
|
|
|
func WebPAnimEncoderAdd(webPAnimEncoder *WebPAnimEncoder, webPPicture *WebPPicture, timestamp int, webpcfg WebPConfig) int {
|
|
return int(C.WebPAnimEncoderAdd(
|
|
(*C.WebPAnimEncoder)(unsafe.Pointer(webPAnimEncoder)),
|
|
(*C.WebPPicture)(unsafe.Pointer(webPPicture)),
|
|
(C.int)(timestamp),
|
|
webpcfg.getRawPointer(),
|
|
))
|
|
}
|
|
|
|
func WebPAnimEncoderAssemble(webPAnimEncoder *WebPAnimEncoder, webPData *WebPData) int {
|
|
return int(C.WebPAnimEncoderAssemble(
|
|
(*C.WebPAnimEncoder)(unsafe.Pointer(webPAnimEncoder)),
|
|
(*C.WebPData)(unsafe.Pointer(webPData)),
|
|
))
|
|
}
|
|
|
|
func WebPMuxCreateInternal(webPData *WebPData, copyData int) *WebPMux {
|
|
return (*WebPMux)(C.WebPMuxCreateInternal(
|
|
(*C.WebPData)(unsafe.Pointer(webPData)),
|
|
(C.int)(copyData),
|
|
(C.int)(WebpMuxAbiVersion),
|
|
))
|
|
}
|
|
|
|
func WebPMuxSetAnimationParams(webPMux *WebPMux, webPMuxAnimParams *WebPMuxAnimParams) WebPMuxError {
|
|
return (WebPMuxError)(C.WebPMuxSetAnimationParams(
|
|
(*C.WebPMux)(unsafe.Pointer(webPMux)),
|
|
(*C.WebPMuxAnimParams)(unsafe.Pointer(webPMuxAnimParams)),
|
|
))
|
|
}
|
|
|
|
func WebPMuxGetAnimationParams(webPMux *WebPMux, webPMuxAnimParams *WebPMuxAnimParams) WebPMuxError {
|
|
return (WebPMuxError)(C.WebPMuxGetAnimationParams(
|
|
(*C.WebPMux)(unsafe.Pointer(webPMux)),
|
|
(*C.WebPMuxAnimParams)(unsafe.Pointer(webPMuxAnimParams)),
|
|
))
|
|
}
|
|
|
|
func WebPMuxAssemble(webPMux *WebPMux, webPData *WebPData) WebPMuxError {
|
|
return (WebPMuxError)(C.WebPMuxAssemble(
|
|
(*C.WebPMux)(unsafe.Pointer(webPMux)),
|
|
(*C.WebPData)(unsafe.Pointer(webPData)),
|
|
))
|
|
}
|