Changeset 459 in 3DVCSoftware for branches/HTM-DEV-0.3-dev1/source/Lib/TLibEncoder/TEncSbac.cpp
- Timestamp:
- 6 Jun 2013, 11:46:05 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-DEV-0.3-dev1/source/Lib/TLibEncoder/TEncSbac.cpp
r446 r459 83 83 , m_cTransformSkipSCModel ( 1, 2, NUM_TRANSFORMSKIP_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 84 84 , m_CUTransquantBypassFlagSCModel( 1, 1, NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels) 85 #if H_3D_DIM 86 , m_cDepthIntraModeSCModel ( 1, 1, NUM_DEPTH_INTRA_MODE_CTX , m_contextModels + m_numContextModels, m_numContextModels) 87 , m_cDdcFlagSCModel ( 1, 1, NUM_DDC_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 88 , m_cDdcDataSCModel ( 1, 1, NUM_DDC_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) 89 #if H_3D_DIM_DMM 90 , m_cDmm1DataSCModel ( 1, 1, NUM_DMM1_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) 91 , m_cDmm2DataSCModel ( 1, 1, NUM_DMM2_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) 92 , m_cDmm3DataSCModel ( 1, 1, NUM_DMM3_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) 93 #endif 94 #if H_3D_DIM_RBC 95 , m_cRbcDataSCModel ( 1, 1, NUM_RBC_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) 96 #endif 97 #endif 85 98 { 86 99 assert( m_numContextModels <= MAX_NUM_CTX_MOD ); … … 134 147 m_cTransformSkipSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG ); 135 148 m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG ); 149 150 #if H_3D_DIM 151 m_cDepthIntraModeSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE ); 152 m_cDdcFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG ); 153 m_cDdcDataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DDC_DATA ); 154 #if H_3D_DIM_DMM 155 m_cDmm1DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA ); 156 m_cDmm2DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA ); 157 m_cDmm3DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA ); 158 #endif 159 #if H_3D_DIM_RBC 160 m_cRbcDataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_RBC_DATA ); 161 #endif 162 #endif 136 163 // new structure 137 164 m_uiLastQp = iQp; … … 188 215 curCost += m_cTransformSkipSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG ); 189 216 curCost += m_CUTransquantBypassFlagSCModel.calcCost( curSliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG ); 217 #if H_3D_DIM 218 if( m_pcSlice->getVpsDepthModesFlag() ) 219 { 220 curCost += m_cDepthIntraModeSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_DEPTH_INTRA_MODE ); 221 curCost += m_cDdcFlagSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_DDC_FLAG ); 222 curCost += m_cDdcDataSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_DDC_DATA ); 223 #if H_3D_DIM_DMM 224 curCost += m_cDmm1DataSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_DMM1_DATA ); 225 curCost += m_cDmm2DataSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_DMM2_DATA ); 226 curCost += m_cDmm3DataSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_DMM3_DATA ); 227 #endif 228 #if H_3D_DIM_RBC 229 curCost += m_cRbcDataSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_RBC_DATA ); 230 #endif 231 } 232 #endif 190 233 if (curCost < bestCost) 191 234 { … … 237 280 m_cTransformSkipSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG ); 238 281 m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG ); 282 283 #if H_3D_DIM 284 m_cDepthIntraModeSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE ); 285 m_cDdcFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG ); 286 m_cDdcDataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DDC_DATA ); 287 #if H_3D_DIM_DMM 288 m_cDmm1DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA ); 289 m_cDmm2DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA ); 290 m_cDmm3DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA ); 291 #endif 292 #if H_3D_DIM_RBC 293 m_cRbcDataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_RBC_DATA ); 294 #endif 295 #endif 239 296 m_pcBinIf->start(); 240 297 } … … 379 436 } 380 437 438 #if H_3D_DIM 439 Void TEncSbac::xWriteExGolombLevel( UInt uiSymbol, ContextModel& rcSCModel ) 440 { 441 if( uiSymbol ) 442 { 443 m_pcBinIf->encodeBin( 1, rcSCModel ); 444 UInt uiCount = 0; 445 Bool bNoExGo = (uiSymbol < 13); 446 447 while( --uiSymbol && ++uiCount < 13 ) 448 { 449 m_pcBinIf->encodeBin( 1, rcSCModel ); 450 } 451 if( bNoExGo ) 452 { 453 m_pcBinIf->encodeBin( 0, rcSCModel ); 454 } 455 else 456 { 457 xWriteEpExGolomb( uiSymbol, 0 ); 458 } 459 } 460 else 461 { 462 m_pcBinIf->encodeBin( 0, rcSCModel ); 463 } 464 465 return; 466 } 467 468 Void TEncSbac::xCodeDimDeltaDC( Pel valDeltaDC, UInt dimType ) 469 { 470 xWriteExGolombLevel( UInt( abs( valDeltaDC ) ), m_cDdcDataSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) ); 471 if( valDeltaDC != 0 ) 472 { 473 UInt uiSign = valDeltaDC > 0 ? 0 : 1; 474 m_pcBinIf->encodeBinEP( uiSign ); 475 } 476 } 477 478 #if H_3D_DIM_DMM 479 Void TEncSbac::xCodeDmm1WedgeIdx( UInt uiTabIdx, Int iNumBit ) 480 { 481 for ( Int i = 0; i < iNumBit; i++ ) 482 { 483 m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cDmm1DataSCModel.get(0, 0, 0) ); 484 } 485 } 486 487 Void TEncSbac::xCodeDmm2Offset( Int iOffset ) 488 { 489 if( DMM2_DELTAEND_MAX > 0 ) 490 { 491 m_pcBinIf->encodeBin( (iOffset != 0) , m_cDmm2DataSCModel.get(0, 0, 0) ); 492 if( iOffset != 0 ) 493 { 494 UInt uiAbsValMinus1 = abs(iOffset)-1; 495 m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01), m_cDmm2DataSCModel.get(0, 0, 0) ); 496 m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cDmm2DataSCModel.get(0, 0, 0) ); 497 498 UInt uiSign = (iOffset > 0) ? 0 : 1; 499 m_pcBinIf->encodeBinEP( uiSign ); 500 } 501 } 502 } 503 504 Void TEncSbac::xCodeDmm3WedgeIdx( UInt uiIntraIdx, Int iNumBit ) 505 { 506 for( Int i = 0; i < iNumBit; i++ ) 507 { 508 m_pcBinIf->encodeBin( ( uiIntraIdx >> i ) & 1, m_cDmm3DataSCModel.get(0, 0, 0) ); 509 } 510 } 511 #endif 512 #if H_3D_DIM_RBC 513 Void TEncSbac::xCodeRbcEdge( TComDataCU* pcCU, UInt uiAbsPartIdx ) 514 { 515 UInt uiDepth = pcCU->getDepth( uiAbsPartIdx ) + (pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 1 : 0); 516 UChar* pucSymbolList = pcCU->getEdgeCode ( uiAbsPartIdx ); 517 UChar ucEdgeNumber = pcCU->getEdgeNumber ( uiAbsPartIdx ); 518 Bool bLeft = pcCU->getEdgeLeftFirst( uiAbsPartIdx ); 519 UChar ucStart = pcCU->getEdgeStartPos ( uiAbsPartIdx ); 520 UInt uiSymbol; 521 522 // 1. Top(0) or Left(1) 523 uiSymbol = (bLeft == false) ? 0 : 1; 524 m_pcBinIf->encodeBinEP( uiSymbol ); 525 526 // 2. Start position (lowest bit first) 527 uiSymbol = ucStart; 528 for( UInt ui = 6; ui > uiDepth; ui-- ) // 64(0)->6, 32(1)->5, 16(2)->4, 8(3)->3, 4(4)->2 529 { 530 m_pcBinIf->encodeBinEP( uiSymbol & 0x1 ); 531 uiSymbol >>= 1; 532 } 533 534 // 3. Number of edges 535 uiSymbol = ucEdgeNumber > 0 ? ucEdgeNumber - 1 : 0; 536 for( UInt ui = 7; ui > uiDepth; ui-- ) // 64(0)->7, 32(1)->6, 16(2)->5, 8(3)->4, 4(4)->3 537 { 538 m_pcBinIf->encodeBinEP( uiSymbol & 0x1 ); 539 uiSymbol >>= 1; 540 } 541 542 if(uiSymbol != 0) 543 { 544 printf(" ucEdgeNumber %d at depth %d\n",ucEdgeNumber, uiDepth); 545 assert(false); 546 } 547 548 // 4. Edges 549 for( Int iPtr2 = 0; iPtr2 < ucEdgeNumber; iPtr2++ ) 550 { 551 UInt uiReorderSymbol = pucSymbolList[iPtr2]; 552 for( UInt ui = 0; ui < uiReorderSymbol; ui++ ) 553 { 554 m_pcBinIf->encodeBin( 1, m_cRbcDataSCModel.get( 0, 0, 0 ) ); 555 } 556 557 if( uiReorderSymbol != 6 ) 558 m_pcBinIf->encodeBin( 0, m_cRbcDataSCModel.get( 0, 0, 0 ) ); 559 } 560 } 561 #endif 562 #endif 563 381 564 // SBAC RD 382 565 Void TEncSbac::load ( TEncSbac* pSrc) … … 391 574 this->m_cCUIntraPredSCModel .copyFrom( &pSrc->m_cCUIntraPredSCModel ); 392 575 } 393 576 #if H_3D_DIM 577 Void TEncSbac::loadIntraDepthMode( TEncSbac* pSrc) 578 { 579 m_pcBinIf->copyState( pSrc->m_pcBinIf ); 580 581 this->m_cDepthIntraModeSCModel .copyFrom( &pSrc->m_cDepthIntraModeSCModel ); 582 this->m_cDdcFlagSCModel .copyFrom( &pSrc->m_cDdcFlagSCModel ); 583 } 584 #endif 394 585 395 586 Void TEncSbac::store( TEncSbac* pDest) … … 628 819 { 629 820 dir[j] = pcCU->getLumaIntraDir( absPartIdx+partOffset*j ); 821 #if H_3D_DIM 822 if( pcCU->getSlice()->getVpsDepthModesFlag() ) 823 { 824 codeIntraDepth( pcCU, absPartIdx+partOffset*j ); 825 } 826 if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE ) 827 #if H_3D_DIM_SDC 828 if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) ) 829 #endif 830 { 831 #endif 630 832 predNum[j] = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds[j]); 631 833 for(UInt i = 0; i < predNum[j]; i++) … … 637 839 } 638 840 m_pcBinIf->encodeBin((predIdx[j] != -1)? 1 : 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) ); 841 #if H_3D_DIM 842 } 843 #endif 639 844 } 640 845 for (j=0;j<partNum;j++) 641 846 { 847 #if H_3D_DIM 848 if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE ) 849 #if H_3D_DIM_SDC 850 if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) ) 851 #endif 852 { 853 #endif 642 854 if(predIdx[j] != -1) 643 855 { … … 668 880 m_pcBinIf->encodeBinsEP( dir[j], 5 ); 669 881 } 882 #if H_3D_DIM 883 } 884 #endif 670 885 } 671 886 return; … … 699 914 return; 700 915 } 916 917 #if H_3D_DIM 918 Void TEncSbac::codeIntraDepth( TComDataCU* pcCU, UInt absPartIdx, Bool sdcRD ) 919 { 920 codeIntraDepthMode( pcCU, absPartIdx ); 921 922 UInt dir = pcCU->getLumaIntraDir( absPartIdx ); 923 UInt dimType = getDimType( dir ); 924 925 switch( dimType ) 926 { 927 #if H_3D_DIM_DMM 928 case( DMM1_IDX ): 929 { 930 xCodeDmm1WedgeIdx( pcCU->getDmmWedgeTabIdx( dimType, absPartIdx ), g_dmm1TabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] ); 931 } break; 932 case( DMM2_IDX ): 933 { 934 xCodeDmm2Offset( pcCU->getDmm2DeltaEnd( absPartIdx ) ); 935 } break; 936 case( DMM3_IDX ): 937 { 938 xCodeDmm3WedgeIdx( pcCU->getDmm3IntraTabIdx( absPartIdx ), g_dmm3IntraTabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] ); 939 } break; 940 case( DMM4_IDX ): break; 941 #endif 942 #if H_3D_DIM_RBC 943 case( RBC_IDX ): 944 { 945 assert( pcCU->getWidth( absPartIdx ) < 64 ); 946 xCodeRbcEdge( pcCU, absPartIdx ); 947 } break; 948 #endif 949 default: break; 950 } 951 952 #if H_3D_DIM_SDC 953 if( pcCU->getSDCFlag( absPartIdx ) ) 954 { 955 // assert(pcCU->getPartitionSize(uiAbsPartIdx)==SIZE_2Nx2N); 956 // UInt uiNumSegments = ( uiDir == DC_IDX || uiDir == PLANAR_IDX )? 1 : 2; 957 // if(!bSdcRD) 958 // { 959 // for (int uiSeg=0; uiSeg<uiNumSegments; uiSeg++) 960 // { 961 // codeSDCResidualData(pcCU, uiAbsPartIdx, uiSeg); 962 // } 963 // } 964 } 965 else 966 { 967 #endif 968 if( dimType < DIM_NUM_TYPE ) 969 { 970 UInt dimDeltaDC = isDimDeltaDC( dir ); 971 m_pcBinIf->encodeBin( dimDeltaDC, m_cDdcFlagSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) ); 972 if( dimDeltaDC ) 973 { 974 for( UInt segment = 0; segment < 2; segment++ ) 975 { 976 xCodeDimDeltaDC( pcCU->getDimDeltaDC( dimType, segment, absPartIdx ), dimType ); 977 } 978 } 979 } 980 #if H_3D_DIM_SDC 981 } 982 #endif 983 } 984 985 Void TEncSbac::codeIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx ) 986 { 987 UInt codeWordTable[3][9] = {{0, 0, 0, 2, 0,6, 0, 0, 7},{0, 2, 3, 4, 5, 6, 14, 31, 30},{0, 2, 0, 0, 0, 0, 3, 0, 0}}; 988 UInt codeWordLenTable[3][9] = {{0, 1, 0, 2, 0,3, 0, 0, 3},{2, 3, 3, 3, 3, 3, 4, 5, 5},{1, 2, 0, 0, 0, 0, 2, 0, 0}}; 989 UInt dir = pcCU->getLumaIntraDir( absPartIdx ); 990 UInt puIdx = (pcCU->getWidth(absPartIdx) == 64) ? 2 : ( (pcCU->getPartitionSize(absPartIdx) == SIZE_NxN && pcCU->getWidth(absPartIdx) == 8) ? 0 : 1 ); 991 UInt codeIdx = 0; 992 993 if( dir < NUM_INTRA_MODE ) 994 { 995 codeIdx = 1; 996 } 997 if( isDimMode( dir ) ) 998 { 999 switch( getDimType( dir ) ) 1000 { 1001 case DMM1_IDX: codeIdx = 3; break; 1002 case DMM4_IDX: codeIdx = 4; break; 1003 case DMM3_IDX: codeIdx = 5; break; 1004 case DMM2_IDX: codeIdx = 7; break; 1005 case RBC_IDX: codeIdx = 8; break; 1006 default: break; 1007 } 1008 } 1009 1010 #if H_3D_DIM_SDC 1011 if( pcCU->getSDCFlag( absPartIdx ) ) 1012 { 1013 // switch( dir ) 1014 // { 1015 // case PLANAR_IDX: codeIdx = 0; break; 1016 // case DC_IDX: codeIdx = 6; break; 1017 // case (2*DMM1_IDX+DIM_OFFSET): codeIdx = 2; break; 1018 // default: break; 1019 // } 1020 } 1021 #endif 1022 //mode coding 1023 for( UInt i = 0; i < codeWordLenTable[puIdx][codeIdx]; i++ ) 1024 { 1025 UInt bit = codeWordTable[puIdx][codeIdx] & ( 1<<(codeWordLenTable[puIdx][codeIdx] - i - 1) ); 1026 UInt ctxDepthMode = puIdx*3 + ( (i >= 2) ? 2 : i ); 1027 m_pcBinIf->encodeBin( bit!=0 , m_cDepthIntraModeSCModel.get(0, 0, ctxDepthMode) ); 1028 } 1029 } 1030 #endif 701 1031 702 1032 Void TEncSbac::codeInterDir( TComDataCU* pcCU, UInt uiAbsPartIdx )
Note: See TracChangeset for help on using the changeset viewer.