Skip to content

Commit

Permalink
convert to yuv
Browse files Browse the repository at this point in the history
  • Loading branch information
octu0 committed Sep 3, 2021
1 parent 63bb97b commit ca8c76b
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 5 deletions.
23 changes: 18 additions & 5 deletions cli/cgo/cgo.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,21 +41,34 @@ func loadImage(inputFile string) (*image.RGBA, error) {
if err != nil {
return nil, err
}
return convertRGBA(img), nil
return imageRGBA(img), nil
}

func saveImage(img *image.RGBA) (string, error) {
out, err := ioutil.TempFile("/tmp", "out*.png")
if err != nil {
return "", err
}
defer out.Close()

if err := png.Encode(out, img); err != nil {
return "", err
}
return out.Name(), nil
}

func loadData(path string) ([]byte, error) {
return os.ReadFile(path)
}

func saveImage(img *image.RGBA) (string, error) {
out, err := ioutil.TempFile("/tmp", "out*.png")
func saveData(data []byte) (string, error) {
out, err := ioutil.TempFile("/tmp", "out*.raw")
if err != nil {
return "", err
}
defer out.Close()

if err := png.Encode(out, img); err != nil {
if err := os.WriteFile(out.Name(), data, 0644); err != nil {
return "", err
}
return out.Name(), nil
Expand All @@ -80,7 +93,7 @@ func decode(data []byte, fileExt string) (image.Image, error) {
}
}

func convertRGBA(img image.Image) *image.RGBA {
func imageRGBA(img image.Image) *image.RGBA {
if i, ok := img.(*image.RGBA); ok {
return i
}
Expand Down
64 changes: 64 additions & 0 deletions cli/cgo/convert_to_yuv.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package cgo

import (
"fmt"
"log"

"gopkg.in/urfave/cli.v1"

"github.com/octu0/blurry"
)

func convertToYUVAction(c *cli.Context) error {
in, err := loadImage(c.String("input"))
if err != nil {
return err
}
if c.String("c") != "444" {
return fmt.Errorf("supports only chroma sample 444 yet ('%s')", c.String("c"))
}

ycbcr, err := blurry.ConvertToYUV444(in)
if err != nil {
return err
}

log.Printf("info: yuv Y:%d U:%d V:%d YStride:%d CStride:%d", len(ycbcr.Y), len(ycbcr.Cb), len(ycbcr.Cr), ycbcr.YStride, ycbcr.CStride)

pathY, err := saveData(ycbcr.Y)
if err != nil {
return err
}
pathU, err := saveData(ycbcr.Cb)
if err != nil {
return err
}
pathV, err := saveData(ycbcr.Cr)
if err != nil {
return err
}

log.Printf("info: y: %s", pathY)
log.Printf("info: u: %s", pathU)
log.Printf("info: v: %s", pathV)
return nil
}

func init() {
addCommand(cli.Command{
Name: "convert_to_yuv",
Action: convertToYUVAction,
Flags: []cli.Flag{
cli.StringFlag{
Name: "i,input",
Usage: "/path/to/input image",
Value: "./testdata/src.png",
},
cli.StringFlag{
Name: "c,chroma",
Usage: "to subsampling(444)",
Value: "444",
},
},
})
}

0 comments on commit ca8c76b

Please sign in to comment.