/* * 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.performance; 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.format.ObjectFormat; import android.os.SystemClock; /** * @hide */ public class ThroughputFilter extends Filter { @GenerateFieldPort(name = "period", hasDefault = true) private int mPeriod = 5; private long mLastTime = 0; private int mTotalFrameCount = 0; private int mPeriodFrameCount = 0; private FrameFormat mOutputFormat; public ThroughputFilter(String name) { super(name); } @Override public void setupPorts() { // Add input ports addInputPort("frame"); // Add output ports mOutputFormat = ObjectFormat.fromClass(Throughput.class, FrameFormat.TARGET_SIMPLE); addOutputBasedOnInput("frame", "frame"); addOutputPort("throughput", mOutputFormat); } @Override public FrameFormat getOutputFormat(String portName, FrameFormat inputFormat) { return inputFormat; } @Override public void open(FilterContext env) { mTotalFrameCount = 0; mPeriodFrameCount = 0; mLastTime = 0; } @Override public void process(FilterContext context) { // Pass through input frame Frame input = pullInput("frame"); pushOutput("frame", input); // Update stats ++mTotalFrameCount; ++mPeriodFrameCount; // Check clock if (mLastTime == 0) { mLastTime = SystemClock.elapsedRealtime(); } long curTime = SystemClock.elapsedRealtime(); // Output throughput info if time period is up if ((curTime - mLastTime) >= (mPeriod * 1000)) { FrameFormat inputFormat = input.getFormat(); int pixelCount = inputFormat.getWidth() * inputFormat.getHeight(); Throughput throughput = new Throughput(mTotalFrameCount, mPeriodFrameCount, mPeriod, pixelCount); Frame throughputFrame = context.getFrameManager().newFrame(mOutputFormat); throughputFrame.setObjectValue(throughput); pushOutput("throughput", throughputFrame); mLastTime = curTime; mPeriodFrameCount = 0; } } }