source: 3DVCSoftware/branches/0.3-nokia/source/Lib/TLibEncoder/TEncTop.cpp @ 36

Last change on this file since 36 was 34, checked in by nokia, 13 years ago

FlexCO upload

  • Property svn:eol-style set to native
File size: 25.7 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, PDM_SUB_SAMP_EXP_X(m_uiPredDepthMapGeneration), PDM_SUB_SAMP_EXP_Y(m_uiPredDepthMapGeneration) );
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#if FLEX_CODING_ORDER 
290  if (TEncTop::m_bPicWaitingForCoding )
291#else
292  if (m_bPicWaitingForCoding )
293#endif
294  {
295    std::map<Int, TComPic*>::iterator cIter = m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() );
296    const bool bPictureAvailable = cIter != m_acInputPicMap.end();
297    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
298    {
299      assert( m_acOutputPicMap.find( m_cSeqIter.getPoc() ) != m_acOutputPicMap.end() );
300      pcPicYuvRecOut = m_acOutputPicMap[m_cSeqIter.getPoc()];
301      m_acOutputPicMap.erase( m_cSeqIter.getPoc() );
302      pcPic          = cIter->second ;
303
304#if DEPTH_MAP_GENERATION
305      // add extra pic buffers
306      Bool  bNeedPrdDepthMapBuf = ( m_uiPredDepthMapGeneration > 0 );
307      if( bNeedPrdDepthMapBuf && !pcPic->getPredDepthMap() )
308      {
309        pcPic->addPrdDepthMapBuffer( PDM_SUB_SAMP_EXP_X(m_uiPredDepthMapGeneration), PDM_SUB_SAMP_EXP_Y(m_uiPredDepthMapGeneration) );
310      }
311#endif
312
313      // needed? dont think so
314      TComPicYuv      cPicOrg;
315      cPicOrg.create( pcPic->getPicYuvOrg()->getWidth(), pcPic->getPicYuvOrg()->getHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
316      pcPic->getPicYuvOrg()->copyToPic( &cPicOrg );
317      xSetPicProperties( pcPic) ;
318      m_cPicEncoder.compressPic( pcBitstreamOut, cPicOrg, pcPic, pcPicYuvRecOut, pcOrgRefList,  m_bSeqFirst,  m_cListPic);
319      bSomethingCoded = true;
320      m_acInputPicMap.erase( cIter );
321      cPicOrg.destroy() ;
322      assert( rcMapPicYuvRecOut.find( pcPic->getPOC() ) == rcMapPicYuvRecOut.end() );
323      rcMapPicYuvRecOut[pcPic->getPOC()] = pcPicYuvRecOut;
324    }
325    else if(m_uiViewId==-1)
326      printf("\nPOC %4d skipped due to sequence end", Int(m_cSeqIter.getPoc()) );
327    else
328    {
329      if( m_bIsDepth )
330      {
331        printf("\nDepth View \t%4d\t POC %4d skipped due to sequence end", m_uiViewId, Int(m_cSeqIter.getPoc() ));
332      }
333      else
334      {
335        printf("\nView \t\t%4d\t POC %4d skipped due to sequence end", m_uiViewId, Int(m_cSeqIter.getPoc() ));
336      }
337    }
338    ++m_cSeqIter; //GT: increment, even bPictureAvailable might be false, (POC beyond sequence end);
339
340    Bool hitSeqEndButHasToCode = bEos && !m_acInputPicMap.empty();
341    if( (m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() ) != m_acInputPicMap.end()) || hitSeqEndButHasToCode ) //GT: new poc also in InputList
342    {
343      m_bPicWaitingForCoding = true;
344      bNewPicNeeded = false ;
345    }
346    else
347    {
348      m_bPicWaitingForCoding = false;
349      bNewPicNeeded = true ;
350    }
351  }
352
353
354  if(bSomethingCoded && !m_bPicWaitingForCoding ) //GT: no gaps any more
355  {
356    m_uiNumAllPicCoded += m_iNumPicRcvd;
357    m_iNumPicRcvd       = 0;
358  }
359
360
361  if (bEos&&m_uiViewId==-1)
362  {
363    printOutSummary (m_uiNumAllPicCoded);
364  }
365}
366
367
368Void TEncTop::receivePic( bool bEos, TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvRec, TComPicYuv* pcOrgPdmDepth )
369{
370  if( !m_bPicWaitingForCoding ) //GT: insert pcPicYuvOrg in m_acInputPicMap and m_cListPic
371  {
372    TComPic* pcPicCurr = NULL;
373    xGetNewPicBuffer( pcPicCurr ); //GT: assigns next POC to input pic and stores it in m_cListPic
374    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
375#if HHI_INTER_VIEW_MOTION_PRED
376    if( m_uiMultiviewMvRegMode )
377    {
378      AOF( pcOrgPdmDepth );
379      AOF( pcPicCurr->getOrgDepthMap() );
380      pcOrgPdmDepth->copyToPic( pcPicCurr->getOrgDepthMap() );
381    }
382    else
383    {
384      AOT( pcOrgPdmDepth );
385      AOT( pcPicCurr->getOrgDepthMap() );
386    }
387#endif
388    m_acInputPicMap.insert( std::make_pair(pcPicCurr->getPOC(), pcPicCurr)); //GT: input pic to m_acInputPicMap
389    assert( m_acOutputPicMap.find( pcPicCurr->getPOC() ) == m_acOutputPicMap.end() );
390    m_acOutputPicMap[pcPicCurr->getPOC()] = pcPicYuvRec;
391  }
392
393  bool hitSeqEndButHasToCode = bEos && !m_acInputPicMap.empty();  //GT: End of sequence has been reached, but still pictures to code left
394  m_bPicWaitingForCoding = m_bPicWaitingForCoding || hitSeqEndButHasToCode ;
395
396  if( m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() ) != m_acInputPicMap.end() ) //GT: If poc to code is in input-picmap; not necessary
397  {
398    m_bPicWaitingForCoding = true;
399  }
400}
401
402
403Void
404TEncTop::deleteExtraPicBuffers( Int iPoc )
405{
406  TComPic*                      pcPic = 0;
407  TComList<TComPic*>::iterator  cIter = m_cListPic.begin();
408  TComList<TComPic*>::iterator  cEnd  = m_cListPic.end  ();
409  for( ; cIter != cEnd; cIter++ )
410  {
411    if( (*cIter)->getPOC() == iPoc )
412    {
413      pcPic = *cIter;
414      break;
415    }
416  }
417  AOF( pcPic );
418  if ( pcPic )
419  {
420    pcPic->removeOriginalBuffer   ();
421#if HHI_INTER_VIEW_MOTION_PRED
422    pcPic->removeOrgDepthMapBuffer();
423#endif
424#if HHI_INTER_VIEW_RESIDUAL_PRED
425    pcPic->removeResidualBuffer   ();
426#endif
427#if HHI_INTERVIEW_SKIP
428    pcPic->removeUsedPelsMapBuffer();
429#endif
430  }
431}
432
433
434#if AMVP_BUFFERCOMPRESS
435Void
436TEncTop::compressMotion( Int iPoc )
437{
438  TComPic*                      pcPic = 0;
439  TComList<TComPic*>::iterator  cIter = m_cListPic.begin();
440  TComList<TComPic*>::iterator  cEnd  = m_cListPic.end  ();
441  for( ; cIter != cEnd; cIter++ )
442  {
443    if( (*cIter)->getPOC() == iPoc )
444    {
445      pcPic = *cIter;
446      break;
447    }
448  }
449  AOF( pcPic );
450  if ( pcPic )
451  {
452    pcPic->compressMotion();
453  }
454}
455#endif
456
457
458
459// ====================================================================================================================
460// Protected member functions
461// ====================================================================================================================
462
463/**
464 - Application has picture buffer list with size of GOP + 1
465 - Picture buffer list acts like as ring buffer
466 - End of the list has the latest picture
467 .
468 \retval rpcPic obtained picture buffer
469 */
470Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
471{
472  TComSlice::sortPicList(m_cListPic);
473
474  // bug-fix - erase frame memory (previous GOP) which is not used for reference any more
475  if (m_cListPic.size() >=  m_uiCodedPictureStoreSize )  // 2)   //  K. Lee bug fix - for multiple reference > 2
476  {
477    rpcPic = m_cListPic.popFront();
478
479    // is it necessary without long-term reference?
480  }
481  else
482  {
483    rpcPic = new TComPic;
484    rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
485  }
486
487  m_cListPic.pushBack( rpcPic );
488  rpcPic->setReconMark (false);
489
490  m_iPOCLast++;
491  m_iNumPicRcvd++;
492
493  rpcPic->addOriginalBuffer();
494#if HHI_INTER_VIEW_MOTION_PRED
495  if( m_uiMultiviewMvRegMode )
496  {
497    rpcPic->addOrgDepthMapBuffer();
498  }
499#endif
500
501#if HHI_INTERVIEW_SKIP
502  if( getInterViewSkip() )
503  {
504    rpcPic->addUsedPelsMapBuffer();
505  }
506#endif
507
508  rpcPic->setCurrSliceIdx( 0 ); // MW
509  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
510
511  // mark it should be extended
512  rpcPic->getPicYuvRec()->setBorderExtension(false);
513}
514
515
516Void TEncTop::xInitSPS()
517{
518  m_cSPS.setWidth         ( m_iSourceWidth      );
519  m_cSPS.setHeight        ( m_iSourceHeight     );
520  m_cSPS.setPad           ( m_aiPad             );
521  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
522  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
523  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
524  m_cSPS.setMinTrDepth    ( 0                   );
525  m_cSPS.setMaxTrDepth    ( 1                   );
526
527  m_cSPS.setUseALF        ( m_bUseALF           );
528
529  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
530  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
531  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
532  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
533
534  m_cSPS.setUseDQP        ( m_iMaxDeltaQP != 0  );
535#if !HHI_NO_LowDelayCoding
536  m_cSPS.setUseLDC        ( m_bUseLDC           );
537#endif
538  m_cSPS.setUsePAD        ( m_bUsePAD           );
539
540  m_cSPS.setUseMRG        ( m_bUseMRG           ); // SOPH:
541
542#if LM_CHROMA
543  m_cSPS.setUseLMChroma   ( m_bUseLMChroma           );
544#endif
545
546  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
547
548  if( m_bIsDepth )
549  {
550    m_cSPS.initMultiviewSPSDepth    ( m_uiViewId, m_iViewOrderIdx );
551#if DEPTH_MAP_GENERATION
552    m_cSPS.setPredDepthMapGeneration( m_uiViewId, true );
553#endif
554#if HHI_INTER_VIEW_RESIDUAL_PRED
555    m_cSPS.setMultiviewResPredMode  ( 0 );
556#endif
557  }
558  else
559  {
560    m_cSPS.initMultiviewSPS           ( m_uiViewId, m_iViewOrderIdx, m_uiCamParPrecision, m_bCamParInSliceHeader, m_aaiCodedScale, m_aaiCodedOffset );
561    if( m_uiViewId )
562    {
563#if DEPTH_MAP_GENERATION
564#if HHI_INTER_VIEW_MOTION_PRED
565      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, m_uiMultiviewMvPredMode, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
566#else
567      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, 0, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
568#endif
569#endif
570#if HHI_INTER_VIEW_RESIDUAL_PRED
571      m_cSPS.setMultiviewResPredMode  ( m_uiMultiviewResPredMode );
572#endif
573    }
574    else
575    {
576#if DEPTH_MAP_GENERATION
577      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false );
578#endif
579#if HHI_INTER_VIEW_RESIDUAL_PRED
580      m_cSPS.setMultiviewResPredMode  ( 0 );
581#endif
582    }
583  }
584  m_cSPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
585
586#if DCM_COMB_LIST
587  m_cSPS.setUseLComb    ( m_bUseLComb           );
588  m_cSPS.setLCMod       ( m_bLCMod   );
589#endif
590
591  Int i;
592#if HHI_AMVP_OFF
593  for ( i = 0; i < g_uiMaxCUDepth; i++ )
594  {
595    m_cSPS.setAMVPMode( i, AM_NONE );
596  }
597#else
598  for ( i = 0; i < g_uiMaxCUDepth; i++ )
599  {
600    m_cSPS.setAMVPMode( i, AM_EXPL );
601  }
602#endif
603
604
605#if HHI_RMP_SWITCH
606  m_cSPS.setUseRMP( m_bUseRMP );
607#endif
608
609  m_cSPS.setBitDepth    ( g_uiBitDepth        );
610  m_cSPS.setBitIncrement( g_uiBitIncrement    );
611
612#if MTK_NONCROSS_INLOOP_FILTER
613  m_cSPS.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );
614#endif
615#if MTK_SAO
616  m_cSPS.setUseSAO             ( m_bUseSAO         );
617#endif
618#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
619  m_cSPS.setUseDMM( m_bUseDMM );
620#endif
621#if HHI_DMM_PRED_TEX && FLEX_CODING_ORDER
622  m_cSPS.setUseDMM34( m_bUseDMM34 );
623#endif
624#if HHI_MPI
625  m_cSPS.setUseMVI( m_bUseMVI );
626#endif
627
628  m_cSPS.setCodedPictureBufferSize( m_uiCodedPictureStoreSize );
629}
630
631#if CONSTRAINED_INTRA_PRED
632Void TEncTop::xInitPPS()
633{
634  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
635  m_cPPS.setPPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
636  m_cPPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
637
638#ifdef WEIGHT_PRED
639  m_cPPS.setUseWP( m_bUseWeightPred );
640  m_cPPS.setWPBiPredIdc( m_uiBiPredIdc );
641#endif
642}
643#endif
644
645
646Void TEncTop::setTEncTopList(std::vector<TEncTop*>* pacTEncTopList )
647{
648  assert(m_uiViewId!=-1); // not to be set for single view coding
649
650  m_pacTEncTopList=pacTEncTopList;
651
652}
653
654
655Void TEncTop::printOutSummary(UInt uiNumAllPicCoded)
656{
657  assert (uiNumAllPicCoded == m_cAnalyzeAll.getNumPic());
658
659  //--CFG_KDY
660  m_cAnalyzeAll.setFrmRate( getFrameRate() );
661  m_cAnalyzeI.setFrmRate( getFrameRate() );
662  m_cAnalyzeP.setFrmRate( getFrameRate() );
663  m_cAnalyzeB.setFrmRate( getFrameRate() );
664
665  //-- all
666  if(m_uiViewId==-1)
667    printf( "\n\nSUMMARY --------------------------------------------------------\n" );
668  else {
669    if ( m_bIsDepth )
670    {
671      printf( "\n\nSUMMARY ---------------------------------------------- DEPTH %2d\n", m_uiViewId );
672    }
673    else
674    {
675      printf( "\n\nSUMMARY ---------------------------------------------- VIDEO %2d\n", m_uiViewId );
676    }
677  };
678  m_cAnalyzeAll.printOut('a');
679
680  printf( "\n\nI Slices--------------------------------------------------------\n" );
681  m_cAnalyzeI.printOut('i');
682
683  printf( "\n\nP Slices--------------------------------------------------------\n" );
684  m_cAnalyzeP.printOut('p');
685
686  printf( "\n\nB Slices--------------------------------------------------------\n" );
687  m_cAnalyzeB.printOut('b');
688
689#if _SUMMARY_OUT_
690  m_cAnalyzeAll.printSummaryOut();
691#endif
692#if _SUMMARY_PIC_
693  m_cAnalyzeI.printSummary('I');
694  m_cAnalyzeP.printSummary('P');
695  m_cAnalyzeB.printSummary('B');
696#endif
697}
698
699Void TEncTop::xSetRefPics( TComPic* pcPic, RefPicList eRefPicList )
700{
701  assert(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size() == m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx()).size());
702#if 1
703  // check if refPic is available
704  Int iNumberOfRefs = 0;
705  std::vector<Int> aiRefPocs ;
706  std::vector<Int> aiRefViews ;
707
708  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
709  {
710    Int iRefPoc  = m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC() ;
711    Int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
712    Bool bFoundRefPic = false;
713
714    if( iRefPoc == pcPic->getPOC() ) // interview
715    {
716      assert( iRefViewIdx < (Int)m_uiViewId );
717      aiRefPocs.push_back(iRefPoc);
718      aiRefViews.push_back(iRefViewIdx);
719      iNumberOfRefs++ ;
720      bFoundRefPic = true ;
721      continue;
722    }
723    else if ( iRefViewIdx < 0 ) // temporal
724    {
725      for( TComList<TComPic*>::iterator it = m_cListPic.begin(); it!=m_cListPic.end(); it++)
726      {
727        if( (*it)->getViewIdx() == pcPic->getViewIdx() && (*it)->getPOC() == iRefPoc && (*it)->getReconMark() )
728        {
729          aiRefPocs.push_back(iRefPoc);
730          aiRefViews.push_back(m_uiViewId);
731          bFoundRefPic = true ;
732          iNumberOfRefs++ ;
733          break;
734        }
735      }
736      if( (iRefPoc < pcPic->getPOC()) && !bFoundRefPic )
737      {
738        printf("\nInconsistence in GOP-String!");
739        assert(0);
740      }
741    }
742  }
743  for ( Int i=0; i< iNumberOfRefs; i++)
744  {
745    pcPic->setRefViewIdx( aiRefViews[i], eRefPicList, i );
746    pcPic->setRefPOC(aiRefPocs[i], eRefPicList, i );
747  }
748  pcPic->setNumRefs( iNumberOfRefs, eRefPicList );
749#else
750  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
751  {
752    const int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
753    if( iRefViewIdx < 0 )
754    {
755      // temporal reference from current view
756      pcPic->setRefViewIdx( m_iViewIdx, eRefPicList, i );
757    }
758    else
759    {
760      pcPic->setRefViewIdx( iRefViewIdx, eRefPicList, i );
761    }
762    pcPic->setRefPOC(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC(), eRefPicList, i );
763  }
764  pcPic->setNumRefs( m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(), eRefPicList );
765#endif
766}
767
768Void TEncTop::xCheckSliceType(TComPic* pcPic)
769{
770  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == I_SLICE )
771  {
772    return ;
773  }
774  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == P_SLICE )
775  {
776    return ;
777  }
778  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) != 0 && pcPic->getSliceType() == B_SLICE )
779  {
780    return ;
781  }
782  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
783  {
784    pcPic->setSliceType(I_SLICE) ;
785    return;
786  }
787  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
788  {
789    pcPic->setSliceType(P_SLICE) ;
790    return;
791  }
792
793  assert(0);
794}
795
796
797Void TEncTop::xSetPicProperties(TComPic* pcPic)
798{
799  pcPic->setSliceType( m_cSeqIter.getFrameDescriptor().getSliceType(m_uiViewId) );
800  pcPic->setReferenced( m_cSeqIter.getFrameDescriptor().getStoreForRef(m_uiViewId) );
801  pcPic->setColDir( m_cSeqIter.getFrameDescriptor().getColDir() ) ;
802  const Bool bQpChangePointPassed = m_iFrameNumInCodingOrder++ >= getQpChangeFrame();
803  const Int  iQpChangeOffset      = bQpChangePointPassed ? ( m_bIsDepth ? getQpChangeOffsetDepth() : getQpChangeOffsetVideo() ) : 0;
804  pcPic->setQP(max(MIN_QP,min(MAX_QP, m_iQP+ m_aiTLayerQPOffset[m_cSeqIter.getFrameDescriptor().getTEncSeqStructureLayer(m_uiViewId)] + iQpChangeOffset )) );
805  pcPic->setViewIdx( m_uiViewId );
806#if SONY_COLPIC_AVAILABILITY
807  pcPic->setViewOrderIdx(m_iViewOrderIdx);
808#endif
809#if 0
810  pcPic->setNumRefs(0, REF_PIC_LIST_0);
811  pcPic->setNumRefs(0, REF_PIC_LIST_1);
812
813
814  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== P_SLICE || m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
815  {
816    xSetRefPics( pcPic, REF_PIC_LIST_0 );
817  }
818  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
819  {
820    xSetRefPics( pcPic, REF_PIC_LIST_1 );
821  }
822#else
823  xSetRefPics( pcPic, REF_PIC_LIST_0 );
824  xSetRefPics( pcPic, REF_PIC_LIST_1 );
825  xCheckSliceType( pcPic );
826#endif
827
828  pcPic->setScaleOffset( m_aaiCodedScale, m_aaiCodedOffset );
829}
Note: See TracBrowser for help on using the repository browser.