/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MEDIA_FILTER_H_ #define MEDIA_FILTER_H_ #include namespace android { struct ABuffer; struct GraphicBufferListener; struct MemoryDealer; struct SimpleFilter; struct MediaFilter : public CodecBase { MediaFilter(); virtual void setNotificationMessage(const sp &msg); virtual void initiateAllocateComponent(const sp &msg); virtual void initiateConfigureComponent(const sp &msg); virtual void initiateCreateInputSurface(); virtual void initiateSetInputSurface(const sp &surface); virtual void initiateStart(); virtual void initiateShutdown(bool keepComponentAllocated = false); virtual void signalFlush(); virtual void signalResume(); virtual void signalRequestIDRFrame(); virtual void signalSetParameters(const sp &msg); virtual void signalEndOfInputStream(); virtual void onMessageReceived(const sp &msg); struct PortDescription : public CodecBase::PortDescription { virtual size_t countBuffers(); virtual IOMX::buffer_id bufferIDAt(size_t index) const; virtual sp bufferAt(size_t index) const; protected: PortDescription(); private: friend struct MediaFilter; Vector mBufferIDs; Vector > mBuffers; void addBuffer(IOMX::buffer_id id, const sp &buffer); DISALLOW_EVIL_CONSTRUCTORS(PortDescription); }; protected: virtual ~MediaFilter(); private: struct BufferInfo { enum Status { OWNED_BY_US, OWNED_BY_UPSTREAM, }; IOMX::buffer_id mBufferID; int32_t mGeneration; int32_t mOutputFlags; Status mStatus; sp mData; }; enum State { UNINITIALIZED, INITIALIZED, CONFIGURED, STARTED, }; enum { kWhatInputBufferFilled = 'inpF', kWhatOutputBufferDrained = 'outD', kWhatShutdown = 'shut', kWhatFlush = 'flus', kWhatResume = 'resm', kWhatAllocateComponent = 'allo', kWhatConfigureComponent = 'conf', kWhatCreateInputSurface = 'cisf', kWhatSignalEndOfInputStream = 'eois', kWhatStart = 'star', kWhatSetParameters = 'setP', kWhatProcessBuffers = 'proc', }; enum { kPortIndexInput = 0, kPortIndexOutput = 1 }; // member variables AString mComponentName; State mState; status_t mInputEOSResult; int32_t mWidth, mHeight; int32_t mStride, mSliceHeight; int32_t mColorFormatIn, mColorFormatOut; size_t mMaxInputSize, mMaxOutputSize; int32_t mGeneration; sp mNotify; sp mInputFormat; sp mOutputFormat; sp mDealer[2]; Vector mBuffers[2]; Vector mAvailableInputBuffers; Vector mAvailableOutputBuffers; bool mPortEOS[2]; sp mFilter; sp mGraphicBufferListener; // helper functions void signalProcessBuffers(); void signalError(status_t error); status_t allocateBuffersOnPort(OMX_U32 portIndex); BufferInfo *findBufferByID( uint32_t portIndex, IOMX::buffer_id bufferID, ssize_t *index = NULL); void postFillThisBuffer(BufferInfo *info); void postDrainThisBuffer(BufferInfo *info); void postEOS(); void sendFormatChange(); void requestFillEmptyInput(); void processBuffers(); void onAllocateComponent(const sp &msg); void onConfigureComponent(const sp &msg); void onStart(); void onInputBufferFilled(const sp &msg); void onOutputBufferDrained(const sp &msg); void onShutdown(const sp &msg); void onFlush(); void onSetParameters(const sp &msg); void onCreateInputSurface(); void onInputFrameAvailable(); void onSignalEndOfInputStream(); DISALLOW_EVIL_CONSTRUCTORS(MediaFilter); }; } // namespace android #endif // MEDIA_FILTER_H_