105 lines
3.7 KiB
Java
105 lines
3.7 KiB
Java
/*
|
|
* Copyright (C) 2011 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.media.effect.effects;
|
|
|
|
import android.filterfw.core.Filter;
|
|
import android.filterfw.core.OneShotScheduler;
|
|
import android.media.effect.EffectContext;
|
|
import android.media.effect.FilterGraphEffect;
|
|
import android.media.effect.EffectUpdateListener;
|
|
|
|
import android.filterpacks.videoproc.BackDropperFilter;
|
|
import android.filterpacks.videoproc.BackDropperFilter.LearningDoneListener;
|
|
|
|
/**
|
|
* Background replacement Effect.
|
|
*
|
|
* Replaces the background of the input video stream with a selected video
|
|
* Learns the background when it first starts up;
|
|
* needs unobstructed view of background when this happens.
|
|
*
|
|
* Effect parameters:
|
|
* source: A URI for the background video
|
|
* Listener: Called when learning period is complete
|
|
*
|
|
* @hide
|
|
*/
|
|
public class BackDropperEffect extends FilterGraphEffect {
|
|
private static final String mGraphDefinition =
|
|
"@import android.filterpacks.base;\n" +
|
|
"@import android.filterpacks.videoproc;\n" +
|
|
"@import android.filterpacks.videosrc;\n" +
|
|
"\n" +
|
|
"@filter GLTextureSource foreground {\n" +
|
|
" texId = 0;\n" + // Will be set by base class
|
|
" width = 0;\n" +
|
|
" height = 0;\n" +
|
|
" repeatFrame = true;\n" +
|
|
"}\n" +
|
|
"\n" +
|
|
"@filter MediaSource background {\n" +
|
|
" sourceUrl = \"no_file_specified\";\n" +
|
|
" waitForNewFrame = false;\n" +
|
|
" sourceIsUrl = true;\n" +
|
|
"}\n" +
|
|
"\n" +
|
|
"@filter BackDropperFilter replacer {\n" +
|
|
" autowbToggle = 1;\n" +
|
|
"}\n" +
|
|
"\n" +
|
|
"@filter GLTextureTarget output {\n" +
|
|
" texId = 0;\n" +
|
|
"}\n" +
|
|
"\n" +
|
|
"@connect foreground[frame] => replacer[video];\n" +
|
|
"@connect background[video] => replacer[background];\n" +
|
|
"@connect replacer[video] => output[frame];\n";
|
|
|
|
private EffectUpdateListener mEffectListener = null;
|
|
|
|
private LearningDoneListener mLearningListener = new LearningDoneListener() {
|
|
public void onLearningDone(BackDropperFilter filter) {
|
|
if (mEffectListener != null) {
|
|
mEffectListener.onEffectUpdated(BackDropperEffect.this, null);
|
|
}
|
|
}
|
|
};
|
|
|
|
public BackDropperEffect(EffectContext context, String name) {
|
|
super(context, name, mGraphDefinition, "foreground", "output", OneShotScheduler.class);
|
|
|
|
Filter replacer = mGraph.getFilter("replacer");
|
|
replacer.setInputValue("learningDoneListener", mLearningListener);
|
|
}
|
|
|
|
@Override
|
|
public void setParameter(String parameterKey, Object value) {
|
|
if (parameterKey.equals("source")) {
|
|
Filter background = mGraph.getFilter("background");
|
|
background.setInputValue("sourceUrl", value);
|
|
} else if (parameterKey.equals("context")) {
|
|
Filter background = mGraph.getFilter("background");
|
|
background.setInputValue("context", value);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setUpdateListener(EffectUpdateListener listener) {
|
|
mEffectListener = listener;
|
|
}
|
|
|
|
} |