From ff86f37b95327538b97b6b8ef5d3c6ed0cd7f902 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Mon, 18 Jul 2011 16:15:08 -0700 Subject: use SurfaceTexture new scaling mode in SF SF now obeys SurfaceTexture's scaling mode instead of inferring it from the buffer's size Change-Id: I4d50e9851abedd7e64bfcfc8af9eefb9fb668529 --- libs/gui/SurfaceTexture.cpp | 2 +- libs/gui/SurfaceTextureClient.cpp | 2 +- media/libstagefright/ACodec.cpp | 7 +++++++ media/libstagefright/OMXCodec.cpp | 7 +++++++ .../colorconversion/SoftwareRenderer.cpp | 5 +++++ services/camera/libcameraservice/CameraService.cpp | 4 ++++ services/surfaceflinger/Layer.cpp | 20 +++++++++----------- services/surfaceflinger/Layer.h | 4 +--- services/surfaceflinger/SurfaceTextureLayer.cpp | 3 --- 9 files changed, 35 insertions(+), 19 deletions(-) diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index cc9f461..3ab6c79 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -545,7 +545,7 @@ status_t SurfaceTexture::disconnect(int api) { } status_t SurfaceTexture::setScalingMode(int mode) { - LOGV("SurfaceTexture::setScalingMode"); + LOGV("SurfaceTexture::setScalingMode(%d)", mode); switch (mode) { case NATIVE_WINDOW_SCALING_MODE_FREEZE: diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index fec80ef..68475e9 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -466,7 +466,7 @@ int SurfaceTextureClient::setBuffersFormat(int format) int SurfaceTextureClient::setScalingMode(int mode) { - LOGV("SurfaceTextureClient::setScalingMode"); + LOGV("SurfaceTextureClient::setScalingMode(%d)", mode); Mutex::Autolock lock(mMutex); // mode is validated on the server status_t err = mSurfaceTexture->setScalingMode(mode); diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index d4d07b2..174ec92 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -445,6 +445,13 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() { return err; } + err = native_window_set_scaling_mode(mNativeWindow.get(), + NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); + + if (err != OK) { + return err; + } + err = native_window_set_buffers_geometry( mNativeWindow.get(), def.format.video.nFrameWidth, diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 4f8336e..7bcbdcf 100755 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -1765,6 +1765,13 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() { return err; } + err = native_window_set_scaling_mode(mNativeWindow.get(), + NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); + + if (err != OK) { + return err; + } + err = native_window_set_buffers_geometry( mNativeWindow.get(), def.format.video.nFrameWidth, diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp index a4ca32d..3246021 100644 --- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp +++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp @@ -93,6 +93,11 @@ SoftwareRenderer::SoftwareRenderer( GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP)); + CHECK_EQ(0, + native_window_set_scaling_mode( + mNativeWindow.get(), + NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)); + // Width must be multiple of 32??? CHECK_EQ(0, native_window_set_buffers_geometry( mNativeWindow.get(), diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 0eff776..637ccd8 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -536,6 +536,8 @@ status_t CameraService::Client::setPreviewWindow(const sp& binder, // If preview has been already started, register preview buffers now. if (mHardware->previewEnabled()) { if (window != 0) { + native_window_set_scaling_mode(window.get(), + NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); native_window_set_buffers_transform(window.get(), mOrientation); result = mHardware->setPreviewWindow(window); } @@ -642,6 +644,8 @@ status_t CameraService::Client::startPreviewMode() { } if (mPreviewWindow != 0) { + native_window_set_scaling_mode(mPreviewWindow.get(), + NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); native_window_set_buffers_transform(mPreviewWindow.get(), mOrientation); } diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index f3b6c4d..c29aeca 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -56,14 +56,14 @@ Layer::Layer(SurfaceFlinger* flinger, mTextureName(-1U), mQueuedFrames(0), mCurrentTransform(0), + mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), mCurrentOpacity(true), mFormat(PIXEL_FORMAT_NONE), mGLExtensions(GLExtensions::getInstance()), mOpaqueLayer(true), mNeedsDithering(false), mSecure(false), - mProtectedByApp(false), - mFixedSize(false) + mProtectedByApp(false) { mCurrentCrop.makeInvalid(); glGenTextures(1, &mTextureName); @@ -400,14 +400,7 @@ uint32_t Layer::doTransaction(uint32_t flags) } bool Layer::isFixedSize() const { - Mutex::Autolock _l(mLock); - return mFixedSize; -} - -void Layer::setFixedSize(bool fixedSize) -{ - Mutex::Autolock _l(mLock); - mFixedSize = fixedSize; + return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; } bool Layer::isCropped() const { @@ -437,9 +430,14 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) const Rect crop(mSurfaceTexture->getCurrentCrop()); const uint32_t transform(mSurfaceTexture->getCurrentTransform()); - if ((crop != mCurrentCrop) || (transform != mCurrentTransform)) { + const uint32_t scalingMode(mSurfaceTexture->getCurrentScalingMode()); + if ((crop != mCurrentCrop) || + (transform != mCurrentTransform) || + (scalingMode != mCurrentScalingMode)) + { mCurrentCrop = crop; mCurrentTransform = transform; + mCurrentScalingMode = scalingMode; mFlinger->invalidateHwcGeometry(); } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index e3fc13d..ddfc666 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -59,7 +59,6 @@ public: status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags=0); - // Set this Layer's buffers size bool isFixedSize() const; // LayerBase interface @@ -88,7 +87,6 @@ private: void onFrameQueued(); virtual sp createSurface(); uint32_t getEffectiveUsage(uint32_t usage) const; - void setFixedSize(bool fixedSize); bool isCropped() const; static bool getOpacityForFormat(uint32_t format); @@ -106,6 +104,7 @@ private: GLfloat mTextureMatrix[16]; Rect mCurrentCrop; uint32_t mCurrentTransform; + uint32_t mCurrentScalingMode; bool mCurrentOpacity; // constants @@ -124,7 +123,6 @@ private: // binder thread, transaction thread mutable Mutex mLock; - bool mFixedSize; }; // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp index 60fa965..a586d59 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ b/services/surfaceflinger/SurfaceTextureLayer.cpp @@ -64,9 +64,6 @@ status_t SurfaceTextureLayer::dequeueBuffer(int *buf, //LOGD("%s, w=%u, h=%u, format=%u, usage=%08x, effectiveUsage=%08x", // __PRETTY_FUNCTION__, w, h, format, usage, effectiveUsage); res = SurfaceTexture::dequeueBuffer(buf, w, h, format, effectiveUsage); - if (res == NO_ERROR) { - layer->setFixedSize(w && h); - } } return res; } -- cgit v1.1