1c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith/* 2c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * Copyright (C) 2014 The Android Open Source Project 3c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * 4c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * Licensed under the Apache License, Version 2.0 (the "License"); 5c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * you may not use this file except in compliance with the License. 6c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * You may obtain a copy of the License at 7c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * 8c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * http://www.apache.org/licenses/LICENSE-2.0 9c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * 10c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * Unless required by applicable law or agreed to in writing, software 11c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * distributed under the License is distributed on an "AS IS" BASIS, 12c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * See the License for the specific language governing permissions and 14c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith * limitations under the License. 15c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith */ 16c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 17c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith//#define LOG_NDEBUG 0 18c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith#define LOG_TAG "RSFilter" 19c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 20c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith#include <utils/Log.h> 21c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 227e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim#include <media/MediaCodecBuffer.h> 23c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith#include <media/stagefright/foundation/ADebug.h> 24c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith#include <media/stagefright/foundation/AMessage.h> 25c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 26c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith#include "RSFilter.h" 27c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 28c6c182f354142b47b7a5abfa9f95c82b236f5832David Smithnamespace android { 29c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 30c6c182f354142b47b7a5abfa9f95c82b236f5832David SmithRSFilter::RSFilter() { 31c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 32c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} 33c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 34c6c182f354142b47b7a5abfa9f95c82b236f5832David SmithRSFilter::~RSFilter() { 35c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 36c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} 37c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 38c6c182f354142b47b7a5abfa9f95c82b236f5832David Smithstatus_t RSFilter::configure(const sp<AMessage> &msg) { 39c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith status_t err = SimpleFilter::configure(msg); 40c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith if (err != OK) { 41c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith return err; 42c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith } 43c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 44c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith if (!msg->findString("cacheDir", &mCacheDir)) { 45c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith ALOGE("Failed to find cache directory in config message."); 46c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith return NAME_NOT_FOUND; 47c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith } 48c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 49c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith sp<RenderScriptWrapper> wrapper; 50c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith if (!msg->findObject("rs-wrapper", (sp<RefBase>*)&wrapper)) { 51c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith ALOGE("Failed to find RenderScriptWrapper in config message."); 52c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith return NAME_NOT_FOUND; 53c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith } 54c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 55c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mRS = wrapper->mContext; 56c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mCallback = wrapper->mCallback; 57c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 58c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith return OK; 59c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} 60c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 61c6c182f354142b47b7a5abfa9f95c82b236f5832David Smithstatus_t RSFilter::start() { 62c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith // 32-bit elements for ARGB8888 63c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith RSC::sp<const RSC::Element> e = RSC::Element::U8_4(mRS); 64c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 65c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith RSC::Type::Builder tb(mRS, e); 66c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith tb.setX(mWidth); 67c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith tb.setY(mHeight); 68c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith RSC::sp<const RSC::Type> t = tb.create(); 69c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 70c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mAllocIn = RSC::Allocation::createTyped(mRS, t); 71c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mAllocOut = RSC::Allocation::createTyped(mRS, t); 72c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 73c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith return OK; 74c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} 75c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 76c6c182f354142b47b7a5abfa9f95c82b236f5832David Smithvoid RSFilter::reset() { 77c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mCallback.clear(); 78c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mAllocOut.clear(); 79c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mAllocIn.clear(); 80c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mRS.clear(); 81c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} 82c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 83c6c182f354142b47b7a5abfa9f95c82b236f5832David Smithstatus_t RSFilter::setParameters(const sp<AMessage> &msg) { 84c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith return mCallback->handleSetParameters(msg); 85c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} 86c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 87c6c182f354142b47b7a5abfa9f95c82b236f5832David Smithstatus_t RSFilter::processBuffers( 887e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim const sp<MediaCodecBuffer> &srcBuffer, const sp<MediaCodecBuffer> &outBuffer) { 89c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mAllocIn->copy1DRangeFrom(0, mWidth * mHeight, srcBuffer->data()); 90c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mCallback->processBuffers(mAllocIn.get(), mAllocOut.get()); 91c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith mAllocOut->copy1DRangeTo(0, mWidth * mHeight, outBuffer->data()); 92c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 93c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith return OK; 94c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} 95c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith 96c6c182f354142b47b7a5abfa9f95c82b236f5832David Smith} // namespace android 97