// +build !cgo

package frame

import (
	"fmt"
	"image"
)

func decodeYUY2(frame []byte, width, height int) (image.Image, func(), error) {
	yi := width * height
	ci := yi / 2
	fi := yi + 2*ci

	if len(frame) < fi {
		return nil, func() {}, fmt.Errorf("frame length (%d) less than expected (%d)", len(frame), fi)
	}

	y := make([]byte, yi)
	cb := make([]byte, ci)
	cr := make([]byte, ci)

	fast := 0
	slow := 0
	for i := 0; i < fi; i += 4 {
		y[fast] = frame[i]
		cb[slow] = frame[i+1]
		y[fast+1] = frame[i+2]
		cr[slow] = frame[i+3]
		fast += 2
		slow++
	}

	return &image.YCbCr{
		Y:              y,
		YStride:        width,
		Cb:             cb,
		Cr:             cr,
		CStride:        width / 2,
		SubsampleRatio: image.YCbCrSubsampleRatio422,
		Rect:           image.Rect(0, 0, width, height),
	}, func() {}, nil
}

func decodeUYVY(frame []byte, width, height int) (image.Image, func(), error) {
	yi := width * height
	ci := yi / 2
	fi := yi + 2*ci

	if len(frame) < fi {
		return nil, func() {}, fmt.Errorf("frame length (%d) less than expected (%d)", len(frame), fi)
	}

	y := make([]byte, yi)
	cb := make([]byte, ci)
	cr := make([]byte, ci)

	fast := 0
	slow := 0
	for i := 0; i < fi; i += 4 {
		cb[slow] = frame[i]
		y[fast] = frame[i+1]
		cr[slow] = frame[i+2]
		y[fast+1] = frame[i+3]
		fast += 2
		slow++
	}

	return &image.YCbCr{
		Y:              y,
		YStride:        width,
		Cb:             cb,
		Cr:             cr,
		CStride:        width / 2,
		SubsampleRatio: image.YCbCrSubsampleRatio422,
		Rect:           image.Rect(0, 0, width, height),
	}, func() {}, nil
}
