diff --git a/osal/CMakeLists.txt b/osal/CMakeLists.txt index 5c6ed7fe..e44b560e 100644 --- a/osal/CMakeLists.txt +++ b/osal/CMakeLists.txt @@ -25,6 +25,7 @@ add_library(osal STATIC mpp_allocator.cpp mpp_thread.cpp mpp_common.cpp + mpp_queue.cpp mpp_time.cpp mpp_list.cpp mpp_mem.cpp diff --git a/osal/inc/mpp_queue.h b/osal/inc/mpp_queue.h new file mode 100644 index 00000000..f5edb94c --- /dev/null +++ b/osal/inc/mpp_queue.h @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Rockchip Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MPP_QUEUE_H__ +#define __MPP_QUEUE_H__ + +#include "mpp_list.h" + +class MppQueue: public mpp_list +{ +private: + sem_t mQueuePending; + int mFlushFlag; +public: + MppQueue(node_destructor func); + ~MppQueue(); + RK_S32 push(void *data, RK_S32 size); + RK_S32 pull(void *data, RK_S32 size); + RK_S32 flush(); +}; + +#endif diff --git a/osal/mpp_queue.cpp b/osal/mpp_queue.cpp new file mode 100644 index 00000000..e8b14a91 --- /dev/null +++ b/osal/mpp_queue.cpp @@ -0,0 +1,61 @@ +/* + * Copyright 2017 Rockchip Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mpp_err.h" +#include "mpp_queue.h" + +MppQueue::MppQueue(node_destructor func) + : mpp_list(func), mFlushFlag(0) +{ + sem_init(&mQueuePending, 0, 0); +} + +MppQueue::~MppQueue() +{ + sem_destroy (&mQueuePending); +} + +RK_S32 MppQueue::push(void *data, RK_S32 size) +{ + RK_S32 ret = 0; + + ret = mpp_list::add_at_tail(data, size); + mFlushFlag = 0; + sem_post(&mQueuePending); + + return ret; +} + +RK_S32 MppQueue::pull(void *data, RK_S32 size) +{ + if (!mFlushFlag) + sem_wait(&mQueuePending); + { + AutoMutex autoLock(mpp_list::mutex()); + if (!mpp_list::list_size()) + return MPP_NOK; + + return mpp_list::del_at_head(data, size); + } + return MPP_ERR_INIT; +} + +RK_S32 MppQueue::flush() +{ + mFlushFlag = 1; + sem_post(&mQueuePending); + return mpp_list::flush(); +}