Changeset 804 in SHVCSoftware


Ignore:
Timestamp:
15 Jun 2014, 20:13:14 (11 years ago)
Author:
nokia
Message:

implementation for proposal JCTVC-Q0108.

  1. Enable to have different prediction structures in different layers.
  2. Remove cross-layer alignment constraints of TSA and STSA pictures
Location:
branches/SHM-6-dev/source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-6-dev/source/App/TAppEncoder/TAppEncCfg.cpp

    r797 r804  
    10051005  ("CGSLUTBit",     m_nCGSLUTBit , 12, "bit depth of CGS LUT")
    10061006#endif
     1007#if Q0108_TSA_STSA
     1008  ("InheritCodingStruct%d",m_inheritCodingStruct, 0, MAX_LAYERS, "Predicts the GOP structure of one layer for another layer")
     1009#endif
    10071010  ;
    10081011 
     
    10121015    opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry());
    10131016  }
     1017
     1018#if Q0108_TSA_STSA
     1019  for (Int i=1; i<MAX_LAYERS; i++)
     1020  for(Int j=1; j<MAX_GOP+1; j++){
     1021    std::ostringstream cOSS;
     1022    cOSS<<"Layer"<<i<<"Frame"<<j;
     1023    opts.addOptions()(cOSS.str(), m_EH_GOPList[i][j-1], GOPEntry());
     1024  }
     1025#endif
     1026
    10141027  po::setDefaults(opts);
    10151028  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
     1029
     1030#if Q0108_TSA_STSA
     1031  for (Int i=1; i<MAX_LAYERS; i++)
     1032  {
     1033    if(m_inheritCodingStruct[i] == 0)
     1034    {
     1035      for(Int j=1; j<MAX_GOP+1; j++)
     1036      {
     1037        m_EH_GOPList[i][j-1] = m_GOPList[j-1];
     1038      }
     1039    }
     1040    else if( m_inheritCodingStruct[i] > 0)
     1041    {
     1042      for(Int j=1; j<MAX_GOP+1; j++)
     1043      {
     1044        m_EH_GOPList[i][j-1] = m_EH_GOPList[m_inheritCodingStruct[i]][j-1];
     1045      }
     1046    }
     1047  }
     1048#endif
    10161049
    10171050  if(m_isField)
     
    19241957#endif
    19251958
    1926   m_extraRPSs=0;
     1959#if !Q0108_TSA_STSA
     1960   m_extraRPSs = 0;                                     
     1961#else
     1962   for (Int i = 0; i< MAX_LAYERS; i++)
     1963   {
     1964     m_extraRPSs[i] = 0;
     1965   }
     1966#endif
    19271967  //start looping through frames in coding order until we can verify that the GOP structure is correct.
    19281968  while(!verifiedGOP&&!errorGOP)
     
    19902030      {
    19912031        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
     2032#if !Q0108_TSA_STSA
    19922033        m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
     2034#else
     2035        m_GOPList[m_iGOPSize+m_extraRPSs[0]]=m_GOPList[curGOP];
     2036#endif
    19932037        Int newRefs=0;
    19942038        for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
     
    19972041          if(absPOC>=0)
    19982042          {
     2043#if !Q0108_TSA_STSA
    19992044            m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
    20002045            m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
     2046#else
     2047            m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
     2048            m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
     2049#endif
    20012050            newRefs++;
    20022051          }
     
    20212070            for(Int i=0; i<newRefs; i++)
    20222071            {
     2072#if !Q0108_TSA_STSA
    20232073              if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
     2074#else
     2075              if(m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[i]==offPOC-curPOC)
     2076#endif
    20242077              {
    20252078                newRef=false;
     
    20362089              for(Int j=0; j<newRefs; j++)
    20372090              {
     2091#if !Q0108_TSA_STSA
    20382092                if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
     2093#else
     2094                if(m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j]>0)
     2095#endif
    20392096                {
    20402097                  insertPoint = j;
     
    20462103              for(Int j=insertPoint; j<newRefs+1; j++)
    20472104              {
     2105#if !Q0108_TSA_STSA
    20482106                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
    20492107                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
    20502108                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
    20512109                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
     2110#else
     2111                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j];
     2112                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[j];
     2113                m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j]=prev;
     2114                m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[j]=prevUsed;
     2115#endif
     2116
    20522117                prevUsed=newUsed;
    20532118                prev=newPrev;
     
    20612126          }
    20622127        }
     2128#if !Q0108_TSA_STSA
    20632129        m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
    20642130        m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
     2131#else
     2132        m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefPics=newRefs;
     2133        m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_POC = curPOC;
     2134#endif
     2135#if !Q0108_TSA_STSA
    20652136        if (m_extraRPSs == 0)
    2066         {
     2137#else
     2138        if (m_extraRPSs[0] == 0)
     2139#endif
     2140        {
     2141#if !Q0108_TSA_STSA
    20672142          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
    20682143          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
     2144#else
     2145          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_interRPSPrediction = 0;
     2146          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefIdc = 0;
     2147#endif
    20692148        }
    20702149        else
    20712150        {
     2151#if !Q0108_TSA_STSA
    20722152          Int rIdx =  m_iGOPSize + m_extraRPSs - 1;
     2153#else
     2154          Int rIdx =  m_iGOPSize + m_extraRPSs[0] - 1;
     2155#endif
    20732156          Int refPOC = m_GOPList[rIdx].m_POC;
    20742157          Int refPics = m_GOPList[rIdx].m_numRefPics;
     
    20792162            Int absPOCref = refPOC+deltaPOC;
    20802163            Int refIdc = 0;
     2164#if !Q0108_TSA_STSA
    20812165            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
    20822166            {
     
    21032187        m_extraRPSs++;
    21042188      }
     2189#else
     2190            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefPics; j++)
     2191            {
     2192              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j])
     2193              {
     2194                if (m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[j])
     2195                {
     2196                  refIdc = 1;
     2197                }
     2198                else
     2199                {
     2200                  refIdc = 2;
     2201                }
     2202              }
     2203            }
     2204            m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_refIdc[newIdc]=refIdc;
     2205            newIdc++;
     2206          }
     2207          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_interRPSPrediction = 1; 
     2208          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefIdc = newIdc;
     2209          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_POC;
     2210        }
     2211        curGOP=m_iGOPSize+m_extraRPSs[0];
     2212        m_extraRPSs[0]++;
     2213      }
     2214#endif
     2215
    21052216      numRefs=0;
    21062217      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
     
    21192230  }
    21202231  xConfirmPara(errorGOP,"Invalid GOP structure given");
     2232
     2233#if Q0108_TSA_STSA
     2234  for ( Int layer_index = 1; layer_index<m_numLayers; layer_index++)
     2235  {
     2236    verifiedGOP=false;
     2237    errorGOP=false;
     2238    checkGOP=1;
     2239    numRefs = m_isField ? 2 : 1;
     2240    refList[0]=0;
     2241    if(m_isField)
     2242    {
     2243      refList[1] = 1;
     2244    }
     2245    for(Int i=0; i<MAX_GOP; i++)
     2246    {
     2247      isOK[i]=false;
     2248    }
     2249    numOK=0;
     2250#if !SVC_EXTENSION
     2251    xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
     2252#endif
     2253
     2254  for(Int i=0; i<m_iGOPSize; i++)
     2255  {
     2256    if(m_EH_GOPList[layer_index][i].m_POC==m_iGOPSize)
     2257    {
     2258      xConfirmPara( m_EH_GOPList[layer_index][i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
     2259    }
     2260  }
     2261
     2262#if SVC_EXTENSION
     2263  xConfirmPara( m_numLayers > MAX_LAYERS , "Number of layers in config file is greater than MAX_LAYERS" );
     2264  m_numLayers = m_numLayers > MAX_LAYERS ? MAX_LAYERS : m_numLayers;
     2265
     2266  // verify layer configuration parameters
     2267  for(UInt layer=0; layer<m_numLayers; layer++)
     2268  {
     2269    Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
     2270#endif
     2271  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) )
     2272  {
     2273    for(Int i=0; i<m_iGOPSize; i++)
     2274    {
     2275      xConfirmPara( (m_EH_GOPList[layer_index][i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) < -6 || (m_EH_GOPList[layer_index][i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) > 6, "Loop Filter Beta Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)" );
     2276      xConfirmPara( (m_EH_GOPList[layer_index][i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) < -6 || (m_EH_GOPList[layer_index][i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) > 6, "Loop Filter Tc Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)" );
     2277    }
     2278  }
     2279#if SVC_EXTENSION
     2280  }
     2281#endif
     2282
     2283  //start looping through frames in coding order until we can verify that the GOP structure is correct.
     2284  while(!verifiedGOP&&!errorGOP)
     2285  {
     2286    Int curGOP = (checkGOP-1)%m_iGOPSize;
     2287    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_EH_GOPList[layer_index][curGOP].m_POC;   
     2288    if(m_EH_GOPList[layer_index][curGOP].m_POC<0)
     2289    {
     2290      printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
     2291      errorGOP=true;
     2292    }
     2293    else
     2294    {
     2295      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
     2296      Bool beforeI = false;
     2297      for(Int i = 0; i< m_EH_GOPList[layer_index][curGOP].m_numRefPics; i++)
     2298      {
     2299        Int absPOC = curPOC+m_EH_GOPList[layer_index][curGOP].m_referencePics[i];
     2300        if(absPOC < 0)
     2301        {
     2302          beforeI=true;
     2303        }
     2304        else
     2305        {
     2306          Bool found=false;
     2307          for(Int j=0; j<numRefs; j++)
     2308          {
     2309            if(refList[j]==absPOC)
     2310            {
     2311              found=true;
     2312              for(Int k=0; k<m_iGOPSize; k++)
     2313              {
     2314                if(absPOC%m_iGOPSize == m_EH_GOPList[layer_index][k].m_POC%m_iGOPSize)
     2315                {
     2316                  if(m_EH_GOPList[layer_index][k].m_temporalId==m_EH_GOPList[layer_index][curGOP].m_temporalId)
     2317                  {
     2318                    m_EH_GOPList[layer_index][k].m_refPic = true;
     2319                  }
     2320                  m_EH_GOPList[layer_index][curGOP].m_usedByCurrPic[i]=m_EH_GOPList[layer_index][k].m_temporalId<=m_EH_GOPList[layer_index][curGOP].m_temporalId;
     2321                }
     2322              }
     2323            }
     2324          }
     2325          if(!found)
     2326          {
     2327            printf("\nError: ref pic %d is not available for GOP frame %d\n",m_EH_GOPList[layer_index][curGOP].m_referencePics[i],curGOP+1);
     2328            errorGOP=true;
     2329          }
     2330        }
     2331      }
     2332      if(!beforeI&&!errorGOP)
     2333      {
     2334        //all ref frames were present
     2335        if(!isOK[curGOP])
     2336        {
     2337          numOK++;
     2338          isOK[curGOP]=true;
     2339          if(numOK==m_iGOPSize)
     2340          {
     2341            verifiedGOP=true;
     2342          }
     2343        }
     2344      }
     2345      else
     2346      {
     2347        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
     2348 
     2349        m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]]=m_EH_GOPList[layer_index][curGOP];
     2350        Int newRefs=0;
     2351        for(Int i = 0; i< m_EH_GOPList[layer_index][curGOP].m_numRefPics; i++)
     2352        {
     2353          Int absPOC = curPOC+m_EH_GOPList[layer_index][curGOP].m_referencePics[i];
     2354          if(absPOC>=0)
     2355          {
     2356            m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_referencePics[newRefs]=m_EH_GOPList[layer_index][curGOP].m_referencePics[i];
     2357            m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_usedByCurrPic[newRefs]=m_EH_GOPList[layer_index][curGOP].m_usedByCurrPic[i];
     2358            newRefs++;
     2359          }
     2360        }
     2361        Int numPrefRefs = m_EH_GOPList[layer_index][curGOP].m_numRefPicsActive;
     2362       
     2363        for(Int offset = -1; offset>-checkGOP; offset--)
     2364        {
     2365          //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
     2366          Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
     2367          Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_EH_GOPList[layer_index][offGOP].m_POC;
     2368          if(offPOC>=0&&m_EH_GOPList[layer_index][offGOP].m_temporalId<=m_EH_GOPList[layer_index][curGOP].m_temporalId)
     2369          {
     2370            Bool newRef=false;
     2371            for(Int i=0; i<numRefs; i++)
     2372            {
     2373              if(refList[i]==offPOC)
     2374              {
     2375                newRef=true;
     2376              }
     2377            }
     2378            for(Int i=0; i<newRefs; i++)
     2379            {
     2380              if(m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_referencePics[i]==offPOC-curPOC)
     2381              {
     2382                newRef=false;
     2383              }
     2384            }
     2385            if(newRef)
     2386            {
     2387              Int insertPoint=newRefs;
     2388              //this picture can be added, find appropriate place in list and insert it.
     2389              if(m_EH_GOPList[layer_index][offGOP].m_temporalId==m_EH_GOPList[layer_index][curGOP].m_temporalId)
     2390              {
     2391                m_EH_GOPList[layer_index][offGOP].m_refPic = true;
     2392              }
     2393              for(Int j=0; j<newRefs; j++)
     2394              {
     2395                if(m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_referencePics[j]<offPOC-curPOC||m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_referencePics[j]>0)
     2396                {
     2397                  insertPoint = j;
     2398                  break;
     2399                }
     2400              }
     2401              Int prev = offPOC-curPOC;
     2402              Int prevUsed = m_EH_GOPList[layer_index][offGOP].m_temporalId<=m_EH_GOPList[layer_index][curGOP].m_temporalId;
     2403              for(Int j=insertPoint; j<newRefs+1; j++)
     2404              {
     2405                Int newPrev = m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_referencePics[j];
     2406                Int newUsed = m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_usedByCurrPic[j];
     2407                m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_referencePics[j]=prev;
     2408                m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_usedByCurrPic[j]=prevUsed;
     2409                prevUsed=newUsed;
     2410                prev=newPrev;
     2411              }
     2412              newRefs++;
     2413            }
     2414          }
     2415          if(newRefs>=numPrefRefs)
     2416          {
     2417            break;
     2418          }
     2419        }
     2420        m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_numRefPics=newRefs;
     2421        m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_POC = curPOC;
     2422        if (m_extraRPSs[layer_index] == 0)
     2423        {
     2424          m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_interRPSPrediction = 0;
     2425          m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_numRefIdc = 0;
     2426        }
     2427        else
     2428        {
     2429          Int rIdx =  m_iGOPSize + m_extraRPSs[layer_index] - 1;
     2430          Int refPOC = m_EH_GOPList[layer_index][rIdx].m_POC;
     2431          Int refPics = m_EH_GOPList[layer_index][rIdx].m_numRefPics;
     2432          Int newIdc=0;
     2433          for(Int i = 0; i<= refPics; i++)
     2434          {
     2435            Int deltaPOC = ((i != refPics)? m_EH_GOPList[layer_index][rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
     2436            Int absPOCref = refPOC+deltaPOC;
     2437            Int refIdc = 0;
     2438            for (Int j = 0; j < m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_numRefPics; j++)
     2439            {
     2440              if ( (absPOCref - curPOC) == m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_referencePics[j])
     2441              {
     2442                if (m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_usedByCurrPic[j])
     2443                {
     2444                  refIdc = 1;
     2445                }
     2446                else
     2447                {
     2448                  refIdc = 2;
     2449                }
     2450              }
     2451            }
     2452            m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_refIdc[newIdc]=refIdc;
     2453            newIdc++;
     2454          }
     2455          m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_interRPSPrediction = 1; 
     2456          m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_numRefIdc = newIdc;
     2457          m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_deltaRPS = refPOC - m_EH_GOPList[layer_index][m_iGOPSize+m_extraRPSs[layer_index]].m_POC;
     2458        }
     2459        curGOP=m_iGOPSize+m_extraRPSs[layer_index];
     2460        m_extraRPSs[layer_index]++;
     2461      }
     2462      numRefs=0;
     2463      for(Int i = 0; i< m_EH_GOPList[layer_index][curGOP].m_numRefPics; i++)
     2464      {
     2465        Int absPOC = curPOC+m_EH_GOPList[layer_index][curGOP].m_referencePics[i];
     2466        if(absPOC >= 0)
     2467        {
     2468          refList[numRefs]=absPOC;
     2469          numRefs++;
     2470        }
     2471      }
     2472      refList[numRefs]=curPOC;
     2473      numRefs++;
     2474    }
     2475    checkGOP++;
     2476  }
     2477  xConfirmPara(errorGOP,"Invalid GOP structure given");
     2478  }
     2479#endif
     2480
     2481
    21212482  m_maxTempLayer = 1;
    21222483  for(Int i=0; i<m_iGOPSize; i++)
     
    21282489    xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P'&&m_GOPList[i].m_sliceType!='I', "Slice type must be equal to B or P or I");
    21292490  }
     2491
     2492#if Q0108_TSA_STSA
     2493  for ( Int layer_index = 1; layer_index<m_numLayers; layer_index++)
     2494  {
     2495    m_EH_maxTempLayer[layer_index] = 1;
     2496    for(Int i=0; i<m_iGOPSize; i++)
     2497    {
     2498      if(m_EH_GOPList[layer_index][i].m_temporalId >= m_EH_maxTempLayer[layer_index] )
     2499      {
     2500        m_EH_maxTempLayer[layer_index] = m_EH_GOPList[layer_index][i].m_temporalId;
     2501      }
     2502      xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P'&&m_GOPList[i].m_sliceType!='I', "Slice type must be equal to B or P or I");
     2503    }
     2504  }
     2505#endif
     2506
    21302507  for(Int i=0; i<MAX_TLAYER; i++)
    21312508  {
  • branches/SHM-6-dev/source/App/TAppEncoder/TAppEncCfg.h

    r779 r804  
    125125  Int       m_iDecodingRefreshType;                           ///< random access type
    126126  Int       m_iGOPSize;                                       ///< GOP size of hierarchical structure
     127
     128#if !Q0108_TSA_STSA
    127129  Int       m_extraRPSs;                                      ///< extra RPSs added to handle CRA
     130#else
     131  Int       m_extraRPSs[MAX_LAYERS];                                      ///< extra RPSs added to handle CRA
     132#endif
     133
    128134  GOPEntry  m_GOPList[MAX_GOP];                               ///< the coding structure entries from the config file
     135#if Q0108_TSA_STSA
     136  GOPEntry  m_EH_GOPList[MAX_LAYERS][MAX_GOP];                ///< the enhancement layer coding structure entries from the config file
     137  Int       m_inheritCodingStruct[MAX_LAYERS];
     138#endif
     139
    129140  Int       m_numReorderPics[MAX_TLAYER];                     ///< total number of reorder pictures
    130141  Int       m_maxDecPicBuffering[MAX_TLAYER];                 ///< total number of pictures in the decoded picture buffer
     
    154165 
    155166  Int       m_maxTempLayer;                                  ///< Max temporal layer
     167#if Q0108_TSA_STSA
     168  Int       m_EH_maxTempLayer[MAX_LAYERS];                                  ///< Max temporal layer
     169#endif
    156170
    157171#if !LAYER_CTB
  • branches/SHM-6-dev/source/App/TAppEncoder/TAppEncTop.cpp

    r801 r804  
    240240    m_acTEncTop[layer].setDecodingRefreshType          ( m_iDecodingRefreshType );
    241241    m_acTEncTop[layer].setGOPSize                      ( m_iGOPSize );
     242#if Q0108_TSA_STSA
     243    if(layer == 0)
     244      m_acTEncTop[layer].setGopList                      ( m_GOPList );
     245    else
     246      m_acTEncTop[layer].setGopList                      ( m_EH_GOPList[layer] );
     247#else
    242248    m_acTEncTop[layer].setGopList                      ( m_GOPList );
    243 
     249#endif
     250
     251#if !Q0108_TSA_STSA
    244252    m_acTEncTop[layer].setExtraRPSs                    ( m_extraRPSs );
     253#else
     254    m_acTEncTop[layer].setExtraRPSs                    ( m_extraRPSs[layer] );
     255#endif
    245256    for(Int i = 0; i < MAX_TLAYER; i++)
    246257    {
     
    255266
    256267    m_acTEncTop[layer].setPad                          ( m_acLayerCfg[layer].getPad() );
    257 
     268#if !Q0108_TSA_STSA
    258269    m_acTEncTop[layer].setMaxTempLayer                 ( m_maxTempLayer );
     270#else
     271    if (layer== 0)
     272    {
     273      m_acTEncTop[layer].setMaxTempLayer                 ( m_maxTempLayer );
     274    }
     275    else
     276    {
     277      m_acTEncTop[layer].setMaxTempLayer                 ( m_EH_maxTempLayer[layer] );
     278    }
     279#endif
    259280    m_acTEncTop[layer].setUseAMP( m_enableAMP );
    260281
  • branches/SHM-6-dev/source/Lib/TLibCommon/TypeDef.h

    r801 r804  
    4040
    4141#define SVC_EXTENSION                    1
     42
     43#define Q0108_TSA_STSA                   1     
    4244
    4345#define SYNTAX_BYTES                     10      ///< number of bytes taken by syntaxes per 4x4 block [RefIdxL0(1byte), RefIdxL1(1byte), MVxL0(2bytes), MVyL0(2bytes), MVxL1(2bytes), MVyL1(2bytes)]
  • branches/SHM-6-dev/source/Lib/TLibDecoder/NALread.cpp

    r595 r804  
    114114  if ( nalu.m_temporalId )
    115115  {
     116#if    !Q0108_TSA_STSA
    116117    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_W_LP
    117118         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_W_RADL
     
    124125         && nalu.m_nalUnitType != NAL_UNIT_EOS
    125126         && nalu.m_nalUnitType != NAL_UNIT_EOB );
     127#else
     128    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_W_LP
     129         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_W_RADL
     130         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_N_LP
     131         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_IDR_W_RADL
     132         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_IDR_N_LP
     133         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_CRA
     134         && nalu.m_nalUnitType != NAL_UNIT_VPS
     135         && nalu.m_nalUnitType != NAL_UNIT_SPS
     136         && nalu.m_nalUnitType != NAL_UNIT_EOS);
     137#endif
    126138  }
    127139  else
    128140  {
     141#if    !Q0108_TSA_STSA
    129142    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_R
    130143         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_N
    131144         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_R
    132          && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_N );
     145         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_N
     146         );
     147#else
     148    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_R
     149         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_N
     150         );
     151#endif
    133152  }
    134153}
  • branches/SHM-6-dev/source/Lib/TLibDecoder/TDecTop.cpp

    r798 r804  
    14101410#endif
    14111411  // Alignment of TSA and STSA pictures across AU
     1412#if !Q0108_TSA_STSA
    14121413  if( m_apcSlicePilot->getLayerId() > 0 )
    14131414  {
     
    14461447    }
    14471448  }
     1449#endif
    14481450
    14491451#else //SVC_EXTENSION
  • branches/SHM-6-dev/source/Lib/TLibEncoder/TEncGOP.cpp

    r798 r804  
    609609  TEncSbac* pcSbacCoders = NULL;
    610610  TComOutputBitstream* pcSubstreamsOut = NULL;
     611#if Q0108_TSA_STSA
     612  Int b_TSTA_flag = 0;
     613#endif
    611614
    612615  xInitGOP( iPOCLast, iNumPicRcvd, rcListPic, rcListPicYuvRecOut, isField );
     
    13881391      if(pcSlice->isTemporalLayerSwitchingPoint(rcListPic) || pcSlice->getSPS()->getTemporalIdNestingFlag())
    13891392      {
    1390 #if SVC_EXTENSION
    1391         // Alignment of TSA pictures across AU
     1393#if !Q0108_TSA_STSA
    13921394        if( pcSlice->getLayerId() > 0 )
    13931395        {
     
    14451447          }
    14461448        }
    1447 #else  //SVC_EXTENSION
     1449#else
    14481450        if(pcSlice->getTemporalLayerNonReferenceFlag())
    14491451        {
     
    14541456          pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_TSA_R);
    14551457        }
    1456 #endif //SVC_EXTENSION
     1458#endif
    14571459      }
    14581460      else if(pcSlice->isStepwiseTemporalLayerSwitchingPointCandidate(rcListPic))
     
    14881490        if(isSTSA==true)
    14891491        {   
    1490 #if SVC_EXTENSION
    1491           // Alignment of STSA pictures across AU
     1492#if !Q0108_TSA_STSA
    14921493          if( pcSlice->getLayerId() > 0 )
    14931494          {
     
    15451546            }
    15461547          }
    1547 #else  //SVC_EXTENSION
     1548#else
    15481549          if(pcSlice->getTemporalLayerNonReferenceFlag())
    15491550          {
     
    15541555            pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_R);
    15551556          }
    1556 #endif //SVC_EXTENSION
    1557         }
    1558       }
    1559     }
     1557#endif
     1558        }
     1559      }
     1560    }
     1561#if    Q0108_TSA_STSA
     1562    else if( ( pcSlice->getTLayer() == 0 && pcSlice->getLayerId() > 0)    // only for enhancement layer and with temporal layer 0
     1563       && !( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_N     
     1564          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_R
     1565          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N
     1566          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_R
     1567          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL
     1568          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP
     1569          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA
     1570          )
     1571        )
     1572    {
     1573        Bool isSTSA=true;
     1574        for(Int ii=iGOPid+1;(ii<m_pcCfg->getGOPSize() && isSTSA==true);ii++)
     1575        {
     1576          Int lTid= m_pcCfg->getGOPEntry(ii).m_temporalId;
     1577          if(lTid==pcSlice->getTLayer())
     1578          {
     1579            TComReferencePictureSet* nRPS = pcSlice->getSPS()->getRPSList()->getReferencePictureSet(ii);
     1580            for(Int jj=0;jj<nRPS->getNumberOfPictures();jj++)
     1581            {
     1582              if(nRPS->getUsed(jj))
     1583              {
     1584                Int tPoc=m_pcCfg->getGOPEntry(ii).m_POC+nRPS->getDeltaPOC(jj);
     1585                Int kk=0;
     1586                for(kk=0;kk<m_pcCfg->getGOPSize();kk++)
     1587                {
     1588                  if(m_pcCfg->getGOPEntry(kk).m_POC==tPoc)
     1589                    break;
     1590                }
     1591                Int tTid=m_pcCfg->getGOPEntry(kk).m_temporalId;
     1592                if(tTid >= pcSlice->getTLayer())
     1593                {
     1594                  isSTSA=false;
     1595                  break;
     1596                }
     1597              }
     1598            }
     1599          }
     1600        }
     1601        if(isSTSA==true)
     1602        {   
     1603#if !Q0108_TSA_STSA
     1604          if( pcSlice->getLayerId() > 0 )
     1605          {
     1606            Bool oneRefLayerSTSA = false, oneRefLayerNotSTSA = false;
     1607            for( Int i = 0; i < pcSlice->getLayerId(); i++)
     1608            {
     1609              TComList<TComPic *> *cListPic = m_ppcTEncTop[i]->getListPic();
     1610              TComPic *lowerLayerPic = pcSlice->getRefPic(*cListPic, pcSlice->getPOC());
     1611              if( lowerLayerPic && pcSlice->getVPS()->getDirectDependencyFlag(pcSlice->getLayerId(), i) )
     1612              {
     1613                if( ( lowerLayerPic->getSlice(0)->getNalUnitType() == NAL_UNIT_CODED_SLICE_STSA_N ) ||
     1614                    ( lowerLayerPic->getSlice(0)->getNalUnitType() == NAL_UNIT_CODED_SLICE_STSA_R )
     1615                  )
     1616                {
     1617                  if(pcSlice->getTemporalLayerNonReferenceFlag() )
     1618                  {
     1619                    pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_N);
     1620                  }
     1621                  else
     1622                  {
     1623                    pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_R );
     1624                  }
     1625                  oneRefLayerSTSA = true;
     1626                }
     1627                else
     1628                {
     1629                  oneRefLayerNotSTSA = true;
     1630                }
     1631              }
     1632            }
     1633            assert( !( oneRefLayerNotSTSA && oneRefLayerSTSA ) ); // Only one variable should be true - failure of this assert means
     1634                                                                  // that two independent reference layers that are not dependent on
     1635                                                                  // each other, but are reference for current layer have inconsistency
     1636            if( oneRefLayerNotSTSA /*&& !oneRefLayerSTSA*/ )          // No reference layer is STSA - set current as TRAIL
     1637            {
     1638              if(pcSlice->getTemporalLayerNonReferenceFlag() )
     1639              {
     1640                pcSlice->setNalUnitType( NAL_UNIT_CODED_SLICE_TRAIL_N );
     1641              }
     1642              else
     1643              {
     1644                pcSlice->setNalUnitType( NAL_UNIT_CODED_SLICE_TRAIL_R );
     1645              }
     1646            }
     1647            else  // This means there is no reference layer picture for current picture in this AU
     1648            {
     1649              if(pcSlice->getTemporalLayerNonReferenceFlag() )
     1650              {
     1651                pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_N);
     1652              }
     1653              else
     1654              {
     1655                pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_R );
     1656              }
     1657            }
     1658          }
     1659#else
     1660          if(pcSlice->getTemporalLayerNonReferenceFlag())
     1661          {
     1662            pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_N);
     1663            b_TSTA_flag = 1;
     1664          }
     1665          else
     1666          {
     1667            pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_R);
     1668            b_TSTA_flag = 1;
     1669          }
     1670#endif
     1671        }
     1672    }
     1673#endif
     1674
    15601675    arrangeLongtermPicturesInRPS(pcSlice, rcListPic);
    15611676    TComRefPicListModification* refPicListModification = pcSlice->getRefPicListModification();
     
    15771692        pcSlice->setInterLayerPredEnabledFlag(0);
    15781693      }
    1579       if( pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA_W_LP && pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA )
     1694#if   Q0108_TSA_STSA
     1695     if( (pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA_W_LP && pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA ) || b_TSTA_flag == 1)
     1696#else
     1697     if( pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA_W_LP && pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA )
     1698#endif
    15801699      {
    15811700        pcSlice->setNumRefIdx(REF_PIC_LIST_0, pcSlice->getActiveNumILRRefIdx());
Note: See TracChangeset for help on using the changeset viewer.