source: SHVCSoftware/branches/0.1.1-bugfix/source/Lib/TLibCommon/TComPic.cpp

Last change on this file was 6, checked in by seregin, 12 years ago

Correct IntraBL cost and fix for couple of compiler warnings.

File size: 17.9 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-2012, 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     TComPic.cpp
35    \brief    picture class
36*/
37
38#include "TComPic.h"
39#include "SEI.h"
40
41//! \ingroup TLibCommon
42//! \{
43
44// ====================================================================================================================
45// Constructor / destructor / create / destroy
46// ====================================================================================================================
47
48TComPic::TComPic()
49: m_uiTLayer                              (0)
50, m_bUsedByCurr                           (false)
51, m_bIsLongTerm                           (false)
52, m_bIsUsedAsLongTerm                     (false)
53, m_apcPicSym                             (NULL)
54, m_pcPicYuvPred                          (NULL)
55, m_pcPicYuvResi                          (NULL)
56, m_bReconstructed                        (false)
57, m_bNeededForOutput                      (false)
58, m_uiCurrSliceIdx                        (0)
59, m_pSliceSUMap                           (NULL)
60, m_pbValidSlice                          (NULL)
61, m_sliceGranularityForNDBFilter          (0)
62, m_bIndependentSliceBoundaryForNDBFilter (false)
63, m_bIndependentTileBoundaryForNDBFilter  (false)
64, m_pNDBFilterYuvTmp                      (NULL)
65, m_bCheckLTMSB                           (false)
66, m_SEIs                                  (NULL)
67#if SVC_EXTENSION
68, m_bSpatialEnhLayer( false )
69, m_pcFullPelBaseRec( NULL )
70#if REF_IDX_ME_AROUND_ZEROMV
71, m_bIsILR                                (false)
72#endif
73#endif
74{
75  m_apcPicYuv[0]      = NULL;
76  m_apcPicYuv[1]      = NULL;
77}
78
79TComPic::~TComPic()
80{
81}
82
83#if SVC_UPSAMPLING
84Void TComPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, TComSPS* pcSps,  Bool bIsVirtual )
85{
86  m_apcPicSym     = new TComPicSym;  m_apcPicSym   ->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth );
87  if (!bIsVirtual)
88  {
89    m_apcPicYuv[0]  = new TComPicYuv;  m_apcPicYuv[0]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps );
90  }
91  m_apcPicYuv[1]  = new TComPicYuv;  m_apcPicYuv[1]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps );
92 
93  if (m_bSpatialEnhLayer)
94  {
95    m_pcFullPelBaseRec = new TComPicYuv;  m_pcFullPelBaseRec->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps );
96  }
97
98  /* there are no SEI messages associated with this picture initially */
99  m_SEIs = NULL;
100  m_bUsedByCurr = false;
101  return;
102}
103#if REF_IDX_FRAMEWORK
104Void TComPic::createWithOutYuv( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, TComSPS* pcSps,  Bool bIsVirtual)
105{
106  m_apcPicSym     = new TComPicSym;  m_apcPicSym   ->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth );
107  if (!bIsVirtual)
108  {
109    m_apcPicYuv[0]  = new TComPicYuv;  m_apcPicYuv[0]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps );
110  }
111  m_apcPicYuv[1]  = NULL;
112 
113#if SVC_UPSAMPLING
114  if (m_bSpatialEnhLayer)
115  {
116    m_pcFullPelBaseRec = new TComPicYuv;  m_pcFullPelBaseRec->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps );
117  }
118#endif
119
120  /* there are no SEI messages associated with this picture initially */
121  m_SEIs = NULL;
122  m_bUsedByCurr = false;
123  return;
124}
125#endif
126#else
127
128Void TComPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Bool bIsVirtual )
129{
130  m_apcPicSym     = new TComPicSym;  m_apcPicSym   ->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth );
131  if (!bIsVirtual)
132  {
133    m_apcPicYuv[0]  = new TComPicYuv;  m_apcPicYuv[0]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth );
134  }
135  m_apcPicYuv[1]  = new TComPicYuv;  m_apcPicYuv[1]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth );
136 
137  /* there are no SEI messages associated with this picture initially */
138  m_SEIs = NULL;
139  m_bUsedByCurr = false;
140  return;
141}
142#endif
143
144Void TComPic::destroy()
145{
146  if (m_apcPicSym)
147  {
148    m_apcPicSym->destroy();
149    delete m_apcPicSym;
150    m_apcPicSym = NULL;
151  }
152 
153  if (m_apcPicYuv[0])
154  {
155    m_apcPicYuv[0]->destroy();
156    delete m_apcPicYuv[0];
157    m_apcPicYuv[0]  = NULL;
158  }
159 
160  if (m_apcPicYuv[1])
161  {
162    m_apcPicYuv[1]->destroy();
163    delete m_apcPicYuv[1];
164    m_apcPicYuv[1]  = NULL;
165  }
166 
167#if SVC_EXTENSION && SVC_UPSAMPLING
168  if (m_bSpatialEnhLayer)
169  {
170    m_pcFullPelBaseRec->destroy();
171    delete m_pcFullPelBaseRec;    m_pcFullPelBaseRec  = NULL;
172  }
173#endif
174
175  delete m_SEIs;
176}
177
178Void TComPic::compressMotion()
179{
180  TComPicSym* pPicSym = getPicSym(); 
181  for ( UInt uiCUAddr = 0; uiCUAddr < pPicSym->getFrameHeightInCU()*pPicSym->getFrameWidthInCU(); uiCUAddr++ )
182  {
183    TComDataCU* pcCU = pPicSym->getCU(uiCUAddr);
184    pcCU->compressMV(); 
185  } 
186}
187
188/** Create non-deblocked filter information
189 * \param pSliceStartAddress array for storing slice start addresses
190 * \param numSlices number of slices in picture
191 * \param sliceGranularityDepth slice granularity
192 * \param bNDBFilterCrossSliceBoundary cross-slice-boundary in-loop filtering; true for "cross".
193 * \param numTiles number of tiles in picture
194 * \param bNDBFilterCrossTileBoundary cross-tile-boundary in-loop filtering; true for "cross".
195 */
196Void TComPic::createNonDBFilterInfo(std::vector<Int> sliceStartAddress, Int sliceGranularityDepth
197                                    ,std::vector<Bool>* LFCrossSliceBoundary
198                                    ,Int numTiles
199                                    ,Bool bNDBFilterCrossTileBoundary)
200{
201  UInt maxNumSUInLCU = getNumPartInCU();
202  UInt numLCUInPic   = getNumCUsInFrame();
203  UInt picWidth      = getSlice(0)->getSPS()->getPicWidthInLumaSamples();
204  UInt picHeight     = getSlice(0)->getSPS()->getPicHeightInLumaSamples();
205  Int  numLCUsInPicWidth = getFrameWidthInCU();
206  Int  numLCUsInPicHeight= getFrameHeightInCU();
207  UInt maxNumSUInLCUWidth = getNumPartInWidth();
208  UInt maxNumSUInLCUHeight= getNumPartInHeight();
209  Int  numSlices = (Int) sliceStartAddress.size() - 1;
210  m_bIndependentSliceBoundaryForNDBFilter = false;
211  if(numSlices > 1)
212  {
213    for(Int s=0; s< numSlices; s++)
214    {
215      if((*LFCrossSliceBoundary)[s] == false)
216      {
217        m_bIndependentSliceBoundaryForNDBFilter = true;
218      }
219    }
220  }
221  m_sliceGranularityForNDBFilter = sliceGranularityDepth;
222  m_bIndependentTileBoundaryForNDBFilter  = (bNDBFilterCrossTileBoundary)?(false) :((numTiles > 1)?(true):(false));
223
224  m_pbValidSlice = new Bool[numSlices];
225  for(Int s=0; s< numSlices; s++)
226  {
227    m_pbValidSlice[s] = true;
228  }
229  m_pSliceSUMap = new Int[maxNumSUInLCU * numLCUInPic];
230
231  //initialization
232  for(UInt i=0; i< (maxNumSUInLCU * numLCUInPic); i++ )
233  {
234    m_pSliceSUMap[i] = -1;
235  }
236  for( UInt CUAddr = 0; CUAddr < numLCUInPic ; CUAddr++ )
237  {
238    TComDataCU* pcCU = getCU( CUAddr );
239    pcCU->setSliceSUMap(m_pSliceSUMap + (CUAddr* maxNumSUInLCU)); 
240    pcCU->getNDBFilterBlocks()->clear();
241  }
242  m_vSliceCUDataLink.clear();
243
244  m_vSliceCUDataLink.resize(numSlices);
245
246  UInt startAddr, endAddr, firstCUInStartLCU, startLCU, endLCU, lastCUInEndLCU, uiAddr;
247  UInt LPelX, TPelY, LCUX, LCUY;
248  UInt currSU;
249  UInt startSU, endSU;
250
251  for(Int s=0; s< numSlices; s++)
252  {
253    //1st step: decide the real start address
254    startAddr = sliceStartAddress[s];
255    endAddr   = sliceStartAddress[s+1] -1;
256
257    startLCU            = startAddr / maxNumSUInLCU;
258    firstCUInStartLCU   = startAddr % maxNumSUInLCU;
259
260    endLCU              = endAddr   / maxNumSUInLCU;
261    lastCUInEndLCU      = endAddr   % maxNumSUInLCU;   
262
263    uiAddr = m_apcPicSym->getCUOrderMap(startLCU);
264
265    LCUX      = getCU(uiAddr)->getCUPelX();
266    LCUY      = getCU(uiAddr)->getCUPelY();
267    LPelX     = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[firstCUInStartLCU] ];
268    TPelY     = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[firstCUInStartLCU] ];
269    currSU    = firstCUInStartLCU;
270
271    Bool bMoveToNextLCU = false;
272    Bool bSliceInOneLCU = (startLCU == endLCU);
273
274    while(!( LPelX < picWidth ) || !( TPelY < picHeight ))
275    {
276      currSU ++;
277
278      if(bSliceInOneLCU)
279      {
280        if(currSU > lastCUInEndLCU)
281        {
282          m_pbValidSlice[s] = false;
283          break;
284        }
285      }
286
287      if(currSU >= maxNumSUInLCU )
288      {
289        bMoveToNextLCU = true;
290        break;
291      }
292
293      LPelX = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[currSU] ];
294      TPelY = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[currSU] ];
295
296    }
297
298
299    if(!m_pbValidSlice[s])
300    {
301      continue;
302    }
303
304    if(currSU != firstCUInStartLCU)
305    {
306      if(!bMoveToNextLCU)
307      {
308        firstCUInStartLCU = currSU;
309      }
310      else
311      {
312        startLCU++;
313        firstCUInStartLCU = 0;
314        assert( startLCU < getNumCUsInFrame());
315      }
316      assert(startLCU*maxNumSUInLCU + firstCUInStartLCU < endAddr);
317    }
318
319
320    //2nd step: assign NonDBFilterInfo to each processing block
321    for(UInt i= startLCU; i <= endLCU; i++)
322    {
323      startSU = (i == startLCU)?(firstCUInStartLCU):(0);
324      endSU   = (i == endLCU  )?(lastCUInEndLCU   ):(maxNumSUInLCU -1);
325
326      uiAddr = m_apcPicSym->getCUOrderMap(i);
327      Int iTileID= m_apcPicSym->getTileIdxMap(uiAddr);
328
329      TComDataCU* pcCU = getCU(uiAddr);
330      m_vSliceCUDataLink[s].push_back(pcCU);
331
332      createNonDBFilterInfoLCU(iTileID, s, pcCU, startSU, endSU, m_sliceGranularityForNDBFilter, picWidth, picHeight);
333    }
334  }
335
336  //step 3: border availability
337  for(Int s=0; s< numSlices; s++)
338  {
339    if(!m_pbValidSlice[s])
340    {
341      continue;
342    }
343
344    for(Int i=0; i< m_vSliceCUDataLink[s].size(); i++)
345    {
346      TComDataCU* pcCU = m_vSliceCUDataLink[s][i];
347      uiAddr = pcCU->getAddr();
348
349      if(pcCU->getPic()==0)
350      {
351        continue;
352      }
353      Int iTileID= m_apcPicSym->getTileIdxMap(uiAddr);
354      Bool bTopTileBoundary = false, bDownTileBoundary= false, bLeftTileBoundary= false, bRightTileBoundary= false;
355
356      if(m_bIndependentTileBoundaryForNDBFilter)
357      {
358        //left
359        if( uiAddr % numLCUsInPicWidth != 0)
360        {
361          bLeftTileBoundary = ( m_apcPicSym->getTileIdxMap(uiAddr -1) != iTileID )?true:false;
362        }
363        //right
364        if( (uiAddr % numLCUsInPicWidth) != (numLCUsInPicWidth -1) )
365        {
366          bRightTileBoundary = ( m_apcPicSym->getTileIdxMap(uiAddr +1) != iTileID)?true:false;
367        }
368        //top
369        if( uiAddr >= numLCUsInPicWidth)
370        {
371          bTopTileBoundary = (m_apcPicSym->getTileIdxMap(uiAddr - numLCUsInPicWidth) !=  iTileID )?true:false;
372        }
373        //down
374        if( uiAddr + numLCUsInPicWidth < numLCUInPic )
375        {
376          bDownTileBoundary = (m_apcPicSym->getTileIdxMap(uiAddr + numLCUsInPicWidth) != iTileID)?true:false;
377        }
378
379      }
380
381      pcCU->setNDBFilterBlockBorderAvailability(numLCUsInPicWidth, numLCUsInPicHeight, maxNumSUInLCUWidth, maxNumSUInLCUHeight,picWidth, picHeight
382        , *LFCrossSliceBoundary
383        ,bTopTileBoundary, bDownTileBoundary, bLeftTileBoundary, bRightTileBoundary
384        ,m_bIndependentTileBoundaryForNDBFilter);
385
386    }
387
388  }
389
390  if( m_bIndependentSliceBoundaryForNDBFilter || m_bIndependentTileBoundaryForNDBFilter)
391  {
392    m_pNDBFilterYuvTmp = new TComPicYuv();
393    m_pNDBFilterYuvTmp->create(picWidth, picHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth);
394  }
395
396}
397
398/** Create non-deblocked filter information for LCU
399 * \param tileID tile index
400 * \param sliceID slice index
401 * \param pcCU CU data pointer
402 * \param startSU start SU index in LCU
403 * \param endSU end SU index in LCU
404 * \param sliceGranularyDepth slice granularity
405 * \param picWidth picture width
406 * \param picHeight picture height
407 */
408Void TComPic::createNonDBFilterInfoLCU(Int tileID, Int sliceID, TComDataCU* pcCU, UInt startSU, UInt endSU, Int sliceGranularyDepth, UInt picWidth, UInt picHeight)
409{
410  UInt LCUX          = pcCU->getCUPelX();
411  UInt LCUY          = pcCU->getCUPelY();
412  Int* pCUSliceMap    = pcCU->getSliceSUMap();
413  UInt maxNumSUInLCU = getNumPartInCU();
414  UInt maxNumSUInSGU = maxNumSUInLCU >> (sliceGranularyDepth << 1);
415  UInt maxNumSUInLCUWidth = getNumPartInWidth();
416  UInt LPelX, TPelY;
417  UInt currSU;
418
419
420  //get the number of valid NBFilterBLock
421  currSU   = startSU;
422  while(currSU <= endSU)
423  {
424    LPelX = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[currSU] ];
425    TPelY = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[currSU] ];
426
427    while(!( LPelX < picWidth ) || !( TPelY < picHeight ))
428    {
429      currSU += maxNumSUInSGU;
430      if(currSU >= maxNumSUInLCU || currSU > endSU)
431      {
432        break;
433      }
434      LPelX = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[currSU] ];
435      TPelY = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[currSU] ];
436    }
437
438    if(currSU >= maxNumSUInLCU || currSU > endSU)
439    {
440      break;
441    }
442
443    NDBFBlockInfo NDBFBlock;
444
445    NDBFBlock.tileID  = tileID;
446    NDBFBlock.sliceID = sliceID;
447    NDBFBlock.posY    = TPelY;
448    NDBFBlock.posX    = LPelX;
449    NDBFBlock.startSU = currSU;
450
451    UInt uiLastValidSU  = currSU;
452    UInt uiIdx, uiLPelX_su, uiTPelY_su;
453    for(uiIdx = currSU; uiIdx < currSU + maxNumSUInSGU; uiIdx++)
454    {
455      if(uiIdx > endSU)
456      {
457        break;       
458      }
459      uiLPelX_su   = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[uiIdx] ];
460      uiTPelY_su   = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[uiIdx] ];
461      if( !(uiLPelX_su < picWidth ) || !( uiTPelY_su < picHeight ))
462      {
463        continue;
464      }
465      pCUSliceMap[uiIdx] = sliceID;
466      uiLastValidSU = uiIdx;
467    }
468    NDBFBlock.endSU = uiLastValidSU;
469
470    UInt rTLSU = g_auiZscanToRaster[ NDBFBlock.startSU ];
471    UInt rBRSU = g_auiZscanToRaster[ NDBFBlock.endSU   ];
472    NDBFBlock.widthSU  = (rBRSU % maxNumSUInLCUWidth) - (rTLSU % maxNumSUInLCUWidth)+ 1;
473    NDBFBlock.heightSU = (UInt)(rBRSU / maxNumSUInLCUWidth) - (UInt)(rTLSU / maxNumSUInLCUWidth)+ 1;
474    NDBFBlock.width    = NDBFBlock.widthSU  * getMinCUWidth();
475    NDBFBlock.height   = NDBFBlock.heightSU * getMinCUHeight();
476
477    pcCU->getNDBFilterBlocks()->push_back(NDBFBlock);
478
479    currSU += maxNumSUInSGU;
480  }
481
482}
483
484/** destroy non-deblocked filter information for LCU
485 */
486Void TComPic::destroyNonDBFilterInfo()
487{
488  if(m_pbValidSlice != NULL)
489  {
490    delete[] m_pbValidSlice;
491    m_pbValidSlice = NULL;
492  }
493
494  if(m_pSliceSUMap != NULL)
495  {
496    delete[] m_pSliceSUMap;
497    m_pSliceSUMap = NULL;
498  }
499  for( UInt CUAddr = 0; CUAddr < getNumCUsInFrame() ; CUAddr++ )
500  {
501    TComDataCU* pcCU = getCU( CUAddr );
502    pcCU->getNDBFilterBlocks()->clear();
503  }
504
505  if( m_bIndependentSliceBoundaryForNDBFilter || m_bIndependentTileBoundaryForNDBFilter)
506  {
507    m_pNDBFilterYuvTmp->destroy();
508    delete m_pNDBFilterYuvTmp;
509    m_pNDBFilterYuvTmp = NULL;
510  }
511
512}
513
514#if REF_IDX_FRAMEWORK
515Void copyOnetoOnePicture(    // SVC_NONCOLL
516                  Pel *in,       
517                  Pel *out,     
518                  Int nCols,
519                  Int nRows, 
520                  Int fullRowWidth)
521{
522  Int rX;
523
524  for (rX = 0; rX < nRows; rX++)       
525  {
526    memcpy( out, in, sizeof(Pel) * nCols );
527    in = in + fullRowWidth;
528    out = out + fullRowWidth;
529  }
530}
531
532Void TComPic:: copyUpsampledPictureYuv(TComPicYuv*   pcPicYuvIn, TComPicYuv*   pcPicYuvOut)
533{
534  Int upsampledRowWidthLuma = pcPicYuvOut->getStride(); // 2 * pcPicYuvOut->getLumaMargin() + pcPicYuvOut->getWidth();
535  Int upsampledRowWidthCroma = pcPicYuvOut->getCStride(); //2 * pcPicYuvOut->getChromaMargin() + (pcPicYuvOut->getWidth()>>1);
536
537  copyOnetoOnePicture(
538    pcPicYuvIn->getLumaAddr(),       
539    pcPicYuvOut->getLumaAddr(),     
540    pcPicYuvOut->getWidth(), 
541    pcPicYuvOut->getHeight(),
542    upsampledRowWidthLuma);
543  copyOnetoOnePicture(
544    pcPicYuvIn->getCrAddr(),       
545    pcPicYuvOut->getCrAddr(),     
546    pcPicYuvOut->getWidth()>>1, 
547    pcPicYuvOut->getHeight()>>1,
548    upsampledRowWidthCroma);
549  copyOnetoOnePicture(
550    pcPicYuvIn->getCbAddr(),       
551    pcPicYuvOut->getCbAddr(),     
552    pcPicYuvOut->getWidth()>>1, 
553    pcPicYuvOut->getHeight()>>1,
554    upsampledRowWidthCroma);
555}
556#endif
557
558//! \}
Note: See TracBrowser for help on using the repository browser.