#pragma once

// Error Codes
enum CellVdecError : u32
{
	CELL_VDEC_ERROR_ARG   = 0x80610101,
	CELL_VDEC_ERROR_SEQ   = 0x80610102,
	CELL_VDEC_ERROR_BUSY  = 0x80610103,
	CELL_VDEC_ERROR_EMPTY = 0x80610104,
	CELL_VDEC_ERROR_AU    = 0x80610105,
	CELL_VDEC_ERROR_PIC   = 0x80610106,
	CELL_VDEC_ERROR_FATAL = 0x80610180,
};

enum CellVdecCodecType : s32
{
	CELL_VDEC_CODEC_TYPE_MPEG2    = 0,
	CELL_VDEC_CODEC_TYPE_AVC      = 1,
	CELL_VDEC_CODEC_TYPE_MPEG4    = 2,
	CELL_VDEC_CODEC_TYPE_VC1      = 3,
	CELL_VDEC_CODEC_TYPE_DIVX     = 5,
	CELL_VDEC_CODEC_TYPE_JVT      = 7,
	CELL_VDEC_CODEC_TYPE_DIVX3_11 = 9,
	CELL_VDEC_CODEC_TYPE_MVC      = 11,
	CELL_VDEC_CODEC_TYPE_MVC2     = 13, // seems the same as CELL_VDEC_CODEC_TYPE_MVC?
	CELL_VDEC_CODEC_TYPE_MAX
};

// Callback Messages
enum CellVdecMsgType : s32
{
	CELL_VDEC_MSG_TYPE_AUDONE  = 0, // decoding finished
	CELL_VDEC_MSG_TYPE_PICOUT  = 1, // picture done
	CELL_VDEC_MSG_TYPE_SEQDONE = 2, // finishing done
	CELL_VDEC_MSG_TYPE_ERROR   = 3, // fatal error
};

// Decoder Operation Mode
enum CellVdecDecodeMode : s32
{
	CELL_VDEC_DEC_MODE_NORMAL,
	CELL_VDEC_DEC_MODE_B_SKIP,
	CELL_VDEC_DEC_MODE_PB_SKIP,
};

// Output Picture Format Type
enum CellVdecPicFormatType : u32
{
	CELL_VDEC_PICFMT_ARGB32_ILV,
	CELL_VDEC_PICFMT_RGBA32_ILV,
	CELL_VDEC_PICFMT_UYVY422_ILV,
	CELL_VDEC_PICFMT_YUV420_PLANAR,
};

// Output Color Matrix Coef
enum CellVdecColorMatrixType : u32
{
	CELL_VDEC_COLOR_MATRIX_TYPE_BT601,
	CELL_VDEC_COLOR_MATRIX_TYPE_BT709,
};

enum CellVdecPicAttr : s32
{
	CELL_VDEC_PICITEM_ATTR_NORMAL,
	CELL_VDEC_PICITEM_ATTR_SKIPPED,
};

// Universal Frame Rate Code
enum CellVdecFrameRate : s32
{
	CELL_VDEC_FRC_24000DIV1001 = 0x80,
	CELL_VDEC_FRC_24           = 0x81,
	CELL_VDEC_FRC_25           = 0x82,
	CELL_VDEC_FRC_30000DIV1001 = 0x83,
	CELL_VDEC_FRC_30           = 0x84,
	CELL_VDEC_FRC_50           = 0x85,
	CELL_VDEC_FRC_60000DIV1001 = 0x86,
	CELL_VDEC_FRC_60           = 0x87,
};

enum
{
	CELL_CODEC_PTS_INVALID = 0xffffffff,
	CELL_CODEC_DTS_INVALID = 0xffffffff,
};

// Codec Type Information
struct CellVdecType
{
	be_t<s32> codecType; // CellVdecCodecType
	be_t<u32> profileLevel;
};

// Extended Codec Type Information
struct CellVdecTypeEx
{
	be_t<s32> codecType; // CellVdecCodecType
	be_t<u32> profileLevel;
	be_t<u32> codecSpecificInfo_addr;
};

// Library Attributes
struct CellVdecAttr
{
	be_t<u32> memSize; // required memory
	u8 cmdDepth; // command queue depth
	be_t<u32> decoderVerUpper;
	be_t<u32> decoderVerLower;
};

// Configurable Information
struct CellVdecResource
{
	be_t<u32> memAddr;
	be_t<u32> memSize;
	be_t<s32> ppuThreadPriority;
	be_t<u32> ppuThreadStackSize;
	be_t<s32> spuThreadPriority;
	be_t<u32> numOfSpus;
};

// SPURS Information
struct CellVdecResourceSpurs
{
	be_t<u32> spursAddr;
	u8 tasksetPriority[8];
	be_t<u32> tasksetMaxContention;
};

// Extended Configurable Information
struct CellVdecResourceEx
{
	be_t<u32> memAddr;
	be_t<u32> memSize;
	be_t<s32> ppuThreadPriority;
	be_t<u32> ppuThreadStackSize;
	be_t<s32> spuThreadPriority;
	be_t<u32> numOfSpus;
	be_t<u32> spursResource_addr;
};

struct CellVdecResourceExt // speculative
{
	be_t<u32> memAddr;
	be_t<u32> memSize;
	be_t<s32> ppuThreadPriority;
	be_t<u32> ppuThreadStackSize;
	u8 unk[12];
	be_t<u32> numOfSpus;
};

// Access Unit Information
struct CellVdecAuInfo
{
	be_t<u32> startAddr;
	be_t<u32> size;
	CellCodecTimeStamp pts;
	CellCodecTimeStamp dts;
	be_t<u64> userData;
	be_t<u64> codecSpecificData;
};

// Access Unit Information
struct CellVdecAuInfoEx2 // Speculative name
{
	be_t<u32> startAddr;
	be_t<u32> unk1; // Speculative
	be_t<u32> size;
	be_t<u32> unk2; // Speculative
	CellCodecTimeStamp pts;
	CellCodecTimeStamp dts;
	be_t<u64> userData;
	be_t<u64> codecSpecificData;
};

// Output Picture Information
struct CellVdecPicItem
{
	be_t<s32> codecType; // CellVdecCodecType
	be_t<u32> startAddr;
	be_t<u32> size;
	u8 auNum;
	CellCodecTimeStamp auPts[2];
	CellCodecTimeStamp auDts[2];
	be_t<u64> auUserData[2];
	be_t<s32> status;
	be_t<s32> attr; // CellVdecPicAttr
	be_t<u32> picInfo_addr;
};

// Output Picture Format
struct CellVdecPicFormat
{
	be_t<u32> formatType; // CellVdecPicFormatType
	be_t<u32> colorMatrixType; // CellVdecColorMatrixType
	u8 alpha;
};

struct CellVdecPicFormat2
{
	be_t<u32> formatType; // CellVdecPicFormatType
	be_t<u32> colorMatrixType; // CellVdecColorMatrixType
	be_t<u32> unk0;
	u8 alpha;
	be_t<u32> unk1;
};

using CellVdecCbMsg = u32(u32 handle, CellVdecMsgType msgType, s32 msgData, u32 cbArg);

// Callback Function Information
struct CellVdecCb
{
	vm::bptr<CellVdecCbMsg> cbFunc;
	be_t<u32> cbArg;
};

// Max CC Data Length
enum
{
	CELL_VDEC_AVC_CCD_MAX = 128,
};

enum AVC_level : u8
{
	CELL_VDEC_AVC_LEVEL_1P0	= 10,
	CELL_VDEC_AVC_LEVEL_1P1	= 11,
	CELL_VDEC_AVC_LEVEL_1P2	= 12,
	CELL_VDEC_AVC_LEVEL_1P3	= 13,
	CELL_VDEC_AVC_LEVEL_2P0	= 20,
	CELL_VDEC_AVC_LEVEL_2P1	= 21,
	CELL_VDEC_AVC_LEVEL_2P2	= 22,
	CELL_VDEC_AVC_LEVEL_3P0	= 30,
	CELL_VDEC_AVC_LEVEL_3P1	= 31,
	CELL_VDEC_AVC_LEVEL_3P2	= 32,
	CELL_VDEC_AVC_LEVEL_4P0	= 40,
	CELL_VDEC_AVC_LEVEL_4P1	= 41,
	CELL_VDEC_AVC_LEVEL_4P2	= 42,
};

struct CellVdecAvcSpecificInfo
{
	be_t<u32> thisSize;
	be_t<u16> maxDecodedFrameWidth;
	be_t<u16> maxDecodedFrameHeight;
	b8 disableDeblockingFilter;
	u8 numberOfDecodedFrameBuffer;
};

enum AVC_video_format : u8
{
	CELL_VDEC_AVC_VF_COMPONENT                = 0x00,
	CELL_VDEC_AVC_VF_PAL                      = 0x01,
	CELL_VDEC_AVC_VF_NTSC                     = 0x02,
	CELL_VDEC_AVC_VF_SECAM                    = 0x03,
	CELL_VDEC_AVC_VF_MAC                      = 0x04,
	CELL_VDEC_AVC_VF_UNSPECIFIED              = 0x05,
};

enum AVC_colour_primaries : u8
{
	CELL_VDEC_AVC_CP_ITU_R_BT_709_5           = 0x01,
	CELL_VDEC_AVC_CP_UNSPECIFIED              = 0x02,
	CELL_VDEC_AVC_CP_ITU_R_BT_470_6_SYS_M     = 0x04,
	CELL_VDEC_AVC_CP_ITU_R_BT_470_6_SYS_BG    = 0x05,
	CELL_VDEC_AVC_CP_SMPTE_170_M              = 0x06,
	CELL_VDEC_AVC_CP_SMPTE_240_M              = 0x07,
	CELL_VDEC_AVC_CP_GENERIC_FILM             = 0x08,
};

enum AVC_transfer_characteristics : u8
{
	CELL_VDEC_AVC_TC_ITU_R_BT_709_5           = 0x01,
	CELL_VDEC_AVC_TC_UNSPECIFIED              = 0x02,
	CELL_VDEC_AVC_TC_ITU_R_BT_470_6_SYS_M     = 0x04,
	CELL_VDEC_AVC_TC_ITU_R_BT_470_6_SYS_BG    = 0x05,
	CELL_VDEC_AVC_TC_SMPTE_170_M              = 0x06,
	CELL_VDEC_AVC_TC_SMPTE_240_M              = 0x07,
	CELL_VDEC_AVC_TC_LINEAR                   = 0x08,
	CELL_VDEC_AVC_TC_LOG_100_1                = 0x09,
	CELL_VDEC_AVC_TC_LOG_316_1                = 0x0a,
};

enum AVC_matrix_coefficients : u8
{
	CELL_VDEC_AVC_MXC_GBR                     = 0x00,
	CELL_VDEC_AVC_MXC_ITU_R_BT_709_5          = 0x01,
	CELL_VDEC_AVC_MXC_UNSPECIFIED             = 0x02,
	CELL_VDEC_AVC_MXC_FCC                     = 0x04,
	CELL_VDEC_AVC_MXC_ITU_R_BT_470_6_SYS_BG   = 0x05,
	CELL_VDEC_AVC_MXC_SMPTE_170_M             = 0x06,
	CELL_VDEC_AVC_MXC_SMPTE_240_M             = 0x07,
	CELL_VDEC_AVC_MXC_YCGCO                   = 0x08,
};

enum AVC_FrameRateCode : u8
{
	CELL_VDEC_AVC_FRC_24000DIV1001            = 0x00,
	CELL_VDEC_AVC_FRC_24                      = 0x01,
	CELL_VDEC_AVC_FRC_25                      = 0x02,
	CELL_VDEC_AVC_FRC_30000DIV1001            = 0x03,
	CELL_VDEC_AVC_FRC_30                      = 0x04,
	CELL_VDEC_AVC_FRC_50                      = 0x05,
	CELL_VDEC_AVC_FRC_60000DIV1001            = 0x06,
	CELL_VDEC_AVC_FRC_60                      = 0x07,
};

enum AVC_NulUnitPresentFlags : u16
{
	CELL_VDEC_AVC_FLG_SPS                     = 0x0001,
	CELL_VDEC_AVC_FLG_PPS                     = 0x0002,
	CELL_VDEC_AVC_FLG_AUD                     = 0x0004,
	CELL_VDEC_AVC_FLG_EO_SEQ                  = 0x0008,
	CELL_VDEC_AVC_FLG_EO_STREAM               = 0x0100,
	CELL_VDEC_AVC_FLG_FILLER_DATA             = 0x0200,
	CELL_VDEC_AVC_FLG_PIC_TIMING_SEI          = 0x0400,
	CELL_VDEC_AVC_FLG_BUFF_PERIOD_SEI         = 0x0800,
	CELL_VDEC_AVC_FLG_USER_DATA_UNREG_SEI     = 0x1000,
};

enum AVC_aspect_ratio_idc : u8
{
	CELL_VDEC_AVC_ARI_SAR_UNSPECIFIED         = 0x00,
	CELL_VDEC_AVC_ARI_SAR_1_1                 = 0x01,
	CELL_VDEC_AVC_ARI_SAR_12_11               = 0x02,
	CELL_VDEC_AVC_ARI_SAR_10_11               = 0x03,
	CELL_VDEC_AVC_ARI_SAR_16_11               = 0x04,
	CELL_VDEC_AVC_ARI_SAR_40_33               = 0x05,
	CELL_VDEC_AVC_ARI_SAR_24_11               = 0x06,
	CELL_VDEC_AVC_ARI_SAR_20_11               = 0x07,
	CELL_VDEC_AVC_ARI_SAR_32_11               = 0x08,
	CELL_VDEC_AVC_ARI_SAR_80_33               = 0x09,
	CELL_VDEC_AVC_ARI_SAR_18_11               = 0x0a,
	CELL_VDEC_AVC_ARI_SAR_15_11               = 0x0b,
	CELL_VDEC_AVC_ARI_SAR_64_33               = 0x0c,
	CELL_VDEC_AVC_ARI_SAR_160_99              = 0x0d,
	CELL_VDEC_AVC_ARI_SAR_4_3                 = 0x0e,
	CELL_VDEC_AVC_ARI_SAR_3_2                 = 0x0f,
	CELL_VDEC_AVC_ARI_SAR_2_1                 = 0x10,
	CELL_VDEC_AVC_ARI_SAR_EXTENDED_SAR        = 0xff,
};

enum AVC_PictureType : u8
{
	CELL_VDEC_AVC_PCT_I                       = 0x00,
	CELL_VDEC_AVC_PCT_P                       = 0x01,
	CELL_VDEC_AVC_PCT_B                       = 0x02,
	CELL_VDEC_AVC_PCT_UNKNOWN                 = 0x03,
};

enum AVC_pic_struct : u8
{
	CELL_VDEC_AVC_PSTR_FRAME                  = 0x00,
	CELL_VDEC_AVC_PSTR_FIELD_TOP              = 0x01,
	CELL_VDEC_AVC_PSTR_FIELD_BTM              = 0x02,
	CELL_VDEC_AVC_PSTR_FIELD_TOP_BTM          = 0x03,
	CELL_VDEC_AVC_PSTR_FIELD_BTM_TOP          = 0x04,
	CELL_VDEC_AVC_PSTR_FIELD_TOP_BTM_TOP      = 0x05,
	CELL_VDEC_AVC_PSTR_FIELD_BTM_TOP_BTM      = 0x06,
	CELL_VDEC_AVC_PSTR_FRAME_DOUBLING         = 0x07,
	CELL_VDEC_AVC_PSTR_FRAME_TRIPLING         = 0x08,
};

struct CellVdecAvcInfo
{
	be_t<u16> horizontalSize;
	be_t<u16> verticalSize;
	AVC_PictureType pictureType[2];
	b8 idrPictureFlag;
	AVC_aspect_ratio_idc aspect_ratio_idc;
	be_t<u16> sar_height;
	be_t<u16> sar_width;
	AVC_pic_struct pic_struct;
	be_t<s16> picOrderCount[2];
	b8 vui_parameters_present_flag;
	b8 frame_mbs_only_flag;
	b8 video_signal_type_present_flag;
	AVC_video_format video_format;
	b8 video_full_range_flag;
	b8 colour_description_present_flag;
	AVC_colour_primaries colour_primaries;
	AVC_transfer_characteristics transfer_characteristics;
	AVC_matrix_coefficients matrix_coefficients;
	b8 timing_info_present_flag;
	AVC_FrameRateCode frameRateCode; // ???
	b8 fixed_frame_rate_flag;
	b8 low_delay_hrd_flag;
	b8 entropy_coding_mode_flag;
	be_t<u16> nalUnitPresentFlags;
	u8 ccDataLength[2];
	u8 ccData[2][CELL_VDEC_AVC_CCD_MAX];
	be_t<u64> reserved[2];
};

// DIVX Profile
enum DIVX_level : u8
{
	CELL_VDEC_DIVX_QMOBILE                   = 10,
	CELL_VDEC_DIVX_MOBILE                    = 11,
	CELL_VDEC_DIVX_HOME_THEATER              = 12,
	CELL_VDEC_DIVX_HD_720                    = 13,
	CELL_VDEC_DIVX_HD_1080                   = 14,
};

struct CellVdecDivxSpecificInfo
{
	be_t<u32> thisSize;
	be_t<u16> maxDecodedFrameWidth;
	be_t<u16> maxDecodedFrameHeight;
};

struct CellVdecDivxSpecificInfo2
{
	be_t<u32> thisSize;
	be_t<u16> maxDecodedFrameWidth;
	be_t<u16> maxDecodedFrameHeight;
	be_t<u16> numberOfDecodedFrameBuffer;
};

enum DIVX_frameRateCode : u16
{
	CELL_VDEC_DIVX_FRC_UNDEFINED             = 0x00,
	CELL_VDEC_DIVX_FRC_24000DIV1001          = 0x01,
	CELL_VDEC_DIVX_FRC_24                    = 0x02,
	CELL_VDEC_DIVX_FRC_25                    = 0x03,
	CELL_VDEC_DIVX_FRC_30000DIV1001          = 0x04,
	CELL_VDEC_DIVX_FRC_30                    = 0x05,
	CELL_VDEC_DIVX_FRC_50                    = 0x06,
	CELL_VDEC_DIVX_FRC_60000DIV1001          = 0x07,
	CELL_VDEC_DIVX_FRC_60                    = 0x08,
};

enum DIVX_pixelAspectRatio : u8
{
	CELL_VDEC_DIVX_ARI_PAR_1_1               = 0x1,
	CELL_VDEC_DIVX_ARI_PAR_12_11             = 0x2,
	CELL_VDEC_DIVX_ARI_PAR_10_11             = 0x3,
	CELL_VDEC_DIVX_ARI_PAR_16_11             = 0x4,
	CELL_VDEC_DIVX_ARI_PAR_40_33             = 0x5,
	CELL_VDEC_DIVX_ARI_PAR_EXTENDED_PAR      = 0xF,
};

enum DIVX_pictureType : u8
{
	CELL_VDEC_DIVX_VCT_I                     = 0x0,
	CELL_VDEC_DIVX_VCT_P                     = 0x1,
	CELL_VDEC_DIVX_VCT_B                     = 0x2,
};

enum DIVX_pictureStruct : u8
{
	CELL_VDEC_DIVX_PSTR_FRAME                = 0x0,
	CELL_VDEC_DIVX_PSTR_TOP_BTM              = 0x1,
	CELL_VDEC_DIVX_PSTR_BTM_TOP              = 0x2,
};

enum DIVX_colourPrimaries : u8
{
	CELL_VDEC_DIVX_CP_ITU_R_BT_709           = 0x01,
	CELL_VDEC_DIVX_CP_UNSPECIFIED            = 0x02,
	CELL_VDEC_DIVX_CP_ITU_R_BT_470_SYS_M     = 0x04,
	CELL_VDEC_DIVX_CP_ITU_R_BT_470_SYS_BG    = 0x05,
	CELL_VDEC_DIVX_CP_SMPTE_170_M            = 0x06,
	CELL_VDEC_DIVX_CP_SMPTE_240_M            = 0x07,
	CELL_VDEC_DIVX_CP_GENERIC_FILM           = 0x08,
};

enum DIVX_transferCharacteristics : u8
{
	CELL_VDEC_DIVX_TC_ITU_R_BT_709           = 0x01,
	CELL_VDEC_DIVX_TC_UNSPECIFIED            = 0x02,
	CELL_VDEC_DIVX_TC_ITU_R_BT_470_SYS_M     = 0x04,
	CELL_VDEC_DIVX_TC_ITU_R_BT_470_SYS_BG    = 0x05,
	CELL_VDEC_DIVX_TC_SMPTE_170_M            = 0x06,
	CELL_VDEC_DIVX_TC_SMPTE_240_M            = 0x07,
	CELL_VDEC_DIVX_TC_LINEAR                 = 0x08,
	CELL_VDEC_DIVX_TC_LOG_100_1              = 0x09,
	CELL_VDEC_DIVX_TC_LOG_316_1              = 0x0a,
};

enum DIVX_matrixCoefficients : u8
{
	CELL_VDEC_DIVX_MXC_ITU_R_BT_709          = 0x01,
	CELL_VDEC_DIVX_MXC_UNSPECIFIED           = 0x02,
	CELL_VDEC_DIVX_MXC_FCC                   = 0x04,
	CELL_VDEC_DIVX_MXC_ITU_R_BT_470_SYS_BG   = 0x05,
	CELL_VDEC_DIVX_MXC_SMPTE_170_M           = 0x06,
	CELL_VDEC_DIVX_MXC_SMPTE_240_M           = 0x07,
	CELL_VDEC_DIVX_MXC_YCGCO                 = 0x08,
};

struct CellVdecDivxInfo
{
	DIVX_pictureType pictureType;
	be_t<u16> horizontalSize;
	be_t<u16> verticalSize;
	DIVX_pixelAspectRatio pixelAspectRatio;
	u8 parWidth;
	u8 parHeight;
	b8 colourDescription;
	DIVX_colourPrimaries colourPrimaries;
	DIVX_transferCharacteristics transferCharacteristics;
	DIVX_matrixCoefficients matrixCoefficients;
	DIVX_pictureStruct pictureStruct;
	be_t<u16> frameRateCode; // DIVX_frameRateCode
};

enum MPEG2_level
{
	CELL_VDEC_MPEG2_MP_LL,
	CELL_VDEC_MPEG2_MP_ML,
	CELL_VDEC_MPEG2_MP_H14,
	CELL_VDEC_MPEG2_MP_HL,
};

struct CellVdecMpeg2SpecificInfo
{
	be_t<u32> thisSize;
	be_t<u16> maxDecodedFrameWidth;
	be_t<u16> maxDecodedFrameHeight;
};

enum MPEG2_headerFlags : u32
{
	CELL_VDEC_MPEG2_FLG_SEQ_HDR       = 0x00000001,
	CELL_VDEC_MPEG2_FLG_SEQ_EXT       = 0x00000002,
	CELL_VDEC_MPEG2_FLG_SEQ_DSP_EXT   = 0x00000004,
	CELL_VDEC_MPEG2_FLG_SEQ_USR_DAT   = 0x00000008,
	CELL_VDEC_MPEG2_FLG_SEQ_END       = 0x00000010,
	CELL_VDEC_MPEG2_FLG_GOP_HDR       = 0x00000020,
	CELL_VDEC_MPEG2_FLG_GOP_USR_DAT   = 0x00000040,
	CELL_VDEC_MPEG2_FLG_PIC_HDR_1     = 0x00000100,
	CELL_VDEC_MPEG2_FLG_PIC_EXT_1     = 0x00000200,
	CELL_VDEC_MPEG2_FLG_PIC_DSP_EXT_1 = 0x00000400,
	CELL_VDEC_MPEG2_FLG_PIC_USR_DAT_1 = 0x00000800,
	CELL_VDEC_MPEG2_FLG_PIC_HDR_2     = 0x00001000,
	CELL_VDEC_MPEG2_FLG_PIC_EXT_2     = 0x00002000,
	CELL_VDEC_MPEG2_FLG_PIC_DSP_EXT_2 = 0x00004000,
	CELL_VDEC_MPEG2_FLG_PIC_USR_DAT_2 = 0x00008000,
};

enum MPEG2_aspectRatio : u8
{
	CELL_VDEC_MPEG2_ARI_SAR_1_1                 = 0x01,
	CELL_VDEC_MPEG2_ARI_DAR_4_3                 = 0x02,
	CELL_VDEC_MPEG2_ARI_DAR_16_9                = 0x03,
	CELL_VDEC_MPEG2_ARI_DAR_2P21_1              = 0x04,
};

enum MPEG1_aspectRatio : u8
{
	CELL_VDEC_MPEG1_ARI_SAR_1P0                 = 0x01,
	CELL_VDEC_MPEG1_ARI_SAR_0P6735              = 0x02,
	CELL_VDEC_MPEG1_ARI_SAR_0P7031              = 0x03,
	CELL_VDEC_MPEG1_ARI_SAR_0P7615              = 0x04,
	CELL_VDEC_MPEG1_ARI_SAR_0P8055              = 0x05,
	CELL_VDEC_MPEG1_ARI_SAR_0P8437              = 0x06,
	CELL_VDEC_MPEG1_ARI_SAR_0P8935              = 0x07,
	CELL_VDEC_MPEG1_ARI_SAR_0P9157              = 0x08,
	CELL_VDEC_MPEG1_ARI_SAR_0P9815              = 0x09,
	CELL_VDEC_MPEG1_ARI_SAR_1P0255              = 0x0a,
	CELL_VDEC_MPEG1_ARI_SAR_1P0695              = 0x0b,
	CELL_VDEC_MPEG1_ARI_SAR_1P0950              = 0x0c,
	CELL_VDEC_MPEG1_ARI_SAR_1P1575              = 0x0d,
	CELL_VDEC_MPEG1_ARI_SAR_1P2015              = 0x0e,
};

enum MPEG2_frameRate : u8
{
	CELL_VDEC_MPEG2_FRC_FORBIDDEN               = 0x00,
	CELL_VDEC_MPEG2_FRC_24000DIV1001            = 0x01,
	CELL_VDEC_MPEG2_FRC_24                      = 0x02,
	CELL_VDEC_MPEG2_FRC_25                      = 0x03,
	CELL_VDEC_MPEG2_FRC_30000DIV1001            = 0x04,
	CELL_VDEC_MPEG2_FRC_30                      = 0x05,
	CELL_VDEC_MPEG2_FRC_50                      = 0x06,
	CELL_VDEC_MPEG2_FRC_60000DIV1001            = 0x07,
	CELL_VDEC_MPEG2_FRC_60                      = 0x08,
};

enum MPEG2_videoFormat : u8
{
	CELL_VDEC_MPEG2_VF_COMPONENT                = 0x00,
	CELL_VDEC_MPEG2_VF_PAL                      = 0x01,
	CELL_VDEC_MPEG2_VF_NTSC                     = 0x02,
	CELL_VDEC_MPEG2_VF_SECAM                    = 0x03,
	CELL_VDEC_MPEG2_VF_MAC                      = 0x04,
	CELL_VDEC_MPEG2_VF_UNSPECIFIED              = 0x05,
};

enum MPEG2_colourPrimaries : u8
{
	CELL_VDEC_MPEG2_CP_FORBIDDEN                = 0x00,
	CELL_VDEC_MPEG2_CP_ITU_R_BT_709             = 0x01,
	CELL_VDEC_MPEG2_CP_UNSPECIFIED              = 0x02,
	CELL_VDEC_MPEG2_CP_ITU_R_BT_470_2_SYS_M     = 0x04,
	CELL_VDEC_MPEG2_CP_ITU_R_BT_470_2_SYS_BG    = 0x05,
	CELL_VDEC_MPEG2_CP_SMPTE_170_M              = 0x06,
	CELL_VDEC_MPEG2_CP_SMPTE_240_M              = 0x07,
};

enum MPEG2_transferCharacteristics : u8
{
	CELL_VDEC_MPEG2_TC_FORBIDDEN                = 0x00,
	CELL_VDEC_MPEG2_TC_ITU_R_BT_709             = 0x01,
	CELL_VDEC_MPEG2_TC_UNSPECIFIED              = 0x02,
	CELL_VDEC_MPEG2_TC_ITU_R_BT_470_2_SYS_M     = 0x04,
	CELL_VDEC_MPEG2_TC_ITU_R_BT_470_2_SYS_BG    = 0x05,
	CELL_VDEC_MPEG2_TC_SMPTE_170_M              = 0x06,
	CELL_VDEC_MPEG2_TC_SMPTE_240_M              = 0x07,
	CELL_VDEC_MPEG2_TC_LINEAR                   = 0x08,
	CELL_VDEC_MPEG2_TC_LOG_100_1                = 0x09,
	CELL_VDEC_MPEG2_TC_LOG_316_1                = 0x0a,
};

enum MPEG2_matrixCoefficients : u8
{
	CELL_VDEC_MPEG2_MXC_FORBIDDEN               = 0x00,
	CELL_VDEC_MPEG2_MXC_ITU_R_BT_709            = 0x01,
	CELL_VDEC_MPEG2_MXC_UNSPECIFIED             = 0x02,
	CELL_VDEC_MPEG2_MXC_FCC                     = 0x04,
	CELL_VDEC_MPEG2_MXC_ITU_R_BT_470_2_SYS_BG   = 0x05,
	CELL_VDEC_MPEG2_MXC_SMPTE_170_M             = 0x06,
	CELL_VDEC_MPEG2_MXC_SMPTE_240_M             = 0x07,
};

enum MPEG2_pictureCodingType : u8
{
	CELL_VDEC_MPEG2_PCT_FORBIDDEN               = 0x00,
	CELL_VDEC_MPEG2_PCT_I                       = 0x01,
	CELL_VDEC_MPEG2_PCT_P                       = 0x02,
	CELL_VDEC_MPEG2_PCT_B                       = 0x03,
	CELL_VDEC_MPEG2_PCT_D                       = 0x04,
};

enum MPEG2_pictureStructure : u8
{
	CELL_VDEC_MPEG2_PSTR_TOP_FIELD              = 0x01,
	CELL_VDEC_MPEG2_PSTR_BOTTOM_FIELD           = 0x02,
	CELL_VDEC_MPEG2_PSTR_FRAME                  = 0x03,
};

struct CellVdecMpeg2Info
{
	be_t<u16> horizontal_size;
	be_t<u16> vertical_size;
	union
	{
		MPEG2_aspectRatio aspect_ratio_information;
		MPEG1_aspectRatio aspect_ratio_information1;
	};
	MPEG2_frameRate frame_rate_code;
	b8 progressive_sequence;
	b8 low_delay;
	MPEG2_videoFormat video_format;
	b8 colour_description;
	MPEG2_colourPrimaries colour_primaries;
	MPEG2_transferCharacteristics transfer_characteristics;
	MPEG2_matrixCoefficients matrix_coefficients;
	be_t<u16> temporal_reference[2];
	MPEG2_pictureCodingType picture_coding_type[2];
	MPEG2_pictureStructure picture_structure[2];
	b8 top_field_first;
	b8 repeat_first_field;
	b8 progressive_frame;
	be_t<u32> time_code;
	b8 closed_gop;
	b8 broken_link;
	be_t<u16> vbv_delay[2];
	be_t<u16> display_horizontal_size;
	be_t<u16> display_vertical_size;
	u8  number_of_frame_centre_offsets[2];
	be_t<u16> frame_centre_horizontal_offset[2][3];
	be_t<u16> frame_centre_vertical_offset[2][3];
	be_t<u32> headerPresentFlags; // MPEG2_headerFlags
	be_t<u32> headerRetentionFlags; // MPEG2_headerFlags
	b8 mpeg1Flag;
	u8 ccDataLength[2];
	u8 ccData[2][128];
	be_t<u64> reserved[2];
};

enum MPEG4_level
{
	CELL_VDEC_MPEG4_SP_L1,
	CELL_VDEC_MPEG4_SP_L2,
	CELL_VDEC_MPEG4_SP_L3,
	CELL_VDEC_MPEG4_SP_D1_NTSC,
	CELL_VDEC_MPEG4_SP_VGA,
	CELL_VDEC_MPEG4_SP_D1_PAL,
};

struct CellVdecMpeg4SpecificInfo
{
	be_t<u32> thisSize;
	be_t<u16> maxDecodedFrameWidth;
	be_t<u16> maxDecodedFrameHeight;
};
