IntrinsicBlurFilter.cpp revision 6dad9ad21ff547fab7f192956e4a3732fd78488b
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", &params));
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