/*
 * VideoDefs.h - Definitions for video I/O
 *
 *  Copyright 1995-2013 The MathWorks, Inc.
 */

#ifndef VIDEODEFS_H
#define VIDEODEFS_H

typedef enum
{
    VideoFrame_RowMajor = 0,
    VideoFrame_ColumnMajor
} VideoFrameOrientation;

typedef enum
{
    LineOrder_TopDown = 0,
    LineOrder_BottomUp
} VideoFrameLineOrder;

typedef enum {
    FOURCC_INVALID,
    FOURCC_RGB,
    FOURCC_GREY,
    FOURCC_YUY2
} FourCCType;

static const int    NumBandsForFourCCType[] = {0, 3, 1, 3};

/* Ratio of the total image size in bytes to the size of a full band for different FourCC Types */
static const double TotalSizeToOneFullBandSizeInBytesRatio[] = {0.0, 3.0, 1.0, 2.0};

typedef enum {
    FILETYPE_INVALID,
    FILETYPE_AVI,
    FILETYPE_WAV,
    FILETYPE_WMV,
    FILETYPE_WMA,
    FILETYPE_FLAC,
    FILETYPE_OGG,
    FILETYPE_MPEG4,
    FILETYPE_MJ2000,
    FILETYPE_NUMTYPES
} MMFileType;


/* these follow Simulink data types, in simstruc_types.h */
typedef enum
{
    VideoDataType_Double = 0,   /* double */
    VideoDataType_Single,       /* float */
    VideoDataType_Int8,         /* char */
    VideoDataType_Uint8,        /* unsigned char */
    VideoDataType_Int16,        /* short */
    VideoDataType_Uint16,       /* unsigned short */
    VideoDataType_Int32,        /* long */
    VideoDataType_Uint32,       /* unsigned long */
    VideoDataType_Boolean,      /* bool */
    VideoDataType_INVALID,
    VideoDataType_NUMTYPES
} VideoDataType;

static const int VideoDataTypeSize[] = {8,4,1,1,2,2,4,4,1,0};

typedef struct
{
    unsigned char isValid;    /* Zero if the file has no video */

    /* The following fields refer to the format of the video data as encoded in the file/device */
    double frameRate;         /* video num frames per second */
    double frameRateComputed; /* video num frames per second, as computed by the video framework.
                               * The reason that this field is necessary is that on Windows, 
                               * this number is less accurate than the frameRate field, yet it is essential
                               * to use this value in methods that determine which frame to emit.
                               * The frameRate field determines the Sample Time on the 
                               * Simulink wire, to be consistent with the UNIX implementation.
                               */
    char fourcc[4];           /* set to the FOURCC code of the video encoding (e.g. RGB, YUV)*/
    int numPorts;             /* The number of separate signals (ports) used for the image */
    int numBands;             /* The number of bands (or color planes) in the image */
    int bandWidth[3];         /* width of the video bands (RGB or intensity/chroma if YCbCr) */
    int bandHeight[3];        /* height of the video bands (RGB or intensity/chroma if YCbCr) */
    
    /* The following fields refer to the format of the data in MATLAB/Simulink */
    VideoDataType dataType;   /* data type of incoming video image pixels */
    VideoFrameOrientation orientation;  /* row- or column-major */
    
    /* The name of the compression format, if we are writing a file */
    const char* videoCompressor;        /* set to NULL for none */
    unsigned char useMMReader; /* useMMReader = (ispc && isVideoCompressed) */
} MMVideoInfo;


#endif  /* VIDEODEFS_H */