1
0
mirror of https://github.com/ioacademy-jikim/multimedia synced 2025-06-07 07:56:26 +00:00
multimedia/04_day/test-openmax/AnatomyOMXClient.h
2015-08-04 19:14:13 +09:00

114 lines
3.1 KiB
C++

/*
**
** Copyright 2013, kod21236@gmail.com
**
** 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 ANATOMY_OMXCLIENT_H_
#define ANATOMY_OMXCLIENT_H_
#include "ATMParser.h"
#include "StdoutRenderer.h"
#include "OMX_Types.h"
#include "OMX_Core.h"
#include "OMX_Component.h"
#include <utils/threads.h>
#include <utils/Vector.h>
namespace anatomy {
struct AnatomyOMXClient {
public:
AnatomyOMXClient(){}
virtual ~AnatomyOMXClient(){}
void prepare();
void start() { excute(); waitEOF();}
void stop();
private:
void waitEOF() { mEOSCondition.wait(mLock); }
void changeState(OMX_STATETYPE state);
void allocateBuffers();
void freeBuffers();
void init();
void deinit();
void excute();
void waitIdleState() { mIdleCondition.wait(mLock); }
void waitExcutingState() { mExcutingCondition.wait(mLock);}
void waitLoadedState() { mLoadedCondition.wait(mLock);}
void render(void* buffer,int length){mRenderer.render(buffer, length);}
void read(void* buffer,int* length){mParser.read(buffer, length);}
void signalEOF() { mEOSCondition.signal(); }
void signalIdleState() { mIdleCondition.signal(); }
void signalExcutingState() { mExcutingCondition.signal(); }
void signalLoadedState() { mLoadedCondition.signal(); }
void addOMXBufferInfo(OMX_U32 portIndex, OMX_BUFFERHEADERTYPE* header);
void removeOMXBufferInfo(OMX_U32 portIndex, OMX_BUFFERHEADERTYPE* header);
void setStatus(int status){ mStatus = status; }
int getStatus(){ return mStatus; }
static OMX_CALLBACKTYPE kCallbacks;
android::Condition mEOSCondition;
android::Condition mExcutingCondition;
android::Condition mIdleCondition;
android::Condition mLoadedCondition;
android::Mutex mLock;
ATMParser mParser;
StdoutRenderer mRenderer;
OMX_HANDLETYPE mComponentHandle;
int mStatus;
enum {
kPortIndexInput = 0,
kPortIndexOutput = 1
};
struct OMXClientBufferInfo {
OMX_U32 mPortIndex;
OMX_BUFFERHEADERTYPE* mBufferHeader;
};
android::Vector<OMXClientBufferInfo> mBufferInfo;
static OMX_ERRORTYPE OnEvent(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_PTR pAppData,
OMX_IN OMX_EVENTTYPE eEvent,
OMX_IN OMX_U32 nData1,
OMX_IN OMX_U32 nData2,
OMX_IN OMX_PTR pEventData);
static OMX_ERRORTYPE OnEmptyBufferDone(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_PTR pAppData,
OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
static OMX_ERRORTYPE OnFillBufferDone(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_PTR pAppData,
OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
};
} // namespace anatomy
#endif // ANATOMY_OMXCLIENT_H_