mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-06 01:26:49 +08:00
[mpp_thread]: improve reset lock/condition implement
git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@428 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
@@ -84,7 +84,7 @@ static RK_U32 reset_dec_task(Mpp *mpp, HalDecTask *task_dec, PaserTaskWait *wait
|
||||
|
||||
{
|
||||
RK_S32 index;
|
||||
parser->reset_lock();
|
||||
parser->lock(THREAD_RESET);
|
||||
status->curr_task_rdy = 0;
|
||||
task_dec->valid = 0;
|
||||
parser_reset(dec->parser);
|
||||
@@ -112,8 +112,8 @@ static RK_U32 reset_dec_task(Mpp *mpp, HalDecTask *task_dec, PaserTaskWait *wait
|
||||
}
|
||||
|
||||
status->task_parsed_rdy = 0;
|
||||
parser->reset_unlock();
|
||||
parser->reset_signal();
|
||||
parser->unlock(THREAD_RESET);
|
||||
parser->signal(THREAD_RESET);
|
||||
}
|
||||
|
||||
return MPP_OK;
|
||||
@@ -164,7 +164,6 @@ void *mpp_dec_parser_thread(void *data)
|
||||
HalTaskHnd task = NULL;
|
||||
HalTaskInfo task_local;
|
||||
HalDecTask *task_dec = &task_local.dec;
|
||||
MppBuffer buffer = NULL;
|
||||
|
||||
hal_task_info_init(&task_local, MPP_CTX_DEC);
|
||||
|
||||
|
@@ -278,16 +278,16 @@ MPP_RET Mpp::reset()
|
||||
mFrames->flush();
|
||||
mFrames->unlock();
|
||||
|
||||
mThreadCodec->reset_lock();
|
||||
mThreadCodec->lock(THREAD_RESET);
|
||||
|
||||
if (mType == MPP_CTX_DEC) {
|
||||
mpp_dec_reset(mDec);
|
||||
mThreadCodec->signal();
|
||||
mThreadCodec->reset_wait();
|
||||
mThreadCodec->wait(THREAD_RESET);
|
||||
} else {
|
||||
mpp_enc_reset(mEnc);
|
||||
}
|
||||
mThreadCodec->reset_unlock();
|
||||
mThreadCodec->unlock(THREAD_RESET);
|
||||
|
||||
return MPP_OK;
|
||||
}
|
||||
|
@@ -153,6 +153,28 @@ inline void Condition::signal()
|
||||
pthread_cond_signal(&mCond);
|
||||
}
|
||||
|
||||
class MppMutexCond {
|
||||
public:
|
||||
MppMutexCond() {};
|
||||
~MppMutexCond() {};
|
||||
|
||||
void lock() { mLock.lock(); }
|
||||
void unlock() { mLock.unlock(); }
|
||||
void wait() { mCondition.wait(mLock); }
|
||||
void signal() { mCondition.signal(); }
|
||||
private:
|
||||
Mutex mLock;
|
||||
Condition mCondition;
|
||||
};
|
||||
|
||||
typedef enum MppThreadSignal_e {
|
||||
THREAD_WORK,
|
||||
THREAD_RESET,
|
||||
THREAD_SIGNAL_BUTT,
|
||||
} MppThreadSignal;
|
||||
|
||||
#define THREAD_NORMAL 0
|
||||
#define THRE 0
|
||||
|
||||
class MppThread
|
||||
{
|
||||
@@ -165,21 +187,33 @@ public:
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
void lock() { mLock.lock(); }
|
||||
void unlock() { mLock.unlock(); }
|
||||
void wait() { mCondition.wait(mLock); }
|
||||
void signal() { mCondition.signal(); }
|
||||
|
||||
void reset_lock() { mResetLock.lock(); }
|
||||
void reset_unlock() { mResetLock.unlock(); }
|
||||
void reset_wait() { mResetCondition.wait(mResetLock); }
|
||||
void reset_signal() { mResetCondition.signal(); }
|
||||
void lock(MppThreadSignal id = THREAD_WORK)
|
||||
{
|
||||
mpp_assert(id < THREAD_SIGNAL_BUTT);
|
||||
mMutexCond[id].lock();
|
||||
}
|
||||
|
||||
void unlock(MppThreadSignal id = THREAD_WORK)
|
||||
{
|
||||
mpp_assert(id < THREAD_SIGNAL_BUTT);
|
||||
mMutexCond[id].unlock();
|
||||
}
|
||||
|
||||
void wait(MppThreadSignal id = THREAD_WORK)
|
||||
{
|
||||
mpp_assert(id < THREAD_SIGNAL_BUTT);
|
||||
mMutexCond[id].wait();
|
||||
}
|
||||
void signal(MppThreadSignal id = THREAD_WORK)
|
||||
{
|
||||
mpp_assert(id < THREAD_SIGNAL_BUTT);
|
||||
mMutexCond[id].signal();
|
||||
}
|
||||
|
||||
private:
|
||||
Mutex mLock;
|
||||
Condition mCondition;
|
||||
pthread_t mThread;
|
||||
Mutex mResetLock;
|
||||
Condition mResetCondition;
|
||||
MppMutexCond mMutexCond[THREAD_SIGNAL_BUTT];
|
||||
|
||||
MppThreadStatus mStatus;
|
||||
MppThreadFunc mFunction;
|
||||
|
Reference in New Issue
Block a user