source: 3DVCSoftware/branches/0.2-poznan-univ/source/Lib/TLibEncoder/TEncTop.cpp @ 10

Last change on this file since 10 was 5, checked in by hhi, 13 years ago

Clean version with cfg-files

  • Property svn:eol-style set to native
File size: 25.3 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license.
5 *
6 * Copyright (c) 2010-2011, ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34
35
36/** \file     TEncTop.cpp
37    \brief    encoder class
38*/
39
40#include "../TLibCommon/CommonDef.h"
41#include "TEncTop.h"
42
43#include "TEncGOP.h"
44#include "../../App/TAppEncoder/TAppEncTop.h"
45
46// ====================================================================================================================
47// Constructor / destructor / create / destroy
48// ====================================================================================================================
49
50TEncTop::TEncTop()
51{
52  m_iPOCLast          = -1;
53  m_iNumPicRcvd       =  0;
54  m_uiNumAllPicCoded  =  0;
55  m_pppcRDSbacCoder   =  NULL;
56  m_pppcBinCoderCABAC =  NULL;
57  m_cRDGoOnSbacCoder.init( &m_cRDGoOnBinCoderCABAC );
58#if ENC_DEC_TRACE
59  g_hTrace = fopen( "TraceEnc.txt", "wb" );
60  g_bJustDoIt = g_bEncDecTraceDisable;
61  g_nSymbolCounter = 0;
62#endif
63  m_bSeqFirst = true;
64  m_iFrameNumInCodingOrder = 0;
65}
66
67TEncTop::~TEncTop()
68{
69#if ENC_DEC_TRACE
70  fclose( g_hTrace );
71#endif
72}
73
74Void TEncTop::create ()
75{
76  // initialize global variables
77  if(m_uiViewId<1 && !m_bIsDepth)
78    initROM();
79
80  // create processing unit classes
81  m_cPicEncoder.        create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight );
82  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
83  m_cCuEncoder.         create( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight );
84#if MTK_SAO
85  if (m_bUseSAO)
86  {
87    m_cEncSAO.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
88    m_cEncSAO.createEncBuffer();
89  }
90#endif
91  m_cAdaptiveLoopFilter.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
92  m_cLoopFilter.        create( g_uiMaxCUDepth );
93#if DEPTH_MAP_GENERATION
94  m_cDepthMapGenerator. create( false, getSourceWidth(), getSourceHeight(), g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiBitDepth + g_uiBitIncrement );
95#endif
96#if HHI_INTER_VIEW_RESIDUAL_PRED
97  m_cResidualGenerator. create( false, getSourceWidth(), getSourceHeight(), g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiBitDepth + g_uiBitIncrement );
98#endif
99
100#if MQT_BA_RA && MQT_ALF_NPASS
101  if(m_bUseALF)
102  {
103    m_cAdaptiveLoopFilter.createAlfGlobalBuffers(m_iALFEncodePassReduction);
104  }
105#endif
106
107  // if SBAC-based RD optimization is used
108  if( m_bUseSBACRD )
109  {
110    UInt uiNumCEnc = 1 + Max( g_uiMaxCUDepth, AO_MAX_DEPTH ); // HS: prevents crash in SAO for small maximum CU sizes
111    m_pppcRDSbacCoder = new TEncSbac** [uiNumCEnc];
112    m_pppcBinCoderCABAC = new TEncBinCABAC** [uiNumCEnc];
113
114    for ( Int iDepth = 0; iDepth < uiNumCEnc; iDepth++ )
115    {
116      m_pppcRDSbacCoder[iDepth] = new TEncSbac* [CI_NUM];
117      m_pppcBinCoderCABAC[iDepth] = new TEncBinCABAC* [CI_NUM];
118
119      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
120      {
121        m_pppcRDSbacCoder[iDepth][iCIIdx] = new TEncSbac;
122        m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABAC;
123        m_pppcRDSbacCoder   [iDepth][iCIIdx]->init( m_pppcBinCoderCABAC [iDepth][iCIIdx] );
124      }
125    }
126  }
127
128#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
129  if( g_aacWedgeLists.empty() && m_bUseDMM && m_bIsDepth )
130  {
131    initWedgeLists();
132  }
133#endif
134}
135
136Void TEncTop::destroy ()
137{
138#if MQT_BA_RA && MQT_ALF_NPASS
139  if(m_bUseALF)
140  {
141    m_cAdaptiveLoopFilter.destroyAlfGlobalBuffers();
142  }
143#endif
144
145  // destroy processing unit classes
146  m_cPicEncoder.        destroy();
147  m_cSliceEncoder.      destroy();
148  m_cCuEncoder.         destroy();
149#if MTK_SAO
150  if (m_cSPS.getUseSAO())
151  {
152    m_cEncSAO.destroy();
153    m_cEncSAO.destoryEncBuffer();
154  }
155#endif
156  m_cAdaptiveLoopFilter.destroy();
157  m_cLoopFilter.        destroy();
158#if DEPTH_MAP_GENERATION
159  m_cDepthMapGenerator. destroy();
160#endif
161#if HHI_INTER_VIEW_RESIDUAL_PRED
162  m_cResidualGenerator. destroy();
163#endif
164
165  // SBAC RD
166  if( m_bUseSBACRD )
167  {
168    Int iDepth;
169    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
170    {
171      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
172      {
173        delete m_pppcRDSbacCoder[iDepth][iCIIdx];
174        delete m_pppcBinCoderCABAC[iDepth][iCIIdx];
175      }
176    }
177
178    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
179    {
180      delete [] m_pppcRDSbacCoder[iDepth];
181      delete [] m_pppcBinCoderCABAC[iDepth];
182    }
183
184    delete [] m_pppcRDSbacCoder;
185    delete [] m_pppcBinCoderCABAC;
186  }
187
188  // destroy ROM
189  if(m_uiViewId<1 && !m_bIsDepth)
190    destroyROM();
191
192  return;
193}
194
195Void TEncTop::init( TAppEncTop* pcTAppEncTop )
196{
197  UInt *aTable4=NULL, *aTable8=NULL;
198#if QC_MOD_LCEC
199  UInt* aTableLastPosVlcIndex=NULL;
200#endif
201  // initialize SPS
202  xInitSPS();
203
204#if CONSTRAINED_INTRA_PRED
205  // initialize PPS
206  xInitPPS();
207#endif
208
209  // initialize processing unit classes
210  m_cPicEncoder.  init( this );
211  m_cSliceEncoder.init( this );
212  m_cCuEncoder.   init( this );
213
214  m_pcTAppEncTop = pcTAppEncTop;
215#if DEPTH_MAP_GENERATION
216  m_cDepthMapGenerator.init( (TComPrediction*)this->getPredSearch(), m_pcTAppEncTop->getSPSAccess(), m_pcTAppEncTop->getAUPicAccess() );
217#endif
218#if HHI_INTER_VIEW_RESIDUAL_PRED
219  m_cResidualGenerator.init( &m_cTrQuant, &m_cDepthMapGenerator );
220#endif
221
222  // initialize transform & quantization class
223  m_pcCavlcCoder = getCavlcCoder();
224#if !CAVLC_COEF_LRG_BLK
225  aTable8 = m_pcCavlcCoder->GetLP8Table();
226#endif
227  aTable4 = m_pcCavlcCoder->GetLP4Table();
228#if QC_MOD_LCEC
229  aTableLastPosVlcIndex=m_pcCavlcCoder->GetLastPosVlcIndexTable();
230
231  m_cTrQuant.init( g_uiMaxCUWidth, g_uiMaxCUHeight, 1 << m_uiQuadtreeTULog2MaxSize, m_iSymbolMode, aTable4, aTable8,
232    aTableLastPosVlcIndex, m_bUseRDOQ, true );
233#else
234  m_cTrQuant.init( g_uiMaxCUWidth, g_uiMaxCUHeight, 1 << m_uiQuadtreeTULog2MaxSize, m_iSymbolMode, aTable4, aTable8, m_bUseRDOQ, true );
235#endif
236
237  // initialize encoder search class
238  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, 0, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
239  m_cSeqIter  = TEncSeqStructure::Iterator( m_cSequenceStructure, 0, 0 );
240  m_bPicWaitingForCoding = false ;
241
242#if MQT_ALF_NPASS
243  if(m_bUseALF)
244  {
245    m_cAdaptiveLoopFilter.setALFEncodePassReduction( m_iALFEncodePassReduction );
246  }
247#endif
248}
249
250// ====================================================================================================================
251// Public member functions
252// ====================================================================================================================
253
254Void TEncTop::deletePicBuffer()
255{
256  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
257  Int iSize = Int( m_cListPic.size() );
258
259  for ( Int i = 0; i < iSize; i++ )
260  {
261    TComPic* pcPic = *(iterPic++);
262
263    pcPic->destroy();
264    delete pcPic;
265    pcPic = NULL;
266  }
267}
268
269/**
270 - Application has picture buffer list with size of GOP + 1
271 - Picture buffer list acts like as ring buffer
272 - End of the list has the latest picture
273 .
274 \param   bEos                true if end-of-sequence is reached
275 \param   pcPicYuvOrg         original YUV picture
276 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
277 \retval  rcListBitstreamOut  list of output bitstreams
278 \retval  iNumEncoded         number of encoded pictures
279 */
280Void TEncTop::encode( bool bEos, std::map<PicOrderCnt, TComPicYuv*>& rcMapPicYuvRecOut, TComBitstream* pcBitstreamOut, Bool& bNewPicNeeded )
281{
282
283  //  TComBitstream*  pcBitstreamOut ;
284  TComPicYuv*     pcPicYuvRecOut;
285  TComPic*        pcOrgRefList[2][MAX_REF_PIC_NUM];  //GT: not used?
286  TComPic*        pcPic ;
287
288  bool bSomethingCoded = false ;
289
290  if (m_bPicWaitingForCoding )
291  {
292    std::map<Int, TComPic*>::iterator cIter = m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() );
293    const bool bPictureAvailable = cIter != m_acInputPicMap.end();
294    if (bPictureAvailable) //GT: it is possible that poc to code is not in input-picmap, but m_bPicWaitingForCoding is true, since current poc is beyond sequence-end
295    {
296      assert( m_acOutputPicMap.find( m_cSeqIter.getPoc() ) != m_acOutputPicMap.end() );
297      pcPicYuvRecOut = m_acOutputPicMap[m_cSeqIter.getPoc()];
298      m_acOutputPicMap.erase( m_cSeqIter.getPoc() );
299      pcPic          = cIter->second ;
300
301#if DEPTH_MAP_GENERATION
302      // add extra pic buffers
303      Bool  bNeedPrdDepthMapBuf = ( m_uiPredDepthMapGeneration > 0 );
304      if( bNeedPrdDepthMapBuf && !pcPic->getPredDepthMap() )
305      {
306        pcPic->addPrdDepthMapBuffer();
307      }
308#endif
309
310      // needed? dont think so
311      TComPicYuv      cPicOrg;
312      cPicOrg.create( pcPic->getPicYuvOrg()->getWidth(), pcPic->getPicYuvOrg()->getHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
313      pcPic->getPicYuvOrg()->copyToPic( &cPicOrg );
314      xSetPicProperties( pcPic) ;
315      m_cPicEncoder.compressPic( pcBitstreamOut, cPicOrg, pcPic, pcPicYuvRecOut, pcOrgRefList,  m_bSeqFirst,  m_cListPic);
316      bSomethingCoded = true;
317      m_acInputPicMap.erase( cIter );
318      cPicOrg.destroy() ;
319      assert( rcMapPicYuvRecOut.find( pcPic->getPOC() ) == rcMapPicYuvRecOut.end() );
320      rcMapPicYuvRecOut[pcPic->getPOC()] = pcPicYuvRecOut;
321    }
322    else if(m_uiViewId==-1)
323      printf("\nPOC %4d skipped due to sequence end", Int(m_cSeqIter.getPoc()) );
324    else
325    {
326      if( m_bIsDepth )
327      {
328        printf("\nDepth View \t%4d\t POC %4d skipped due to sequence end", m_uiViewId, Int(m_cSeqIter.getPoc() ));
329      }
330      else
331      {
332        printf("\nView \t\t%4d\t POC %4d skipped due to sequence end", m_uiViewId, Int(m_cSeqIter.getPoc() ));
333      }
334    }
335    ++m_cSeqIter; //GT: increment, even bPictureAvailable might be false, (POC beyond sequence end);
336
337    Bool hitSeqEndButHasToCode = bEos && !m_acInputPicMap.empty();
338    if( (m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() ) != m_acInputPicMap.end()) || hitSeqEndButHasToCode ) //GT: new poc also in InputList
339    {
340      m_bPicWaitingForCoding = true;
341      bNewPicNeeded = false ;
342    }
343    else
344    {
345      m_bPicWaitingForCoding = false;
346      bNewPicNeeded = true ;
347    }
348  }
349
350
351  if(bSomethingCoded && !m_bPicWaitingForCoding ) //GT: no gaps any more
352  {
353    m_uiNumAllPicCoded += m_iNumPicRcvd;
354    m_iNumPicRcvd       = 0;
355  }
356
357
358  if (bEos&&m_uiViewId==-1)
359  {
360    printOutSummary (m_uiNumAllPicCoded);
361  }
362}
363
364
365Void TEncTop::receivePic( bool bEos, TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvRec, TComPicYuv* pcOrgPdmDepth )
366{
367  if( !m_bPicWaitingForCoding ) //GT: insert pcPicYuvOrg in m_acInputPicMap and m_cListPic
368  {
369    TComPic* pcPicCurr = NULL;
370    xGetNewPicBuffer( pcPicCurr ); //GT: assigns next POC to input pic and stores it in m_cListPic
371    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
372#if HHI_INTER_VIEW_MOTION_PRED
373    if( m_uiMultiviewMvRegMode )
374    {
375      AOF( pcOrgPdmDepth );
376      AOF( pcPicCurr->getOrgDepthMap() );
377      pcOrgPdmDepth->copyToPic( pcPicCurr->getOrgDepthMap() );
378    }
379    else
380    {
381      AOT( pcOrgPdmDepth );
382      AOT( pcPicCurr->getOrgDepthMap() );
383    }
384#endif
385    m_acInputPicMap.insert( std::make_pair(pcPicCurr->getPOC(), pcPicCurr)); //GT: input pic to m_acInputPicMap
386    assert( m_acOutputPicMap.find( pcPicCurr->getPOC() ) == m_acOutputPicMap.end() );
387    m_acOutputPicMap[pcPicCurr->getPOC()] = pcPicYuvRec;
388  }
389
390  bool hitSeqEndButHasToCode = bEos && !m_acInputPicMap.empty();  //GT: End of sequence has been reached, but still pictures to code left
391  m_bPicWaitingForCoding = m_bPicWaitingForCoding || hitSeqEndButHasToCode ;
392
393  if( m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() ) != m_acInputPicMap.end() ) //GT: If poc to code is in input-picmap; not necessary
394  {
395    m_bPicWaitingForCoding = true;
396  }
397}
398
399
400Void
401TEncTop::deleteExtraPicBuffers( Int iPoc )
402{
403  TComPic*                      pcPic = 0;
404  TComList<TComPic*>::iterator  cIter = m_cListPic.begin();
405  TComList<TComPic*>::iterator  cEnd  = m_cListPic.end  ();
406  for( ; cIter != cEnd; cIter++ )
407  {
408    if( (*cIter)->getPOC() == iPoc )
409    {
410      pcPic = *cIter;
411      break;
412    }
413  }
414  AOF( pcPic );
415  if ( pcPic )
416  {
417    pcPic->removeOriginalBuffer   ();
418#if HHI_INTER_VIEW_MOTION_PRED
419    pcPic->removeOrgDepthMapBuffer();
420#endif
421#if HHI_INTER_VIEW_RESIDUAL_PRED
422    pcPic->removeResidualBuffer   ();
423#endif
424#if HHI_INTERVIEW_SKIP
425    pcPic->removeUsedPelsMapBuffer();
426#endif
427  }
428}
429
430
431#if AMVP_BUFFERCOMPRESS
432Void
433TEncTop::compressMotion( Int iPoc )
434{
435  TComPic*                      pcPic = 0;
436  TComList<TComPic*>::iterator  cIter = m_cListPic.begin();
437  TComList<TComPic*>::iterator  cEnd  = m_cListPic.end  ();
438  for( ; cIter != cEnd; cIter++ )
439  {
440    if( (*cIter)->getPOC() == iPoc )
441    {
442      pcPic = *cIter;
443      break;
444    }
445  }
446  AOF( pcPic );
447  if ( pcPic )
448  {
449    pcPic->compressMotion();
450  }
451}
452#endif
453
454
455
456// ====================================================================================================================
457// Protected member functions
458// ====================================================================================================================
459
460/**
461 - Application has picture buffer list with size of GOP + 1
462 - Picture buffer list acts like as ring buffer
463 - End of the list has the latest picture
464 .
465 \retval rpcPic obtained picture buffer
466 */
467Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
468{
469  TComSlice::sortPicList(m_cListPic);
470
471  // bug-fix - erase frame memory (previous GOP) which is not used for reference any more
472  if (m_cListPic.size() >=  m_uiCodedPictureStoreSize )  // 2)   //  K. Lee bug fix - for multiple reference > 2
473  {
474    rpcPic = m_cListPic.popFront();
475
476    // is it necessary without long-term reference?
477  }
478  else
479  {
480    rpcPic = new TComPic;
481    rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
482  }
483
484  m_cListPic.pushBack( rpcPic );
485  rpcPic->setReconMark (false);
486
487  m_iPOCLast++;
488  m_iNumPicRcvd++;
489
490  rpcPic->addOriginalBuffer();
491#if HHI_INTER_VIEW_MOTION_PRED
492  if( m_uiMultiviewMvRegMode )
493  {
494    rpcPic->addOrgDepthMapBuffer();
495  }
496#endif
497
498#if HHI_INTERVIEW_SKIP
499  if( getInterViewSkip() )
500  {
501    rpcPic->addUsedPelsMapBuffer();
502  }
503#endif
504
505  rpcPic->setCurrSliceIdx( 0 ); // MW
506  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
507
508  // mark it should be extended
509  rpcPic->getPicYuvRec()->setBorderExtension(false);
510}
511
512
513Void TEncTop::xInitSPS()
514{
515  m_cSPS.setWidth         ( m_iSourceWidth      );
516  m_cSPS.setHeight        ( m_iSourceHeight     );
517  m_cSPS.setPad           ( m_aiPad             );
518  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
519  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
520  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
521  m_cSPS.setMinTrDepth    ( 0                   );
522  m_cSPS.setMaxTrDepth    ( 1                   );
523
524  m_cSPS.setUseALF        ( m_bUseALF           );
525
526  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
527  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
528  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
529  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
530
531  m_cSPS.setUseDQP        ( m_iMaxDeltaQP != 0  );
532#if !HHI_NO_LowDelayCoding
533  m_cSPS.setUseLDC        ( m_bUseLDC           );
534#endif
535  m_cSPS.setUsePAD        ( m_bUsePAD           );
536
537  m_cSPS.setUseMRG        ( m_bUseMRG           ); // SOPH:
538
539#if LM_CHROMA
540  m_cSPS.setUseLMChroma   ( m_bUseLMChroma           );
541#endif
542
543  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
544
545  if( m_bIsDepth )
546  {
547    m_cSPS.initMultiviewSPSDepth    ( m_uiViewId, m_iViewOrderIdx );
548#if DEPTH_MAP_GENERATION
549    m_cSPS.setPredDepthMapGeneration( m_uiViewId, true );
550#endif
551#if HHI_INTER_VIEW_RESIDUAL_PRED
552    m_cSPS.setMultiviewResPredMode  ( 0 );
553#endif
554  }
555  else
556  {
557    m_cSPS.initMultiviewSPS           ( m_uiViewId, m_iViewOrderIdx, m_uiCamParPrecision, m_bCamParInSliceHeader, m_aaiCodedScale, m_aaiCodedOffset );
558    if( m_uiViewId )
559    {
560#if DEPTH_MAP_GENERATION
561#if HHI_INTER_VIEW_MOTION_PRED
562      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, m_uiMultiviewMvPredMode, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
563#else
564      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, 0, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
565#endif
566#endif
567#if HHI_INTER_VIEW_RESIDUAL_PRED
568      m_cSPS.setMultiviewResPredMode  ( m_uiMultiviewResPredMode );
569#endif
570    }
571    else
572    {
573#if DEPTH_MAP_GENERATION
574      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false );
575#endif
576#if HHI_INTER_VIEW_RESIDUAL_PRED
577      m_cSPS.setMultiviewResPredMode  ( 0 );
578#endif
579    }
580  }
581  m_cSPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
582
583#if DCM_COMB_LIST
584  m_cSPS.setUseLComb    ( m_bUseLComb           );
585  m_cSPS.setLCMod       ( m_bLCMod   );
586#endif
587
588  Int i;
589#if HHI_AMVP_OFF
590  for ( i = 0; i < g_uiMaxCUDepth; i++ )
591  {
592    m_cSPS.setAMVPMode( i, AM_NONE );
593  }
594#else
595  for ( i = 0; i < g_uiMaxCUDepth; i++ )
596  {
597    m_cSPS.setAMVPMode( i, AM_EXPL );
598  }
599#endif
600
601
602#if HHI_RMP_SWITCH
603  m_cSPS.setUseRMP( m_bUseRMP );
604#endif
605
606  m_cSPS.setBitDepth    ( g_uiBitDepth        );
607  m_cSPS.setBitIncrement( g_uiBitIncrement    );
608
609#if MTK_NONCROSS_INLOOP_FILTER
610  m_cSPS.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );
611#endif
612#if MTK_SAO
613  m_cSPS.setUseSAO             ( m_bUseSAO         );
614#endif
615#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
616  m_cSPS.setUseDMM( m_bUseDMM );
617#endif
618#if HHI_MPI
619  m_cSPS.setUseMVI( m_bUseMVI );
620#endif
621
622  m_cSPS.setCodedPictureBufferSize( m_uiCodedPictureStoreSize );
623}
624
625#if CONSTRAINED_INTRA_PRED
626Void TEncTop::xInitPPS()
627{
628  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
629  m_cPPS.setPPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
630  m_cPPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
631
632#ifdef WEIGHT_PRED
633  m_cPPS.setUseWP( m_bUseWeightPred );
634  m_cPPS.setWPBiPredIdc( m_uiBiPredIdc );
635#endif
636}
637#endif
638
639
640Void TEncTop::setTEncTopList(std::vector<TEncTop*>* pacTEncTopList )
641{
642  assert(m_uiViewId!=-1); // not to be set for single view coding
643
644  m_pacTEncTopList=pacTEncTopList;
645
646}
647
648
649Void TEncTop::printOutSummary(UInt uiNumAllPicCoded)
650{
651  assert (uiNumAllPicCoded == m_cAnalyzeAll.getNumPic());
652
653  //--CFG_KDY
654  m_cAnalyzeAll.setFrmRate( getFrameRate() );
655  m_cAnalyzeI.setFrmRate( getFrameRate() );
656  m_cAnalyzeP.setFrmRate( getFrameRate() );
657  m_cAnalyzeB.setFrmRate( getFrameRate() );
658
659  //-- all
660  if(m_uiViewId==-1)
661    printf( "\n\nSUMMARY --------------------------------------------------------\n" );
662  else {
663    if ( m_bIsDepth )
664    {
665      printf( "\n\nSUMMARY ---------------------------------------------- DEPTH %2d\n", m_uiViewId );
666    }
667    else
668    {
669      printf( "\n\nSUMMARY ---------------------------------------------- VIDEO %2d\n", m_uiViewId );
670    }
671  };
672  m_cAnalyzeAll.printOut('a');
673
674  printf( "\n\nI Slices--------------------------------------------------------\n" );
675  m_cAnalyzeI.printOut('i');
676
677  printf( "\n\nP Slices--------------------------------------------------------\n" );
678  m_cAnalyzeP.printOut('p');
679
680  printf( "\n\nB Slices--------------------------------------------------------\n" );
681  m_cAnalyzeB.printOut('b');
682
683#if _SUMMARY_OUT_
684  m_cAnalyzeAll.printSummaryOut();
685#endif
686#if _SUMMARY_PIC_
687  m_cAnalyzeI.printSummary('I');
688  m_cAnalyzeP.printSummary('P');
689  m_cAnalyzeB.printSummary('B');
690#endif
691}
692
693Void TEncTop::xSetRefPics( TComPic* pcPic, RefPicList eRefPicList )
694{
695  assert(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size() == m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx()).size());
696#if 1
697  // check if refPic is available
698  Int iNumberOfRefs = 0;
699  std::vector<Int> aiRefPocs ;
700  std::vector<Int> aiRefViews ;
701
702  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
703  {
704    Int iRefPoc  = m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC() ;
705    Int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
706    Bool bFoundRefPic = false;
707
708    if( iRefPoc == pcPic->getPOC() ) // interview
709    {
710      assert( iRefViewIdx < (Int)m_uiViewId );
711      aiRefPocs.push_back(iRefPoc);
712      aiRefViews.push_back(iRefViewIdx);
713      iNumberOfRefs++ ;
714      bFoundRefPic = true ;
715      continue;
716    }
717    else if ( iRefViewIdx < 0 ) // temporal
718    {
719      for( TComList<TComPic*>::iterator it = m_cListPic.begin(); it!=m_cListPic.end(); it++)
720      {
721        if( (*it)->getViewIdx() == pcPic->getViewIdx() && (*it)->getPOC() == iRefPoc && (*it)->getReconMark() )
722        {
723          aiRefPocs.push_back(iRefPoc);
724          aiRefViews.push_back(m_uiViewId);
725          bFoundRefPic = true ;
726          iNumberOfRefs++ ;
727          break;
728        }
729      }
730      if( (iRefPoc < pcPic->getPOC()) && !bFoundRefPic )
731      {
732        printf("\nInconsistence in GOP-String!");
733        assert(0);
734      }
735    }
736  }
737  for ( Int i=0; i< iNumberOfRefs; i++)
738  {
739    pcPic->setRefViewIdx( aiRefViews[i], eRefPicList, i );
740    pcPic->setRefPOC(aiRefPocs[i], eRefPicList, i );
741  }
742  pcPic->setNumRefs( iNumberOfRefs, eRefPicList );
743#else
744  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
745  {
746    const int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
747    if( iRefViewIdx < 0 )
748    {
749      // temporal reference from current view
750      pcPic->setRefViewIdx( m_iViewIdx, eRefPicList, i );
751    }
752    else
753    {
754      pcPic->setRefViewIdx( iRefViewIdx, eRefPicList, i );
755    }
756    pcPic->setRefPOC(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC(), eRefPicList, i );
757  }
758  pcPic->setNumRefs( m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(), eRefPicList );
759#endif
760}
761
762Void TEncTop::xCheckSliceType(TComPic* pcPic)
763{
764  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == I_SLICE )
765  {
766    return ;
767  }
768  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == P_SLICE )
769  {
770    return ;
771  }
772  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) != 0 && pcPic->getSliceType() == B_SLICE )
773  {
774    return ;
775  }
776  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
777  {
778    pcPic->setSliceType(I_SLICE) ;
779    return;
780  }
781  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
782  {
783    pcPic->setSliceType(P_SLICE) ;
784    return;
785  }
786
787  assert(0);
788}
789
790
791Void TEncTop::xSetPicProperties(TComPic* pcPic)
792{
793  pcPic->setSliceType( m_cSeqIter.getFrameDescriptor().getSliceType(m_uiViewId) );
794  pcPic->setReferenced( m_cSeqIter.getFrameDescriptor().getStoreForRef(m_uiViewId) );
795  pcPic->setColDir( m_cSeqIter.getFrameDescriptor().getColDir() ) ;
796  const Bool bQpChangePointPassed = m_iFrameNumInCodingOrder++ >= getQpChangeFrame();
797  const Int  iQpChangeOffset      = bQpChangePointPassed ? ( m_bIsDepth ? getQpChangeOffsetDepth() : getQpChangeOffsetVideo() ) : 0;
798  pcPic->setQP(max(MIN_QP,min(MAX_QP, m_iQP+ m_aiTLayerQPOffset[m_cSeqIter.getFrameDescriptor().getTEncSeqStructureLayer(m_uiViewId)] + iQpChangeOffset )) );
799  pcPic->setViewIdx( m_uiViewId );
800#if 0
801  pcPic->setNumRefs(0, REF_PIC_LIST_0);
802  pcPic->setNumRefs(0, REF_PIC_LIST_1);
803
804
805  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== P_SLICE || m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
806  {
807    xSetRefPics( pcPic, REF_PIC_LIST_0 );
808  }
809  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
810  {
811    xSetRefPics( pcPic, REF_PIC_LIST_1 );
812  }
813#else
814  xSetRefPics( pcPic, REF_PIC_LIST_0 );
815  xSetRefPics( pcPic, REF_PIC_LIST_1 );
816  xCheckSliceType( pcPic );
817#endif
818
819  pcPic->setScaleOffset( m_aaiCodedScale, m_aaiCodedOffset );
820}
Note: See TracBrowser for help on using the repository browser.