165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpackage android.filterfw.core;
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.Filter;
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.FrameFormat;
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.util.Log;
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/**
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic abstract class FilterPort {
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected Filter mFilter;
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected String mName;
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected FrameFormat mPortFormat;
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected boolean mIsBlocking = true;
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected boolean mIsOpen = false;
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected boolean mChecksType = false;
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    private boolean mLogVerbose;
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    private static final String TAG = "FilterPort";
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public FilterPort(Filter filter, String name) {
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mName = name;
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mFilter = filter;
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mLogVerbose = Log.isLoggable(TAG, Log.VERBOSE);
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean isAttached() {
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mFilter != null;
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public FrameFormat getPortFormat() {
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mPortFormat;
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void setPortFormat(FrameFormat format) {
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mPortFormat = format;
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Filter getFilter() {
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mFilter;
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public String getName() {
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mName;
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void setBlocking(boolean blocking) {
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mIsBlocking = blocking;
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void setChecksType(boolean checksType) {
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mChecksType = checksType;
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void open() {
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (!mIsOpen) {
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            if (mLogVerbose) Log.v(TAG, "Opening " + this);
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mIsOpen = true;
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void close() {
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mIsOpen) {
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            if (mLogVerbose) Log.v(TAG, "Closing " + this);
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mIsOpen = false;
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean isOpen() {
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mIsOpen;
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean isBlocking() {
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mIsBlocking;
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public abstract boolean filterMustClose();
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public abstract boolean isReady();
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public abstract void pushFrame(Frame frame);
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public abstract void setFrame(Frame frame);
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public abstract Frame pullFrame();
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public abstract boolean hasFrame();
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public abstract void clear();
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public String toString() {
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return "port '" + mName + "' of " + mFilter;
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected void assertPortIsOpen() {
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (!isOpen()) {
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            throw new RuntimeException("Illegal operation on closed " + this + "!");
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected void checkFrameType(Frame frame, boolean forceCheck) {
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if ((mChecksType || forceCheck)
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && mPortFormat != null
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && !frame.getFormat().isCompatibleWith(mPortFormat)) {
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            throw new RuntimeException("Frame passed to " + this + " is of incorrect type! "
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                + "Expected " + mPortFormat + " but got " + frame.getFormat());
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected void checkFrameManager(Frame frame, FilterContext context) {
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (frame.getFrameManager() != null
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && frame.getFrameManager() != context.getFrameManager()) {
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            throw new RuntimeException("Frame " + frame + " is managed by foreign FrameManager! ");
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
135