/******************************************************************************
 *
 * Copyright 2007, Silicon Image, Inc.  All rights reserved.
 * No part of this work may be reproduced, modified, distributed, transmitted,
 * transcribed, or translated into any language or computer format, in any form
 * or by any means without written permission of: Silicon Image, Inc., 1060
 * East Arques Avenue, Sunnyvale, California 94085
 *
 *****************************************************************************/
/**
 * @file media_buffer.h
 *
 * @brief
 *          Media Buffer interface
 *
 * 
 *
 *   Principal Author: Joerg Detert
 *   Creation date:    Feb 28, 2008
 *
 * 
 *
 *****************************************************************************/
#ifndef MEDIA_BUFFER_H_
#define MEDIA_BUFFER_H_
#include 
#include 
#include "rk_aiq_comm.h"
#if defined (__cplusplus)
extern "C" {
#endif
#define RET_SUCCESS             0   //!< this has to be 0, if clauses rely on it
#define RET_FAILURE             1   //!< general failure
#define RET_NOTSUPP             2   //!< feature not supported
#define RET_BUSY                3   //!< there's already something going on...
#define RET_CANCELED            4   //!< operation canceled
#define RET_OUTOFMEM            5   //!< out of memory
#define RET_OUTOFRANGE          6   //!< parameter/value out of range
#define RET_IDLE                7   //!< feature/subsystem is in idle state
#define RET_WRONG_HANDLE        8   //!< handle is wrong
#define RET_NULL_POINTER        9   //!< the/one/all parameter(s) is a(are) NULL pointer(s)
#define RET_NOTAVAILABLE       10   //!< profile not available
#define RET_DIVISION_BY_ZERO   11   //!< a divisor equals ZERO
#define RET_WRONG_STATE        12   //!< state machine in wrong state
#define RET_INVALID_PARM       13   //!< invalid parameter
#define RET_PENDING            14   //!< command pending
#define RET_WRONG_CONFIG       15   //!< given configuration is invalid
typedef unsigned long          ulong_t;
/**
 * @brief The MediaBufferPool holds elements from type MediaBuffer_t.
 */
typedef struct MediaBuffer_s
{
    uint8_t*      pBaseAddress; /**< Base address of system memory buffer (can differ from
                                     actual buffer start address, set in ScmiBuffer). */
    uint32_t      baseSize;     /**< Base size of buffer (can differ from actual buffer
                                     size, set in ScmiBuffer). */
    uint32_t      lockCount;    /**< Counting how many times buffer is used. 0 means
                                     buffer belongs to pool and is free. */
    void*         pOwner;
    void*         pMetaData;    /**< Pointer to optional meta data structure. */
} MediaBuffer_t;
/*****************************************************************************/
/**
 * @brief   Initialize a mutex.
 *
 * @param
 *
 *****************************************************************************/
void AtomicMutexInit();
/*****************************************************************************/
/**
 * @brief   Destroy a mutex.
 *
 * @param
 *
 *****************************************************************************/
void AtomicMutexDestory();
/*****************************************************************************/
/**
 * @brief   Initialize a @ref MediaBuffer_t.
 *
 * @param   pBuf    Buffer to initialize.
 *
 *****************************************************************************/
extern void MediaBufInit(MediaBuffer_t* pBuf);
/*****************************************************************************/
/**
 * @brief Lock a buffer of a owning buffer pool. Buffer will not be available as
 *        empty buffer until unlocked as many times as locked before
 *        and released.
 *
 * @param   pBufQueue   Pointer to Media Buffer Queue object.
 * @param   pBuf        Pointer to media buffer.
 *
 * @return  Status of operation.
 *****************************************************************************/
extern RESULT MediaBufLockBuffer(MediaBuffer_t*   pBuf);
/*****************************************************************************/
/**
 * @brief Unlock a buffer of a owning buffer pool which has previously been locked.
 *
 * @param   pBufQueue   Pointer to Media Buffer Queue object.
 * @param   pBuf        Pointer to media buffer.
 *
 * @return  Status of operation.
 *****************************************************************************/
extern RESULT MediaBufUnlockBuffer(MediaBuffer_t*   pBuf);
#if defined (__cplusplus)
}
#endif
#endif /*MEDIA_BUFFER_H_*/