status_t StagefrightRecorder::setupCameraSource() { clipVideoBitRate(); clipVideoFrameRate(); clipVideoFrameWidth(); clipVideoFrameHeight(); int64_t token = IPCThreadState::self()->clearCallingIdentity(); if (mCamera == 0) { mCamera = Camera::connect(mCameraId); if (mCamera == 0) { LOGE("Camera connection could not be established."); return -EBUSY; } mFlags &= ~FLAGS_HOT_CAMERA; mCamera->lock(); } // Set the actual video recording frame size CameraParameters params(mCamera->getParameters()); params.setPreviewSize(mVideoWidth, mVideoHeight); params.setPreviewFrameRate(mFrameRate); String8 s = params.flatten(); if (OK != mCamera->setParameters(s)) { LOGE("Could not change settings." " Someone else is using camera %d?", mCameraId); return -EBUSY; } CameraParameters newCameraParams(mCamera->getParameters()); // Check on video frame size int frameWidth = 0, frameHeight = 0; newCameraParams.getPreviewSize(&frameWidth, &frameHeight); if (frameWidth < 0 || frameWidth != mVideoWidth || frameHeight < 0 || frameHeight != mVideoHeight) { LOGE("Failed to set the video frame size to %dx%d", mVideoWidth, mVideoHeight); IPCThreadState::self()->restoreCallingIdentity(token); return UNKNOWN_ERROR; } // Check on video frame rate int frameRate = newCameraParams.getPreviewFrameRate(); if (frameRate < 0 || (frameRate - mFrameRate) != 0) { LOGE("Failed to set frame rate to %d fps. The actual " "frame rate is %d", mFrameRate, frameRate); } // This CHECK is good, since we just passed the lock/unlock // check earlier by calling mCamera->setParameters(). CHECK_EQ(OK, mCamera->setPreviewDisplay(mPreviewSurface)); IPCThreadState::self()->restoreCallingIdentity(token); return OK; }
status_t CameraSource::initWithCameraAccess( const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy, int32_t cameraId, const String16& clientName, uid_t clientUid, Size videoSize, int32_t frameRate, bool storeMetaDataInVideoBuffers) { ALOGV("initWithCameraAccess"); status_t err = OK; if ((err = isCameraAvailable(camera, proxy, cameraId, clientName, clientUid)) != OK) { ALOGE("Camera connection could not be established."); return err; } CameraParameters params(mCamera->getParameters()); if ((err = isCameraColorFormatSupported(params)) != OK) { return err; } // Set the camera to use the requested video frame size // and/or frame rate. if ((err = configureCamera(¶ms, videoSize.width, videoSize.height, frameRate))) { return err; } // Check on video frame size and frame rate. CameraParameters newCameraParams(mCamera->getParameters()); if ((err = checkVideoSize(newCameraParams, videoSize.width, videoSize.height)) != OK) { return err; } if ((err = checkFrameRate(newCameraParams, frameRate)) != OK) { return err; } // Set the preview display. Skip this if mSurface is null because // applications may already set a surface to the camera. if (mSurface != NULL) { // This CHECK is good, since we just passed the lock/unlock // check earlier by calling mCamera->setParameters(). CHECK_EQ((status_t)OK, mCamera->setPreviewTarget(mSurface)); } // By default, do not store metadata in video buffers mIsMetaDataStoredInVideoBuffers = false; mCamera->storeMetaDataInBuffers(false); if (storeMetaDataInVideoBuffers) { if (OK == mCamera->storeMetaDataInBuffers(true)) { mIsMetaDataStoredInVideoBuffers = true; } } int64_t glitchDurationUs = (1000000LL / mVideoFrameRate); if (glitchDurationUs > mGlitchDurationThresholdUs) { mGlitchDurationThresholdUs = glitchDurationUs; } // XXX: query camera for the stride and slice height // when the capability becomes available. mMeta = new MetaData; mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); mMeta->setInt32(kKeyColorFormat, mColorFormat); mMeta->setInt32(kKeyWidth, mVideoSize.width); mMeta->setInt32(kKeyHeight, mVideoSize.height); mMeta->setInt32(kKeyStride, mVideoSize.width); mMeta->setInt32(kKeySliceHeight, mVideoSize.height); mMeta->setInt32(kKeyFrameRate, mVideoFrameRate); return OK; }
status_t CedarXRecorder::prepare() { LOGV("prepare"); int ret = OK; VIDEOINFO_t vInfo; AUDIOINFO_t aInfo; // Create audio recorder if (mRecModeFlag & RECORDER_MODE_AUDIO) { ret = CreateAudioRecorder(); if (ret != OK) { LOGE("CreateAudioRecorder failed"); return ret; } } // set recorder mode to CDX_Recorder CDXRecorder_Control(CDX_CMD_SET_REC_MODE, mRecModeFlag, 0); // create CedarX component ret = CDXRecorder_Control(CDX_CMD_PREPARE, 0, 0); if( ret == -1) { printf("CEDARX REPARE ERROR!\n"); return UNKNOWN_ERROR; } // register callback CDXRecorder_Control(CDX_CMD_REGISTER_CALLBACK, (unsigned int)&CedarXRecorderCallbackWrapper, (unsigned int)this); // set file handle to CDX_Recorder render component ret = CDXRecorder_Control(CDX_CMD_SET_SAVE_FILE, (unsigned int)mOutputFd, 0); if(ret != OK) { LOGE("CedarXRecorder::prepare, CDX_CMD_SET_SAVE_FILE failed\n"); return ret; } int64_t token = IPCThreadState::self()->clearCallingIdentity(); // Set the actual video recording frame size CameraParameters params(mCamera->getParameters()); params.setPreviewSize(mVideoWidth, mVideoHeight); String8 s = params.flatten(); if (OK != mCamera->setParameters(s)) { LOGE("Could not change settings." " Someone else is using camera %d?", mCameraId); IPCThreadState::self()->restoreCallingIdentity(token); return -EBUSY; } CameraParameters newCameraParams(mCamera->getParameters()); // Check on video frame size int srcWidth = 0, srcHeight = 0; newCameraParams.getPreviewSize(&srcWidth, &srcHeight); if (srcWidth == 0 || srcHeight == 0) { LOGE("Failed to set the video frame size to %dx%d", mVideoWidth, mVideoHeight); IPCThreadState::self()->restoreCallingIdentity(token); return UNKNOWN_ERROR; } IPCThreadState::self()->restoreCallingIdentity(token); LOGV("src: %dx%d, video: %dx%d", srcWidth, srcHeight, mVideoWidth, mVideoHeight); // set video size and FrameRate to CDX_Recorder memset((void *)&vInfo, 0, sizeof(VIDEOINFO_t)); #if 0 vInfo.src_width = 176; vInfo.src_height = 144; vInfo.width = 160; // mVideoWidth; vInfo.height = 120; // mVideoHeight; vInfo.frameRate = 30*1000; // mFrameRate; vInfo.bitRate = 200000; // mVideoBitRate; vInfo.profileIdc = 66; vInfo.levelIdc = 31; #else vInfo.src_width = srcWidth; vInfo.src_height = srcHeight; vInfo.width = mVideoWidth; vInfo.height = mVideoHeight; vInfo.frameRate = mFrameRate*1000; vInfo.bitRate = mVideoBitRate; vInfo.profileIdc = 66; vInfo.levelIdc = 31; #endif if (mVideoWidth == 0 || mVideoHeight == 0 || mFrameRate == 0 || mVideoBitRate == 0) { LOGE("error video para"); return -1; } ret = CDXRecorder_Control(CDX_CMD_SET_VIDEO_INFO, (unsigned int)&vInfo, 0); if(ret != OK) { LOGE("CedarXRecorder::prepare, CDX_CMD_SET_VIDEO_INFO failed\n"); return ret; } if (mRecModeFlag & RECORDER_MODE_AUDIO) { // set audio parameters memset((void*)&aInfo, 0, sizeof(AUDIOINFO_t)); aInfo.bitRate = mAudioBitRate; aInfo.channels = mAudioChannels; aInfo.sampleRate = mSampleRate; aInfo.bitsPerSample = 16; if (mAudioBitRate == 0 || mAudioChannels == 0 || mSampleRate == 0) { LOGE("error audio para"); return -1; } ret = CDXRecorder_Control(CDX_CMD_SET_AUDIO_INFO, (unsigned int)&aInfo, 0); if(ret != OK) { LOGE("CedarXRecorder::prepare, CDX_CMD_SET_AUDIO_INFO failed\n"); return ret; } } return OK; }
status_t CameraSource::initWithCameraAccess( const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy, int32_t cameraId, Size videoSize, int32_t frameRate, bool storeMetaDataInVideoBuffers) { LOGV("initWithCameraAccess"); status_t err = OK; if ((err = isCameraAvailable(camera, proxy, cameraId)) != OK) { LOGE("Camera connection could not be established."); return err; } CameraParameters params(mCamera->getParameters()); if ((err = isCameraColorFormatSupported(params)) != OK) { return err; } // Set the camera to use the requested video frame size // and/or frame rate. if ((err = configureCamera(¶ms, videoSize.width, videoSize.height, frameRate))) { return err; } // Check on video frame size and frame rate. CameraParameters newCameraParams(mCamera->getParameters()); if ((err = checkVideoSize(newCameraParams, videoSize.width, videoSize.height)) != OK) { return err; } if ((err = checkFrameRate(newCameraParams, frameRate)) != OK) { return err; } // This CHECK is good, since we just passed the lock/unlock // check earlier by calling mCamera->setParameters(). CHECK_EQ(OK, mCamera->setPreviewDisplay(mSurface)); // By default, do not store metadata in video buffers mIsMetaDataStoredInVideoBuffers = false; mCamera->storeMetaDataInBuffers(false); if (storeMetaDataInVideoBuffers) { if (OK == mCamera->storeMetaDataInBuffers(true)) { mIsMetaDataStoredInVideoBuffers = true; } } #ifdef QCOM_HARDWARE const char *hfr_str = params.get("video-hfr"); int32_t hfr = -1; if ( hfr_str != NULL ) { hfr = atoi(hfr_str); } if(hfr < 0) { LOGW("Invalid hfr value(%d) set from app. Disabling HFR.", hfr); hfr = 0; } #endif int64_t glitchDurationUs = (1000000LL / mVideoFrameRate); if (glitchDurationUs > mGlitchDurationThresholdUs) { mGlitchDurationThresholdUs = glitchDurationUs; } // XXX: query camera for the stride and slice height // when the capability becomes available. #ifdef STE_HARDWARE int stride = newCameraParams.getInt(CameraParameters::KEY_RECORD_STRIDE); int sliceHeight = newCameraParams.getInt(CameraParameters::KEY_RECORD_SLICE_HEIGHT); #endif mMeta = new MetaData; mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); mMeta->setInt32(kKeyColorFormat, mColorFormat); mMeta->setInt32(kKeyWidth, mVideoSize.width); mMeta->setInt32(kKeyHeight, mVideoSize.height); #ifndef STE_HARDWARE mMeta->setInt32(kKeyStride, mVideoSize.width); mMeta->setInt32(kKeySliceHeight, mVideoSize.height); #else mMeta->setInt32(kKeyStride, stride != -1 ? stride : mVideoSize.width); mMeta->setInt32(kKeySliceHeight, sliceHeight != -1 ? sliceHeight : mVideoSize.height); #endif mMeta->setInt32(kKeyFrameRate, mVideoFrameRate); #ifdef QCOM_HARDWARE mMeta->setInt32(kKeyHFR, hfr); #endif return OK; }