blob: 77d70ff97172fdb4fb68c570f7b6d090a309263e [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* 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 "pv_omx_queue.h"
// Use default DLL entry point
#ifndef OSCL_DLL_H_INCLUDED
#include "oscl_dll.h"
#endif
OSCL_DLL_ENTRY_POINT_DEFAULT()
OSCL_EXPORT_REF OMX_ERRORTYPE QueueInit(QueueType* aQueue)
{
OMX_S32 ii;
QueueElement* pTempQElement = NULL;
aQueue->pFirst = NULL;
aQueue->pFirst = (QueueElement*) oscl_malloc(sizeof(QueueElement));
if (NULL == aQueue->pFirst)
{
return OMX_ErrorInsufficientResources;
}
oscl_memset(aQueue->pFirst, 0, sizeof(QueueElement));
aQueue->pLast = aQueue->pFirst;
aQueue->NumElem = 0;
aQueue->NumElemAdded = 0;
for (ii = 0; ii < MAX_QUEUE_ELEMENTS - 1; ii++)
{
pTempQElement = (QueueElement*) oscl_malloc(sizeof(QueueElement));
if (NULL == pTempQElement)
{
return OMX_ErrorInsufficientResources;
}
oscl_memset(pTempQElement, 0, sizeof(QueueElement));
aQueue->pLast->pQueueNext = pTempQElement;
aQueue->pLast = pTempQElement;
pTempQElement = NULL;
}
aQueue->pLast->pQueueNext = aQueue->pFirst;
aQueue->pLast = aQueue->pFirst;
return OMX_ErrorNone;
}
OSCL_EXPORT_REF OMX_BOOL AddQueueElem(QueueType* aQueue)
{
QueueElement* pTempQElement = NULL;
pTempQElement = (QueueElement*) oscl_malloc(sizeof(QueueElement));
if (NULL == pTempQElement)
{
return OMX_FALSE;
}
oscl_memset(pTempQElement, 0, sizeof(QueueElement));
aQueue->pLast->pQueueNext = pTempQElement;
pTempQElement->pQueueNext = aQueue->pFirst;
aQueue->NumElemAdded++;
return OMX_TRUE;
}
OSCL_EXPORT_REF void QueueDeinit(QueueType* aQueue)
{
OMX_S32 ii;
QueueElement* pTempQElement;
OMX_S32 QueueElemCount = aQueue->NumElemAdded + MAX_QUEUE_ELEMENTS;
pTempQElement = aQueue->pFirst;
for (ii = 0; ii < QueueElemCount ; ii++)
{
if (pTempQElement != NULL)
{
pTempQElement = pTempQElement->pQueueNext;
oscl_free(aQueue->pFirst);
aQueue->pFirst = pTempQElement;
}
}
}
OSCL_EXPORT_REF OMX_ERRORTYPE Queue(QueueType* aQueue, void* aData)
{
if (aQueue->NumElem == (MAX_QUEUE_ELEMENTS + aQueue->NumElemAdded))
{
if (OMX_FALSE == AddQueueElem(aQueue))
{
return OMX_ErrorInsufficientResources;
}
}
if (aQueue->NumElem != 0)
{
aQueue->pLast = aQueue->pLast->pQueueNext;
}
aQueue->pLast->pData = aData;
aQueue->NumElem++;
return OMX_ErrorNone;
}
OSCL_EXPORT_REF void* DeQueue(QueueType* aQueue)
{
void* pData;
if (NULL == aQueue->pFirst->pData)
{
return NULL;
}
pData = aQueue->pFirst->pData;
aQueue->pFirst->pData = NULL;
aQueue->pFirst = aQueue->pFirst->pQueueNext;
aQueue->NumElem--;
if (0 == aQueue->NumElem)
{
aQueue->pLast = aQueue->pFirst;
}
return pData;
}
OSCL_EXPORT_REF OMX_S32 GetQueueNumElem(QueueType* aQueue)
{
return aQueue->NumElem;
}