SoftwareRenderer.cpp revision 988e3f0b2c74095deae580157c57935a98573052
1d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar/* 2d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Copyright (C) 2009 The Android Open Source Project 3d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * 4d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * you may not use this file except in compliance with the License. 6d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * You may obtain a copy of the License at 7d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * 8d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * 10d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Unless required by applicable law or agreed to in writing, software 11d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * See the License for the specific language governing permissions and 14d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * limitations under the License. 15d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar */ 16d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount#define LOG_TAG "SoftwareRenderer" 18d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar#include <utils/Log.h> 19e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount 20e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount#include "../include/SoftwareRenderer.h" 21d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 22d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar#include <binder/MemoryHeapBase.h> 23d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar#include <binder/MemoryHeapPmem.h> 24d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar#include <media/stagefright/MediaDebug.h> 25d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar#include <ui/ISurface.h> 26d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 27d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarnamespace android { 28a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount 29a70fed6415aa1e8bbbe929aee776402ac3b81c86George MountSoftwareRenderer::SoftwareRenderer( 30a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount OMX_COLOR_FORMATTYPE colorFormat, 31a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount const sp<ISurface> &surface, 32a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount size_t displayWidth, size_t displayHeight, 33d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar size_t decodedWidth, size_t decodedHeight) 34d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar : mColorFormat(colorFormat), 35d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar mConverter(colorFormat, OMX_COLOR_Format16bitRGB565), 36e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount mISurface(surface), 37e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount mDisplayWidth(displayWidth), 38d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mDisplayHeight(displayHeight), 39d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mDecodedWidth(decodedWidth), 40d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mDecodedHeight(decodedHeight), 41d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mFrameSize(mDecodedWidth * mDecodedHeight * 2), // RGB565 42d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mIndex(0) { 43d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mMemoryHeap = new MemoryHeapBase("/dev/pmem_adsp", 2 * mFrameSize); 44d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount if (mMemoryHeap->heapID() < 0) { 45d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount LOGI("Creating physical memory heap failed, reverting to regular heap."); 46d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mMemoryHeap = new MemoryHeapBase(2 * mFrameSize); 47d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount } else { 48d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mMemoryHeap = new MemoryHeapPmem(mMemoryHeap); 49e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount } 50e52882df6130221462bf07f5f2b52de5c4b0f8deGeorge Mount 51d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar CHECK(mISurface.get() != NULL); 52 CHECK(mDecodedWidth > 0); 53 CHECK(mDecodedHeight > 0); 54 CHECK(mMemoryHeap->heapID() >= 0); 55 CHECK(mConverter.isValid()); 56 57 ISurface::BufferHeap bufferHeap( 58 mDisplayWidth, mDisplayHeight, 59 mDecodedWidth, mDecodedHeight, 60 PIXEL_FORMAT_RGB_565, 61 mMemoryHeap); 62 63 status_t err = mISurface->registerBuffers(bufferHeap); 64 CHECK_EQ(err, OK); 65} 66 67SoftwareRenderer::~SoftwareRenderer() { 68 mISurface->unregisterBuffers(); 69} 70 71void SoftwareRenderer::render( 72 const void *data, size_t size, void *platformPrivate) { 73 size_t offset = mIndex * mFrameSize; 74 void *dst = (uint8_t *)mMemoryHeap->getBase() + offset; 75 76 mConverter.convert( 77 mDecodedWidth, mDecodedHeight, 78 data, 0, dst, 2 * mDecodedWidth); 79 80 mISurface->postBuffer(offset); 81 mIndex = 1 - mIndex; 82} 83 84} // namespace android 85