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