/**
 * @brief           VID Manager Header
 * @author          AXELL CORPORATION
 * @description     VID Manager Layer.
 * @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 AXELL CORPORATION, all rights reserved.
 */

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

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <stdbool.h>
#include "AG903_errno.h"

/** デジタルビデオ入力ポート数 */
#define AG903_VID_MGR_MAX_IN_PORTS          (2)
/** デジタルビデオ出力ポート数 */
#define AG903_VID_MGR_MAX_OUT_PORTS         (4)

/** デジタルビデオ入力ポートハンドルを識別するユニークなID */
#define AG903_VID_MGR_INPUT_HANDLE_ID       (0xB1234BBB)
/** デジタルビデオ出力ポートハンドルを識別するユニークなID */
#define AG903_VID_MGR_OUTPUT_HANDLE_ID      (0xB5678BBB)

/** 入力ポートハンドル */
#define AG903_VID_MGR_INPUT_HANDLE          (0)
/** 出力ポートハンドル */
#define AG903_VID_MGR_OUTPUT_HANDLE         (1)

/** 入力フォーマット 24bit（RGB888、YCbCr444）Ch0出力 */
#define AG903_VID_MGR_24BIT_TO_CH0          (0)
/** 入力フォーマット 8bit Ch0入力（YCbCr422）Ch0出力 */
#define AG903_VID_MGR_8BITCH0_TO_CH0        (1)
/** 入力フォーマット 8bit Ch1入力（YCbCr422）Ch1出力 */
#define AG903_VID_MGR_8BITCH1_TO_CH1        (2)
/** 入力フォーマット 8bit Ch0、1入力（YCbCr422）Ch0、1出力 */
#define AG903_VID_MGR_8BITCH01_TO_CH01      (3)
/** 入力フォーマット 8bit Ch0入力 4chピクセルTDM（YCbCr422）Ch0-3出力 */
#define AG903_VID_MGR_8BITCH0_TO_CH0123     (4)

/** 同期信号入力 */
#define AG903_VID_MGR_IO_SIGNAL_INPUT       (0)
/** 同期信号出力 */
#define AG903_VID_MGR_IO_SIGNAL_OUTPUT      (1)

/** 入出力VSYNCの極性が負論理 */
#define AG903_VID_MGR_IO_VSYNC_POL_MINUS    (0)
/** 入出力VSYNCの極性が正論理 */
#define AG903_VID_MGR_IO_VSYNC_POL_PLUS     (1)
/** 入出力HSYNCの極性が負論理 */
#define AG903_VID_MGR_IO_HSYNC_POL_MINUS    (0)
/** 入出力HSYNCの極性が正論理 */
#define AG903_VID_MGR_IO_HSYNC_POL_PLUS     (1)

/** 入力DEの極性が負論理 */
#define AG903_VID_MGR_IN_DE_POL_MINUS       (0)
/** 入力DEの極性が正論理 */
#define AG903_VID_MGR_IN_DE_POL_PLUS        (1)

/** 入力FIELDの極性が負論理 */
#define AG903_VID_MGR_IN_FIELD_POL_MINUS    (0)
/** 入力FIELDの極性が正論理 */
#define AG903_VID_MGR_IN_FIELD_POL_PLUS     (1)

/** 入力クロックの極性が負論理 */
#define AG903_VID_MGR_IN_CLK_POL_MINUS      (0)
/** 入力クロックの極性が正論理 */
#define AG903_VID_MGR_IN_CLK_POL_PLUS       (1)

/** 水平同期信号パルス幅の最大値 */
#define AG903_VID_MGR_MAX_OUT_HORIZONTAL_PULSE_WIDTH    (4096)

/** 水平フロントポーチの最大値 */
#define AG903_VID_MGR_MAX_OUT_HORIZONTAL_FRONT_PORCH    (4096)

/** 水平バックポーチの最大値 */
#define AG903_VID_MGR_MAX_OUT_HORIZONTAL_BACK_PORCH     (4096)

/** 水平フレームサイズの最大値 */
#define AG903_VID_MGR_MAX_OUT_HORIZONTAL_FRAME_SIZE     (4096)

/** 垂直同期信号パルス幅の最大値 */
#define AG903_VID_MGR_MAX_OUT_VERTICAL_PULSE_WIDTH      (4096)

/** 垂直フロントポーチの最大値 */
#define AG903_VID_MGR_MAX_OUT_VERTICAL_FRONT_PORCH      (4096)

/** 垂直バックポーチの最大値 */
#define AG903_VID_MGR_MAX_OUT_VERTICAL_BACK_PORCH       (4096)

/** 垂直フレームサイズの最大値 */
#define AG903_VID_MGR_MAX_OUT_VERTICAL_FRAME_SIZE       (4096)

/** TDM動作モード 出力チャンネルを合わせる機能を無効 */
#define AG903_VID_MGR_TDM_NONE              (0)
/** TDM動作モード BLANK信号のチャネル情報と出力チャンネルを合わせる */
#define AG903_VID_MGR_TDM_FIT_BLANK_SIGNAL  (1)
/** TDM動作モード TRS信号のチャネル情報と出力チャンネルを合わせる */
#define AG903_VID_MGR_TDM_FIT_TRS_SIGNAL    (2)

/** インタレースモードでEvenフレームのVFPに+1しない */
#define AG903_VID_MGR_TRS_EFP_ZERO          (0)
/** インタレースモードでEvenフレームのVFPに+1する */
#define AG903_VID_MGR_TRS_EFP_ONE           (1)
/** インタレースモードでOddフレームのVFPに+1しない */
#define AG903_VID_MGR_TRS_OFP_ZERO          (0)
/** インタレースモードでOddフレームのVFPに+1する */
#define AG903_VID_MGR_TRS_OFP_ONE           (1)

/** ブランク期間開始のSAV/EAVからVSYNC立ち上がりFIELD値反映までのサイクル数の最大値 */
#define AG903_VID_MGR_MAX_TRS_VFP           (4096)

/** EAVを基準にHSYNCを生成 */
#define AG903_VID_MGR_TRS_HREF_EAV          (0)
/** SAVを基準にHSYNCを生成 */
#define AG903_VID_MGR_TRS_HREF_SAV          (1)

/** SAV/EAVからHSYNC立ち上がりまでのサイクル数の最大値 */
#define AG903_VID_MGR_MAX_TRS_HFP           (4095)

/** 垂直同期の最大サイクル数の最大値 */
#define AG903_VID_MGR_MAX_SD_VERTICAL_CYCLE     (8192)
/** 水平同期の最大サイクル数の最大値 */
#define AG903_VID_MGR_MAX_SD_HORIZONTAL_CYCLE   (8192)

/**
 * デジタルビデオ入力ポートハンドル
 */
typedef struct _AG903_VidMgrInputHandle {
    uint32_t  id;               /** デジタル入力ポートハンドルを識別するID */
    _Bool     is_dirty;         /** 入力ポートのdrityフラグ。設定が変更になった場合にtrueを設定 */
    uint32_t  port_no;          /** 入力ポートの物理No */
    uint32_t  sync_signal;      /** 同期信号の入力・出力設定 */
    uint32_t  inout_vsync_pol;  /** 入出力VSYNCの極性 */
    uint32_t  inout_hsync_pol;  /** 入出力HSYNCの極性 */
    uint32_t  in_de_pol;        /** 入力DEの極性 */
    uint32_t  in_field_pol;     /** 入力FIELDの極性 */
    uint32_t  in_clk_pol;       /** 入力クロックの極性 */
    uint32_t  h_pulse_width;    /** 水平同期信号パルス幅 */
    uint32_t  h_front_porch;    /** 水平フロントポーチ */
    uint32_t  h_back_porch;     /** 水平バックポーチ */
    uint32_t  h_frame_size;     /** 水平フレームサイズ */
    uint32_t  v_pulse_width;    /** 垂直同期信号パルス幅 */
    uint32_t  v_front_porch;    /** 垂直フロントポーチ */
    uint32_t  v_back_porch;     /** 垂直フロントポーチ */
    uint32_t  v_frame_size;     /** 垂直フレームサイズ */
} AG903_VidMgrInputHandle;

/**
 * デジタルビデオ出力ポートハンドル
 */
typedef struct _AG903_VidMgrOutputHandle {
    uint32_t  id;               /** デジタル出力ポートハンドルを識別するID */
    _Bool     is_dirty;         /** 出力ポートの物理No */
    uint32_t  port_no;          /** 出力ポートのdrityフラグ。設定が変更になった場合にtrueを設定 */
    uint32_t  tdm;              /** 4bit TDMの設定 */
    _Bool     delay;            /** 入力データの遅延設定の有効無効フラグ */
    _Bool     trs_dec_enable;   /** TRSデコードの有効無効フラグ */
    uint32_t  trs_efp;          /** インタレースモードでEvenフレームのVPFに+1 */
    uint32_t  trs_ofp;          /** インタレースモードでOddフレームのVPFに+1 */
    uint32_t  trs_vfp;          /** ブランク期間開始のSAV/EAVからVSYNC立ち上がりFIELD値反映までのサイクル数 */
    uint32_t  trs_href;         /** HSYNC生成の基準 */
    uint32_t  trs_hfp;          /** SAV/EAVからHSYNC立ち上がりまでのサイクル数 */
    uint32_t  v_max;            /** 垂直同期の最大サイクル数 */
    uint32_t  h_max;            /** 水平同期の最大サイクル数 */
} AG903_VidMgrOutputHandle;


int32_t AG903_VidMgrEnable(_Bool enable);
int32_t AG903_VidMgrSetInputFormat(uint32_t format);
int32_t AG903_VidMgrGetInputHandle(int32_t *ports, int32_t num_ports, AG903_VidMgrInputHandle **handles);
int32_t AG903_VidMgrReleaseInputHandle(AG903_VidMgrInputHandle *handle);
int32_t AG903_VidMgrGetOutputHandle(int32_t *ports, int32_t num_ports, AG903_VidMgrOutputHandle **handles);
int32_t AG903_VidMgrReleaseOutputHandle(AG903_VidMgrOutputHandle *handle);
int32_t AG903_VidMgrCommitSetting(void);
int32_t AG903_VidMgrCheckHandleValidation(void *handle, int32_t handle_type);
int32_t AG903_VidMgrSetIOSignal(AG903_VidMgrInputHandle *handle, uint32_t inout);
int32_t AG903_VidMgrSetIOMode(AG903_VidMgrInputHandle *handle, uint32_t v_pol, uint32_t h_pol, uint32_t d_pol, uint32_t f_pol, uint32_t c_pol);
int32_t AG903_VidMgrSetIOParameter(AG903_VidMgrInputHandle *handle, uint32_t h_pw, uint32_t h_fp, uint32_t h_bp, uint32_t h_fs, uint32_t v_pw, uint32_t v_fp, uint32_t v_bp, uint32_t v_fs);
int32_t AG903_VidMgrGetIODotClk(AG903_VidMgrInputHandle *handle, uint32_t *cwt);
int32_t AG903_VidMgrSetCaptureTDMMode(AG903_VidMgrOutputHandle *handle, uint32_t tdm);
int32_t AG903_VidMgrEnableCaptureDelay(AG903_VidMgrOutputHandle *handle, _Bool delay);
int32_t AG903_VidMgrEnableTRSDecode(AG903_VidMgrOutputHandle *handle, _Bool trs_dec);
int32_t AG903_VidMgrSetTRSParameter(AG903_VidMgrOutputHandle *handle, uint32_t efp, uint32_t ofp, uint32_t vfp, uint32_t href, uint32_t hfp);
int32_t AG903_VidMgrSetDetectionCycle(AG903_VidMgrOutputHandle *handle, uint32_t v_max, uint32_t h_max);
int32_t AG903_VidMgrGetOutputState(AG903_VidMgrOutputHandle *handle, uint32_t *blk_val, uint32_t *trs_val, uint32_t *v_blank, uint32_t *h_blank, uint32_t *tdm_ch);


#ifdef __cplusplus
}
#endif


#endif
