SoftwareRenderer.cpp revision 89e7fff6a5d7410815f42b4a55958a59d4463180
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "SoftwareRenderer"
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2089e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber#include "../include/SoftwareRenderer.h"
2189e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/MemoryHeapBase.h>
2389e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber#include <binder/MemoryHeapPmem.h>
240c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber#include <media/stagefright/MediaDebug.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <ui/ISurface.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberSoftwareRenderer::SoftwareRenderer(
3010f75b8c71beb7f327e50bbac8e528af4e40fa24Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat,
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const sp<ISurface> &surface,
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t displayWidth, size_t displayHeight,
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t decodedWidth, size_t decodedHeight)
3410f75b8c71beb7f327e50bbac8e528af4e40fa24Andreas Huber    : mColorFormat(colorFormat),
352a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber      mConverter(colorFormat, OMX_COLOR_Format16bitRGB565),
3610f75b8c71beb7f327e50bbac8e528af4e40fa24Andreas Huber      mISurface(surface),
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mDisplayWidth(displayWidth),
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mDisplayHeight(displayHeight),
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mDecodedWidth(decodedWidth),
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mDecodedHeight(decodedHeight),
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mFrameSize(mDecodedWidth * mDecodedHeight * 2),  // RGB565
422a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber      mIndex(0) {
4389e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber    // TODO: How do I allocate physical memory on Droid?
4489e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber    mMemoryHeap = new MemoryHeapBase("/dev/pmem_adsp", 2 * mFrameSize);
4589e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber    if (mMemoryHeap->heapID() < 0) {
4689e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber        LOGI("Creating physical memory heap failed, reverting to regular heap.");
4789e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber        mMemoryHeap = new MemoryHeapBase(2 * mFrameSize);
4889e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber    } else {
4989e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber        mMemoryHeap = new MemoryHeapPmem(mMemoryHeap);
5089e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber    }
5189e7fff6a5d7410815f42b4a55958a59d4463180Andreas Huber
520c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mISurface.get() != NULL);
530c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mDecodedWidth > 0);
540c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mDecodedHeight > 0);
550c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mMemoryHeap->heapID() >= 0);
562a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber    CHECK(mConverter.isValid());
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ISurface::BufferHeap bufferHeap(
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            mDisplayWidth, mDisplayHeight,
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            mDecodedWidth, mDecodedHeight,
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            PIXEL_FORMAT_RGB_565,
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            mMemoryHeap);
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t err = mISurface->registerBuffers(bufferHeap);
650c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK_EQ(err, OK);
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberSoftwareRenderer::~SoftwareRenderer() {
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mISurface->unregisterBuffers();
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid SoftwareRenderer::render(
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *data, size_t size, void *platformPrivate) {
744265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber    size_t offset = mIndex * mFrameSize;
754265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber    void *dst = (uint8_t *)mMemoryHeap->getBase() + offset;
764265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber
772a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber    mConverter.convert(
782a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber            mDecodedWidth, mDecodedHeight,
792a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber            data, 0, dst, 2 * mDecodedWidth);
804265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber
814265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber    mISurface->postBuffer(offset);
824265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber    mIndex = 1 - mIndex;
834265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber}
844265a834394bfe14a008a2ac58fbbe388566ad07Andreas Huber
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
86