1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* 2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * Copyright (C) 2011 The Android Open Source Project 3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * 4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * Licensed under the Apache License, Version 2.0 (the "License"); 5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * you may not use this file except in compliance with the License. 6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * You may obtain a copy of the License at 7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * 8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * http://www.apache.org/licenses/LICENSE-2.0 9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * 10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * Unless required by applicable law or agreed to in writing, software 11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * distributed under the License is distributed on an "AS IS" BASIS, 12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * See the License for the specific language governing permissions and 14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * limitations under the License. 15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 18956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongpackage android.filterpacks.base; 19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 20956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongimport android.filterfw.core.Filter; 21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongimport android.filterfw.core.FilterContext; 22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongimport android.filterfw.core.Frame; 23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongimport android.filterfw.core.FrameFormat; 24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongimport android.filterfw.core.GenerateFieldPort; 25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongimport android.filterfw.core.GenerateFinalPort; 26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongimport android.filterfw.format.ObjectFormat; 27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/** 29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * @hide 30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongpublic class ObjectSource extends Filter { 32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @GenerateFieldPort(name = "object") 34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong private Object mObject; 35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @GenerateFinalPort(name = "format", hasDefault = true) 37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong private FrameFormat mOutputFormat = FrameFormat.unspecified(); 38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 398fff6bb0000e43f02c9d04ca90f941fdefdc1356James Dong @GenerateFieldPort(name = "repeatFrame", hasDefault = true) 40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong boolean mRepeatFrame = false; 41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong private Frame mFrame; 43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong public ObjectSource(String name) { 45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong super(name); 46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @Override 498fff6bb0000e43f02c9d04ca90f941fdefdc1356James Dong public void setupPorts() { 50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong addOutputPort("frame", mOutputFormat); 51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @Override 54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong public void process(FilterContext context) { 55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong // If no frame has been created, create one now. 5629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block if (mFrame == null) { 57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (mObject == null) { 58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong throw new NullPointerException("ObjectSource producing frame with no object set!"); 59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 60956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong FrameFormat outputFormat = ObjectFormat.fromObject(mObject, FrameFormat.TARGET_SIMPLE); 61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong mFrame = context.getFrameManager().newFrame(outputFormat); 62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong mFrame.setObjectValue(mObject); 63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong mFrame.setTimestamp(Frame.TIMESTAMP_UNKNOWN); 64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong // Push output 67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong pushOutput("frame", mFrame); 68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong // Wait for free output 70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!mRepeatFrame) { 71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong closeOutputPort("frame"); 72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 7329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block } 74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @Override 76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong public void tearDown(FilterContext context) { 7729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block mFrame.release(); 78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong @Override 81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong public void fieldPortValueUpdated(String name, FilterContext context) { 82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong // Release our internal frame, so that it is regenerated on the next call to process(). 83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (name.equals("object")) { 84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (mFrame != null) { 85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong mFrame.release(); 86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong mFrame = null; 87760943b5e7a09b602aba04ec451e97662f48b0a4James Dong } 88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 8929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block } 90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong