I'm using glReadPixels
to read data into a CVPixelBufferRef
. I use the CVPixelBufferRef
as the input into an AVAssetWriter
. Unfortunately the pixel formats seem to be mismatched.
I think glReadPixels
is returning pixel data in RGBA format while AVAssetWriter
wants pixel data in ARGB format. What's the best way to convert RGBA to ARGB?
Here's what I've tried so far:
CGImageRef
as an intermediate stepThe bit manipulation didn't work because CVPixelBufferRef doesn't seem to support subscripts. The CGImageRef
intermediate step does work... but I'd prefer not to have 50 extra lines of code that could potentially be a performance hit.
Regarding the bit manipulation, you can get a pointer to the pixel buffer's raw data:
CVPixelBufferLockBaseAddress(buffer, 0);
size_t stride = CVPixelBufferGetBytesPerRow(buffer);
char *data = (char *)CVPixelBufferGetBaseAddress(buffer);
for (size_t y = 0; y < CVPixelBufferGetHeight(buffer); ++y) {
uint32_t *pixels = (uint32_t *)(data + stride * y);
for (size_t x = 0; x < CVPixelBufferGetWidth(buffer); ++x)
pixels[x] = (pixels[x] >> 8) | (pixels[x] << 24);
}
CVPixelBufferUnlockBaseAddress(buffer, 0);