/**
 * @brief           GVD API parameter Header
 * @author          AXELL CORPORATION
 * @description     GVD API関連データ型定義
 * @note            none
 * @history         2017_02_22  初版
 * @history         2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017-2019 AXELL CORPORATION, all rights reserved.
 */

#ifndef GVD_API_PARAMS_H
#define GVD_API_PARAMS_H
/* DOM-IGNORE-END */

#include <stdint.h>
#include <stddef.h>

#include "gvd_error.h"

#ifndef GVD_MAX_ENUM
/** eunmのsentinel値 (INT_MAX) */
#define GVD_MAX_ENUM 0x7FFFFFFF
#endif


typedef int32_t (* gvdCbFunc)(void *, void *, gvdError);	/** コールバック関数型 */

/** ストリーム先頭のデータを含む */
#define GVD_BUFFLAG_START (1 << 0)

/** ストリーム末尾のデータを含む */
#define GVD_BUFFLAG_END   (1 << 1)

/** 入力バッファ情報
 *  <p>入力バッファは非キャッシュ領域に配置する必要があります. */
typedef struct {
	void		*buffer;			/** 入力バッファのアドレス<p>4バイト境界に配置してください. */
	int32_t		size_buffer;		/** 入力バッファのサイズ */
	int32_t		offset_data;		/** bufferから入力データ先頭までのオフセット */
	int32_t		size_data;			/** 入力データのサイズ */
	int32_t		seekid;				/** シークID<p>0としてください. */
	uint32_t	timestamp;			/** タイムスタンプ[ms]<p>0としてください. */
	uint32_t	flags;				/** データ先頭・末尾フラグ */
} gvdInBufInfo;

/** 出力バッファ情報
 * <p>出力バッファは非キャッシュ領域に配置する必要があります. */
typedef struct {
	void		*buffer;			/** 出力バッファのアドレス<p>2048バイト境界に配置してください. */
	int32_t		size_buffer;		/** 出力バッファのサイズ */
	int32_t		width;				/** フレームの幅<p>64px単位に切り上げてください. */
	int32_t		height;				/** フレームの高さ<p>32px単位に切り上げてください. */
} gvdOutBufInfo;

/** フレーム情報 */
typedef struct {
	void		*buffer;			/** バッファのアドレス */
	int32_t		size_filled;		/** バッファ内に書き込まれたデータのサイズ */
	int32_t		size_buffer;		/** バッファのサイズ */
	int32_t		timestamp;			/** タイムスタンプ[ms] */
	int32_t		seekid;				/** シークID */
	uint32_t	frame_count;		/** フレーム番号 */
	uint32_t	flags;				/** 開始・終了フレームフラグ */
} gvdFrameInfo;

/** 返却バッファ情報 */
typedef struct {
	void		*buffer;			/** バッファのアドレス */
	int32_t		size;				/** バッファのサイズ */
} gvdDiscardBufInfo;

/** フレームサイズ情報 */
typedef struct {
	int32_t		width;				/** フレームの幅 */
	int32_t		height;				/** フレームの高さ */
	int32_t		buf_count;			/** デコーダバッファの最低限必要な枚数 */
	size_t		buf_size;			/** デコーダバッファの単位サイズ */
} gvdFrameSize;

typedef uint64_t gvdStreamPosition;	/** ストリーム位置 */

/** デコードエラー情報 */
typedef struct {
	gvdError			error;			/** エラーコード */
	gvdStreamPosition	pos;			/** ストリーム位置 */
	int32_t				seekid;			/** シークID */
	uint32_t			frame_count;	/** フレーム番号 */
} gvdDecError;

/** タイムスタンプ情報 */
typedef struct {
	uint32_t	timestamp_ms;		/** タイムスタンプ[ms] */
	uint32_t	frame_id;			/** フレーム番号 */
	uint32_t	index;				/** 位置情報index */
} gvdTimeStamp;

/** シーク種別情報 */
typedef enum {
	GVD_SEEK_BUFINDEX_ABSOLUTE,			/** 位置情報バッファindex絶対値指定 */
	GVD_SEEK_BUFINDEX_RELATIVE,			/** 位置情報バッファindex相対値指定 */
	GVD_SEEK_IMMEDIATE,					/** Seek位置IMMEDIATE指定 */
	GVD_SEEK_FORCE_SIZE = GVD_MAX_ENUM	/** sentinel */
} gvdSeekType;

/** シーク設定情報 */
typedef struct {
	gvdSeekType	type;				/** Seek種別 */
	int32_t		index_offset;		/** 位置情報Indexのオフセット */
	uint32_t	immediate_frame;	/** IMMEDIATE時のフレームID */
	uint32_t	immediate_byte;		/** IMMEDIATE時のSeek先バイト */
} gvdSeekParam;

/** 位置情報取得結果情報 */
typedef enum {
	GVD_SEEKPOS_SUCCESS,					/** 位置情報の取得に成功 */
	GVD_SEEKPOS_ERROR,						/** 位置情報の取得に失敗 */
	GVD_SEEKPOS_FORCE_SIZE = GVD_MAX_ENUM	/** sentinel */
} gvdSeekPosResult;

/** シーク位置情報 */
typedef struct {
	uint32_t			index;		/** 位置情報バッファindex */
	uint32_t			frame_id;	/** フレームID */
	uint32_t			stream_pos;	/** ストリーム位置 */
	gvdSeekPosResult	result;		/** 位置情報取得結果 */
} gvdSeekPosInfo;

/**
 * @brief           GVD初期化時設定情報
 * @description     Streamerが1回にReadするサイズは下式で求められます.<p>
 *                  size = (stream_buf_size / (stream_buf_num * stream_num))
 */
typedef struct {
	gvdCbFunc	func_notify_fatalerror;		/** FatalError用コールバック関数 */
	void		*param_notify_fatalerror;	/** FatalError用コールバック関数に与えるパラメータ */
	uint32_t	vramaddr_mask;				/** VRAMのアドレスマスク */
	uint32_t	bmuaddr_mask;				/** BMUのアドレスマスク */
	uint32_t	stream_buf_size;			/** Streamバッファサイズ[総サイズ] */
	uint32_t	stream_buf_num;				/** Streamバッファ数[1Streamあたりのバッファ数] */
	uint32_t	stream_num;					/** Stream数 */
} gvdInitializeParam;

/** 位置情報バッファ */
typedef struct {
	uint32_t	frame_id;			/** フレーム番号 */
	uint32_t	stream_pos;			/** ストリーム位置 */
} gvdPositionBuffer;

#endif /* GVD_API_PARAMS_H */
