/*******************************************************************************
*									       *
* [PSストリームアクセスプラグイン]					       *
*									       *
*	FILE NAME	: PSRP.h 					       *
*									       *
*	History		| Comment				Name	       *
*     ------------------+--------------------------------------------------    *
*	2000.01.22	| 新規作成				ふぃろ	       *
*	2000.05.01	| CDサポートのため全面修正		ふぃろ	       *
*	2000.09.27	| 再生時の強制終了対策			Ribot	       *
*	2000.10.28	| PSRSTREAMINFOとPSRPLUGINの変更	ふぃろ	       *
*	2001.12.09	| ストリームデータ情報の変更		ふぃろ	       *
*	2003.04.21	| PSRPLUGIN構造体にusTargetMediaを追加	ふぃろ	       *
*	2004.04.02	| MPEG-2対応				ふぃろ	       *
*	2004.04.26	| ストリームデータ情報に表示サイズ追加	ふぃろ	       *
*	2004.05.14	| CRI ADXサポート			ふぃろ	       *
*									       *
*			(C) Copyright ふぃろ 2000-2004. All rights reserved.   *
*******************************************************************************/


#ifndef PSXMC_PSRPLUGIN
#define PSXMC_PSRPLUGIN


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

#define PSR_FRAMEBUFFER		0xb000					//000927


/******************************************************************************/
/*									      */
/*	構造形式定義							      */
/*									      */
/******************************************************************************/

typedef struct {	// ストリームデータ情報 --------------------------------
	WORD		wTypeFlags;	// データ種別フラグ	PSR_STRTYPE_XXX
	WORD		wPlugin;	// プラグインデータ		  011209
	DWORD		nBeginSector;	// データ開始セクタ番号
	DWORD		nNumSector;	// データセクタ数
	DWORD		nPlayTime;	// 再生時間	1/1000秒単位
	DWORD		nNumFrame;	// フレーム数
	SIZE		szFrame;	// フレームサイズ
	WORD		wFrameRate;	// フレームレート
	WORD		wFormatTag;	// 音声データのフォーマット
	WORD		wChannels;	// モノラル/ステレオの別
	WORD		wBitsPerSample;	// サンプル当たりのビット数
	DWORD		nSamplesPerSec;	// サンプリングレート
	DWORD		nDataSize;	// データサイズ(byte)	0可
	SIZE		szDisplay;	// 表示フレームサイズ		  040426
} PSRSTREAMINFO, *LPPSRSTREAMINFO;


			// データ種別フラグ ------------------------------------
#define PSR_STRTYPE_MOVIE	0x0001	// 動画ストリーム
#define PSR_STRTYPE_AUDIO	0x0002	// 音声ストリーム
#define PSR_STRTYPE_ALL		0x0003	// 動画ストリーム & 音声ストリーム
#define PSR_STRTYPE_BITMAP	0x0004	// ビットマップ(TIM)		  011209
#define PSR_STRTYPE_SEQUENCE	0x0008	// シーケンス(SEQ)		  011209
#ifdef PSXMC_FREE
#define PSR_STRTYPE_SUPPORT	0x0003	// サポート形式			  011231
#else
#define PSR_STRTYPE_SUPPORT	0x000f	// サポート形式			  011231
#endif
#define PSR_STRTYPE_TYPES	0x000f	// データ種別マスク		  011209

#define PSR_STRTYPE_VFRATE	0x0010	// 可変フレームレート


typedef struct {	// 読み込みバッファ ------------------------------------
	DWORD		nFrameNo;	// フレーム番号
	SIZE		szFrame;	// フレームサイズ
	WORD		wFrameRate;	// フレームレート	0:固定ﾌﾚｰﾑﾚｰﾄ
	BYTE		bType;		// データ種別	PSR_DATATYPE_XXX  040402
	BYTE		bFlags;		// フラグ	PSR_RBFLAGS_XXX	  040402
	DWORD		nLength;	// データ長
	BYTE		abData[PSR_FRAMEBUFFER]; // データ
} PSRREADBUFF, *LPPSRREADBUFF;


typedef struct {	// フレームバッファ(ユーザ拡張) ----------------- 040402
	DWORD		cbExData;	// 拡張データサイズ
	PVOID		pvExData;	// 拡張データアドレス
	BYTE		abData[PSR_FRAMEBUFFER - 8];	// データ
} PSRFRAMEBUFFRE_EX, *LPPSRFRAMEBUFFER_EX;


#define PSR_DATATYPE_AUTO	0	// 自動判別	(旧バージョン用)  040402
#define PSR_DATATYPE_VIDEO	0x10	// ビデオデータ			  040402
#define PSR_DATATYPE_AUDIO	0x20	// オーディオデータ		  040402
#define PSR_DATATYPE_ADPCM	0x20	// ADPCMオーディオデータ	  040512
					// 0x2n : インターリーブタイプ
					//   インターリーブサイズ = 1 << (n + 3)
					//	ex)  16byte ==> 0x21
					//	    256byte ==> 0x25
					//	    512byte ==> 0x26
#define PSR_DATATYPE_CRI	0x2f	// CRI ADXオーディオデータ	  040512
#define PSR_DATATYPE_PCM	0x60	// PCMオーディオデータ		  040512
					// 0x6n : インターリーブタイプ
#define PSR_DATATYPE_AUDIOMASK	0xe0	// オーディオタイプ識別マスク	  040512
#ifndef PSXMC_FREE
#define PSR_DATATYPE_VIDEO_I	0x10	// ビデオデータ (Iピクチャ)	  040402
#define PSR_DATATYPE_VIDEO_P	0x11	// ビデオデータ	(Pピクチャ)	  040402
#define PSR_DATATYPE_VIDEO_B	0x12	// ビデオデータ	(Bピクチャ)	  040402

#define PSR_DATATYPE_VIDEO_CTL	0x13	// ビデオデータ	(制御データ)	  040402
					//	・nFrameNoが0でも良い
					//	・デコーダに渡される
					//	・デコーダはDIBを作成しない
#endif

#ifndef PSXMC_FREE
#define PSR_RBFLAGS_EXTENSION	0x01	// ユーザ拡張データ		  040402
					//	・プラグインが解放関数を用意する

#define PSR_RBFLAGS_NO_DISP	0x02	// 非表示データ(デコードのみ)	  040402
					//　　シーク後、キーフレームデータをデ
					//    コーダに渡すために使用する
					//	・デコーダに渡される
					//	・デコーダはDIBを作成しない
					//	・スキップされたくない場合は、
					//	  PSR_RBFLAGS_NO_SKIPを併用する

#define PSR_RBFLAGS_NO_SKIP	0x04	// スキップ不可			  040402
					//	・再生時のみ有効
					//	・表示されないかもしれないが、
					//	  確実にデコーダに渡される。
#endif



/******************************************************************************/
/*									      */
/* PsrQueryPlugin() : プラグイン情報の取得 (共通 : 必須)		      */
/*									      */
/*	プラグインを識別する名前などの情報を返します。			      */
/*									      */
/******************************************************************************/


#define PSR_MAX_PLUGINNAME	48	// プラグイン識別名文字数
#define PSR_MAX_COPYRIGHT	80	// コピーライト文字数
#define PSR_MAX_SITENAME	80	// サイト名文字数
#define PSR_MAX_SITEURL		80	// サイトURL文字数

#define PSR_SYSTEMVERSION220	220	// 対応システムバージョン	2.20
#define PSR_SYSTEMVERSION230	230	// 対応システムバージョン	2.30
#define PSR_SYSTEMVERSION240	240	// 対応システムバージョン	2.40
#define PSR_SYSTEMVERSION250	250	// 対応システムバージョン	2.50
#define PSR_SYSTEMVERSION320	320	// 対応システムバージョン	3.10
#ifdef PSXMC_FREE
#define PSR_SYSTEMVERSION	252	// 対応システムバージョン	2.52
#else
#define PSR_SYSTEMVERSION	322	// 対応システムバージョン	3.22
#endif

#define PSR_MEDIA_CD		0x0001	// CD-ROM
#define PSR_MEDIA_DVD		0x0002	// DVD
#define PSR_MEDIA_FILE		0x0004	// ファイル
#define PSR_MEDIA_ALL		0x0007	// すべてのメディア


typedef struct {	// プラグイン情報 --------------------------------------
	CHAR		aName[PSR_MAX_PLUGINNAME+1];	// プラグイン識別名
	CHAR		aCopyright[PSR_MAX_COPYRIGHT+1];// コピーライト
	USHORT		usVersion;		// バージョン番号
	USHORT		usIsSupportVersion;	// 判定結果保証バージョン
	USHORT		usSystemVersion;	// 対応システムバージョン
	CHAR		aSiteName[PSR_MAX_SITENAME+1];	// サイト名	省略可
	CHAR		aSiteUrl[PSR_MAX_SITEURL+1];	// サイト URL	省略可
	USHORT		usTargetMedia;		// 対象メディア	PSR_MEDIA_XXX
#ifdef PSXMC_FREE
	BYTE		abReserved[64+2+2];
#else
	CHAR		aProductMark[64+2];	// プロダクト記号	省略可
	USHORT		usTrialDays;		// 試用日数
#endif
} PSRPLUGIN, *LPPSRPLUGIN;


CEXPORT	VOID	PsrQueryPlugin(
	LPPSRPLUGIN	lpPlugin);	// プラグイン情報取得バッファアドレス

typedef VOID	(*PFNPSRQUERYP)(LPPSRPLUGIN);



/******************************************************************************/
/*									      */
/* PsrIsSupportFile() : ストリームファイルのサポート判定 (FILE : 必須)	      */
/*									      */
/*	指定ファイルが当該プラグインでサポートできる形式のストリームデータで  */
/*	あるかを判定します。						      */
/*									      */
/******************************************************************************/

CEXPORT BOOL	PsrIsSupportFile(
	LPCTSTR		lpFileName);	// ファイル名

typedef BOOL	(*PFNPSRISSF)(LPCTSTR);




/******************************************************************************/
/*									      */
/* PsrIsSupportCDBegin() : CDサポート判定 開始処理 (CD : 必須)		      */
/*									      */
/*	CDが当該プラグインでサポートできる形式のストリームデータを含んでいる  */
/*	かを判定するための開始処理を行います。				      */
/*									      */
/******************************************************************************/

#ifdef PSXMC_CDACCESS
CEXPORT HANDLE	PsrIsSupportCDBegin(
	INT		iNumToc,	// TOCの数
	LPTOCENTRY	lptoc);		// TOC

typedef HANDLE	(*PFNPSRISSCDB)(INT, LPTOCENTRY);



/******************************************************************************/
/*									      */
/* PsrIsSupportCDEnd() : CDサポート判定 終了処理 (CD : 必須)		      */
/*									      */
/*	CDが当該プラグインでサポートできる形式のストリームデータを含んでいる  */
/*	かを判定するための終了処理を行います。				      */
/*									      */
/******************************************************************************/

CEXPORT	VOID	PsrIsSupportCDEnd(
	HANDLE		hIsCD);		// CDサポート判定ハンドル

typedef VOID	(*PFNPSRISSCDE)(HANDLE);



/******************************************************************************/
/*									      */
/* PsrIsSupportCDSector() : CDサポート判定 セクタ通知 (CD : 必須)	      */
/*									      */
/*	CDが当該プラグインでサポートできる形式のストリームデータを含んでいる  */
/*	かを判定するための処理を行います。				      */
/*									      */
/******************************************************************************/

CEXPORT	BOOL	PsrIsSupportCDSector(
	HANDLE		hIsCD,		// CDサポート判定ハンドル
	TOCENTRY	toc,		// TOC
	DWORD		nSector,	// セクタ番号
	PVOID		pvSector);	// セクタ

typedef BOOL	(*PFNPSRISSCDS)(HANDLE, TOCENTRY, DWORD, PVOID);



/******************************************************************************/
/*									      */
/* PsrIsSupportCDResult() : CDサポート判定 結果取得 (CD : 必須)		      */
/*									      */
/*	CDが当該プラグインでサポートできる形式のストリームデータを含んでいる  */
/*	かを判定した結果を返します。					      */
/*									      */
/******************************************************************************/

CEXPORT	INT	PsrIsSupportCDResult(
	HANDLE		hIsCD,		// CDサポート判定ハンドル
	INT		iIndex,		// ストリームインデックス
	LPPSRSTREAMINFO	lpStreamInfo);	// ストリームデータ情報

typedef INT	(*PFNPSRISSCDR)(HANDLE, INT, LPPSRSTREAMINFO);
#endif	// PSXMC_CDACCESS



/******************************************************************************/
/*									      */
/* PsrGetStrFileInfo() : ストリームファイル情報の取得 (FILE : 必須)	      */
/*									      */
/*	指定ファイルのストリームデータに関する情報を返します。		      */
/*									      */
/******************************************************************************/

CEXPORT	BOOL	PsrGetStrFileInfo(
	LPCTSTR		lpFileName,	// ファイル名
	LPPSRSTREAMINFO	lpStreamInfo);	// ストリームデータ情報

typedef BOOL	(*PFNPSRGETSFI)(LPCTSTR, LPPSRSTREAMINFO);



/******************************************************************************/
/*									      */
/* PsrGetStrDataInfo() : ストリームデータ情報の取得 (CD : 必須)		      */
/*									      */
/*	CD中の指定ストリームデータに関する情報を返します。		      */
/*									      */
/******************************************************************************/

CEXPORT	BOOL	PsrGetStrDataInfo(
	INT		iDriveNo,	// ドライブ番号
	DWORD		dwBegin,	// 開始セクタ番号
	DWORD		dwNumSector,	// セクタ数
	LPPSRSTREAMINFO	lpStreamInfo);	// ストリームデータ情報

typedef BOOL	(*PFNPSRGETSDI)(INT, DWORD, DWORD, LPPSRSTREAMINFO);



/******************************************************************************/
/*									      */
/* PsrOpenFile() : ストリームファイルのオープン (FILE : 必須)		      */
/*									      */
/*	指定ファイルのストリームデータをオープンします。		      */
/*									      */
/******************************************************************************/

CEXPORT HANDLE	PsrOpenFile(
	LPCTSTR		lpFileName,	// ファイル名
	LPPSRSTREAMINFO	lpStreamInfo);	// ストリームデータ情報

typedef HANDLE	(*PFNPSROPENFILE)(LPCTSTR, LPPSRSTREAMINFO);



/******************************************************************************/
/*									      */
/* PsrOpenCD() : CDストリームのオープン (CD : 必須)			      */
/*									      */
/*	CD中の指定ストリームデータをオープンします。			      */
/*									      */
/******************************************************************************/

#ifdef PSXMC_CDACCESS
CEXPORT HANDLE	PsrOpenCD(
	INT		iDriveNo,	// ドライブ番号
	LPPSRSTREAMINFO	lpStreamInfo);	// ストリームデータ情報

typedef HANDLE	(*PFNPSROPENCD)(INT, LPPSRSTREAMINFO);
#endif	// PSXMC_CDACCESS



/******************************************************************************/
/*									      */
/* PsrClose() : ストリームデータのクローズ (共通 : 必須)		      */
/*									      */
/*	PsrOpenFile()またはPsrOpenCD()によりオープンしたストリームデータを    */
/*	クローズします。						      */
/*									      */
/******************************************************************************/

CEXPORT BOOL	PsrClose(
	HANDLE		hStream);	// ストリームハンドル

typedef BOOL	(*PFNPSRCLOSE)(HANDLE);


/******************************************************************************/
/*									      */
/* PsrRead() : ストリームデータの読み取り (共通 : 必須)			      */
/*									      */
/*	ストリームデータから動画データまたは音声データを読み取ります。	      */
/*									      */
/******************************************************************************/

CEXPORT BOOL	PsrRead(
	HANDLE		hStream,	// ストリームハンドル
	LPPSRREADBUFF	lpBuffer);	// 読み取りバッファ

typedef BOOL	(*PFNPSRREAD)(HANDLE, LPPSRREADBUFF);


/* 2004.04.02新規追加 *********************************************************/
/*									      */
/* PsrFreeReadBuffer() : 読み取りバッファの解放 (共通 : 半必須)		      */
/*									      */
/*	PsrRead()が、PSR_RBFLAGS_EXTENSIONを指定した PSRREADBUFFを返した場合  */
/*	拡張バッファを解放します。					      */
/*									      */
/******************************************************************************/

CEXPORT BOOL	PsrFreeReadBuffer(
	HANDLE		hStream,	// ストリームハンドル
	LPPSRREADBUFF	lpBuffer);	// 読み取りバッファ

typedef BOOL	(*PFNPSRFREERB)(HANDLE, LPPSRREADBUFF);



/******************************************************************************/
/*									      */
/* PsrSeek() : 読み取り位置の設定 (共通 : 必須)				      */
/*									      */
/*	ストリームデータの読み取り位置を指定されたフレームデータの先頭に移動し*/
/*	ます。								      */
/*									      */
/******************************************************************************/

CEXPORT BOOL	PsrSeek(
	HANDLE		hStream,	// ストリームハンドル
	DWORD		dwPosition);	// 読み取り位置		1/1000秒単位

typedef BOOL	(*PFNPSRSEEK)(HANDLE, DWORD);



/* 2004.04.02新規追加 *********************************************************/
/*									      */
/* PsrOpenFrameDecoder() : 動画デコーダのオープン (共通)		      */
/* PsrCloseFrameDecoder() : 動画デコーダのクローズ (共通)		      */
/* PsrFrameDecoder() : 動画デコーダ (共通)				      */
/*									      */
/*	通常のSTRファイルとは異なる動画データをデコードします。		      */
/*									      */
/*	このファンクションは、PsrDecordFrame関数と同様に特殊形式の動画データを*/
/*	デコードしますが、オープン/クローズ関数も用意する必要があります。     */
/*									      */
/******************************************************************************/

CEXPORT HANDLE	PsrOpenFrameDecoder(VOID);

CEXPORT BOOL	PsrCloseFrameDecoder(
	HANDLE		hDecoder);	// フレームデコーダハンドル

CEXPORT LPBITMAPINFO PsrFrameDecoder(
	HANDLE		hDecoder,	// フレームデコーダハンドル
	LPPSRREADBUFF	lpFrame,	// フレームデータ
	LPBITMAPINFO	lpbmi);		// DIBビットマップ

typedef HANDLE	(*PFNPSROPEN_FD)(VOID);
typedef BOOL	(*PFNPSRCLOSE_FD)(HANDLE);
typedef LPBITMAPINFO	(*PFNPSR_FD)(HANDLE, LPPSRREADBUFF, LPBITMAPINFO);


/******************************************************************************/
/*									      */
/* PsrDecodeFrame() : 動画データのデコード (共通)			      */
/*									      */
/*	通常のSTRファイルとは異なる動画データをデコードします。		      */
/*									      */
/*	このファンクションとPsrDecodeBs関数が省略された場合、そのプラグインの */
/*	PsrRead()が読み取った動画データが通常のSTRファイルの形式であると認識し*/
/*	ます。								      */
/*									      */
/******************************************************************************/

#define PSR_DECODE_ERROR	0xffffffff
#define PSR_DECODE_NORMAL	0

CEXPORT LPBITMAPINFO PsrDecodeFrame(
	LPPSRREADBUFF	lpFrame,	// フレームデータ
	LPBITMAPINFO	lpbmi);		// DIBビットマップ

typedef LPBITMAPINFO	(*PFNPSRDECODEF)(LPPSRREADBUFF, LPBITMAPINFO);


/******************************************************************************/
/*									      */
/* PsrDecodeBs() : BSデコード (共通)					      */
/*									      */
/*	通常のSTRファイルとは異なる動画データをデコードします。		      */
/*									      */
/*	このファンクションとPsrDecodeFrame関数が省略された場合、そのプラグイン*/
/*	のPsrRead()が読み取った動画データが通常のSTRファイルの形式であると認識*/
/*	します。							      */
/*									      */
/******************************************************************************/

CEXPORT	PUSHORT	PsrDecodeBs(
	LPPSRREADBUFF	lpFrame);	// フレームデータ

typedef PUSHORT	(*PFNPSRDECODEB)(LPPSRREADBUFF);


/******************************************************************************/
/*									      */
/* PsrDecodeAudio() : 音声データのデコード (共通)			      */
/*									      */
/*	通常のSTRファイルとは異なる音声データをデコードします。		      */
/*									      */
/*	このファンクションが省略された場合、そのプラグインのPsrRead()が読み   */
/*	取った音声データが通常のSTRファイルの形式であると認識されます。	      */
/*									      */
/******************************************************************************/

CEXPORT DWORD	PsrDecodeAudio(
	LPPSRREADBUFF	lpAudio,	// 音声データ
	PVOID		pvBuffer,	// デコード後の音声データ
	DWORD		nLength);	// lpBufferのバイト数

typedef DWORD	(*PFNPSRDECODEA)(LPPSRREADBUFF, PVOID, DWORD);


/******************************************************************************/
/*									      */
/* PsrSetEntrionment() : 環境設定パネルの呼び出し (共通)		      */
/*									      */
/*	当該プラグインに必要な環境設定を行うパネルを表示します。	      */
/*									      */
/*	このファンクションが省略された場合、そのプラグインに環境設定の必要がな*/
/*	いと認識されます。						      */
/*									      */
/******************************************************************************/

CEXPORT VOID	PsrSetEnvironment(
	HWND		hWndParent);	// 親ウインドウ

typedef VOID	(*PFNPSRSETE)(HWND);
#endif
