improve video performance to minimize the tearing effect seen in 720p movies
always rescale videos to their target size using copybit during yuv->rgb
conversion. this improves performance of the GPU pass and doesn't require
linear filtering to be enabled. Also always use 16-bits buffers.
the average processing time for 720p dropped from ~50ms to ~30ms
diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp
index eb017bf..137c5c0 100644
--- a/libs/surfaceflinger/LayerBuffer.cpp
+++ b/libs/surfaceflinger/LayerBuffer.cpp
@@ -120,9 +120,7 @@
source->onTransaction(flags);
uint32_t res = LayerBase::doTransaction(flags);
// we always want filtering for these surfaces
- if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
- mUseLinearFiltering = true;
- }
+ mUseLinearFiltering = !(mFlags & DisplayHardware::SLOW_CONFIG);
return res;
}
@@ -371,25 +369,33 @@
// note that the size of this buffer doesn't really matter,
// the final image will always be drawn with proper aspect ratio.
- int w = buffers.w;
- int h = buffers.h;
+ int w = layer.mTransformedBounds.width();
+ int h = layer.mTransformedBounds.height();
+ if (buffers.w * h != buffers.h * w) {
+ int t = w; w = h; h = t;
+ }
+ if (buffers.w * h == buffers.h * w) {
+ // same pixel area, don't use filtering
+ layer.mUseLinearFiltering = false;
+ }
+
mTempGraphicBuffer.clear();
mTempGraphicBuffer = new GraphicBuffer(
- w, h, HAL_PIXEL_FORMAT_RGBX_8888,
+ w, h, HAL_PIXEL_FORMAT_RGB_565,
GraphicBuffer::USAGE_HW_TEXTURE |
GraphicBuffer::USAGE_HW_2D);
if (mTempGraphicBuffer->initCheck() == NO_ERROR) {
NativeBuffer& dst(mTempBuffer);
dst.img.w = mTempGraphicBuffer->getStride();
- dst.img.h = mTempGraphicBuffer->getHeight();
+ dst.img.h = h;
dst.img.format = mTempGraphicBuffer->getPixelFormat();
dst.img.handle = (native_handle_t *)mTempGraphicBuffer->handle;
dst.img.base = 0;
dst.crop.l = 0;
dst.crop.t = 0;
- dst.crop.r = mTempGraphicBuffer->getWidth();
- dst.crop.b = mTempGraphicBuffer->getHeight();
+ dst.crop.r = w;
+ dst.crop.b = h;
} else {
mTempGraphicBuffer.clear();
}