Changeset 773 in 3DVCSoftware for trunk/source/Lib/TLibDecoder/TDecSbac.cpp
- Timestamp:
- 16 Jan 2014, 09:56:13 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/Lib/TLibDecoder/TDecSbac.cpp
r758 r773 89 89 #if H_3D_DIM_DMM 90 90 , m_cDmm1DataSCModel ( 1, 1, NUM_DMM1_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) 91 #if !SEC_DMM3_RBC_F014792 , m_cDmm3DataSCModel ( 1, 1, NUM_DMM3_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels)93 #endif94 #endif95 #if H_3D_DIM_RBC96 , m_cRbcDataSCModel ( 1, 1, NUM_RBC_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels)97 91 #endif 98 92 #if H_3D_DIM_SDC … … 178 172 #if H_3D_DIM_DMM 179 173 m_cDmm1DataSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_DMM1_DATA ); 180 #if !SEC_DMM3_RBC_F0147181 m_cDmm3DataSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_DMM3_DATA );182 #endif183 #endif184 #if H_3D_DIM_RBC185 m_cRbcDataSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_RBC_DATA );186 174 #endif 187 175 #if H_3D_DIM_SDC … … 253 241 #if H_3D_DIM_DMM 254 242 m_cDmm1DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA ); 255 #if !SEC_DMM3_RBC_F0147256 m_cDmm3DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );257 #endif258 #endif259 #if H_3D_DIM_RBC260 m_cRbcDataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );261 243 #endif 262 244 #if H_3D_DIM_SDC … … 414 396 } 415 397 416 #if QC_DIM_DELTADC_UNIFY_F0132417 398 Void TDecSbac::xParseDimDeltaDC( Pel& rValDeltaDC, UInt uiNumSeg ) 418 399 { … … 431 412 } 432 413 } 433 #else 434 Void TDecSbac::xParseDimDeltaDC( Pel& rValDeltaDC, UInt dimType ) 435 { 436 UInt absValDeltaDC = 0; 437 xReadExGolombLevel( absValDeltaDC, m_cDdcDataSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) ); 438 rValDeltaDC = (Pel)absValDeltaDC; 439 440 if( rValDeltaDC != 0 ) 441 { 442 UInt uiSign; 443 m_pcTDecBinIf->decodeBinEP( uiSign ); 444 if ( uiSign ) 445 { 446 rValDeltaDC = -rValDeltaDC; 447 } 448 } 449 } 450 #endif 414 451 415 452 416 #if H_3D_DIM_DMM … … 461 425 ruiTabIdx = uiIdx; 462 426 } 463 #if !SEC_DMM3_RBC_F0147 464 Void TDecSbac::xParseDmm3WedgeIdx( UInt& ruiIntraIdx, Int iNumBit ) 465 { 466 UInt uiSymbol, uiIdx = 0; 467 for( Int i = 0; i < iNumBit; i++ ) 468 { 469 m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmm3DataSCModel.get(0, 0, 0) ); 470 uiIdx += uiSymbol << i; 471 } 472 ruiIntraIdx = uiIdx; 473 } 474 #endif 475 #endif 476 #if H_3D_DIM_RBC 477 Void TDecSbac::xParseRbcEdge( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) 478 { 479 UInt uiSymbol = 0; 480 481 // 1. Top(0) or Left(1) 482 UChar ucLeft; 483 m_pcTDecBinIf->decodeBinEP( uiSymbol ); 484 ucLeft = uiSymbol; 485 486 // 2. Start position (lowest bit first) 487 UChar ucStart = 0; 488 for( UInt ui = 0; ui < 6 - uiDepth; ui++ ) 489 { 490 m_pcTDecBinIf->decodeBinEP( uiSymbol ); 491 ucStart |= (uiSymbol << ui); 492 } 493 494 // 3. Number of edges 495 UChar ucMax = 0; 496 for( UInt ui = 0; ui < 7 - uiDepth; ui++ ) 497 { 498 m_pcTDecBinIf->decodeBinEP( uiSymbol ); 499 ucMax |= (uiSymbol << ui); 500 } 501 ucMax++; // +1 502 503 // 4. Edges 504 UChar* pucSymbolList = (UChar*) xMalloc( UChar, 256 * RBC_MAX_EDGE_NUM_PER_4x4 ); 505 for( Int iPtr = 0; iPtr < ucMax; iPtr++ ) 506 { 507 UChar ucEdge = 0; 508 UInt uiReorderEdge = 0; 509 for( UInt ui = 0; ui < 6; ui++ ) 510 { 511 m_pcTDecBinIf->decodeBin( uiSymbol, m_cRbcDataSCModel.get( 0, 0, 0 ) ); 512 ucEdge <<= 1; 513 ucEdge |= uiSymbol; 514 if( uiSymbol == 0 ) 515 break; 516 } 517 518 switch( ucEdge ) 519 { 520 case 0 : // "0" 521 uiReorderEdge = 0; 522 break; 523 case 2 : // "10" 524 uiReorderEdge = 1; 525 break; 526 case 6 : // "110" 527 uiReorderEdge = 2; 528 break; 529 case 14 : // "1110" 530 uiReorderEdge = 3; 531 break; 532 case 30 : // "11110" 533 uiReorderEdge = 4; 534 break; 535 case 62 : // "111110" 536 uiReorderEdge = 5; 537 break; 538 case 63 : // "111111" 539 uiReorderEdge = 6; 540 break; 541 default : 542 printf("parseIntraEdgeChain: error (unknown code %d)\n",ucEdge); 543 assert(false); 544 break; 545 } 546 pucSymbolList[iPtr] = uiReorderEdge; 547 } 548 ///////////////////// 549 // Edge Reconstruction 550 Bool* pbRegion = pcCU->getEdgePartition( uiAbsPartIdx ); 551 pcCU->reconPartition( uiAbsPartIdx, uiDepth, ucLeft == 1, ucStart, ucMax, pucSymbolList, pbRegion ); 552 xFree( pucSymbolList ); 553 } 554 #endif 427 #endif 428 555 429 #if H_3D_DIM_SDC 556 430 Void TDecSbac::xParseSDCResidualData ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiSegment ) … … 568 442 569 443 #if H_3D_DIM_DLT 570 #if DLT_DIFF_CODING_IN_PPS571 444 UInt uiMaxResidualBits = pcCU->getSlice()->getPPS()->getDLT()->getBitsPerDepthValue( pcCU->getSlice()->getLayerIdInVps() ); 572 #else573 UInt uiMaxResidualBits = pcCU->getSlice()->getVPS()->getBitsPerDepthValue( pcCU->getSlice()->getLayerIdInVps() );574 #endif575 445 #else 576 446 UInt uiMaxResidualBits = g_bitDepthY; … … 596 466 UInt uiCount = 0; 597 467 #if H_3D_DIM_DLT 598 #if DLT_DIFF_CODING_IN_PPS599 468 UInt uiNumDepthValues = pcCU->getSlice()->getPPS()->getDLT()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() ); 600 #else601 UInt uiNumDepthValues = pcCU->getSlice()->getVPS()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() );602 #endif603 469 #else 604 470 UInt uiNumDepthValues = ((1 << g_bitDepthY)-1); … … 1175 1041 pcCU->setDmmWedgeTabIdxSubParts( uiTabIdx, dimType, absPartIdx, depth ); 1176 1042 } break; 1177 #if !SEC_DMM3_RBC_F01471178 case( DMM3_IDX ):1179 {1180 UInt uiIntraIdx = 0;1181 xParseDmm3WedgeIdx( uiIntraIdx, g_dmm3IntraTabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );1182 pcCU->setDmm3IntraTabIdxSubParts( uiIntraIdx, absPartIdx, depth );1183 } break;1184 #endif1185 1043 case( DMM4_IDX ): break; 1186 1044 #endif 1187 #if H_3D_DIM_RBC1188 case( RBC_IDX ):1189 {1190 xParseRbcEdge( pcCU, absPartIdx, depth );1191 } break;1192 #endif1193 1045 default: break; 1194 1046 } 1195 1047 1196 #if H_3D_DIM_SDC && !QC_DIM_DELTADC_UNIFY_F0132 1197 if( pcCU->getSDCFlag(absPartIdx) ) 1198 { 1199 assert(pcCU->getPartitionSize(absPartIdx)==SIZE_2Nx2N); 1200 pcCU->setTrIdxSubParts(0, absPartIdx, depth); 1201 pcCU->setCbfSubParts(1, 1, 1, absPartIdx, depth); 1202 1203 UInt uiNumSegments = ( dir == DC_IDX || dir == PLANAR_IDX )? 1 : 2; 1204 for (UInt uiSeg=0; uiSeg<uiNumSegments; uiSeg++) 1205 { 1206 xParseSDCResidualData(pcCU, absPartIdx, depth, uiSeg); 1207 } 1208 } 1209 else 1210 { 1211 #endif 1212 #if QC_DIM_DELTADC_UNIFY_F0132 1213 if( dimType < DIM_NUM_TYPE || pcCU->getSDCFlag( absPartIdx ) ) 1214 #else 1215 if( dimType < DIM_NUM_TYPE ) 1216 #endif 1217 { 1218 UInt symbol; 1219 #if QC_DIM_DELTADC_UNIFY_F0132 1220 UInt uiNumSegments = ( dir == PLANAR_IDX ) ? 1 : 2; 1048 if( dimType < DIM_NUM_TYPE || pcCU->getSDCFlag( absPartIdx ) ) 1049 { 1050 UInt symbol; 1051 UInt uiNumSegments = ( dir == PLANAR_IDX ) ? 1 : 2; 1052 1053 if( pcCU->getSDCFlag( absPartIdx ) ) 1054 { 1055 assert(pcCU->getPartitionSize(absPartIdx)==SIZE_2Nx2N); 1056 pcCU->setTrIdxSubParts(0, absPartIdx, depth); 1057 pcCU->setCbfSubParts(1, 1, 1, absPartIdx, depth); 1058 } 1059 1060 m_pcTDecBinIf->decodeBin( symbol, m_cDdcFlagSCModel.get(0, 0, uiNumSegments-1) ); 1061 1062 if( symbol ) 1063 { 1064 if( !pcCU->getSDCFlag( absPartIdx ) ) 1065 { 1066 dir += symbol; 1067 } 1068 } 1069 for( UInt segment = 0; segment < uiNumSegments; segment++ ) 1070 { 1071 Pel valDeltaDC = 0; 1072 if( symbol ) 1073 { 1074 xParseDimDeltaDC( valDeltaDC, uiNumSegments ); 1075 } 1221 1076 1222 1077 if( pcCU->getSDCFlag( absPartIdx ) ) 1223 1078 { 1224 assert(pcCU->getPartitionSize(absPartIdx)==SIZE_2Nx2N); 1225 pcCU->setTrIdxSubParts(0, absPartIdx, depth); 1226 pcCU->setCbfSubParts(1, 1, 1, absPartIdx, depth); 1227 } 1228 1229 m_pcTDecBinIf->decodeBin( symbol, m_cDdcFlagSCModel.get(0, 0, uiNumSegments-1) ); 1230 1231 if( symbol ) 1232 { 1233 if( !pcCU->getSDCFlag( absPartIdx ) ) 1234 { 1235 dir += symbol; 1236 } 1237 } 1238 for( UInt segment = 0; segment < uiNumSegments; segment++ ) 1239 { 1240 Pel valDeltaDC = 0; 1241 if( symbol ) 1242 { 1243 xParseDimDeltaDC( valDeltaDC, uiNumSegments ); 1244 } 1245 1246 if( pcCU->getSDCFlag( absPartIdx ) ) 1247 { 1248 pcCU->setSDCSegmentDCOffset( valDeltaDC, segment, absPartIdx ); 1249 } 1250 else 1251 { 1252 pcCU->setDimDeltaDC( dimType, segment, absPartIdx, valDeltaDC ); 1253 } 1254 } 1255 #else 1256 m_pcTDecBinIf->decodeBin( symbol, m_cDdcFlagSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) ); 1257 if( symbol ) 1258 { 1259 dir += symbol; 1260 for( UInt segment = 0; segment < 2; segment++ ) 1261 { 1262 Pel valDeltaDC = 0; 1263 xParseDimDeltaDC( valDeltaDC, dimType ); 1264 pcCU->setDimDeltaDC( dimType, segment, absPartIdx, valDeltaDC ); 1265 } 1266 } 1267 #endif 1268 } 1269 #if H_3D_DIM_SDC && !QC_DIM_DELTADC_UNIFY_F0132 1270 } 1271 #endif 1079 pcCU->setSDCSegmentDCOffset( valDeltaDC, segment, absPartIdx ); 1080 } 1081 else 1082 { 1083 pcCU->setDimDeltaDC( dimType, segment, absPartIdx, valDeltaDC ); 1084 } 1085 } 1086 } 1272 1087 1273 1088 pcCU->setLumaIntraDirSubParts( (UChar)dir, absPartIdx, depth ); … … 1297 1112 else if( puIdx == 0 ) 1298 1113 { 1299 #if SEC_DMM3_RBC_F01471300 1114 while( binNum < 1 && symbol ) 1301 #else1302 while( binNum < 3 && symbol )1303 #endif1304 1115 { 1305 1116 ctxDepthMode = puIdx*3 + ((binNum >= 2) ? 2 : binNum); … … 1308 1119 binNum++; 1309 1120 } 1310 #if SEC_DMM3_RBC_F0147 1311 if( modeCode == 0 ) { dir = 0; sdcFlag = 0;} 1312 else if( modeCode == 1 ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 0;} 1313 #else 1314 if( modeCode == 0 ) { dir = 0; sdcFlag = 0;} 1315 else if( modeCode == 2 ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 0;} 1316 else if( modeCode == 6 ) { dir = (2*DMM3_IDX+DIM_OFFSET); sdcFlag = 0;} 1317 else if( modeCode == 7 ) { dir = (2* RBC_IDX+DIM_OFFSET); sdcFlag = 0;} 1318 #endif 1121 if( modeCode == 0 ) 1122 { 1123 dir = 0; 1124 sdcFlag = 0; 1125 } 1126 else if ( modeCode == 1 ) 1127 { 1128 dir = (2*DMM1_IDX+DIM_OFFSET); 1129 sdcFlag = 0; 1130 } 1319 1131 } 1320 1132 else 1321 1133 { 1322 #if SEC_DMM3_RBC_F01471323 1134 while( binNum < 4 && symbol ) 1324 1135 { … … 1333 1144 else if ( modeCode == 14 ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 0;} 1334 1145 else if ( modeCode == 15 ) { dir = (2*DMM4_IDX+DIM_OFFSET); sdcFlag = 0;} 1335 #else 1336 UInt maxBinNum = 0; 1337 m_pcTDecBinIf->decodeBinEP(symbol); 1338 if( symbol == 1 ) 1339 { 1340 maxBinNum = 3; 1341 } 1342 else 1343 { 1344 maxBinNum = 2; 1345 symbol = 1; 1346 } 1347 while( binNum<maxBinNum && symbol ) 1348 { 1349 ctxDepthMode = puIdx*3 + ( binNum >= 2 ? 2 : binNum ); 1350 m_pcTDecBinIf->decodeBin(symbol,m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode)); 1351 modeCode = (modeCode<<1)+symbol; 1352 binNum++; 1353 } 1354 if( maxBinNum == 3 ) 1355 { 1356 if ( modeCode == 0 ) { dir = PLANAR_IDX; sdcFlag = 1;} 1357 else if ( modeCode == 2 ) { dir = (2* RBC_IDX+DIM_OFFSET); sdcFlag = 0;} 1358 else if ( modeCode == 6 ) { dir = (2*DMM3_IDX+DIM_OFFSET); sdcFlag = 0;} 1359 else if ( modeCode == 7 ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 0;} 1360 } 1361 else 1362 { 1363 if ( modeCode == 0 ) { dir = 5; sdcFlag = 0;} 1364 else if ( modeCode == 2 ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 1;} 1365 else if ( modeCode == 3 ) { dir = (2*DMM4_IDX+DIM_OFFSET); sdcFlag = 0;} 1366 } 1367 #endif 1146 1368 1147 } 1369 1148 pcCU->setLumaIntraDirSubParts( (UChar)dir, absPartIdx, depth );
Note: See TracChangeset for help on using the changeset viewer.