/******************************************************************************
 *
 * Copyright (C) 2015 The Android Open Source Project
 *
 * 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.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/**
*******************************************************************************
* @file
*  impeg2_buf_mgr.h
*
* @brief
*  Function declarations used for buffer management
*
* @author
*  Srinivas T
*
* @remarks
*  None
*
*******************************************************************************
*/
#ifndef _IMPEG2_BUF_MGR_H_
#define _IMPEG2_BUF_MGR_H_

#define BUF_MGR_MAX_CNT 64

#define BUF_MGR_DEC         1
#define BUF_MGR_REF         (1 << 1)
#define BUF_MGR_DISP        (1 << 2)

typedef struct
{
    /**
     * max_buf_cnt
     */
    UWORD32 u4_max_buf_cnt;

    /**
     * active_buf_cnt
     */
    UWORD32 u4_active_buf_cnt;
    /**
     *  au4_status[BUF_MGR_MAX_CNT]
     */
    UWORD32 au4_status[BUF_MGR_MAX_CNT];
    /* The last three bit of status are:    */
    /* Bit 0 - DEC                          */
    /* Bit 1 - REF                          */
    /* Bit 2 - DISP                         */

    void    *apv_ptr[BUF_MGR_MAX_CNT];
}buf_mgr_t;

// intializes the buffer API structure
void impeg2_buf_mgr_init(
                buf_mgr_t *ps_buf_mgr);

// Add buffer to buffer manager. 0: success, -1: fail (u4_active_buf_cnt has reached u4_max_buf_cnt)
WORD32 impeg2_buf_mgr_add(
                buf_mgr_t *ps_buf_mgr,
                void *pv_ptr,
                WORD32 buf_id);

// this function will set the buffer status to DEC
void* impeg2_buf_mgr_get_next_free(
                buf_mgr_t *ps_buf_mgr,
                WORD32 *pi4_id);

// this function will check if there are any free buffers
WORD32 impeg2_buf_mgr_check_free(
                buf_mgr_t *ps_buf_mgr);

// mask will have who released it: DISP:REF:DEC
WORD32 impeg2_buf_mgr_release(
                buf_mgr_t *ps_buf_mgr,
                WORD32 id,
                UWORD32 mask);

// sets the status to one or all of DISP:REF:DEC
WORD32 impeg2_buf_mgr_set_status(
                buf_mgr_t *ps_buf_mgr,
                WORD32 id,
                UWORD32 mask);

// Gets status of the buffer
UWORD32 impeg2_buf_mgr_get_status(
                buf_mgr_t *ps_buf_mgr,
                WORD32 id);

// pass the ID - buffer will be returned
void* impeg2_buf_mgr_get_buf(
                buf_mgr_t *ps_buf_mgr,
                WORD32 id);

// will return number of active buffers
UWORD32 impeg2_buf_mgr_get_num_active_buf(
                buf_mgr_t *ps_buf_mgr);



#endif  //_IMPEG2_BUF_MGR_H_
