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

Commit 52e7200b authored by Chih-Chung Chang's avatar Chih-Chung Chang
Browse files

Add an orientation parameter for overlay, so we can do camera preview in portrait mode.

parent d28d5be7
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -235,6 +235,7 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,

    // Callback is disabled by default
    mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP;
    mOrientation = 0;
    cameraService->incUsers();
    LOGV("Client::Client X (pid %d)", callingPid);
}
@@ -570,7 +571,8 @@ 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_DEFAULT,
                                                      mOrientation);
                if (mOverlayRef != NULL) break;
                LOGW("Overlay create failed - retrying");
                usleep(20000);
@@ -601,15 +603,9 @@ status_t CameraService::Client::registerPreviewBuffers()
    CameraParameters params(mHardware->getParameters());
    params.getPreviewSize(&w, &h);

    uint32_t transform = 0;
    if (params.getOrientation() ==
        CameraParameters::CAMERA_ORIENTATION_PORTRAIT) {
      LOGV("portrait mode");
      transform = ISurface::BufferHeap::ROT_90;
    }
    ISurface::BufferHeap buffers(w, h, w, h,
                                 PIXEL_FORMAT_YCbCr_420_SP,
                                 transform,
                                 mOrientation,
                                 0,
                                 mHardware->getPreviewHeap());

@@ -919,12 +915,6 @@ void CameraService::Client::handleShutter(
    if (mSurface != 0 && !mUseOverlay) {
        int w, h;
        CameraParameters params(mHardware->getParameters());
        uint32_t transform = 0;
        if (params.getOrientation() == CameraParameters::CAMERA_ORIENTATION_PORTRAIT) {
            LOGV("portrait mode");
            transform = ISurface::BufferHeap::ROT_90;
        }

        if (size == NULL) {
            params.getPictureSize(&w, &h);
        } else {
@@ -935,7 +925,7 @@ void CameraService::Client::handleShutter(
            LOGV("Snapshot image width=%d, height=%d", w, h);
        }
        ISurface::BufferHeap buffers(w, h, w, h,
            PIXEL_FORMAT_YCbCr_420_SP, transform, 0, mHardware->getRawHeap());
            PIXEL_FORMAT_YCbCr_420_SP, mOrientation, 0, mHardware->getRawHeap());

        mSurface->registerBuffers(buffers);
    }
@@ -1200,6 +1190,15 @@ status_t CameraService::Client::setParameters(const String8& params)
    }

    CameraParameters p(params);

    // The orientation parameter is actually for CameraService, not for the camera driver.
    if (p.getOrientation() == CameraParameters::CAMERA_ORIENTATION_PORTRAIT) {
        LOGV("portrait mode");
        mOrientation = ISurface::BufferHeap::ROT_90;
    } else {
        mOrientation = 0;
    }

    return mHardware->setParameters(p);
}

+1 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ private:
                    sp<CameraService>           mCameraService;
                    sp<ISurface>                mSurface;
                    int                         mPreviewCallbackFlag;
                    int                         mOrientation;

                    sp<MediaPlayer>             mMediaPlayerClick;
                    sp<MediaPlayer>             mMediaPlayerBeep;
+3 −2
Original line number Diff line number Diff line
@@ -283,7 +283,7 @@ public:
    virtual void postBuffer(ssize_t offset);
    virtual void unregisterBuffers();
    virtual sp<OverlayRef> createOverlay(
            uint32_t w, uint32_t h, int32_t format);
            uint32_t w, uint32_t h, int32_t format, int32_t orientation);
    virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage);

    // new functions
@@ -346,7 +346,8 @@ void MSurface::waitUntil(int c0, int c1, int c2) {
    }
}

sp<OverlayRef> MSurface::createOverlay(uint32_t w, uint32_t h, int32_t format) {
sp<OverlayRef> MSurface::createOverlay(uint32_t w, uint32_t h, int32_t format,
        int32_t orientation) {
    // We don't expect this to be called in current hardware.
    ASSERT(0);
    sp<OverlayRef> dummy;
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ public:
    virtual void unregisterBuffers() = 0;
    
    virtual sp<OverlayRef> createOverlay(
            uint32_t w, uint32_t h, int32_t format) = 0;
            uint32_t w, uint32_t h, int32_t format, int32_t orientation) = 0;
};

// ----------------------------------------------------------------------------
+1 −1
Original line number Diff line number Diff line
@@ -809,7 +809,7 @@ void LayerBaseClient::Surface::unregisterBuffers()
}

sp<OverlayRef> LayerBaseClient::Surface::createOverlay(
        uint32_t w, uint32_t h, int32_t format) 
        uint32_t w, uint32_t h, int32_t format, int32_t orientation)
{
    return NULL;
};
Loading