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