/*	
 *	clipdct.h
 *
 *	離散コサイン変換
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2003 Naoyuki Sawa
 *
 *	* Mon Oct 20 04:14:00 JST 2003 Naoyuki Sawa
 *	- 新規作成。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_DCT_H__
#define __CLIP_DCT_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/****************************************************************************
 *	DCT_REAL
 ****************************************************************************/

typedef struct _DCT_REAL {
	int N;		/* 次数 */
	double* v;	/* エリアスセーフ用バッファ */
	double* T[2];	/* 変換行列(0:FDCT/1:IDCT) */
} DCT_REAL;

/* DCT_HALF構造体を作成します。
 * [in]
 *	N		次数。
 *			負値を指定すると、「扱いやすいDCT」を選択します。
 *			「扱いやすいDCT」は、正規直交変換ではありませんが、係数が周波数成分の1倍となります。
 * [out]
 *	戻り値		DCT_HALF構造体。
 */
DCT_REAL* dct_real_new(int N);

/* DCT_HALF構造体を開放します。
 * [in]
 *	dct		DCT_HALF構造体。
 */
void dct_real_free(DCT_REAL* dct);

/* DCTを行います。
 * [in]
 *	dct		DCT_HALF構造体。
 *	src		入力データ。(時間領域)
 *	dst		出力バッファ。(周波数領域)
 * [note]
 *	* srcとdstに同じバッファを指定できます。(エリアスセーフ)
 *	  ただし、srcとdstに別のバッファを指定した場合に較べて、少しだけ速度低下します。
 */
void fdct_real(DCT_REAL* dct, const double* src, double* dst);

/* 逆DCTを行います。
 * [in]
 *	dct		DCT_HALF構造体。
 *	src		入力データ。(周波数領域)
 *	dst		出力バッファ。(時間領域)
 * [note]
 *	* srcとdstに同じバッファを指定できます。(エリアスセーフ)
 *	  ただし、srcとdstに別のバッファを指定した場合に較べて、少しだけ速度低下します。
 */
void idct_real(DCT_REAL* dct, const double* src, double* dst);

/****************************************************************************
 *	DCT_HALF
 ****************************************************************************/

typedef struct _DCT_HALF {
	int N;		/* 次数 */
	short* v;	/* エリアスセーフ用バッファ */
	short* T[2];	/* 変換行列(0:FDCT/1:IDCT) */
} DCT_HALF;

/* DCT_HALF構造体を作成します。
 * [in]
 *	N		次数。
 *			負値を指定すると、「扱いやすいDCT」を選択します。
 *			「扱いやすいDCT」は、正規直交変換ではありませんが、係数が周波数成分の1倍となります。
 * [out]
 *	戻り値		DCT_HALF構造体。
 */
DCT_HALF* dct_half_new(int N);

/* DCT_HALF構造体を開放します。
 * [in]
 *	dct		DCT_HALF構造体。
 */
void dct_half_free(DCT_HALF* dct);

/* DCTを行います。
 * [in]
 *	dct		DCT_HALF構造体。
 *	src		入力データ。(時間領域)
 *	dst		出力バッファ。(周波数領域)
 * [note]
 *	* srcとdstに同じバッファを指定できます。(エリアスセーフ)
 *	  ただし、srcとdstに別のバッファを指定した場合に較べて、少しだけ速度低下します。
 */
void fdct_half(DCT_HALF* dct, const short* src, short* dst);

/* 逆DCTを行います。
 * [in]
 *	dct		DCT_HALF構造体。
 *	src		入力データ。(周波数領域)
 *	dst		出力バッファ。(時間領域)
 * [note]
 *	* srcとdstに同じバッファを指定できます。(エリアスセーフ)
 *	  ただし、srcとdstに別のバッファを指定した場合に較べて、少しだけ速度低下します。
 */
void idct_half(DCT_HALF* dct, const short* src, short* dst);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_DCT_H__*/
