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

Last change on this file since 11 was 11, checked in by poznan-univ, 12 years ago

Poznan disocclusion coding - CU Skip

  • Property svn:eol-style set to native
File size: 25.4 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 POZNAN_AVAIL_MAP
419    pcPic->removeAvailabilityBuffer();
420#endif
421#if POZNAN_SYNTH_VIEW
422    pcPic->removeSynthesisBuffer();
423#endif
424#if HHI_INTER_VIEW_MOTION_PRED
425    pcPic->removeOrgDepthMapBuffer();
426#endif
427#if HHI_INTER_VIEW_RESIDUAL_PRED
428    pcPic->removeResidualBuffer   ();
429#endif
430#if HHI_INTERVIEW_SKIP
431    pcPic->removeUsedPelsMapBuffer();
432#endif
433  }
434}
435
436
437#if AMVP_BUFFERCOMPRESS
438Void
439TEncTop::compressMotion( Int iPoc )
440{
441  TComPic*                      pcPic = 0;
442  TComList<TComPic*>::iterator  cIter = m_cListPic.begin();
443  TComList<TComPic*>::iterator  cEnd  = m_cListPic.end  ();
444  for( ; cIter != cEnd; cIter++ )
445  {
446    if( (*cIter)->getPOC() == iPoc )
447    {
448      pcPic = *cIter;
449      break;
450    }
451  }
452  AOF( pcPic );
453  if ( pcPic )
454  {
455    pcPic->compressMotion();
456  }
457}
458#endif
459
460
461
462// ====================================================================================================================
463// Protected member functions
464// ====================================================================================================================
465
466/**
467 - Application has picture buffer list with size of GOP + 1
468 - Picture buffer list acts like as ring buffer
469 - End of the list has the latest picture
470 .
471 \retval rpcPic obtained picture buffer
472 */
473Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
474{
475  TComSlice::sortPicList(m_cListPic);
476
477  // bug-fix - erase frame memory (previous GOP) which is not used for reference any more
478  if (m_cListPic.size() >=  m_uiCodedPictureStoreSize )  // 2)   //  K. Lee bug fix - for multiple reference > 2
479  {
480    rpcPic = m_cListPic.popFront();
481
482    // is it necessary without long-term reference?
483  }
484  else
485  {
486    rpcPic = new TComPic;
487    rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
488  }
489
490  m_cListPic.pushBack( rpcPic );
491  rpcPic->setReconMark (false);
492
493  m_iPOCLast++;
494  m_iNumPicRcvd++;
495
496  rpcPic->addOriginalBuffer();
497#if HHI_INTER_VIEW_MOTION_PRED
498  if( m_uiMultiviewMvRegMode )
499  {
500    rpcPic->addOrgDepthMapBuffer();
501  }
502#endif
503
504#if HHI_INTERVIEW_SKIP
505  if( getInterViewSkip() )
506  {
507    rpcPic->addUsedPelsMapBuffer();
508  }
509#endif
510
511  rpcPic->setCurrSliceIdx( 0 ); // MW
512  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
513
514  // mark it should be extended
515  rpcPic->getPicYuvRec()->setBorderExtension(false);
516}
517
518
519Void TEncTop::xInitSPS()
520{
521  m_cSPS.setWidth         ( m_iSourceWidth      );
522  m_cSPS.setHeight        ( m_iSourceHeight     );
523  m_cSPS.setPad           ( m_aiPad             );
524  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
525  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
526  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
527  m_cSPS.setMinTrDepth    ( 0                   );
528  m_cSPS.setMaxTrDepth    ( 1                   );
529
530  m_cSPS.setUseALF        ( m_bUseALF           );
531
532  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
533  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
534  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
535  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
536
537  m_cSPS.setUseDQP        ( m_iMaxDeltaQP != 0  );
538#if !HHI_NO_LowDelayCoding
539  m_cSPS.setUseLDC        ( m_bUseLDC           );
540#endif
541  m_cSPS.setUsePAD        ( m_bUsePAD           );
542
543  m_cSPS.setUseMRG        ( m_bUseMRG           ); // SOPH:
544
545#if LM_CHROMA
546  m_cSPS.setUseLMChroma   ( m_bUseLMChroma           );
547#endif
548
549  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
550
551  if( m_bIsDepth )
552  {
553    m_cSPS.initMultiviewSPSDepth    ( m_uiViewId, m_iViewOrderIdx );
554#if DEPTH_MAP_GENERATION
555    m_cSPS.setPredDepthMapGeneration( m_uiViewId, true );
556#endif
557#if HHI_INTER_VIEW_RESIDUAL_PRED
558    m_cSPS.setMultiviewResPredMode  ( 0 );
559#endif
560  }
561  else
562  {
563    m_cSPS.initMultiviewSPS           ( m_uiViewId, m_iViewOrderIdx, m_uiCamParPrecision, m_bCamParInSliceHeader, m_aaiCodedScale, m_aaiCodedOffset );
564    if( m_uiViewId )
565    {
566#if DEPTH_MAP_GENERATION
567#if HHI_INTER_VIEW_MOTION_PRED
568      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, m_uiMultiviewMvPredMode, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
569#else
570      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, 0, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
571#endif
572#endif
573#if HHI_INTER_VIEW_RESIDUAL_PRED
574      m_cSPS.setMultiviewResPredMode  ( m_uiMultiviewResPredMode );
575#endif
576    }
577    else
578    {
579#if DEPTH_MAP_GENERATION
580      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false );
581#endif
582#if HHI_INTER_VIEW_RESIDUAL_PRED
583      m_cSPS.setMultiviewResPredMode  ( 0 );
584#endif
585    }
586  }
587  m_cSPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
588
589#if DCM_COMB_LIST
590  m_cSPS.setUseLComb    ( m_bUseLComb           );
591  m_cSPS.setLCMod       ( m_bLCMod   );
592#endif
593
594  Int i;
595#if HHI_AMVP_OFF
596  for ( i = 0; i < g_uiMaxCUDepth; i++ )
597  {
598    m_cSPS.setAMVPMode( i, AM_NONE );
599  }
600#else
601  for ( i = 0; i < g_uiMaxCUDepth; i++ )
602  {
603    m_cSPS.setAMVPMode( i, AM_EXPL );
604  }
605#endif
606
607
608#if HHI_RMP_SWITCH
609  m_cSPS.setUseRMP( m_bUseRMP );
610#endif
611
612  m_cSPS.setBitDepth    ( g_uiBitDepth        );
613  m_cSPS.setBitIncrement( g_uiBitIncrement    );
614
615#if MTK_NONCROSS_INLOOP_FILTER
616  m_cSPS.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );
617#endif
618#if MTK_SAO
619  m_cSPS.setUseSAO             ( m_bUseSAO         );
620#endif
621#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
622  m_cSPS.setUseDMM( m_bUseDMM );
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 0
807  pcPic->setNumRefs(0, REF_PIC_LIST_0);
808  pcPic->setNumRefs(0, REF_PIC_LIST_1);
809
810
811  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== P_SLICE || m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
812  {
813    xSetRefPics( pcPic, REF_PIC_LIST_0 );
814  }
815  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
816  {
817    xSetRefPics( pcPic, REF_PIC_LIST_1 );
818  }
819#else
820  xSetRefPics( pcPic, REF_PIC_LIST_0 );
821  xSetRefPics( pcPic, REF_PIC_LIST_1 );
822  xCheckSliceType( pcPic );
823#endif
824
825  pcPic->setScaleOffset( m_aaiCodedScale, m_aaiCodedOffset );
826}
Note: See TracBrowser for help on using the repository browser.