/*
* Copyright (c) 2009-2011 Intel Corporation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __VIDEO_ENCODER_DEF_H__
#define __VIDEO_ENCODER_DEF_H__
#include <stdint.h>
#define STRING_TO_FOURCC(format) ((uint32_t)(((format)[0])|((format)[1]<<8)|((format)[2]<<16)|((format)[3]<<24)))
typedef int32_t Encode_Status;
// Video encode error code
enum {
ENCODE_INVALID_SURFACE = -11,
ENCODE_NO_REQUEST_DATA = -10,
ENCODE_WRONG_STATE = -9,
ENCODE_NOTIMPL = -8,
ENCODE_NO_MEMORY = -7,
ENCODE_NOT_INIT = -6,
ENCODE_DRIVER_FAIL = -5,
ENCODE_INVALID_PARAMS = -4,
ENCODE_NOT_SUPPORTED = -3,
ENCODE_NULL_PTR = -2,
ENCODE_FAIL = -1,
ENCODE_SUCCESS = 0,
ENCODE_ALREADY_INIT = 1,
ENCODE_SLICESIZE_OVERFLOW = 2,
ENCODE_BUFFER_TOO_SMALL = 3, // The buffer passed to encode is too small to contain encoded data
ENCODE_DEVICE_BUSY = 4,
ENCODE_DATA_NOT_READY = 5,
};
typedef enum {
OUTPUT_EVERYTHING = 0, //Output whatever driver generates
OUTPUT_CODEC_DATA = 1,
OUTPUT_FRAME_DATA = 2, //Equal to OUTPUT_EVERYTHING when no header along with the frame data
OUTPUT_ONE_NAL = 4,
OUTPUT_ONE_NAL_WITHOUT_STARTCODE = 8,
OUTPUT_LENGTH_PREFIXED = 16,
OUTPUT_CODEDBUFFER = 32,
OUTPUT_NALULENGTHS_PREFIXED = 64,
OUTPUT_BUFFER_LAST
} VideoOutputFormat;
typedef enum {
RAW_FORMAT_NONE = 0,
RAW_FORMAT_YUV420 = 1,
RAW_FORMAT_YUV422 = 2,
RAW_FORMAT_YUV444 = 4,
RAW_FORMAT_NV12 = 8,
RAW_FORMAT_RGBA = 16,
RAW_FORMAT_OPAQUE = 32,
RAW_FORMAT_PROTECTED = 0x80000000,
RAW_FORMAT_LAST
} VideoRawFormat;
typedef enum {
RATE_CONTROL_NONE = 1,
RATE_CONTROL_CBR = 2,
RATE_CONTROL_VBR = 4,
RATE_CONTROL_VCM = 8,
RATE_CONTROL_LAST
} VideoRateControl;
typedef enum {
PROFILE_MPEG2SIMPLE = 0,
PROFILE_MPEG2MAIN,
PROFILE_MPEG4SIMPLE,
PROFILE_MPEG4ADVANCEDSIMPLE,
PROFILE_MPEG4MAIN,
PROFILE_H264BASELINE,
PROFILE_H264MAIN,
PROFILE_H264HIGH,
PROFILE_VC1SIMPLE,
PROFILE_VC1MAIN,
PROFILE_VC1ADVANCED,
PROFILE_H263BASELINE
} VideoProfile;
typedef enum {
AVC_DELIMITER_LENGTHPREFIX = 0,
AVC_DELIMITER_ANNEXB
} AVCDelimiterType;
typedef enum {
VIDEO_ENC_NONIR, // Non intra refresh
VIDEO_ENC_CIR, // Cyclic intra refresh
VIDEO_ENC_AIR, // Adaptive intra refresh
VIDEO_ENC_BOTH,
VIDEO_ENC_LAST
} VideoIntraRefreshType;
enum VideoBufferSharingMode {
BUFFER_SHARING_NONE = 1, //Means non shared buffer mode
BUFFER_SHARING_CI = 2,
BUFFER_SHARING_V4L2 = 4,
BUFFER_SHARING_SURFACE = 8,
BUFFER_SHARING_USRPTR = 16,
BUFFER_SHARING_GFXHANDLE = 32,
BUFFER_SHARING_KBUFHANDLE = 64,
BUFFER_LAST
};
typedef enum {
FTYPE_UNKNOWN = 0, // Unknown
FTYPE_I = 1, // General I-frame type
FTYPE_P = 2, // General P-frame type
FTYPE_B = 3, // General B-frame type
FTYPE_SI = 4, // H.263 SI-frame type
FTYPE_SP = 5, // H.263 SP-frame type
FTYPE_EI = 6, // H.264 EI-frame type
FTYPE_EP = 7, // H.264 EP-frame type
FTYPE_S = 8, // MPEG-4 S-frame type
FTYPE_IDR = 9, // IDR-frame type
}FrameType;
//function call mode
#define FUNC_BLOCK 0xFFFFFFFF
#define FUNC_NONBLOCK 0
// Output buffer flag
#define ENCODE_BUFFERFLAG_ENDOFFRAME 0x00000001
#define ENCODE_BUFFERFLAG_PARTIALFRAME 0x00000002
#define ENCODE_BUFFERFLAG_SYNCFRAME 0x00000004
#define ENCODE_BUFFERFLAG_CODECCONFIG 0x00000008
#define ENCODE_BUFFERFLAG_DATACORRUPT 0x00000010
#define ENCODE_BUFFERFLAG_DATAINVALID 0x00000020
#define ENCODE_BUFFERFLAG_SLICEOVERFOLOW 0x00000040
#define ENCODE_BUFFERFLAG_ENDOFSTREAM 0x00000080
#define ENCODE_BUFFERFLAG_NSTOPFRAME 0x00000100
typedef struct {
uint8_t *data;
uint32_t bufferSize; //buffer size
uint32_t dataSize; //actual size
uint32_t offset; //buffer offset
uint32_t remainingSize;
int flag; //Key frame, Codec Data etc
VideoOutputFormat format; //output format
int64_t timeStamp; //reserved
FrameType type;
void *priv; //indicate corresponding input data
} VideoEncOutputBuffer;
typedef struct {
uint8_t *data;
uint32_t size;
bool bufAvailable; //To indicate whether this buffer can be reused
int64_t timeStamp; //reserved
FrameType type; //frame type expected to be encoded
int flag; // flag to indicate buffer property
void *priv; //indicate corresponding input data
} VideoEncRawBuffer;
struct VideoEncSurfaceBuffer {
VASurfaceID surface;
uint8_t *usrptr;
uint32_t index;
bool bufAvailable;
VideoEncSurfaceBuffer *next;
};
struct CirParams {
uint32_t cir_num_mbs;
CirParams &operator=(const CirParams &other) {
if (this == &other) return *this;
this->cir_num_mbs = other.cir_num_mbs;
return *this;
}
};
struct AirParams {
uint32_t airMBs;
uint32_t airThreshold;
uint32_t airAuto;
AirParams &operator=(const AirParams &other) {
if (this == &other) return *this;
this->airMBs= other.airMBs;
this->airThreshold= other.airThreshold;
this->airAuto = other.airAuto;
return *this;
}
};
struct VideoFrameRate {
uint32_t frameRateNum;
uint32_t frameRateDenom;
VideoFrameRate &operator=(const VideoFrameRate &other) {
if (this == &other) return *this;
this->frameRateNum = other.frameRateNum;
this->frameRateDenom = other.frameRateDenom;
return *this;
}
};
struct VideoResolution {
uint32_t width;
uint32_t height;
VideoResolution &operator=(const VideoResolution &other) {
if (this == &other) return *this;
this->width = other.width;
this->height = other.height;
return *this;
}
};
struct VideoRateControlParams {
uint32_t bitRate;
uint32_t initQP;
uint32_t minQP;
uint32_t maxQP;
uint32_t I_minQP;
uint32_t I_maxQP;
uint32_t windowSize;
uint32_t targetPercentage;
uint32_t disableFrameSkip;
uint32_t disableBitsStuffing;
uint32_t enableIntraFrameQPControl;
uint32_t temporalFrameRate;
uint32_t temporalID;
VideoRateControlParams &operator=(const VideoRateControlParams &other) {
if (this == &other) return *this;
this->bitRate = other.bitRate;
this->initQP = other.initQP;
this->minQP = other.minQP;
this->maxQP = other.maxQP;
this->I_minQP = other.I_minQP;
this->I_maxQP = other.I_maxQP;
this->windowSize = other.windowSize;
this->targetPercentage = other.targetPercentage;
this->disableFrameSkip = other.disableFrameSkip;
this->disableBitsStuffing = other.disableBitsStuffing;
this->enableIntraFrameQPControl = other.enableIntraFrameQPControl;
this->temporalFrameRate = other.temporalFrameRate;
this->temporalID = other.temporalID;
return *this;
}
};
struct SliceNum {
uint32_t iSliceNum;
uint32_t pSliceNum;
SliceNum &operator=(const SliceNum &other) {
if (this == &other) return *this;
this->iSliceNum = other.iSliceNum;
this->pSliceNum= other.pSliceNum;
return *this;
}
};
typedef struct {
uint32_t realWidth;
uint32_t realHeight;
uint32_t lumaStride;
uint32_t chromStride;
uint32_t format;
} ExternalBufferAttrib;
struct Cropping {
uint32_t LeftOffset;
uint32_t RightOffset;
uint32_t TopOffset;
uint32_t BottomOffset;
Cropping &operator=(const Cropping &other) {
if (this == &other) return *this;
this->LeftOffset = other.LeftOffset;
this->RightOffset = other.RightOffset;
this->TopOffset = other.TopOffset;
this->BottomOffset = other.BottomOffset;
return *this;
}
};
struct SamplingAspectRatio {
uint16_t SarWidth;
uint16_t SarHeight;
SamplingAspectRatio &operator=(const SamplingAspectRatio &other) {
if (this == &other) return *this;
this->SarWidth = other.SarWidth;
this->SarHeight = other.SarHeight;
return *this;
}
};
enum VideoParamConfigType {
VideoParamsTypeStartUnused = 0x01000000,
VideoParamsTypeCommon,
VideoParamsTypeAVC,
VideoParamsTypeH263,
VideoParamsTypeMP4,
VideoParamsTypeVC1,
VideoParamsTypeUpSteamBuffer,
VideoParamsTypeUsrptrBuffer,
VideoParamsTypeHRD,
VideoParamsTypeStoreMetaDataInBuffers,
VideoParamsTypeProfileLevel,
VideoParamsTypeVP8,
VideoParamsTypeTemporalLayer,
VideoConfigTypeFrameRate,
VideoConfigTypeBitRate,
VideoConfigTypeResolution,
VideoConfigTypeIntraRefreshType,
VideoConfigTypeAIR,
VideoConfigTypeCyclicFrameInterval,
VideoConfigTypeAVCIntraPeriod,
VideoConfigTypeNALSize,
VideoConfigTypeIDRRequest,
VideoConfigTypeSliceNum,
VideoConfigTypeVP8,
VideoConfigTypeVP8ReferenceFrame,
VideoConfigTypeCIR,
VideoConfigTypeVP8MaxFrameSizeRatio,
VideoConfigTypeTemperalLayerBitrateFramerate,
VideoParamsConfigExtension
};
struct VideoParamConfigSet {
VideoParamConfigType type;
uint32_t size;
VideoParamConfigSet &operator=(const VideoParamConfigSet &other) {
if (this == &other) return *this;
this->type = other.type;
this->size = other.size;
return *this;
}
};
struct VideoParamsCommon : VideoParamConfigSet {
VAProfile profile;
uint8_t level;
VideoRawFormat rawFormat;
VideoResolution resolution;
VideoFrameRate frameRate;
int32_t intraPeriod;
VideoRateControl rcMode;
VideoRateControlParams rcParams;
VideoIntraRefreshType refreshType;
int32_t cyclicFrameInterval;
AirParams airParams;
CirParams cirParams;
uint32_t disableDeblocking;
bool syncEncMode;
//CodedBuffer properties
uint32_t codedBufNum;
uint32_t numberOfLayer;
uint32_t nPeriodicity;
uint32_t nLayerID[32];
VideoParamsCommon() {
type = VideoParamsTypeCommon;
size = sizeof(VideoParamsCommon);
}
VideoParamsCommon &operator=(const VideoParamsCommon &other) {
if (this == &other) return *this;
VideoParamConfigSet::operator=(other);
this->profile = other.profile;
this->level = other.level;
this->rawFormat = other.rawFormat;
this->resolution = other.resolution;
this->frameRate = other.frameRate;
this->intraPeriod = other.intraPeriod;
this->rcMode = other.rcMode;
this->rcParams = other.rcParams;
this->refreshType = other.refreshType;
this->cyclicFrameInterval = other.cyclicFrameInterval;
this->airParams = other.airParams;
this->disableDeblocking = other.disableDeblocking;
this->syncEncMode = other.syncEncMode;
this->codedBufNum = other.codedBufNum;
this->numberOfLayer = other.numberOfLayer;
return *this;
}
};
struct VideoParamsAVC : VideoParamConfigSet {
uint32_t basicUnitSize; //for rate control
uint8_t VUIFlag;
int32_t maxSliceSize;
uint32_t idrInterval;
uint32_t ipPeriod;
uint32_t refFrames;
SliceNum sliceNum;
AVCDelimiterType delimiterType;
Cropping crop;
SamplingAspectRatio SAR;
uint32_t refIdx10ActiveMinus1;
uint32_t refIdx11ActiveMinus1;
bool bFrameMBsOnly;
bool bMBAFF;
bool bEntropyCodingCABAC;
bool bWeightedPPrediction;
uint32_t weightedBipredicitonMode;
bool bConstIpred ;
bool bDirect8x8Inference;
bool bDirectSpatialTemporal;
uint32_t cabacInitIdc;
VideoParamsAVC() {
type = VideoParamsTypeAVC;
size = sizeof(VideoParamsAVC);
}
VideoParamsAVC &operator=(const VideoParamsAVC &other) {
if (this == &other) return *this;
VideoParamConfigSet::operator=(other);
this->basicUnitSize = other.basicUnitSize;
this->VUIFlag = other.VUIFlag;
this->maxSliceSize = other.maxSliceSize;
this->idrInterval = other.idrInterval;
this->ipPeriod = other.ipPeriod;
this->refFrames = other.refFrames;
this->sliceNum = other.sliceNum;
this->delimiterType = other.delimiterType;
this->crop.LeftOffset = other.crop.LeftOffset;
this->crop.RightOffset = other.crop.RightOffset;
this->crop.TopOffset = other.crop.TopOffset;
this->crop.BottomOffset = other.crop.BottomOffset;
this->SAR.SarWidth = other.SAR.SarWidth;
this->SAR.SarHeight = other.SAR.SarHeight;
this->refIdx10ActiveMinus1 = other.refIdx10ActiveMinus1;
this->refIdx11ActiveMinus1 = other.refIdx11ActiveMinus1;
this->bFrameMBsOnly = other.bFrameMBsOnly;
this->bMBAFF = other.bMBAFF;
this->bEntropyCodingCABAC = other.bEntropyCodingCABAC;
this->bWeightedPPrediction = other.bWeightedPPrediction;
this->weightedBipredicitonMode = other.weightedBipredicitonMode;
this->bConstIpred = other.bConstIpred;
this->bDirect8x8Inference = other.bDirect8x8Inference;
this->bDirectSpatialTemporal = other.bDirectSpatialTemporal;
this->cabacInitIdc = other.cabacInitIdc;
return *this;
}
};
struct VideoParamsUpstreamBuffer : VideoParamConfigSet {
VideoParamsUpstreamBuffer() {
type = VideoParamsTypeUpSteamBuffer;
size = sizeof(VideoParamsUpstreamBuffer);
}
VideoBufferSharingMode bufferMode;
intptr_t *bufList;
uint32_t bufCnt;
ExternalBufferAttrib *bufAttrib;
void *display;
};
struct VideoParamsUsrptrBuffer : VideoParamConfigSet {
VideoParamsUsrptrBuffer() {
type = VideoParamsTypeUsrptrBuffer;
size = sizeof(VideoParamsUsrptrBuffer);
}
//input
uint32_t width;
uint32_t height;
uint32_t format;
uint32_t expectedSize;
//output
uint32_t actualSize;
uint32_t stride;
uint8_t *usrPtr;
};
struct VideoParamsHRD : VideoParamConfigSet {
VideoParamsHRD() {
type = VideoParamsTypeHRD;
size = sizeof(VideoParamsHRD);
}
uint32_t bufferSize;
uint32_t initBufferFullness;
};
struct VideoParamsStoreMetaDataInBuffers : VideoParamConfigSet {
VideoParamsStoreMetaDataInBuffers() {
type = VideoParamsTypeStoreMetaDataInBuffers;
size = sizeof(VideoParamsStoreMetaDataInBuffers);
}
bool isEnabled;
};
struct VideoParamsProfileLevel : VideoParamConfigSet {
VideoParamsProfileLevel() {
type = VideoParamsTypeProfileLevel;
size = sizeof(VideoParamsProfileLevel);
}
VAProfile profile;
uint32_t level;
bool isSupported;
};
struct VideoParamsTemporalLayer : VideoParamConfigSet {
VideoParamsTemporalLayer() {
type = VideoParamsTypeTemporalLayer;
size = sizeof(VideoParamsTemporalLayer);
}
uint32_t numberOfLayer;
uint32_t nPeriodicity;
uint32_t nLayerID[32];
};
struct VideoConfigFrameRate : VideoParamConfigSet {
VideoConfigFrameRate() {
type = VideoConfigTypeFrameRate;
size = sizeof(VideoConfigFrameRate);
}
VideoFrameRate frameRate;
};
struct VideoConfigBitRate : VideoParamConfigSet {
VideoConfigBitRate() {
type = VideoConfigTypeBitRate;
size = sizeof(VideoConfigBitRate);
}
VideoRateControlParams rcParams;
};
struct VideoConfigAVCIntraPeriod : VideoParamConfigSet {
VideoConfigAVCIntraPeriod() {
type = VideoConfigTypeAVCIntraPeriod;
size = sizeof(VideoConfigAVCIntraPeriod);
}
uint32_t idrInterval; //How many Intra frame will have a IDR frame
uint32_t intraPeriod;
uint32_t ipPeriod;
};
struct VideoConfigNALSize : VideoParamConfigSet {
VideoConfigNALSize() {
type = VideoConfigTypeNALSize;
size = sizeof(VideoConfigNALSize);
}
uint32_t maxSliceSize;
};
struct VideoConfigResolution : VideoParamConfigSet {
VideoConfigResolution() {
type = VideoConfigTypeResolution;
size = sizeof(VideoConfigResolution);
}
VideoResolution resolution;
};
struct VideoConfigIntraRefreshType : VideoParamConfigSet {
VideoConfigIntraRefreshType() {
type = VideoConfigTypeIntraRefreshType;
size = sizeof(VideoConfigIntraRefreshType);
}
VideoIntraRefreshType refreshType;
};
struct VideoConfigCyclicFrameInterval : VideoParamConfigSet {
VideoConfigCyclicFrameInterval() {
type = VideoConfigTypeCyclicFrameInterval;
size = sizeof(VideoConfigCyclicFrameInterval);
}
int32_t cyclicFrameInterval;
};
struct VideoConfigCIR : VideoParamConfigSet {
VideoConfigCIR() {
type = VideoConfigTypeCIR;
size = sizeof(VideoConfigCIR);
}
CirParams cirParams;
};
struct VideoConfigAIR : VideoParamConfigSet {
VideoConfigAIR() {
type = VideoConfigTypeAIR;
size = sizeof(VideoConfigAIR);
}
AirParams airParams;
};
struct VideoConfigSliceNum : VideoParamConfigSet {
VideoConfigSliceNum() {
type = VideoConfigTypeSliceNum;
size = sizeof(VideoConfigSliceNum);
}
SliceNum sliceNum;
};
struct VideoParamsVP8 : VideoParamConfigSet {
uint32_t profile;
uint32_t error_resilient;
uint32_t num_token_partitions;
uint32_t kf_auto;
uint32_t kf_min_dist;
uint32_t kf_max_dist;
uint32_t min_qp;
uint32_t max_qp;
uint32_t init_qp;
uint32_t rc_undershoot;
uint32_t rc_overshoot;
uint32_t hrd_buf_size;
uint32_t hrd_buf_initial_fullness;
uint32_t hrd_buf_optimal_fullness;
uint32_t max_frame_size_ratio;
VideoParamsVP8() {
type = VideoParamsTypeVP8;
size = sizeof(VideoParamsVP8);
}
};
struct VideoConfigVP8 : VideoParamConfigSet {
uint32_t force_kf;
uint32_t refresh_entropy_probs;
uint32_t value;
unsigned char sharpness_level;
VideoConfigVP8 () {
type = VideoConfigTypeVP8;
size = sizeof(VideoConfigVP8);
}
};
struct VideoConfigVP8ReferenceFrame : VideoParamConfigSet {
uint32_t no_ref_last;
uint32_t no_ref_gf;
uint32_t no_ref_arf;
uint32_t refresh_last;
uint32_t refresh_golden_frame;
uint32_t refresh_alternate_frame;
VideoConfigVP8ReferenceFrame () {
type = VideoConfigTypeVP8ReferenceFrame;
size = sizeof(VideoConfigVP8ReferenceFrame);
}
};
struct VideoConfigVP8MaxFrameSizeRatio : VideoParamConfigSet {
VideoConfigVP8MaxFrameSizeRatio() {
type = VideoConfigTypeVP8MaxFrameSizeRatio;
size = sizeof(VideoConfigVP8MaxFrameSizeRatio);
}
uint32_t max_frame_size_ratio;
};
struct VideoConfigTemperalLayerBitrateFramerate : VideoParamConfigSet {
VideoConfigTemperalLayerBitrateFramerate() {
type = VideoConfigTypeTemperalLayerBitrateFramerate;
size = sizeof(VideoConfigTemperalLayerBitrateFramerate);
}
uint32_t nLayerID;
uint32_t bitRate;
uint32_t frameRate;
};
#endif /* __VIDEO_ENCODER_DEF_H__ */