1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks// Copyright 2012 Google Inc. All Rights Reserved.
2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterpacks.base;
4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Filter;
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Frame;
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameType;
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.MffContext;
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Signature;
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class GraphOutputTarget extends Filter {
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Frame mFrame = null;
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private FrameType mType = FrameType.any();
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public GraphOutputTarget(MffContext context, String name) {
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super(context, name);
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // TODO: During initialization only?
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void setType(FrameType type) {
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mType = type;
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public FrameType getType() {
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mType;
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Signature getSignature() {
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return new Signature()
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            .addInputPort("frame", Signature.PORT_REQUIRED, mType)
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            .disallowOtherInputs();
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // Returns a retained frame!
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Frame pullFrame() {
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Frame result = null;
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (mFrame != null) {
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            result = mFrame;
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mFrame = null;
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return result;
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onProcess() {
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Frame frame = getConnectedInputPort("frame").pullFrame();
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (mFrame != null) {
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mFrame.release();
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mFrame = frame.retain();
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected boolean canSchedule() {
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return super.canSchedule() && mFrame == null;
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
61