ref: 2e6f180e952b0016070086d73030b9b8a5892bf6
parent: 3b78290cd3af73d9e28c5bf25d897728d640fe4a
author: ganyang <[email protected]>
date: Thu May 22 15:39:43 EDT 2014
remove max slice number constraint
--- a/codec/encoder/core/inc/wels_const.h
+++ b/codec/encoder/core/inc/wels_const.h
@@ -176,6 +176,8 @@
#define MAX_ACCESS_UINT_CAPACITY (1<<20) // Maximal AU capacity in bytes: 1024 KB predefined
#define MAX_ACCESS_UNIT_CACHE_NUM 2 // Maximal Access Unit(AU) cache number to be processed, denote current AU and the next coming AU.
+#define SLICE_NUM_EXPAND_COEF 2
+
enum {
BLOCK_16x16 = 0,
BLOCK_16x8 = 1,
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -58,7 +58,8 @@
int32_t WelsCodeOnePicPartition (sWelsEncCtx* pCtx,
- SLayerBSInfo* pLbi,
+ SFrameBSInfo* pFrameBsInfo,
+ SLayerBSInfo* pLayerBsInfo,
int32_t* pNalIdxInLayer,
int32_t* pLayerSize,
int32_t iFirstMbInPartition, // first mb inclusive in partition
@@ -1588,6 +1589,11 @@
if (NULL != pDq->sLayerInfo.pSliceInLayer) {
int32_t iSliceIdx = 0;
int32_t iSliceNum = GetInitialSliceNum (pDq->iMbWidth, pDq->iMbHeight, &pDlp->sSliceCfg);
+ if (pDlp->sSliceCfg.uiSliceMode == SM_DYN_SLICE && pCtx->iActiveThreadsNum == 1) {
+ if (iSliceNum < pDq->pSliceEncCtx->iMaxSliceNumConstraint) {
+ iSliceNum = pDq->pSliceEncCtx->iMaxSliceNumConstraint;
+ }
+ }
if (iSliceNum < 1)
iSliceNum = 1;
while (iSliceIdx < iSliceNum) {
@@ -3117,7 +3123,7 @@
// for dynamic slicing single threading..
else if ((SM_DYN_SLICE == pParam->sSliceCfg.uiSliceMode) && (pSvcParam->iMultipleThreadIdc <= 1)) {
const int32_t kiLastMbInFrame = pCtx->pCurDqLayer->pSliceEncCtx->iMbNumInFrame;
- pCtx->iEncoderError = WelsCodeOnePicPartition (pCtx, pLayerBsInfo, &iNalIdxInLayer, &iLayerSize, 0, kiLastMbInFrame, 0);
+ pCtx->iEncoderError = WelsCodeOnePicPartition (pCtx, pFbi, pLayerBsInfo, &iNalIdxInLayer, &iLayerSize, 0, kiLastMbInFrame, 0);
WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
} else {
//other multi-slice uiSliceMode
@@ -3680,8 +3686,112 @@
return 0;
}
+int32_t DynSliceRealloc(sWelsEncCtx* pCtx,
+ SFrameBSInfo* pFrameBsInfo,
+ SLayerBSInfo* pLayerBsInfo) {
+ CMemoryAlign* pMA = pCtx->pMemAlign;
+ SDqLayer* pCurLayer = pCtx->pCurDqLayer;
+ int32_t iCountNals = pCtx->pOut->iCountNals;
+ int32_t iMaxSliceNumOld = pCurLayer->pSliceEncCtx->iMaxSliceNumConstraint;
+ int32_t iMaxSliceNum = iMaxSliceNumOld;
+ iCountNals += iMaxSliceNum * (pCtx->pSvcParam->iSpatialLayerNum + pCtx->bNeedPrefixNalFlag);
+ iMaxSliceNum *= SLICE_NUM_EXPAND_COEF;
+
+ SWelsNalRaw* pNalList = (SWelsNalRaw*)pMA->WelsMalloc(iCountNals * sizeof(SWelsNalRaw), "pOut->sNalList");
+ if (NULL == pNalList)
+ return ENC_RETURN_MEMALLOCERR;
+ memcpy(pNalList, pCtx->pOut->sNalList, sizeof(SWelsNalRaw) * pCtx->pOut->iCountNals);
+ pMA->WelsFree(pCtx->pOut->sNalList, "pOut->sNalList");
+ pCtx->pOut->sNalList = pNalList;
+
+ int32_t* pNalLen = (int32_t*)pMA->WelsMalloc(iCountNals * sizeof(int32_t), "pOut->pNalLen");
+ if (NULL == pNalLen)
+ return ENC_RETURN_MEMALLOCERR;
+ memcpy(pNalLen, pCtx->pOut->pNalLen, sizeof(int32_t) * pCtx->pOut->iCountNals);
+ pMA->WelsFree(pCtx->pOut->pNalLen, "pOut->pNalLen");
+ pCtx->pOut->pNalLen = pNalLen;
+
+ pCtx->pOut->iCountNals = iCountNals;
+ SLayerBSInfo *pLBI1, *pLBI2;
+ pLBI1 = &pFrameBsInfo->sLayerInfo[0];
+ pLBI1->pNalLengthInByte = pCtx->pOut->pNalLen;
+ while (pLBI1 != pLayerBsInfo) {
+ pLBI2 = pLBI1;
+ ++ pLBI1;
+ pLBI1->pNalLengthInByte = pLBI2->pNalLengthInByte + pLBI2->iNalCount;
+ }
+
+ SSlice *pSlice = (SSlice*)pMA->WelsMallocz( sizeof(SSlice) * iMaxSliceNum, "Slice");
+ if (NULL == pSlice)
+ return ENC_RETURN_MEMALLOCERR;
+ memcpy(pSlice, pCurLayer->sLayerInfo.pSliceInLayer, sizeof(SSlice) * iMaxSliceNumOld);
+ uint32_t uiSliceIdx;
+ uiSliceIdx = iMaxSliceNumOld;
+ SSlice *pBaseSlice = &pCurLayer->sLayerInfo.pSliceInLayer[0];
+ SSliceHeaderExt *pBaseSHExt = &pBaseSlice->sSliceHeaderExt;
+ SSlice *pSliceIdx = &pSlice[uiSliceIdx];
+ while (uiSliceIdx < iMaxSliceNum) {
+ SSliceHeaderExt *pSHExt = &pSliceIdx->sSliceHeaderExt;
+ pSliceIdx->uiSliceIdx = uiSliceIdx;
+ if (pCtx->pSvcParam->iMultipleThreadIdc > 1)
+ pSliceIdx->pSliceBsa = &pCtx->pSliceBs[uiSliceIdx].sBsWrite;
+ else
+ pSliceIdx->pSliceBsa = &pCtx->pOut->sBsWrite;
+ if (AllocMbCacheAligned(&pSliceIdx->sMbCacheInfo, pMA))
+ return ENC_RETURN_MEMALLOCERR;
+
+ pSliceIdx->bSliceHeaderExtFlag = pBaseSlice->bSliceHeaderExtFlag;
+ pSHExt->sSliceHeader.iPpsId = pBaseSHExt->sSliceHeader.iPpsId;
+ pSHExt->sSliceHeader.pPps = pBaseSHExt->sSliceHeader.pPps;
+ pSHExt->sSliceHeader.iSpsId = pBaseSHExt->sSliceHeader.iSpsId;
+ pSHExt->sSliceHeader.pSps = pBaseSHExt->sSliceHeader.pSps;
+ pSHExt->sSliceHeader.uiRefCount = pCtx->iNumRef0;
+ memcpy(&pSHExt->sSliceHeader.sRefMarking, &pBaseSHExt->sSliceHeader.sRefMarking, sizeof(SRefPicMarking));
+ memcpy(&pSHExt->sSliceHeader.sRefReordering, &pBaseSHExt->sSliceHeader.sRefReordering, sizeof(SRefPicListReorderSyntax));
+
+ pSliceIdx++;
+ uiSliceIdx++;
+ }
+ pMA->WelsFree(pCurLayer->sLayerInfo.pSliceInLayer, "Slice");
+ pCurLayer->sLayerInfo.pSliceInLayer = pSlice;
+
+ SRCSlicing *pSlcingOverRc = (SRCSlicing *)pMA->WelsMalloc(iMaxSliceNum * sizeof(SRCSlicing), "SlicingOverRC");
+ if (NULL == pSlcingOverRc)
+ return ENC_RETURN_MEMALLOCERR;
+ memcpy(pSlcingOverRc, pCtx->pWelsSvcRc->pSlicingOverRc, sizeof(SRCSlicing) * iMaxSliceNumOld);
+ uiSliceIdx = iMaxSliceNumOld;
+ SRCSlicing *pSORC = &pSlcingOverRc[uiSliceIdx];
+ while (uiSliceIdx < iMaxSliceNum) {
+ pSORC->iComplexityIndexSlice = 0;
+ pSORC->iCalculatedQpSlice = pCtx->iGlobalQp;
+ pSORC ++;
+ uiSliceIdx ++;
+ }
+ pMA->WelsFree(pCtx->pWelsSvcRc->pSlicingOverRc, "SlicingOverRC");
+ pCtx->pWelsSvcRc->pSlicingOverRc = pSlcingOverRc;
+
+ int16_t *pFirstMbInSlice = (int16_t *)pMA->WelsMalloc(iMaxSliceNum * sizeof(int16_t), "pSliceSeg->pFirstMbInSlice");
+ if (NULL == pFirstMbInSlice)
+ return ENC_RETURN_MEMALLOCERR;
+ memcpy(pFirstMbInSlice, pCurLayer->pSliceEncCtx->pFirstMbInSlice, sizeof(int16_t) * iMaxSliceNumOld);
+ pMA->WelsFree(pCurLayer->pSliceEncCtx->pFirstMbInSlice, "pSliceSeg->pFirstMbInSlice");
+ pCurLayer->pSliceEncCtx->pFirstMbInSlice = pFirstMbInSlice;
+
+ int32_t *pCountMbNumInSlice = (int32_t *)pMA->WelsMalloc(iMaxSliceNum * sizeof(int32_t), "pSliceSeg->pCountMbNumInSlice");
+ if (NULL == pCountMbNumInSlice)
+ return ENC_RETURN_MEMALLOCERR;
+ memcpy(pCountMbNumInSlice, pCurLayer->pSliceEncCtx->pCountMbNumInSlice, sizeof(int32_t) * iMaxSliceNumOld);
+ pMA->WelsFree(pCurLayer->pSliceEncCtx->pCountMbNumInSlice, "pSliceSeg->pCountMbNumInSlice");
+ pCurLayer->pSliceEncCtx->pCountMbNumInSlice = pCountMbNumInSlice;
+
+ if (pCtx->iMaxSliceCount < iMaxSliceNum)
+ pCtx->iMaxSliceCount = iMaxSliceNum;
+ pCurLayer->pSliceEncCtx->iMaxSliceNumConstraint = iMaxSliceNum;
+ return ENC_RETURN_SUCCESS;
+}
int32_t WelsCodeOnePicPartition (sWelsEncCtx* pCtx,
+ SFrameBSInfo* pFrameBSInfo,
SLayerBSInfo* pLayerBsInfo,
int32_t* pNalIdxInLayer,
int32_t* pLayerSize,
@@ -3701,6 +3811,7 @@
const EWelsNalUnitType keNalType = pCtx->eNalType;
const EWelsNalRefIdc keNalRefIdc = pCtx->eNalPriority;
const bool kbNeedPrefix = pCtx->bNeedPrefixNalFlag;
+ const int32_t kiSliceIdxStep = pCtx->iActiveThreadsNum;
int32_t iReturn = ENC_RETURN_SUCCESS;
//init
@@ -3715,10 +3826,13 @@
int32_t iSliceSize = 0;
int32_t iPayloadSize = 0;
- if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) { // insufficient memory in pSliceInLayer[]
- // TODO: need exception handler for not large enough of MAX_SLICES_NUM related memory usage
- // No idea about its solution due MAX_SLICES_NUM is fixed lenght in relevent pData structure
- return ENC_RETURN_MEMALLOCERR;
+ if (iSliceIdx >= (pSliceCtx->iMaxSliceNumConstraint - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
+ if (pCtx->iActiveThreadsNum == 1)
+ if (DynSliceRealloc(pCtx, pFrameBSInfo, pLayerBsInfo)) //only single thread support re-alloc now
+ return ENC_RETURN_MEMALLOCERR;
+ else if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
+ return ENC_RETURN_MEMALLOCERR;
+ }
}
if (kbNeedPrefix) {
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -62,8 +62,7 @@
const int32_t kiGomSize = pWelsSvcRc->iGomSize;
const int32_t kiGomSizeD = kiGomSize * sizeof (double);
const int32_t kiGomSizeI = kiGomSize * sizeof (int32_t);
- const int32_t kiLayerRcSize = kiGomSizeD + (kiGomSizeI * 3) + sizeof (SRCSlicing) * kiSliceNum + sizeof (
- SRCTemporal) * kiMaxTl;
+ const int32_t kiLayerRcSize = kiGomSizeD + (kiGomSizeI * 3) + sizeof (SRCTemporal) * kiMaxTl;
uint8_t* pBaseMem = (uint8_t*)pMA->WelsMalloc (kiLayerRcSize, "rc_layer_memory");
if (NULL == pBaseMem)
@@ -77,12 +76,16 @@
pBaseMem += kiGomSizeI;
pWelsSvcRc->pGomCost = (int32_t*)pBaseMem;
pBaseMem += kiGomSizeI;
- pWelsSvcRc->pSlicingOverRc = (SRCSlicing*)pBaseMem;
- pBaseMem += sizeof (SRCSlicing) * kiSliceNum;
pWelsSvcRc->pTemporalOverRc = (SRCTemporal*)pBaseMem;
+
+ pWelsSvcRc->pSlicingOverRc = (SRCSlicing*)pMA->WelsMalloc(sizeof (SRCSlicing) * kiSliceNum, "SlicingOverRC");
}
void RcFreeLayerMemory (SWelsSvcRc* pWelsSvcRc, CMemoryAlign* pMA) {
+ if (pWelsSvcRc != NULL && pWelsSvcRc->pSlicingOverRc != NULL) {
+ pMA->WelsFree (pWelsSvcRc->pSlicingOverRc, "SlicingOverRC");
+ pWelsSvcRc->pSlicingOverRc = NULL;
+ }
if (pWelsSvcRc != NULL && pWelsSvcRc->pGomComplexity != NULL) {
pMA->WelsFree (pWelsSvcRc->pGomComplexity, "rc_layer_memory");
pWelsSvcRc->pGomComplexity = NULL;
@@ -89,7 +92,6 @@
pWelsSvcRc->pGomForegroundBlockNum = NULL;
pWelsSvcRc->pCurrentFrameGomSad = NULL;
pWelsSvcRc->pGomCost = NULL;
- pWelsSvcRc->pSlicingOverRc = NULL;
pWelsSvcRc->pTemporalOverRc = NULL;
}
}
--- /dev/null
+++ b/res/Cisco_Absolute_Power_1280x720_30fps.yuv
@@ -1,0 +1,3607 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+^_c`aa`_^]``___^^^__^__]SPA;8755655476354334412231220.1110..010.-//.--..178:879:96::9:99:::;;<<;=><<<??@??BB@@@A@@BCBCDDDDEDCDEDCCCEDEDEFFGFFDFHGFFGFFGGFEGGHIIIFGIIHIHHJJKIHIIJJHIJLKJKJIJKKIKKKKKLLLJLLKLMMMLKKMMLLMLLLLMMMMNNLNNKLMNNNNMKMNNNMNOPPNNMLMOPPPPPPQONOOPONPPPPOPPRQPOQQPPQQPQRQPOOQRRSRRRPPQRQQRQQSSQRRQQRRPOQQRSRQRRRRTTRRRSRQSRRRSSRRRQSTSSTSRSSRTTTSTTSUTTTRSTSUUTTTSSSUTTTUVVUUUUUUUUUUVTTTVUTUVWVUVXVSUXVSUUVVTUUUVWUUWXXVUVXWXXVVWWTUVUWXYVVUUVWXVVVWXXWVVXYXWWWWWWXXXYXYXXWWXYXWWXXXVXVVVXXXXXXXXYYXXZZYYWWYXYZYYZZZYWWXZYWXXXY[[YXXXXXYYWWYYZYZZYXWYYXYYYYYYZYXXYXYXWZXX[[\ZZZ[[YZYYYYXWWY[ZXYZZZZYYZY[ZXYZYZ[YXX[\ZYXXXZZXYYWYYZZZZZYWXXXYZYXWXZZYXXYYZXWXYXWXXZZZYYXXYYYZYYZYXXYZZZYY[YYZZZZYYYXZYZ[YXXXXXYZZZZXXYYYYXXXXXYXXZZYXXXXXXYXXXYXXXXXYYYWWXWXYXYYXXYXWVWXXXWZYWWWWWWWXXWVXXXXXVVXXWWWVXXWWVVXYTTVVTVXWWVUVVUUVVVVVVUUUWVVVVUTVUVVVXWTVWUUVUUWUTTUUUVUTVWTTUUUUUTUWUUUTUUTTUTTSUUUUTTTVVUUSSSTUTTUTVSRSSTTTUSTSUTSTSSSTSSTRRTSRRRQRTSRSSSSTQQSRSSQRRTSQQQRROQRQRSRPQQQRRQTSPPRRQQPQRRQPPQPQQQQQQQPQPPPOPQONPQPOPQQQOPPOOPOOPONOOOOPQPPOOPQPOOOOPPOMOONOOONMMMNONOPONNOPQNLMNONMMOPNNONMMMLOONMMLLLNMMMMMLLLMOOMLKLLLKMMMNLKMMKLNMNLKLLLLLLKKLLJILMNNLKKKLKMMLMMKJJKKKMKJKJKKJKKKJJKKKKKKJIHILLJJJIJJJIKKJJIJKJHIHHIJJIHIKJJHIJHGKKKKHHIIIGGJHGHIIIIIIIIHGHHHFHHHGHGHIJIHGGGHIHGFEFGGGFFEFGGFF������������������������zqcWOKHJKIKLNIGHHHIJFCDDEEEFDCDECBA@ADCA@A@@=<?@EKNQPMNSRMNQPOOSUVTTUUUSVYWWX[Z\\]]]]\\^^\]_^aabbbcbaabcabcd`abbceddecbgheeihehgfffgjjjjggihijiijkkkkkkkkikkllmnljlnmjlnooopomnomnoooppnmmooonpqqppqqoqqpqonnprsrrtsrsqrrqrttsssopuvvvutstsvvuutttttsttsvvtuutuuvuvwvsuvwxxvuwvvuwwvtvyxuwvuyywwwxwwzyyzyxywwxz{{xwyxxxyywxzxxwxzzyz{{y{{xyz{|}|{zz{{zz{{~|{{|zyz}}~}{{}|}~}}~||{||}|}~}~~}~~|z~�}||{}|||}�~~��~}~����~��~~��~~���~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~�������������~��������������������~�������~��~|~�~��~~~}~���|}~|}}}}~}{~�~}}~~�}}�}|}~}~~|}}}|}|~}}{||~}}{{~}||}||~||{}~}}|{zz~}|}|}{zzzzz||zzzzzzzyyzzyz{yxxwyyzz{|xxzzzyzyxyxyyvwxzzywwxxuvwxzxwxwtvywxzwuwwwwwuwxxxwvwvtwxuvvvuuuttsuwttutuuuvvvuuursusrtuuusssruuuuusuusttttttqtutstuspqqrsrrrrrrsvuppqssrssttsrrroqpqrrrooooopppqqqpooqsrqpnnonmopprpnnponnnonmnnoooommnonjlnqrpmkmonnnnpnmklmllllmmmomllmmklnnlllkkmkkmnlkkkjjkllkmmklmmlihhglojhiklkiikigklmkjiikjggkjjiikllkijjiihgffhihhfdhjiihhgfhjkgefheeffeddeffe������������������������rndVLJFIKIJJIGDFFEEDAABBBC@DCCCB@@?><<>A@@@?<==@EIJMNMIMPLKMNNMPQQQRQQSSTTVWUTVXZZXXXY[[[\[[[]^_^^_^]]^__``__``^_a`a`^_baaacfcdfecaceedddefdbdccddfigghhgffffgijiiijjhghkjklkiijjjijlmllkkmnlkmnljllmlllljkllmnnnoonoploqllnnnnonlnoppooonmppnoppooopqpprqpqpopppqrqpopprstsnorpprsqprtsprsrrsssrssttsutsuusrsttvvqsttrttsuvrqrruwutvuuuwutsuxwvwusuvvvvvwvwxwvuvwxyyzxwvwwvvwvxxxxxvwwwvyzywyyyyzyxwxxwwxxwxxyy|{zzwvxyy{z{{zzz{|}|zyzz||}|zxz{|||{{{{{{zy{{z{{zzzzzxvx{{zz}}||{}~}||||}}|||}}|{}~|}|}~}||}�~|}~|~{~~~~}~}~~~}~�~~~~}|}~�~~~|}}|~~}}~~~~~}~~�}}}~~��~~}{}~��}}~~}~���}~~}|~~~}��}}~��}|}~}~~~��~|~~}~�}~�~~~~~|}}~}~�~~|{}���~}{����~}~}~~}~��~~}}}|~~~~}}}}}~}{}}{}~}z{�~~}}|{{{~}}}~z|}}yz}}}zz||z|}{|{{}|z{{z|{{{zz|}|{z|}yy{yxyzyy||zz{yyyyyxxww{{zywyzwxyxvwxxxxwwyxzwwyzzyxyxxyz|{xwwxxzyxvxwxyywuuvxywvwyxvwxwvwvvuvvxxyywvyxvvwwwuvvvwwwvvvvttvtsuttuvvvsruuuvwvttusststtrrtssrtvutssusrrsttsrrqostqsutttpqssssrrssssporvppqqsqprqooqppnqrrqrqrsqqopqonnpqonnonoorqpooonoponopopqonoponoonoonnlmononllnppoopmnmmmljlmmnmlkmkllkllllllkjjkllmlknkjjjkljkhjkiijjiiijjjjjikklmifhklkiijihjghkjjiikjghijjjjhhhghfijigfhhgighhhhfiidfjhggihgghihggfeghfcfgigfdggfddgefeefgdefggedeggddeeffdcacdcccdcddcdddcbcebccfedbbcaa``acb�����������
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+_`a__`_aa____bba]_a_^a`]UMD<6555445555445322342002222110/120////0/,//--.5:6676778::::9:<::;<<<=====>>@??@AA@@@@AAAACCABDDEFEDDDCECCEFEFFEEFFDEGHGGHJIHGHHFGGGHHIJJIJKJHGEIIHIJKKKJIJKKJHJJJJKKLJIKLLKLNMKKLKLLLKMNMLLNLLLMMMNNNONNMLLOOOOOOQPOMMMONMORPMNPOOONNPOQOOPPNOPPOOPQPQQPPOOQQPQQQQQRQOOQQRPPQPRSRSRQQRRQPRSSRRSQPRRQQQRRRQRSTRSRQRRQQSSSTUQSUTRTUTRRSSQRTTSUTSSSSSTTTSSTVUUUUUVTSTTTVVUTTTTTUVUUTTTSTUTSTTTUVUVVVUUUUUTSUVWVVVUVWWVUVWWXWVVVUWWWVVWWVVWWWWWWWXWVWXXWXVUVXWXWWXWXZWWWXYZWWXXYXYZYVUWWWXWXXXYXXYXXWXXXXXYZWYZXWXXXXYYYYXYYXXXXXXXZ[YZZZZ[ZYZZYXZZZXZYYYYYYYYYY[ZYZZZZZZZZ[ZYYYXZ\[YXXY[ZYZYXZ[ZXYZ[ZZZZZ[ZYYYYZZZYXY[[ZZZZYYXXYXYXXXZZYXZZYYXXXWZ[YXZ[ZZYYYYZZYXYZYYZXZZXYZ[ZYXXYYXYY[[[ZYXYZZYYYXXXZYXYYXZ[ZZYXWXXYXXYYZZYXXYYXYYYYXXYZXXYYXWWXWXZYWWWXYYXXXXXXWWYWXXXYXXYXXXYVVXWXXXWWUVWXYXWWWXXYVVWXXWXWVWVVWVVXWWWVVWVWWVVUVXVVUUWVUVWVUVVTTUVVUUSTUTUUUVVWWVUTUVWVVWVUUTTTTTTUVVUTTTSTUTTSTUTVTSTUVUUUTTTUUSRRRSRSTSSRSTTUUTUVTTSRRTSSSTSQRTTTRRRRSQRSPQSRSRRRRRPQTRQRRRQQRQQQQQQQQOQSROPRPOQQQPQQPNPQPQQQQPQRQPPONQRSPQQPPPOOOPPPPROOPPNNONOOOOMNPQMOPPQQOOOPNOPPONQPONONOOMOONNNOOMLOOMMMLNNOOONMOPNMMMMNNMMLLKLOONMMMNLLLMLLLLLLLLMLJJMMMMLLKLNMNLKMMLKKNLIJKMMLKKLLLLKLLKKLJHJJJKKKLJKLKLKJKJKLKKKJKJGHKLKJJJJJIHIKKJJJJKJJJHHJKIHIKKJJKJIIHGHIIIHHGIIIHHGIIJKJHGGHHIIIHGHHHGGGHGFFFGGFHGFEEGG������������������������{paVOKKLIIKKJKIIHFFFFHFCCEECDBDBACA@AA@AC@=>?<<=FSQNONPPPPQRQSTQQRUUTUWWWWWUW[YZ\\\\\]]]^\\^]]ababdaaaaaa`abccedadffddfffffhgehfedfffhjjjijhjiijjljgfjmmmllmlmmlllmkilnljllmnoqommmnonnnorooqsopppnoqppqsqpqpqsssrtttsqpqrqossrrrtstsrrsruuuttttvuuttustwuutsuvxwvwutuuuuvvvtvutxwwyvvwxvuuwywvxzwvwwuvwxzyxyxzyyzyyyxyzzz||yz|{yyyzyyzzyz{zz{{zyz{{{zzyz|~}||{~~{{}~~~}}{{zz{|}}|{|zyz|z{||||~{|}|}}~~}~}}~}|}~��~���~~~~~~�~~~~~}}�������������~~���~��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~�����}~��~�~~~}�~}|}�~}|}~{|}~~}}}{}|{z|}}}~��~{{~�}}~~}|||{z|~}}{z{||{{||}}}{zzz}~|{{z|}}}||yyy{|{xxy{{|}||}{z{zz{xxyzzwwyyzxwwyywywuxyyyxwwyxwxzyxyyxwwxvvuuxvvwvwxwtsuusuxvvxwvuwwvvvvuuvvvuuuvxxwtvwwvttustuvvvrrstsstsuuuvtqrttuuuvtoqqssrutsstsstqoqrssssrrrrrpturpporrprrronqqqssrqsrononmsrppnppopopnnonnomoqnlnonoponnopqonoqpommpollmnonmllmmmlmmmnnjjknmnnnmkmnmmnmklmnmlmkkjiknmnljjiikjjkkkjillklkjijlihhjlkilkjjijjjhgghiiijjghiiikkihhiihihggfgggigffffeegcfhfefhh������������������������wj]UMIKNHGJIHKGGDEFDBDFDBABBA@A??@@?;=;=<<>>>;:;AJKKMNNMJMONMOQONNPRQQRQSTSSUXYWWWXXXZZXXXZ[Z[^^]]]\]]\]^]^^^`ca^^_`c_`bbacbabeda_aa`fgfeceefddefffgdffhiijijhhgfikigiihhhhhillhgkkjikkjjkkkkmmmlklkjkkklmkmmjkoomnlkmlmpmklnmmnmnnonmmnooqppqrpoppopnmnqopoorprrpqooqqrtpnoprrqqprstssqrtqrrrqstssspststvuutrssswwvvwutstuttvwutstvvttxxwvttwxwuuvvvuuuuswxwuvxwwwzyzywwvuuwwvwwvuwvuuvvxzyvvwwwzyxwxxyz{zwvxxyyxyyz|}{xzz{{yzz{zzzxxxxyyz{}|{{|||{{{{|{z{zyzzzz{||{yz{{yzyy|{yz|||}}}|{||||~}{yz|}}}|{|~|}}{|{|~~~}}}|}|}}~~|~~}��}z{||}}||~~~~}}}~�}|~~~~~~~�{~�}|���|~�|{{{}}}~~~~}}��~��~~}|}~}}}~|�~����}|~}}~��~~~~}{~}~�}~}}��}}~~}}{}~~}�~~~||~||~}~}|}~}}|{~~}}|~~~~~~}}~~}}}}||}}|}||||}~~}||~~|{}~}}|{|{z}~{x{zxx|{|}}|z{|||zzyzyz{zz{||yz{{yzxwyzy{zy|zyxwwxzzzyyyyzxxwwyywvzzxy{{zz||wwzzyvvyyyxzzzzwvwxzzyvwyyyvwxxvvvwxyxvwwwyxwwvwxxwuuxxvvvvvuvvwxuuuvvustussvvtvvtttvwvtuuvvtuurtursttssqquuutqrrturtustutsrsssspotsqssrrsppppopsqprsrqsspopqrrrooprprsrprrqqqqqpopoqqooomoqopooppqppoprpnoonloonnopnmmnnnolkmnoooonnmmnnmnnmnmnmlnmnligloommlmlklljjmljklkjjkkljiikmnhhiiinmijlliijkmkjlkjijijjhiiijiihfiigijjjjigfhihijhghkggijjhgihfhigfghhfdfecefffgifehgfggefgfdefccbdfedfgefffedcdcdfedeeddceddeccded`acefcbdeecbbddbbbabbbaacb������������������������vi`TJLKIHG
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+^_aa`_`_^`_``a_][]]_`_\YQMF=76767654453464342212312200/0/0100/.-.///-,.02687768999999:9;;;=>=;==<=>>>>=>=@@@A@?BCAACC@CBBCBBBCEFDBDEEEEEFGHGFEGFEFGGGHIFEGHGHHHHGEGHIIHHIJIHIHJKJKKHHKJJIJJILMLLLJJKKJLKJMNKLKKLKKLMOOOMLMNMJLMMMLNNLLLLNONNOONNMNNNMNONNNONNOOOOONOOPPOOQPNPOOQQNOPQQRQOOQQRPNPQPOPPQRPOPPQQQQRSROORRRRRRQQQQRSRPPSRRRRRRQQRRTRRTTSRSSSSUTSSTRSSQRTTSSSSSSTTTRRSTTTTRSTTTTTUVUUUUUTTTTUVVTTTUUWVUUVVVUUUTTUWVUTVWUUUUUUUUTVWVVUWWVVWVWXVVWVVWWWXXWWWWVVWWXXVUVWWWVVXYYWWWWXYXYYXWXXXYXWXWUVXXXYYXWWYYYYXYZYYXXXXYYY[ZXXYZYYYXXYYWXYZZYXXXXXXXXXXYYZYYYZXXXX[ZZYYYYYWXYY[YYWWXYZ[ZYYYXXZXXZ[ZZZXW[YXZYZYYYXX[YYYYYYYZZZZ[[ZZYWXZ[YY[XYYXZZZZZXYZZZZZ\[YYWZ[XXZZZXYZZYZY[ZXYYXXZZZ[XXYYYYZZZZYYZXWYYYYXYYZZZYYYYYZZZZZXYYYYYYYZYYXYXYYXXYZYXXXXXXWVWXYZYXXXWXYXXXWXYYYYWXXXXXVWWVWWXWVVWWXXWWXVVXWUVWWWXYVWXXVVVVWVWVVWVUVUVUVVWVUUVWVUXWUUWVWVVVUVVTTUUUUUVWVUUUWWUUVVTUVVUTVUTSVVTUVUTUVUTTTTVURSTSUVTRTTUUSTTTUVSQTUTSTTTTSUTSRTTTSSRQTSSSSSSRRRRRSSRRSSRSRRSSSRSQRSSSRRRRRRQQSTQQSSRQQPPRQPOQSQOPRQQRRRQQQQQQPPQPOORPPQQNNOQRQQONOPPOOOPPPPOOMOPOOONMOONPQPPPPNNONMNONOPPONNNNMNONNNMMNPONNNOONMLLMONMNNMMMNNLLMMMNLLLNONMMMLMNKKMNNMLMMMLLMMPOMNMLLLKLLMMLKKMKKLLMMMLLKMMMMLLJKLKKKKJKKJKJJLKIIIJLJJJKKJLJJIJKLMKHIIIIKKJJJJJJIJIJLKIJIJJIJIIIIKJJJIIIIIIIJJIHHGJJHIIIIIFGHIIEFFFFFHHGHHIHIHHGEGIKHHHFGHHGGG������������������������ypdXLJKNOLLKLKIJKHGIIEEEEFHDADDCB@>@A@AA@@B@=;@DEJNNNNQQOOQOORRRSRRSUUWSRVXXXWWZ\]Z\^\Z^^Z[_`^a`__aba_`cd`acdddddgfeedggddefhhheddffhhhhgegjjiggjkiijilnkklkjmmlkjjhjnmnmmnnonllmproonnmnnppqspnonponppqqoqqnopoqsrqsrpqqqrqpqrpqqrtqststsrstuvttuursssttstvvxxvtruwtvvvvwutvwxutvwustvyzwtvxxywwwwwxyxyxusuwxyxxwwxzzyyxxyyzzyz|{yzzzwzzwy||{zyzyz{z|zy{||{{zz{|{|~~~}|}||{{{{|}~|{}~|}|||||||}}�}}}~}}}}~�~||~�~~�~~}�~~�����������}��~~���������������������������������������������������������~��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~���������}}~��~������~~�~}~~��~��~~~~~}~~||}|{|�~}~~~~~~~|z|}||}}{{}~~~~|||~}z{|{{{yz|y|}||{{{~|{}||~{w{}{yzzzzy|{yy|z|}zzyz{zxzyxxwxyyy{ywyyxxyzyyzzyxxyzywvyywxxyzxwvxzxwvwvwvvtvwwutuvvwwwvxvvwvuwxwttuttvvttuwwwussuvtstvvuututstvtsrssuutuuutvustusrssqttstsrrrqpqqrtqprsrrqqsssqnqtrsqoqpoquusrrqqsqopqqrpppmnsqnoqrpoppppopqrqopqponmooqpnmnoomnoprsmlnoqpnolkmnnkmnlmmmmlmmmlkklomllonkkklkkmoomkkkkijkkkjjlmiikkmmklkklkiijijlllkjhijiijjkkihgikjjjihhghkjihjihhgjjhiiifhhgdfgiifhiggihffh������������������������tm_TIGGJKIJILHGECCDEB?BCBACA@CC?@?=@?@@B??@?::?@CGJKJMOLLMNMJMONMPONPSRPPQSTTUWY[YWZZXYZ[YY[\[\^^[^`^\[]ba^]`ba```aaacdc_``bdbbcbcddffdccefgeddcegeefgfggeejjiihgfggikjihikkkkihllkllmjhkklkklkjkijjjlmkkkmlkklnnomkljjlmmlllmjmmloomnomnqonnooppppoopoppoqppqpnonrrqrrrrrsoqttqpstsrrqqssqrqrssrsutstststrqrsrrturuvsstustwvttvvvutvvsvvsstwvuvttvvuwvtwxyxxwvwwwvyxwxxxxvuvxwyxyzxywvwutvwwwxxyxxvvwyywwyzywyyzytwwx{zy{{yxyyz{|zyyz|zz{{yz|}{yz||{z}{{y{|{{||{{{{yy}}z|}||}|{|~~}}~}{}}|||{}}{}~}|}||~~}{{}~~~|}~{{~~}}~}}|||}}}~�~~�}||}}~}}}|}~}}|}~|}�~����~~}|�}~~����~}}~~}~�}{}|~}}~}{}~~~�}}}|}�~}|}~}}}����}��~��~|}~~~}~}~||~~~��}|}}|~~}~~~��~}~~~~}~��}|}~}}||~}~~~|}~�~||}}}~|~}~}|{}~~~|{}|{z||}~~}|}}{|}~}}}zz{||{{{|}z{{}|z{~|{||{zz|zy{{zxy{{z{||{{{zzzzyzz{zxy{yy{z{{yywwwyyzyzyyyywxxyzxuxyyyzxxzwxxvvyxwwvwwywvwxxxwxwuvxwwxvvwxxuuvwwuwvvwurwyvtvtvwvuutuwtvwuvuvvvssusssrtttvtrvustuussuursrsuusrtvtrtutttrrtsrssrrqqqrrrpqqsqpqssqpqrtsssrppqqpqpqqopqqqpqssppqssqpooppprppooopppnmooonnnoooqqooonnnlmoollmmomlonmnmnonommponnkkooklmnnnnnmkjlmllkkkkihmnkkljllkjkkjkkhiijnllkjkjjjilmkkjjjillgiihjihggikiigjjggiigijhgiiihhjjhjjhhhfffhhgggghihggfggegjdeggfhghfgffefgeefffffdgffeeeegedddeeccdcffggedceffebdebeedbba`abcdcbbcddccbbe�����������
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+_```bba`___`ba_^]^_```_[QKC>985567655557641331//230011102310///..-.-.-.1487799668999:99:::<=<<<:<===>???@@A?@@@BBABAAACDCBDCBCDDDDDGFEFDEGFFEDFGGGGIHGGGFHIHHIHGHJHFHHHIIJJIIKMKJLLKKKLKLKKKKKJJLMMLLKMLJJKMLKKKKKLKLNLLMMLLLLLMJLNLLMMNOOPPPOMLMNMLOPOMOOOONOPPPONOPOOOORQNOQQPOOQNNPQQRQONPQQPPQQQQSPPRRRQQPRRRQQQRSTQQTRQRRQQQSTSRTTSRSSTSSSRSRRSTTTUTSSTSSTUUUUSTSRSTTTTTTTUUTVVTTUUSTUUSSTUTTUSSSSTSSTRTTTTTTTUTTTVVUUVUTUUUUVVVVVUUUUVVWWWVVWWUVVUUVVVVXWVVUWYYXXYVUWWWXXVWWXWXXWXXXYXYYWWXWWWTVXXXXWWXWXXYYWWYYXYZZXXYYXXZZZ[YYZZZXXYXYXWWXZZYXYXXYYXZZXYZYYYZZXXYYZZZXXYYX[ZYYZYZ[[[YX\ZYYYZZ[ZZZXYYYZYYZYZZ[ZWX[ZZZZYZ[\[YYZYWX[ZXYYYYYZ[YXWXXXYXYXXXYZZYXXZZYWXXXXZZYZZYZ[[YXYYXYZZZZZXXYZYXZYZ[[[ZXYZYYYYYYYXVVYZXYYYXXZZZ[XXXXXXXXY[[XXYYYXYYYYWXYXWXYXXZYXYXZ[YXWXZYWVXVVXXXXXYXWXYXXVWWWWWTVXWVWXWXXUWYWXXWWWWXWVVUVVVVWWXWWVVVUVWWWTUUVWVVVWWWUWVUWWWWWVTUVVTTUTTUVVUUVVWTTVVUUVVUTUTTTTUTUUUUUTTUUUUUTSTUUUUTTUTUUSTTTTSRTTRSTTTUSSRRSTSTTTSSRRSSRTSRRSRQRRRSSRRRRSSRPQRRSSRRSRRPRSQQRSRRRRRRRQRQQPQQRRQQQQOPOPPOQRQRRRPOPQQPPQQQQQRQQQQPOQQQPOPOPPOPPQPMQQOOONNPQPPNNOOOPPOONOOOONOOONNNPQMLLOONMMOOMNNMMMMNMOMMNOMMMMMLMNNNNMLMMMMMNNMMNOMMLMOMLLLMKLLLKMMKMLLLMKLMMLMKKKKKKLKKKLLKLJJLLKLLKJKKLKKIJLLLKIIJKLKKKKIHKLJJJJJJIKKJJLKJIIHHKKJJJHIIHIJJKJGHGGHJJHHIJIHJJJIIIIGGGGHIIIJHGGIIHIIHHHIHFFFFFGHGHGGHHFG������������������������xo]UONLMMJLIHHJLGDGIIFCBEGEEFEDBECAA@B@@@;<@?=BDFRQMNNPPMPPQSQRRQRUVUUSSVWXWXXYZXYYY[]\^_^]]^^_c``aa`abbacbacdfcadfdbcegfceiifefggffhihhjkiihgiiklijkjmllmkkmnnmllmnnmllmmnonmmmklopolnpnnooooooqqpppoqrnoqqopqqstrqtspnproqttrqtrrsrsttusrsusstuxussutttssrtvxwustuuvwxvutttywwxxwvvwwwxwwvxwxuvyyvxxxwy{zxxzzzyz{{zzxxzywyz||yyx{}zz{|}|z{|zxz{{{||{xy{|~~{{{~{|}~|z{|||}}zzy|{{|}{{||{|}|{{z{~}}{}|}~~}~~|~}}~~�|�~~}~�}~����~��������������������~�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~���������������~�������~���~�~�}}~�~~~}~~|~{}~~~{{�~||||{}~~~}~}~}~~{{}}|{{{||~}}{z{|}|{{|~~||{{{}||}|z||{zz||z{|}}|{{xz|{z{{{zzz{zxwxxwyzyyxwz{yxxxyyxwvwyxyyywxxvwyywwxyxxxxxwyxwxwwwwwuvwwwxuswwuvwwwwxvrtwuuuvwvuuwwvvwuruwvsrsstuuuututststsrsttttttttsusstqsuttssrqprsuuqooqsqppqssrsrqqqsrsrprsrqppppqqqqponrrqpppqqonqpoooqpnpnnmnomloqrpooppnnooopnnoonomlmmnnmmllnmmnnmlmmmmnnlnmlmlkmmnnmmljkmnmljjkkklmlkllkliiillklkjjjijjiljhihhhkkgijjihikljjjiiiigdhigijghjgijjihiheeghfeffghgfehii������������������������uk_TLIKJIHIGIHGGDCGFECCCCCBBDB?BD@>>;?>?><==<=>@AGKKKLPQKLMNNNOMQQOQSQOPQUWUUUUTTXXXXZZ[\]YZ[[Z^_\\]^\_c`^\Zbbb`_`aba`aba`^cdcbcc`acddeffeegfdddfgefffffhhfefiihhhghijhfgikihjihjkljjiijkkjjkjlnmmlmmmnlkkllkmmlnmjlpnkkmnlooolmonnoppnoqpmoqpnoorqpooppomopoprrqonppnrtsrooorsrstqqrsrrsqrssssrrrruutrsuusrtvtvwuutttuttqrusuuutsvyuvutwvstwvuuvuvwwtsuuwyywuvxwvxxxxvvxxwxwuswywyzwvwvwywvxzvsvzyuxzyxyzyww{yxz{zyyyzxw|zyz{z{z}{yyzz{yxzyz{||{y{{zz{||||{{||{{{{||||z||z|{|{{}~}~|{{|}|~}||||}~~}~~~}}|~~}}||~|~}~~}||}}}||}~|{~�~}~~|{}}~~~|~�~}|��}}}~~|�~~}}}�~|}~~���~}}~~�}~~}}~~}~�}~~��~}}~|}|~}~~}|~|}�|�����~}}~~~~~~~�||�~~~~��}|~���}}�~||{|~~�}}~~~|}}�~|}}}~~}}~~}{}}||~}}}~|z}~}~}|{{{{{||||}|||}~||||~}||z{|yz}|{|yz{|{{zyz{zz{z{{yy||zyyzzzyzzwwyz{zyxzzxyxxyzyyxyyywvyyxxvxzwxyzyxyyuvzyyzzzywvxyyxwvvwwyxvwwuwvvwwyyuvvvwwxwwyxuwxwvuxxvvwxxxxvvwutuvvtuuvwwsusssussusqtvuuutsrqqsttrsttrtrrrrqrsrrsusorrtsqrrrrrpoqsrrrporsssstrqsqoorqqpqqpoopqqqrpnoronpoopqpoonoppooooopqoooppoonppommmpppoonmlmmppmmnooommmnpllommlmnomlmmmonkkllmlkkhhknljkkkjiikkjhhkljihijmljiijljijkihiijkllkkiijhgjjkjijjhhjlkiihghgijiffgefkiihgijihhihghhedggeefghggffffghfegggefgffdeffdffdefddfefdegfddefeecbbfdcefeddbceccccba`cddcabcdbdcaee������������������������vkbTJHHIIHGFGIGGGD
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+_`ab`]\\^^__aa_]__^^_`_YSMD;778862556645432342121343300100/-0/-/0/...,-/3778888:9889::9:<;;==<;<;<<=>=>@@A@@ABABA@BBBACECCEEEEDDDDDDDEDEFGHHFDFFGHIGFFIHFGIIHHHHGGKJIIHGGJKIIJJJKKJKJJKKKKKJJLLJLLKKKLLLLKJLKJKMLNNMLNNLJLNLLLNMMNNNMMLLLMMMNNNOONNONOONOONNNNNPPNOPPOOQQQQPONPQPQQOPPQOPOPQQPQQPQRQQRPOPQRRRQPRRQQPQRRRRRSSSTSSRQRSRQQSSSSRRRSRRTTSRRSTQRTQRTSQQQTTUUUSSTTTTUUVUSUVUSSSUVUUUUVWTTUUTTTTVVUSTTTUUUUUVWUSVVXWUUUWVUTTUVVVVVVVVUUVVUVWWVWWWWVWWXWWYUTWXXUWWVWYXVXXWVWWVWYWWWWWXWXYWWWXYXWWWWXWXYWYZXXWXXXYXWXYWXXWXXYXXZ[XXYXXYXXXYXXXXYWWWYZYXXYZXWZZZYXWXYX[ZXZZZZYZYZZZZZYZYWXZ[[ZYYYZZYZZZZXWXWY[ZYYZYXZ[ZYYZZZZYYYXYZZ[[XYZ[[YWXYWYZ[[XXXYZZZZXY[YXYZY[[ZZZZZZYX[YYYYYZZZYXWWXYYXVXZXZ[YYYY[ZYZY[ZYYZYXXXYXWWZYYYXXZZYWYZXYXWYXXXYYXXWWYZXWWXXWWWWXXXYXYYXXYYXXXXYXWXXXWXXWXXWYYYXWXWWWWVWWWWWWXVUVVUVWWXWVUXXXXWWXXUTUVVVWXWVWVXWWWVVUVWVWWUVVUTVVVVTUVUVUUUUUVWWUUVUUVUTUUUVUUUVVUUTTTUUVUVTRTUUSTTTTTSSUUUUVUTTUTSSTSSTSSSSTSRTTTTVTTTRSRQQRTSTTSRSQQQSRQQRSSRTTSRSRSSRQRQQQRQQRQRQQQQRRRPPSQPRQRRSRQQPOPQQOPPQRRQQQQQOOPPPQQQPPOPQPPOONPPNPOOOOPPPPOOOQQNOONNOOOOOONNNOONOOPNNNMOOOONNNONNNOOONONMNMLOMMNMMMMMMNMMMLNNNNMLMMMNNMLLLMOLKKKKKKKMNLJLNMKLLKLLMLLMMNNMLJKLLKKKJIIJLLKKKJJKLJKJIJKLLLJJLKKLKKLKJKIIJJHKKJIJKJKLJGHJJJIHIIIIIIHGIIGGJIJJJHHJIIJIGHHGHHGHIIHLIHJIGGGGHIIGGGHGGHHGGGGFGGHFGGEEGHG������������������������wpaULKMMJINMKLIJGDHIGAEFDEFGFACCCCAAB@?A@A@>>>ABELMNNOPQPOPQQQPQTTTVVVVTSUWXXY[\]]]]]^]][]^^`^_db_bdbaaaabbaccbadgfgfddggffgggihffhhhhfiighhkijiiklkijkllllmkjllklllmonmmnlnmmqomlklmmommqppqqopnnonpppqqqopqooopqrqqqqrsrrssrsrrrrsssrsutsuvrsvxwtstuuvvvvtststttvwwuvywvutvxvstuwwxuuxyxwwyzzxxzywxzzyyxxwvwyzyyxyyxwxyyy{zxy{wxzxyzyyyyyy{{zz{z{||{||{z~~}|zz{||}|}~||}|||z{~~}zz{z|~}}~��~z~��~~}�~{{{}~~~~}��~~~~~~}~��~������~~~~�������~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������}������������}����~������}~~~��~~~��~��}}��~}~�|}}~}}~~}}~�~{zz}}}{}~}}}{}~}}|~||||||||}||z{|{{{{{|}}}|z{|{{|}yzzy{zz{yy{}{z||{zzzzxvxyz{{yyzxwwyzyyy{zwy{xxyyyyxyxxwxyvwwwwvuwwuvwwxxwvxwwvvvvvutuvvuwxwxuuvvwwwttutuvxvttuvttsssuurssstssuuttttvvttsrsutssstrssqqqrstsrsssuuusrsrrrtssrqopoopqrpqrqqqrqqtrqonorqqporqnpqpqsqrrnnooopnnpqpnooqqoonnnpnnpooqommonnnoolkkkmnnnmmmnmlnnllloonkkmkknlkmmmlkklkklljklljkkihiijkjkkjjlkkhiljiikhilmljkkkkihhhijigiiiklghihhhggghihhefffhjhhgggeffghgfeegg������������������������tj\QJHJKJJJHHIGFA@ED@>BCB?BCBAA@BB??>?@@?>><<=?BBFIKLLLMONNNNMONORQSRRSQRRSVVVWXXXVXZYZYW[\[][]^][\]]]\\^^^_`a`_`bab`aacb^_ddcdccddcdfdeddcccdeefgfhdefffghggehigghijjiihhijihkjihjlklkgklkkljlljjlllmllkkkjkmnlnnpolkjlnmlnmlmnlmonooonnpoqpooorqpqqqoqqpqppoqsrpssrppsrqqprtqoqrtrsppsuutqrttssutrststuvtrqruuuttvuvtrtstuvttuuvuvvuuxuuttuuuvvtuwwtvvvvxxxxxwvvvwxwwxywvxxwwvux{xuuvxywvxzy{zzywuyzyxywvwxwxyyyyxx{{yxyyzzzyzyxy{yxzxz}{z{{{yz}{z{{||zzz{{{|{{|{||{{|{|{{{{||z||}}|}{z|||~{}~}}~}}~}}}}}{��~~}|~|}�|||~~}}}}}~}~~~~~~|}}}~�}}~}}}}~��~~}~~}}|~~||~�{z|~~��}{}~~~~�~}|}}|~�~�|~~~~��~~~|~}}~}��}~~~~|~��~~~~�}~~|}�}~���}|~~~{{~�~~}}~�|}}}~~}}�~~}~}|}~~}~~}{}}}}}~{z~}}~{z|}}}~|{|}||}~~~}~~}}}||}zz|{|||{|{||{{|{|{{}|{{zxzz{}{{zyzyzzuvy{{xwx{{zxyyy{zyzyy{yzxxxx{{yxxyxyyyyyywuxxwxyxxwwxyxwzzzyyywwxvvvxwutvvxxvxwvvvvxxwuuwuwvwxuttwxwwwwwusutuwvtvvuuvvutuvwvttsuvwvvwvsstttttutrrtsrrrstutpssuvsrrssrrssqrsrrrrrrrsqqqssqoqrqpqqprrppqqrsrqqpprrprrqppoooopqpopqqonqpopronoppllnppooonnonnlkkmoompokmppmmmnnmnnmnkimljlnmlllmkknlkllljjllkklllljikkmnnmjjjklljjjkkljihjlihljkjgiihijiiijjjikkiijjihghhiijihijhhghijighfghfffghfhgghhihfhhffeefggefggifehihgfhihfeecaehefgdeeeeefefedeedddbcdacbbcdacddbabbcdbbacdb`cdcdcbbac�������������
\ No newline at end of file
--- a/test/api/BaseEncoderTest.cpp
+++ b/test/api/BaseEncoderTest.cpp
@@ -32,7 +32,7 @@
param.bEnableDenoise = denoise;
param.iSpatialLayerNum = layers;
- if (sliceMode != SM_SINGLE_SLICE)
+ if (sliceMode != SM_SINGLE_SLICE && sliceMode != SM_DYN_SLICE) //SM_DYN_SLICE don't support multi-thread now
param.iMultipleThreadIdc = 2;
for (int i = 0; i < param.iSpatialLayerNum; i++) {
@@ -42,6 +42,10 @@
param.sSpatialLayers[i].iSpatialBitrate = param.iTargetBitrate;
param.sSpatialLayers[i].sSliceCfg.uiSliceMode = sliceMode;
+ if (sliceMode == SM_DYN_SLICE) {
+ param.sSpatialLayers[i].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 600;
+ param.uiMaxNalSize = 1500;
+ }
}
return encoder->InitializeExt(¶m);
--- a/test/api/encoder_test.cpp
+++ b/test/api/encoder_test.cpp
@@ -96,6 +96,10 @@
"a74ae382356098fb5cce216a97f2c0cef00a0a9d", CAMERA_VIDEO_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 2
},
{
+ "res/Cisco_Absolute_Power_1280x720_30fps.yuv",
+ "76b26c32dd3b400d3dccee0e8a52581f5c2588bb", CAMERA_VIDEO_REAL_TIME, 1280, 720, 30.0f, SM_DYN_SLICE, false, 1
+ },
+ {
"res/CiscoVT2people_320x192_12fps.yuv",
"", SCREEN_CONTENT_REAL_TIME, 320, 192, 12.0f, SM_SINGLE_SLICE, false, 1
},