PreviewRenderer.cpp revision 08b82bddf54757ad6bd243181f1b68a79bb70e6d
19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* 29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project 39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License. 69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at 79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software 119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and 149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License. 159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_NDEBUG 1 199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_TAG "PreviewRenderer" 209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <utils/Log.h> 219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "PreviewRenderer.h" 239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaDebug.h> 259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <surfaceflinger/Surface.h> 269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android { 289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung ChangPreviewRenderer* PreviewRenderer::CreatePreviewRenderer ( 3008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang const sp<Surface> &surface, size_t width, size_t height) { 319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3208b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang PreviewRenderer* renderer = new PreviewRenderer(surface, width, height); 339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang if (renderer->init() != 0) { 3508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang delete renderer; 3608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang return NULL; 3708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang } 389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang return renderer; 409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangPreviewRenderer::PreviewRenderer( 439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang const sp<Surface> &surface, 4408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang size_t width, size_t height) 4508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang : mSurface(surface), 4608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang mWidth(width), 4708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang mHeight(height) { 4808b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang} 4908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 5008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Changint PreviewRenderer::init() { 5108b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang int err = 0; 5208b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 5308b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang err = native_window_api_connect(mSurface.get(), NATIVE_WINDOW_API_CPU); 5408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang if (err) goto fail; 5508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 5608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang err = native_window_set_usage(mSurface.get(), 5708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN); 5808b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang if (err) goto fail; 5908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 6008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang err = native_window_set_buffer_count(mSurface.get(), 3); 6108b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang if (err) goto fail; 6208b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 6308b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang err = native_window_set_scaling_mode( 6408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang mSurface.get(), NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 6508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang if (err) goto fail; 6608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 6708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang err = native_window_set_buffers_geometry( 6808b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang mSurface.get(), 6908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang mWidth, mHeight, 7008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang HAL_PIXEL_FORMAT_YV12); 7108b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang if (err) goto fail; 7208b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 7308b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Changfail: 7408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang return err; 759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangPreviewRenderer::~PreviewRenderer() { 7808b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang native_window_api_disconnect(mSurface.get(), NATIVE_WINDOW_API_CPU); 799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// Provides a buffer and associated stride 849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// This buffer is allocated by the SurfaceFlinger 859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// For optimal display performances, you should : 879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 1) call getBufferYV12() 889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 2) fill the buffer with your data 899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 3) call renderYV12() to take these changes into account 909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// For each call to getBufferYV12(), you must also call renderYV12() 929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// Expected format in the buffer is YV12 formats (similar to YUV420 planar fromat) 939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// for more details on this YV12 cf hardware/libhardware/include/hardware/hardware.h 949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid PreviewRenderer::getBufferYV12(uint8_t **data, size_t *stride) { 969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int err = OK; 979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 98f70947fcd251dffbbf29414cf43bea971d9df3e8Mathias Agopian if ((err = mSurface->ANativeWindow::dequeueBuffer(mSurface.get(), &mBuf)) != 0) { 999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang LOGW("Surface::dequeueBuffer returned error %d", err); 1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return; 1019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 103f70947fcd251dffbbf29414cf43bea971d9df3e8Mathias Agopian CHECK_EQ(0, mSurface->ANativeWindow::lockBuffer(mSurface.get(), mBuf)); 1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 1069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Rect bounds(mWidth, mHeight); 1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang void *dst; 11008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang CHECK_EQ(0, mapper.lock(mBuf->handle, 11108b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN, 11208b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang bounds, &dst)); 1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *data = (uint8_t*)dst; 1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *stride = mBuf->stride; 1169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// Display the content of the buffer provided by last call to getBufferYV12() 1219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// See getBufferYV12() for details. 1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// 1249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid PreviewRenderer::renderYV12() { 1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int err = OK; 1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mBuf!= NULL) { 1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang CHECK_EQ(0, mapper.unlock(mBuf->handle)); 1319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 132f70947fcd251dffbbf29414cf43bea971d9df3e8Mathias Agopian if ((err = mSurface->ANativeWindow::queueBuffer(mSurface.get(), mBuf)) != 0) { 1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang LOGW("Surface::queueBuffer returned error %d", err); 1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mBuf = NULL; 1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} // namespace android 140