blob: ba42ef4ea2d9cd79193c852c1b1cbbec5f36e395 [file] [log] [blame]
/*
* 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 "TIHardwareRenderer"
#include <utils/Log.h>
#undef NDEBUG
#include <assert.h>
#include <media/stagefright/TIHardwareRenderer.h>
#include <ui/ISurface.h>
#include <ui/Overlay.h>
namespace android {
////////////////////////////////////////////////////////////////////////////////
TIHardwareRenderer::TIHardwareRenderer(
const sp<ISurface> &surface,
size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight)
: mISurface(surface),
mDisplayWidth(displayWidth),
mDisplayHeight(displayHeight),
mDecodedWidth(decodedWidth),
mDecodedHeight(decodedHeight),
mFrameSize((mDecodedWidth * mDecodedHeight * 3) / 2) {
assert(mISurface.get() != NULL);
assert(mDecodedWidth > 0);
assert(mDecodedHeight > 0);
sp<OverlayRef> ref = mISurface->createOverlay(
mDisplayWidth, mDisplayHeight, OVERLAY_FORMAT_CbYCrY_422_I);
if (ref.get() == NULL) {
LOGE("Unable to create the overlay!");
return;
}
mOverlay = new Overlay(ref);
for (size_t i = 0; i < mOverlay->getBufferCount(); ++i) {
mOverlayAddresses.push(mOverlay->getBufferAddress((void *)i));
}
mIndex = mOverlayAddresses.size() - 1;
}
TIHardwareRenderer::~TIHardwareRenderer() {
if (mOverlay.get() != NULL) {
mOverlay->destroy();
mOverlay.clear();
// XXX apparently destroying an overlay is an asynchronous process...
sleep(1);
}
}
void TIHardwareRenderer::render(
const void *data, size_t size, void *platformPrivate) {
// assert(size == mFrameSize);
if (mOverlay.get() == NULL) {
return;
}
#if 0
overlay_buffer_t buffer;
if (mOverlay->dequeueBuffer(&buffer) == OK) {
void *addr = mOverlay->getBufferAddress(buffer);
memcpy(addr, data, size);
mOverlay->queueBuffer(buffer);
}
#else
memcpy(mOverlayAddresses[mIndex], data, size);
mOverlay->queueBuffer((void *)mIndex);
if (mIndex-- == 0) {
mIndex = mOverlayAddresses.size() - 1;
}
#endif
}
} // namespace android