[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:
LongChair
2017-03-21 08:46:22 +01:00
committed by Randy Li
parent 83fba535db
commit a3f463f9ce
6 changed files with 32 additions and 1 deletions

View File

@@ -31,6 +31,7 @@ typedef enum {
MPP_ERR_OPEN_FILE = -5, MPP_ERR_OPEN_FILE = -5,
MPP_ERR_VALUE = -6, MPP_ERR_VALUE = -6,
MPP_ERR_READ_BIT = -7, MPP_ERR_READ_BIT = -7,
MPP_ERR_TIMEOUT = -8,
MPP_ERR_BASE = -1000, MPP_ERR_BASE = -1000,

View File

@@ -75,7 +75,9 @@ typedef enum {
MPP_CMD_BASE = CMD_MODULE_MPP, MPP_CMD_BASE = CMD_MODULE_MPP,
MPP_ENABLE_DEINTERLACE, MPP_ENABLE_DEINTERLACE,
MPP_SET_INPUT_BLOCK, MPP_SET_INPUT_BLOCK,
MPP_SET_INTPUT_BLOCK_TIMEOUT,
MPP_SET_OUTPUT_BLOCK, MPP_SET_OUTPUT_BLOCK,
MPP_SET_OUTPUT_BLOCK_TIMEOUT,
MPP_CMD_END, MPP_CMD_END,
MPP_CODEC_CMD_BASE = CMD_MODULE_CODEC, MPP_CODEC_CMD_BASE = CMD_MODULE_CODEC,

View File

@@ -16,6 +16,7 @@
#define MODULE_TAG "mpp" #define MODULE_TAG "mpp"
#include <errno.h>
#include "mpp_log.h" #include "mpp_log.h"
#include "mpp_mem.h" #include "mpp_mem.h"
#include "mpp_env.h" #include "mpp_env.h"
@@ -52,6 +53,7 @@ Mpp::Mpp()
mOutputTaskQueue(NULL), mOutputTaskQueue(NULL),
mInputBlock(MPP_POLL_NON_BLOCK), mInputBlock(MPP_POLL_NON_BLOCK),
mOutputBlock(MPP_POLL_NON_BLOCK), mOutputBlock(MPP_POLL_NON_BLOCK),
mOutputBlockTimeout(-1),
mThreadCodec(NULL), mThreadCodec(NULL),
mThreadHal(NULL), mThreadHal(NULL),
mDec(NULL), mDec(NULL),
@@ -261,6 +263,8 @@ MPP_RET Mpp::put_packet(MppPacket packet)
MPP_RET Mpp::get_frame(MppFrame *frame) MPP_RET Mpp::get_frame(MppFrame *frame)
{ {
RK_S32 ret;
if (!mInitDone) if (!mInitDone)
return MPP_NOK; return MPP_NOK;
@@ -270,7 +274,21 @@ MPP_RET Mpp::get_frame(MppFrame *frame)
if (0 == mFrames->list_size()) { if (0 == mFrames->list_size()) {
mThreadCodec->signal(); mThreadCodec->signal();
if (mOutputBlock == MPP_POLL_BLOCK) if (mOutputBlock == MPP_POLL_BLOCK)
mFrames->wait(); {
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 */ /* NOTE: this sleep is to avoid user's dead loop */
msleep(1); msleep(1);
} }
@@ -626,6 +644,9 @@ MPP_RET Mpp::control_mpp(MpiCmd cmd, MppParam param)
MppPollType block = *((MppPollType *)param); MppPollType block = *((MppPollType *)param);
mOutputBlock = block; mOutputBlock = block;
} break; } break;
case MPP_SET_OUTPUT_BLOCK_TIMEOUT: {
mOutputBlockTimeout = *((RK_S64 *)param);
} break;
default : { default : {
ret = MPP_NOK; ret = MPP_NOK;
} break; } break;

View File

@@ -112,6 +112,7 @@ public:
MppPollType mInputBlock; MppPollType mInputBlock;
MppPollType mOutputBlock; MppPollType mOutputBlock;
RK_S64 mOutputBlockTimeout;
/* /*
* There are two threads for each decoder/encoder: codec thread and hal thread * There are two threads for each decoder/encoder: codec thread and hal thread
* *

View File

@@ -68,6 +68,7 @@ public:
Mutex *mutex(); Mutex *mutex();
void wait(); void wait();
RK_S32 wait(RK_S64 timeout);
void signal(); void signal();
private: private:

View File

@@ -274,6 +274,11 @@ void mpp_list::wait()
mCondition.wait(mMutex); mCondition.wait(mMutex);
} }
RK_S32 mpp_list::wait(RK_S64 timeout)
{
return mCondition.timedwait(mMutex, timeout);
}
void mpp_list::signal() void mpp_list::signal()
{ {
mCondition.signal(); mCondition.signal();