CameraService Architecture (libcameraservice.so)
1. CameraService Implementation
class CameraService :
public BinderService<CameraService>,
public virtual ::android::hardware::BnCameraService,
public virtual IBinder::DeathRecipient,
public camera_module_callbacks_t,
public virtual CameraProviderManager::StatusListener {
static const char* getServiceName() { return "media.camera"; }
class Client : public hardware::BnCamera, public BasicClient {
int mCameraId; // API1 clients use integer camera IDs
};
};
Status CameraService::connect(
const sp<ICameraClient>& cameraClient,
int cameraId,
const String16& clientPackageName,
int clientUid,
int clientPid,
sp<ICamera>* device) {
// Implementation
}
2. Service Registration
// Initialization in main_cameraserver.cpp
int main() {
sp<IServiceManager> sm = defaultServiceManager();
CameraService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
// BinderService template implementation
template<typename SERVICE>
class BinderService {
public:
static status_t publish() {
sp<IServiceManager> sm = defaultServiceManager();
return sm->addService(
String16(SERVICE::getServiceName()),
new SERVICE(), false);
}
};
3. Camera Provider Interaction
// CameraProviderManager initialization
status_t CameraService::enumerateProviders() {
mCameraProviderManager = new CameraProviderManager();
res = mCameraProviderManager->initialize(this);
for (auto& cameraId : mCameraProviderManager->getCameraDeviceIds()) {
onDeviceStatusChanged(cameraId, CameraDeviceStatus::PRESENT);
}
}
// HIDL interface with CameraProvider
struct HardwareServiceInteractionProxy : public ServiceInteractionProxy {
sp<hardware::camera::provider::V2_4::ICameraProvider> getService(
const std::string& serviceName) override {
return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName);
}
};
Client-Server Communication Flow
1. Client Connection
// Camera client initialization
sp<Camera> Camera::connect(int cameraId) {
sp<Camera> c = new Camera(cameraId);
sp<ICameraService> cs = getCameraService();
binder::Status ret = cs->connect(
c, cameraId, clientPackageName, clientUid, clientPid, &c->mCamera);
if (ret.isOk() && c->mCamera != nullptr) {
IInterface::asBinder(c->mCamera)->linkToDeath(c);
return c;
}
return nullptr;
}
2. HAL Interaction Modes
HAL1 Implementation:
// CameraHardwareInterface initialization
status_t CameraHardwareInterface::initialize(sp<CameraProviderManager> manager) {
return manager->openSession(mName.string(), this, &mHidlDevice);
}
// Preview setup
status_t CameraHardwareInterface::startPreview() {
return CameraProviderManager::mapToStatusT(mHidlDevice->startPreview());
}
HAL3 Implementation:
// Camera3Device initialization
status_t Camera3Device::initialize(sp<CameraProviderManager> manager) {
return manager->openSession(mId.string(), this, &mHidlSession);
}
// Stream configuration
status_t Camera3Device::configureStreams(camera3_stream_configuration* config) {
return mInterface->configureStreams(config);
}
Camera HAL Implementation
1. HAL Module Strucutre
// V4L2 Camera HAL implementation
camera_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = CAMERA_MODULE_API_VERSION_2_4,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = CAMERA_HARDWARE_MODULE_ID,
.methods = &v4l2_module_methods
},
.get_number_of_cameras = get_number_of_cameras,
.get_camera_info = get_camera_info,
.set_callbacks = set_callbacks
};
2. Device Operation
// Camera device operations
camera3_device_ops_t camera3_ops = {
.initialize = camera3_device_initialize,
.configure_streams = camera3_device_configure_streams,
.process_capture_request = camera3_device_process_capture_request
};
// V4L2 device handling
int V4L2Camera::openDevice(const hw_module_t* module, hw_device_t** device) {
int res = connect();
if (res == 0) {
*device = &mDevice.common;
return 0;
}
return res;
}
Key Data Structures
// Capture request/result structures
typedef struct camera3_capture_request {
uint32_t frame_number;
const camera_metadata_t* settings;
camera3_stream_buffer_t* input_buffer;
uint32_t num_output_buffers;
const camera3_stream_buffer_t* output_buffers;
} camera3_capture_request_t;
typedef struct camera3_capture_result {
uint32_t frame_number;
const camera_metadata_t* result;
uint32_t num_output_buffers;
const camera3_stream_buffer_t* output_buffers;
} camera3_capture_result_t;
Performance Considerations
- Binder IPC Optimization: Minimize cross-process calls between client and service
- Buffer Management: Efficient handling of graphic buffers between Surface and HAL
- Threading Model: Proper synchronization between request/result threads
- Metadata Handling: Optimized camera metadata operations