/* * 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.filterpacks.base; import android.filterfw.core.Filter; import android.filterfw.core.FilterContext; import android.filterfw.core.Frame; import android.filterfw.core.FrameFormat; import android.filterfw.core.GenerateFieldPort; import android.filterfw.core.GenerateFinalPort; import android.filterfw.format.ObjectFormat; /** * @hide */ public class ObjectSource extends Filter { @GenerateFieldPort(name = "object") private Object mObject; @GenerateFinalPort(name = "format", hasDefault = true) private FrameFormat mOutputFormat = FrameFormat.unspecified(); @GenerateFieldPort(name = "repeatFrame", hasDefault = true) boolean mRepeatFrame = false; private Frame mFrame; public ObjectSource(String name) { super(name); } @Override public void setupPorts() { addOutputPort("frame", mOutputFormat); } @Override public void process(FilterContext context) { // If no frame has been created, create one now. if (mFrame == null) { if (mObject == null) { throw new NullPointerException("ObjectSource producing frame with no object set!"); } FrameFormat outputFormat = ObjectFormat.fromObject(mObject, FrameFormat.TARGET_SIMPLE); mFrame = context.getFrameManager().newFrame(outputFormat); mFrame.setObjectValue(mObject); mFrame.setTimestamp(Frame.TIMESTAMP_UNKNOWN); } // Push output pushOutput("frame", mFrame); // Wait for free output if (!mRepeatFrame) { closeOutputPort("frame"); } } @Override public void tearDown(FilterContext context) { mFrame.release(); } @Override public void fieldPortValueUpdated(String name, FilterContext context) { // Release our internal frame, so that it is regenerated on the next call to process(). if (name.equals("object")) { if (mFrame != null) { mFrame.release(); mFrame = null; } } } }