QCameraFocusZoneList BbCameraFocusControl::focusZones() const { if (m_session->state() == QCamera::UnloadedState) return QCameraFocusZoneList(); camera_region_t regions[20]; int supported = 0; int asked = 0; camera_error_t result = camera_get_focus_regions(m_session->handle(), 20, &supported, &asked, regions); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve focus regions:" << result; return QCameraFocusZoneList(); } // retrieve width and height of viewfinder int viewfinderWidth = 0; int viewfinderHeight = 0; if (m_session->captureMode() & QCamera::CaptureStillImage) result = camera_get_photovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, &viewfinderWidth, CAMERA_IMGPROP_HEIGHT, &viewfinderHeight); else if (m_session->captureMode() & QCamera::CaptureVideo) result = camera_get_videovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, &viewfinderWidth, CAMERA_IMGPROP_HEIGHT, &viewfinderHeight); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve viewfinder size:" << result; return QCameraFocusZoneList(); } QCameraFocusZoneList list; for (int i = 0; i < asked; ++i) { const int x = regions[i].left; const int y = regions[i].top; const int width = regions[i].width; const int height = regions[i].height; QRectF rect(static_cast<float>(x)/static_cast<float>(viewfinderWidth), static_cast<float>(y)/static_cast<float>(viewfinderHeight), static_cast<float>(width)/static_cast<float>(viewfinderWidth), static_cast<float>(height)/static_cast<float>(viewfinderHeight)); list << QCameraFocusZone(rect, QCameraFocusZone::Focused); //TODO: how to know if a zone is unused/selected/focused?!? } return list; }
qreal BbCameraZoomControl::currentDigitalZoom() const { if (m_session->status() != QCamera::ActiveStatus) return 1.0; unsigned int zoomFactor = 0; camera_error_t result = CAMERA_EOK; if (m_session->captureMode() & QCamera::CaptureStillImage) result = camera_get_photovf_property(m_session->handle(), CAMERA_IMGPROP_ZOOMFACTOR, &zoomFactor); else if (m_session->captureMode() & QCamera::CaptureVideo) result = camera_get_videovf_property(m_session->handle(), CAMERA_IMGPROP_ZOOMFACTOR, &zoomFactor); if (result != CAMERA_EOK) return 1.0; return zoomFactor; }
bool BbCameraFocusControl::retrieveViewfinderSize(int *width, int *height) { if (!width || !height) return false; camera_error_t result = CAMERA_EOK; if (m_session->captureMode() & QCamera::CaptureStillImage) result = camera_get_photovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, width, CAMERA_IMGPROP_HEIGHT, height); else if (m_session->captureMode() & QCamera::CaptureVideo) result = camera_get_videovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, width, CAMERA_IMGPROP_HEIGHT, height); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve viewfinder size:" << result; return false; } return true; }