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 306dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smithstatus_t IntrinsicBlurFilter::configure(const sp<AMessage> &msg) { 316dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith status_t err = SimpleFilter::configure(msg); 326dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith if (err != OK) { 336dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith return err; 346dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith } 356dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith 366dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith if (!msg->findString("cacheDir", &mCacheDir)) { 376dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith ALOGE("Failed to find cache directory in config message."); 386dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith return NAME_NOT_FOUND; 396dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith } 406dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith 416dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith return OK; 426dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith} 436dad9ad21ff547fab7f192956e4a3732fd78488bDavid Smith 44744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstatus_t IntrinsicBlurFilter::start() { 45744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // TODO: use a single RS context object for entire application 46744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mRS = new RSC::RS(); 47744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 48e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith if (!mRS->init(mCacheDir.c_str())) { 49744f5739019d1fd917f981e740b353c3d73fd1a8David Smith ALOGE("Failed to initialize RenderScript context."); 50744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return NO_INIT; 51744f5739019d1fd917f981e740b353c3d73fd1a8David Smith } 52744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 53744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // 32-bit elements for ARGB8888 54744f5739019d1fd917f981e740b353c3d73fd1a8David Smith RSC::sp<const RSC::Element> e = RSC::Element::U8_4(mRS); 55744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 56744f5739019d1fd917f981e740b353c3d73fd1a8David Smith RSC::Type::Builder tb(mRS, e); 57744f5739019d1fd917f981e740b353c3d73fd1a8David Smith tb.setX(mWidth); 58744f5739019d1fd917f981e740b353c3d73fd1a8David Smith tb.setY(mHeight); 59744f5739019d1fd917f981e740b353c3d73fd1a8David Smith RSC::sp<const RSC::Type> t = tb.create(); 60744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 61744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocIn = RSC::Allocation::createTyped(mRS, t); 62744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocOut = RSC::Allocation::createTyped(mRS, t); 63744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 64744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur = RSC::ScriptIntrinsicBlur::create(mRS, e); 65744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur->setRadius(mBlurRadius); 66744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur->setInput(mAllocIn); 67744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 68744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return OK; 69744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 70744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 71744f5739019d1fd917f981e740b353c3d73fd1a8David Smithvoid IntrinsicBlurFilter::reset() { 72744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur.clear(); 73744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocOut.clear(); 74744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocIn.clear(); 75744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mRS.clear(); 76744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 77744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 78744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstatus_t IntrinsicBlurFilter::setParameters(const sp<AMessage> &msg) { 79744f5739019d1fd917f981e740b353c3d73fd1a8David Smith sp<AMessage> params; 80744f5739019d1fd917f981e740b353c3d73fd1a8David Smith CHECK(msg->findMessage("params", ¶ms)); 81744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 82744f5739019d1fd917f981e740b353c3d73fd1a8David Smith float blurRadius; 83744f5739019d1fd917f981e740b353c3d73fd1a8David Smith if (params->findFloat("blur-radius", &blurRadius)) { 84744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlurRadius = blurRadius; 85744f5739019d1fd917f981e740b353c3d73fd1a8David Smith } 86744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 87744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return OK; 88744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 89744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 90744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstatus_t IntrinsicBlurFilter::processBuffers( 91744f5739019d1fd917f981e740b353c3d73fd1a8David Smith const sp<ABuffer> &srcBuffer, const sp<ABuffer> &outBuffer) { 92744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocIn->copy1DRangeFrom(0, mWidth * mHeight, srcBuffer->data()); 93744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mBlur->forEach(mAllocOut); 94744f5739019d1fd917f981e740b353c3d73fd1a8David Smith mAllocOut->copy1DRangeTo(0, mWidth * mHeight, outBuffer->data()); 95744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 96744f5739019d1fd917f981e740b353c3d73fd1a8David Smith return OK; 97744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} 98744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 99744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} // namespace android 100