1744f5739019d1fd917f981e740b353c3d73fd1a8David Smith/*
2744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * Copyright (C) 2014 The Android Open Source Project
3744f5739019d1fd917f981e740b353c3d73fd1a8David Smith *
4744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * Licensed under the Apache License, Version 2.0 (the "License");
5744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * you may not use this file except in compliance with the License.
6744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * You may obtain a copy of the License at
7744f5739019d1fd917f981e740b353c3d73fd1a8David Smith *
8744f5739019d1fd917f981e740b353c3d73fd1a8David Smith *      http://www.apache.org/licenses/LICENSE-2.0
9744f5739019d1fd917f981e740b353c3d73fd1a8David Smith *
10744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * Unless required by applicable law or agreed to in writing, software
11744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * distributed under the License is distributed on an "AS IS" BASIS,
12744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * See the License for the specific language governing permissions and
14744f5739019d1fd917f981e740b353c3d73fd1a8David Smith * limitations under the License.
15744f5739019d1fd917f981e740b353c3d73fd1a8David Smith */
16744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
17744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#ifndef MEDIA_FILTER_H_
18744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#define MEDIA_FILTER_H_
19744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
20744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#include <media/stagefright/CodecBase.h>
21744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
22744f5739019d1fd917f981e740b353c3d73fd1a8David Smithnamespace android {
23744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
24744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstruct ABuffer;
25e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smithstruct GraphicBufferListener;
26744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstruct MemoryDealer;
27744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstruct SimpleFilter;
28744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
29744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstruct MediaFilter : public CodecBase {
30744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    MediaFilter();
31744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
32744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void setNotificationMessage(const sp<AMessage> &msg);
33744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
34744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void initiateAllocateComponent(const sp<AMessage> &msg);
35744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void initiateConfigureComponent(const sp<AMessage> &msg);
36744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void initiateCreateInputSurface();
378f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual void initiateSetInputSurface(const sp<PersistentSurface> &surface);
38d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
39744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void initiateStart();
40744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void initiateShutdown(bool keepComponentAllocated = false);
41744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
42744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void signalFlush();
43744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void signalResume();
44744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
45744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void signalRequestIDRFrame();
46744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void signalSetParameters(const sp<AMessage> &msg);
47744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void signalEndOfInputStream();
48744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
49744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual void onMessageReceived(const sp<AMessage> &msg);
50744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
51744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    struct PortDescription : public CodecBase::PortDescription {
52744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        virtual size_t countBuffers();
53744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        virtual IOMX::buffer_id bufferIDAt(size_t index) const;
54744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        virtual sp<ABuffer> bufferAt(size_t index) const;
55744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
56744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    protected:
57744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        PortDescription();
58744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
59744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    private:
60744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        friend struct MediaFilter;
61744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
62744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        Vector<IOMX::buffer_id> mBufferIDs;
63744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        Vector<sp<ABuffer> > mBuffers;
64744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
65744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer);
66744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
67744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
68744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    };
69744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
70744f5739019d1fd917f981e740b353c3d73fd1a8David Smithprotected:
71744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    virtual ~MediaFilter();
72744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
73744f5739019d1fd917f981e740b353c3d73fd1a8David Smithprivate:
74744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    struct BufferInfo {
75744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        enum Status {
76744f5739019d1fd917f981e740b353c3d73fd1a8David Smith            OWNED_BY_US,
77744f5739019d1fd917f981e740b353c3d73fd1a8David Smith            OWNED_BY_UPSTREAM,
78744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        };
79744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
80744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        IOMX::buffer_id mBufferID;
81744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        int32_t mGeneration;
82744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        int32_t mOutputFlags;
83744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        Status mStatus;
84744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
85744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        sp<ABuffer> mData;
86744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    };
87744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
88744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    enum State {
89744f5739019d1fd917f981e740b353c3d73fd1a8David Smith      UNINITIALIZED,
90744f5739019d1fd917f981e740b353c3d73fd1a8David Smith      INITIALIZED,
91744f5739019d1fd917f981e740b353c3d73fd1a8David Smith      CONFIGURED,
92744f5739019d1fd917f981e740b353c3d73fd1a8David Smith      STARTED,
93744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    };
94744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
95744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    enum {
96744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatInputBufferFilled       = 'inpF',
97744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatOutputBufferDrained     = 'outD',
98744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatShutdown                = 'shut',
99744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatFlush                   = 'flus',
100744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatResume                  = 'resm',
101744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatAllocateComponent       = 'allo',
102744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatConfigureComponent      = 'conf',
103744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatCreateInputSurface      = 'cisf',
104744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatSignalEndOfInputStream  = 'eois',
105744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatStart                   = 'star',
106744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatSetParameters           = 'setP',
107744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kWhatProcessBuffers          = 'proc',
108744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    };
109744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
110744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    enum {
111744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kPortIndexInput  = 0,
112744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        kPortIndexOutput = 1
113744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    };
114744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
115744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    // member variables
116744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    AString mComponentName;
117744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    State mState;
118744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    status_t mInputEOSResult;
119744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    int32_t mWidth, mHeight;
120744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    int32_t mStride, mSliceHeight;
121744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    int32_t mColorFormatIn, mColorFormatOut;
122744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    size_t mMaxInputSize, mMaxOutputSize;
123744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    int32_t mGeneration;
124744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    sp<AMessage> mNotify;
125744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    sp<AMessage> mInputFormat;
126744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    sp<AMessage> mOutputFormat;
127744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
128744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    sp<MemoryDealer> mDealer[2];
129744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    Vector<BufferInfo> mBuffers[2];
130744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    Vector<BufferInfo*> mAvailableInputBuffers;
131744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    Vector<BufferInfo*> mAvailableOutputBuffers;
132744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    bool mPortEOS[2];
133744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
134744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    sp<SimpleFilter> mFilter;
135e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    sp<GraphicBufferListener> mGraphicBufferListener;
136744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
137744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    // helper functions
138744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void signalProcessBuffers();
139744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void signalError(status_t error);
140744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
141744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    status_t allocateBuffersOnPort(OMX_U32 portIndex);
142744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    BufferInfo *findBufferByID(
143744f5739019d1fd917f981e740b353c3d73fd1a8David Smith            uint32_t portIndex, IOMX::buffer_id bufferID,
144744f5739019d1fd917f981e740b353c3d73fd1a8David Smith            ssize_t *index = NULL);
145744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void postFillThisBuffer(BufferInfo *info);
146744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void postDrainThisBuffer(BufferInfo *info);
147744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void postEOS();
148744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void sendFormatChange();
149744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void requestFillEmptyInput();
150744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void processBuffers();
151744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
152744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onAllocateComponent(const sp<AMessage> &msg);
153744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onConfigureComponent(const sp<AMessage> &msg);
154744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onStart();
155744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onInputBufferFilled(const sp<AMessage> &msg);
156744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onOutputBufferDrained(const sp<AMessage> &msg);
157744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onShutdown(const sp<AMessage> &msg);
158744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onFlush();
159744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    void onSetParameters(const sp<AMessage> &msg);
160e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    void onCreateInputSurface();
161e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    void onInputFrameAvailable();
162e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    void onSignalEndOfInputStream();
163744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
164744f5739019d1fd917f981e740b353c3d73fd1a8David Smith    DISALLOW_EVIL_CONSTRUCTORS(MediaFilter);
165744f5739019d1fd917f981e740b353c3d73fd1a8David Smith};
166744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
167744f5739019d1fd917f981e740b353c3d73fd1a8David Smith}  // namespace android
168744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
169744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#endif  // MEDIA_FILTER_H_
170