diff --git a/Makefile b/Makefile index 1920e3f..7a97103 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# Should contain src/github.com/Kagami/go-avif +# Should contain src/github.com/kagami/go-avif export GOPATH = $(PWD)/../../../.. all: build diff --git a/README.md b/README.md index 3372c3d..82db195 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# go-avif [![Build Status](https://travis-ci.org/Kagami/go-avif.svg?branch=master)](https://travis-ci.org/Kagami/go-avif) [![GoDoc](https://godoc.org/github.com/Kagami/go-avif?status.svg)](https://godoc.org/github.com/Kagami/go-avif) +# go-avif [![Build Status](https://travis-ci.org/kagami/go-avif.svg?branch=master)](https://travis-ci.org/kagami/go-avif) [![GoDoc](https://godoc.org/github.com/kagami/go-avif?status.svg)](https://godoc.org/github.com/kagami/go-avif) go-avif implements AVIF ([AV1 Still Image File Format](https://aomediacodec.github.io/av1-avif/)) -encoder for Go using libaom, the [high quality](https://github.com/Kagami/av1-bench) +encoder for Go using libaom, the [high quality](https://github.com/kagami/av1-bench) AV1 codec. ## Requirements @@ -18,16 +18,16 @@ sudo apt-get install libaom-dev To use go-avif in your Go code: ```go -import "github.com/Kagami/go-avif" +import "github.com/kagami/go-avif" ``` To install go-avif in your $GOPATH: ```bash -go get github.com/Kagami/go-avif +go get github.com/kagami/go-avif ``` -For further details see [GoDoc documentation](https://godoc.org/github.com/Kagami/go-avif). +For further details see [GoDoc documentation](https://godoc.org/github.com/kagami/go-avif). ## Example @@ -40,7 +40,7 @@ import ( "log" "os" - "github.com/Kagami/go-avif" + "github.com/kagami/go-avif" ) func main() { @@ -81,7 +81,7 @@ PNG files to AVIF: ```bash # Compile and put avif binary to $GOPATH/bin -go get github.com/Kagami/go-avif/... +go get github.com/kagami/go-avif/... # Encode JPEG to AVIF with default settings avif -e cat.jpg -o kitty.avif @@ -92,12 +92,15 @@ avif -e dog.png -o doggy.avif --best -q 15 # Lossless encoding avif -e pig.png -o piggy.avif --lossless +# Create thumbnail +avif -e horse.png -o horsey.avif --thumb=640:480 + # Show help avif -h ``` Static 64-bit builds for Windows, macOS and Linux are available at -[releases page](https://github.com/Kagami/go-avif/releases). They include +[releases page](https://github.com/kagami/go-avif/releases). They include latest libaom from git at the moment of build. ## Display diff --git a/avif.go b/avif.go index aadcdec..0d11407 100644 --- a/avif.go +++ b/avif.go @@ -55,6 +55,7 @@ func (e OptionsError) Error() string { // An EncoderError reports that the encoder error has occured. type EncoderError int +// ToString returns the string representation of an EncoderError. func (e EncoderError) ToString() string { switch e { case C.AVIF_ERROR_GENERAL: diff --git a/cmd/avif/main.go b/cmd/avif/main.go index e69d6d0..76aeb62 100644 --- a/cmd/avif/main.go +++ b/cmd/avif/main.go @@ -1,19 +1,23 @@ package main import ( + "errors" "fmt" "image" _ "image/jpeg" _ "image/png" "io" "os" + "strconv" + "strings" - "github.com/Kagami/go-avif" "github.com/docopt/docopt-go" + "github.com/kagami/go-avif" + "github.com/nfnt/resize" ) -const VERSION = "0.0.0" -const USAGE = ` +const version = "0.0.0" +const usage = ` Usage: avif [options] -e src_filename -o dst_filename AVIF encoder @@ -23,6 +27,7 @@ Options: -V, --version Display version number -e , --encode= Source filename -o , --output= Destination filename + -b , --thumb= Maximum image dimensions -q , --quality= Compression level (0..63), [default: 25] -s , --speed= Compression speed (0..8), [default: 4] -t , --threads= Number of threads (0..64, 0 for all available cores), [default: 0] @@ -34,6 +39,7 @@ Options: type config struct { Encode string Output string + Thumb string Quality int Speed int Threads int @@ -58,7 +64,7 @@ func check(cond bool, errStr string) { func main() { var conf config - opts, err := docopt.ParseArgs(USAGE, nil, VERSION) + opts, err := docopt.ParseArgs(usage, nil, version) checkErr(err) err = opts.Bind(&conf) checkErr(err) @@ -103,6 +109,19 @@ func main() { img, _, err := image.Decode(src) checkErr(err) + if conf.Thumb != "" { + split := strings.Split(conf.Thumb, ":") + if len(split) != 2 { + checkErr(errors.New("failed to create thumbnail: invalid dimensions, must be in w:h format")) + } + w, err := strconv.Atoi(split[0]) + checkErr(err) + h, err := strconv.Atoi(split[1]) + checkErr(err) + + img = resize.Thumbnail(uint(w), uint(h), img, resize.Lanczos3) + } + err = avif.Encode(dst, img, &avifOpts) checkErr(err) } diff --git a/example_test.go b/example_test.go index f68b0d2..24def50 100644 --- a/example_test.go +++ b/example_test.go @@ -6,7 +6,7 @@ import ( "log" "os" - "github.com/Kagami/go-avif" + "github.com/kagami/go-avif" ) const usageHelp = "Usage: %s src.jpg dst.avif" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1a7e684 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/kagami/go-avif + +go 1.16 + +require ( + github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fd467f5 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= diff --git a/mp4.go b/mp4.go index d36e299..ca43ded 100644 --- a/mp4.go +++ b/mp4.go @@ -41,9 +41,8 @@ func ulen(s string) uint32 { func bflag(b bool, pos uint8) uint8 { if b { return 1 << (pos - 1) - } else { - return 0 } + return 0 } func writeAll(w io.Writer, writers ...io.WriterTo) (err error) { @@ -744,7 +743,7 @@ func muxFrame(w io.Writer, m image.Image, subsampling image.YCbCrSubsampleRatio, lengthSize: 4, baseOffsetSize: 4, items: []boxILOCItem{ - boxILOCItem{ + { itemID: 1, extents: []boxILOCItemExtent{{}}, }, @@ -752,7 +751,7 @@ func muxFrame(w io.Writer, m image.Image, subsampling image.YCbCrSubsampleRatio, }, itemInfos: boxIINF{ itemInfos: []boxINFEv2{ - boxINFEv2{ + { itemID: 1, itemType: itemTypeAV01, itemName: "Image", @@ -776,7 +775,7 @@ func muxFrame(w io.Writer, m image.Image, subsampling image.YCbCrSubsampleRatio, }, association: boxIPMA{ entries: []boxIPMAAssociation{ - boxIPMAAssociation{ + { itemID: 1, props: []boxIPMAAssociationProperty{ {false, 1}, // non-essential width/height