Changeset 833 in 3DVCSoftware for trunk/source/Lib/TLibDecoder/TDecSbac.cpp


Ignore:
Timestamp:
7 Feb 2014, 20:31:12 (10 years ago)
Author:
tech
Message:

Merged 9.3-dev0@831.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibDecoder/TDecSbac.cpp

    r773 r833  
    8787, m_cDdcFlagSCModel           ( 1,             1,               NUM_DDC_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    8888, 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
    8995#if H_3D_DIM_DMM
    9096, m_cDmm1DataSCModel          ( 1,             1,               NUM_DMM1_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     
    95101#endif
    96102#endif
    97 #if H_3D_INTER_SDC
     103#if H_3D_INTER_SDC && !QC_SDC_UNIFY_G0130
    98104, m_cInterSDCFlagSCModel             ( 1,             1,  NUM_INTER_SDC_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
    99105, m_cInterSDCResidualSCModel         ( 1,             1,  NUM_INTER_SDC_RESIDUAL_CTX       , m_contextModels + m_numContextModels, m_numContextModels)
    100106, 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)
     110#endif
     111#if H_3D_DBBP
     112, m_cDBBPFlagSCModel             ( 1,             1,                 DBBP_NUM_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
    101113#endif
    102114{
     
    170182  m_cDdcFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DDC_FLAG );
    171183  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
    172190#if H_3D_DIM_DMM
    173191  m_cDmm1DataSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_DMM1_DATA );
     
    178196#endif
    179197#endif
    180 #if H_3D_INTER_SDC
     198#if H_3D_INTER_SDC && !QC_SDC_UNIFY_G0130
    181199  m_cInterSDCFlagSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_INTER_SDC_FLAG );
    182200  m_cInterSDCResidualSCModel.initBuffer   ( sliceType, qp, (UChar*)INIT_INTER_SDC_RESIDUAL );
    183201  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 );
     205#endif
     206#if H_3D_DBBP
     207  m_cDBBPFlagSCModel.initBuffer              ( sliceType, qp, (UChar*)INIT_DBBP_FLAG );
    184208#endif
    185209  m_uiLastDQpNonZero  = 0;
     
    239263  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
    240264  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
    241271#if H_3D_DIM_DMM
    242272  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
     
    247277#endif
    248278#endif
    249 #if H_3D_INTER_SDC
     279#if H_3D_INTER_SDC && !QC_SDC_UNIFY_G0130
    250280  m_cInterSDCFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_FLAG );
    251281  m_cInterSDCResidualSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_RESIDUAL );
    252282  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 );
     286#endif
     287#if H_3D_DBBP
     288  m_cDBBPFlagSCModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_DBBP_FLAG );
    253289#endif
    254290  m_pcTDecBinIf->start();
     
    784820  Bool rapPic     = (pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA);
    785821
     822#if MTK_TEX_DEP_PAR_G0055
     823  Bool depthDependent = false;
     824  UInt uiTexturePart = uiMode;
     825#endif
    786826  if(bDepthMapDetect && !bIntraSliceDetect && !rapPic && sps->getUseQTL() && sps->getUsePC())
    787827  {
    788828    TComDataCU *pcTextureCU = pcTexture->getCU(pcCU->getAddr());
    789829    assert(pcTextureCU->getDepth(uiAbsPartIdx) >= uiDepth);
     830#if !MTK_TEX_DEP_PAR_G0055
    790831    if (pcTextureCU->getDepth(uiAbsPartIdx) == uiDepth && pcTextureCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN)
     832#else
     833    if(pcTextureCU->getDepth(uiAbsPartIdx) == uiDepth )
     834    {
     835      depthDependent = true;
     836      uiTexturePart = pcTextureCU->getPartitionSize( uiAbsPartIdx );
     837    }
     838    if (pcTextureCU->getDepth(uiAbsPartIdx) == uiDepth && pcTextureCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N)
     839#endif
    791840    {
    792841      bParsePartSize = false;
     
    833882    if(bParsePartSize)
    834883    {
     884#endif
     885#if MTK_TEX_DEP_PAR_G0055
     886      if (depthDependent==false || uiTexturePart == SIZE_NxN|| uiTexturePart == SIZE_2Nx2N)
     887      {
    835888#endif
    836889      UInt uiMaxNumBits = 2;
     
    870923        }
    871924      }
     925#if MTK_TEX_DEP_PAR_G0055
     926      }
     927      else if(uiTexturePart == SIZE_2NxN || uiTexturePart == SIZE_2NxnU || uiTexturePart == SIZE_2NxnD)
     928      {
     929        UInt uiMaxNumBits = 1;
     930        if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
     931        {
     932          uiMaxNumBits ++;
     933        }
     934        for ( UInt ui = 0; ui < uiMaxNumBits; ui++ )
     935        {
     936          m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) );
     937          if ( uiSymbol )
     938          {
     939            break;
     940          }
     941          uiMode++;
     942        }
     943        eMode = (PartSize) uiMode;
     944        if(uiMode && pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) && uiSymbol==1 )
     945        {
     946          eMode = SIZE_2NxN;
     947        }
     948        else if (uiMode && pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth )==0  && uiSymbol==0)
     949        {
     950          eMode = SIZE_2NxN;
     951        }
     952        else if (uiMode && pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) && uiSymbol==0)
     953        {
     954          m_pcTDecBinIf->decodeBinEP(uiSymbol);
     955          eMode = (uiSymbol == 0? SIZE_2NxnU : SIZE_2NxnD);
     956        }
     957      }
     958      else if(uiTexturePart == SIZE_Nx2N|| uiTexturePart==SIZE_nLx2N || uiTexturePart==SIZE_nRx2N)
     959      {
     960        UInt uiMaxNumBits = 1;
     961        if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
     962        {
     963          uiMaxNumBits ++;
     964        }
     965        for ( UInt ui = 0; ui < uiMaxNumBits; ui++ )
     966        {
     967          m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) );
     968          if ( uiSymbol )
     969          {
     970            break;
     971          }
     972          uiMode++;
     973        }
     974        eMode = (PartSize) uiMode;
     975        if(uiMode && pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) && uiSymbol==1 )
     976        {
     977          eMode = SIZE_Nx2N;
     978        }
     979        else if (uiMode && pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth )==0  && uiSymbol==0)
     980        {
     981          eMode = SIZE_Nx2N;
     982        }
     983        else if (uiMode && pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) && uiSymbol==0)
     984        {
     985          m_pcTDecBinIf->decodeBinEP(uiSymbol);
     986          eMode = (uiSymbol == 0? SIZE_nLx2N : SIZE_nRx2N);
     987        }
     988      }
     989      else
     990        assert(0);
     991#endif
    872992#if H_MV_ENC_DEC_TRAC         
    873993      DTRACE_CU("part_mode", eMode )
     
    9251045    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
    9261046#if H_3D_DIM_SDC
     1047#if QC_GENERIC_SDC_G0122
     1048      if( 1 ) // This should be cleaned up.
     1049#else
    9271050      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     1051#endif
    9281052#endif
    9291053    {
     
    9431067    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
    9441068#if H_3D_DIM_SDC
     1069#if QC_GENERIC_SDC_G0122
     1070      if( 1 )  // This should be cleaned up.
     1071#else
    9451072      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     1073#endif
    9461074#endif
    9471075    {
     
    10461174  }
    10471175
     1176#if !QC_SDC_UNIFY_G0130
    10481177  if( dimType < DIM_NUM_TYPE || pcCU->getSDCFlag( absPartIdx ) )
    10491178  {
    10501179    UInt symbol;
     1180#if QC_GENERIC_SDC_G0122
     1181    UInt uiNumSegments = isDimMode( dir ) ? 2 : 1;
     1182#else
    10511183    UInt uiNumSegments = ( dir == PLANAR_IDX ) ? 1 : 2;
     1184#endif
    10521185
    10531186    if( pcCU->getSDCFlag( absPartIdx ) )
     
    10851218    }
    10861219  }
    1087 
     1220#endif
    10881221  pcCU->setLumaIntraDirSubParts( (UChar)dir, absPartIdx, depth );
    10891222}
    10901223
     1224#if QC_GENERIC_SDC_G0122
     1225Void 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
    10911266Void TDecSbac::parseIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx, UInt depth )
    10921267{
     
    11511326#endif
    11521327}
     1328#endif
    11531329#endif
    11541330
     
    20582234  if( 1 == uiW )   
    20592235  {
     2236#if MTK_ARP_FLAG_CABAC_SIMP_G0061
     2237    m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPWSCModel.get( 0, 0, 2 ) );
     2238#else
    20602239    m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPWSCModel.get( 0, 0, 3 ) );
     2240#endif
    20612241    uiW += ( 1 == uiCode ? 1 : 0 );
    20622242  }
     
    20782258{
    20792259  UInt uiSymbol = 0;
     2260#if MTK_IC_FLAG_CABAC_SIMP_G0061
     2261  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUICFlagSCModel.get( 0, 0, 0 ) );
     2262#else
    20802263  UInt uiCtxIC = pcCU->getCtxICFlag( uiAbsPartIdx );
    20812264  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUICFlagSCModel.get( 0, 0, uiCtxIC ) );
     2265#endif
    20822266#if !H_MV_ENC_DEC_TRAC
    20832267  DTRACE_CABAC_VL( g_nSymbolCounter++ );
     
    20972281
    20982282#if H_3D_INTER_SDC
     2283#if QC_SDC_UNIFY_G0130
     2284Void 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
     2352Void 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
    20992371Void TDecSbac::parseInterSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    21002372{
     
    21312403}
    21322404#endif
     2405#endif
     2406
     2407#if H_3D_DBBP
     2408Void TDecSbac::parseDBBPFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2409{
     2410  PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
     2411  AOF( pcCU->getSlice()->getVPS()->getUseDBBP(pcCU->getSlice()->getLayerIdInVps()) );
     2412  AOF( !pcCU->getSlice()->getIsDepth() );
     2413  AOF( ePartSize == RWTH_DBBP_PACK_MODE );
     2414 
     2415  UInt uiSymbol = 0;
     2416 
     2417  m_pcTDecBinIf->decodeBin( uiSymbol, m_cDBBPFlagSCModel.get( 0, 0, 0 ) );
     2418 
     2419  if( uiSymbol )
     2420  {
     2421    pcCU->setDBBPFlagSubParts(true, uiAbsPartIdx, 0, uiDepth);
     2422  }
     2423}
     2424#endif
    21332425
    21342426//! \}
Note: See TracChangeset for help on using the changeset viewer.