/*
 *	cliphmng.h
 *
 *	ハミング符号
 *
 *	* Tue Feb 25 01:17:09 JST 2014 Naoyuki Sawa
 *	- 1st リリース。
 *	* Sat Mar 01 21:23:55 JST 2014 Naoyuki Sawa
 *	- SECDED_128_120_encode(),SECDED_128_120_decode(),SECDED_72_64_encode(),SECDED_72_64_decode()をASM化しました。
 *	  約25％高速になりました。152byte省メモリ(640⇒488byte)になりました。
 *	* Tue Mar 18 00:14:23 JST 2014 Naoyuki Sawa
 *	- LargeBlockFEC_encode(),LargeBlockFEC_decode()を追加しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_HMNG_H__
#define __CLIP_HMNG_H__

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

/****************************************************************************
 *	(128,120)拡張ハミング符号
 ****************************************************************************/

/* (128,120)拡張ハミング符号の、符号化処理を行います。
 * [in]
 *	data[0〜14]	データビット			15バイト(120ビット)
 * [out]
 *	戻り値		チェックビット,全ビットパリティ	 1バイト(  8ビット)
 * [note]
 *	- 120ビット未満のデータビットに対する、符号化処理としても利用できます。
 *	  その場合、data[0〜14]のうち、使用しないデータビットを0としてください。
 *	  具体例は、SECDED_72_64_encode()の実装を参照してください。
 */
int SECDED_128_120_encode(const void* _data/*[15]*/);

/* (128,120)拡張ハミング符号の、復号処理を行います。
 * [in]x
 *	data[0〜14]	データビット			15バイト(120ビット)
 *	c		チェックビット,全ビットパリティ	 1バイト(  8ビット)
 * [out]
 *	戻り値		エラー無し   の場合、0を返す。data[0〜14],及び,cは、そのままで正しい値であり、変更しない。
 *			1ビットエラーの場合、1を返す。data[0〜14]の中にエラービットが有る場合、訂正する。cの中にエラービットが有る場合、何もしない。
 *			2ビットエラーの場合、2を返す。data[0〜14],又は,cの中にエラービットが有るが、訂正できない。
 *	data[0〜14]	戻り値が0,又は,1の場合、正しい値となる。
 *			戻り値が2       の場合、正しい値でない。
 * [note]
 *	- 120ビット未満のデータビットに対する、復号処理としても利用できます。
 *	  その場合、data[0〜14]のうち、使用しないデータビットを0としてください。
 *	  具体例は、SECDED_72_64_decode()の実装を参照してください。
 */
int SECDED_128_120_decode(void* _data/*[15]*/, int c);

/****************************************************************************
 *	(72,64)拡張ハミング符号
 ****************************************************************************/

/* (72,64)拡張ハミング符号の、符号化処理を行います。
 * [in]
 *	data[0〜7]	データビット			8バイト(64ビット)
 * [out]
 *	戻り値		チェックビット,全ビットパリティ	1バイト( 8ビット)
 * [note]
 *	- (72,64)拡張ハミング符号は、ECCメモリのエラー訂正に、一般的に使用される方式です。
 */
int SECDED_72_64_encode(const void* _data/*[8]*/);

/* (72,64)拡張ハミング符号の、復号処理を行います。
 * [in]x
 *	data[0〜7]	データビット			8バイト(64ビット)
 *	c		チェックビット,全ビットパリティ	1バイト( 8ビット)
 * [out]
 *	戻り値		エラー無し   の場合、0を返す。data[0〜7],及び,cは、そのままで正しい値であり、変更しない。
 *			1ビットエラーの場合、1を返す。data[0〜7]の中にエラービットが有る場合、訂正する。cの中にエラービットが有る場合、何もしない。
 *			2ビットエラーの場合、2を返す。data[0〜7],又は,cの中にエラービットが有るが、訂正できない。
 *	data[0〜7]	戻り値が0,又は,1の場合、正しい値となる。
 *			戻り値が2       の場合、正しい値でない。
 */
int SECDED_72_64_decode(void* _data/*[8]*/, int c);

/****************************************************************************
 *	大きなブロックを用いる前方誤り訂正
 ****************************************************************************/

/* 変換前データにハミング符号を付加して分散し、変換後バッファへ格納します。
 * [in]
 *	src		変換前データ  (1920バイト)
 *	dst		変換後バッファ(2048バイト)
 * [note]
 *	- (128,120)拡張ハミング符号を1ブロックとし、128ブロックを組み合わせて分散する。
 *	  変換後の連続する16バイト(=128ビット)内には、各ブロックが1ビットづつ含まれる。
 *	- 16バイトのバーストエラーは、各ブロックへの1ビットづつのエラーとなり、訂正可能である。
 *	  32バイトのバーストエラーは、各ブロックへの2ビットづつのエラーとなり、検出可能である。
 */
void LargeBlockFEC_encode(void* dst/*[16*128]*/, const void* _src/*[15*128]*/);

/* 変換後データを復号してエラー検出又は訂正し、変換前バッファへ格納します。
 * [in]
 *	src		変換後データ  (2048バイト)
 *	dst		変換前バッファ(1920バイト)
 * [out]
 *	戻り値		エラー無し                      の場合、0を返す。dstの内容は正しい。
 *			エラー検出し、    訂正できた      場合、1を返す。dstの内容は正しい。
 *			エラー検出したが、訂正できなかった場合、2を返す。dstの内容は不定である。
 */
int LargeBlockFEC_decode(void* _dst/*[15*128]*/, const void* src/*[16*128]*/);

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

#endif/*__CLIP_HMNG_H__*/
