/* * Check the requested frame rate has been successfully configured or not. * If the target frameRate is -1, check on the current frame rate value * setting is performed. * * @param params CameraParameters to retrieve the information * @param the target video frame rate to check against * @return OK if no error. */ status_t CameraSource::checkFrameRate( const CameraParameters& params, int32_t frameRate) { ALOGV("checkFrameRate"); int32_t frameRateActual = params.getPreviewFrameRate(); if (frameRateActual < 0) { ALOGE("Failed to retrieve preview frame rate (%d)", frameRateActual); return UNKNOWN_ERROR; } // Check the actual video frame rate against the target/requested // video frame rate. #ifndef HTC_3D_SUPPORT // HTC uses invalid frame rates intentionally on the 3D camera if (frameRate != -1 && (frameRateActual - frameRate) != 0) { ALOGE("Failed to set preview frame rate to %d fps. The actual " "frame rate is %d", frameRate, frameRateActual); return UNKNOWN_ERROR; } #endif // Good now. mVideoFrameRate = frameRateActual; return OK; }
status_t CameraHardware::setParameters(const CameraParameters& params) { Mutex::Autolock lock(mLock); int width = 0; int height = 0; int framerate = 0; params.getPreviewSize(&width,&height); LOGD("Set Parameter...!! "); LOGD("PreviewFormat %s", params.getPreviewFormat()); if ( params.getPreviewFormat() != NULL ) { if (strcmp(params.getPreviewFormat(), (const char *) CameraParameters::PIXEL_FORMAT_YUV422SP) != 0) { LOGE("Only yuv422sp preview is supported"); return -EINVAL; } } LOGD("PictureFormat %s", params.getPictureFormat()); if ( params.getPictureFormat() != NULL ) { if (strcmp(params.getPictureFormat(), (const char *) CameraParameters::PIXEL_FORMAT_JPEG) != 0) { LOGE("Only jpeg still pictures are supported"); return -EINVAL; } } /* validate preview size */ params.getPreviewSize(&width, &height); LOGD("preview width:%d,height:%d",width,height); if ( validateSize(width, height, supportedPreviewRes, ARRAY_SIZE(supportedPreviewRes)) == false ) { LOGE("Preview size not supported"); return -EINVAL; } /* validate picture size */ params.getPictureSize(&width, &height); LOGD("picture width:%d,height:%d",width,height); if (validateSize(width, height, supportedPictureRes, ARRAY_SIZE(supportedPictureRes)) == false ) { LOGE("Picture size not supported"); return -EINVAL; } framerate = params.getPreviewFrameRate(); LOGD("FRAMERATE %d", framerate); mParameters = params; mParameters.getPictureSize(&width, &height); LOGD("Picture Size by CamHAL %d x %d", width, height); mParameters.getPreviewSize(&width, &height); LOGD("Preview Resolution by CamHAL %d x %d", width, height); return NO_ERROR; }
/* * Check the requested frame rate has been successfully configured or not. * If the target frameRate is -1, check on the current frame rate value * setting is performed. * * @param params CameraParameters to retrieve the information * @param the target video frame rate to check against * @return OK if no error. */ status_t CameraSource::checkFrameRate( const CameraParameters& params, int32_t frameRate) { ALOGV("checkFrameRate"); int32_t frameRateActual = params.getPreviewFrameRate(); if (frameRateActual < 0) { ALOGE("Failed to retrieve preview frame rate (%d)", frameRateActual); return UNKNOWN_ERROR; } // Check the actual video frame rate against the target/requested // video frame rate. if (frameRate != -1 && (frameRateActual - frameRate) != 0) { ALOGE("Failed to set preview frame rate to %d fps. The actual " "frame rate is %d", frameRate, frameRateActual); return UNKNOWN_ERROR; } // Good now. mVideoFrameRate = frameRateActual; return OK; }
double CameraHandler::getProperty(int propIdx) { LOGD("CameraHandler::getProperty(%d)", propIdx); switch (propIdx) { case ANDROID_CAMERA_PROPERTY_FRAMEWIDTH: { int w,h; params.getPreviewSize(&w, &h); return w; } case ANDROID_CAMERA_PROPERTY_FRAMEHEIGHT: { int w,h; params.getPreviewSize(&w, &h); return h; } case ANDROID_CAMERA_PROPERTY_SUPPORTED_PREVIEW_SIZES_STRING: { cameraPropertySupportedPreviewSizesString = params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES); union {const char* str;double res;} u; memset(&u.res, 0, sizeof(u.res)); u.str = cameraPropertySupportedPreviewSizesString.c_str(); return u.res; } case ANDROID_CAMERA_PROPERTY_PREVIEW_FORMAT_STRING: { const char* fmt = params.get(CameraParameters::KEY_PREVIEW_FORMAT); if (fmt == CameraParameters::PIXEL_FORMAT_YUV422SP) fmt = "yuv422sp"; else if (fmt == CameraParameters::PIXEL_FORMAT_YUV420SP) fmt = "yuv420sp"; else if (fmt == CameraParameters::PIXEL_FORMAT_YUV422I) fmt = "yuv422i"; else if (fmt == CameraParameters::PIXEL_FORMAT_RGB565) fmt = "rgb565"; else if (fmt == CameraParameters::PIXEL_FORMAT_JPEG) fmt = "jpeg"; cameraPropertyPreviewFormatString = fmt; union {const char* str;double res;} u; memset(&u.res, 0, sizeof(u.res)); u.str = cameraPropertyPreviewFormatString.c_str(); return u.res; } case ANDROID_CAMERA_PROPERTY_EXPOSURE: { int exposure = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); return exposure; } case ANDROID_CAMERA_PROPERTY_FPS: { return params.getPreviewFrameRate(); } case ANDROID_CAMERA_PROPERTY_FLASH_MODE: { int flash_mode = getModeNum(CameraHandler::flashModesNames, ANDROID_CAMERA_FLASH_MODES_NUM, params.get(CameraParameters::KEY_FLASH_MODE)); return flash_mode; } case ANDROID_CAMERA_PROPERTY_FOCUS_MODE: { int focus_mode = getModeNum(CameraHandler::focusModesNames, ANDROID_CAMERA_FOCUS_MODES_NUM, params.get(CameraParameters::KEY_FOCUS_MODE)); return focus_mode; } case ANDROID_CAMERA_PROPERTY_WHITE_BALANCE: { int white_balance = getModeNum(CameraHandler::whiteBalanceModesNames, ANDROID_CAMERA_WHITE_BALANCE_MODES_NUM, params.get(CameraParameters::KEY_WHITE_BALANCE)); return white_balance; } case ANDROID_CAMERA_PROPERTY_ANTIBANDING: { int antibanding = getModeNum(CameraHandler::antibandingModesNames, ANDROID_CAMERA_ANTIBANDING_MODES_NUM, params.get(CameraParameters::KEY_ANTIBANDING)); return antibanding; } case ANDROID_CAMERA_PROPERTY_FOCAL_LENGTH: { float focal_length = params.getFloat(CameraParameters::KEY_FOCAL_LENGTH); return focal_length; } case ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_NEAR: { return getFocusDistance(ANDROID_CAMERA_FOCUS_DISTANCE_NEAR_INDEX); } case ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_OPTIMAL: { return getFocusDistance(ANDROID_CAMERA_FOCUS_DISTANCE_OPTIMAL_INDEX); } case ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_FAR: { return getFocusDistance(ANDROID_CAMERA_FOCUS_DISTANCE_FAR_INDEX); } default: LOGW("CameraHandler::getProperty - Unsupported property."); }; return -1; }
NS_IMETHODIMP GonkCameraInputStream::Init(nsACString& aContentType, nsCaptureParams* aParams) { if (XRE_GetProcessType() != GeckoProcessType_Default) return NS_ERROR_NOT_IMPLEMENTED; mContentType = aContentType; mWidth = aParams->width; mHeight = aParams->height; mCamera = aParams->camera; PRUint32 maxNumCameras = getNumberOfCameras(); if (maxNumCameras == 0) return NS_ERROR_FAILURE; if (mCamera >= maxNumCameras) mCamera = 0; mHardware = CameraHardwareInterface::openCamera(mCamera); if (!mHardware) return NS_ERROR_FAILURE; mHardware->setCallbacks(NULL, GonkCameraInputStream::DataCallback, NULL, this); mHardware->enableMsgType(CAMERA_MSG_PREVIEW_FRAME); CameraParameters params = mHardware->getParameters(); printf_stderr("Preview format : %s\n", params.get(params.KEY_SUPPORTED_PREVIEW_FORMATS)); Vector<Size> previewSizes; params.getSupportedPreviewSizes(previewSizes); // find the available preview size closest to the requested size. PRUint32 minSizeDelta = PR_UINT32_MAX; PRUint32 bestWidth = mWidth; PRUint32 bestHeight = mHeight; for (PRUint32 i = 0; i < previewSizes.size(); i++) { Size size = previewSizes[i]; PRUint32 delta = abs(size.width * size.height - mWidth * mHeight); if (delta < minSizeDelta) { minSizeDelta = delta; bestWidth = size.width; bestHeight = size.height; } } mWidth = bestWidth; mHeight = bestHeight; params.setPreviewSize(mWidth, mHeight); // try to set preferred image format params.setPreviewFormat("yuv420p"); params.setPreviewFrameRate(mFps); mHardware->setParameters(params); params = mHardware->getParameters(); mFps = params.getPreviewFrameRate(); mIs420p = !strcmp(params.getPreviewFormat(), "yuv420p"); mHardware->startPreview(); mClosed = false; return NS_OK; }
status_t TVINDevice::setParameters(CameraParameters& params) { int w, h; int framerate, local_framerate; int max_zoom, zoom, max_fps, min_fps; char tmp[128]; Mutex::Autolock lock(mLock); max_zoom = params.getInt(CameraParameters::KEY_MAX_ZOOM); zoom = params.getInt(CameraParameters::KEY_ZOOM); if (zoom > max_zoom) { FLOGE("Invalid zoom setting, zoom %d, max zoom %d", zoom, max_zoom); return BAD_VALUE; } if (!((strcmp(params.getPreviewFormat(), "yuv420sp") == 0) || (strcmp(params.getPreviewFormat(), "yuv420p") == 0) || (strcmp(params.getPreviewFormat(), "yuv422i-yuyv") == 0))) { FLOGE("Only yuv420sp or yuv420pis supported, but input format is %s", params.getPreviewFormat()); return BAD_VALUE; } if (strcmp(params.getPictureFormat(), "jpeg") != 0) { FLOGE("Only jpeg still pictures are supported"); return BAD_VALUE; } params.getPreviewSize(&w, &h); sprintf(tmp, "%dx%d", w, h); FLOGI("Set preview size: %s", tmp); if (strstr(mSupportedPreviewSizes, tmp) == NULL) { FLOGE("The preview size w %d, h %d is not corrected", w, h); return BAD_VALUE; } params.getPictureSize(&w, &h); sprintf(tmp, "%dx%d", w, h); FLOGI("Set picture size: %s", tmp); if (strstr(mSupportedPictureSizes, tmp) == NULL) { FLOGE("The picture size w %d, h %d is not corrected", w, h); return BAD_VALUE; } local_framerate = mParams.getPreviewFrameRate(); FLOGI("get local frame rate:%d FPS", local_framerate); if ((local_framerate > 30) || (local_framerate < 0)) { FLOGE("The framerate is not corrected"); local_framerate = 15; } framerate = params.getPreviewFrameRate(); FLOGI("Set frame rate:%d FPS", framerate); if ((framerate > 30) || (framerate < 0)) { FLOGE("The framerate is not corrected"); return BAD_VALUE; } else if (local_framerate != framerate) { if (framerate == 15) { params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "12000,17000"); } else if (framerate == 30) { params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "25000,33000"); } } int actual_fps = 15; params.getPreviewFpsRange(&min_fps, &max_fps); FLOGI("FPS range: %d - %d", min_fps, max_fps); if ((max_fps < 1000) || (min_fps < 1000) || (max_fps > 33000) || (min_fps > 33000)) { FLOGE("The fps range from %d to %d is error", min_fps, max_fps); return BAD_VALUE; } actual_fps = min_fps > 15000 ? 30 : 15; FLOGI("setParameters: actual_fps=%d", actual_fps); params.setPreviewFrameRate(actual_fps); mParams = params; return NO_ERROR; }