blob: 085945710d8ff3b3ef7c8ba24f829be4ef543733 [file] [log] [blame]
/*
* Copyright (C) 2009 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 OMX_DECODER_H_
#define OMX_DECODER_H_
#include <binder/MemoryDealer.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaSource.h>
#include <media/stagefright/OMXClient.h>
#include <utils/KeyedVector.h>
#include <utils/List.h>
#include <utils/threads.h>
namespace android {
class OMXMediaBuffer;
class OMXDecoder : public MediaSource,
public OMXObserver,
public MediaBufferObserver {
public:
static OMXDecoder *Create(
OMXClient *client, const sp<MetaData> &data);
static OMXDecoder *CreateEncoder(
OMXClient *client, const sp<MetaData> &data);
virtual ~OMXDecoder();
// Caller retains ownership of "source".
void setSource(MediaSource *source);
virtual status_t start(MetaData *params = NULL);
virtual status_t stop();
virtual sp<MetaData> getFormat();
virtual status_t read(
MediaBuffer **buffer, const ReadOptions *options = NULL);
void addCodecSpecificData(const void *data, size_t size);
// from OMXObserver
virtual void onOMXMessage(const omx_message &msg);
// from MediaBufferObserver
virtual void signalBufferReturned(MediaBuffer *buffer);
private:
enum {
kPortIndexInput = 0,
kPortIndexOutput = 1
};
enum PortStatus {
kPortStatusActive = 0,
kPortStatusDisabled = 1,
kPortStatusShutdown = 2,
kPortStatusFlushing = 3
};
OMXClient *mClient;
sp<IOMX> mOMX;
IOMX::node_id mNode;
char *mComponentName;
bool mIsMP3;
MediaSource *mSource;
sp<MetaData> mOutputFormat;
Mutex mLock;
Condition mOutputBufferAvailable;
List<MediaBuffer *> mOutputBuffers;
struct CodecSpecificData {
void *data;
size_t size;
};
List<CodecSpecificData> mCodecSpecificData;
List<CodecSpecificData>::iterator mCodecSpecificDataIterator;
volatile OMX_STATETYPE mState;
OMX_U32 mPortStatusMask;
bool mShutdownInitiated;
typedef List<IOMX::buffer_id> BufferList;
Vector<BufferList> mBuffers;
KeyedVector<IOMX::buffer_id, sp<IMemory> > mBufferMap;
KeyedVector<IOMX::buffer_id, OMXMediaBuffer *> mMediaBufferMap;
sp<MemoryDealer> mDealer;
bool mSeeking;
int64_t mSeekTimeUs;
bool mStarted;
status_t mErrorCondition;
bool mReachedEndOfInput;
OMXDecoder(OMXClient *client, IOMX::node_id node,
const char *mime, const char *codec);
void setPortStatus(OMX_U32 port_index, PortStatus status);
PortStatus getPortStatus(OMX_U32 port_index) const;
void allocateBuffers(OMX_U32 port_index);
void setAMRFormat();
void setAACFormat();
void setVideoOutputFormat(OMX_U32 width, OMX_U32 height);
void setup();
void dumpPortDefinition(OMX_U32 port_index);
void onStart();
void onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
void onEventCmdComplete(OMX_COMMANDTYPE type, OMX_U32 data);
void onEventPortSettingsChanged(OMX_U32 port_index);
void onStateChanged(OMX_STATETYPE to);
void onEmptyBufferDone(IOMX::buffer_id buffer);
void onFillBufferDone(const omx_message &msg);
void onRealEmptyBufferDone(IOMX::buffer_id buffer);
void onRealFillBufferDone(const omx_message &msg);
void initiateShutdown();
void freeInputBuffer(IOMX::buffer_id buffer);
void freeOutputBuffer(IOMX::buffer_id buffer);
void postStart();
void postEmptyBufferDone(IOMX::buffer_id buffer);
void postInitialFillBuffer(IOMX::buffer_id buffer);
OMXDecoder(const OMXDecoder &);
OMXDecoder &operator=(const OMXDecoder &);
};
} // namespace android
#endif // OMX_DECODER_H_