Loading services/surfaceflinger/RegionSamplingThread.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -119,7 +119,8 @@ float sampleArea(const uint32_t* data, int32_t stride, const Rect& area) { } } // anonymous namespace std::vector<float> sampleBuffer(const sp<GraphicBuffer>& buffer, const Point& leftTop, std::vector<float> RegionSamplingThread::sampleBuffer( const sp<GraphicBuffer>& buffer, const Point& leftTop, const std::vector<RegionSamplingThread::Descriptor>& descriptors) { void* data_raw = nullptr; buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, &data_raw); Loading Loading @@ -150,7 +151,7 @@ void RegionSamplingThread::captureSample() { descriptors.emplace_back(descriptor); } Rect sampledArea = sampleRegion.bounds(); const Rect sampledArea = sampleRegion.bounds(); sp<const DisplayDevice> device = mFlinger.getDefaultDisplayDevice(); DisplayRenderArea renderArea(device, sampledArea, sampledArea.getWidth(), Loading @@ -174,8 +175,8 @@ void RegionSamplingThread::captureSample() { } // Compute the layer's position on the screen Rect bounds = Rect(layer->getBounds()); ui::Transform transform = layer->getTransform(); const Rect bounds = Rect(layer->getBounds()); const ui::Transform transform = layer->getTransform(); constexpr bool roundOutwards = true; Rect transformed = transform.transform(bounds, roundOutwards); Loading Loading @@ -215,7 +216,7 @@ void RegionSamplingThread::captureSample() { // // To avoid this, we drop the mutex while we call into SF. mMutex.unlock(); mFlinger.captureScreenCore(renderArea, traverseLayers, buffer, false); mFlinger.captureScreenCommon(renderArea, traverseLayers, buffer, false); mMutex.lock(); std::vector<Descriptor> activeDescriptors; Loading @@ -229,6 +230,8 @@ void RegionSamplingThread::captureSample() { std::vector<float> lumas = sampleBuffer(buffer, sampledArea.leftTop(), activeDescriptors); if (lumas.size() != activeDescriptors.size()) { ALOGW("collected %zu median luma values for %zu descriptors", lumas.size(), activeDescriptors.size()); return; } Loading services/surfaceflinger/RegionSamplingThread.h +8 −1 Original line number Diff line number Diff line Loading @@ -38,11 +38,16 @@ public: explicit RegionSamplingThread(SurfaceFlinger& flinger); ~RegionSamplingThread(); // Add a listener to receive luma notifications. The luma reported via listener will // report the median luma for the layers under the stopLayerHandle, in the samplingArea region. void addListener(const Rect& samplingArea, const sp<IBinder>& stopLayerHandle, const sp<IRegionSamplingListener>& listener); // Remove the listener to stop receiving median luma notifications. void removeListener(const sp<IRegionSamplingListener>& listener); // Instruct the thread to perform a median luma sampling on the layers. void sampleNow(); private: struct Descriptor { Rect area = Rect::EMPTY_RECT; wp<Layer> stopLayer; Loading @@ -54,8 +59,10 @@ public: return std::hash<IBinder*>()(p.unsafe_get()); } }; std::vector<float> sampleBuffer( const sp<GraphicBuffer>& buffer, const Point& leftTop, const std::vector<RegionSamplingThread::Descriptor>& descriptors); private: void binderDied(const wp<IBinder>& who) override; void captureSample() REQUIRES(mMutex); Loading services/surfaceflinger/SurfaceFlinger.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -5495,10 +5495,10 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, static_cast<android_pixel_format>(reqPixelFormat), 1, usage, "screenshot"); return captureScreenCore(renderArea, traverseLayers, *outBuffer, useIdentityTransform); return captureScreenCommon(renderArea, traverseLayers, *outBuffer, useIdentityTransform); } status_t SurfaceFlinger::captureScreenCore(RenderArea& renderArea, status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform) { Loading services/surfaceflinger/SurfaceFlinger.h +2 −2 Original line number Diff line number Diff line Loading @@ -643,7 +643,7 @@ private: status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, sp<GraphicBuffer>* outBuffer, const ui::PixelFormat reqPixelFormat, bool useIdentityTransform); status_t captureScreenCore(RenderArea& renderArea, TraverseLayersFunction traverseLayers, status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform); status_t captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, Loading Loading
services/surfaceflinger/RegionSamplingThread.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -119,7 +119,8 @@ float sampleArea(const uint32_t* data, int32_t stride, const Rect& area) { } } // anonymous namespace std::vector<float> sampleBuffer(const sp<GraphicBuffer>& buffer, const Point& leftTop, std::vector<float> RegionSamplingThread::sampleBuffer( const sp<GraphicBuffer>& buffer, const Point& leftTop, const std::vector<RegionSamplingThread::Descriptor>& descriptors) { void* data_raw = nullptr; buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, &data_raw); Loading Loading @@ -150,7 +151,7 @@ void RegionSamplingThread::captureSample() { descriptors.emplace_back(descriptor); } Rect sampledArea = sampleRegion.bounds(); const Rect sampledArea = sampleRegion.bounds(); sp<const DisplayDevice> device = mFlinger.getDefaultDisplayDevice(); DisplayRenderArea renderArea(device, sampledArea, sampledArea.getWidth(), Loading @@ -174,8 +175,8 @@ void RegionSamplingThread::captureSample() { } // Compute the layer's position on the screen Rect bounds = Rect(layer->getBounds()); ui::Transform transform = layer->getTransform(); const Rect bounds = Rect(layer->getBounds()); const ui::Transform transform = layer->getTransform(); constexpr bool roundOutwards = true; Rect transformed = transform.transform(bounds, roundOutwards); Loading Loading @@ -215,7 +216,7 @@ void RegionSamplingThread::captureSample() { // // To avoid this, we drop the mutex while we call into SF. mMutex.unlock(); mFlinger.captureScreenCore(renderArea, traverseLayers, buffer, false); mFlinger.captureScreenCommon(renderArea, traverseLayers, buffer, false); mMutex.lock(); std::vector<Descriptor> activeDescriptors; Loading @@ -229,6 +230,8 @@ void RegionSamplingThread::captureSample() { std::vector<float> lumas = sampleBuffer(buffer, sampledArea.leftTop(), activeDescriptors); if (lumas.size() != activeDescriptors.size()) { ALOGW("collected %zu median luma values for %zu descriptors", lumas.size(), activeDescriptors.size()); return; } Loading
services/surfaceflinger/RegionSamplingThread.h +8 −1 Original line number Diff line number Diff line Loading @@ -38,11 +38,16 @@ public: explicit RegionSamplingThread(SurfaceFlinger& flinger); ~RegionSamplingThread(); // Add a listener to receive luma notifications. The luma reported via listener will // report the median luma for the layers under the stopLayerHandle, in the samplingArea region. void addListener(const Rect& samplingArea, const sp<IBinder>& stopLayerHandle, const sp<IRegionSamplingListener>& listener); // Remove the listener to stop receiving median luma notifications. void removeListener(const sp<IRegionSamplingListener>& listener); // Instruct the thread to perform a median luma sampling on the layers. void sampleNow(); private: struct Descriptor { Rect area = Rect::EMPTY_RECT; wp<Layer> stopLayer; Loading @@ -54,8 +59,10 @@ public: return std::hash<IBinder*>()(p.unsafe_get()); } }; std::vector<float> sampleBuffer( const sp<GraphicBuffer>& buffer, const Point& leftTop, const std::vector<RegionSamplingThread::Descriptor>& descriptors); private: void binderDied(const wp<IBinder>& who) override; void captureSample() REQUIRES(mMutex); Loading
services/surfaceflinger/SurfaceFlinger.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -5495,10 +5495,10 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, static_cast<android_pixel_format>(reqPixelFormat), 1, usage, "screenshot"); return captureScreenCore(renderArea, traverseLayers, *outBuffer, useIdentityTransform); return captureScreenCommon(renderArea, traverseLayers, *outBuffer, useIdentityTransform); } status_t SurfaceFlinger::captureScreenCore(RenderArea& renderArea, status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform) { Loading
services/surfaceflinger/SurfaceFlinger.h +2 −2 Original line number Diff line number Diff line Loading @@ -643,7 +643,7 @@ private: status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, sp<GraphicBuffer>* outBuffer, const ui::PixelFormat reqPixelFormat, bool useIdentityTransform); status_t captureScreenCore(RenderArea& renderArea, TraverseLayersFunction traverseLayers, status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform); status_t captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, Loading