1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/*
2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2011 The Android Open Source Project
3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License");
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License.
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *      http://www.apache.org/licenses/LICENSE-2.0
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS,
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License.
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterpacks.base;
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.os.Handler;
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.os.Looper;
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.*;
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic final class ValueTarget extends Filter {
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public static interface ValueListener {
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onReceivedValue(Object value);
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private ValueListener mListener = null;
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Handler mHandler = null;
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public ValueTarget(MffContext context, String name) {
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super(context, name);
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void setListener(ValueListener listener, boolean onCallerThread) {
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (isRunning()) {
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new IllegalStateException("Attempting to bind filter to callback while it is "
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                + "running!");
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mListener = listener;
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (onCallerThread) {
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (Looper.myLooper() == null) {
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                throw new IllegalArgumentException("Attempting to set callback on thread which "
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    + "has no looper!");
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mHandler = new Handler();
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Signature getSignature() {
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return new Signature()
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            .addInputPort("value", Signature.PORT_REQUIRED, FrameType.single())
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            .disallowOtherPorts();
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onProcess() {
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue valueFrame = getConnectedInputPort("value").pullFrame().asFrameValue();
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (mListener != null) {
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (mHandler != null) {
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                postValueToUiThread(valueFrame.getValue());
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            } else {
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mListener.onReceivedValue(valueFrame.getValue());
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private void postValueToUiThread(final Object value) {
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mHandler.post(new Runnable() {
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            @Override
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            public void run() {
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mListener.onReceivedValue(value);
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        });
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
82