| /* |
| * Copyright (C) 2012 Intel Corporation. All rights reserved. |
| * |
| * 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 __ISV_PROCESSOR_H |
| #define __ISV_PROCESSOR_H |
| |
| #include <media/stagefright/MetaData.h> |
| #include "isv_worker.h" |
| |
| #include <utils/Mutex.h> |
| #include <utils/threads.h> |
| #include <utils/Errors.h> |
| #include "isv_bufmanager.h" |
| #define ISV_COMPONENT_LOCK_DEBUG 0 |
| #define ISV_THREAD_DEBUG 0 |
| |
| using namespace android; |
| |
| typedef enum { |
| kPortIndexInput = 0, |
| kPortIndexOutput = 1 |
| }PORT_INDEX; |
| |
| class ISVBufferManager; |
| class ISVProcessorObserver: public RefBase |
| { |
| public: |
| virtual OMX_ERRORTYPE releaseBuffer(PORT_INDEX index, OMX_BUFFERHEADERTYPE* pBuffer, bool bFlush) = 0; |
| }; |
| |
| class ISVProcessor : public Thread |
| { |
| public: |
| ISVProcessor(bool canCallJava, sp<ISVBufferManager> bufferManager, sp<ISVProcessorObserver> observer, uint32_t width, uint32_t height); |
| virtual ~ISVProcessor(); |
| |
| virtual status_t readyToRun(); |
| |
| // Derived class must implement threadLoop(). The thread starts its life |
| // here. There are two ways of using the Thread object: |
| // 1) loop: if threadLoop() returns true, it will be called again if |
| // requestExit() wasn't called. |
| // 2) once: if threadLoop() returns false, the thread will exit upon return. |
| virtual bool threadLoop(); |
| bool isCurrentThread() const; |
| |
| void start(); |
| void stop(); |
| bool isReadytoRun(); |
| |
| //configure FRC factor |
| status_t configFRC(uint32_t fps); |
| //add output buffer into mOutputBuffers |
| void addOutput(OMX_BUFFERHEADERTYPE* output); |
| //add intput buffer into mInputBuffers |
| void addInput(OMX_BUFFERHEADERTYPE* input); |
| //notify flush and wait flush finish |
| void notifyFlush(); |
| void waitFlushFinished(); |
| |
| private: |
| bool getBufForFirmwareOutput(Vector<ISVBuffer*> *fillBufList, |
| uint32_t *fillBufNum); |
| status_t updateFirmwareOutputBufStatus(uint32_t fillBufNum); |
| bool getBufForFirmwareInput(Vector<ISVBuffer*> *procBufList, |
| ISVBuffer **inputBuf, |
| uint32_t *procBufNum ); |
| status_t updateFirmwareInputBufStatus(uint32_t procBufNum); |
| //flush input&ouput buffer queue |
| void flush(); |
| //return whether this fps is valid |
| inline bool isFrameRateValid(uint32_t fps); |
| //auto calculate fps if the framework doesn't set the correct fps |
| status_t calculateFps(int64_t timeStamp, uint32_t* fps); |
| //config vpp filters |
| status_t configFilters(OMX_BUFFERHEADERTYPE* buffer); |
| |
| private: |
| sp<ISVProcessorObserver> mpOwner; |
| android_thread_id_t mThreadId; |
| bool mThreadRunning; |
| |
| sp<ISVWorker> mISVWorker; |
| sp<ISVProfile> mISVProfile; |
| // buffer manager |
| sp<ISVBufferManager> mBufferManager; |
| |
| Vector<OMX_BUFFERHEADERTYPE*> mOutputBuffers; |
| Mutex mOutputLock; // to protect access to mOutputBuffers |
| uint32_t mOutputProcIdx; |
| |
| Vector<OMX_BUFFERHEADERTYPE*> mInputBuffers; |
| Mutex mInputLock; // to protect access to mFillBuffers |
| uint32_t mInputProcIdx; |
| |
| const static uint32_t WINDOW_SIZE = 4; // must >= 2 |
| Vector<int64_t>mTimeWindow; |
| // conditon for thread running |
| Mutex mLock; |
| Condition mRunCond; |
| |
| // condition for seek finish |
| Mutex mEndLock; |
| Condition mEndCond; |
| |
| uint32_t mNumTaskInProcesing; |
| uint32_t mNumRetry; |
| bool mError; |
| bool mbFlush; |
| bool mbBypass; |
| bool mFlagEnd; |
| bool mFrcOn; |
| |
| // ISV filter configuration |
| uint32_t mFilters; |
| FilterParam mFilterParam; |
| }; |
| |
| #endif /* __ISV_THREAD_H*/ |