Changeset 827 in 3DVCSoftware for branches/HTM-9.3-dev0/source/Lib/TLibDecoder/TDecSbac.cpp
- Timestamp:
- 5 Feb 2014, 20:06:56 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-9.3-dev0/source/Lib/TLibDecoder/TDecSbac.cpp
r826 r827 87 87 , m_cDdcFlagSCModel ( 1, 1, NUM_DDC_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 88 88 , m_cDdcDataSCModel ( 1, 1, NUM_DDC_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) 89 #if QC_GENERIC_SDC_G0122 90 , m_cAngleFlagSCModel ( 1, 1, NUM_ANGLE_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 91 #if !QC_SDC_UNIFY_G0130 92 , m_cIntraSdcFlagSCModel ( 1, 1, NUM_INTRASDC_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 93 #endif 94 #endif 89 95 #if H_3D_DIM_DMM 90 96 , m_cDmm1DataSCModel ( 1, 1, NUM_DMM1_DATA_CTX , m_contextModels + m_numContextModels, m_numContextModels) … … 95 101 #endif 96 102 #endif 97 #if H_3D_INTER_SDC 103 #if H_3D_INTER_SDC && !QC_SDC_UNIFY_G0130 98 104 , m_cInterSDCFlagSCModel ( 1, 1, NUM_INTER_SDC_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 99 105 , m_cInterSDCResidualSCModel ( 1, 1, NUM_INTER_SDC_RESIDUAL_CTX , m_contextModels + m_numContextModels, m_numContextModels) 100 106 , m_cInterSDCResidualSignFlagSCModel ( 1, 1, NUM_INTER_SDC_SIGN_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 107 #endif 108 #if QC_SDC_UNIFY_G0130 109 , m_cSDCFlagSCModel ( 1, 1, NUM_SDC_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 101 110 #endif 102 111 #if H_3D_DBBP … … 173 182 m_cDdcFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_DDC_FLAG ); 174 183 m_cDdcDataSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_DDC_DATA ); 184 #if QC_GENERIC_SDC_G0122 185 m_cAngleFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_ANGLE_FLAG ); 186 #if !QC_SDC_UNIFY_G0130 187 m_cIntraSdcFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_INTRASDC_FLAG ); 188 #endif 189 #endif 175 190 #if H_3D_DIM_DMM 176 191 m_cDmm1DataSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_DMM1_DATA ); … … 181 196 #endif 182 197 #endif 183 #if H_3D_INTER_SDC 198 #if H_3D_INTER_SDC && !QC_SDC_UNIFY_G0130 184 199 m_cInterSDCFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_INTER_SDC_FLAG ); 185 200 m_cInterSDCResidualSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_INTER_SDC_RESIDUAL ); 186 201 m_cInterSDCResidualSignFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_INTER_SDC_SIGN_FLAG ); 202 #endif 203 #if QC_SDC_UNIFY_G0130 204 m_cSDCFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SDC_FLAG ); 187 205 #endif 188 206 #if H_3D_DBBP … … 245 263 m_cDdcFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG ); 246 264 m_cDdcDataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DDC_DATA ); 265 #if QC_GENERIC_SDC_G0122 266 m_cAngleFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_ANGLE_FLAG ); 267 #if !QC_SDC_UNIFY_G0130 268 m_cIntraSdcFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTRASDC_FLAG ); 269 #endif 270 #endif 247 271 #if H_3D_DIM_DMM 248 272 m_cDmm1DataSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA ); … … 253 277 #endif 254 278 #endif 255 #if H_3D_INTER_SDC 279 #if H_3D_INTER_SDC && !QC_SDC_UNIFY_G0130 256 280 m_cInterSDCFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_FLAG ); 257 281 m_cInterSDCResidualSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_RESIDUAL ); 258 282 m_cInterSDCResidualSignFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_SIGN_FLAG ); 283 #endif 284 #if QC_SDC_UNIFY_G0130 285 m_cSDCFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SDC_FLAG ); 259 286 #endif 260 287 #if H_3D_DBBP … … 1018 1045 if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE ) 1019 1046 #if H_3D_DIM_SDC 1047 #if QC_GENERIC_SDC_G0122 1048 if( 1 ) // This should be cleaned up. 1049 #else 1020 1050 if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) ) 1051 #endif 1021 1052 #endif 1022 1053 { … … 1036 1067 if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE ) 1037 1068 #if H_3D_DIM_SDC 1069 #if QC_GENERIC_SDC_G0122 1070 if( 1 ) // This should be cleaned up. 1071 #else 1038 1072 if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) ) 1073 #endif 1039 1074 #endif 1040 1075 { … … 1139 1174 } 1140 1175 1176 #if !QC_SDC_UNIFY_G0130 1141 1177 if( dimType < DIM_NUM_TYPE || pcCU->getSDCFlag( absPartIdx ) ) 1142 1178 { 1143 1179 UInt symbol; 1180 #if QC_GENERIC_SDC_G0122 1181 UInt uiNumSegments = isDimMode( dir ) ? 2 : 1; 1182 #else 1144 1183 UInt uiNumSegments = ( dir == PLANAR_IDX ) ? 1 : 2; 1184 #endif 1145 1185 1146 1186 if( pcCU->getSDCFlag( absPartIdx ) ) … … 1178 1218 } 1179 1219 } 1180 1220 #endif 1181 1221 pcCU->setLumaIntraDirSubParts( (UChar)dir, absPartIdx, depth ); 1182 1222 } 1183 1223 1224 #if QC_GENERIC_SDC_G0122 1225 Void TDecSbac::parseIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx, UInt depth ) 1226 { 1227 UInt uiSymbol, uiIsDimMode; 1228 1229 if( ( pcCU->getSlice()->getSPS()->getMaxCUWidth() >> pcCU->getDepth( absPartIdx ) ) < 64 ) //DMM and HEVC intra modes are both allowed 1230 { 1231 m_pcTDecBinIf->decodeBin( uiSymbol, m_cAngleFlagSCModel.get( 0, 0, pcCU->getCtxAngleFlag( absPartIdx ) ) ); 1232 } 1233 else 1234 { 1235 uiSymbol = 1; 1236 } 1237 uiIsDimMode = uiSymbol ? 0 : 1; 1238 pcCU->setLumaIntraDirSubParts( 0, absPartIdx, depth ); 1239 #if !QC_SDC_UNIFY_G0130 1240 if( pcCU->getPartitionSize( absPartIdx ) == SIZE_2Nx2N ) //SDC is allowed only in this case 1241 { 1242 m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraSdcFlagSCModel.get( 0, 0, pcCU->getCtxSDCFlag( absPartIdx ) ) ); 1243 } 1244 else 1245 { 1246 uiSymbol = 0; 1247 } 1248 1249 pcCU->setSDCFlagSubParts( uiSymbol, absPartIdx, depth ); 1250 #endif 1251 //decode DMM index 1252 if( uiIsDimMode ) 1253 { 1254 m_pcTDecBinIf->decodeBin( uiSymbol, m_cDepthIntraModeSCModel.get( 0, 0, 0 ) ); 1255 if( !uiSymbol ) 1256 { 1257 pcCU->setLumaIntraDirSubParts( ( 2 * DMM1_IDX + DIM_OFFSET ), absPartIdx, depth ); 1258 } 1259 else 1260 { 1261 pcCU->setLumaIntraDirSubParts( ( 2 * DMM4_IDX + DIM_OFFSET ), absPartIdx, depth ); 1262 } 1263 } 1264 } 1265 #else 1184 1266 Void TDecSbac::parseIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx, UInt depth ) 1185 1267 { … … 1244 1326 #endif 1245 1327 } 1328 #endif 1246 1329 #endif 1247 1330 … … 2198 2281 2199 2282 #if H_3D_INTER_SDC 2283 #if QC_SDC_UNIFY_G0130 2284 Void TDecSbac::parseDeltaDC( TComDataCU* pcCU, UInt absPartIdx, UInt depth ) 2285 { 2286 if( ! ( pcCU->getSDCFlag( absPartIdx ) || ( pcCU->isIntra( absPartIdx ) && getDimType( pcCU->getLumaIntraDir( absPartIdx ) ) < DIM_NUM_TYPE ) ) ) 2287 { 2288 assert( 0 ); 2289 } 2290 2291 UInt symbol = 0; 2292 UInt uiNumSegments = 0; 2293 2294 if( pcCU->isIntra( absPartIdx ) ) 2295 { 2296 UInt dir = pcCU->getLumaIntraDir( absPartIdx ); 2297 uiNumSegments = isDimMode( dir ) ? 2 : 1; 2298 2299 m_pcTDecBinIf->decodeBin( symbol, m_cDdcFlagSCModel.get( 0, 0, uiNumSegments-1 ) ); 2300 2301 if( pcCU->getSDCFlag( absPartIdx ) ) 2302 { 2303 assert( pcCU->getPartitionSize( absPartIdx ) == SIZE_2Nx2N ); 2304 pcCU->setTrIdxSubParts( 0, absPartIdx, depth ); 2305 pcCU->setCbfSubParts( 1, 1, 1, absPartIdx, depth ); 2306 } 2307 else 2308 { 2309 pcCU->setLumaIntraDirSubParts( dir + symbol, absPartIdx, depth ); 2310 } 2311 } 2312 else 2313 { 2314 #if SEC_INTER_SDC_G0101 2315 uiNumSegments = 1; 2316 #else 2317 PartSize cPartSize = pcCU->getPartitionSize( absPartIdx ); 2318 uiNumSegments = ( cPartSize == SIZE_2Nx2N ) ? 1 : ( cPartSize == SIZE_NxN ? 4 : 2 ); 2319 #endif 2320 symbol = 1; 2321 } 2322 2323 2324 for( UInt segment = 0; segment < uiNumSegments; segment++ ) 2325 { 2326 Pel valDeltaDC = 0; 2327 if( symbol ) 2328 { 2329 xParseDimDeltaDC( valDeltaDC, uiNumSegments ); 2330 } 2331 2332 if( pcCU->isIntra( absPartIdx ) ) 2333 { 2334 UInt dir = pcCU->getLumaIntraDir( absPartIdx ); 2335 2336 if( pcCU->getSDCFlag( absPartIdx ) ) 2337 { 2338 pcCU->setSDCSegmentDCOffset( valDeltaDC, segment, absPartIdx ); 2339 } 2340 else 2341 { 2342 pcCU->setDimDeltaDC( getDimType( dir ), segment, absPartIdx, valDeltaDC ); 2343 } 2344 } 2345 else 2346 { 2347 pcCU->setSDCSegmentDCOffset( valDeltaDC, segment, absPartIdx ); 2348 } 2349 } 2350 } 2351 2352 Void TDecSbac::parseSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) 2353 { 2354 UInt uiSymbol = 0; 2355 UInt uiCtxSDCFlag = pcCU->getCtxSDCFlag( uiAbsPartIdx ); 2356 2357 m_pcTDecBinIf->decodeBin( uiSymbol, m_cSDCFlagSCModel.get( 0, 0, uiCtxSDCFlag ) ); 2358 2359 if( uiSymbol ) 2360 { 2361 pcCU->setSDCFlagSubParts( true, uiAbsPartIdx, uiDepth ); 2362 pcCU->setTrIdxSubParts( 0, uiAbsPartIdx, uiDepth ); 2363 pcCU->setCbfSubParts( 1, 1, 1, uiAbsPartIdx, uiDepth ); 2364 } 2365 else 2366 { 2367 pcCU->setSDCFlagSubParts( false, uiAbsPartIdx, uiDepth ); 2368 } 2369 } 2370 #else 2200 2371 Void TDecSbac::parseInterSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) 2201 2372 { … … 2231 2402 pcCU->setInterSDCSegmentDCOffset( iIdx, uiSegment, uiAbsPartIdx ); 2232 2403 } 2404 #endif 2233 2405 #endif 2234 2406
Note: See TracChangeset for help on using the changeset viewer.