Changeset 1196 in 3DVCSoftware for trunk/source/Lib/TLibDecoder/TDecSbac.cpp
- Timestamp:
- 4 May 2015, 17:47:40 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/Lib/TLibDecoder/TDecSbac.cpp
r1179 r1196 52 52 , m_cCUSplitFlagSCModel ( 1, 1, NUM_SPLIT_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels ) 53 53 , m_cCUSkipFlagSCModel ( 1, 1, NUM_SKIP_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 54 #if SEC_DEPTH_INTRA_SKIP_MODE_K003354 #if H_3D 55 55 , m_cCUDISFlagSCModel ( 1, 1, NUM_DIS_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 56 56 , m_cCUDISTypeSCModel ( 1, 1, NUM_DIS_TYPE_CTX , m_contextModels + m_numContextModels, m_numContextModels) 57 #else58 #if H_3D_SINGLE_DEPTH59 , m_cCUSingleDepthFlagSCModel ( 1, 1, NUM_SINGLEDEPTH_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels)60 , m_cSingleDepthValueSCModel ( 1, 1, NUM_SINGLE_DEPTH_VALUE_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels)61 #endif62 57 #endif 63 58 , m_cCUMergeFlagExtSCModel ( 1, 1, NUM_MERGE_FLAG_EXT_CTX , m_contextModels + m_numContextModels, m_numContextModels) … … 141 136 m_cCUSplitFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SPLIT_FLAG ); 142 137 m_cCUSkipFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SKIP_FLAG ); 143 #if SEC_DEPTH_INTRA_SKIP_MODE_K0033138 #if H_3D 144 139 m_cCUDISFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_DIS_FLAG ); 145 140 m_cCUDISTypeSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_DIS_TYPE ); 146 #else147 #if H_3D_SINGLE_DEPTH148 m_cCUSingleDepthFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SINGLEDEPTH_FLAG );149 m_cSingleDepthValueSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SINGLE_DEPTH_VALUE_DATA );150 #endif151 141 #endif 152 142 m_cCUMergeFlagExtSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT ); … … 217 207 m_cCUSplitFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG ); 218 208 m_cCUSkipFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG ); 219 #if SEC_DEPTH_INTRA_SKIP_MODE_K0033209 #if H_3D 220 210 m_cCUDISFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DIS_FLAG ); 221 211 m_cCUDISTypeSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DIS_TYPE ); 222 #else223 #if H_3D_SINGLE_DEPTH224 m_cCUSingleDepthFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SINGLEDEPTH_FLAG );225 m_cSingleDepthValueSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SINGLE_DEPTH_VALUE_DATA );226 #endif227 212 #endif 228 213 m_cCUMergeFlagExtSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT ); … … 461 446 UInt uiSymbol; 462 447 463 448 m_pcTDecBinIf->decodeBinTrm(uiSymbol); 464 449 465 450 #if H_MV_ENC_DEC_TRAC 466 467 #endif 468 469 451 DTRACE_CU("pcm_flag", uiSymbol) 452 #endif 453 if (uiSymbol) 454 { 470 455 Bool bIpcmFlag = true; 471 456 … … 500 485 piPCMSample += uiWidth; 501 486 } 502 503 504 487 #if H_3D_DISABLE_CHROMA 505 488 if( pcCU->getSlice()->getSPS()->getChromaFormatIdc() != 0 ) 506 489 { 507 490 #endif 508 piPCMSample = pcCU->getPCMSampleCb() + uiChromaOffset;509 uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;510 uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;511 uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();512 513 for(uiY = 0; uiY < uiHeight; uiY++)514 {515 for(uiX = 0; uiX < uiWidth; uiX++)516 {517 UInt uiSample;518 m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);519 piPCMSample[uiX] = uiSample;520 }521 piPCMSample += uiWidth;522 }523 524 piPCMSample = pcCU->getPCMSampleCr() + uiChromaOffset;525 uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;526 uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;527 uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();528 529 for(uiY = 0; uiY < uiHeight; uiY++)530 {531 for(uiX = 0; uiX < uiWidth; uiX++)532 {533 UInt uiSample;534 m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);535 piPCMSample[uiX] = uiSample;536 }537 piPCMSample += uiWidth;538 }491 piPCMSample = pcCU->getPCMSampleCb() + uiChromaOffset; 492 uiWidth = pcCU->getWidth(uiAbsPartIdx)/2; 493 uiHeight = pcCU->getHeight(uiAbsPartIdx)/2; 494 uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma(); 495 496 for(uiY = 0; uiY < uiHeight; uiY++) 497 { 498 for(uiX = 0; uiX < uiWidth; uiX++) 499 { 500 UInt uiSample; 501 m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample); 502 piPCMSample[uiX] = uiSample; 503 } 504 piPCMSample += uiWidth; 505 } 506 507 piPCMSample = pcCU->getPCMSampleCr() + uiChromaOffset; 508 uiWidth = pcCU->getWidth(uiAbsPartIdx)/2; 509 uiHeight = pcCU->getHeight(uiAbsPartIdx)/2; 510 uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma(); 511 512 for(uiY = 0; uiY < uiHeight; uiY++) 513 { 514 for(uiX = 0; uiX < uiWidth; uiX++) 515 { 516 UInt uiSample; 517 m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample); 518 piPCMSample[uiX] = uiSample; 519 } 520 piPCMSample += uiWidth; 521 } 539 522 #if H_3D_DISABLE_CHROMA 540 523 } 541 524 #endif 542 543 544 525 m_pcTDecBinIf->start(); 545 526 } … … 594 575 #endif 595 576 } 596 597 #if SEC_DEPTH_INTRA_SKIP_MODE_K0033 577 #if H_3D 598 578 Void TDecSbac::parseDIS( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) 599 579 { … … 639 619 } 640 620 } 641 #else 642 #if H_3D_SINGLE_DEPTH 643 Void TDecSbac::parseSingleDepthMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) 644 { 645 pcCU->setSingleDepthFlagSubParts( false, uiAbsPartIdx, uiDepth ); 646 UInt uiSymbol = 0; 647 m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSingleDepthFlagSCModel.get( 0, 0, 0 ) ); 648 if( uiSymbol ) 649 { 650 pcCU->setSingleDepthFlagSubParts( true, uiAbsPartIdx, uiDepth ); 651 pcCU->setSkipFlagSubParts( false, uiAbsPartIdx, uiDepth ); 652 pcCU->setSDCFlagSubParts( false, uiAbsPartIdx, uiDepth ); 653 pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth ); 654 pcCU->setPartSizeSubParts( SIZE_2Nx2N, uiAbsPartIdx, uiDepth ); 655 pcCU->setLumaIntraDirSubParts (DC_IDX, uiAbsPartIdx, uiDepth ); 656 pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth ); 657 pcCU->setMergeFlagSubParts( false , uiAbsPartIdx, 0, uiDepth ); 658 pcCU->setTrIdxSubParts(0, uiAbsPartIdx, uiDepth); 659 pcCU->setCbfSubParts(0, 1, 1, uiAbsPartIdx, uiDepth); 660 661 UInt absValDeltaDC = 0; 662 663 UInt uiUnaryIdx = 0; 664 UInt uiNumCand = SINGLE_DEPTH_MODE_CAND_LIST_SIZE; 665 if ( uiNumCand > 1 ) 666 { 667 for( ; uiUnaryIdx < uiNumCand - 1; ++uiUnaryIdx ) 668 { 669 UInt uiSymbol2 = 0; 670 if ( uiUnaryIdx==0 ) 671 { 672 m_pcTDecBinIf->decodeBin( uiSymbol2, m_cSingleDepthValueSCModel.get( 0, 0, 0 ) ); 673 } 674 else 675 { 676 m_pcTDecBinIf->decodeBinEP( uiSymbol2); 677 } 678 if( uiSymbol2 == 0 ) 679 { 680 break; 681 } 682 } 683 } 684 absValDeltaDC = uiUnaryIdx; 685 pcCU->setSingleDepthValueSubParts((Pel)absValDeltaDC,uiAbsPartIdx, 0, uiDepth); 686 } 687 } 688 #endif 689 #endif 690 621 #endif 691 622 /** parse merge flag 692 623 * \param pcCU … … 772 703 #if H_3D_QTLPC 773 704 Bool bParseSplitFlag = true; 774 775 776 705 Bool bLimQtPredFlag = pcCU->getPic()->getSlice(0)->getQtPredFlag(); 777 706 TComPic *pcTexture = pcCU->getSlice()->getTexturePic(); … … 810 739 #endif 811 740 pcCU->setDepthSubParts( uiDepth + uiSymbol, uiAbsPartIdx ); 812 741 813 742 return; 814 743 } … … 827 756 #if H_3D_QTLPC 828 757 Bool bParsePartSize = true; 829 758 830 759 Bool bLimQtPredFlag = pcCU->getPic()->getSlice(0)->getQtPredFlag(); 831 760 TComPic *pcTexture = pcCU->getSlice()->getTexturePic(); … … 859 788 #endif 860 789 861 790 862 791 if ( pcCU->isIntra( uiAbsPartIdx ) ) 863 792 { … … 866 795 { 867 796 #endif 868 uiSymbol = 1;797 uiSymbol = 1; 869 798 if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth ) 870 799 { … … 899 828 { 900 829 #endif 901 UInt uiMaxNumBits = 2; 902 if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( (g_uiMaxCUWidth>>uiDepth) == 8 && (g_uiMaxCUHeight>>uiDepth) == 8 ) ) 903 { 904 uiMaxNumBits ++; 905 } 906 for ( UInt ui = 0; ui < uiMaxNumBits; ui++ ) 907 { 908 m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) ); 909 if ( uiSymbol ) 910 { 911 break; 912 } 913 uiMode++; 914 } 915 eMode = (PartSize) uiMode; 916 if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) ) 917 { 918 if (eMode == SIZE_2NxN) 919 { 920 m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 3 )); 921 if (uiSymbol == 0) 830 UInt uiMaxNumBits = 2; 831 if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( (g_uiMaxCUWidth>>uiDepth) == 8 && (g_uiMaxCUHeight>>uiDepth) == 8 ) ) 832 { 833 uiMaxNumBits ++; 834 } 835 for ( UInt ui = 0; ui < uiMaxNumBits; ui++ ) 836 { 837 m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) ); 838 if ( uiSymbol ) 922 839 { 923 m_pcTDecBinIf->decodeBinEP(uiSymbol); 924 eMode = (uiSymbol == 0? SIZE_2NxnU : SIZE_2NxnD); 840 break; 925 841 } 926 } 927 else if (eMode == SIZE_Nx2N) 928 { 929 m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 3 )); 930 if (uiSymbol == 0) 842 uiMode++; 843 } 844 eMode = (PartSize) uiMode; 845 if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) ) 846 { 847 if (eMode == SIZE_2NxN) 931 848 { 932 m_pcTDecBinIf->decodeBinEP(uiSymbol); 933 eMode = (uiSymbol == 0? SIZE_nLx2N : SIZE_nRx2N); 849 m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 3 )); 850 if (uiSymbol == 0) 851 { 852 m_pcTDecBinIf->decodeBinEP(uiSymbol); 853 eMode = (uiSymbol == 0? SIZE_2NxnU : SIZE_2NxnD); 854 } 934 855 } 935 } 936 } 856 else if (eMode == SIZE_Nx2N) 857 { 858 m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 3 )); 859 if (uiSymbol == 0) 860 { 861 m_pcTDecBinIf->decodeBinEP(uiSymbol); 862 eMode = (uiSymbol == 0? SIZE_nLx2N : SIZE_nRx2N); 863 } 864 } 865 } 937 866 #if H_3D_QTLPC 938 867 } … … 1060 989 { 1061 990 #endif 1062 m_pcTDecBinIf->decodeBin( symbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );1063 mpmPred[j] = symbol;991 m_pcTDecBinIf->decodeBin( symbol, m_cCUIntraPredSCModel.get( 0, 0, 0) ); 992 mpmPred[j] = symbol; 1064 993 #if H_MV_ENC_DEC_TRAC 1065 DTRACE_CU("prev_intra_luma_pred_flag", symbol)994 DTRACE_CU("prev_intra_luma_pred_flag", symbol) 1066 995 #endif 1067 996 #if H_3D_DIM … … 1075 1004 { 1076 1005 #endif 1077 Int preds[3] = {-1, -1, -1}; 1078 Int predNum = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds); 1079 if (mpmPred[j]) 1080 { 1081 m_pcTDecBinIf->decodeBinEP( symbol ); 1082 if (symbol) 1006 Int preds[3] = {-1, -1, -1}; 1007 Int predNum = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds); 1008 if (mpmPred[j]) 1083 1009 { 1084 1010 m_pcTDecBinIf->decodeBinEP( symbol ); 1085 symbol++; 1086 } 1011 if (symbol) 1012 { 1013 m_pcTDecBinIf->decodeBinEP( symbol ); 1014 symbol++; 1015 } 1087 1016 #if H_MV_ENC_DEC_TRAC 1088 DTRACE_CU("mpm_idx", symbol)1089 #endif 1090 intraPredMode = preds[symbol];1091 }1092 else1093 {1094 m_pcTDecBinIf->decodeBinsEP( symbol, 5 );1095 intraPredMode = symbol;1017 DTRACE_CU("mpm_idx", symbol) 1018 #endif 1019 intraPredMode = preds[symbol]; 1020 } 1021 else 1022 { 1023 m_pcTDecBinIf->decodeBinsEP( symbol, 5 ); 1024 intraPredMode = symbol; 1096 1025 #if H_MV_ENC_DEC_TRAC 1097 DTRACE_CU("rem_intra_luma_pred_mode", symbol)1026 DTRACE_CU("rem_intra_luma_pred_mode", symbol) 1098 1027 #endif 1099 //postponed sorting of MPMs (only in remaining branch)1100 if (preds[0] > preds[1])1101 {1102 std::swap(preds[0], preds[1]);1103 }1104 if (preds[0] > preds[2])1105 {1106 std::swap(preds[0], preds[2]);1107 }1108 if (preds[1] > preds[2])1109 {1110 std::swap(preds[1], preds[2]);1111 }1112 for ( Int i = 0; i < predNum; i++ )1113 {1114 intraPredMode += ( intraPredMode >= preds[i] );1115 }1116 }1117 pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, absPartIdx+partOffset*j, depth );1028 //postponed sorting of MPMs (only in remaining branch) 1029 if (preds[0] > preds[1]) 1030 { 1031 std::swap(preds[0], preds[1]); 1032 } 1033 if (preds[0] > preds[2]) 1034 { 1035 std::swap(preds[0], preds[2]); 1036 } 1037 if (preds[1] > preds[2]) 1038 { 1039 std::swap(preds[1], preds[2]); 1040 } 1041 for ( Int i = 0; i < predNum; i++ ) 1042 { 1043 intraPredMode += ( intraPredMode >= preds[i] ); 1044 } 1045 } 1046 pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, absPartIdx+partOffset*j, depth ); 1118 1047 #if H_3D_DIM 1119 1048 } … … 1133 1062 DTRACE_CU("intra_chroma_pred_mode", uiSymbol ) 1134 1063 #endif 1135 uiSymbol = DM_CHROMA_IDX;1064 uiSymbol = DM_CHROMA_IDX; 1136 1065 } 1137 1066 else … … 1143 1072 DTRACE_CU("intra_chroma_pred_mode", uiIPredMode ) 1144 1073 #endif 1145 UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ];1074 UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ]; 1146 1075 pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir ); 1147 1076 uiSymbol = uiAllowedChromaDir[ uiIPredMode ];
Note: See TracChangeset for help on using the changeset viewer.