mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-05 09:06:50 +08:00
[mpi] : Add a block timeout control command.
When retrieving frames current API only allows to define wether the API should block without any timeout or not block at all. This allows to specify a block timeout via the MPP_SET_OUTPUT_BLOCK_TIMEOUT control operation. Change-Id: Id35ad3d48f72881184009f830c406c3a655e1a90 Signed-off-by: LongChair <LongChair@hotmail.com> Signed-off-by: Randy Li <randy.li@rock-chips.com>
This commit is contained in:
@@ -31,6 +31,7 @@ typedef enum {
|
||||
MPP_ERR_OPEN_FILE = -5,
|
||||
MPP_ERR_VALUE = -6,
|
||||
MPP_ERR_READ_BIT = -7,
|
||||
MPP_ERR_TIMEOUT = -8,
|
||||
|
||||
MPP_ERR_BASE = -1000,
|
||||
|
||||
|
@@ -75,7 +75,9 @@ typedef enum {
|
||||
MPP_CMD_BASE = CMD_MODULE_MPP,
|
||||
MPP_ENABLE_DEINTERLACE,
|
||||
MPP_SET_INPUT_BLOCK,
|
||||
MPP_SET_INTPUT_BLOCK_TIMEOUT,
|
||||
MPP_SET_OUTPUT_BLOCK,
|
||||
MPP_SET_OUTPUT_BLOCK_TIMEOUT,
|
||||
MPP_CMD_END,
|
||||
|
||||
MPP_CODEC_CMD_BASE = CMD_MODULE_CODEC,
|
||||
|
21
mpp/mpp.cpp
21
mpp/mpp.cpp
@@ -16,6 +16,7 @@
|
||||
|
||||
#define MODULE_TAG "mpp"
|
||||
|
||||
#include <errno.h>
|
||||
#include "mpp_log.h"
|
||||
#include "mpp_mem.h"
|
||||
#include "mpp_env.h"
|
||||
@@ -52,6 +53,7 @@ Mpp::Mpp()
|
||||
mOutputTaskQueue(NULL),
|
||||
mInputBlock(MPP_POLL_NON_BLOCK),
|
||||
mOutputBlock(MPP_POLL_NON_BLOCK),
|
||||
mOutputBlockTimeout(-1),
|
||||
mThreadCodec(NULL),
|
||||
mThreadHal(NULL),
|
||||
mDec(NULL),
|
||||
@@ -261,6 +263,8 @@ MPP_RET Mpp::put_packet(MppPacket packet)
|
||||
|
||||
MPP_RET Mpp::get_frame(MppFrame *frame)
|
||||
{
|
||||
RK_S32 ret;
|
||||
|
||||
if (!mInitDone)
|
||||
return MPP_NOK;
|
||||
|
||||
@@ -270,7 +274,21 @@ MPP_RET Mpp::get_frame(MppFrame *frame)
|
||||
if (0 == mFrames->list_size()) {
|
||||
mThreadCodec->signal();
|
||||
if (mOutputBlock == MPP_POLL_BLOCK)
|
||||
{
|
||||
if (mOutputBlockTimeout >= 0)
|
||||
{
|
||||
ret = mFrames->wait(mOutputBlockTimeout);
|
||||
if (ret)
|
||||
{
|
||||
if (ret == ETIMEDOUT)
|
||||
return MPP_ERR_TIMEOUT;
|
||||
else
|
||||
return MPP_NOK;
|
||||
}
|
||||
}
|
||||
else
|
||||
mFrames->wait();
|
||||
}
|
||||
/* NOTE: this sleep is to avoid user's dead loop */
|
||||
msleep(1);
|
||||
}
|
||||
@@ -626,6 +644,9 @@ MPP_RET Mpp::control_mpp(MpiCmd cmd, MppParam param)
|
||||
MppPollType block = *((MppPollType *)param);
|
||||
mOutputBlock = block;
|
||||
} break;
|
||||
case MPP_SET_OUTPUT_BLOCK_TIMEOUT: {
|
||||
mOutputBlockTimeout = *((RK_S64 *)param);
|
||||
} break;
|
||||
default : {
|
||||
ret = MPP_NOK;
|
||||
} break;
|
||||
|
@@ -112,6 +112,7 @@ public:
|
||||
|
||||
MppPollType mInputBlock;
|
||||
MppPollType mOutputBlock;
|
||||
RK_S64 mOutputBlockTimeout;
|
||||
/*
|
||||
* There are two threads for each decoder/encoder: codec thread and hal thread
|
||||
*
|
||||
|
@@ -68,6 +68,7 @@ public:
|
||||
Mutex *mutex();
|
||||
|
||||
void wait();
|
||||
RK_S32 wait(RK_S64 timeout);
|
||||
void signal();
|
||||
|
||||
private:
|
||||
|
@@ -274,6 +274,11 @@ void mpp_list::wait()
|
||||
mCondition.wait(mMutex);
|
||||
}
|
||||
|
||||
RK_S32 mpp_list::wait(RK_S64 timeout)
|
||||
{
|
||||
return mCondition.timedwait(mMutex, timeout);
|
||||
}
|
||||
|
||||
void mpp_list::signal()
|
||||
{
|
||||
mCondition.signal();
|
||||
|
Reference in New Issue
Block a user