253 lines
8.5 KiB
C
253 lines
8.5 KiB
C
|
/*!
|
||
|
* \copy
|
||
|
* Copyright (c) 2013, Cisco Systems
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions
|
||
|
* are met:
|
||
|
*
|
||
|
* * Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
*
|
||
|
* * Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in
|
||
|
* the documentation and/or other materials provided with the
|
||
|
* distribution.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef WELS_VIDEO_CODEC_DEFINITION_H__
|
||
|
#define WELS_VIDEO_CODEC_DEFINITION_H__
|
||
|
|
||
|
#if defined(WIN32)
|
||
|
#pragma once
|
||
|
#endif//WIN32
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
/*rgb color formats*/
|
||
|
videoFormatRGB = 1,
|
||
|
videoFormatRGBA = 2,
|
||
|
videoFormatRGB555 = 3,
|
||
|
videoFormatRGB565 = 4,
|
||
|
videoFormatBGR = 5,
|
||
|
videoFormatBGRA = 6,
|
||
|
videoFormatABGR = 7,
|
||
|
videoFormatARGB = 8,
|
||
|
|
||
|
/*yuv color formats*/
|
||
|
videoFormatYUY2 = 20,
|
||
|
videoFormatYVYU = 21,
|
||
|
videoFormatUYVY = 22,
|
||
|
videoFormatI420 = 23, //same as IYUV
|
||
|
videoFormatYV12 = 24,
|
||
|
videoFormatInternal = 25, // Only Used for SVC decoder testbed
|
||
|
|
||
|
videoFormatNV12 = 26, // new format for output by DXVA decoding
|
||
|
|
||
|
videoFormatVFlip = 0x80000000
|
||
|
}EVideoFormatType;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
videoFrameTypeInvalid, /* Encoder not ready or parameters are invalidate */
|
||
|
videoFrameTypeIDR, /* This type is only available for H264 if this frame is key frame, then return this type */
|
||
|
videoFrameTypeI, /* I frame type */
|
||
|
videoFrameTypeP, /* P frame type */
|
||
|
videoFrameTypeSkip, /* Skip the frame based encoder kernel */
|
||
|
videoFrameTypeIPMixed, /* Frame type introduced I and P slices are mixing */
|
||
|
}EVideoFrameType;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
cmResultSuccess,
|
||
|
cmInitParaError, /*Parameters are invalid */
|
||
|
cmMachPerfIsBad, /*The performance of machine is not enough to support
|
||
|
H264 CODEC, in this case, suggestion user use h263
|
||
|
or set fps to low like 5fps or more low*/
|
||
|
cmUnkonwReason,
|
||
|
cmMallocMemeError, /*Malloc a memory error*/
|
||
|
cmInitExpected, /*Initial action is expected*/
|
||
|
}CM_RETURN;
|
||
|
|
||
|
|
||
|
/* nal unit type */
|
||
|
enum ENalUnitType
|
||
|
{
|
||
|
NAL_UNKNOWN = 0,
|
||
|
NAL_SLICE = 1,
|
||
|
NAL_SLICE_DPA = 2,
|
||
|
NAL_SLICE_DPB = 3,
|
||
|
NAL_SLICE_DPC = 4,
|
||
|
NAL_SLICE_IDR = 5, /* ref_idc != 0 */
|
||
|
NAL_SEI = 6, /* ref_idc == 0 */
|
||
|
NAL_SPS = 7,
|
||
|
NAL_PPS = 8
|
||
|
/* ref_idc == 0 for 6,9,10,11,12 */
|
||
|
};
|
||
|
/* NRI: eNalRefIdc */
|
||
|
enum ENalPriority
|
||
|
{
|
||
|
NAL_PRIORITY_DISPOSABLE = 0,
|
||
|
NAL_PRIORITY_LOW = 1,
|
||
|
NAL_PRIORITY_HIGH = 2,
|
||
|
NAL_PRIORITY_HIGHEST = 3,
|
||
|
};
|
||
|
|
||
|
#define IS_PARAMETER_SET_NAL(eNalRefIdc, eNalType) \
|
||
|
( (eNalRefIdc == NAL_PRIORITY_HIGHEST) && (eNalType == (NAL_SPS|NAL_PPS) || eNalType == NAL_SPS) )
|
||
|
|
||
|
#define IS_IDR_NAL(eNalRefIdc, eNalType) \
|
||
|
( (eNalRefIdc == NAL_PRIORITY_HIGHEST) && (eNalType == NAL_SLICE_IDR) )
|
||
|
|
||
|
#define FRAME_NUM_PARAM_SET (-1)
|
||
|
#define FRAME_NUM_IDR 0
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
/* Error Tools definition */
|
||
|
typedef unsigned short ERR_TOOL;
|
||
|
enum{
|
||
|
ET_NONE = 0x00, // NONE Error Tools
|
||
|
ET_IP_SCALE = 0x01, // IP Scalable
|
||
|
ET_FMO = 0x02, // Flexible Macroblock Ordering
|
||
|
ET_IR_R1 = 0x04, // Intra Refresh in predifined 2% MB
|
||
|
ET_IR_R2 = 0x08, // Intra Refresh in predifined 5% MB
|
||
|
ET_IR_R3 = 0x10, // Intra Refresh in predifined 10% MB
|
||
|
ET_FEC_HALF = 0x20, // Forward Error Correction in 50% redundency mode
|
||
|
ET_FEC_FULL = 0x40, // Forward Error Correction in 100% redundency mode
|
||
|
ET_RFS = 0x80, // Reference Frame Selection
|
||
|
};
|
||
|
|
||
|
/* information of coded Slice(=NAL)(s) */
|
||
|
typedef struct SliceInformation
|
||
|
{
|
||
|
unsigned char* pBufferOfSlices; // base buffer of coded slice(s)
|
||
|
int iCodedSliceCount; // number of coded slices
|
||
|
unsigned int* pLengthOfSlices; // array of slices length accordingly by number of slice
|
||
|
int iFecType; // FEC type[0, 50%FEC, 100%FEC]
|
||
|
unsigned char uiSliceIdx; // index of slice in frame [FMO: 0,..,uiSliceCount-1; No FMO: 0]
|
||
|
unsigned char uiSliceCount; // count number of slice in frame [FMO: 2-8; No FMO: 1]
|
||
|
char iFrameIndex; // index of frame[-1, .., idr_interval-1]
|
||
|
unsigned char uiNalRefIdc; // NRI, priority level of slice(NAL)
|
||
|
unsigned char uiNalType; // NAL type
|
||
|
unsigned char uiContainingFinalNal; // whether final NAL is involved in buffer of coded slices, flag used in Pause feature in T27
|
||
|
} SliceInfo, *PSliceInfo;
|
||
|
|
||
|
|
||
|
|
||
|
#define CIF_WIDTH 352
|
||
|
#define CIF_HEIGHT 288
|
||
|
#define QVGA_WIDTH 320
|
||
|
#define QVGA_HEIGHT 240
|
||
|
#define QCIF_WIDTH 176
|
||
|
#define QCIF_HEIGHT 144
|
||
|
#define SQCIF_WIDTH 128
|
||
|
#define SQCIF_HEIGHT 96
|
||
|
|
||
|
/* thresholds of the initial, maximal and minimal rate */
|
||
|
typedef struct {
|
||
|
int iWidth; // frame width
|
||
|
int iHeight; // frame height
|
||
|
int iThresholdOfInitRate; // threshold of initial rate
|
||
|
int iThresholdOfMaxRate; // threshold of maximal rate
|
||
|
int iThresholdOfMinRate; // threshold of minimal rate
|
||
|
int iMinThresholdFrameRate; //min frame rate min
|
||
|
int iSkipFrameRate; //skip to frame rate min
|
||
|
int iSkipFrameStep; //how many frames to skip
|
||
|
}SRateThresholds, *PRateThresholds;
|
||
|
|
||
|
/*new interface*/
|
||
|
typedef struct WelsDeviceInfo
|
||
|
{
|
||
|
int bSupport; /* a logic flag provided by decoder which indicates whether GPU decoder can work based on the following device info. */
|
||
|
char Vendor[128]; // vendor name
|
||
|
char Device[128]; // device name
|
||
|
char Driver[128]; // driver version
|
||
|
char DriverDate[128]; // driver release date
|
||
|
} Device_Info;
|
||
|
|
||
|
typedef enum TagBufferProperty
|
||
|
{
|
||
|
BUFFER_HOST = 0, // host memory
|
||
|
BUFFER_DEVICE = 1, // device memory including surface and shared handle
|
||
|
// for DXVA: shared handle
|
||
|
// for VDA : iosurface
|
||
|
|
||
|
//SURFACE_DEVICE , // surface
|
||
|
//SHARED_HANDLE // shared handle
|
||
|
}EBufferProperty;
|
||
|
|
||
|
typedef enum TagDecodeMode
|
||
|
{
|
||
|
AUTO_MODE = 0, // decided by decoder itself, dynamic mode switch, delayed switch
|
||
|
SW_MODE = 1, // decoded by CPU, instant switch
|
||
|
GPU_MODE = 2, // decoded by GPU, instant switch
|
||
|
SWITCH_MODE =3 // switch to the other mode, forced mode switch, delayed switch
|
||
|
}EDecodeMode;
|
||
|
|
||
|
typedef struct TagSysMemBuffer
|
||
|
{
|
||
|
int iWidth; //width of decoded pic for display
|
||
|
int iHeight; //height of decoded pic for display
|
||
|
int iFormat; // type is "EVideoFormatType"
|
||
|
int iStride[2]; //stride of 2 component
|
||
|
}SSysMEMBuffer;
|
||
|
|
||
|
typedef struct TagVideoMemBuffer
|
||
|
{
|
||
|
int iSurfaceWidth; // used for surface create
|
||
|
int iSurfaceHeight;
|
||
|
int D3Dformat; //type is "D3DFORMAT"
|
||
|
int D3DPool; // type is "D3DPOOL";
|
||
|
int iLeftTopX;
|
||
|
int iLeftTopY;
|
||
|
int iRightBottomX;
|
||
|
int iRightBottomY;
|
||
|
}SVideoMemBuffer;
|
||
|
|
||
|
typedef struct TagBufferInfo
|
||
|
{
|
||
|
EBufferProperty eBufferProperty; //0: host memory; 1: device memory;
|
||
|
int iBufferStatus; // 0: one frame data is not ready; 1: one frame data is ready
|
||
|
EDecodeMode eWorkMode; //indicate what the real working mode in decoder
|
||
|
union {
|
||
|
SSysMEMBuffer sSystemBuffer;
|
||
|
SVideoMemBuffer sVideoBuffer;
|
||
|
}UsrData;
|
||
|
}SBufferInfo;
|
||
|
|
||
|
/* Constants related to transmission rate at various resolutions */
|
||
|
static const SRateThresholds ksRateThrMap[4] = {
|
||
|
// initial-maximal-minimal
|
||
|
{CIF_WIDTH, CIF_HEIGHT, 225000, 384000, 96000, 3, 1, 1}, // CIF
|
||
|
{QVGA_WIDTH, QVGA_HEIGHT, 192000, 320000, 80000, -1, -1, -1}, // QVGA
|
||
|
{QCIF_WIDTH, QCIF_HEIGHT, 150000, 256000, 64000, 8, 4, 2}, // QCIF
|
||
|
{SQCIF_WIDTH, SQCIF_HEIGHT, 120000, 192000, 48000, 5, 3, 1} // SQCIF
|
||
|
};
|
||
|
|
||
|
|
||
|
// In a GOP, multiple of the key frame number, derived from
|
||
|
// the number of layers(index or array below)
|
||
|
static const char kiKeyNumMultiple[] = {
|
||
|
1, 1, 2, 4, 8, 16,
|
||
|
};
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
#endif//WELS_VIDEO_CODEC_DEFINITION_H__
|