android_mt6572_jiabo/hardware/ti/omap4/camera/inc/OmxFrameDecoder.h
2025-09-05 16:56:03 +08:00

204 lines
6.2 KiB
C++

/*
* Copyright (C) Texas Instruments - http://www.ti.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 OMXFRAMEDECODER_H_
#define OMXFRAMEDECODER_H_
#include <utils/threads.h>
#include <utils/List.h>
#include "FrameDecoder.h"
#include "OMX_Types.h"
#include "OMX_Core.h"
#include "OMX_Component.h"
#include "Decoder_libjpeg.h"
namespace Ti {
namespace Camera {
enum OmxDecoderState {
OmxDecoderState_Unloaded = 0,
OmxDecoderState_Loaded,
OmxDecoderState_Idle,
OmxDecoderState_Executing,
OmxDecoderState_Error,
OmxDecoderState_Invalid,
OmxDecoderState_Reconfigure,
OmxDecoderState_Exit
};
enum PortType {
PortIndexInput = 0,
PortIndexOutput = 1
};
struct OmxMessage {
enum {
EVENT,
EMPTY_BUFFER_DONE,
FILL_BUFFER_DONE,
}type;
union {
// if type == EVENT
struct {
OMX_PTR appData;
OMX_EVENTTYPE event;
OMX_U32 data1;
OMX_U32 data2;
OMX_PTR pEventData;
} eventData;
// if type == (EMPTY_BUFFER_DONE || FILL_BUFFER_DONE)
struct {
OMX_PTR appData;
OMX_BUFFERHEADERTYPE* pBuffHead;
} bufferData;
} u;
};
class CallbackDispatcher;
struct CallbackDispatcherThread : public android::Thread {
CallbackDispatcherThread(CallbackDispatcher *dispatcher)
: mDispatcher(dispatcher) {
}
private:
CallbackDispatcher *mDispatcher;
bool threadLoop();
CallbackDispatcherThread(const CallbackDispatcherThread &);
CallbackDispatcherThread &operator=(const CallbackDispatcherThread &);
};
class CallbackDispatcher
{
public:
CallbackDispatcher();
~CallbackDispatcher();
void post(const OmxMessage &msg);
bool loop();
private:
void dispatch(const OmxMessage &msg);
CallbackDispatcher(const CallbackDispatcher &);
CallbackDispatcher &operator=(const CallbackDispatcher &);
android::Mutex mLock;
android::Condition mQueueChanged;
android::List<OmxMessage> mQueue;
android::sp<CallbackDispatcherThread> mThread;
bool mDone;
};
class OmxFrameDecoder : public FrameDecoder
{
public:
OmxFrameDecoder(DecoderType type = DecoderType_MJPEG);
virtual ~OmxFrameDecoder();
OMX_ERRORTYPE eventHandler(const OMX_EVENTTYPE event, const OMX_U32 data1, const OMX_U32 data2,
const OMX_PTR pEventData);
OMX_ERRORTYPE fillBufferDoneHandler(OMX_BUFFERHEADERTYPE* pBuffHead);
OMX_ERRORTYPE emptyBufferDoneHandler(OMX_BUFFERHEADERTYPE* pBuffHead);
static OMX_ERRORTYPE eventCallback(const OMX_HANDLETYPE component,
const OMX_PTR appData, const OMX_EVENTTYPE event, const OMX_U32 data1, const OMX_U32 data2,
const OMX_PTR pEventData);
static OMX_ERRORTYPE emptyBufferDoneCallback(OMX_HANDLETYPE hComponent, OMX_PTR appData, OMX_BUFFERHEADERTYPE* pBuffHead);
static OMX_ERRORTYPE fillBufferDoneCallback(OMX_HANDLETYPE hComponent, OMX_PTR appData, OMX_BUFFERHEADERTYPE* pBuffHead);
virtual bool getPaddedDimensions(size_t &width, size_t &height);
protected:
virtual void doConfigure (const DecoderParameters& config);
virtual void doProcessInputBuffer();
virtual status_t doStart();
virtual void doStop();
virtual void doFlush();
virtual void doRelease();
private:
status_t setComponentRole();
status_t enableGrallockHandles();
status_t allocateBuffersOutput();
void freeBuffersOnOutput();
void freeBuffersOnInput();
status_t doPortReconfigure();
void dumpPortSettings(PortType port);
status_t getAndConfigureDecoder();
status_t configureJpegPorts(int width, int height);
status_t switchToIdle();
status_t allocateBuffersInput();
status_t disablePortSync(int port);
status_t enablePortSync(int port);
void queueOutputBuffers();
status_t setVideoOutputFormat(OMX_U32 width, OMX_U32 height);
status_t omxInit();
status_t omxGetHandle(OMX_HANDLETYPE *handle, OMX_PTR pAppData, OMX_CALLBACKTYPE & callbacks);
OmxDecoderState getOmxState() { return mCurrentState; }
status_t commitState(OmxDecoderState state) { mPreviousState = mCurrentState; mCurrentState = state; return NO_ERROR; }
status_t setVideoPortFormatType(
OMX_U32 portIndex,
OMX_VIDEO_CODINGTYPE compressionFormat,
OMX_COLOR_FORMATTYPE colorFormat);
status_t omxGetParameter(OMX_INDEXTYPE index, OMX_PTR ptr);
status_t omxSetParameter(OMX_INDEXTYPE index, OMX_PTR ptr);
status_t omxSendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param);
status_t omxGetConfig(OMX_INDEXTYPE index, OMX_PTR ptr);
status_t omxSetConfig(OMX_INDEXTYPE index, OMX_PTR ptr);
status_t omxFillThisBuffer(OMX_BUFFERHEADERTYPE *pOutBufHdr);
status_t omxEmptyThisBuffer(android::sp<MediaBuffer>& inBuffer, OMX_BUFFERHEADERTYPE *pInBufHdr);
void omxDumpPortSettings(OMX_PARAM_PORTDEFINITIONTYPE& def);
void omxDumpBufferHeader (OMX_BUFFERHEADERTYPE* bh);
status_t omxSwitchToExecutingSync();
bool mOmxInialized;
OMX_HANDLETYPE mHandleComp;
OmxDecoderState mCurrentState;
OmxDecoderState mPreviousState;
// Condition and Mutex used during OpenMAX state transitions & command completion
android::Condition mStateCondition;
android::Mutex mHwLock;
android::Vector<OMX_BUFFERHEADERTYPE*> mOutBufferHeaders;
android::Vector<OMX_BUFFERHEADERTYPE*> mInBufferHeaders;
CallbackDispatcher mDispatcher;
bool mStopping;
DecoderType mDecoderType;
// If true we will search for DHT in JPEG buffer
bool mIsNeedCheckDHT;
// If true we always append DHT to JPEG buffer
bool mAlwaysAppendDHT;
};
} //namespace Camera
} //namespace Ti
#endif /* OMXFRAMEDECODER_H_ */