//******************************************************************************
// AVI1.0(AVI2.0=OpenDMLにあらず)の構造体
//	使わない部分は入ってない（解らないから）
//	Copyright (C) 2009,2011 by AIG-Soft
//******************************************************************************
// 役に立った情報(上ほど重要);QuickTimeと異なり、仕様書はない
//	http://www.uyouyo.com/special/soundcrd/aviheader.txt
//	http://www.elf.info.gifu-u.ac.jp/terada/programming/jikken3/motion_jpeg.html
//	http://www.elf.info.gifu-u.ac.jp/terada/programming/jikken3/avi.html
//	Nikon COOLPIX P60の作るAVIファイル
//	http://www5d.biglobe.ne.jp/~noocyte/Programming/Windows/BmpFileFormat.html
//	http://www.usagi-goten.com/jp/AVI_structure.html
//	http://mksoft.hp.infoseek.co.jp/doc/avifileformat.html
//	富士フイルム Finepix F100fdの作るAVIファイル
// 読み解く前提条件としてJPEGの構造を知っている必要がある。
// QuickTimeを知っているとなお良い。

#ifndef __AVI_H_
#define	__AVI_H_

#include <stdio.h>

// AVIの?Long/?Wordの数値格納順は86系(L->H)である（86Windowsで開発されたから）;QuickTimeとは逆なので注意

typedef unsigned long	FOURCC;	// 32ビットの符号なし整数
#define	SZ_FOURCC	(sizeof(FOURCC))
//	Four-character-code
#define	fourcc(a,b,c,d)	((ULong)(UByte)(a)|((ULong)(UByte)(b)<< 8)|((ULong)(UByte)(c)<< 16)|((ULong)(UByte)(d)<< 24))
// FourCCについてはhttp://www.fourcc.org/に解っている範囲の情報がある

// JPEG画像1枚の最大サイズ(B);実機に合わせて変更すること
// iPod touchのカメラ画像は、圧縮率0.6でも70KB位になることがある（Macの１ファイルは最小4KB)
#define	AVI_MAX1JPEG	(100*1024)

// 1ファイル中に格納できる画像枚数
// ファイルサイズが1GB未満になるようにすること
// 本来は、分割単位の枚数ではない
// 計算上は10000枚程度まで行けるはず
//#define	MAXPICS	(300)	// 秒１枚で５分
// v1.1ではsetupで変更できるようにしたので定数廃止
// StartAVI()で指定

//******************************************************************************
/* MotionJPEG AVIの基本構造(Nikon COOLPIX P60での構造)
	QuickTimeに比べ大幅に簡素

全体
AVI			識別子
	hdlr	ヘッダー
	movi	実データ群
	idx1	オフセット＆サイズテーブル

詳細
RIFF ( 'AVI '
	LIST ( 'hdrl'
		AVIMAINHEADER ('avih')					avihチャンク	AVIファイルに含まれるグローバル情報を定義する
		LIST ( 'strl'							画像strlリスト
					AVISTREAMHEADER 'strh'		strhチャンク	AVIファイル内の1つのストリームに関する情報を格納するヘッダー
						vdis mjpg
					STREAMFORMAT_MJPEG 'strf' 	strfチャンク	ストリーム内のデータフォーマットを記述する
		)
		LIST ( 'strl'							音声strlリスト
					AVISTREAMHEADER 'strh'
						auds 0x00000000=PCM
					STREAMFORMAT_AUDIO 'strf'
		)
		メーカー固有情報はここに入る(LIST 'ncdt'/strd/strnなど)
	) // hdrl
	
	LIST ( 'movi'			ストリームデータ	moviの位置+LIST.Size+=idx1の位置
		CHUNK ( '00dc'		画像1フレーム目								.Sizeと同じ値	実はidx1さえあればここの.fcc='00dc'がなくても再生される(MediaPlayer11)
			1フレーム目画像のCHUNK.Sizeがidx1.dwOffset=0の位置					↓
			SOI (ffd8)															↓
			APP0(ffe0)		len=0x0010											↓
							'AVI1',0,0											↓
							.l	境界整合を含むサイズ;↓が奇数なら+1,偶数なら+0	↓
							.l	SOI～EOSのサイズ(SOI/EOSを含む)←---------------＋
			DRI (ffdd)		リスタートインターバル定義							↓
			DQT (ffdb)		量子化テーブル
			DHT (ffc4)		ハフマンテーブル	FinePixは、これがstrd内サムネイルにのみ存在する。だから、個別画像を切り出してもそのままでは絵にならない
			SOF (ffc0)		フレームヘッダー
			SOS (ffda)		スキャンヘッダー
			スキャンデータ＝JPEG圧縮画像データ
			EOI (ffd9)
			.w境界整合		0x00	EOIが奇数バイト目で終わるときに入る
		)
		CHUNK ('01wb'		音声1フレーム目
			0x80*長さ
		)
		CHUNK ('00dc') 		画像2フレーム目
		  :
		以下繰り返し
	) // movi
																				↓
	CHUNK ( 'idx1'			各ストリームデータのファイル内位置とサイズ			↓
							ファイルにidx1がある場合、AVIMAINHEADER.dwFlags|=AVIF_HASINDEXする
		AVIINDEXENTRY	'00dc'	AVIIF_KEYFRAME←--------------------------------＋
		AVIINDEXENTRY	'01wb'	0
		以下繰り返し
	) // idx1
) // RIFF

Windows用なので、当然数値格納順は86形式

P60固有情報
		LIST ( 'ncdt'							Nikonの固有情報を示すチャンク(よって今回は深く解析しない)
					CHUNK ( 'ncvr'
						メーカー名他
						.l				以下のサイズ
						01 00 06 00 NIKON,EOS
						02 00 04 00 00 00 01 00
					)
					CHUNK ( 'nctg'				機種名、日時、撮影情報
						ID.w  size.w
						03 00 06 00  NIKON,EOS
						04 00 0c 00  COOLPIX P60,EOS
						05 00 06 00  V1.00,EOS
						06 00 16 00  NIKON DIGITAL CAMERA,EOS,00
						07 00 02 00  01 00
						08 00 08 00  01 00 00 00 80 02 00 00		$0280=640
						09 00 08 00  24 00 00 00 0a 00 00 00
						0a 00 08 00  00 00 00 00 0a 00 00 00
						0b 00 08 00  25 00 00 00 0a 00 00 00
						0c 00 02 00  05 00
						0d 00 02 00  00 00
						0e 00 02 00  00 00 
						0f 00 08 00  80 02 00 00 0a 00 00 00
						10 00 08 00  48 00 00 00 01 00 00 00
						11 00 08 00  48 00 00 00 01 00 00 00
						12 00 02 00  02 00
						13 00 14 00  2009:10:23 10:06:55,EOS
						14 00 14 00  2009:10:23 10:06:55,EOS
						15 00 02 00  07 01
						16 00 08 00  41 00 00 00 0f 00 00 00
						17 00 02 00  01 00
						18 00 08 00  AF-S,EOS,00,00,00
						19 00 04 00  01 00 00 00
						19 00 04 00  01 00 00 00
						1a 80 04 00  00 00 00 00 
						1b 00 80 00  64 00 00 00 64 00 00 00
						1c 00 08 00  fc 1d 00 00 e8 03 00 00
						1d 00 06 00  COLOR,EOS
						1e 00 06 00  AUTO,EOS,00
						1f 00 08 00  NORMAL,EOS,80
						20 00 04 00  OFF,EOS
					)
					CHUNK ( 'ncth'
						サムネイル(160*120)
						.l				画像サイズ（SOI～EOI分)
						SOI(ffd8)
						DQT(ffdb)		量子化テーブル
						SOF(ffc0)		フレームヘッダー
						DHT(ffc4)		ハフマンテーブル
						SOS(ffda)		スキャンヘッダー
						スキャンデータ=JPEG圧縮画像データ
						EOI(ffd9)
					)
					CHUNK ( 'ncvw'
						0x00000000		?
					)
		) // ncdt


Filepix F100fdでの構造の違い
	LIST ( 'strd'
			メーカー固有情報およびサムネイルを入れている
			NikonのLIST ('ncdt')の代わり
	)
	CHUNK ( 'strn'
		"FUJIFILM AVI STREAM 0100",0
	)
	JUNKで入れ始める位置を調整している
	音声(01wb)を先に記録、その後画像(00dc*31または30)を一気に入れるを繰り返している
		音声:画像が1:1ではない

*/
//******************************************************************************
// 基本構造体(チャンク)
//******************************************************************************
// QuickTimeのATOM構造体に極めて似ている（順が違うくらい）

typedef struct {
	FOURCC	fcc;		//
	ULong	Size;		// Data[Size];WORD境界サイズにすること；以下全て同様
//	UByte	*Data;		// データ実体
} CHUNK;
#define	SZ_CHUNK	(sizeof(CHUNK))

#define	DataSize(s)	(sizeof(s)-SZ_CHUNK)	// Data実体のサイズのみを得る

// 以下の構造体は全て先頭2メンバーがCHUNK構造である（が、メンバーの2重アクセスをすると速度が遅くなりそうなので個別に書いてある）
//------------------------------------------------------------------------------

typedef struct {
	FOURCC	fcc;		// 'RIFF'
	ULong	fileSize;	// ファイルサイズ:sizeof(fileType)+以下に続くデータ全てのサイズ
	//
	FOURCC	fileType;	// 'AVI ':本当はUByte *Dataで、以下の構造を全て含む（WORD境界整合)
} RIFF; // CHUNK構造の一種
#define	SZ_RIFF		(sizeof(RIFF))
#define	FOURCC_RIFF		fourcc('R','I','F','F')
#define	filetypeAVI		fourcc('A','V','I',' ')

//------------------------------------------------------------------------------

typedef struct {
	FOURCC	fcc;		// 'LIST'
	ULong	listSize;	// ファイルサイズ:sizeof(listType)+以下に続くデータ全てのサイズ
	//
	FOURCC	listType;	// 
//	FOURCC	listData;	// ここから内包されるCHUNK(構造)が始まる
} LIST; // 一般的名称なので、必要ファイルのみでincludeすること
#define	SZ_LIST		(sizeof(LIST))
#define	FOURCC_LIST				fourcc('L','I','S','T')
#define	listtypeAVIHEADER		fourcc('h','d','r','l')
#define	listtypeSTREAMHEADER	fourcc('s','t','r','l')
#define	listtypeAVIMOVIE		fourcc('m','o','v','i')
#define	listtypeAVIRECORD		fourcc('r','e','c',' ')	/* CD-ROM再生時のみ */

//******************************************************************************
// avih : AVI Header
//******************************************************************************

typedef struct {
	FOURCC	fcc;					// 'avih'							P60での値			F100fdでの値
	ULong	Size;					// sizeof(AVIMAINHEADER)-8(fourcc+Size)
	ULong	dwMicroSecPerFrame;		// 1フレーム時間(μ秒単位)1/60秒=16667	66666=15fps			33333=30fps
	ULong	dwMaxBytesPerSec;		// ファイルの概算秒あたりの最大バイト数		500000				1164800
	ULong	dwPaddingGranularity;	// データのアライメント	バイト単位			0					0
									//		セクター境界に置くなら512
	ULong	dwFlags;				// フラグ								AVIF_HASINDEX|AVIF_WASCAPTUREFILE
	ULong	dwTotalFrames;			// 全フレーム数						(テストデータは65	180)
	ULong	dwInitialFrames;		// 再生開始フレーム						0
	ULong	dwStreams;				// ファイル内のストリーム数				2=画像＆音声			2
	ULong	dwSuggestedBufferSize;	// 1CHUNKを読み取るために必要なバッファサイズ	strh.dwSuggestedBufferSize
									//									192000				192000
	ULong	dwWidth;				// 画面幅	ピクセル単位					640					640
	ULong	dwHeight;				// 画面高さ	ピクセル単位				480					480
	ULong	dwReserved[4];			// 予約(全0)
} AVIMAINHEADER;
#define	SZ_AVIMAINHEADER	(sizeof(AVIMAINHEADER))
#define	ckidAVIMAINHDR		fourcc('a','v','i','h')

// dwFlagsの値
#define	AVIF_HASINDEX		0x00000010	// idx1がファイル最後尾に存在する
#define	AVIF_MUSTUSEINDEX	0x00000020	// 再生するビデオ/音声チャンクの順序はインデックスにて指示＝再生順序とファイル内順序は異なっている可能性あり
#define	AVIF_ISINTERLEAVED	0x00000100	// 2つ以上の異なるストリームのフレームが交互に挿入されている
#define	AVIF_TRUSTCKTYPE	0x00000800	// Use CKType to find key frames;Open-DML(AVIの延長にある規格。1GB越えやMotionJPEGサポート)のみ
#define	AVIF_WASCAPTUREFILE	0x00010000	// キャプチャされたAVI;適切にインターリーブされていないかもしれない
#define	AVIF_COPYRIGHTED	0x00020000	// 著作権保護？

#define	Sec2Micro(s)	(1000*1000*s)	// 秒をマイクロ秒単位に変換する

//******************************************************************************
// strh : Stream Header
//******************************************************************************

typedef struct {
	FOURCC	fcc;					// 'strh'
	ULong	Size;					// sizeof(AVISTREAMHEADER)-8(fourcc+Size)
	FOURCC	fccType;				// ストリームに含まれるデータのタイプ	
	FOURCC	fccHandler;				// コーデックタイプ									P60(画像:音声)	F100fd
	ULong	dwFlags;				// データストリームに対するフラグ						0:0				0:0
	UWord	wPriority;				// ストリームタイプの優先順位を指定する					0:0				0:0
	UWord	wLanguage;				// 言語											0:0				0:0
	ULong	dwInitialFrames;		// 音声が画像からどのくらい遅延するか					0				0:0
	ULong	dwScale;				// dwRateと共に、このストリームの単位時間を指定する		66666:1			33333:1=avih.dwMicroSecPerFrame
	ULong	dwRate;					// dwRate/dwScale = frames/秒(画像),samples/秒(音声)
									//												992288:8000		1000000:11024
									// dwRateとdwScaleは互いに素(割り切れない)数にする		=992288/66666/=14.9(15fps):8KHz
	ULong	dwStart;				// ストリーム開始時間	音声の場合、ストリームが始まる前に再生される無音フレームの数を示す	
									//												0:0				:0
	ULong	dwLength;				// dwRateとdwScaleで定義される単位でのストリームのサイズ＝総フレーム数:PCM音声ならサンプル数
									//												65:34200		0xb4:0x10260
	ULong	dwSuggestedBufferSize;	// 1CHUNKを読み取るために必要なバッファサイズ	192000(187.5KB):32000	192000:0x5620
									// 逆に言うと、ストリームのCHUNKの最大サイズは対応するdwSuggestedBufferSizeの値より小さくすべき
	ULong	dwQuality;				// ストリームデータ品質(重要ではない):0～10000			10000:10000		10000:10000
	ULong	dwSampleSize;			// データの1サンプルのサイズ＝ストリームの最小単位（これ以上細分すべきでない単位）のバイト数
									//												0:1				0:1
	struct {	// おそらく表示位置；通常全0
		SWord	left;
		SWord	top;
		SWord	right;
		SWord	bottom;
	}	rcFrame;
} AVISTREAMHEADER;
#define	SZ_AVISTREAMHEADER	(sizeof(AVISTREAMHEADER))
#define	ckidSTREAMHEADER	fourcc('s','t','r','h')

// fccType値
#define	streamtypeVIDEO		fourcc('v','i','d','s')
#define	streamtypeAUDIO		fourcc('a','u','d','s')
#define	streamtypeMIDI		fourcc('m','i','d','s')
#define	streamtypeTEXT		fourcc('t','x','t','s')

// streamtypeVIDEO時のfccHandler値
#define	codectypeCINEPAK	fourcc('c','v','i','d')	// Radius CinePak
#define	codectypeMSVIDEO1	fourcc('m','s','v','c')	// Microsoft Video 1
#define	codectypeINDEO32	fourcc('i','v','3','2')	// Intel Indeo 3.2
#define	codectypeINDEO41	fourcc('i','v','4','1')	// Intel Indeo 4.1
#define	codectypeINDEO51	fourcc('i','v','5','0')	// Intel Indeo 5.1
#define	codectypeMSMPEG4v1	fourcc('m','p','g','4')	// Microsoft MPEG4 v1
#define	codectypeMSMPEG4v2	fourcc('m','p','4','2')	// Microsoft MPEG4 v2
#define	codectypeMSMPEG4v3	fourcc('m','p','4','3')	// Microsoft MPEG4 v3
#define	codectypeDIVXLOW	fourcc('d','i','v','3')	// DivX Low-Motion
#define	codectypeDIVXHIGH	fourcc('d','i','v','4')	// DivX Fast-Motion
#define	codectypeDIVX		fourcc('d','i','v','x')	// Divx 4.x/5.x
#define	codectypeXVID		fourcc('x','v','i','d')	// Xvid
#define	codectypeDV2		fourcc('d','v','s','d')	// DV-AVI type 2
#define	codectypeMSMJPEG1	fourcc('M','J','P','G')	// MS-MotionJPEG
#define	codectypeMSMJPEG2	fourcc('m','j','p','g')	// MS-MotionJPEG;大文字小文字の区別は不明(BI_COMPRESS_MJPGと区別するため？)
#define	codectypeMJPEG		fourcc('d','m','b','1')	// Matrox Rainbow Runner hardware compression

// streamtypeAUDIO/TEXT時のfccHandler値
#define	codectypeNONE		0x00000000	// NULL=処理自体:Codecが不要ということ
#define	codectypePCM		codectypeNONE	// 非圧縮WAVE
#define	codectypeTEXT		codectypeNONE	// テキスト

// dwFlagsの値
#define	AVISF_DISABLED			0x00000001	// このストリームは初期状態では有効にすべきでない
#define	AVISF_VIDEO_PALCHANGES	0x00010000	// このビデオストリームは再生中にカラーパレットが変化する

// dwQualityの値
#define	AVISF_QUALITY_MAX	10000	// ストリームデータ最高品質(重要ではない)

/* 音声の場合
	DirectShowにビデオストリームと同様にシークさせるためには，ストリームヘッダいくつかの値をビデオストリームと同じように設定する必要がある。
    ・dwRateはサンプルレートを格納する
    ・dwScaleは音声の1フレームあたりのサンプル数を格納する
    ・WAVEFORMAT.nBlockAlignにはストリーム中で最大のフレームのサイズ（バイト単位）以上の値を入れなければならない
    ・dwSampleSize = 0
    ・それぞれのチャンクにはストリームの完全なパケットを格納する
	こうすることで，DirectShowは各チャンクがストリームヘッダで示された持続時間のパケットを含んでいると認識する。
	こうして、それぞれのチャンクの持続時間が
		[roundup(chunk size / nBlockAlign)] * dwScale / dwRate
	であるとAVIスプリッタに信じ込ませることが出来る
*/
//******************************************************************************
// strf : Stream Frame
//******************************************************************************
// strfに入れる構造体

#define	ckidSTREAMFORMAT		fourcc('s','t','r','f')

typedef struct {
	ULong	biSize;				// sizeof(BITMAPINFOHEADER)
	SLong	biWidth;			// 画像横ドット数(4の倍数のみ)
	SLong	biHeight;			// 画像縦ドット数
	UWord	biPlanes;			// プレーン数=1
	UWord	biBitCount;			// bit数(24=24bit)
	ULong	biCompression;		// 画像圧縮方式
	ULong	biSizeImage;		// イメージバッファーのサイズ	0xe1000=640*480*3(ビットマップ上の連続する3バイト=24bitが1画素
	SLong	biXPelsPerMeter;	// 0
	SLong	biYPelsPerMeter;	// 0
	ULong	biClrUsed;			// 0=RGBQUADを使わない
	ULong	biClrImportant;		// 0
} BITMAPINFOHEADER;
#define	SZ_BITMAPINFOHEADER	(sizeof(BITMAPINFOHEADER))

// biCompression値
#define	BI_COMPRESS_MJPG	fourcc('M','J','P','G')	// MotionJPEG
#define	BI_COMPRESS_CINEPAK	fourcc('c','v','i','d')	// cinepak
#define	BI_COMPRESS_INDEO32	fourcc('I','R','3','2')	// INDEO R3.2

typedef struct tagRGBQUAD {
	UByte	rgbBlue;
	UByte	rgbGreen;
	UByte	rgbRed;
	UByte	rgbReserved;
} RGBQUAD;

typedef struct {
	BITMAPINFOHEADER	bmiHeader;
	RGBQUAD				bmiColors[1];
} BITMAPINFO;

typedef struct {	// 映像用strf
	FOURCC				fcc;	// strf
	ULong				Size;
	BITMAPINFOHEADER	mjpg;
} STREAMFORMAT_MJPEG;
#define	SZ_STREAMFORMAT_MJPEG	(sizeof(STREAMFORMAT_MJPEG))
// P60ではRGBQUAD部が存在しない。24bitカラーでカラーテーブルが必要ないから。

//------------------------------------------------------------------------------

typedef struct { 				// P60での値
	UWord	wFormatTag;			// 1=PCM
	UWord	nChannels;			// 1=モノラル , 2=ステレオ
	ULong	nSamplesPerSec;		// サンプリング周波数	8000 B/s
	ULong	nAvgBytesPerSec;	// 1秒間の平均データ量	8000 B/s
	UWord	nBlockAlign;		// =nAvgBytesPerSec/nSamplesPerSec	1
} WAVEFORMAT;
#define	SZ_WAVEFORMAT	(sizeof(WAVEFORMAT))

typedef struct { // 無圧縮WAVE
	WAVEFORMAT	wf; 
	UWord		wBitsPerSample; // 1サンプルあたりのビット数	8bit
} PCMWAVEFORMAT;
#define	SZ_PCMWAVEFORMAT	(sizeof(PCMWAVEFORMAT))

typedef struct {	// 音声用strf
	FOURCC			fcc;	// strf
	ULong			Size;
	PCMWAVEFORMAT	pcm;
} STREAMFORMAT_AUDIO;
#define	SZ_STREAMFORMAT_AUDIO	(sizeof(STREAMFORMAT_AUDIO))

//******************************************************************************
// 実strlリスト構造体
//******************************************************************************
/*
typedef struct {
	FOURCC				str_list;	// LIST
	ULong				listSize;
	FOURCC				listType;	// strl
	AVISTREAMHEADER		strh;
	strf実体			種類によって異なる
						STREAMFORMAT_MJPEG/STREAMFORMAT_AUDIO/STREAMFORMAT_TEXT
} STREAMHEADERLIST;
*/

// 画像用
typedef struct {
	LIST				list;	// strl
	AVISTREAMHEADER		strh;	// strh
	STREAMFORMAT_MJPEG	strf;	// strf
} AVI_STRL_MJPG;
#define	SZ_AVI_STRL_MJPG	(sizeof(AVI_STRL_MJPG))

// 音声用
typedef struct {
	LIST				list;	// strl
	AVISTREAMHEADER		strh;	// strh
	STREAMFORMAT_AUDIO	strf;	// strf
} AVI_STRL_AUDIO;
#define	SZ_AVI_STRL_AUDIO	(sizeof(AVI_STRL_AUDIO))

// テキスト用
typedef struct {
	LIST				list;	// strl
	AVISTREAMHEADER		strh;	// strh
	CHUNK				strf;	// strf
} AVI_STRL_TEXT;
#define	SZ_AVI_STRL_TEXT	(sizeof(AVI_STRL_TEXT))

//******************************************************************************
// movi
//******************************************************************************
// ストリームデータ種類(movi);ストリーム0の時の値
// 2桁のトラック番号+種類コード
#define	ckidVIDEOH		'd'
#define	ckidVIDEOncL	'b'
#define	ckidVIDEOcL		'c'
#define	ckidVIDEOnc		fourcc('0','0',ckidVIDEOH,ckidVIDEOncL)	// 非圧縮ビデオ
#define	ckidVIDEOc		fourcc('0','0',ckidVIDEOH,ckidVIDEOcL)	// 圧縮ビデオ	MotionJPEGはこれ
#define	ckidTEXTH		't'
#define	ckidTEXTL		'x'
#define	ckidTEXT		fourcc('0','0',ckidTEXTH,ckidTEXTL)		// テキスト	テキストストリームは、任意の2文字コードを使えるらしい
#define	ckidAUDIOH		'w'
#define	ckidAUDIOL		'b'
#define	ckidAUDIO		fourcc('0','0',ckidAUDIOH,ckidAUDIOL)	// オーディオ
/*	他
	??pc 	パレット変更
	ix??	スタンダードインデックスブロック
*/
//******************************************************************************
// idx1
//******************************************************************************

typedef struct {	// 個別エントリ
	ULong	dwChunkId;
	ULong	dwFlags;
	ULong	dwOffset;	// chunkの位置	&CHUNK.fcc	ファイル先頭からの位置でもmoviからの相対位置どちらでも良いらしい
	ULong	dwSize;		// chunkの長さ	CHUNK内データのみのサイズ
} AVIINDEXENTRY;
#define	SZ_AVIINDEXENTRY	(sizeof(AVIINDEXENTRY))

// dwFlags値
#define	AVIIF_LIST		0x00000001	// LISTチャンクである
#define	AVIIF_KEYFRAME	0x00000010	// 映像のキーフレームである	P60では00dcにこれが付いてる(01wbは0)
#define	AVIIF_NOTIME	0x00000100	// 時間0のフレームである

/* idx1の全体構造は
	'idx1'
	データ個数*sizeof(AVIINDEXENTRY)*データ種類数
	AVIINDEXENTRY[データ個数][データ種類数]
*/
// idx1全体
typedef struct {
	FOURCC			fcc;		// idx1
	ULong			Size;
	AVIINDEXENTRY	**aIndex;
} AVIINDEX;
#define	SZ_AVIINDEX		(sizeof(AVIINDEX))
#define	ckidAVIINDEX	fourcc('i','d','x','1')

//******************************************************************************
// 他
//******************************************************************************
// 今回は未使用

#define	ckidSTREAMHANDLERDATA	fourcc('s','t','r','d')
#define	ckidSTREAMNAME			fourcc('s','t','r','n')	// ストリーム名称(ASCII)
#define	ckidAVIPADDING			fourcc('J','U','N','K')

//******************************************************************************
// AVI用JPEGヘッダー作成用ワーク(APP0)

#define	SYMBOL_AVI_APP0		"AVI1\0"	// 最後のEOSを含む
#define	LEN_SYMBOL_AVI_APP0	(sizeof(SYMBOL_AVI_APP0))
typedef	struct {
	// ↓はJPEGフォーマットなので数値は68形式
	UWord	soi;			// SOI	; いったん消すので再書き込み
	UWord	app0;			// APP0	; 新規追加
	UWord	app0Size;		// sizeof(APP0実体+app0Size)
	// ↑
	// ↓APP0の実体
	UByte	symbol[LEN_SYMBOL_AVI_APP0];	// 'AVI1',0,0
	ULong	JpegSizeWithPack;	// 境界整合を含むサイズ;↓が奇数なら+1,偶数なら+0
	ULong	JpegSize;			// SOI～EOSのサイズ(SOI/EOIを含む)
} JPEGSOIAPP0;
#define	SZ_JPEGSOIAPP0	sizeof(JPEGSOIAPP0)
extern	JPEGSOIAPP0	JpegSOIAPP0;

//******************************************************************************
// 関数プロトタイプ宣言
//******************************************************************************

void	InitAVI(ULong maxPics_);
ULong	GetMaxPics(void);
void	DeallocAVI(void);
void	StartAVI(NSFileHandle *ofp,CGRect imageSize,ULong tScale,ULong max1JPEGsize);
//ULong	Jpeg2AVI(NSFileHandle *ofp,NSData *imgdata);
//void	Jpeg2AVITable(ULong size);
//void	Text2AVI(NSFileHandle *ofp,NSString *mes);
//BOOL	AddFrames(void);
void	EndAVI(NSFileHandle *ofp);
BOOL	AviMain(NSFileHandle *ofp,NSData *imgdata,NSString *mes);

//******************************************************************************
// この関数群での固定値（AVIの仕様上の限界ではない）

#define	LEN_ATRBSTR_AVI	(40*2+1+1)	// 属性文字列長；処理を簡略化するため固定サイズにする
									// TWXで2行分+EOS+境界整合
									// 必ず偶数にすること(AVIの仕様上の規定)

#endif

//******************************************************************************
