Reputation: 11
I am working on AOSP 13 on an i.MX8MM Var-SOM board and trying to implement native face detection using NDK Camera2 APIs. My goal is to capture frames using AImageReader and process them with TensorFlow Lite.
However, even though the camera opens successfully, no frames are received in AImageReader, and I keep getting the following logs:
W CameraDeviceSessionHwlImpl: map_frame_request still empty after 100000000 ns W CameraDeviceSessionHwlImpl: HandleImage: mImageList still empty after 100000000 ns
What I Have Tried:
✅ Camera opens successfully (CameraService::connect logs confirm this).
✅ AImageReader is created and listener is set (logs confirm this).
✅ Capture session starts successfully (Capture Session Active appears in logs).
❌ No frames are delivered to ImageReader (Image Available Callback Triggered! never appears).
✅ Checked Camera Service Logs (dumpsys media.camera) The camera device is open, but no frames are being processed Shows "No input stream configured."
Code Implementation:
AImageReader setup and image callback:
// Creating AImageReader
AImageReader_new(320, 240, AIMAGE_FORMAT_JPEG, 10,
&imageReader);
AImageReader_ImageListener listener = {
.context = nullptr,
.onImageAvailable = ImageCallback
};
AImageReader_setImageListener(imageReader, &listener);
Image Callback
void ImageCallback(void* context, AImageReader* reader) {
LOG("Image Available Callback Triggered!");
AImage* image;
media_status_t imgStatus = AImageReader_acquireLatestImage(reader, &image);
if (imgStatus != AMEDIA_OK || !image) {
LOGE("Failed to acquire image, status: %d", imgStatus);
return;
}
int32_t width, height, format;
AImage_getWidth(image, &width);
AImage_getHeight(image, &height);
AImage_getFormat(image, &format);
LOG("Received Image: %dx%d, Format: %d", width, height, format);
AImage_delete(image);
}
Capture Request Configuration
ACameraDevice_createCaptureRequest(cameraDevice, TEMPLATE_PREVIEW, &captureRequest);
// Attach ImageReader to Capture Request
ANativeWindow* nativeWindow;
AImageReader_getWindow(imageReader, &nativeWindow);
ACameraOutputTarget* imageReaderTarget;
ACameraOutputTarget_create(nativeWindow, &imageReaderTarget);
ACaptureRequest_addTarget(captureRequest, imageReaderTarget);
// Set Capture Request Parameters
ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_SENSOR_SENSITIVITY, 1, (int32_t[]){400});
ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_AE_TARGET_FPS_RANGE, 2, (int32_t[]){15, 30});
ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_SCALER_CROP_REGION, 4, (int32_t[]){0, 0, 320, 240});
// Start Capture Session
camera_status_t cam_status = ACameraCaptureSession_setRepeatingRequest(
captureSession, nullptr, 1, &captureRequest, nullptr);
if (cam_status != ACAMERA_OK) {
LOGE("Failed to start capture session, status: %d", cam_status);
return;
}
LOG("Camera Capture Started!");
Upvotes: 0
Views: 70