diff options
author | Andreas Huber <andih@google.com> | 2009-12-14 14:18:22 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2009-12-14 14:18:22 -0800 |
commit | 733b7729ea462fae9c6899456444e28fef1c757c (patch) | |
tree | bdae9df47ee74857a0941e17d1cef6b096bab771 /media/libstagefright/colorconversion/SoftwareRenderer.cpp | |
parent | b841f14f8e51f2365945281fbfa54ef6a1b1b5a6 (diff) | |
download | frameworks_av-733b7729ea462fae9c6899456444e28fef1c757c.zip frameworks_av-733b7729ea462fae9c6899456444e28fef1c757c.tar.gz frameworks_av-733b7729ea462fae9c6899456444e28fef1c757c.tar.bz2 |
AwesomePlayer now renders either remote (IOMXRenderer) or locally depending on what kind of decoder was instantiated. Split off color conversion code into its own shared library.
Diffstat (limited to 'media/libstagefright/colorconversion/SoftwareRenderer.cpp')
-rw-r--r-- | media/libstagefright/colorconversion/SoftwareRenderer.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp new file mode 100644 index 0000000..ef6ede0 --- /dev/null +++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "SoftwareRenderer" +#include <utils/Log.h> + +#include "../include/SoftwareRenderer.h" + +#include <binder/MemoryHeapBase.h> +#include <media/stagefright/MediaDebug.h> +#include <ui/ISurface.h> + +namespace android { + +SoftwareRenderer::SoftwareRenderer( + OMX_COLOR_FORMATTYPE colorFormat, + const sp<ISurface> &surface, + size_t displayWidth, size_t displayHeight, + size_t decodedWidth, size_t decodedHeight) + : mColorFormat(colorFormat), + mConverter(colorFormat, OMX_COLOR_Format16bitRGB565), + mISurface(surface), + mDisplayWidth(displayWidth), + mDisplayHeight(displayHeight), + mDecodedWidth(decodedWidth), + mDecodedHeight(decodedHeight), + mFrameSize(mDecodedWidth * mDecodedHeight * 2), // RGB565 + mMemoryHeap(new MemoryHeapBase(2 * mFrameSize)), + mIndex(0) { + CHECK(mISurface.get() != NULL); + CHECK(mDecodedWidth > 0); + CHECK(mDecodedHeight > 0); + CHECK(mMemoryHeap->heapID() >= 0); + CHECK(mConverter.isValid()); + + ISurface::BufferHeap bufferHeap( + mDisplayWidth, mDisplayHeight, + mDecodedWidth, mDecodedHeight, + PIXEL_FORMAT_RGB_565, + mMemoryHeap); + + status_t err = mISurface->registerBuffers(bufferHeap); + CHECK_EQ(err, OK); +} + +SoftwareRenderer::~SoftwareRenderer() { + mISurface->unregisterBuffers(); +} + +void SoftwareRenderer::render( + const void *data, size_t size, void *platformPrivate) { + size_t offset = mIndex * mFrameSize; + void *dst = (uint8_t *)mMemoryHeap->getBase() + offset; + + mConverter.convert( + mDecodedWidth, mDecodedHeight, + data, 0, dst, 2 * mDecodedWidth); + + mISurface->postBuffer(offset); + mIndex = 1 - mIndex; +} + +} // namespace android |