diff --git a/inc/mpp_err.h b/inc/mpp_err.h index 61841500..aa2fc320 100644 --- a/inc/mpp_err.h +++ b/inc/mpp_err.h @@ -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, diff --git a/inc/rk_mpi_cmd.h b/inc/rk_mpi_cmd.h index 941cdcc6..0ef2cde5 100644 --- a/inc/rk_mpi_cmd.h +++ b/inc/rk_mpi_cmd.h @@ -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, diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index bde574ea..5e092a74 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -16,6 +16,7 @@ #define MODULE_TAG "mpp" +#include #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) - 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 */ 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; diff --git a/mpp/mpp.h b/mpp/mpp.h index e76be09f..8867fd88 100644 --- a/mpp/mpp.h +++ b/mpp/mpp.h @@ -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 * diff --git a/osal/inc/mpp_list.h b/osal/inc/mpp_list.h index b438e855..39379f0d 100644 --- a/osal/inc/mpp_list.h +++ b/osal/inc/mpp_list.h @@ -68,6 +68,7 @@ public: Mutex *mutex(); void wait(); + RK_S32 wait(RK_S64 timeout); void signal(); private: diff --git a/osal/mpp_list.cpp b/osal/mpp_list.cpp index 860d3fd2..da5684bb 100644 --- a/osal/mpp_list.cpp +++ b/osal/mpp_list.cpp @@ -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();