/** * Thread function that initializes the camera */ status_t CaptureCommand::initThreadCamera() { // Setup the camera int cameraId = 0; mCamera = Camera::connect(cameraId, String16(CAMERA_NAME), Camera::USE_CALLING_UID); if (mCamera == NULL) { ALOGE("Unable to connect to camera"); return -1; } mRemote = mCamera->remote(); FaceDetection faces(&mChannel); mCamera->setListener(&faces); { char previewSize[80]; snprintf(previewSize, sizeof(previewSize), "%dx%d", sVideoSize.width, sVideoSize.height); CameraParameters params = mCamera->getParameters(); params.set(CameraParameters::KEY_PREVIEW_SIZE, previewSize); params.set(CameraParameters::KEY_PREVIEW_FORMAT, "yuv420sp"); status_t err = mCamera->setParameters(params.flatten()); CHECK(err == 0); params = mCamera->getParameters(); params.dump(); } sOpenCVCameraCapture->setPreviewProducerListener(this); CHECK(setPreviewTarget() == 0); //CHECK(mCamera->sendCommand(CAMERA_CMD_START_FACE_DETECTION, CAMERA_FACE_DETECTION_SW, 0) == 0); CHECK(mCamera->sendCommand(CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG, 1, 0) == 0); mCameraSource = CameraSource::CreateFromCamera(mRemote, mCamera->getRecordingProxy(), cameraId, String16(CAMERA_NAME, strlen(CAMERA_NAME)), Camera::USE_CALLING_UID, sVideoSize, sFPS, NULL, sUseMetaDataMode); CHECK_EQ(mCameraSource->initCheck(), ::OK); if (sInitCameraVideo) { mLooper = new ALooper; mLooper->setName("capture-looper"); mLooper->start(); sp<MediaSource> videoEncoder = prepareVideoEncoder(mLooper, mCameraSource); sp<MediaSource> audioSource( new AudioSource( AUDIO_SOURCE_MIC, #ifdef TARGET_GE_MARSHMALLOW String16("silk-capture"), #endif sAudioSampleRate, sAudioChannels ) ); sp<MediaSource> audioSourceEmitter = new AudioSourceEmitter(&mChannel, audioSource); sp<MediaSource> audioMutter = new AudioMutter(audioSourceEmitter); sp<MediaSource> audioEncoder = prepareAudioEncoder(mLooper, audioMutter); mSegmenter = new MPEG4SegmenterDASH(videoEncoder, audioEncoder, &mChannel); mSegmenter->run(); mHardwareActive = true; notifyCameraEvent("initialized"); // Block this thread while camera is running mSegmenter->join(); } else { pthread_create(&mAudioThread, NULL, initThreadAudioOnlyWrapper, this); CHECK_EQ(mCameraSource->start(), ::OK); MediaSourceNullPuller cameraPuller(mCameraSource, "camera"); if (!cameraPuller.loop()) { notifyCameraEvent("error"); } } sOpenCVCameraCapture->setPreviewProducerListener(NULL); return 0; }