source: SHVCSoftware/branches/SHM-3.1-dev/source/Lib/TLibCommon/TComPicSym.cpp @ 915

Last change on this file since 915 was 435, checked in by nokia, 11 years ago

add inter-layer constrained tiles sets SEI from JCTVC-N0383

  • Property svn:eol-style set to native
File size: 10.2 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-2013, ITU/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 ITU/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/** \file     TComPicSym.cpp
35    \brief    picture symbol class
36*/
37
38#include "TComPicSym.h"
39#include "TComSampleAdaptiveOffset.h"
40
41//! \ingroup TLibCommon
42//! \{
43
44// ====================================================================================================================
45// Constructor / destructor / create / destroy
46// ====================================================================================================================
47
48TComPicSym::TComPicSym()
49:m_uiWidthInCU(0)
50,m_uiHeightInCU(0)
51,m_uiMaxCUWidth(0)
52,m_uiMaxCUHeight(0)
53,m_uiMinCUWidth(0)
54,m_uiMinCUHeight(0)
55,m_uhTotalDepth(0)
56,m_uiNumPartitions(0)
57,m_uiNumPartInWidth(0)
58,m_uiNumPartInHeight(0)
59,m_uiNumCUsInFrame(0)
60,m_apcTComSlice(NULL)
61,m_uiNumAllocatedSlice (0)
62,m_apcTComDataCU (NULL)
63,m_iNumColumnsMinus1 (0)
64,m_iNumRowsMinus1(0)
65,m_apcTComTile(NULL)
66,m_puiCUOrderMap(0)
67,m_puiTileIdxMap(NULL)
68,m_puiInverseCUOrderMap(NULL)
69{};
70
71
72Void TComPicSym::create  ( Int iPicWidth, Int iPicHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth )
73{
74  UInt i;
75
76  m_uhTotalDepth      = uiMaxDepth;
77  m_uiNumPartitions   = 1<<(m_uhTotalDepth<<1);
78 
79  m_uiMaxCUWidth      = uiMaxWidth;
80  m_uiMaxCUHeight     = uiMaxHeight;
81 
82  m_uiMinCUWidth      = uiMaxWidth  >> m_uhTotalDepth;
83  m_uiMinCUHeight     = uiMaxHeight >> m_uhTotalDepth;
84 
85  m_uiNumPartInWidth  = m_uiMaxCUWidth  / m_uiMinCUWidth;
86  m_uiNumPartInHeight = m_uiMaxCUHeight / m_uiMinCUHeight;
87 
88  m_uiWidthInCU       = ( iPicWidth %m_uiMaxCUWidth  ) ? iPicWidth /m_uiMaxCUWidth  + 1 : iPicWidth /m_uiMaxCUWidth;
89  m_uiHeightInCU      = ( iPicHeight%m_uiMaxCUHeight ) ? iPicHeight/m_uiMaxCUHeight + 1 : iPicHeight/m_uiMaxCUHeight;
90 
91  m_uiNumCUsInFrame   = m_uiWidthInCU * m_uiHeightInCU;
92  m_apcTComDataCU     = new TComDataCU*[m_uiNumCUsInFrame];
93 
94  if (m_uiNumAllocatedSlice>0)
95  {
96    for ( i=0; i<m_uiNumAllocatedSlice ; i++ )
97    {
98      delete m_apcTComSlice[i];
99    }
100    delete [] m_apcTComSlice;
101  }
102  m_apcTComSlice      = new TComSlice*[m_uiNumCUsInFrame*m_uiNumPartitions]; 
103  m_apcTComSlice[0]   = new TComSlice;
104  m_uiNumAllocatedSlice = 1;
105  for ( i=0; i<m_uiNumCUsInFrame ; i++ )
106  {
107    m_apcTComDataCU[i] = new TComDataCU;
108    m_apcTComDataCU[i]->create( m_uiNumPartitions, m_uiMaxCUWidth, m_uiMaxCUHeight, false, m_uiMaxCUWidth >> m_uhTotalDepth
109#if ADAPTIVE_QP_SELECTION
110      , true
111#endif     
112      );
113  }
114
115  m_puiCUOrderMap = new UInt[m_uiNumCUsInFrame+1];
116  m_puiTileIdxMap = new UInt[m_uiNumCUsInFrame];
117#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
118  m_piTileSetIdxMap = new Int[m_uiNumCUsInFrame];
119  m_pucTileSetType = new UChar[m_uiNumCUsInFrame];
120  m_pbSkippedTileSetFlag = new Bool[m_uiNumCUsInFrame];
121#endif
122  m_puiInverseCUOrderMap = new UInt[m_uiNumCUsInFrame+1];
123
124  for( i=0; i<m_uiNumCUsInFrame; i++ )
125  {
126    m_puiCUOrderMap[i] = i;
127    m_puiInverseCUOrderMap[i] = i;
128  }
129  m_saoParam = NULL;
130}
131
132Void TComPicSym::destroy()
133{
134  if (m_uiNumAllocatedSlice>0)
135  {
136    for (Int i = 0; i<m_uiNumAllocatedSlice ; i++ )
137    {
138      delete m_apcTComSlice[i];
139    }
140    delete [] m_apcTComSlice;
141  }
142  m_apcTComSlice = NULL;
143 
144  for (Int i = 0; i < m_uiNumCUsInFrame; i++)
145  {
146    m_apcTComDataCU[i]->destroy();
147    delete m_apcTComDataCU[i];
148    m_apcTComDataCU[i] = NULL;
149  }
150  delete [] m_apcTComDataCU;
151  m_apcTComDataCU = NULL;
152
153#if SVC_EXTENSION
154  if( m_apcTComTile )
155  {
156#endif
157  for(Int i = 0; i < (m_iNumColumnsMinus1+1)*(m_iNumRowsMinus1+1); i++ )
158  {
159    delete m_apcTComTile[i];
160  }
161  delete [] m_apcTComTile;
162#if SVC_EXTENSION
163  }
164#endif
165
166  m_apcTComTile = NULL;
167
168  delete [] m_puiCUOrderMap;
169  m_puiCUOrderMap = NULL;
170
171  delete [] m_puiTileIdxMap;
172  m_puiTileIdxMap = NULL;
173#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
174  delete [] m_piTileSetIdxMap;
175  m_piTileSetIdxMap = NULL;
176  delete [] m_pucTileSetType;
177  m_pucTileSetType = NULL;
178  delete [] m_pbSkippedTileSetFlag;
179  m_pbSkippedTileSetFlag = NULL;
180#endif
181
182  delete [] m_puiInverseCUOrderMap;
183  m_puiInverseCUOrderMap = NULL;
184 
185  if (m_saoParam)
186  {
187    TComSampleAdaptiveOffset::freeSaoParam(m_saoParam);
188    delete m_saoParam;
189    m_saoParam = NULL;
190  }
191}
192
193Void TComPicSym::allocateNewSlice()
194{
195  m_apcTComSlice[m_uiNumAllocatedSlice ++] = new TComSlice;
196  if (m_uiNumAllocatedSlice>=2)
197  {
198    m_apcTComSlice[m_uiNumAllocatedSlice-1]->copySliceInfo( m_apcTComSlice[m_uiNumAllocatedSlice-2] );
199#if SVC_EXTENSION
200    m_apcTComSlice[m_uiNumAllocatedSlice-1]->initSlice( m_apcTComSlice[m_uiNumAllocatedSlice-1]->getLayerId() );
201#else
202    m_apcTComSlice[m_uiNumAllocatedSlice-1]->initSlice();
203#endif
204  }
205}
206
207Void TComPicSym::clearSliceBuffer()
208{
209  UInt i;
210  for (i = 1; i < m_uiNumAllocatedSlice; i++)
211  {
212    delete m_apcTComSlice[i];
213  }
214  m_uiNumAllocatedSlice = 1;
215}
216
217UInt TComPicSym::getPicSCUEncOrder( UInt SCUAddr )
218{ 
219  return getInverseCUOrderMap(SCUAddr/m_uiNumPartitions)*m_uiNumPartitions + SCUAddr%m_uiNumPartitions; 
220}
221
222UInt TComPicSym::getPicSCUAddr( UInt SCUEncOrder )
223{
224  return getCUOrderMap(SCUEncOrder/m_uiNumPartitions)*m_uiNumPartitions + SCUEncOrder%m_uiNumPartitions;
225}
226
227Void TComPicSym::xCreateTComTileArray()
228{
229  m_apcTComTile = new TComTile*[(m_iNumColumnsMinus1+1)*(m_iNumRowsMinus1+1)];
230  for( UInt i=0; i<(m_iNumColumnsMinus1+1)*(m_iNumRowsMinus1+1); i++ )
231  {
232    m_apcTComTile[i] = new TComTile;
233  }
234}
235
236Void TComPicSym::xInitTiles()
237{
238  UInt  uiTileIdx;
239  UInt  uiColumnIdx = 0;
240  UInt  uiRowIdx = 0;
241  UInt  uiRightEdgePosInCU;
242  UInt  uiBottomEdgePosInCU;
243  Int   i, j;
244
245  //initialize each tile of the current picture
246  for( uiRowIdx=0; uiRowIdx < m_iNumRowsMinus1+1; uiRowIdx++ )
247  {
248    for( uiColumnIdx=0; uiColumnIdx < m_iNumColumnsMinus1+1; uiColumnIdx++ )
249    {
250      uiTileIdx = uiRowIdx * (m_iNumColumnsMinus1+1) + uiColumnIdx;
251
252      //initialize the RightEdgePosInCU for each tile
253      uiRightEdgePosInCU = 0;
254      for( i=0; i <= uiColumnIdx; i++ )
255      {
256        uiRightEdgePosInCU += this->getTComTile(uiRowIdx * (m_iNumColumnsMinus1+1) + i)->getTileWidth();
257      }
258      this->getTComTile(uiTileIdx)->setRightEdgePosInCU(uiRightEdgePosInCU-1);
259
260      //initialize the BottomEdgePosInCU for each tile
261      uiBottomEdgePosInCU = 0;
262      for( i=0; i <= uiRowIdx; i++ )
263      {
264        uiBottomEdgePosInCU += this->getTComTile(i * (m_iNumColumnsMinus1+1) + uiColumnIdx)->getTileHeight();
265      }
266      this->getTComTile(uiTileIdx)->setBottomEdgePosInCU(uiBottomEdgePosInCU-1);
267
268      //initialize the FirstCUAddr for each tile
269      this->getTComTile(uiTileIdx)->setFirstCUAddr( (this->getTComTile(uiTileIdx)->getBottomEdgePosInCU() - this->getTComTile(uiTileIdx)->getTileHeight() +1)*m_uiWidthInCU + 
270        this->getTComTile(uiTileIdx)->getRightEdgePosInCU() - this->getTComTile(uiTileIdx)->getTileWidth() + 1);
271    }
272  }
273
274  //initialize the TileIdxMap
275  for( i=0; i<m_uiNumCUsInFrame; i++)
276  {
277    for(j=0; j < m_iNumColumnsMinus1+1; j++)
278    {
279      if(i % m_uiWidthInCU <= this->getTComTile(j)->getRightEdgePosInCU())
280      {
281        uiColumnIdx = j;
282        j = m_iNumColumnsMinus1+1;
283      }
284    }
285    for(j=0; j < m_iNumRowsMinus1+1; j++)
286    {
287      if(i/m_uiWidthInCU <= this->getTComTile(j*(m_iNumColumnsMinus1 + 1))->getBottomEdgePosInCU())
288      {
289        uiRowIdx = j;
290        j = m_iNumRowsMinus1 + 1;
291      }
292    }
293    m_puiTileIdxMap[i] = uiRowIdx * (m_iNumColumnsMinus1 + 1) + uiColumnIdx;
294  }
295
296}
297
298UInt TComPicSym::xCalculateNxtCUAddr( UInt uiCurrCUAddr )
299{
300  UInt  uiNxtCUAddr;
301  UInt  uiTileIdx;
302 
303  //get the tile index for the current LCU
304  uiTileIdx = this->getTileIdxMap(uiCurrCUAddr);
305
306  //get the raster scan address for the next LCU
307  if( uiCurrCUAddr % m_uiWidthInCU == this->getTComTile(uiTileIdx)->getRightEdgePosInCU() && uiCurrCUAddr / m_uiWidthInCU == this->getTComTile(uiTileIdx)->getBottomEdgePosInCU() )
308  //the current LCU is the last LCU of the tile
309  {
310    if(uiTileIdx == (m_iNumColumnsMinus1+1)*(m_iNumRowsMinus1+1)-1)
311    {
312      uiNxtCUAddr = m_uiNumCUsInFrame;
313    }
314    else
315    {
316      uiNxtCUAddr = this->getTComTile(uiTileIdx+1)->getFirstCUAddr();
317    }
318  } 
319  else //the current LCU is not the last LCU of the tile
320  {
321    if( uiCurrCUAddr % m_uiWidthInCU == this->getTComTile(uiTileIdx)->getRightEdgePosInCU() )  //the current LCU is on the rightmost edge of the tile
322    {
323      uiNxtCUAddr = uiCurrCUAddr + m_uiWidthInCU - this->getTComTile(uiTileIdx)->getTileWidth() + 1;
324    }
325    else
326    {
327      uiNxtCUAddr = uiCurrCUAddr + 1;
328    }
329  }
330
331  return uiNxtCUAddr;
332}
333
334Void TComPicSym::allocSaoParam(TComSampleAdaptiveOffset *sao)
335{
336  m_saoParam = new SAOParam;
337  sao->allocSaoParam(m_saoParam);
338}
339
340TComTile::TComTile()
341{
342}
343
344TComTile::~TComTile()
345{
346}
347//! \}
Note: See TracBrowser for help on using the repository browser.