//-----------------------------------------------------------------------------
//
// ImageLib Sources
// Copyright (C) 2000-2009 by Denton Woods
// Last modified: 02/26/2009
//
// Filename: src-IL/include/il_dpx.h
//
// Description: Reads from a Digital Picture Exchange (.dpx) file.
//				Specifications for this format were	found at
//				http://www.cineon.com/ff_draft.php and
//				http://www.fileformat.info/format/dpx/.
//
//-----------------------------------------------------------------------------


#ifndef DPX_H
#define DPX_H

#include "il_internal.h"


#ifdef _WIN32
#pragma pack(push, packed_struct, 1)
#endif
typedef struct R32
{
	ILubyte	r, g, b, a;
} IL_PACKSTRUCT R32;
#ifdef _WIN32
#pragma pack(pop, packed_struct)
#endif


typedef struct DPX_FILE_INFO
{
    ILuint	MagicNum;        /* magic number 0x53445058 (SDPX) or 0x58504453 (XPDS) */
    ILuint	Offset;           /* offset to image data in bytes */
    ILbyte	Vers[8];          /* which header format version is being used (v1.0)*/
    ILuint	FileSize;        /* file size in bytes */
    ILuint	DittoKey;        /* read time short cut - 0 = same, 1 = new */
    ILuint	GenHdrSize;     /* generic header length in bytes */
    ILuint	IndHdrSize;     /* industry header length in bytes */
    ILuint	UserDataSize;   /* user-defined data length in bytes */
    ILbyte	FileName[100];   /* image file name */
    ILbyte	CreateTime[24];  /* file creation date "yyyy:mm:dd:hh:mm:ss:LTZ" */
    ILbyte	Creator[100];     /* file creator's name */
    ILbyte	Project[200];     /* project name */
    ILbyte	Copyright[200];   /* right to use or copyright info */
    ILuint	Key;              /* encryption ( FFFFFFFF = unencrypted ) */
    ILbyte	Reserved[104];    /* reserved field TBD (need to pad) */
} DPX_FILE_INFO;

typedef struct DPX_IMAGE_ELEMENT
{
    ILuint    DataSign;			/* data sign (0 = unsigned, 1 = signed ) */
								/* "Core set images are unsigned" */
    ILuint		RefLowData;		/* reference low data code value */
    R32			RefLowQuantity;	/* reference low quantity represented */
    ILuint		RefHighData;	/* reference high data code value */
    R32			RefHighQuantity;/* reference high quantity represented */
    ILubyte		Descriptor;		/* descriptor for image element */
    ILubyte		Transfer;		/* transfer characteristics for element */
    ILubyte		Colorimetric;	/* colormetric specification for element */
    ILubyte		BitSize;		/* bit size for element */
	ILushort	Packing;		/* packing for element */
    ILushort	Encoding;		/* encoding for element */
    ILuint		DataOffset;		/* offset to data of element */
    ILuint		EolPadding;		/* end of line padding used in element */
    ILuint		EoImagePadding;	/* end of image padding used in element */
    ILbyte		Description[32];/* description of element */
} DPX_IMAGE_ELEMENT;  /* NOTE THERE ARE EIGHT OF THESE */


typedef struct DPX_IMAGE_INFO
{
    ILushort	Orientation;          /* image orientation */
    ILushort	NumElements;       /* number of image elements */
    ILuint		Width;      /* or x value */
    ILuint		Height;  /* or y value, per element */
	DPX_IMAGE_ELEMENT	ImageElement[8];
    ILubyte		reserved[52];             /* reserved for future use (padding) */
} DPX_IMAGE_INFO;


typedef struct DPX_IMAGE_ORIENT
{
    ILuint		XOffset;               /* X offset */
    ILuint		YOffset;               /* Y offset */
    R32			XCenter;               /* X center */
    R32			YCenter;               /* Y center */
    ILuint		XOrigSize;            /* X original size */
    ILuint		YOrigSize;            /* Y original size */
    ILbyte		FileName[100];         /* source image file name */
    ILbyte		CreationTime[24];      /* source image creation date and time */
    ILbyte		InputDev[32];          /* input device name */
    ILbyte		InputSerial[32];       /* input device serial number */
    ILushort	Border[4];              /* border validity (XL, XR, YT, YB) */
    ILuint		PixelAspect[2];        /* pixel aspect ratio (H:V) */
    ILubyte		Reserved[28];           /* reserved for future use (padding) */
} DPX_IMAGE_ORIENT;


typedef struct DPX_MOTION_PICTURE_HEAD
{
    ILbyte film_mfg_id[2];    /* film manufacturer ID code (2 digits from film edge code) */
    ILbyte film_type[2];      /* file type (2 digits from film edge code) */
    ILbyte offset[2];         /* offset in perfs (2 digits from film edge code)*/
    ILbyte prefix[6];         /* prefix (6 digits from film edge code) */
    ILbyte count[4];          /* count (4 digits from film edge code)*/
    ILbyte format[32];        /* format (i.e. academy) */
    ILuint   frame_position;    /* frame position in sequence */
    ILuint   sequence_len;      /* sequence length in frames */
    ILuint   held_count;        /* held count (1 = default) */
    R32   frame_rate;        /* frame rate of original in frames/sec */
    R32   shutter_angle;     /* shutter angle of camera in degrees */
    ILbyte frame_id[32];      /* frame identification (i.e. keyframe) */
    ILbyte slate_info[100];   /* slate information */
    ILubyte    reserved[56];      /* reserved for future use (padding) */
} DPX_MOTION_PICTURE_HEAD;


typedef struct DPX_TELEVISION_HEAD
{
    ILuint tim_code;            /* SMPTE time code */
    ILuint userBits;            /* SMPTE user bits */
    ILubyte  interlace;           /* interlace ( 0 = noninterlaced, 1 = 2:1 interlace*/
    ILubyte  field_num;           /* field number */
    ILubyte  video_signal;        /* video signal standard (table 4)*/
    ILubyte  unused;              /* used for byte alignment only */
    R32 hor_sample_rate;     /* horizontal sampling rate in Hz */
    R32 ver_sample_rate;     /* vertical sampling rate in Hz */
    R32 frame_rate;          /* temporal sampling rate or frame rate in Hz */
    R32 time_offset;         /* time offset from sync to first pixel */
    R32 gamma;               /* gamma value */
    R32 black_level;         /* black level code value */
    R32 black_gain;          /* black gain */
    R32 break_point;         /* breakpoint */
    R32 white_level;         /* reference white level code value */
    R32 integration_times;   /* integration time(s) */
    ILubyte  reserved[76];        /* reserved for future use (padding) */
} DPX_TELEVISION_HEAD;


// For checking and reading
ILboolean iIsValidDpx(void);
//ILboolean iCheckDpx(DPXHEAD *Header);
ILboolean iLoadDpxInternal(void);

#endif//PCX_H
