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