Я просто смотрел на эту проблему и обнаружил, что CVImageBufferRef обычно может быть прочитан непосредственно как 24 пикселя BPP, но сложная часть заключается в проверке результатов CVPixelBufferGetBytesPerRow (imageBuffer), чтобы иметь дело со случаем, когда возвращаемые байты на строку не то же самое, что ширина * sizeof (uint32_t). В моем коде мне нужно сгладить входные пиксели в буфер, который не содержит байтов заполнения, поэтому вот что я делаю:
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
...
int outputBytesPerRow = width * sizeof(uint32_t);
if (bytesPerRow == outputBytesPerRow) {
// In this optimized case, just copy the entire framebuffer in one go
memcpy(frameBuffer.pixels, baseAddress, frameBuffer.numBytes);
} else {
// Non-simple layout where padding bytes appear after the pixels, need to copy
// one row at a time into the flat pixel buffer layout.
for (int rowi = 0; rowi < height; rowi++) {
void *inputRowStartPtr = baseAddress + (rowi * bytesPerRow);
void *outputRowStartPtr = frameBuffer.pixels + (rowi * outputBytesPerRow);
memcpy(outputRowStartPtr, inputRowStartPtr, outputBytesPerRow);
}
}