Changeset 804 in SHVCSoftware for branches/SHM-6-dev/source/App


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/App/TAppEncoder
Files:
3 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
Note: See TracChangeset for help on using the changeset viewer.