/**
 * @brief           Movie Player Sample API I/F
 * @author          AXELL CORPORATION
 * @description     APIインタフェース
 * @note            none
 * @history         2017_02_22  初版
 * @history         2017_10_26  Ver2.0
 */

/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
 */

//DOM-IGNORE-BEGIN
#ifndef __MPS_API_H_
#define __MPS_API_H_
//DOM-IGNORE-END

#include "mps/mps_type.h"
#include "mps/mps_fileio.h"
#include "mps/mps_mp4perser.h"
#include "mps/mps_gvdinterface.h"

/**
 * 動的メモリ確保の処理を定義してください.<p>
 * この関数はMPS内部からコールされます.
 *
 * @brief 動的メモリ確保ルーチン
 * @param size [in] 要求サイズ
 * @return NULL 確保失敗
 * @return Otherwise 確保したメモリの先頭アドレス
 * @note   8バイト以上の境界で確保してください.
 */
extern void *MPS_Malloc(size_t size);

/**
 * 動的メモリ解放の処理を定義してください.<p>
 * この関数はMPS内部からコールされます.
 *
 * @brief 動的メモリ解放ルーチン
 * @param ptr [in] 解放するメモリの先頭アドレス
 * @return any エラーコード
 * @note エラー内容に関しては"AG903_error.h"を参照のこと.
 */
extern int32_t MPS_Free(void *ptr);

/**
 * 必要に応じて、エラー出力の処理を定義してください.<p>
 * この関数はMPS内部からコールされます.
 *
 * @brief エラー出力ルーチン
 * @param fmt [in] 書式
 * @return >=0 出力した文字数
 * @return <0 エラーコード
 * @note エラー内容に関しては"AG903_error.h"を参照のこと.
 */
extern int32_t MPS_ErrPrintf(const char *fmt, ...);

/**
 * ディレイ関数の定義
 * @param UW [in] ディレイ量[ms]
 * @return ER エラーコード
 * @return エラーコードはITRON側のコードを参照.
 */
#include "itron.h"
extern ER dly_tsk(UW);

/**
 * サンプルではITRON環境なのでITRONのdly_tskに置き換え
 * @brief ディレイ関数の定義
 */
#define MPS_Delay dly_tsk

/* getters */
gvdInitializeParam *MPS_getGVDInitParam(void);
mpsConfig *MPS_getConfig(void);
mpsContext *MPS_getContext(uint32_t movie_id);
mpsInfoPos *MPS_getInfoPos(uint32_t movie_id);
mpsAVCHeader *MPS_getAVCHeader(uint32_t movie_id);

int32_t MPS_Initialize(mpsSetting setting);
uint32_t MPS_GetRequiredWorkMemorySize(void);
int32_t MPS_Start(mpsConfig config);
int32_t MPS_Parse(uint32_t movie_id, char *filename);
int32_t MPS_Open(uint32_t movie_id, char *filename);
int32_t MPS_Play(uint32_t movie_id);
int32_t MPS_Pause(uint32_t movie_id);
int32_t MPS_Seek(uint32_t movie_id, uint32_t pos, mpsSeekMode mode);
int32_t MPS_Forward(uint32_t movie_id, uint32_t speed);
int32_t MPS_Rewind(uint32_t movie_id, uint32_t speed);
int32_t MPS_Close(uint32_t movie_id);
int32_t MPS_Finalize(void);

int32_t MPS_PutOutputBuffer(int32_t movie_id, mpsOutBufInfo *bufinfo);
int32_t MPS_Async(void);

int32_t cbMPSConnectDone(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSDisConnectDone(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSPlayAccepted(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSRewindAccepted(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSForwardAccepted(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSDecodeStreamEnd(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSPauseDone(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSSeekDone(void *param_gvd, void *param_user, gvdError error);
int32_t cbMPSRewindDone(void *param_gvd, void *param_user, gvdError error);

#endif /* __MPS_API_H_ */
