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 24dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimclass ACodecBufferChannel; 25e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smithstruct GraphicBufferListener; 2661c2351da89cb281b2dfd56c6c6779ccb4bc1172Dan Willemsenclass MemoryDealer; 27744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstruct SimpleFilter; 28744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 29744f5739019d1fd917f981e740b353c3d73fd1a8David Smithstruct MediaFilter : public CodecBase { 30744f5739019d1fd917f981e740b353c3d73fd1a8David Smith MediaFilter(); 31744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 32dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim virtual std::shared_ptr<BufferChannelBase> getBufferChannel() override; 33744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void initiateAllocateComponent(const sp<AMessage> &msg); 34744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void initiateConfigureComponent(const sp<AMessage> &msg); 35744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void initiateCreateInputSurface(); 368f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang virtual void initiateSetInputSurface(const sp<PersistentSurface> &surface); 37d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 38744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void initiateStart(); 39744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void initiateShutdown(bool keepComponentAllocated = false); 40744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 41744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void signalFlush(); 42744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void signalResume(); 43744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 44744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void signalRequestIDRFrame(); 45744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void signalSetParameters(const sp<AMessage> &msg); 46744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void signalEndOfInputStream(); 47744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 48744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual void onMessageReceived(const sp<AMessage> &msg); 49744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 50744f5739019d1fd917f981e740b353c3d73fd1a8David Smithprotected: 51744f5739019d1fd917f981e740b353c3d73fd1a8David Smith virtual ~MediaFilter(); 52744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 53744f5739019d1fd917f981e740b353c3d73fd1a8David Smithprivate: 54744f5739019d1fd917f981e740b353c3d73fd1a8David Smith struct BufferInfo { 55744f5739019d1fd917f981e740b353c3d73fd1a8David Smith enum Status { 56744f5739019d1fd917f981e740b353c3d73fd1a8David Smith OWNED_BY_US, 57744f5739019d1fd917f981e740b353c3d73fd1a8David Smith OWNED_BY_UPSTREAM, 58744f5739019d1fd917f981e740b353c3d73fd1a8David Smith }; 59744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 60744f5739019d1fd917f981e740b353c3d73fd1a8David Smith IOMX::buffer_id mBufferID; 61744f5739019d1fd917f981e740b353c3d73fd1a8David Smith int32_t mGeneration; 62744f5739019d1fd917f981e740b353c3d73fd1a8David Smith int32_t mOutputFlags; 63744f5739019d1fd917f981e740b353c3d73fd1a8David Smith Status mStatus; 64744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 657e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim sp<MediaCodecBuffer> mData; 66744f5739019d1fd917f981e740b353c3d73fd1a8David Smith }; 67744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 68744f5739019d1fd917f981e740b353c3d73fd1a8David Smith enum State { 69744f5739019d1fd917f981e740b353c3d73fd1a8David Smith UNINITIALIZED, 70744f5739019d1fd917f981e740b353c3d73fd1a8David Smith INITIALIZED, 71744f5739019d1fd917f981e740b353c3d73fd1a8David Smith CONFIGURED, 72744f5739019d1fd917f981e740b353c3d73fd1a8David Smith STARTED, 73744f5739019d1fd917f981e740b353c3d73fd1a8David Smith }; 74744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 75744f5739019d1fd917f981e740b353c3d73fd1a8David Smith enum { 76744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatInputBufferFilled = 'inpF', 77744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatOutputBufferDrained = 'outD', 78744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatShutdown = 'shut', 79744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatFlush = 'flus', 80744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatResume = 'resm', 81744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatAllocateComponent = 'allo', 82744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatConfigureComponent = 'conf', 83744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatCreateInputSurface = 'cisf', 84744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatSignalEndOfInputStream = 'eois', 85744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatStart = 'star', 86744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatSetParameters = 'setP', 87744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kWhatProcessBuffers = 'proc', 88744f5739019d1fd917f981e740b353c3d73fd1a8David Smith }; 89744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 90744f5739019d1fd917f981e740b353c3d73fd1a8David Smith enum { 91744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kPortIndexInput = 0, 92744f5739019d1fd917f981e740b353c3d73fd1a8David Smith kPortIndexOutput = 1 93744f5739019d1fd917f981e740b353c3d73fd1a8David Smith }; 94744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 95744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // member variables 96744f5739019d1fd917f981e740b353c3d73fd1a8David Smith AString mComponentName; 97744f5739019d1fd917f981e740b353c3d73fd1a8David Smith State mState; 98744f5739019d1fd917f981e740b353c3d73fd1a8David Smith status_t mInputEOSResult; 99744f5739019d1fd917f981e740b353c3d73fd1a8David Smith int32_t mWidth, mHeight; 100744f5739019d1fd917f981e740b353c3d73fd1a8David Smith int32_t mStride, mSliceHeight; 101744f5739019d1fd917f981e740b353c3d73fd1a8David Smith int32_t mColorFormatIn, mColorFormatOut; 102744f5739019d1fd917f981e740b353c3d73fd1a8David Smith size_t mMaxInputSize, mMaxOutputSize; 103744f5739019d1fd917f981e740b353c3d73fd1a8David Smith int32_t mGeneration; 104744f5739019d1fd917f981e740b353c3d73fd1a8David Smith sp<AMessage> mInputFormat; 105744f5739019d1fd917f981e740b353c3d73fd1a8David Smith sp<AMessage> mOutputFormat; 106744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 107744f5739019d1fd917f981e740b353c3d73fd1a8David Smith sp<MemoryDealer> mDealer[2]; 108744f5739019d1fd917f981e740b353c3d73fd1a8David Smith Vector<BufferInfo> mBuffers[2]; 109744f5739019d1fd917f981e740b353c3d73fd1a8David Smith Vector<BufferInfo*> mAvailableInputBuffers; 110744f5739019d1fd917f981e740b353c3d73fd1a8David Smith Vector<BufferInfo*> mAvailableOutputBuffers; 111744f5739019d1fd917f981e740b353c3d73fd1a8David Smith bool mPortEOS[2]; 112744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 113744f5739019d1fd917f981e740b353c3d73fd1a8David Smith sp<SimpleFilter> mFilter; 114e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith sp<GraphicBufferListener> mGraphicBufferListener; 115744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 116dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim std::shared_ptr<ACodecBufferChannel> mBufferChannel; 117dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim 118744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // helper functions 119744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void signalProcessBuffers(); 120744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void signalError(status_t error); 121744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 122744f5739019d1fd917f981e740b353c3d73fd1a8David Smith status_t allocateBuffersOnPort(OMX_U32 portIndex); 123744f5739019d1fd917f981e740b353c3d73fd1a8David Smith BufferInfo *findBufferByID( 124744f5739019d1fd917f981e740b353c3d73fd1a8David Smith uint32_t portIndex, IOMX::buffer_id bufferID, 125744f5739019d1fd917f981e740b353c3d73fd1a8David Smith ssize_t *index = NULL); 126744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void postFillThisBuffer(BufferInfo *info); 127744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void postDrainThisBuffer(BufferInfo *info); 128744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void postEOS(); 129744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void requestFillEmptyInput(); 130744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void processBuffers(); 131744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 132744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onAllocateComponent(const sp<AMessage> &msg); 133744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onConfigureComponent(const sp<AMessage> &msg); 134744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onStart(); 135744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onInputBufferFilled(const sp<AMessage> &msg); 136744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onOutputBufferDrained(const sp<AMessage> &msg); 137744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onShutdown(const sp<AMessage> &msg); 138744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onFlush(); 139744f5739019d1fd917f981e740b353c3d73fd1a8David Smith void onSetParameters(const sp<AMessage> &msg); 140e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith void onCreateInputSurface(); 141e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith void onInputFrameAvailable(); 142e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith void onSignalEndOfInputStream(); 143744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 144744f5739019d1fd917f981e740b353c3d73fd1a8David Smith DISALLOW_EVIL_CONSTRUCTORS(MediaFilter); 145744f5739019d1fd917f981e740b353c3d73fd1a8David Smith}; 146744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 147744f5739019d1fd917f981e740b353c3d73fd1a8David Smith} // namespace android 148744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 149744f5739019d1fd917f981e740b353c3d73fd1a8David Smith#endif // MEDIA_FILTER_H_ 150