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

Commit 65fd231a authored by Steve Kondik's avatar Steve Kondik
Browse files

cameraservice: Use default overlay format unless flag set.

Also destroy previous overlay and handle NULL instance.

Define BOARD_OVERLAY_FORMAT_YCbCr_420_SP for 7X30.

Change-Id: Ib2ca5e17aecd8d19841c0357594b3c4fed0a01d6
parent aad9f21a
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -68,6 +68,10 @@ ifeq ($(TARGET_SIMULATOR),true)
LOCAL_CFLAGS += -DSINGLE_PROCESS
endif

ifeq ($(BOARD_OVERLAY_FORMAT_YCbCr_420_SP),true)
LOCAL_CFLAGS += -DUSE_OVERLAY_FORMAT_YCbCr_420_SP
endif

ifeq ($(USE_CAMERA_STUB), true)
LOCAL_STATIC_LIBRARIES += libcamerastub
LOCAL_CFLAGS += -include CameraHardwareStub.h
+31 −1
Original line number Diff line number Diff line
@@ -158,11 +158,13 @@ sp<ICamera> CameraService::connect(const sp<ICameraClient>& cameraClient)
    // create a new Client object
    client = new Client(this, cameraClient, callingPid);
    mClient = client;
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
    if (client->mHardware == NULL) {
        client = NULL;
        mClient = NULL;
        return client;
    }
#endif
#if DEBUG_CLIENT_REFERENCES
    // Enable tracking for this object, and track increments and decrements of
    // the refcount.
@@ -244,7 +246,9 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,
    mCameraClient = cameraClient;
    mClientPid = clientPid;
    mHardware = openCameraHardware();
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
    if (mHardware != NULL) {
#endif
        mUseOverlay = mHardware->useOverlay();

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

@@ -446,10 +452,12 @@ void CameraService::Client::disconnect()
    // Release the held overlay resources.
    if (mUseOverlay)
    {
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
        /* Release previous overlay handle */
        if (mOverlay != NULL) {
            mOverlay->destroy();
        }
#endif
        mOverlayRef = 0;
    }
    mHardware.clear();
@@ -492,9 +500,13 @@ status_t CameraService::Client::setPreviewDisplay(const sp<ISurface>& surface)
        // buffers now.
        if (mHardware->previewEnabled() || mUseOverlay) {
            if (mUseOverlay) {
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
                if (mSurface != NULL) {
                  result = setOverlay();
                }
#else
       		  result = setOverlay();
#endif
            } else if (mSurface != 0) {
                result = registerPreviewBuffers();
            }
@@ -603,9 +615,11 @@ status_t CameraService::Client::setOverlay()
        sp<Overlay> dummy;
        mHardware->setOverlay( dummy );
        mOverlayRef = 0;
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
        if (mOverlay != NULL) {
            mOverlay->destroy();
        }
#endif
    }

    status_t ret = NO_ERROR;
@@ -619,7 +633,12 @@ 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_YCbCr_420_SP,
                mOverlayRef = mSurface->createOverlay(w, h, 
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
                                                      OVERLAY_FORMAT_YCbCr_420_SP,
#else
                                                      OVERLAY_FORMAT_DEFAULT,
#endif
                                                      mOrientation);
                if (mOverlayRef != NULL) break;
                LOGW("Overlay create failed - retrying");
@@ -630,8 +649,12 @@ status_t CameraService::Client::setOverlay()
                LOGE("Overlay Creation Failed!");
                return -EINVAL;
            }
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
            mOverlay = new Overlay(mOverlayRef);
            ret = mHardware->setOverlay(mOverlay);
#else
            ret = mHardware->setOverlay(new Overlay(mOverlayRef));
#endif
        }
    } else {
        ret = mHardware->setOverlay(NULL);
@@ -693,8 +716,13 @@ status_t CameraService::Client::startPreviewMode()
        if (mSurface != 0) {
            ret = setOverlay();
        }
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
        ret = mHardware->startPreview();
#endif
        if (ret != NO_ERROR) return ret;
#ifndef USE_OVERLAY_FORMAT_YCbCr_420_SP
        ret = mHardware->startPreview();
#endif
    } else {
        mHardware->enableMsgType(CAMERA_MSG_PREVIEW_FRAME);
        ret = mHardware->startPreview();
@@ -770,9 +798,11 @@ void CameraService::Client::stopPreview()

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

+2 −0
Original line number Diff line number Diff line
@@ -200,7 +200,9 @@ private:
                    bool                        mUseOverlay;

                    sp<OverlayRef>              mOverlayRef;
#ifdef USE_OVERLAY_FORMAT_YCbCr_420_SP
                    sp<Overlay>                 mOverlay;
#endif
                    int                         mOverlayW;
                    int                         mOverlayH;