/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#ifndef _FRAMEQUEUE_H_
#define _FRAMEQUEUE_H_

#include "vpp_com.h"
#ifdef __cplusplus
extern "C" {
#endif

/* structure for frame descriptor queue */
typedef struct FRAMEQUEUE_T {
	void *frame_descrs[MAX_NUM_FRAMES];
	int shadow_head;
	int head;
	int tail;
} FRAMEQUEUE;

/* frame queue APIs */
/******************************************************************************
 * FUNCTION: reset frame queue to be empty state
 * PARAMS: *frmq - pionter to a frame queue
 *
 ******************************************************************************/
void frmq_reset(FRAMEQUEUE *frmq);

/******************************************************************************
 * FUNCTION: push a frame descriptor into frame queue
 * PARAMS: *frmq - pointer to frame queue
 *		   *frm_descr - pointer to a frame descriptor
 * RETURN: 1 - succeed
 *		   0 - fail: frame queue is full
 ******************************************************************************/
int frmq_push(FRAMEQUEUE *frmq, void *frm_descr);

/******************************************************************************
 * FUNCTION: pop a frame descriptor out of a frame queue
 *			 but actually without update head pointer.
 * PARAMS: *frmq - pointer to a frame queue
 *		   **frm_descr - pointer to the frame descriptor
 * RETURN: 1 - succeed
 *		   0 - command queue is empty, no command is available
 * NOTE: use pop_commit to actually update head pointer.
 ******************************************************************************/
int frmq_pop(FRAMEQUEUE *frmq, void **frm_descr);

/******************************************************************************
 * FUNCTION: commit previous pop operation
 *			 by actually update head pointer.
 * PARAMS: *frmq - pointer to a frame queue
 * RETURN: 1 - succeed
 *		   0 - command queue is empty, no command is available
 ******************************************************************************/
int frmq_pop_commit(FRAMEQUEUE *frmq);

#ifdef __cplusplus
}
#endif

#endif

