Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 731adc40 authored by Steve Kondik's avatar Steve Kondik
Browse files

cameraservice: Changes for using overlay on 7X30

  * Handle NULL instance of camera HAL
  * Use YCbCr_420_SP overlay format
  * Properly destroy overlay before starting new snapshot

Change-Id: Ie72552f508f1fdc818928bf5329640b3fb9f9673
parent 39215374
Loading
Loading
Loading
Loading
+46 −26
Original line number Diff line number Diff line
@@ -158,6 +158,11 @@ sp<ICamera> CameraService::connect(const sp<ICameraClient>& cameraClient)
    // create a new Client object
    client = new Client(this, cameraClient, callingPid);
    mClient = client;
    if (client->mHardware == NULL) {
        client = NULL;
        mClient = NULL;
        return client;
    }
#if DEBUG_CLIENT_REFERENCES
    // Enable tracking for this object, and track increments and decrements of
    // the refcount.
@@ -239,6 +244,7 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,
    mCameraClient = cameraClient;
    mClientPid = clientPid;
    mHardware = openCameraHardware();
    if (mHardware != NULL) {
        mUseOverlay = mHardware->useOverlay();

        mHardware->setCallbacks(notifyCallback,
@@ -260,6 +266,7 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,
        mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP;
        mOrientation = 0;
        cameraService->incUsers();
    }
    LOGV("Client::Client X (pid %d)", callingPid);
}

@@ -439,6 +446,10 @@ void CameraService::Client::disconnect()
    // Release the held overlay resources.
    if (mUseOverlay)
    {
        /* Release previous overlay handle */
        if (mOverlay != NULL) {
            mOverlay->destroy();
        }
        mOverlayRef = 0;
    }
    mHardware.clear();
@@ -479,9 +490,11 @@ status_t CameraService::Client::setPreviewDisplay(const sp<ISurface>& surface)
        mOverlayRef = 0;
        // If preview has been already started, set overlay or register preview
        // buffers now.
        if (mHardware->previewEnabled()) {
        if (mHardware->previewEnabled() || mUseOverlay) {
            if (mUseOverlay) {
                if (mSurface != NULL) {
                  result = setOverlay();
                }
            } else if (mSurface != 0) {
                result = registerPreviewBuffers();
            }
@@ -590,6 +603,9 @@ status_t CameraService::Client::setOverlay()
        sp<Overlay> dummy;
        mHardware->setOverlay( dummy );
        mOverlayRef = 0;
        if (mOverlay != NULL) {
            mOverlay->destroy();
        }
    }

    status_t ret = NO_ERROR;
@@ -603,7 +619,7 @@ status_t CameraService::Client::setOverlay()
            // wait in the createOverlay call if the previous overlay is in the
            // process of being destroyed.
            for (int retry = 0; retry < 50; ++retry) {
                mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_DEFAULT,
                mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_YCbCr_420_SP,
                                                      mOrientation);
                if (mOverlayRef != NULL) break;
                LOGW("Overlay create failed - retrying");
@@ -614,7 +630,8 @@ status_t CameraService::Client::setOverlay()
                LOGE("Overlay Creation Failed!");
                return -EINVAL;
            }
            ret = mHardware->setOverlay(new Overlay(mOverlayRef));
            mOverlay = new Overlay(mOverlayRef);
            ret = mHardware->setOverlay(mOverlay);
        }
    } else {
        ret = mHardware->setOverlay(NULL);
@@ -676,8 +693,8 @@ status_t CameraService::Client::startPreviewMode()
        if (mSurface != 0) {
            ret = setOverlay();
        }
        if (ret != NO_ERROR) return ret;
        ret = mHardware->startPreview();
        if (ret != NO_ERROR) return ret;
    } else {
        mHardware->enableMsgType(CAMERA_MSG_PREVIEW_FRAME);
        ret = mHardware->startPreview();
@@ -740,6 +757,9 @@ void CameraService::Client::stopPreview()

        if (mSurface != 0 && !mUseOverlay) {
            mSurface->unregisterBuffers();
        } else {
          mOverlayW = 0;
          mOverlayH = 0;
        }
    }

+1 −0
Original line number Diff line number Diff line
@@ -199,6 +199,7 @@ private:
                    bool                        mUseOverlay;

                    sp<OverlayRef>              mOverlayRef;
                    sp<Overlay>                 mOverlay;
                    int                         mOverlayW;
                    int                         mOverlayH;