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

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

Poznan Tools

  • Encoding only disoccluded CUs in depended views
  • Depth based motion prediction
  • Texture QP adjustment based on depth data
  • Nonlinear depth representation
  • Property svn:eol-style set to native
File size: 26.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#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, PDM_SUB_SAMP_EXP_X(m_uiPredDepthMapGeneration), PDM_SUB_SAMP_EXP_Y(m_uiPredDepthMapGeneration) );
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( PDM_SUB_SAMP_EXP_X(m_uiPredDepthMapGeneration), PDM_SUB_SAMP_EXP_Y(m_uiPredDepthMapGeneration) );
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_AVAIL_MAP
436    pcPic->removeAvailabilityBuffer();
437#endif
438#if POZNAN_SYNTH_VIEW
439    pcPic->removeSynthesisBuffer();
440#endif
441#if POZNAN_TEXTURE_TU_DELTA_QP_ACCORDING_TO_DEPTH
442    pcPic->removeSynthesisDepthBuffer();
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
542
543Void TEncTop::xInitSPS()
544{
545  m_cSPS.setWidth         ( m_iSourceWidth      );
546  m_cSPS.setHeight        ( m_iSourceHeight     );
547  m_cSPS.setPad           ( m_aiPad             );
548  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
549  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
550  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
551  m_cSPS.setMinTrDepth    ( 0                   );
552  m_cSPS.setMaxTrDepth    ( 1                   );
553
554  m_cSPS.setUseALF        ( m_bUseALF           );
555
556  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
557  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
558  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
559  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
560
561  m_cSPS.setUseDQP        ( m_iMaxDeltaQP != 0  );
562#if !HHI_NO_LowDelayCoding
563  m_cSPS.setUseLDC        ( m_bUseLDC           );
564#endif
565  m_cSPS.setUsePAD        ( m_bUsePAD           );
566
567  m_cSPS.setUseMRG        ( m_bUseMRG           ); // SOPH:
568
569#if LM_CHROMA
570  m_cSPS.setUseLMChroma   ( m_bUseLMChroma           );
571#endif
572
573  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
574
575  if( m_bIsDepth )
576  {
577    m_cSPS.initMultiviewSPSDepth    ( m_uiViewId, m_iViewOrderIdx );
578#if DEPTH_MAP_GENERATION
579    m_cSPS.setPredDepthMapGeneration( m_uiViewId, true );
580#endif
581#if HHI_INTER_VIEW_RESIDUAL_PRED
582    m_cSPS.setMultiviewResPredMode  ( 0 );
583#endif
584  }
585  else
586  {
587    m_cSPS.initMultiviewSPS           ( m_uiViewId, m_iViewOrderIdx, m_uiCamParPrecision, m_bCamParInSliceHeader, m_aaiCodedScale, m_aaiCodedOffset );
588    if( m_uiViewId )
589    {
590#if DEPTH_MAP_GENERATION
591#if HHI_INTER_VIEW_MOTION_PRED
592      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, m_uiMultiviewMvPredMode, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
593#else
594      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, 0, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
595#endif
596#endif
597#if HHI_INTER_VIEW_RESIDUAL_PRED
598      m_cSPS.setMultiviewResPredMode  ( m_uiMultiviewResPredMode );
599#endif
600    }
601    else
602    {
603#if DEPTH_MAP_GENERATION
604      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false );
605#endif
606#if HHI_INTER_VIEW_RESIDUAL_PRED
607      m_cSPS.setMultiviewResPredMode  ( 0 );
608#endif
609    }
610  }
611
612#if POZNAN_DBMP
613  m_cSPS.setDBMP  ( m_uiDBMP );
614#endif
615
616  m_cSPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
617
618#if DCM_COMB_LIST
619  m_cSPS.setUseLComb    ( m_bUseLComb           );
620  m_cSPS.setLCMod       ( m_bLCMod   );
621#endif
622
623  Int i;
624#if HHI_AMVP_OFF
625  for ( i = 0; i < g_uiMaxCUDepth; i++ )
626  {
627    m_cSPS.setAMVPMode( i, AM_NONE );
628  }
629#else
630  for ( i = 0; i < g_uiMaxCUDepth; i++ )
631  {
632    m_cSPS.setAMVPMode( i, AM_EXPL );
633  }
634#endif
635
636
637#if HHI_RMP_SWITCH
638  m_cSPS.setUseRMP( m_bUseRMP );
639#endif
640
641  m_cSPS.setBitDepth    ( g_uiBitDepth        );
642  m_cSPS.setBitIncrement( g_uiBitIncrement    );
643
644#if MTK_NONCROSS_INLOOP_FILTER
645  m_cSPS.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );
646#endif
647#if MTK_SAO
648  m_cSPS.setUseSAO             ( m_bUseSAO         );
649#endif
650#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
651  m_cSPS.setUseDMM( m_bUseDMM );
652#endif
653#if HHI_MPI
654  m_cSPS.setUseMVI( m_bUseMVI );
655#endif
656
657#if POZNAN_ENCODE_ONLY_DISOCCLUDED_CU
658  m_cSPS.setUseCUSkip( m_uiUseCUSkip );
659#endif
660
661#if POZNAN_NONLINEAR_DEPTH
662  m_cSPS.setDepthPower  ( m_fDepthPower );
663  // OLGIERD: ToDo - QP-Tex should not use getDepthPower() from texture SPS.
664#endif
665
666#if POZNAN_TEXTURE_TU_DELTA_QP_ACCORDING_TO_DEPTH
667  m_cSPS.setUseTexDqpAccordingToDepth  ( m_bUseTexDqpAccordingToDepth );
668#endif
669
670  m_cSPS.setCodedPictureBufferSize( m_uiCodedPictureStoreSize );
671}
672
673#if CONSTRAINED_INTRA_PRED
674Void TEncTop::xInitPPS()
675{
676  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
677  m_cPPS.setPPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
678  m_cPPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
679
680#ifdef WEIGHT_PRED
681  m_cPPS.setUseWP( m_bUseWeightPred );
682  m_cPPS.setWPBiPredIdc( m_uiBiPredIdc );
683#endif
684}
685#endif
686
687
688Void TEncTop::setTEncTopList(std::vector<TEncTop*>* pacTEncTopList )
689{
690  assert(m_uiViewId!=-1); // not to be set for single view coding
691
692  m_pacTEncTopList=pacTEncTopList;
693
694}
695
696
697Void TEncTop::printOutSummary(UInt uiNumAllPicCoded)
698{
699  assert (uiNumAllPicCoded == m_cAnalyzeAll.getNumPic());
700
701  //--CFG_KDY
702  m_cAnalyzeAll.setFrmRate( getFrameRate() );
703  m_cAnalyzeI.setFrmRate( getFrameRate() );
704  m_cAnalyzeP.setFrmRate( getFrameRate() );
705  m_cAnalyzeB.setFrmRate( getFrameRate() );
706
707  //-- all
708  if(m_uiViewId==-1)
709    printf( "\n\nSUMMARY --------------------------------------------------------\n" );
710  else {
711    if ( m_bIsDepth )
712    {
713      printf( "\n\nSUMMARY ---------------------------------------------- DEPTH %2d\n", m_uiViewId );
714    }
715    else
716    {
717      printf( "\n\nSUMMARY ---------------------------------------------- VIDEO %2d\n", m_uiViewId );
718    }
719  };
720  m_cAnalyzeAll.printOut('a');
721
722  printf( "\n\nI Slices--------------------------------------------------------\n" );
723  m_cAnalyzeI.printOut('i');
724
725  printf( "\n\nP Slices--------------------------------------------------------\n" );
726  m_cAnalyzeP.printOut('p');
727
728  printf( "\n\nB Slices--------------------------------------------------------\n" );
729  m_cAnalyzeB.printOut('b');
730
731#if _SUMMARY_OUT_
732  m_cAnalyzeAll.printSummaryOut();
733#endif
734#if _SUMMARY_PIC_
735  m_cAnalyzeI.printSummary('I');
736  m_cAnalyzeP.printSummary('P');
737  m_cAnalyzeB.printSummary('B');
738#endif
739}
740
741Void TEncTop::xSetRefPics( TComPic* pcPic, RefPicList eRefPicList )
742{
743  assert(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size() == m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx()).size());
744#if 1
745  // check if refPic is available
746  Int iNumberOfRefs = 0;
747  std::vector<Int> aiRefPocs ;
748  std::vector<Int> aiRefViews ;
749
750  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
751  {
752    Int iRefPoc  = m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC() ;
753    Int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
754    Bool bFoundRefPic = false;
755
756    if( iRefPoc == pcPic->getPOC() ) // interview
757    {
758      assert( iRefViewIdx < (Int)m_uiViewId );
759      aiRefPocs.push_back(iRefPoc);
760      aiRefViews.push_back(iRefViewIdx);
761      iNumberOfRefs++ ;
762      bFoundRefPic = true ;
763      continue;
764    }
765    else if ( iRefViewIdx < 0 ) // temporal
766    {
767      for( TComList<TComPic*>::iterator it = m_cListPic.begin(); it!=m_cListPic.end(); it++)
768      {
769        if( (*it)->getViewIdx() == pcPic->getViewIdx() && (*it)->getPOC() == iRefPoc && (*it)->getReconMark() )
770        {
771          aiRefPocs.push_back(iRefPoc);
772          aiRefViews.push_back(m_uiViewId);
773          bFoundRefPic = true ;
774          iNumberOfRefs++ ;
775          break;
776        }
777      }
778      if( (iRefPoc < pcPic->getPOC()) && !bFoundRefPic )
779      {
780        printf("\nInconsistence in GOP-String!");
781        assert(0);
782      }
783    }
784  }
785  for ( Int i=0; i< iNumberOfRefs; i++)
786  {
787    pcPic->setRefViewIdx( aiRefViews[i], eRefPicList, i );
788    pcPic->setRefPOC(aiRefPocs[i], eRefPicList, i );
789  }
790  pcPic->setNumRefs( iNumberOfRefs, eRefPicList );
791#else
792  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
793  {
794    const int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
795    if( iRefViewIdx < 0 )
796    {
797      // temporal reference from current view
798      pcPic->setRefViewIdx( m_iViewIdx, eRefPicList, i );
799    }
800    else
801    {
802      pcPic->setRefViewIdx( iRefViewIdx, eRefPicList, i );
803    }
804    pcPic->setRefPOC(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC(), eRefPicList, i );
805  }
806  pcPic->setNumRefs( m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(), eRefPicList );
807#endif
808}
809
810Void TEncTop::xCheckSliceType(TComPic* pcPic)
811{
812  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == I_SLICE )
813  {
814    return ;
815  }
816  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == P_SLICE )
817  {
818    return ;
819  }
820  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) != 0 && pcPic->getSliceType() == B_SLICE )
821  {
822    return ;
823  }
824  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
825  {
826    pcPic->setSliceType(I_SLICE) ;
827    return;
828  }
829  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
830  {
831    pcPic->setSliceType(P_SLICE) ;
832    return;
833  }
834
835  assert(0);
836}
837
838
839Void TEncTop::xSetPicProperties(TComPic* pcPic)
840{
841  pcPic->setSliceType( m_cSeqIter.getFrameDescriptor().getSliceType(m_uiViewId) );
842  pcPic->setReferenced( m_cSeqIter.getFrameDescriptor().getStoreForRef(m_uiViewId) );
843  pcPic->setColDir( m_cSeqIter.getFrameDescriptor().getColDir() ) ;
844  const Bool bQpChangePointPassed = m_iFrameNumInCodingOrder++ >= getQpChangeFrame();
845  const Int  iQpChangeOffset      = bQpChangePointPassed ? ( m_bIsDepth ? getQpChangeOffsetDepth() : getQpChangeOffsetVideo() ) : 0;
846  pcPic->setQP(max(MIN_QP,min(MAX_QP, m_iQP+ m_aiTLayerQPOffset[m_cSeqIter.getFrameDescriptor().getTEncSeqStructureLayer(m_uiViewId)] + iQpChangeOffset )) );
847  pcPic->setViewIdx( m_uiViewId );
848#if SONY_COLPIC_AVAILABILITY
849  pcPic->setViewOrderIdx(m_iViewOrderIdx);
850#endif
851#if 0
852  pcPic->setNumRefs(0, REF_PIC_LIST_0);
853  pcPic->setNumRefs(0, REF_PIC_LIST_1);
854
855
856  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== P_SLICE || m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
857  {
858    xSetRefPics( pcPic, REF_PIC_LIST_0 );
859  }
860  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
861  {
862    xSetRefPics( pcPic, REF_PIC_LIST_1 );
863  }
864#else
865  xSetRefPics( pcPic, REF_PIC_LIST_0 );
866  xSetRefPics( pcPic, REF_PIC_LIST_1 );
867  xCheckSliceType( pcPic );
868#endif
869
870  pcPic->setScaleOffset( m_aaiCodedScale, m_aaiCodedOffset );
871
872#if POZNAN_TEXTURE_TU_DELTA_QP_PARAM_IN_CFG_FOR_ENC
873    pcPic->setTexDqpAccordingToDepthOffset( getTexDqpAccordingToDepthOffset() );
874    pcPic->setTexDqpAccordingToDepthMul   ( getTexDqpAccordingToDepthMul() );
875    pcPic->setTexDqpAccordingToDepthTopBottomRow( getTexDqpAccordingToDepthTopBottomRow() ); 
876#endif
877}
Note: See TracBrowser for help on using the repository browser.