blob: 0c10d11b5202b42fd916b92864d87bffbb475a92 [file] [log] [blame]
/*
* 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 <media/stagefright/CodecBase.h>
namespace android {
class ACodecBufferChannel;
struct GraphicBufferListener;
class MemoryDealer;
struct SimpleFilter;
struct MediaFilter : public CodecBase {
MediaFilter();
virtual std::shared_ptr<BufferChannelBase> getBufferChannel() override;
virtual void initiateAllocateComponent(const sp<AMessage> &msg);
virtual void initiateConfigureComponent(const sp<AMessage> &msg);
virtual void initiateCreateInputSurface();
virtual void initiateSetInputSurface(const sp<PersistentSurface> &surface);
virtual void initiateStart();
virtual void initiateShutdown(bool keepComponentAllocated = false);
virtual void signalFlush();
virtual void signalResume();
virtual void signalRequestIDRFrame();
virtual void signalSetParameters(const sp<AMessage> &msg);
virtual void signalEndOfInputStream();
virtual void onMessageReceived(const sp<AMessage> &msg);
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<MediaCodecBuffer> 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<AMessage> mInputFormat;
sp<AMessage> mOutputFormat;
sp<MemoryDealer> mDealer[2];
Vector<BufferInfo> mBuffers[2];
Vector<BufferInfo*> mAvailableInputBuffers;
Vector<BufferInfo*> mAvailableOutputBuffers;
bool mPortEOS[2];
sp<SimpleFilter> mFilter;
sp<GraphicBufferListener> mGraphicBufferListener;
std::shared_ptr<ACodecBufferChannel> mBufferChannel;
// 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 requestFillEmptyInput();
void processBuffers();
void onAllocateComponent(const sp<AMessage> &msg);
void onConfigureComponent(const sp<AMessage> &msg);
void onStart();
void onInputBufferFilled(const sp<AMessage> &msg);
void onOutputBufferDrained(const sp<AMessage> &msg);
void onShutdown(const sp<AMessage> &msg);
void onFlush();
void onSetParameters(const sp<AMessage> &msg);
void onCreateInputSurface();
void onInputFrameAvailable();
void onSignalEndOfInputStream();
DISALLOW_EVIL_CONSTRUCTORS(MediaFilter);
};
} // namespace android
#endif // MEDIA_FILTER_H_