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_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,
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
23
mpp/mpp.cpp
23
mpp/mpp.cpp
@@ -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;
|
||||||
|
@@ -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
|
||||||
*
|
*
|
||||||
|
@@ -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:
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user