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

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

Poznan Tools

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