/*******************************************************************************
*									       *
* [PSX Multi Converter PSRプラグイン操作ライブラリ]			       *
*									       *
*	FILE NAME	: LibPsr.h 					       *
*									       *
*	History		| Comment				Name	       *
*     ------------------+--------------------------------------------------    *
*	2000.11.01	| 新規作成				ふぃろ	       *
*	2001.01.01	| LbrGetPluginの引数追加		ふぃろ	       *
*	2001.01.01	| LbrGetPluginHandleの追加		ふぃろ	       *
*	2001.01.04	| 色合い補正機能のサポート		ふぃろ	       *
*	2003.07.03	| ボリューム変更機能追加		ふぃろ	       *
*	2004.04.02	| LbrFreeReadBufferの追加		ふぃろ	       *
*									       *
*			(C) Copyright ふぃろ 2000-2004. All rights reserved.   *
*******************************************************************************/


#ifndef PSXMC_LIBPSR
#define PSXMC_LIBPSR

#include "CdAccess.h"	// CDアクセスのinclude
#include "Psrp.h"	// Pluginのinclude

#ifndef CEXPORT
#define CEXPORT	extern __declspec (dllexport)
#endif


CEXPORT	VOID	LbrDEBUG(PSZ pszMsg, ...);
CEXPORT VOID	LbrSETDEBUG(BOOL fDebug);

/******************************************************************************/
/*									      */
/*	環境操作							      */
/*									      */
/******************************************************************************/


#define HPSR		HANDLE		// PSRハンドル
#define LBRSPFLAG	WORD		// サポート機能フラグ

CEXPORT HPSR	LbrOpenPSR(	// PSRプラグインのオープン ---------------------
	LPCTSTR		lpPsrFile);	// (I) PSRファイル名
typedef HPSR	(*PFNLbrOpenPSR)(LPCTSTR);


CEXPORT BOOL	LbrClosePSR(	// PSRプラグインのクローズ ---------------------
	HPSR		hPsr);		// (I) PSRハンドル
typedef BOOL	(*PFNLbrClosePSR)(HPSR);


CEXPORT	LBRSPFLAG LbrGetPlugin(	// PSRプラグイン情報の取得 ---------------------
	HPSR		hPsr,		// (I) PSRハンドル
	LPPSRPLUGIN	lpPlugin,	// (O) PSRプラグイン情報	NULL可
	PSZ		pszPsrFile);	// (O) PSRファイル名		NULL可


CEXPORT	LBRSPFLAG LbrQueryPlugin( // PSRプラグイン情報の取得 -------------------
	LPCTSTR		lpPsrFile,	// (I) PSRファイル名
	LPPSRPLUGIN	lpPlugin);	// (O) PSRプラグイン情報	NULL可


CEXPORT HINSTANCE LbrGetPluginInst( // PSRインスタンスハンドルの取得 -----------
	HPSR		hPsr);		// (I) PSRハンドル


			// サポート機能フラグ ----------------------------------
#define LBRFUNC_FILE		0x0001	// ファイル用プラグイン
#define LBRFUNC_CD		0x0002	// CD用プラグイン
#define LBRFUNC_DECODEFRAME	0x0100	// 動画データのデコード
#define LBRFUNC_DECODEAUDIO	0x0200	// 音声データのデコード
#define LBRFUNC_SETENVIRONMENT	0x0400	// 環境設定パネルの呼び出し
#define LBRFUNC_DECODEBS	0x0800	// BSデコード


CEXPORT	BOOL	LbrSetEnvironment( // PSR環境設定パネルの呼び出し --------------
	HPSR		hPsr,		// (I) PSRハンドル
	HWND		hWndParent);	// (I) 親ウインドウハンドル



/******************************************************************************/
/*									      */
/*	ストリーム解析機能						      */
/*									      */
/******************************************************************************/


CEXPORT	BOOL	LbrIsSupportFile(// ストリームファイルのサポート判定 (FILE) ----
	HPSR		hPsr,		// (I) PSRハンドル
	LPCTSTR		lpFileName);	// (I) ファイル名
typedef BOOL	(*PFNLbrIsSupportFile)(HPSR, LPCTSTR);


				// CDサポート判定 開始処理 (CD) ----------------
CEXPORT HANDLE	LbrIsSupportCDBegin(
	HPSR		hPsr,		// (I) PSRハンドル
	INT		iNumToc,	// (I) TOCの数
	LPTOCENTRY	lptoc);		// (I) TOC


				// CDサポート判定 終了処理 (CD) ----------------
CEXPORT VOID	LbrIsSupportCDEnd(
	HPSR		hPsr,		// (I) PSRハンドル
	HANDLE		hIsCD);		// (I) CDサポート判定ハンドル


				// CDサポート判定 セクタ通知 (CD) --------------
CEXPORT BOOL	LbrIsSupportCDSector(
	HPSR		hPsr,		// (I) PSRハンドル
	HANDLE		hIsCD,		// (I) CDサポート判定ハンドル
	TOCENTRY	toc,		// (I) TOC
	DWORD		nSector,	// (I) セクタ番号
	PVOID		pvSector);	// (I) セクタ


				// CDサポート判定 結果取得 (CD) ----------------
CEXPORT INT	LbrIsSupportCDResult(
	HPSR		hPsr,		// (I) PSRハンドル
	HANDLE		hIsCD,		// (I) CDサポート判定ハンドル
	INT		iIndex,		// (I) ストリームインデックス
	LPPSRSTREAMINFO	lpStreamInfo);	// (O) ストリームデータ情報


				// ストリームファイル情報の取得 (FILE) ---------
CEXPORT	BOOL	LbrGetStrFileInfo(
	HPSR		hPsr,		// (I) PSRハンドル
	LPCTSTR		lpFileName,	// (I) ファイル名
	LPPSRSTREAMINFO	lpStreamInfo);	// (O) ストリームデータ情報
typedef BOOL	(*PFNLbrGetStrFileInfo)(HPSR, LPCTSTR, LPPSRSTREAMINFO);


				// ストリームデータ情報の取得 (CD) -------------
CEXPORT BOOL	LbrGetStrDataInfo(
	HPSR		hPsr,		// (I) PSRハンドル
	INT		iDriveNo,	// (I) ドライブ番号
	DWORD		nBegin,		// (I) 開始セクタ
	DWORD		nSector,	// (I) セクタ数
	LPPSRSTREAMINFO	lpStreamInfo);	// (O) ストリームデータ情報




/******************************************************************************/
/*									      */
/*	ストリーム操作							      */
/*									      */
/******************************************************************************/


#define HSTREAM		HANDLE


CEXPORT	HSTREAM	LbrOpenStream(	// ストリームのオープン ------------------------
	LPCTSTR		lpPlugin,	// (I) プラグインファイル名
	LPCTSTR		lpStreamFile,	// (I) ストリームファイル名	NULL=CD
	INT		iDriveNo,	// (I) ドライブ番号		CD時有効
	LPPSRSTREAMINFO	lpStreamInfo,	// (I) ストリーム情報
	DWORD		fdwFlags);	// (I) オープンフラグ	LBROF_XXX
typedef HSTREAM	(*PFNLbrOpenStream)(LPCTSTR, LPCSTR, INT LPPSRSTREAMINFO, DWORD);


				// オープンフラグ ------------------------------
#define LBROF_MOVIE		0x01	// 動画の読み込みオープン
#define LBROF_AUDIO		0x02	// 音声の読み込みオープン
#define LBROF_ALL		0x03	// 動画と音声の読み込みオープン


CEXPORT	BOOL	LbrCloseStream(	// ストリームのクローズ ------------------------
	HSTREAM		hStream);	// (I) ストリームハンドル
typedef BOOL	(*PFNLbrCloseStream)(HSTREAM);


CEXPORT BOOL 	LbrReadStream(	// ストリームデータの読み取り ------------------
	HSTREAM		hStream,	// (I) ストリームハンドル
	DWORD		fdwRead,	// (I) 読み取りデータフラグ
	LPPSRREADBUFF	lpBuffer);	// (O) 読み取りバッファ


				// 読み取りバッファの解放 ------------- 20040402
CEXPORT BOOL	LbrFreeReadBuffer(
	HSTREAM		hStream,	// (I) ストリームハンドル
	LPPSRREADBUFF	lpBuffer);	// (I) 読み取りバッファ


CEXPORT BOOL 	LbrSeekStream(	// ストリームデータ読み取り位置の移動 ----------
	HSTREAM		hStream,	// (I) ストリームハンドル
	DWORD		dwPosition);	// (I) 読み取り位置	1/1000秒単位

#define LBRSEEK_CURRENT		0xffffffff


			// ストリームデータ情報の取得 --------------------------
CEXPORT LPPSRSTREAMINFO LbrGetStreamInfo(
	HSTREAM		hStream);	// (I) ストリームハンドル
typedef LPPSRSTREAMINFO	(*PFNLbrGetStreamInfo)(HSTREAM);


CEXPORT BOOL 	LbrSetOpenFlags(// オープンフラグの設定変更 --------------------
	HSTREAM		hStream,	// (I) ストリームハンドル
	DWORD		fdwMask,	// (I) 設定マスク
	DWORD		fdwFlags);	// (I) オープンフラグ


			// プラグインハンドルの取得 ----------------------------
CEXPORT	HPSR	LbrGetPluginHandle(
	HSTREAM		hStream);	// (I) ストリームハンドル


/******************************************************************************/
/*									      */
/*	各種デコード							      */
/*									      */
/******************************************************************************/


			// 色合い補正値の設定 ----------------------------------
CEXPORT VOID	LbrSetColorModify(
	INT		iModifyY,	// (I) Yの補正値	輝度
	INT		iModifyCb,	// (I) Cbの補正値	どれくらい青いか
	INT		iModifyCr,	// (I) Crの補正値	どれくらい赤いか
	INT		iGamma);	// (I) ガンマ補正値	0〜


			// フレームのデコード ----------------------------------
CEXPORT LPBITMAPINFO LbrDecodeFrame(
	HSTREAM		hStream,	// (I) ストリームハンドル
	LPPSRREADBUFF	lpFrame,	// (I) フレームデータ
	INT		iBitCount,	// (I) ビットカウント		16 or 24
	DWORD		dwReserved,	// (I) 予備			0指定
	LPBITMAPINFO	pbmi);		// (I) ビットマップバッファ	NULL可


			// フレームビットマップのアロケート --------------------
CEXPORT LPBITMAPINFO LbrAllocBitmap(
	INT		iWidth,		// (I) ビットマップ幅
	INT		iHeight,	// (I) ビットマップ高さ
	INT		iPlanes,	// (I) プレーン数
	INT		iBitCount,	// (I) ピクセル当りのビット数
	LPBITMAPINFO	pbmiRecycled);	// (I) リサイクル用DBIビットマップ


			// フレームビットマップの解放 --------------------------
CEXPORT VOID	LbrFreeBitmap(
	LPBITMAPINFO	pbmi);		// (I) ビットマップバッファ	NULL可


			// 音声データのデコード --------------------------------
CEXPORT DWORD 	LbrDecodeAudio(
	HSTREAM		hStream,	// (I) ストリームハンドル
	LPPSRREADBUFF	lpAudio,	// (I) 音声データ
	PVOID		pvBuffer,	// (O) デコード後の音声データ
	DWORD		nLength);	// (I) lpBufferのバイト数


/******************************************************************************/
/*									      */
/*	変換補助							      */
/*									      */
/******************************************************************************/


			// 出力フレームサイズの取得 ----------------------------
#if 0
CEXPORT BOOL	LbrGetOutputFrameSize(
	LPSIZE		lpszFrame);	// (B) フレームサイズ
#endif


			// フレームビットマップの伸張 --------------------------
CEXPORT	LPBITMAPINFO LbrStretchFrame(
	LPBITMAPINFO	pbmi,		// (I) DBIビットマップ
	LPBITMAPINFO	pbmiRecycled,	// (I) リサイクル用DBIビットマップ
	INT		iLevel,		// (I) 伸張画質レベル	LBR_STRETCHLEVEL
	BOOL		fFreeSrc,	// (I) 元DIB解放フラグ
	LPSIZE		lpszSize);	// (I) 出力フレームサイズ NULL=AUTO


#define LBR_STRETCHLEVEL_NONE		0	// 変倍なし
#define LBR_STRETCHLEVEL_NORMAL		1	// 通常変倍
#define LBR_STRETCHLEVEL_HQHORZ		2	// 高画質 (横のみ)
#define LBR_STRETCHLEVEL_HQVERT		3	// 高画質 (縦のみ)
#define LBR_STRETCHLEVEL_HQ		4	// 高画質
#define LBR_STRETCHLEVEL_TV		5	// TV画質


			// オーディオデータの変換 ------------------------------
typedef struct {
	DWORD		dwSamplePerSec;	// サンプリングレート
	WORD		wChannels;	// チャンネル数
	WORD		wBitsPerSample;	// サンプル当りのビット数
	WORD		wVolume;	// ボリューム値			20030703
	WORD		wReserved;	// 予備				20030703
} LBRAUDIOATTR, *LPLBRAUDIOATTR;


typedef struct {						// 20030703
	INT	iVALUE;
	INT	aiSAMPLE1[2];
	INT	aiSAMPLE2[2];
} LBRCONVAUDIODATA, *LPLBRCONVAUDIODATA;


CEXPORT	DWORD	LbrConvAudioData(
	LPLBRCONVAUDIODATA lpConv,	// (B) データ変換ハンドル	20030703
	DWORD		nLength,	// (I) 入力データ長	(バイト数)
	LPLBRAUDIOATTR	lpAttrSrc,	// (I) 入力オーディオ属性
	PBYTE		pbSrc,		// (I) 入力データ
	LPLBRAUDIOATTR	lpAttrDst,	// (I) 出力オーディオ属性
	PBYTE		pbDst);		// (O) 出力データ

#endif
