Compare commits
50 Commits
main
...
openh264v1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bdb7d758c1 | ||
![]() |
176495defe | ||
![]() |
890674bde4 | ||
![]() |
414a1ff975 | ||
![]() |
a1ec7f0a35 | ||
![]() |
6475c9b7f9 | ||
![]() |
fe05db7bca | ||
![]() |
a64ddb407c | ||
![]() |
a2b445f0b0 | ||
![]() |
2db1123bec | ||
![]() |
41b71434f7 | ||
![]() |
c034dcf958 | ||
![]() |
77cb7c518c | ||
![]() |
c0cc575e74 | ||
![]() |
ca68f47db2 | ||
![]() |
cae151981b | ||
![]() |
650dc637b6 | ||
![]() |
679449f97d | ||
![]() |
11085e072a | ||
![]() |
af6105743a | ||
![]() |
3abf06705b | ||
![]() |
dd088d9979 | ||
![]() |
5eb0f0b92b | ||
![]() |
bf7ff18bae | ||
![]() |
d98d9194fd | ||
![]() |
45d79d6d13 | ||
![]() |
a103ffc2e3 | ||
![]() |
576b27238c | ||
![]() |
680bc349f1 | ||
![]() |
1d82df67f6 | ||
![]() |
996be050b9 | ||
![]() |
62c12b2985 | ||
![]() |
10cbbbb2b2 | ||
![]() |
8ca7b2e557 | ||
![]() |
335857fe9a | ||
![]() |
d0e8ae0cf5 | ||
![]() |
6e34f5a7c9 | ||
![]() |
83f89406ca | ||
![]() |
0a9a05ee4e | ||
![]() |
294bfd5495 | ||
![]() |
09cf107367 | ||
![]() |
e5d8957ad2 | ||
![]() |
2dad4b7eb9 | ||
![]() |
00696ae9d9 | ||
![]() |
4f28cf772a | ||
![]() |
cf81b0095c | ||
![]() |
c6538f1eb8 | ||
![]() |
8b6c6943cd | ||
![]() |
958207392c | ||
![]() |
eb6fdf4412 |
BIN
OpenH264_API_v1.0.docx
Normal file
BIN
OpenH264_API_v1.0.docx
Normal file
Binary file not shown.
@ -5,7 +5,7 @@ OpenH264 is a codec library which supports H.264 encoding and decoding. It is su
|
||||
Encoder Features
|
||||
----------------
|
||||
- Constrained Baseline Profile up to Level 5.2 (4096x2304)
|
||||
- Arbitrary resolution, not constrained to multiples of 16x16
|
||||
- Arbitrary resolution, support cropping
|
||||
- Rate control with adaptive quantization, or constant quantization
|
||||
- Slice options: 1 slice per frame, N slices per frame, N macroblocks per slice, or N bytes per slice
|
||||
- Multiple threads automatically used for multiple slices
|
||||
@ -32,6 +32,8 @@ Decoder Features
|
||||
- Multiple reference frames when specified in Sequence Parameter Set (SPS)
|
||||
- Annex B byte stream input
|
||||
- YUV 4:2:0 planar output
|
||||
- Decoder output timing conformance
|
||||
- Error concealment support with slice copy as default method
|
||||
|
||||
OS Support
|
||||
----------
|
||||
@ -39,7 +41,7 @@ OS Support
|
||||
- Mac OS X 64-bit and 32-bit
|
||||
- Linux 64-bit and 32-bit
|
||||
- Android 32-bit
|
||||
- iOS 64-bit and 32-bit
|
||||
- iOS 64-bit and 32-bit (not fully tested)
|
||||
|
||||
Processor Support
|
||||
-----------------
|
||||
@ -136,6 +138,9 @@ Known Issues
|
||||
See the issue tracker on https://github.com/cisco/openh264/issues
|
||||
- Encoder errors when resolution exceeds 3840x2160
|
||||
- Encoder errors when compressed frame size exceeds half uncompressed size
|
||||
- Encoder does not support QP < 10 encoding
|
||||
- Encoder does not support slice number > 35 encoding
|
||||
- The result of float-point calculation in rate control will be affected by preciseness of double-typed variable on different platform
|
||||
- Decoder errors when compressed frame size exceeds 1MB
|
||||
- Encoder RC requires frame skipping to be enabled to hit the target bitrate,
|
||||
if frame skipping is disabled the target bitrate may be exceeded
|
||||
|
@ -109,7 +109,7 @@ class ISVCDecoder {
|
||||
*/
|
||||
virtual DECODING_STATE EXTAPI DecodeFrame2 (const unsigned char* pSrc,
|
||||
const int iSrcLen,
|
||||
void** ppDst,
|
||||
unsigned char** ppDst,
|
||||
SBufferInfo* pDstInfo) = 0;
|
||||
|
||||
/*
|
||||
@ -174,7 +174,7 @@ DECODING_STATE (*DecodeFrame) (ISVCDecoder*, const unsigned char* pSrc,
|
||||
|
||||
DECODING_STATE (*DecodeFrame2) (ISVCDecoder*, const unsigned char* pSrc,
|
||||
const int iSrcLen,
|
||||
void** ppDst,
|
||||
unsigned char** ppDst,
|
||||
SBufferInfo* pDstInfo);
|
||||
|
||||
DECODING_STATE (*DecodeFrameEx) (ISVCDecoder*, const unsigned char* pSrc,
|
||||
|
@ -87,9 +87,9 @@ typedef enum {
|
||||
ENCOCER_LTR_MARKING_PERIOD,
|
||||
ENCODER_OPTION_LTR,
|
||||
|
||||
ENCODER_OPTION_ENABLE_SSEI, //disable SSEI: true--disable ssei; false--enable ssei
|
||||
ENCODER_OPTION_ENABLE_SSEI, //enable SSEI: true--enable ssei; false--disable ssei
|
||||
ENCODER_OPTION_ENABLE_PREFIX_NAL_ADDING, //enable prefix: true--enable prefix; false--disable prefix
|
||||
ENCODER_OPTION_ENABLE_SPS_PPS_ID_ADDITION, //disable pSps/pPps id addition: true--disable pSps/pPps id; false--enable pSps/pPps id addistion
|
||||
ENCODER_OPTION_ENABLE_SPS_PPS_ID_ADDITION, //enable pSps/pPps id addition: true--enable pSps/pPps id; false--disable pSps/pPps id addistion
|
||||
|
||||
ENCODER_OPTION_CURRENT_PATH,
|
||||
ENCODER_OPTION_DUMP_FILE,
|
||||
|
@ -7,6 +7,7 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
9ABF4379192DE20800A6BD61 /* EncUT_MemoryAlloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9ABF4378192DE20800A6BD61 /* EncUT_MemoryAlloc.cpp */; };
|
||||
FAA3D9D318BD729500BCD52D /* welsenc_ios.cfg in Resources */ = {isa = PBXBuildFile; fileRef = FAA3D9D218BD729500BCD52D /* welsenc_ios.cfg */; };
|
||||
FAA3D9D818BD777100BCD52D /* CiscoVT2people_320x192_12fps.yuv in Resources */ = {isa = PBXBuildFile; fileRef = FAA3D9D718BD777100BCD52D /* CiscoVT2people_320x192_12fps.yuv */; };
|
||||
FAA3D9DD18BD8A5600BCD52D /* layer2.cfg in Resources */ = {isa = PBXBuildFile; fileRef = FAA3D9DC18BD8A5600BCD52D /* layer2.cfg */; };
|
||||
@ -94,6 +95,7 @@
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
9ABF4378192DE20800A6BD61 /* EncUT_MemoryAlloc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EncUT_MemoryAlloc.cpp; path = ../../../../../test/encoder/EncUT_MemoryAlloc.cpp; sourceTree = "<group>"; };
|
||||
FAA3D9D218BD729500BCD52D /* welsenc_ios.cfg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = welsenc_ios.cfg; path = ../../../../../../testbin/welsenc_ios.cfg; sourceTree = "<group>"; };
|
||||
FAA3D9D718BD777100BCD52D /* CiscoVT2people_320x192_12fps.yuv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CiscoVT2people_320x192_12fps.yuv; path = ../../../../../../res/CiscoVT2people_320x192_12fps.yuv; sourceTree = "<group>"; };
|
||||
FAA3D9DC18BD8A5600BCD52D /* layer2.cfg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = layer2.cfg; path = ../../../../../../testbin/layer2.cfg; sourceTree = "<group>"; };
|
||||
@ -141,6 +143,7 @@
|
||||
FAFB4F9C18BC8DD700315438 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9ABF4378192DE20800A6BD61 /* EncUT_MemoryAlloc.cpp */,
|
||||
FAFB4FAE18BC8DD700315438 /* encDemo */,
|
||||
FAFB4FA718BC8DD700315438 /* Frameworks */,
|
||||
FAFB4FA618BC8DD700315438 /* Products */,
|
||||
@ -388,6 +391,7 @@
|
||||
FAFB502F18BCA50900315438 /* read_config.cpp in Sources */,
|
||||
FAFB500B18BC8F6C00315438 /* welsenc.cpp in Sources */,
|
||||
FAFB4FB918BC8DD700315438 /* AppDelegate.m in Sources */,
|
||||
9ABF4379192DE20800A6BD61 /* EncUT_MemoryAlloc.cpp in Sources */,
|
||||
FAFB4FB518BC8DD700315438 /* main.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
@ -122,7 +122,7 @@ __declspec(align(alignment)) type name[(sizex)*(sizey)]
|
||||
#endif//WELS_FLOOR
|
||||
|
||||
#ifndef WELS_ROUND
|
||||
#define WELS_ROUND(x) ((int32_t)(0.5f+(x)))
|
||||
#define WELS_ROUND(x) ((int32_t)(0.5+(x)))
|
||||
#endif//WELS_ROUND
|
||||
|
||||
#define WELS_NON_ZERO_COUNT_AVERAGE(nC,nA,nB) { \
|
||||
|
@ -76,7 +76,7 @@ void H264DecodeInstance (ISVCDecoder* pDecoder, const char* kpH264FileName, cons
|
||||
uint8_t* pBuf = NULL;
|
||||
uint8_t uiStartCode[4] = {0, 0, 0, 1};
|
||||
|
||||
void* pData[3] = {NULL};
|
||||
uint8_t* pData[3] = {NULL};
|
||||
uint8_t* pDst[3] = {NULL};
|
||||
SBufferInfo sDstBufInfo;
|
||||
|
||||
@ -212,9 +212,9 @@ void H264DecodeInstance (ISVCDecoder* pDecoder, const char* kpH264FileName, cons
|
||||
pDecoder->DecodeFrame2 (pBuf + iBufPos, iSliceSize, pData, &sDstBufInfo);
|
||||
|
||||
if (sDstBufInfo.iBufferStatus == 1) {
|
||||
pDst[0] = (uint8_t*)pData[0];
|
||||
pDst[1] = (uint8_t*)pData[1];
|
||||
pDst[2] = (uint8_t*)pData[2];
|
||||
pDst[0] = pData[0];
|
||||
pDst[1] = pData[1];
|
||||
pDst[2] = pData[2];
|
||||
}
|
||||
iEnd = WelsTime();
|
||||
iTotal += iEnd - iStart;
|
||||
@ -247,9 +247,9 @@ void H264DecodeInstance (ISVCDecoder* pDecoder, const char* kpH264FileName, cons
|
||||
|
||||
pDecoder->DecodeFrame2 (NULL, 0, pData, &sDstBufInfo);
|
||||
if (sDstBufInfo.iBufferStatus == 1) {
|
||||
pDst[0] = (uint8_t*)pData[0];
|
||||
pDst[1] = (uint8_t*)pData[1];
|
||||
pDst[2] = (uint8_t*)pData[2];
|
||||
pDst[0] = pData[0];
|
||||
pDst[1] = pData[1];
|
||||
pDst[2] = pData[2];
|
||||
}
|
||||
|
||||
if (sDstBufInfo.iBufferStatus == 1) {
|
||||
|
@ -212,6 +212,8 @@ int ParseConfig (CReadConfig& cRdCfg, SSourcePicture* pSrcPic, SEncParamExt& pSv
|
||||
pSvcParam.iTemporalLayerNum = atoi (strTag[1].c_str());
|
||||
} else if (strTag[0].compare ("IntraPeriod") == 0) {
|
||||
pSvcParam.uiIntraPeriod = atoi (strTag[1].c_str());
|
||||
} else if (strTag[0].compare ("MaxNalSize") == 0) {
|
||||
pSvcParam.uiMaxNalSize = atoi (strTag[1].c_str());
|
||||
} else if (strTag[0].compare ("EnableSpsPpsIDAddition") == 0) {
|
||||
pSvcParam.bEnableSpsPpsIdAddition = atoi (strTag[1].c_str()) ? true : false;
|
||||
} else if (strTag[0].compare ("EnableScalableSEI") == 0) {
|
||||
@ -310,70 +312,6 @@ int ParseConfig (CReadConfig& cRdCfg, SSourcePicture* pSrcPic, SEncParamExt& pSv
|
||||
return iRet;
|
||||
}
|
||||
|
||||
int ParseCommandLine (int argc, char** argv, SEncParamExt& sParam) {
|
||||
char* pCmd;
|
||||
int i = 0;
|
||||
|
||||
while (i < argc) {
|
||||
pCmd = argv[i++];
|
||||
|
||||
if (!strcmp (pCmd, "-numl") && (i < argc))
|
||||
sParam.iSpatialLayerNum = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-numt") && (i < argc))
|
||||
sParam.iTemporalLayerNum = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-iper") && (i < argc))
|
||||
sParam.uiIntraPeriod = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-spsid") && (i < argc))
|
||||
sParam.bEnableSpsPpsIdAddition = atoi (argv[i++]) ? true : false;
|
||||
|
||||
else if (!strcmp (pCmd, "-denois") && (i < argc))
|
||||
sParam.bEnableDenoise = atoi (argv[i++]) ? true : false;
|
||||
|
||||
else if (!strcmp (pCmd, "-bgd") && (i < argc))
|
||||
sParam.bEnableBackgroundDetection = atoi (argv[i++]) ? true : false;
|
||||
|
||||
else if (!strcmp (pCmd, "-aq") && (i < argc))
|
||||
sParam.bEnableAdaptiveQuant = atoi (argv[i++]) ? true : false;
|
||||
|
||||
else if (!strcmp (pCmd, "-fs") && (i < argc))
|
||||
sParam.bEnableFrameSkip = atoi (argv[i++]) ? true : false;
|
||||
|
||||
else if (!strcmp (pCmd, "-ltr") && (i < argc))
|
||||
sParam.bEnableLongTermReference = atoi (argv[i++]) ? true : false;
|
||||
|
||||
else if (!strcmp (pCmd, "-ltrnum") && (i < argc))
|
||||
sParam.iLTRRefNum = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-ltrper") && (i < argc))
|
||||
sParam.iLtrMarkPeriod = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-rcm") && (i < argc))
|
||||
sParam.iRCMode = (RC_MODES) atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-tarb") && (i < argc))
|
||||
sParam.iTargetBitrate = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-ltarb") && (i + 1 < argc)) {
|
||||
int iLayer = atoi (argv[i++]);
|
||||
sParam.sSpatialLayers[iLayer].iSpatialBitrate = atoi (argv[i++]);
|
||||
}
|
||||
|
||||
else if (!strcmp (pCmd, "-trace") && (i < argc))
|
||||
g_LevelSetting = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-dw") && (i < argc))
|
||||
sParam.iPicWidth = atoi (argv[i++]);
|
||||
|
||||
else if (!strcmp (pCmd, "-dh") && (i < argc))
|
||||
sParam.iPicHeight = atoi (argv[i++]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PrintHelp() {
|
||||
printf ("\n Wels SVC Encoder Usage:\n\n");
|
||||
printf (" Syntax: welsenc.exe -h\n");
|
||||
@ -388,6 +326,7 @@ void PrintHelp() {
|
||||
printf (" -frms Number of total frames to be encoded\n");
|
||||
printf (" -gop GOPSize - GOP size (1,2,4,8, default: 1)\n");
|
||||
printf (" -iper Intra period (default: -1) : must be a power of 2 of GOP size (or -1)\n");
|
||||
printf (" -nalsize the Maximum NAL size. which should be larger than the each layer slicesize when slice mode equals to SM_DYN_SLICE\n");
|
||||
printf (" -spsid Enable id adding in SPS/PPS per IDR \n");
|
||||
printf (" -denois Control denoising (default: 0)\n");
|
||||
printf (" -scene Control scene change detection (default: 0)\n");
|
||||
@ -395,10 +334,15 @@ void PrintHelp() {
|
||||
printf (" -aq Control adaptive quantization (default: 0)\n");
|
||||
printf (" -ltr Control long term reference (default: 0)\n");
|
||||
printf (" -ltrnum Control the number of long term reference((1-4):screen LTR,(1-2):video LTR \n");
|
||||
printf (" -threadIdc 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads \n");
|
||||
printf (" -deblockIdc Loop filter idc (0: on, 1: off, \n");
|
||||
printf (" -alphaOffset AlphaOffset(-6..+6): valid range \n");
|
||||
printf (" -betaOffset BetaOffset (-6..+6): valid range\n");
|
||||
printf (" -rc rate control mode: 0-quality mode; 1-bitrate mode; 2-bitrate limited mode; -1-rc off \n");
|
||||
printf (" -tarb Overall target bitrate\n");
|
||||
printf (" -numl Number Of Layers: Must exist with layer_cfg file and the number of input layer_cfg file must equal to the value set by this command\n");
|
||||
printf (" The options below are layer-based: (need to be set with layer id)\n");
|
||||
printf (" -lconfig (Layer) (spatial layer configure file)\n");
|
||||
printf (" -drec (Layer) (reconstruction file);example: -drec 0 rec.yuv. Setting the reconstruction file, this will only functioning when dumping reconstruction is enabled\n");
|
||||
printf (" -dw (Layer) (output width)\n");
|
||||
printf (" -dh (Layer) (output height)\n");
|
||||
@ -442,6 +386,9 @@ int ParseCommandLine (int argc, char** argv, SSourcePicture* pSrcPic, SEncParamE
|
||||
else if (!strcmp (pCommand, "-iper") && (n < argc))
|
||||
pSvcParam.uiIntraPeriod = atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-nalsize") && (n < argc))
|
||||
pSvcParam.uiMaxNalSize = atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-spsid") && (n < argc))
|
||||
pSvcParam.bEnableSpsPpsIdAddition = atoi (argv[n++]) ? true : false;
|
||||
|
||||
@ -469,6 +416,18 @@ int ParseCommandLine (int argc, char** argv, SSourcePicture* pSrcPic, SEncParamE
|
||||
else if (!strcmp (pCommand, "-ltrper") && (n < argc))
|
||||
pSvcParam.iLtrMarkPeriod = atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-threadIdc") && (n < argc))
|
||||
pSvcParam.iMultipleThreadIdc= atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-deblockIdc") && (n < argc))
|
||||
pSvcParam.iLoopFilterDisableIdc = atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-alphaOffset") && (n < argc))
|
||||
pSvcParam.iLoopFilterAlphaC0Offset = atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-betaOffset") && (n < argc))
|
||||
pSvcParam.iLoopFilterBetaOffset = atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-rc") && (n < argc))
|
||||
pSvcParam.iRCMode = static_cast<RC_MODES> (atoi (argv[n++]));
|
||||
|
||||
@ -476,20 +435,17 @@ int ParseCommandLine (int argc, char** argv, SSourcePicture* pSrcPic, SEncParamE
|
||||
g_LevelSetting = atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-tarb") && (n < argc))
|
||||
pSvcParam.iTargetBitrate = atoi (argv[n++]);
|
||||
pSvcParam.iTargetBitrate = 1000*atoi (argv[n++]);
|
||||
|
||||
else if (!strcmp (pCommand, "-numl") && (n < argc)) {
|
||||
pSvcParam.iSpatialLayerNum = atoi (argv[n++]);
|
||||
for (int ln = 0 ; (ln < pSvcParam.iSpatialLayerNum) && (n < argc) ; ln++) {
|
||||
// pSvcParam.sDependencyLayers[ln].uiDependencyId = ln;
|
||||
sFileSet.strLayerCfgFile[ln].assign (argv[n++]);
|
||||
}
|
||||
|
||||
for (int8_t iLayer = 0; iLayer < pSvcParam.iSpatialLayerNum; ++ iLayer) {
|
||||
CReadConfig cRdLayerCfg (sFileSet.strLayerCfgFile[iLayer]);
|
||||
if (-1 == ParseLayerConfig (cRdLayerCfg, iLayer, pSvcParam, sFileSet)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (!strcmp (pCommand, "-lconfig") && (n < argc)) {
|
||||
unsigned int iLayer = atoi (argv[n++]);
|
||||
sFileSet.strLayerCfgFile[iLayer].assign (argv[n++]);
|
||||
CReadConfig cRdLayerCfg (sFileSet.strLayerCfgFile[iLayer]);
|
||||
if (-1 == ParseLayerConfig (cRdLayerCfg, iLayer, pSvcParam, sFileSet)) {
|
||||
return 1;
|
||||
}
|
||||
} else if (!strcmp (pCommand, "-drec") && (n + 1 < argc)) {
|
||||
unsigned int iLayer = atoi (argv[n++]);
|
||||
@ -595,9 +551,10 @@ int FillSpecificParameters (SEncParamExt& sParam) {
|
||||
sParam.iInputCsp = videoFormatI420; // color space of input sequence
|
||||
sParam.uiIntraPeriod = 320; // period of Intra frame
|
||||
sParam.bEnableSpsPpsIdAddition = 1;
|
||||
sParam.bPrefixNalAddingCtrl = 1;
|
||||
sParam.bPrefixNalAddingCtrl = 0;
|
||||
|
||||
int iIndexLayer = 0;
|
||||
sParam.sSpatialLayers[iIndexLayer].uiProfileIdc = PRO_BASELINE;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoWidth = 160;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoHeight = 90;
|
||||
sParam.sSpatialLayers[iIndexLayer].fFrameRate = 7.5f;
|
||||
@ -605,6 +562,7 @@ int FillSpecificParameters (SEncParamExt& sParam) {
|
||||
sParam.sSpatialLayers[iIndexLayer].sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
|
||||
|
||||
++ iIndexLayer;
|
||||
sParam.sSpatialLayers[iIndexLayer].uiProfileIdc = PRO_SCALABLE_BASELINE;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoWidth = 320;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoHeight = 180;
|
||||
sParam.sSpatialLayers[iIndexLayer].fFrameRate = 15.0f;
|
||||
@ -612,6 +570,7 @@ int FillSpecificParameters (SEncParamExt& sParam) {
|
||||
sParam.sSpatialLayers[iIndexLayer].sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
|
||||
|
||||
++ iIndexLayer;
|
||||
sParam.sSpatialLayers[iIndexLayer].uiProfileIdc = PRO_SCALABLE_BASELINE;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoWidth = 640;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoHeight = 360;
|
||||
sParam.sSpatialLayers[iIndexLayer].fFrameRate = 30.0f;
|
||||
@ -620,6 +579,7 @@ int FillSpecificParameters (SEncParamExt& sParam) {
|
||||
sParam.sSpatialLayers[iIndexLayer].sSliceCfg.sSliceArgument.uiSliceNum = 1;
|
||||
|
||||
++ iIndexLayer;
|
||||
sParam.sSpatialLayers[iIndexLayer].uiProfileIdc = PRO_SCALABLE_BASELINE;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoWidth = 1280;
|
||||
sParam.sSpatialLayers[iIndexLayer].iVideoHeight = 720;
|
||||
sParam.sSpatialLayers[iIndexLayer].fFrameRate = 30.0f;
|
||||
@ -637,174 +597,7 @@ int FillSpecificParameters (SEncParamExt& sParam) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* For SVC Demo test */
|
||||
int ProcessEncodingSvcWithParam (ISVCEncoder* pPtrEnc, int argc, char** argv) {
|
||||
const char* kpSrcFile = argv[1];
|
||||
const char* kpStrBsFile = argv[2];
|
||||
|
||||
if (pPtrEnc == NULL || kpSrcFile == NULL || kpStrBsFile == NULL)
|
||||
return 1;
|
||||
|
||||
FILE* pFpBs = NULL;
|
||||
FILE* pFpSrc = NULL;
|
||||
SFrameBSInfo sFbi;
|
||||
SEncParamExt sSvcParam;
|
||||
int64_t iStart = 0, iTotal = 0;
|
||||
int32_t ret = 0;
|
||||
|
||||
int32_t iPicLumaSize = 0;
|
||||
int32_t iFrameSize = 0;
|
||||
uint8_t* pPlanes[3] = { 0 };
|
||||
int32_t iFrame = 0;
|
||||
SSourcePicture* pSrcPic = NULL;
|
||||
#if defined ( STICK_STREAM_SIZE )
|
||||
FILE* fTrackStream = fopen ("coding_size.stream", "wb");;
|
||||
#endif
|
||||
|
||||
pFpSrc = fopen (kpSrcFile, "rb");
|
||||
if (NULL == pFpSrc)
|
||||
return 1;
|
||||
pFpBs = fopen (kpStrBsFile, "wb");
|
||||
if (NULL == pFpBs) {
|
||||
fclose (pFpSrc);
|
||||
pFpSrc = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset (&sFbi, 0, sizeof (SFrameBSInfo));
|
||||
memset (&sSvcParam, 0, sizeof (SEncParamExt));
|
||||
|
||||
FillSpecificParameters (sSvcParam);
|
||||
|
||||
int iParsedNum = 3;
|
||||
if (ParseCommandLine (argc - iParsedNum, argv + iParsedNum, sSvcParam) != 0) {
|
||||
printf ("parse pCommand line failed\n");
|
||||
ret = 1;
|
||||
goto ERROR_RET;
|
||||
}
|
||||
pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &g_LevelSetting);
|
||||
if (cmResultSuccess != pPtrEnc->InitializeExt (&sSvcParam)) {
|
||||
fprintf (stderr, "Encoder Initialization failed!\n");
|
||||
ret = 1;
|
||||
goto ERROR_RET;
|
||||
}
|
||||
iPicLumaSize = sSvcParam.iPicWidth * sSvcParam.iPicHeight;
|
||||
switch (sSvcParam.iInputCsp) {
|
||||
int iStride;
|
||||
case videoFormatI420:
|
||||
case videoFormatYV12:
|
||||
iFrameSize = (3 * iPicLumaSize) >> 1;
|
||||
pPlanes[0] = new uint8_t[iFrameSize];
|
||||
pPlanes[1] = pPlanes[0] + iPicLumaSize;
|
||||
pPlanes[2] = pPlanes[1] + (iPicLumaSize >> 2);
|
||||
break;
|
||||
case videoFormatYUY2:
|
||||
case videoFormatYVYU:
|
||||
case videoFormatUYVY:
|
||||
iStride = CALC_BI_STRIDE (sSvcParam.iPicWidth, 16);
|
||||
iFrameSize = iStride * sSvcParam.iPicHeight;
|
||||
pPlanes[0] = new uint8_t[iFrameSize];
|
||||
break;
|
||||
case videoFormatRGB:
|
||||
case videoFormatBGR:
|
||||
iStride = CALC_BI_STRIDE (sSvcParam.iPicWidth, 24);
|
||||
iFrameSize = iStride * sSvcParam.iPicHeight;
|
||||
pPlanes[0] = new uint8_t[iFrameSize];
|
||||
break;
|
||||
case videoFormatBGRA:
|
||||
case videoFormatRGBA:
|
||||
case videoFormatARGB:
|
||||
case videoFormatABGR:
|
||||
iStride = 4 * sSvcParam.iPicWidth;
|
||||
iFrameSize = iStride * sSvcParam.iPicHeight;
|
||||
pPlanes[0] = new uint8_t[iFrameSize];
|
||||
break;
|
||||
default:
|
||||
ret = 1;
|
||||
goto ERROR_RET;
|
||||
}
|
||||
|
||||
pSrcPic = new SSourcePicture;
|
||||
if (pSrcPic == NULL) {
|
||||
ret = 1;
|
||||
goto ERROR_RET;
|
||||
}
|
||||
|
||||
pSrcPic->iColorFormat = sSvcParam.iInputCsp;
|
||||
pSrcPic->iPicHeight = sSvcParam.iPicHeight;
|
||||
pSrcPic->iPicWidth = sSvcParam.iPicWidth;
|
||||
pSrcPic->iStride[0] = sSvcParam.iPicWidth;
|
||||
pSrcPic->iStride[1] = pSrcPic->iStride[2] = sSvcParam.iPicWidth >> 1;
|
||||
|
||||
pSrcPic->pData[0] = pPlanes[0];
|
||||
pSrcPic->pData[1] = pSrcPic->pData[0] + (sSvcParam.iPicWidth * sSvcParam.iPicHeight);
|
||||
pSrcPic->pData[2] = pSrcPic->pData[1] + (sSvcParam.iPicWidth * sSvcParam.iPicHeight >> 2);
|
||||
|
||||
while (true) {
|
||||
if (feof (pFpSrc))
|
||||
break;
|
||||
#ifdef ONLY_ENC_FRAMES_NUM
|
||||
if (iFrame >= ONLY_ENC_FRAMES_NUM)
|
||||
break;
|
||||
#endif//ONLY_ENC_FRAMES_NUM
|
||||
if (fread (pPlanes[0], sizeof (uint8_t), iFrameSize, pFpSrc) <= 0)
|
||||
break;
|
||||
|
||||
iStart = WelsTime();
|
||||
long iEncode = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
||||
iTotal += WelsTime() - iStart;
|
||||
if (cmResultSuccess != iEncode) {
|
||||
fprintf (stderr, "EncodeFrame() failed: %ld.\n", iEncode);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Write bit-stream */
|
||||
if (pFpBs != NULL && videoFrameTypeSkip != sFbi.eOutputFrameType) { // file handler to write bit stream
|
||||
int iLayer = 0;
|
||||
while (iLayer < sFbi.iLayerNum) {
|
||||
SLayerBSInfo* pLayerBsInfo = &sFbi.sLayerInfo[iLayer];
|
||||
if (pLayerBsInfo != NULL) {
|
||||
int iLayerSize = 0;
|
||||
int iNalIdx = pLayerBsInfo->iNalCount - 1;
|
||||
do {
|
||||
iLayerSize += pLayerBsInfo->iNalLengthInByte[iNalIdx];
|
||||
-- iNalIdx;
|
||||
} while (iNalIdx >= 0);
|
||||
fwrite (pLayerBsInfo->pBsBuf, 1, iLayerSize, pFpBs); // write pure bit stream into file
|
||||
}
|
||||
++ iLayer;
|
||||
}
|
||||
++ iFrame;
|
||||
}
|
||||
}
|
||||
|
||||
if (iFrame > 0) {
|
||||
double dElapsed = iTotal / 1e6;
|
||||
printf ("Frames: %d\nencode time: %f sec\nFPS: %f fps\n", iFrame, dElapsed, (iFrame * 1.0) / dElapsed);
|
||||
}
|
||||
|
||||
if (NULL != pPlanes[0]) {
|
||||
delete [] pPlanes[0];
|
||||
pPlanes[0] = NULL;
|
||||
}
|
||||
ERROR_RET:
|
||||
if (pFpBs) {
|
||||
fclose (pFpBs);
|
||||
pFpBs = NULL;
|
||||
}
|
||||
if (pFpSrc) {
|
||||
fclose (pFpSrc);
|
||||
pFpSrc = NULL;
|
||||
}
|
||||
if (pSrcPic) {
|
||||
delete pSrcPic;
|
||||
pSrcPic = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int ProcessEncodingSvcWithConfig (ISVCEncoder* pPtrEnc, int argc, char** argv) {
|
||||
int ProcessEncoding(ISVCEncoder* pPtrEnc, int argc, char** argv,bool bConfigFile) {
|
||||
int iRet = 0;
|
||||
|
||||
if (pPtrEnc == NULL)
|
||||
@ -834,24 +627,13 @@ int ProcessEncodingSvcWithConfig (ISVCEncoder* pPtrEnc, int argc, char** argv) {
|
||||
SFilesSet fs;
|
||||
// for configuration file
|
||||
CReadConfig cRdCfg;
|
||||
int iParsedNum = 2;
|
||||
int iParsedNum = 1;
|
||||
|
||||
memset (&sFbi, 0, sizeof (SFrameBSInfo));
|
||||
memset (&sSvcParam, 0, sizeof (SEncParamExt));
|
||||
memset (&fs.sRecFileName[0][0], 0, sizeof (fs.sRecFileName));
|
||||
sSvcParam.iInputCsp = videoFormatI420; // I420 in default
|
||||
sSvcParam.sSpatialLayers[0].uiProfileIdc = PRO_BASELINE;
|
||||
// svc_cfg->sDependencyLayers[0].frext_mode = 0;
|
||||
|
||||
// for configuration file
|
||||
cRdCfg.Openf (argv[1]);
|
||||
if (!cRdCfg.ExistFile()) {
|
||||
fprintf (stderr, "Specified file: %s not exist, maybe invalid path or parameter settting.\n",
|
||||
cRdCfg.GetFileName().c_str());
|
||||
iRet = 1;
|
||||
goto INSIDE_MEM_FREE;
|
||||
}
|
||||
|
||||
FillSpecificParameters (sSvcParam);
|
||||
pSrcPic = new SSourcePicture;
|
||||
if (pSrcPic == NULL) {
|
||||
iRet = 1;
|
||||
@ -860,19 +642,29 @@ int ProcessEncodingSvcWithConfig (ISVCEncoder* pPtrEnc, int argc, char** argv) {
|
||||
//fill default pSrcPic
|
||||
pSrcPic->iColorFormat = videoFormatI420;
|
||||
pSrcPic->uiTimeStamp = 0;
|
||||
iRet = ParseConfig (cRdCfg, pSrcPic, sSvcParam, fs);
|
||||
if (iRet) {
|
||||
fprintf (stderr, "parse svc parameter config file failed.\n");
|
||||
iRet = 1;
|
||||
goto INSIDE_MEM_FREE;
|
||||
}
|
||||
|
||||
// if configure file exit, reading configure file firstly
|
||||
if(bConfigFile){
|
||||
iParsedNum = 2;
|
||||
cRdCfg.Openf (argv[1]);
|
||||
if (!cRdCfg.ExistFile()) {
|
||||
fprintf (stderr, "Specified file: %s not exist, maybe invalid path or parameter settting.\n",
|
||||
cRdCfg.GetFileName().c_str());
|
||||
iRet = 1;
|
||||
goto INSIDE_MEM_FREE;
|
||||
}
|
||||
iRet = ParseConfig (cRdCfg, pSrcPic, sSvcParam, fs);
|
||||
if (iRet) {
|
||||
fprintf (stderr, "parse svc parameter config file failed.\n");
|
||||
iRet = 1;
|
||||
goto INSIDE_MEM_FREE;
|
||||
}
|
||||
}
|
||||
if (ParseCommandLine (argc - iParsedNum, argv + iParsedNum, pSrcPic, sSvcParam, fs) != 0) {
|
||||
printf ("parse pCommand line failed\n");
|
||||
iRet = 1;
|
||||
goto INSIDE_MEM_FREE;
|
||||
}
|
||||
|
||||
//finish reading the configurations
|
||||
iSourceWidth = pSrcPic->iPicWidth;
|
||||
iSourceHeight = pSrcPic->iPicHeight;
|
||||
@ -893,6 +685,8 @@ int ProcessEncodingSvcWithConfig (ISVCEncoder* pPtrEnc, int argc, char** argv) {
|
||||
pSrcPic->pData[2] = pSrcPic->pData[1] + (iSourceWidth * iSourceHeight >> 2);
|
||||
|
||||
//update sSvcParam
|
||||
sSvcParam.iPicWidth = 0;
|
||||
sSvcParam.iPicHeight = 0;
|
||||
for (int iLayer = 0; iLayer < sSvcParam.iSpatialLayerNum; iLayer++) {
|
||||
SSpatialLayerConfig* pDLayer = &sSvcParam.sSpatialLayers[iLayer];
|
||||
sSvcParam.iPicWidth = WELS_MAX (sSvcParam.iPicWidth, pDLayer->iVideoWidth);
|
||||
@ -1139,7 +933,7 @@ int main (int argc, char** argv)
|
||||
} else {
|
||||
if (!strstr (argv[1], ".cfg")) { // check configuration type (like .cfg?)
|
||||
if (argc > 2) {
|
||||
iRet = ProcessEncodingSvcWithParam (pSVCEncoder, argc, argv);
|
||||
iRet = ProcessEncoding(pSVCEncoder, argc, argv,false);
|
||||
if (iRet != 0)
|
||||
goto exit;
|
||||
} else if (argc == 2 && ! strcmp (argv[1], "-h"))
|
||||
@ -1149,7 +943,7 @@ int main (int argc, char** argv)
|
||||
goto exit;
|
||||
}
|
||||
} else {
|
||||
iRet = ProcessEncodingSvcWithConfig (pSVCEncoder, argc, argv);
|
||||
iRet = ProcessEncoding(pSVCEncoder, argc, argv,true);
|
||||
if (iRet > 0)
|
||||
goto exit;
|
||||
}
|
||||
|
@ -96,6 +96,8 @@ bool CheckAccessUnitBoundary (PWelsDecoderContext pCtx, const PNalUnit kpCurNal,
|
||||
const PSps kpSps);
|
||||
bool CheckAccessUnitBoundaryExt (PNalUnitHeaderExt pLastNalHdrExt, PNalUnitHeaderExt pCurNalHeaderExt,
|
||||
PSliceHeader pLastSliceHeader, PSliceHeader pCurSliceHeader);
|
||||
bool CheckNextAuNewSeq (PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PSps kpSps);
|
||||
|
||||
/*!
|
||||
*************************************************************************************
|
||||
* \brief to parse Sequence Parameter Set (SPS)
|
||||
|
@ -93,6 +93,7 @@
|
||||
|
||||
#define MAX_NAL_UNIT_NUM_IN_AU 32 // predefined maximal number of NAL Units in an access unit
|
||||
#define MAX_ACCESS_UNIT_CAPACITY 1048576 // Maximal AU capacity in bytes: (1<<20) = 1024 KB predefined
|
||||
#define BS_BUFFER_SIZE (MAX_ACCESS_UNIT_CAPACITY * 3) //for delay case, keep three AU size to prevent buffer overwrite
|
||||
#define MAX_MACROBLOCK_CAPACITY 5000 //Maximal legal MB capacity, 15000 bits is enough
|
||||
|
||||
#endif//WELS_CONSTANCE_H__
|
||||
|
@ -322,12 +322,16 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((uiAvailNalNum == 1) && ((NAL_UNIT_CODED_SLICE_IDR == pNalUnitHeader->eNalUnitType)
|
||||
|| (pCurNal->sNalHeaderExt.bIdrFlag))) {
|
||||
ResetActiveSPSForEachLayer (pCtx);
|
||||
}
|
||||
if ((uiAvailNalNum > 1) &&
|
||||
CheckAccessUnitBoundary (pCtx, pCurAu->pNalUnitsList[uiAvailNalNum - 1], pCurAu->pNalUnitsList[uiAvailNalNum - 2],
|
||||
pCurAu->pNalUnitsList[uiAvailNalNum - 1]->sNalData.sVclNal.sSliceHeaderExt.sSliceHeader.pSps)) {
|
||||
pCurAu->uiEndPos = uiAvailNalNum - 2;
|
||||
pCtx->bAuReadyFlag = true;
|
||||
|
||||
pCtx->bNextNewSeqBegin = CheckNextAuNewSeq (pCtx, pCurNal, pCurNal->sNalData.sVclNal.sSliceHeaderExt.sSliceHeader.pSps);
|
||||
|
||||
}
|
||||
}
|
||||
@ -407,10 +411,9 @@ bool CheckAccessUnitBoundary (PWelsDecoderContext pCtx, const PNalUnit kpCurNal,
|
||||
const SSliceHeader* kpCurSliceHeader = &kpCurNal->sNalData.sVclNal.sSliceHeaderExt.sSliceHeader;
|
||||
if (pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != NULL
|
||||
&& pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != kpSps) {
|
||||
pCtx->bNextNewSeqBegin = true;
|
||||
return true; // the active sps changed, new sequence begins, so the current au is ready
|
||||
}
|
||||
|
||||
|
||||
//Sub-clause 7.1.4.1.1 temporal_id
|
||||
if (kpLastNalHeaderExt->uiTemporalId != kpCurNalHeaderExt->uiTemporalId) {
|
||||
return true;
|
||||
@ -456,6 +459,17 @@ bool CheckAccessUnitBoundary (PWelsDecoderContext pCtx, const PNalUnit kpCurNal,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CheckNextAuNewSeq (PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PSps kpSps) {
|
||||
const PNalUnitHeaderExt kpCurNalHeaderExt = &kpCurNal->sNalHeaderExt;
|
||||
if (pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != NULL
|
||||
&& pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != kpSps)
|
||||
return true;
|
||||
if (kpCurNalHeaderExt->bIdrFlag)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*!
|
||||
*************************************************************************************
|
||||
* \brief to parse NON VCL NAL Units
|
||||
@ -493,7 +507,8 @@ int32_t ParseNonVclNal (PWelsDecoderContext pCtx, uint8_t* pRbsp, const int32_t
|
||||
#endif
|
||||
iErr = ParseSps (pCtx, pBs, &iPicWidth, &iPicHeight);
|
||||
if (ERR_NONE != iErr) { // modified for pSps/pSubsetSps invalid, 12/1/2009
|
||||
pCtx->iErrorCode |= dsNoParamSets;
|
||||
if (pCtx->iErrorConMethod == ERROR_CON_DISABLE)
|
||||
pCtx->iErrorCode |= dsNoParamSets;
|
||||
return iErr;
|
||||
}
|
||||
|
||||
@ -507,7 +522,8 @@ int32_t ParseNonVclNal (PWelsDecoderContext pCtx, uint8_t* pRbsp, const int32_t
|
||||
#endif
|
||||
iErr = ParsePps (pCtx, &pCtx->sPpsBuffer[0], pBs);
|
||||
if (ERR_NONE != iErr) { // modified for pps invalid, 12/1/2009
|
||||
pCtx->iErrorCode |= dsNoParamSets;
|
||||
if (pCtx->iErrorConMethod == ERROR_CON_DISABLE)
|
||||
pCtx->iErrorCode |= dsNoParamSets;
|
||||
return iErr;
|
||||
}
|
||||
|
||||
|
@ -314,13 +314,13 @@ int32_t WelsInitMemory (PWelsDecoderContext pCtx) {
|
||||
if (MemInitNalList (&pCtx->pAccessUnitList, MAX_NAL_UNIT_NUM_IN_AU) != 0)
|
||||
return ERR_INFO_OUT_OF_MEMORY;
|
||||
|
||||
if ((pCtx->sRawData.pHead = static_cast<uint8_t*> (WelsMalloc (MAX_ACCESS_UNIT_CAPACITY,
|
||||
if ((pCtx->sRawData.pHead = static_cast<uint8_t*> (WelsMalloc (BS_BUFFER_SIZE,
|
||||
"pCtx->sRawData->pHead"))) == NULL) {
|
||||
return ERR_INFO_OUT_OF_MEMORY;
|
||||
}
|
||||
pCtx->sRawData.pStartPos =
|
||||
pCtx->sRawData.pCurPos = pCtx->sRawData.pHead;
|
||||
pCtx->sRawData.pEnd = pCtx->sRawData.pHead + MAX_ACCESS_UNIT_CAPACITY;
|
||||
pCtx->sRawData.pEnd = pCtx->sRawData.pHead + BS_BUFFER_SIZE;
|
||||
|
||||
pCtx->uiTargetDqId = (uint8_t) - 1;
|
||||
pCtx->bEndOfStreamFlag = false;
|
||||
|
@ -64,7 +64,7 @@ class CWelsDecoder : public ISVCDecoder {
|
||||
|
||||
/***************************************************************************
|
||||
* Description:
|
||||
* Decompress one frame, and output RGB24 or YV12 decoded stream and its length.
|
||||
* Decompress one frame, and output I420 or RGB24(in the future) decoded stream and its length.
|
||||
* Input parameters:
|
||||
* Parameter TYPE Description
|
||||
* pSrc unsigned char* the h264 stream to decode
|
||||
@ -83,7 +83,7 @@ class CWelsDecoder : public ISVCDecoder {
|
||||
|
||||
virtual DECODING_STATE EXTAPI DecodeFrame2 (const unsigned char* kpSrc,
|
||||
const int kiSrcLen,
|
||||
void** ppDst,
|
||||
unsigned char** ppDst,
|
||||
SBufferInfo* pDstInfo);
|
||||
virtual DECODING_STATE EXTAPI DecodeFrameEx (const unsigned char* kpSrc,
|
||||
const int kiSrcLen,
|
||||
|
@ -320,13 +320,13 @@ long CWelsDecoder::GetOption (DECODER_OPTION eOptID, void* pOption) {
|
||||
|
||||
DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc,
|
||||
const int kiSrcLen,
|
||||
void** ppDst,
|
||||
unsigned char** ppDst,
|
||||
SBufferInfo* pDstInfo) {
|
||||
if (kiSrcLen > MAX_ACCESS_UNIT_CAPACITY - MAX_MACROBLOCK_CAPACITY) {//prevent from residual reading overflow
|
||||
m_pDecContext->iErrorCode |= dsOutOfMemory;
|
||||
IWelsTrace::WelsVTrace (m_pTrace, IWelsTrace::WELS_LOG_INFO,
|
||||
"max AU size exceeded. Allowed size = %d, current size = %d",
|
||||
MAX_ACCESS_UNIT_CAPACITY, kiSrcLen);
|
||||
MAX_ACCESS_UNIT_CAPACITY - MAX_MACROBLOCK_CAPACITY, kiSrcLen);
|
||||
return dsOutOfMemory;
|
||||
}
|
||||
if (kiSrcLen > 0 && kpSrc != NULL) {
|
||||
@ -361,7 +361,7 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc,
|
||||
|
||||
m_pDecContext->iFeedbackTidInAu = -1; //initialize
|
||||
|
||||
WelsDecodeBs (m_pDecContext, kpSrc, kiSrcLen, (unsigned char**)ppDst,
|
||||
WelsDecodeBs (m_pDecContext, kpSrc, kiSrcLen, ppDst,
|
||||
pDstInfo); //iErrorCode has been modified in this function
|
||||
|
||||
if (m_pDecContext->iErrorCode) {
|
||||
@ -406,7 +406,7 @@ DECODING_STATE CWelsDecoder::DecodeFrame (const unsigned char* kpSrc,
|
||||
DstInfo.UsrData.sSystemBuffer.iWidth = iWidth;
|
||||
DstInfo.UsrData.sSystemBuffer.iHeight = iHeight;
|
||||
|
||||
eDecState = DecodeFrame2 (kpSrc, kiSrcLen, (void**)ppDst, &DstInfo);
|
||||
eDecState = DecodeFrame2 (kpSrc, kiSrcLen, ppDst, &DstInfo);
|
||||
if (eDecState == dsErrorFree) {
|
||||
pStride[0] = DstInfo.UsrData.sSystemBuffer.iStride[0];
|
||||
pStride[1] = DstInfo.UsrData.sSystemBuffer.iStride[1];
|
||||
|
@ -64,7 +64,7 @@ namespace WelsSVCEnc {
|
||||
*/
|
||||
typedef struct TagRefList {
|
||||
SPicture* pShortRefList[1 + MAX_SHORT_REF_COUNT]; // reference list 0 - int16_t
|
||||
SPicture* pLongRefList[1 + MAX_LONG_REF_COUNT]; // reference list 1 - int32_t
|
||||
SPicture* pLongRefList[1 + MAX_REF_PIC_COUNT]; // reference list 1 - int32_t
|
||||
SPicture* pNextBuffer;
|
||||
SPicture* pRef[1 + MAX_REF_PIC_COUNT]; // plus 1 for swap intend
|
||||
uint8_t uiShortRefCount;
|
||||
|
@ -66,6 +66,8 @@ enum {
|
||||
VGOP_SIZE = 8,
|
||||
|
||||
//qp information
|
||||
FIX_MIN_QP_MODE = 10, //qp <10 will cause level code overflow in cavlc coding which isn't suppored in baseline profile
|
||||
FIX_MAX_QP_MODE = 51,
|
||||
GOM_MIN_QP_MODE = 12,
|
||||
GOM_MAX_QP_MODE = 36,
|
||||
MAX_LOW_BR_QP = 42,
|
||||
|
@ -178,9 +178,8 @@ class CWelsPreProcess {
|
||||
uint8_t m_uiSpatialPicNum[MAX_DEPENDENCY_LAYER];
|
||||
public:
|
||||
/* For Downsampling & VAA I420 based source pictures */
|
||||
SPicture* m_pSpatialPic[MAX_DEPENDENCY_LAYER][MAX_TEMPORAL_LEVEL + 1 +
|
||||
LONG_TERM_REF_NUM]; // need memory requirement with total number of (log2(uiGopSize)+1+1+long_term_ref_num)
|
||||
|
||||
SPicture* m_pSpatialPic[MAX_DEPENDENCY_LAYER][MAX_REF_PIC_COUNT+1];
|
||||
// need memory requirement with total number of (log2(uiGopSize)+1+1+long_term_ref_num)
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -41,14 +41,6 @@
|
||||
#include "au_set.h"
|
||||
#include "svc_enc_golomb.h"
|
||||
namespace WelsSVCEnc {
|
||||
static const uint32_t g_kuiMaxDPBx2AtLevel[52] = { // *2 on the basic of Annex A, Table A-1, for int32_t type
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0~9
|
||||
297, 675, 1782, 1782, 0, 0, 0, 0, 0, 0, //10, 11, 12, 13
|
||||
1782, 3564, 6075, 0, 0, 0, 0, 0, 0, 0, //20, 21, 22
|
||||
6075, 13500, 15360, 0, 0, 0, 0, 0, 0, 0, //30, 31, 32
|
||||
24576, 24576, 26112, 0, 0, 0, 0, 0, 0, 0, //40, 41, 42
|
||||
82800, 138240 //50, 51
|
||||
};
|
||||
|
||||
|
||||
#define LEVEL_NUMBER 16
|
||||
|
@ -115,37 +115,6 @@ static const uint8_t g_kuiTableBIdx[2][8] = {
|
||||
}, // table_bn_idx
|
||||
};
|
||||
|
||||
static const ALIGNED_DECLARE (int32_t, g_kiTableBlock8x8Idx[2][4][4], 16) = {
|
||||
{
|
||||
{0, 0, 2, 2},
|
||||
{0, 0, 2, 2},
|
||||
{1, 1, 3, 3},
|
||||
{1, 1, 3, 3}
|
||||
},
|
||||
|
||||
{
|
||||
{0, 0, 1, 1},
|
||||
{0, 0, 1, 1},
|
||||
{2, 2, 3, 3},
|
||||
{2, 2, 3, 3}
|
||||
}
|
||||
};
|
||||
static const ALIGNED_DECLARE (int32_t, g_kiTableBlock8x8NIdx[2][4][4], 16) = {
|
||||
{
|
||||
{1, 1, 3, 3},
|
||||
{0, 0, 2, 2},
|
||||
{0, 0, 2, 2},
|
||||
{1, 1, 3, 3}
|
||||
},
|
||||
|
||||
{
|
||||
{2, 2, 3, 3},
|
||||
{0, 0, 1, 1},
|
||||
{0, 0, 1, 1},
|
||||
{2, 2, 3, 3}
|
||||
}
|
||||
};
|
||||
|
||||
#define TC0_TBL_LOOKUP(iTc, iIdexA, pBS, bchroma) \
|
||||
{\
|
||||
iTc[0] = g_kiTc0Table(iIdexA)[pBS[0]] + bchroma;\
|
||||
|
@ -112,6 +112,19 @@ int32_t ParamValidation (SWelsSvcCodingParam* pCfg) {
|
||||
pCfg->fMaxFrameRate = fMaxFrameRate;
|
||||
}
|
||||
|
||||
//bitrate setting validation
|
||||
if (pCfg->iRCMode != RC_OFF_MODE){
|
||||
int32_t iTotalBitrate = 0;
|
||||
for (i = 0; i < pCfg->iSpatialLayerNum; ++ i) {
|
||||
SDLayerParam* fDlp = &pCfg->sDependencyLayers[i];
|
||||
iTotalBitrate += fDlp->iSpatialBitrate;
|
||||
}
|
||||
if(iTotalBitrate > pCfg->iTargetBitrate){
|
||||
WelsLog(NULL, WELS_LOG_ERROR,"Invalid setttings in bitrate. the sum of each layer bitrate(%d) is larger than total bitrate setting(%d)\n",
|
||||
iTotalBitrate,pCfg->iTargetBitrate);
|
||||
}
|
||||
}
|
||||
|
||||
return ENC_RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1272,7 +1285,7 @@ int32_t RequestMemorySvc (sWelsEncCtx** ppCtx) {
|
||||
|
||||
fCompressRatioThr = COMPRESS_RATIO_THR;
|
||||
|
||||
iLayerBsSize = WELS_ROUND (((3 * fDlp->iFrameWidth * fDlp->iFrameHeight) >> 1) * fCompressRatioThr);
|
||||
iLayerBsSize = WELS_ROUND (((3 * fDlp->iFrameWidth * fDlp->iFrameHeight) >> 1) * fCompressRatioThr) + MAX_MACROBLOCK_SIZE_IN_BYTE;
|
||||
iLayerBsSize = WELS_ALIGN (iLayerBsSize, 4); // 4 bytes alinged
|
||||
iVclLayersBsSizeCount += iLayerBsSize;
|
||||
++ iIndex;
|
||||
|
@ -127,10 +127,10 @@ void RcInitSequenceParameter (sWelsEncCtx* pEncCtx) {
|
||||
|
||||
pWelsSvcRc->dSkipBufferRatio = SKIP_RATIO;
|
||||
|
||||
pWelsSvcRc->iQpRangeUpperInFrame = QP_RANGE_UPPER_MODE1 - (int32_t) ((QP_RANGE_UPPER_MODE1 - QP_RANGE_MODE0) *
|
||||
pWelsSvcRc->dRcVaryRatio + 0.5);
|
||||
pWelsSvcRc->iQpRangeLowerInFrame = QP_RANGE_LOWER_MODE1 - (int32_t) ((QP_RANGE_LOWER_MODE1 - QP_RANGE_MODE0) *
|
||||
pWelsSvcRc->dRcVaryRatio + 0.5);
|
||||
pWelsSvcRc->iQpRangeUpperInFrame = QP_RANGE_UPPER_MODE1 - WELS_ROUND ((QP_RANGE_UPPER_MODE1 - QP_RANGE_MODE0) *
|
||||
pWelsSvcRc->dRcVaryRatio);
|
||||
pWelsSvcRc->iQpRangeLowerInFrame = QP_RANGE_LOWER_MODE1 - WELS_ROUND ((QP_RANGE_LOWER_MODE1 - QP_RANGE_MODE0) *
|
||||
pWelsSvcRc->dRcVaryRatio);
|
||||
|
||||
if (iMbWidth <= MB_WIDTH_THRESHOLD_90P) {
|
||||
pWelsSvcRc->iSkipQpValue = SKIP_QP_90P;
|
||||
@ -149,17 +149,17 @@ void RcInitSequenceParameter (sWelsEncCtx* pEncCtx) {
|
||||
iGomRowMode0 = GOM_ROW_MODE0_720P;
|
||||
iGomRowMode1 = GOM_ROW_MODE1_720P;
|
||||
}
|
||||
iGomRowMode0 = iGomRowMode1 + (int32_t) ((iGomRowMode0 - iGomRowMode1) * pWelsSvcRc->dRcVaryRatio + 0.5);
|
||||
iGomRowMode0 = iGomRowMode1 + WELS_ROUND ((iGomRowMode0 - iGomRowMode1) * pWelsSvcRc->dRcVaryRatio);
|
||||
|
||||
pWelsSvcRc->iNumberMbGom = iMbWidth * iGomRowMode0;
|
||||
|
||||
pWelsSvcRc->iMinQp = GOM_MIN_QP_MODE;
|
||||
pWelsSvcRc->iMaxQp = GOM_MAX_QP_MODE;
|
||||
|
||||
pWelsSvcRc->iFrameDeltaQpUpper = LAST_FRAME_QP_RANGE_UPPER_MODE1 - (int32_t) ((LAST_FRAME_QP_RANGE_UPPER_MODE1 -
|
||||
LAST_FRAME_QP_RANGE_UPPER_MODE0) * pWelsSvcRc->dRcVaryRatio + 0.5);
|
||||
pWelsSvcRc->iFrameDeltaQpLower = LAST_FRAME_QP_RANGE_LOWER_MODE1 - (int32_t) ((LAST_FRAME_QP_RANGE_LOWER_MODE1 -
|
||||
LAST_FRAME_QP_RANGE_LOWER_MODE0) * pWelsSvcRc->dRcVaryRatio + 0.5);
|
||||
pWelsSvcRc->iFrameDeltaQpUpper = LAST_FRAME_QP_RANGE_UPPER_MODE1 - WELS_ROUND ((LAST_FRAME_QP_RANGE_UPPER_MODE1 -
|
||||
LAST_FRAME_QP_RANGE_UPPER_MODE0) * pWelsSvcRc->dRcVaryRatio);
|
||||
pWelsSvcRc->iFrameDeltaQpLower = LAST_FRAME_QP_RANGE_LOWER_MODE1 - WELS_ROUND ((LAST_FRAME_QP_RANGE_LOWER_MODE1 -
|
||||
LAST_FRAME_QP_RANGE_LOWER_MODE0) * pWelsSvcRc->dRcVaryRatio);
|
||||
|
||||
pWelsSvcRc->iSkipFrameNum = 0;
|
||||
pWelsSvcRc->iGomSize = (pWelsSvcRc->iNumberMbFrame + pWelsSvcRc->iNumberMbGom - 1) / pWelsSvcRc->iNumberMbGom;
|
||||
@ -213,7 +213,7 @@ void RcUpdateBitrateFps (sWelsEncCtx* pEncCtx) {
|
||||
const int32_t kiGopSize = (1 << pDLayerParam->iDecompositionStages);
|
||||
const int32_t kiHighestTid = pDLayerParam->iHighestTemporalId;
|
||||
double input_dBitsPerFrame = pDLayerParam->iSpatialBitrate / pDLayerParam->fInputFrameRate;
|
||||
const int32_t kiGopBits = (int32_t) (input_dBitsPerFrame * kiGopSize);
|
||||
const int32_t kiGopBits = WELS_ROUND (input_dBitsPerFrame * kiGopSize);
|
||||
int32_t i;
|
||||
|
||||
pWelsSvcRc->iBitRate = pDLayerParam->iSpatialBitrate;
|
||||
@ -225,16 +225,16 @@ void RcUpdateBitrateFps (sWelsEncCtx* pEncCtx) {
|
||||
|
||||
for (i = 0; i <= kiHighestTid; i++) {
|
||||
const double kdConstraitBits = kiGopBits * pTOverRc[i].dTlayerWeight;
|
||||
pTOverRc[i].iMinBitsTl = (int32_t) (kdConstraitBits * dMinBitsRatio);
|
||||
pTOverRc[i].iMaxBitsTl = (int32_t) (kdConstraitBits * dMaxBitsRatio);
|
||||
pTOverRc[i].iMinBitsTl = WELS_ROUND(kdConstraitBits * dMinBitsRatio);
|
||||
pTOverRc[i].iMaxBitsTl = WELS_ROUND(kdConstraitBits * dMaxBitsRatio);
|
||||
}
|
||||
//When bitrate is changed, pBuffer size should be updated
|
||||
pWelsSvcRc->iBufferSizeSkip = (int32_t) (pWelsSvcRc->iBitRate * pWelsSvcRc->dSkipBufferRatio);
|
||||
pWelsSvcRc->iBufferSizePadding = (int32_t) (pWelsSvcRc->iBitRate * PADDING_BUFFER_RATIO);
|
||||
pWelsSvcRc->iBufferSizeSkip = WELS_ROUND(pWelsSvcRc->iBitRate * pWelsSvcRc->dSkipBufferRatio);
|
||||
pWelsSvcRc->iBufferSizePadding = WELS_ROUND(pWelsSvcRc->iBitRate * PADDING_BUFFER_RATIO);
|
||||
|
||||
//change remaining bits
|
||||
if (pWelsSvcRc->dBitsPerFrame > 0.1)
|
||||
pWelsSvcRc->iRemainingBits = (int32_t) (pWelsSvcRc->iRemainingBits * input_dBitsPerFrame / pWelsSvcRc->dBitsPerFrame);
|
||||
pWelsSvcRc->iRemainingBits = WELS_ROUND(pWelsSvcRc->iRemainingBits * input_dBitsPerFrame / pWelsSvcRc->dBitsPerFrame);
|
||||
pWelsSvcRc->dBitsPerFrame = input_dBitsPerFrame;
|
||||
}
|
||||
|
||||
@ -245,7 +245,7 @@ void RcInitVGop (sWelsEncCtx* pEncCtx) {
|
||||
SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
|
||||
const int32_t kiHighestTid = pEncCtx->pSvcParam->sDependencyLayers[kiDid].iHighestTemporalId;
|
||||
|
||||
pWelsSvcRc->iRemainingBits = (int32_t) (VGOP_SIZE * pWelsSvcRc->dBitsPerFrame);
|
||||
pWelsSvcRc->iRemainingBits = WELS_ROUND(VGOP_SIZE * pWelsSvcRc->dBitsPerFrame);
|
||||
pWelsSvcRc->dRemainingWeights = pWelsSvcRc->iGopNumberInVGop;
|
||||
|
||||
pWelsSvcRc->iFrameCodedInVGop = 0;
|
||||
@ -325,9 +325,9 @@ void RcTraceVGopBitrate (sWelsEncCtx* pEncCtx) {
|
||||
}
|
||||
int32_t iFrameInVGop = pWelsSvcRc->iFrameCodedInVGop + pWelsSvcRc->iSkipFrameInVGop;
|
||||
if (0 != iFrameInVGop)
|
||||
iVGopBitrate = (int32_t) (iTotalBits / iFrameInVGop * pWelsSvcRc->fFrameRate);
|
||||
iVGopBitrate = WELS_ROUND(iTotalBits / iFrameInVGop * pWelsSvcRc->fFrameRate);
|
||||
#ifdef _TEST_TEMP_Rc_
|
||||
fprintf (fp_vgop, "%d\n", (int32_t) ((double)iTotalBits / iFrameInVGop));
|
||||
fprintf (fp_vgop, "%d\n", WELS_ROUND((double)iTotalBits / iFrameInVGop));
|
||||
#endif
|
||||
WelsLog (pEncCtx, WELS_LOG_INFO, "[Rc] VGOPbitrate%d: %d \n", kiDid, iVGopBitrate);
|
||||
if (iTotalBits > 0) {
|
||||
@ -400,7 +400,7 @@ void RcInitIdrQp (sWelsEncCtx* pEncCtx) {
|
||||
break;
|
||||
}
|
||||
pWelsSvcRc->iInitialQp = dInitialQPArray[iBppIndex][i];
|
||||
pWelsSvcRc->iInitialQp = (int32_t)WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP);
|
||||
pWelsSvcRc->iInitialQp = WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP);
|
||||
pEncCtx->iGlobalQp = pWelsSvcRc->iInitialQp;
|
||||
pWelsSvcRc->dQStep = RcConvertQp2QStep (pEncCtx->iGlobalQp);
|
||||
pWelsSvcRc->iLastCalculatedQScale = pEncCtx->iGlobalQp;
|
||||
@ -410,11 +410,11 @@ void RcCalculateIdrQp (sWelsEncCtx* pEncCtx) {
|
||||
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
|
||||
//obtain the idr qp using previous idr complexity
|
||||
if (pWelsSvcRc->iNumberMbFrame != pWelsSvcRc->iIntraMbCount) {
|
||||
pWelsSvcRc->iIntraComplexity = (int32_t) ((double)pWelsSvcRc->iIntraComplexity * pWelsSvcRc->iNumberMbFrame /
|
||||
pWelsSvcRc->iIntraMbCount + 0.5);
|
||||
pWelsSvcRc->iIntraComplexity = WELS_ROUND((double)pWelsSvcRc->iIntraComplexity * pWelsSvcRc->iNumberMbFrame /
|
||||
pWelsSvcRc->iIntraMbCount);
|
||||
}
|
||||
pWelsSvcRc->iInitialQp = (int32_t)RcConvertQStep2Qp ((double)pWelsSvcRc->iIntraComplexity / pWelsSvcRc->iTargetBits);
|
||||
pWelsSvcRc->iInitialQp = (int32_t)WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP);
|
||||
pWelsSvcRc->iInitialQp = WELS_ROUND(RcConvertQStep2Qp ((double)pWelsSvcRc->iIntraComplexity / pWelsSvcRc->iTargetBits));
|
||||
pWelsSvcRc->iInitialQp = WELS_ROUND(WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP));
|
||||
pEncCtx->iGlobalQp = pWelsSvcRc->iInitialQp;
|
||||
pWelsSvcRc->dQStep = RcConvertQp2QStep (pEncCtx->iGlobalQp);
|
||||
pWelsSvcRc->iLastCalculatedQScale = pEncCtx->iGlobalQp;
|
||||
@ -451,7 +451,7 @@ void RcCalculatePictureQp (sWelsEncCtx* pEncCtx) {
|
||||
pWelsSvcRc->iLastCalculatedQScale = iLumaQp;
|
||||
|
||||
if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
|
||||
iLumaQp = (int32_t) (iLumaQp - pEncCtx->pVaa->sAdaptiveQuantParam.dAverMotionTextureIndexToDeltaQp);
|
||||
iLumaQp = WELS_ROUND(iLumaQp - pEncCtx->pVaa->sAdaptiveQuantParam.dAverMotionTextureIndexToDeltaQp);
|
||||
}
|
||||
|
||||
pEncCtx->iGlobalQp = iLumaQp;
|
||||
@ -462,7 +462,7 @@ void RcCalculatePictureQp (sWelsEncCtx* pEncCtx) {
|
||||
dCmplxRatio = WELS_CLIP3 (dCmplxRatio, 1.0 - FRAME_CMPLX_RATIO_RANGE, 1.0 + FRAME_CMPLX_RATIO_RANGE);
|
||||
|
||||
pWelsSvcRc->dQStep = pTOverRc->dLinearCmplx * dCmplxRatio / pWelsSvcRc->iTargetBits;
|
||||
iLumaQp = (int32_t) (RcConvertQStep2Qp (pWelsSvcRc->dQStep) + 0.5);
|
||||
iLumaQp = WELS_ROUND(RcConvertQStep2Qp (pWelsSvcRc->dQStep));
|
||||
|
||||
//limit QP
|
||||
int32_t iLastIdxCodecInVGop = pWelsSvcRc->iFrameCodedInVGop - 1;
|
||||
@ -487,10 +487,10 @@ void RcCalculatePictureQp (sWelsEncCtx* pEncCtx) {
|
||||
#ifndef _NOT_USE_AQ_FOR_TEST_
|
||||
if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
|
||||
|
||||
iLumaQp = (int32_t) (iLumaQp - pEncCtx->pVaa->sAdaptiveQuantParam.dAverMotionTextureIndexToDeltaQp);
|
||||
iLumaQp = WELS_ROUND(iLumaQp - pEncCtx->pVaa->sAdaptiveQuantParam.dAverMotionTextureIndexToDeltaQp);
|
||||
|
||||
if (pEncCtx->pSvcParam->iRCMode != RC_LOW_BW_MODE)
|
||||
iLumaQp = (int32_t)WELS_CLIP3 (iLumaQp, pWelsSvcRc->iMinQp, pWelsSvcRc->iMaxQp);
|
||||
iLumaQp = WELS_CLIP3 (iLumaQp, pWelsSvcRc->iMinQp, pWelsSvcRc->iMaxQp);
|
||||
|
||||
}
|
||||
#endif
|
||||
@ -510,7 +510,7 @@ void RcInitSliceInformation (sWelsEncCtx* pEncCtx) {
|
||||
pSOverRc->iEndMbSlice += (pCurSliceCtx->pCountMbNumInSlice[i] - 1);
|
||||
pSOverRc->iTotalQpSlice = 0;
|
||||
pSOverRc->iTotalMbSlice = 0;
|
||||
pSOverRc->iTargetBitsSlice = (int32_t) (kdBitsPerMb * pCurSliceCtx->pCountMbNumInSlice[i]);
|
||||
pSOverRc->iTargetBitsSlice = WELS_ROUND(kdBitsPerMb * pCurSliceCtx->pCountMbNumInSlice[i]);
|
||||
pSOverRc->iFrameBitsSlice = 0;
|
||||
pSOverRc->iGomBitsSlice = 0;
|
||||
++ pSOverRc;
|
||||
@ -524,9 +524,9 @@ void RcDecideTargetBits (sWelsEncCtx* pEncCtx) {
|
||||
pWelsSvcRc->iCurrentBitsLevel = BITS_NORMAL;
|
||||
//allocate bits
|
||||
if (pEncCtx->eSliceType == I_SLICE) {
|
||||
pWelsSvcRc->iTargetBits = (int32_t) (pWelsSvcRc->dBitsPerFrame * IDR_BITRATE_RATIO);
|
||||
pWelsSvcRc->iTargetBits = WELS_ROUND(pWelsSvcRc->dBitsPerFrame * IDR_BITRATE_RATIO);
|
||||
} else {
|
||||
pWelsSvcRc->iTargetBits = (int32_t) (pWelsSvcRc->iRemainingBits * pTOverRc->dTlayerWeight /
|
||||
pWelsSvcRc->iTargetBits = WELS_ROUND(pWelsSvcRc->iRemainingBits * pTOverRc->dTlayerWeight /
|
||||
pWelsSvcRc->dRemainingWeights);
|
||||
if ((pWelsSvcRc->iTargetBits <= 0) && (pEncCtx->pSvcParam->iRCMode == RC_LOW_BW_MODE)) {
|
||||
pWelsSvcRc->iCurrentBitsLevel = BITS_EXCEEDED;
|
||||
@ -665,11 +665,11 @@ void RcCalculateGomQp (sWelsEncCtx* pEncCtx, SMB* pCurMb, int32_t iSliceId) {
|
||||
void RcVBufferCalculationSkip (sWelsEncCtx* pEncCtx) {
|
||||
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
|
||||
SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
|
||||
const int32_t kiOutputBits = (int32_t) (pWelsSvcRc->dBitsPerFrame + 0.5);
|
||||
const int32_t kiOutputBits = WELS_ROUND(pWelsSvcRc->dBitsPerFrame);
|
||||
//condition 1: whole pBuffer fullness
|
||||
pWelsSvcRc->iBufferFullnessSkip += (pWelsSvcRc->iFrameDqBits - kiOutputBits);
|
||||
//condition 2: VGOP bits constraint
|
||||
const int32_t kiVGopBits = (int32_t) (pWelsSvcRc->dBitsPerFrame * VGOP_SIZE);
|
||||
const int32_t kiVGopBits = WELS_ROUND(pWelsSvcRc->dBitsPerFrame * VGOP_SIZE);
|
||||
int32_t iVGopBitsPred = 0;
|
||||
for (int32_t i = pWelsSvcRc->iFrameCodedInVGop + 1; i < VGOP_SIZE; i++)
|
||||
iVGopBitsPred += pTOverRc[pWelsSvcRc->iTlOfFrames[i]].iMinBitsTl;
|
||||
@ -690,7 +690,7 @@ void RcVBufferCalculationSkip (sWelsEncCtx* pEncCtx) {
|
||||
pWelsSvcRc->iBufferFullnessSkip = 0;
|
||||
|
||||
if (pEncCtx->iSkipFrameFlag == 1) {
|
||||
pWelsSvcRc->iRemainingBits += (int32_t) (pWelsSvcRc->dBitsPerFrame + 0.5);
|
||||
pWelsSvcRc->iRemainingBits += WELS_ROUND(pWelsSvcRc->dBitsPerFrame);
|
||||
pWelsSvcRc->iSkipFrameNum++;
|
||||
pWelsSvcRc->iSkipFrameInVGop++;
|
||||
}
|
||||
@ -698,8 +698,8 @@ void RcVBufferCalculationSkip (sWelsEncCtx* pEncCtx) {
|
||||
|
||||
void RcVBufferCalculationPadding (sWelsEncCtx* pEncCtx) {
|
||||
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
|
||||
const int32_t kiOutputBits = (int32_t) (pWelsSvcRc->dBitsPerFrame + 0.5);
|
||||
const int32_t kiBufferThreshold = (int32_t) (PADDING_THRESHOLD * (-pWelsSvcRc->iBufferSizePadding));
|
||||
const int32_t kiOutputBits = WELS_ROUND(pWelsSvcRc->dBitsPerFrame);
|
||||
const int32_t kiBufferThreshold = WELS_ROUND(PADDING_THRESHOLD * (-pWelsSvcRc->iBufferSizePadding));
|
||||
|
||||
pWelsSvcRc->iBufferFullnessPadding += (pWelsSvcRc->iFrameDqBits - kiOutputBits);
|
||||
|
||||
@ -736,7 +736,7 @@ void RcUpdatePictureQpBits (sWelsEncCtx* pEncCtx, int32_t iCodedBits) {
|
||||
++ pSOverRc;
|
||||
}
|
||||
if (iTotalMb > 0)
|
||||
pWelsSvcRc->iAverageFrameQp = (int32_t) (1.0 * iTotalQp / iTotalMb + 0.5);
|
||||
pWelsSvcRc->iAverageFrameQp = WELS_ROUND(1.0 * iTotalQp / iTotalMb);
|
||||
else
|
||||
pWelsSvcRc->iAverageFrameQp = pEncCtx->iGlobalQp;
|
||||
} else {
|
||||
@ -753,7 +753,7 @@ void RcUpdateIntraComplexity (sWelsEncCtx* pEncCtx) {
|
||||
|
||||
double dIntraCmplx = pWelsSvcRc->dQStep * pWelsSvcRc->iFrameDqBits;
|
||||
dIntraCmplx = (1.0 - iAlpha) * pWelsSvcRc->iIntraComplexity + iAlpha * dIntraCmplx;
|
||||
pWelsSvcRc->iIntraComplexity = (int32_t) (dIntraCmplx + 0.5);
|
||||
pWelsSvcRc->iIntraComplexity = WELS_ROUND(dIntraCmplx);
|
||||
pWelsSvcRc->iIntraMbCount = pWelsSvcRc->iNumberMbFrame;
|
||||
|
||||
pWelsSvcRc->iIdrNum++;
|
||||
@ -775,8 +775,8 @@ void RcUpdateFrameComplexity (sWelsEncCtx* pEncCtx) {
|
||||
double iAlpha = 1.0 / (1 + pTOverRc->iPFrameNum);
|
||||
if (iAlpha < SMOOTH_FACTOR_MIN_VALUE)
|
||||
iAlpha = SMOOTH_FACTOR_MIN_VALUE;
|
||||
pTOverRc->iFrameCmplxMean = (int32_t) ((1.0 - iAlpha) * pTOverRc->iFrameCmplxMean + iAlpha *
|
||||
pEncCtx->pVaa->sComplexityAnalysisParam.iFrameComplexity + 0.5);
|
||||
pTOverRc->iFrameCmplxMean = WELS_ROUND((1.0 - iAlpha) * pTOverRc->iFrameCmplxMean + iAlpha *
|
||||
pEncCtx->pVaa->sComplexityAnalysisParam.iFrameComplexity);
|
||||
|
||||
pTOverRc->iPFrameNum++;
|
||||
if (pTOverRc->iPFrameNum > 255)
|
||||
@ -918,9 +918,12 @@ void WelsRcPictureInitDisable (void* pCtx) {
|
||||
pEncCtx->iGlobalQp = RcCalculateCascadingQp (pEncCtx, kiQp);
|
||||
|
||||
if (pEncCtx->pSvcParam->bEnableAdaptiveQuant && (pEncCtx->eSliceType == P_SLICE)) {
|
||||
pEncCtx->iGlobalQp = (int32_t)WELS_CLIP3 (pEncCtx->iGlobalQp -
|
||||
pEncCtx->pVaa->sAdaptiveQuantParam.dAverMotionTextureIndexToDeltaQp, GOM_MIN_QP_MODE, GOM_MAX_QP_MODE);
|
||||
pEncCtx->iGlobalQp = WELS_CLIP3 (WELS_ROUND(pEncCtx->iGlobalQp -
|
||||
pEncCtx->pVaa->sAdaptiveQuantParam.dAverMotionTextureIndexToDeltaQp), GOM_MIN_QP_MODE, GOM_MAX_QP_MODE);
|
||||
}else{
|
||||
pEncCtx->iGlobalQp = WELS_CLIP3(pEncCtx->iGlobalQp, FIX_MIN_QP_MODE, FIX_MAX_QP_MODE);
|
||||
}
|
||||
|
||||
pWelsSvcRc->iAverageFrameQp = pEncCtx->iGlobalQp;
|
||||
}
|
||||
|
||||
@ -934,6 +937,8 @@ void WelsRcMbInitDisable (void* pCtx, SMB* pCurMb, SSlice* pSlice) {
|
||||
if (pEncCtx->pSvcParam->bEnableAdaptiveQuant && (pEncCtx->eSliceType == P_SLICE)) {
|
||||
iLumaQp = (int8_t)WELS_CLIP3 (iLumaQp +
|
||||
pEncCtx->pVaa->sAdaptiveQuantParam.pMotionTextureIndexToDeltaQp[pCurMb->iMbXY], GOM_MIN_QP_MODE, 51);
|
||||
}else{
|
||||
iLumaQp = WELS_CLIP3(iLumaQp,FIX_MIN_QP_MODE,FIX_MAX_QP_MODE);
|
||||
}
|
||||
pCurMb->uiChromaQp = g_kuiChromaQpTable[iLumaQp];
|
||||
pCurMb->uiLumaQp = iLumaQp;
|
||||
|
@ -482,9 +482,6 @@ void WelsMarkPic (void* pEncCtx) {
|
||||
|
||||
memset (pRefPicMark, 0, sizeof (SRefPicMarking));
|
||||
|
||||
if (iSliceIdx != kiCountSliceNum - 1) { //marking syntax only exist in last slice head
|
||||
continue;
|
||||
}
|
||||
if (pCtx->pSvcParam->bEnableLongTermReference && pLtr->bLTRMarkingFlag) {
|
||||
if (pLtr->iLTRMarkMode == LTR_DIRECT_MARK) {
|
||||
pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iMaxLongTermFrameIdx = LONG_TERM_REF_NUM - 1;
|
||||
|
@ -49,10 +49,6 @@ const ALIGNED_DECLARE (uint8_t, g_kuiZeroLeftMap[16], 16) = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
};
|
||||
|
||||
const ALIGNED_DECLARE (uint8_t, g_kuiTrailingOneIndex[8], 16) = {
|
||||
3, 0, 1, 0, 2, 0, 1, 0
|
||||
};
|
||||
|
||||
int32_t CavlcParamCal_c (int16_t* pCoffLevel, uint8_t* pRun, int16_t* pLevel, int32_t* pTotalCoeff ,
|
||||
int32_t iLastIndex) {
|
||||
int32_t iTotalZeros = 0;
|
||||
|
@ -236,11 +236,11 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx,
|
||||
|
||||
iSliceIdx = 0;
|
||||
while (iSliceIdx + 1 < kiCountSliceNum) {
|
||||
int32_t iNumMbAssigning = (int32_t) (kiCountNumMb * pSliceComplexRatio[iSliceIdx] + EPSN);
|
||||
int32_t iNumMbAssigning = WELS_ROUND(kiCountNumMb * pSliceComplexRatio[iSliceIdx]);
|
||||
|
||||
// GOM boundary aligned
|
||||
if (pCtx->pSvcParam->iRCMode != RC_OFF_MODE) {
|
||||
iNumMbAssigning = (int32_t) (1.0f * iNumMbAssigning / iNumMbInEachGom + 0.5f + EPSN) * iNumMbInEachGom;
|
||||
iNumMbAssigning = WELS_ROUND (1.0f * iNumMbAssigning / iNumMbInEachGom) * iNumMbInEachGom;
|
||||
}
|
||||
|
||||
// make sure one GOM at least in each pSlice for safe
|
||||
|
@ -276,7 +276,7 @@ void GomValidCheckSliceMbNum (const int32_t kiMbWidth, const int32_t kiMbHeight,
|
||||
|
||||
while (uiSliceIdx + 1 < kuiSliceNum) {
|
||||
// GOM boundary aligned
|
||||
int32_t iNumMbAssigning = (int32_t) (1.0f * kiMbNumPerSlice / iGomSize + 0.5f + EPSN) * iGomSize;
|
||||
int32_t iNumMbAssigning = WELS_ROUND(1.0f * kiMbNumPerSlice / iGomSize) * iGomSize;
|
||||
|
||||
// make sure one GOM at least in each slice for safe
|
||||
if (iNumMbAssigning < iMinimalMbNum)
|
||||
|
@ -914,47 +914,6 @@ void UpdateFMESwitch (SDqLayer* pCurLayer) {
|
||||
}
|
||||
void UpdateFMESwitchNull (SDqLayer* pCurLayer) {
|
||||
}
|
||||
/////////////////////////
|
||||
// Search function options
|
||||
/////////////////////////
|
||||
void WelsDiamondCrossSearch (SWelsFuncPtrList* pFunc, void* vpMe, void* vpSlice, const int32_t kiEncStride,
|
||||
const int32_t kiRefStride) {
|
||||
SWelsME* pMe = static_cast<SWelsME*> (vpMe);
|
||||
SSlice* pSlice = static_cast<SSlice*> (vpSlice);
|
||||
|
||||
// Step 1: diamond search
|
||||
WelsDiamondSearch (pFunc, vpMe, vpSlice, kiEncStride, kiRefStride);
|
||||
|
||||
// Step 2: CROSS search
|
||||
SScreenBlockFeatureStorage pRefBlockFeature; //TODO: use this structure from Ref
|
||||
pMe->uiSadCostThreshold = pRefBlockFeature.uiSadCostThreshold[pMe->uiBlockSize];
|
||||
if (pMe->uiSadCost >= pMe->uiSadCostThreshold) {
|
||||
WelsMotionCrossSearch (pFunc, pMe, pSlice, kiEncStride, kiRefStride);
|
||||
}
|
||||
}
|
||||
void WelsDiamondCrossFeatureSearch (SWelsFuncPtrList* pFunc, void* vpMe, void* vpSlice, const int32_t kiEncStride,
|
||||
const int32_t kiRefStride) {
|
||||
SWelsME* pMe = static_cast<SWelsME*> (vpMe);
|
||||
SSlice* pSlice = static_cast<SSlice*> (vpSlice);
|
||||
|
||||
// Step 1: diamond search + cross
|
||||
WelsDiamondCrossSearch (pFunc, pMe, pSlice, kiEncStride, kiRefStride);
|
||||
|
||||
// Step 2: FeatureSearch
|
||||
if (pMe->uiSadCost >= pMe->uiSadCostThreshold) {
|
||||
pSlice->uiSliceFMECostDown += pMe->uiSadCost;
|
||||
|
||||
SScreenBlockFeatureStorage tmpScreenBlockFeatureStorage; //TODO: use this structure from Ref
|
||||
uint32_t uiMaxSearchPoint = INT_MAX;//TODO: change it according to computational-complexity setting
|
||||
SFeatureSearchIn sFeatureSearchIn = {0};
|
||||
SetFeatureSearchIn (pFunc, *pMe, pSlice, &tmpScreenBlockFeatureStorage,
|
||||
kiEncStride, kiRefStride,
|
||||
&sFeatureSearchIn);
|
||||
MotionEstimateFeatureFullSearch (sFeatureSearchIn, uiMaxSearchPoint, pMe);
|
||||
|
||||
pSlice->uiSliceFMECostDown -= pMe->uiSadCost;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace WelsSVCEnc
|
||||
|
||||
|
@ -177,6 +177,12 @@ int32_t CWelsPreProcess::BuildSpatialPicList (sWelsEncCtx* pCtx, const SSourcePi
|
||||
if (!m_bInitDone) {
|
||||
if (WelsPreprocessCreate() != 0)
|
||||
return -1;
|
||||
|
||||
//init source width and height
|
||||
pSvcParam->SUsedPicRect.iLeft = 0;
|
||||
pSvcParam->SUsedPicRect.iTop = 0;
|
||||
pSvcParam->SUsedPicRect.iWidth = ((kpSrcPic->iPicWidth >> 1) << 1);
|
||||
pSvcParam->SUsedPicRect.iHeight = ((kpSrcPic->iPicHeight >> 1) << 1);
|
||||
if (WelsPreprocessReset (pCtx) != 0)
|
||||
return -1;
|
||||
|
||||
@ -962,14 +968,12 @@ ESceneChangeIdc CWelsPreProcess::DetectSceneChangeScreen (sWelsEncCtx* pCtx, SPi
|
||||
|
||||
int32_t iNumOfLargeChange = 0, iNumOfMediumChangeToLtr = 0;
|
||||
|
||||
bool bBestRefIsLtr = false, bIsClosestLtrFrame = false;
|
||||
bool bIsClosestLtrFrame = false;
|
||||
int32_t ret = 1, iScdIdx = 0;
|
||||
|
||||
SPicture* pRefPic = NULL;
|
||||
SRefInfoParam* pRefPicInfo = NULL;
|
||||
uint8_t* pCurBlockStaticPointer = NULL;
|
||||
uint8_t* pBestStrBlockStaticPointer = NULL;
|
||||
uint8_t* pBestLtrBlockStaticPointer = NULL;
|
||||
|
||||
const int32_t iNegligibleMotionBlocks = (static_cast<int32_t> ((pCurPicture->iWidthInPixel >> 3) *
|
||||
(pCurPicture->iHeightInPixel >> 3) * STATIC_SCENE_MOTION_RATIO));
|
||||
@ -1024,13 +1028,10 @@ ESceneChangeIdc CWelsPreProcess::DetectSceneChangeScreen (sWelsEncCtx* pCtx, SPi
|
||||
if (JudgeBestRef (pRefPic, sLtrJudgement, iFrameComplexity, bIsClosestLtrFrame)) {
|
||||
SaveBestRefToJudgement (iRefPicAvQP, iFrameComplexity, &sLtrJudgement);
|
||||
SaveBestRefToLocal (pRefPicInfo, sSceneChangeResult, &sLtrSaved);
|
||||
bBestRefIsLtr = bCurRefIsLtr;
|
||||
pBestStrBlockStaticPointer = sSceneChangeResult.pStaticBlockIdc;
|
||||
}
|
||||
if (bCurRefIsLtr && JudgeBestRef (pRefPic, sSceneLtrJudgement, iFrameComplexity, bIsClosestLtrFrame)) {
|
||||
SaveBestRefToJudgement (iRefPicAvQP, iFrameComplexity, &sSceneLtrJudgement);
|
||||
SaveBestRefToLocal (pRefPicInfo, sSceneChangeResult, &sSceneLtrSaved);
|
||||
pBestLtrBlockStaticPointer = sSceneChangeResult.pStaticBlockIdc;
|
||||
}
|
||||
|
||||
if (iMotionBlockNum <= iNegligibleMotionBlocks) {
|
||||
|
@ -67,12 +67,23 @@ WELSVP_NAMESPACE_BEGIN
|
||||
|
||||
#define WELS_MAX(x, y) ((x) > (y) ? (x) : (y))
|
||||
#define WELS_MIN(x, y) ((x) < (y) ? (x) : (y))
|
||||
|
||||
#ifndef WELS_SIGN
|
||||
#define WELS_SIGN(a) ((int32_t)(a) >> 31)
|
||||
#endif
|
||||
|
||||
#ifndef WELS_ABS
|
||||
#define WELS_ABS(a) ((WELS_SIGN(a) ^ (int32_t)(a)) - WELS_SIGN(a))
|
||||
#endif
|
||||
|
||||
#define WELS_CLAMP(x, minv, maxv) WELS_MIN(WELS_MAX(x, minv), maxv)
|
||||
|
||||
#define ALIGNBYTES (16) /* Worst case is requiring alignment to an 16 byte boundary */
|
||||
|
||||
#ifndef WELS_ALIGN
|
||||
#define WELS_ALIGN(iInput) ((iInput+(ALIGNMENT-1)) & ~(ALIGNMENT-1))
|
||||
#endif
|
||||
|
||||
#define WELS_ALIGN2(iInput) ((iInput+1) & ~1)
|
||||
#define WELS_ALIGN4(iInput) ((iInput+3) & ~3)
|
||||
#define WELS_ALIGN8(iInput) ((iInput+7) & ~7)
|
||||
|
@ -37,7 +37,7 @@
|
||||
* 10/24/2008 Created
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include "macros.h"
|
||||
#include "downsample.h"
|
||||
|
||||
|
||||
@ -73,8 +73,8 @@ void GeneralBilinearFastDownsampler_c (uint8_t* pDst, const int32_t kiDstStride,
|
||||
uint8_t* pSrc, const int32_t kiSrcStride, const int32_t kiSrcWidth, const int32_t kiSrcHeight) {
|
||||
const uint32_t kuiScaleBitWidth = 16, kuiScaleBitHeight = 15;
|
||||
const uint32_t kuiScaleWidth = (1 << kuiScaleBitWidth), kuiScaleHeight = (1 << kuiScaleBitHeight);
|
||||
int32_t fScalex = (int32_t) ((float)kiSrcWidth / (float)kiDstWidth * kuiScaleWidth);
|
||||
int32_t fScaley = (int32_t) ((float)kiSrcHeight / (float)kiDstHeight * kuiScaleHeight);
|
||||
int32_t fScalex = WELS_ROUND((float)kiSrcWidth / (float)kiDstWidth * kuiScaleWidth);
|
||||
int32_t fScaley = WELS_ROUND((float)kiSrcHeight / (float)kiDstHeight * kuiScaleHeight);
|
||||
uint32_t x;
|
||||
int32_t iYInverse, iXInverse;
|
||||
|
||||
@ -142,8 +142,8 @@ void GeneralBilinearAccurateDownsampler_c (uint8_t* pDst, const int32_t kiDstStr
|
||||
uint8_t* pSrc, const int32_t kiSrcStride, const int32_t kiSrcWidth, const int32_t kiSrcHeight) {
|
||||
const int32_t kiScaleBit = 15;
|
||||
const int32_t kiScale = (1 << kiScaleBit);
|
||||
int32_t iScalex = (int32_t) ((float)kiSrcWidth / (float)kiDstWidth * kiScale);
|
||||
int32_t iScaley = (int32_t) ((float)kiSrcHeight / (float)kiDstHeight * kiScale);
|
||||
int32_t iScalex = WELS_ROUND((float)kiSrcWidth / (float)kiDstWidth * kiScale);
|
||||
int32_t iScaley = WELS_ROUND((float)kiSrcHeight / (float)kiDstHeight * kiScale);
|
||||
int64_t x;
|
||||
int32_t iYInverse, iXInverse;
|
||||
|
||||
|
@ -71,7 +71,7 @@ void BaseDecoderTest::TearDown() {
|
||||
|
||||
|
||||
void BaseDecoderTest::DecodeFrame(const uint8_t* src, int sliceSize, Callback* cbk) {
|
||||
void* data[3];
|
||||
uint8_t* data[3];
|
||||
SBufferInfo bufInfo;
|
||||
memset(data, 0, sizeof(data));
|
||||
memset(&bufInfo, 0, sizeof(SBufferInfo));
|
||||
@ -82,19 +82,19 @@ void BaseDecoderTest::DecodeFrame(const uint8_t* src, int sliceSize, Callback* c
|
||||
if (bufInfo.iBufferStatus == 1 && cbk != NULL) {
|
||||
const Frame frame = {
|
||||
{ // y plane
|
||||
static_cast<uint8_t*>(data[0]),
|
||||
data[0],
|
||||
bufInfo.UsrData.sSystemBuffer.iWidth,
|
||||
bufInfo.UsrData.sSystemBuffer.iHeight,
|
||||
bufInfo.UsrData.sSystemBuffer.iStride[0]
|
||||
},
|
||||
{ // u plane
|
||||
static_cast<uint8_t*>(data[1]),
|
||||
data[1],
|
||||
bufInfo.UsrData.sSystemBuffer.iWidth / 2,
|
||||
bufInfo.UsrData.sSystemBuffer.iHeight / 2,
|
||||
bufInfo.UsrData.sSystemBuffer.iStride[1]
|
||||
},
|
||||
{ // v plane
|
||||
static_cast<uint8_t*>(data[2]),
|
||||
data[2],
|
||||
bufInfo.UsrData.sSystemBuffer.iWidth / 2,
|
||||
bufInfo.UsrData.sSystemBuffer.iHeight / 2,
|
||||
bufInfo.UsrData.sSystemBuffer.iStride[1]
|
||||
|
@ -73,7 +73,7 @@ void BaseEncoderTest::EncodeStream(InputStream* in, EUsageType usageType, int wi
|
||||
|
||||
BufferedData buf;
|
||||
buf.SetLength(frameSize);
|
||||
ASSERT_TRUE(buf.Length() == frameSize);
|
||||
ASSERT_TRUE(buf.Length() == (size_t)frameSize);
|
||||
|
||||
SFrameBSInfo info;
|
||||
memset(&info, 0, sizeof(SFrameBSInfo));
|
||||
|
@ -19,7 +19,7 @@ bool YUVPixelDataGenerator( uint8_t* pPointer, int32_t iWidth, int32_t iHeight,
|
||||
const int32_t kiFrameSize = SRC_FRAME_WIDTH*SRC_FRAME_HEIGHT;
|
||||
BufferedData sBuf;
|
||||
sBuf.SetLength(kiFrameSize);
|
||||
if (sBuf.Length() != kiFrameSize) {
|
||||
if (sBuf.Length() != (size_t)kiFrameSize) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ struct SVCDecoderImpl : public ISVCDecoder {
|
||||
return static_cast<DECODING_STATE>(3);
|
||||
}
|
||||
virtual DECODING_STATE EXTAPI DecodeFrame2(const unsigned char* pSrc,
|
||||
const int iSrcLen, void** ppDst, SBufferInfo* pDstInfo) {
|
||||
const int iSrcLen, unsigned char** ppDst, SBufferInfo* pDstInfo) {
|
||||
EXPECT_TRUE(gThis == this);
|
||||
return static_cast<DECODING_STATE>(4);
|
||||
}
|
||||
|
@ -104,8 +104,8 @@ TEST_P(DecodeEncodeTest, CompareOutput) {
|
||||
}
|
||||
|
||||
static const DecodeEncodeFileParam kFileParamArray[] = {
|
||||
{"res/test_vd_1d.264", "028b5de8a9110223fc611d8a490c7bbb75d93974", 320, 192, 12.0f},
|
||||
{"res/test_vd_rc.264", "31b4b12d0f91b5407f39ad6f8622cab1366bff2b", 320, 192, 12.0f},
|
||||
{"res/test_vd_1d.264", "c73c1cc9b7dbab51f48cf41453073bb11337a445", 320, 192, 12.0f},
|
||||
{"res/test_vd_rc.264", "593ab31fdc67cbad7373abbf7d08daf2771fb229", 320, 192, 12.0f},
|
||||
};
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(DecodeEncodeFile, DecodeEncodeTest,
|
||||
|
@ -73,27 +73,27 @@ TEST_P(EncoderOutputTest, CompareOutput) {
|
||||
static const EncodeFileParam kFileParamArray[] = {
|
||||
{
|
||||
"res/CiscoVT2people_320x192_12fps.yuv",
|
||||
"8d4c87f48e8a679c1ccbf5fe1ee040fed4776b30", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 1
|
||||
"5fa8c8551133b7d7586f498121028d0e05a28e1d", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 1
|
||||
},
|
||||
{
|
||||
"res/CiscoVT2people_160x96_6fps.yuv",
|
||||
"75334dc69d95b8ac2e0a52977bba0179df4f151f", CAMERA_VIDEO_REAL_TIME, 160, 96, 6.0f, SM_SINGLE_SLICE, false, 1
|
||||
"c619645a7d46f8fade40d2b0e5ae01adc2e5c3ff", CAMERA_VIDEO_REAL_TIME, 160, 96, 6.0f, SM_SINGLE_SLICE, false, 1
|
||||
},
|
||||
{
|
||||
"res/Static_152_100.yuv",
|
||||
"3467201e18a934e7f8c50f3c8f3e05f4334ad12c", CAMERA_VIDEO_REAL_TIME, 152, 100, 6.0f, SM_SINGLE_SLICE, false, 1
|
||||
"68cde1b5f790213baab1a10d4a19a3618c138405", CAMERA_VIDEO_REAL_TIME, 152, 100, 6.0f, SM_SINGLE_SLICE, false, 1
|
||||
},
|
||||
{
|
||||
"res/CiscoVT2people_320x192_12fps.yuv",
|
||||
"a57c7cc8a00ffe8d8ca5527a13af1683a41b5150", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_ROWMB_SLICE, false, 1 // One slice per MB row
|
||||
"d0d0a087451c2813e9b0fd61bc5b25a4e82519ac", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_ROWMB_SLICE, false, 1 // One slice per MB row
|
||||
},
|
||||
{
|
||||
"res/CiscoVT2people_320x192_12fps.yuv",
|
||||
"bc9b203c1b031299df7981201c2af393994d876f", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, true, 1
|
||||
"d3760e61e38af978d5b59232d8402448812d1540", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, true, 1
|
||||
},
|
||||
{
|
||||
"res/CiscoVT2people_320x192_12fps.yuv",
|
||||
"ba81a0f1a14214e6d3c7f1608991b3ac97789370", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 2
|
||||
"a74ae382356098fb5cce216a97f2c0cef00a0a9d", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 2
|
||||
},
|
||||
{
|
||||
"res/CiscoVT2people_320x192_12fps.yuv",
|
||||
|
@ -272,7 +272,7 @@ void AnchorPredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]) {
|
||||
|
||||
int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
|
||||
int32_t iLeftTopType, iRightTopType, iTopType, iLeftType;
|
||||
int32_t iCurX, iCurY, iCurXy, iLeftXy, iTopXy, iLeftTopXy, iRightTopXy;
|
||||
int32_t iCurX, iCurY, iCurXy, iLeftXy, iTopXy, iLeftTopXy, iRightTopXy = 0;
|
||||
|
||||
int8_t iLeftRef;
|
||||
int8_t iTopRef;
|
||||
|
@ -63,17 +63,18 @@ TEST(DecodeMbAuxTest, TestIhdm_4x4_dc) {
|
||||
TEST(DecodeMbAuxTest, TestDequant_4x4_luma_dc) {
|
||||
short T[16],W[16];
|
||||
srand((uint32_t)time(NULL));
|
||||
for(int i=0;i<16;i++) {
|
||||
T[i]=rand()%256+1;
|
||||
W[i]=T[i];
|
||||
}
|
||||
|
||||
//TODO: QP<18 will cause case fail, need fix and enable the test afterwards
|
||||
for (int qp=18;qp<52;qp++) {
|
||||
for (int qp=0; qp<12; qp++) {
|
||||
for(int i=0; i<16; i++) {
|
||||
T[i]=rand()%256+1;
|
||||
W[i]=T[i];
|
||||
}
|
||||
WelsDequantLumaDc4x4(W,qp);
|
||||
for(int i=0;i<16;i++)
|
||||
EXPECT_EQ(((T[i]*g_kuiDequantCoeff[qp%6][0]+(1 << (1 - qp / 6))))>>(2- qp / 6),W[i]);
|
||||
}
|
||||
for(int i=0; i<16; i++) {
|
||||
T[i]= (((T[i]*g_kuiDequantCoeff[qp%6][0]+(1 << (1 - qp / 6))))>>(2- qp / 6));
|
||||
EXPECT_EQ(T[i],W[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(DecodeMbAuxTest, TestDequant_ihdm_4x4_c) {
|
||||
|
@ -18,18 +18,20 @@ TEST(MemoryAlignTest, GetCacheLineSize_LoopWithin16K) {
|
||||
|
||||
TEST(MemoryAlignTest, GetCacheLineSize_Zero) {
|
||||
CMemoryAlign cTestMa(0);
|
||||
ASSERT_EQ( 16, cTestMa.WelsGetCacheLineSize() );
|
||||
const uint32_t kuiSixteen = 16;
|
||||
ASSERT_EQ( kuiSixteen, cTestMa.WelsGetCacheLineSize() );
|
||||
}
|
||||
TEST(MemoryAlignTest, GetCacheLineSize_MaxUINT) {
|
||||
CMemoryAlign cTestMa(0xFFFFFFFF);
|
||||
ASSERT_EQ( 16, cTestMa.WelsGetCacheLineSize() );
|
||||
const uint32_t kuiSixteen = 16;
|
||||
ASSERT_EQ( kuiSixteen, cTestMa.WelsGetCacheLineSize() );
|
||||
}
|
||||
//Tests of WelsGetCacheLineSize End
|
||||
//Tests of WelsMallocAndFree Begin
|
||||
TEST(MemoryAlignTest, WelsMallocAndFreeOnceFunctionVerify) {
|
||||
const uint32_t kuiTargetAlignSize[4] = {32, 16, 64, 8};
|
||||
srand((uint32_t)time(NULL));
|
||||
|
||||
const uint32_t kuiZero = 0;
|
||||
for (int i=0; i<4; i++) {
|
||||
const uint32_t kuiTestAlignSize = kuiTargetAlignSize[i];
|
||||
const uint32_t kuiTestDataSize = abs(rand());
|
||||
@ -45,13 +47,13 @@ TEST(MemoryAlignTest, WelsMallocAndFreeOnceFunctionVerify) {
|
||||
ASSERT_TRUE( (((uintptr_t)(pUnitTestData)) & kuiExtraAlignSize) == 0 );
|
||||
EXPECT_EQ( kuiExpectedSize, cTestMa.WelsGetMemoryUsage() );
|
||||
cTestMa.WelsFree( pUnitTestData, strUnitTestTag );
|
||||
EXPECT_EQ( 0, cTestMa.WelsGetMemoryUsage() );
|
||||
EXPECT_EQ( kuiZero, cTestMa.WelsGetMemoryUsage() );
|
||||
}
|
||||
else {
|
||||
EXPECT_EQ( NULL, pUnitTestData );
|
||||
EXPECT_EQ( 0, cTestMa.WelsGetMemoryUsage() );
|
||||
EXPECT_EQ( kuiZero, cTestMa.WelsGetMemoryUsage() );
|
||||
cTestMa.WelsFree( pUnitTestData, strUnitTestTag );
|
||||
EXPECT_EQ( 0, cTestMa.WelsGetMemoryUsage() );
|
||||
EXPECT_EQ( kuiZero, cTestMa.WelsGetMemoryUsage() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -211,7 +211,7 @@ void MotionEstimateTest::DoLineTest(PLineFullSearchFunc func, bool vertical) {
|
||||
//it is possible that ref at differnt position is identical, but that should be under a low probability
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
TEST_F(MotionEstimateTest, TestVerticalSearch) {
|
||||
DoLineTest(LineFullSearch_c, true);
|
||||
}
|
||||
@ -238,7 +238,7 @@ TEST_F(MotionEstimateTest, TestHorizontalSearch_SSE41)
|
||||
DoLineTest(HorizontalFullSearchUsingSSE41, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
*/
|
||||
class FeatureMotionEstimateTest : public ::testing::Test {
|
||||
public:
|
||||
virtual void SetUp() {
|
||||
|
@ -15,6 +15,7 @@ EnableSpsPpsIDAddition 1
|
||||
|
||||
EnableFrameCropping 1 # enable frame cropping flag
|
||||
|
||||
MaxNalSize 0 # Unit:Byte, Maximum Nal size
|
||||
#============================== LOOP FILTER ==============================
|
||||
LoopFilterDisableIDC 0 # Loop filter idc (0: on, 1: off,
|
||||
# 2: on except for slice boundaries,
|
||||
|
@ -15,6 +15,7 @@ EnableSpsPpsIDAddition 1
|
||||
|
||||
EnableFrameCropping 1 # enable frame cropping flag
|
||||
|
||||
MaxNalSize 0 # Unit:Byte, Maximum Nal size
|
||||
#============================== LOOP FILTER ==============================
|
||||
LoopFilterDisableIDC 0 # Loop filter idc (0: on, 1: off,
|
||||
# 2: on except for slice boundaries,
|
||||
|
@ -15,6 +15,7 @@ EnableSpsPpsIDAddition 1
|
||||
|
||||
EnableFrameCropping 1 # enable frame cropping flag
|
||||
|
||||
MaxNalSize 0 # Unit:Byte, Maximum Nal size
|
||||
#============================== LOOP FILTER ==============================
|
||||
LoopFilterDisableIDC 0 # Loop filter idc (0: on, 1: off,
|
||||
# 2: on except for slice boundaries,
|
||||
|
@ -15,6 +15,7 @@ EnableSpsPpsIDAddition 1
|
||||
|
||||
EnableFrameCropping 1 # enable frame cropping flag
|
||||
|
||||
MaxNalSize 0 # Unit:Byte, Maximum Nal size
|
||||
#============================== LOOP FILTER ==============================
|
||||
LoopFilterDisableIDC 0 # Loop filter idc (0: on, 1: off,
|
||||
# 2: on except for slice boundaries,
|
||||
|
@ -15,6 +15,7 @@ EnableSpsPpsIDAddition 1
|
||||
|
||||
EnableFrameCropping 1 # enable frame cropping flag
|
||||
|
||||
MaxNalSize 0 # Unit:Byte, Maximum Nal size
|
||||
#============================== LOOP FILTER ==============================
|
||||
LoopFilterDisableIDC 0 # Loop filter idc (0: on, 1: off,
|
||||
# 2: on except for slice boundaries,
|
||||
|
Loading…
x
Reference in New Issue
Block a user