PreviewRenderer.cpp revision 1e5b2b3361ddd07259bf4b29820ca4aa5f3a861b
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18#define LOG_NDEBUG 1 19#define LOG_TAG "PreviewRenderer" 20#include <utils/Log.h> 21 22#include "PreviewRenderer.h" 23 24#include <media/stagefright/foundation/ADebug.h> 25#include <gui/Surface.h> 26 27namespace android { 28 29PreviewRenderer* PreviewRenderer::CreatePreviewRenderer ( 30 const sp<Surface> &surface, size_t width, size_t height) { 31 32 PreviewRenderer* renderer = new PreviewRenderer(surface, width, height); 33 34 if (renderer->init() != 0) { 35 delete renderer; 36 return NULL; 37 } 38 39 return renderer; 40} 41 42PreviewRenderer::PreviewRenderer( 43 const sp<Surface> &surface, 44 size_t width, size_t height) 45 : mSurface(surface), 46 mWidth(width), 47 mHeight(height) { 48} 49 50int PreviewRenderer::init() { 51 int err = 0; 52 ANativeWindow* anw = mSurface.get(); 53 54 err = native_window_api_connect(anw, NATIVE_WINDOW_API_CPU); 55 if (err) goto fail; 56 57 err = native_window_set_usage( 58 anw, GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN); 59 if (err) goto fail; 60 61 err = native_window_set_buffer_count(anw, 3); 62 if (err) goto fail; 63 64 err = native_window_set_scaling_mode( 65 anw, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 66 if (err) goto fail; 67 68 err = native_window_set_buffers_geometry( 69 anw, mWidth, mHeight, HAL_PIXEL_FORMAT_YV12); 70 if (err) goto fail; 71 72 err = native_window_set_buffers_transform(anw, 0); 73 if (err) goto fail; 74 75fail: 76 return err; 77} 78 79PreviewRenderer::~PreviewRenderer() { 80 native_window_api_disconnect(mSurface.get(), NATIVE_WINDOW_API_CPU); 81} 82 83 84// 85// Provides a buffer and associated stride 86// This buffer is allocated by the SurfaceFlinger 87// 88// For optimal display performances, you should : 89// 1) call getBufferYV12() 90// 2) fill the buffer with your data 91// 3) call renderYV12() to take these changes into account 92// 93// For each call to getBufferYV12(), you must also call renderYV12() 94// Expected format in the buffer is YV12 formats (similar to YUV420 planar fromat) 95// for more details on this YV12 cf hardware/libhardware/include/hardware/hardware.h 96// 97void PreviewRenderer::getBufferYV12(uint8_t **data, size_t *stride) { 98 int err = OK; 99 100 if ((err = native_window_dequeue_buffer_and_wait(mSurface.get(), 101 &mBuf)) != 0) { 102 ALOGW("native_window_dequeue_buffer_and_wait returned error %d", err); 103 return; 104 } 105 106 GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 107 108 Rect bounds(mWidth, mHeight); 109 110 void *dst; 111 CHECK_EQ(0, mapper.lock(mBuf->handle, 112 GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN, 113 bounds, &dst)); 114 115 *data = (uint8_t*)dst; 116 *stride = mBuf->stride; 117} 118 119 120// 121// Display the content of the buffer provided by last call to getBufferYV12() 122// 123// See getBufferYV12() for details. 124// 125void PreviewRenderer::renderYV12() { 126 int err = OK; 127 128 GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 129 130 if (mBuf!= NULL) { 131 CHECK_EQ(0, mapper.unlock(mBuf->handle)); 132 133 if ((err = mSurface->ANativeWindow::queueBuffer(mSurface.get(), mBuf, -1)) != 0) { 134 ALOGW("Surface::queueBuffer returned error %d", err); 135 } 136 } 137 mBuf = NULL; 138} 139 140} // namespace android 141