/****************************************************************************** * * 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_pool.h * * @brief * Media Buffer Pool interface * *
 *
 *   Principal Author: Joerg Detert
 *   Creation date:    Feb 28, 2008
 *
 * 
* *****************************************************************************/ /** * @mainpage Welcome to the MediaBufferPool Interface Documentation * * Doc-Id: xx-xxx-xxx-xxx (MediaBufferPool Implementation Spec)\n * Author: Klaus Kaiser * * @image html silicon_image_logo.gif * \n * * This buffer service is the central instance for all multimedia modules, which * transmit data through buffers. All buffers are grouped into buffer pools. * Each buffer pool contains one or multiple buffers with the same size. The buffer * service usually manages buffers with uncompressed data (e.g. YUV, RGB, PCM) or * compressed data (Audio-PES, Video-PES) but could be used for any type of data. * Beside the plain data each buffer holds sideband information, e.g. timestamp * and frame resolution. The following picture shows the buffer pool structure. * * @image html MediaBufferPool.png * \n * * Allocation and management of memory is done through those Media Buffer Pools. * The Buffer Pool is created with a bounded size of a contiguous physical memory block, * separated into equally sized smaller blocks, the so called Media Buffer. Furthermore * it is possible during initialization to specify a random access or ring buffer like * access pattern, supporting different types of applications. For example hardware blocks, * like decoders, which accesses content in memory through a ring buffer scheme must be * supported. The Media Buffer Pool interface provides functionality to request empty * buffers, to put or release filled buffers and to request filled buffers. This is the * core functionality made available to connected Media Modules. * * * - @subpage media_buffer_queue * */ #ifndef MEDIA_BUFFER_POOL_H #define MEDIA_BUFFER_POOL_H #if defined (__cplusplus) extern "C" { #endif #include "media_buffer.h" /** * Definition of Media Buffer Pool Flags. */ /** Buffer pool acts like a ring buffer, that means no random access */ #define BUFPOOL_RINGBUFFER 0x00000001U /** * @brief Callback function that can be registered to receive * Media Buffer Pool events. */ typedef void (*MediaBufPoolCbNotify_t) ( void* pUserContext, const MediaBuffer_t* pMediaBuffer //!< Just for information purposes, may be used to handle chained ancillary buffers. ); /** * @brief Structure holding all information to notify a registered user */ typedef struct MediaBufPoolNotify_s { MediaBufPoolCbNotify_t fpCallback; /**< Notification callback */ void* pUserContext; /**< Pointer to user context to pass to callback */ } MediaBufPoolNotify_t; /** * @brief MediaBufPool pool object, used to maintain a number of * MediaBuffer_t elements. Each MediaBuffer_t can be automatically * associated to a memory chunk. The pool has to be initialized via * MediaBufPoolCreate() and released via MediaBufPoolDestroy(). */ typedef struct MediaBufPool_s { void* pBaseAddress; /**< Base address of buffer pool. Note that */ /**< a buffer pool is a contingous chunk of */ /**< memory. */ void* pMetaDataMediaBufBase; /**< Base address of meta data buffer pool for Media Buffers. These meta data structures are linked to the Media Buffers. */ uint32_t bufSize; /**< Size of each buffer in bytes. */ uint32_t metaDataSizeMediaBuf; /**< Size of meta data associated with media buffer. */ uint16_t bufNum; /**< Number of buffers in buffer pool. */ uint16_t maxBufNum; uint32_t poolSize; /**< Size of complete buffer pool in bytes. */ MediaBuffer_t* pBufArray; /**< Array used to manage each buffer in the pool */ uint32_t flags; /**< Buffer Pool flags. */ uint16_t freeBufNum; /**< Resources count: Number of free buffers */ uint32_t fillLevel; /**< How many buffers are filled with data */ uint16_t highWatermark; /**< if value is reached high watermark callback is triggered */ uint16_t lowWatermark; /**< if value is reached low watermark callback is triggered */ uint32_t index; /**< Pointer to current index in buffer array (internal use) */ MediaBufPoolNotify_t notify; /**< Array with info about users registered for notification */ } MediaBufPool_t; /** * @brief The MediaBufPoolConfig is used to calculate the amount of memory needed to use * pool. The call to @ref MediaBufPoolGetSize will fill the sizes of the needed memory. * The user is then responsible to allocate the memory and pass the structure to the * @ref MediaBufPoolCreate function. * */ typedef struct MediaBufPoolConfig_s { /* Input parameters */ uint32_t bufSize; /**< Size of memory chunk a buffer represents */ uint32_t metaDataSizeMediaBuf; /**< Size of extra meta data strutucture attached to each Media buffer (pointed to by MediaBuffer_t.pMetaData) */ uint32_t flags; /**< Configuration flags */ uint16_t bufNum; /**< Initial number of buffers */ uint16_t bufAlign; /**< Needed alignment of each memory chunk the buffers represent */ uint16_t maxBufNum; /**< Maximum number of buffers */ /* Output parameters */ uint32_t metaDataMemSize; /**< Size of memory for buffer structures plus extra meta data. This needs to be directly accesable by CPU. */ uint32_t bufMemSize; /**< Size of complete data memory which is represented by the buffers. */ } MediaBufPoolConfig_t; /** * @brief MediaBufPoolMemory is used to pass memory to the Media Buffer Pool. */ typedef struct MediaBufPoolMemory_s { void* pMetaDataMemory; /**< Memory for administrative and extra meta data structures (for MediaBuffer), must be of size MediaBufPoolConfig_t.metaDataMemSize as reported by MediaBufPoolGetSize. */ void* pBufferMemory; /**< Actual memory where the data is going to be placed, must be of size MediaBufPoolConfig_t.bufMemSize as reported by MediaBufPoolGetSize. Furthermore, must be aligned as specified by MediaBufPoolConfig_t.bufAlign. */ } MediaBufPoolMemory_t; /** * @brief Get a free buffer from the MediaBufferPool. * * @param pBufPool Pointer to the MediaBufferPool. * *****************************************************************************/ MediaBuffer_t* MediaBufPoolGetBuffer(MediaBufPool_t* pBufPool); /** * @brief Inform MediaBufferPool that buffer has been filled. * * @param pBuf Full buffer to add. * *****************************************************************************/ void MediaBufPoolBufferFilled(MediaBufPool_t* pBufPool, MediaBuffer_t* pBuf); /** * @brief Free a buffer from the bufferpool. * * @param pBuf Buffer to free * *****************************************************************************/ void MediaBufPoolFreeBuffer(MediaBufPool_t* pBufPool, MediaBuffer_t* pBuf); /** * @brief Calculate the size of the memory the MediaBufferPool needs * for the metadata the internal structure and the array of buffers. * The caller has to assure to fill the structure with the corresponding * information need. He has to fill bufSize, metaDataSize, bufNum, * bufAlign and maxBufNum. With these information the function can * calculate the amount of memory need. * When the function returns the values for bufPoolMemSize and * bufMemSize are filled. * * @param pPoolConfig Configuration parameters for the media buffer pool. * * @return Status of operation. *****************************************************************************/ RESULT MediaBufPoolGetSize(MediaBufPoolConfig_t* pPoolConfig); /** * @brief Create a buffer pool. * * @param pBufPool Pointer to buffer pool object to be created. * @param pPoolConfig Pointer to config params for buffer pool. * @param poolMemory Pool memory information. * * @return Status of operation. *****************************************************************************/ extern RESULT MediaBufPoolCreate(MediaBufPool_t* pBufPool, MediaBufPoolConfig_t* pPoolConfig, MediaBufPoolMemory_t poolMemory); /*****************************************************************************/ /** * @brief Destroy a buffer pool. * * @param pBufPool Pointer to buffer pool object to be destroyed. * * @return Status of operation. *****************************************************************************/ extern RESULT MediaBufPoolDestroy(MediaBufPool_t* pBufPool); /*****************************************************************************/ /** * @brief Reset a buffer pool. * * @param pBufPool Pointer to buffer pool object to be reset. * * @return Status of operation. *****************************************************************************/ extern RESULT MediaBufPoolReset(MediaBufPool_t* pBufPool); /* ***************************************************************************/ /** * @brief Register a callback to get informed about MediaBufPool status. * * @param pBufPool Pointer to buffer pool object. * @param fpCallback Function to be triggered in case of event. * @param pUserContext Pointer passed in each call of the callback. * * @return Status of operation. *****************************************************************************/ extern RESULT MediaBufPoolRegisterCb(MediaBufPool_t* pBufPool, MediaBufPoolCbNotify_t fpCallback, void* pUserContext); /****************************************************************************/ /** * @brief Deregister a callback from MediaBufPool * * @param pBufPool Pointer to buffer pool object. * @param fpCallback Function to be deregistered. * * @return Status of operation. *****************************************************************************/ extern RESULT MediaBufPoolDeregisterCb(MediaBufPool_t* pBufPool, MediaBufPoolCbNotify_t fpCallback); #if defined (__cplusplus) } #endif #endif /* MEDIA_BUFFER_POOL_H*/