I am writing an app that takes the camera feed, converts it to rgb, in order to do some processing.
It works fine on the old camera implementation which uses NV21 Y
As you have not tagged this question as java or ndk. My replie implementation is from ndk or c++ point of view:
I know you want to convert the AIMAGE_FORMAT_YUV_420_888 to RGB b bits. Instead you can get directly AIMAGE_FORMAT_RGB_888 format if you request for AIMAGE_FORMAT during call to AImageReader_new().
/*
* Callback when image is available for processing
*/
static void imageCallback(void* context, AImageReader* reader)
{
AImage *image = nullptr;
auto status = AImageReader_acquireNextImage(reader, &image);
// Check status here ...
// Try to process data without blocking the callback
std::thread processor([=](){
uint8_t *data = nullptr;
int len = 0;
AImage_getPlaneData(image, 0, &data, &len);
// Process data here
// ...
AImage_delete(image);
});
processor.detach();
}
/*
* Create RGB reader
*/
AImageReader* createRGBReader()
{
AImageReader* reader = nullptr;
media_status_t status = AImageReader_new(640, 480, AIMAGE_FORMAT_RGB_888,
4, &reader);
//if (status != AMEDIA_OK)
// Handle errors here
AImageReader_ImageListener listener{
.context = nullptr,
.onImageAvailable = imageCallback,
};
AImageReader_setImageListener(reader, &listener);
return reader;
}
/*
* Create the surface for this reader
*/
ANativeWindow* createSurface(AImageReader* reader)
{
ANativeWindow *nativeWindow;
AImageReader_getWindow(reader, &nativeWindow);
return nativeWindow;
}
...
createSession()
{
...
createSurface(createRGBReader());
...
}