У меня есть 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))
// ...
}
Приведенный выше код работает, , но копирует данные дважды!
- При создании
C.GoBytes
- При копировании результирующего объекта
[]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)
?
Так каков эффективный способ скопировать эти байты?