IntrinsicBlurFilter.cpp revision 744f5739019d1fd917f981e740b353c3d73fd1a8
1744f5739019d1fd917f981e740b353c3d73fd1a8David Smith/* 2744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * Copyright (C) 2014 The Android Open Source Project 3744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * 4744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * Licensed under the Apache License, Version 2.0 (the "License"); 5744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * you may not use this file except in compliance with the License. 6744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * You may obtain a copy of the License at 7744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * 8744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * http://www.apache.org/licenses/LICENSE-2.0 9744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * 10744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * Unless required by applicable law or agreed to in writing, software 11744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * distributed under the License is distributed on an "AS IS" BASIS, 12744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * See the License for the specific language governing permissions and 14744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * limitations under the License. 15744f5739019d1fd917f981e740b353c3d73fd1a8David Smith */ 16744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 17744f5739019d1fd917f981e740b353c3d73fd1a8David Smith//#define LOG_NDEBUG 0 18744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#define LOG_TAG "IntrinsicBlurFilter" 19744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 20744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#include <utils/Log.h> 21744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 22744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#include <media/stagefright/foundation/ABuffer.h> 23744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#include <media/stagefright/foundation/ADebug.h> 24744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#include <media/stagefright/foundation/AMessage.h> 25744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 26744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#include "IntrinsicBlurFilter.h" 27744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 28744f5739019d1fd917f981e740b353c3d73fd1a8David Smithnamespace android { 29744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 30744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstatus_t IntrinsicBlurFilter::start() { 31744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // TODO: use a single RS context object for entire application 32744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mRS = new RSC::RS(); 33744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 34744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // only legitimate because this is a standalone executable 35744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // TODO: do we need to dynamically determine the cache directory? 36744f5739019d1fd917f981e740b353c3d73fd1a8David Smith if (!mRS->init("/system/bin")) { 37744f5739019d1fd917f981e740b353c3d73fd1a8David Smith ALOGE("Failed to initialize RenderScript context."); 38744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return NO_INIT; 39744f5739019d1fd917f981e740b353c3d73fd1a8David Smith } 40744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 41744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // 32-bit elements for ARGB8888 42744f5739019d1fd917f981e740b353c3d73fd1a8David Smith RSC::sp<const RSC::Element> e = RSC::Element::U8_4(mRS); 43744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 44744f5739019d1fd917f981e740b353c3d73fd1a8David Smith RSC::Type::Builder tb(mRS, e); 45744f5739019d1fd917f981e740b353c3d73fd1a8David Smith tb.setX(mWidth); 46744f5739019d1fd917f981e740b353c3d73fd1a8David Smith tb.setY(mHeight); 47744f5739019d1fd917f981e740b353c3d73fd1a8David Smith RSC::sp<const RSC::Type> t = tb.create(); 48744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 49744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocIn = RSC::Allocation::createTyped(mRS, t); 50744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocOut = RSC::Allocation::createTyped(mRS, t); 51744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 52744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur = RSC::ScriptIntrinsicBlur::create(mRS, e); 53744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur->setRadius(mBlurRadius); 54744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur->setInput(mAllocIn); 55744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 56744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return OK; 57744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 58744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 59744f5739019d1fd917f981e740b353c3d73fd1a8David Smithvoid IntrinsicBlurFilter::reset() { 60744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur.clear(); 61744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocOut.clear(); 62744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocIn.clear(); 63744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mRS.clear(); 64744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 65744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 66744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstatus_t IntrinsicBlurFilter::setParameters(const sp<AMessage> &msg) { 67744f5739019d1fd917f981e740b353c3d73fd1a8David Smith sp<AMessage> params; 68744f5739019d1fd917f981e740b353c3d73fd1a8David Smith CHECK(msg->findMessage("params", ¶ms)); 69744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 70744f5739019d1fd917f981e740b353c3d73fd1a8David Smith float blurRadius; 71744f5739019d1fd917f981e740b353c3d73fd1a8David Smith if (params->findFloat("blur-radius", &blurRadius)) { 72744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlurRadius = blurRadius; 73744f5739019d1fd917f981e740b353c3d73fd1a8David Smith } 74744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 75744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return OK; 76744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 77744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 78744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstatus_t IntrinsicBlurFilter::processBuffers( 79744f5739019d1fd917f981e740b353c3d73fd1a8David Smith const sp<ABuffer> &srcBuffer, const sp<ABuffer> &outBuffer) { 80744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocIn->copy1DRangeFrom(0, mWidth * mHeight, srcBuffer->data()); 81744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur->forEach(mAllocOut); 82744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocOut->copy1DRangeTo(0, mWidth * mHeight, outBuffer->data()); 83744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 84744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return OK; 85744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 86744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 87744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} // namespace android 88