cgo скопируйте массив "*C .uchar" в [] байт изображения. YCbCr эффективным способом - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть C код, который создает изображение в формате YCbCr i420 (image.YCbCrSubsampleRatio420) и хочу передать его в go.

По этой причине я вызываю функцию go, который затем преобразует его в изображение. YCbCr:

func onCaptureFrame(width C.int, height C.int, chroma_width C.int, chroma_height C.int, y *C.uchar, u *C.uchar, v *C.uchar) {
    resImage := image.NewYCbCr(image.Rectangle{
        Min: image.Point{X: 0, Y: 0},
        Max: image.Point{X: int(width), Y: int(height)},
    }, image.YCbCrSubsampleRatio420)
    copy(resImage.Y, C.GoBytes(unsafe.Pointer(y), width * height))
    copy(resImage.Cb, C.GoBytes(unsafe.Pointer(u), chroma_width * chroma_height))
    copy(resImage.Cr, C.GoBytes(unsafe.Pointer(v), chroma_width * chroma_height))
    // ...
}

Приведенный выше код работает, , но копирует данные дважды!

  1. При создании C.GoBytes
  2. При копировании результирующего объекта []byte в resImage.Y, resImage.Cb и resImage.Cr

Я попытался это сделать:

...
copy(resImage.Y, *(*[]byte)(unsafe.Pointer(y)))
copy(resImage.Cb, *(*[]byte)(unsafe.Pointer(u)))
copy(resImage.Cr, *(*[]byte)(unsafe.Pointer(v)))
...

Но это приводит к segfault. Я не уверен почему, потому что копия не должна копировать больше байтов, чем len(dest)?

Так каков эффективный способ скопировать эти байты?

...