source: 3DVCSoftware/trunk/source/Lib/TLibRenderer/TRenImage.cpp @ 78

Last change on this file since 78 was 56, checked in by hschwarz, 13 years ago

updated trunk (move to HM6.1)

  • Property svn:eol-style set to native
File size: 7.6 KB
RevLine 
[5]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 */
[2]33
34
35#include "TRenImage.h"
36#include "TRenImagePlane.h"
37#include "TRenFilter.h"
[56]38#include "assert.h"
[2]39
40template<typename T>
41TRenImage<T>::TRenImage( TRenImage& rcIn )
42{
43  allocatePlanes( rcIn.getPlane(0)->getWidth(), rcIn.getPlane(0)->getHeight(), rcIn.getNumberOfFullPlanes(), rcIn.getNumberOfQuaterPlanes() ) ; assign(&rcIn);
44}
45
46template<typename T>
47TRenImage<T>::TRenImage( UInt uiWidth, UInt uiHeight, UInt uiNumberOfFullPlanes, UInt uiNumberOfQuaterPlanes )
48{
49  allocatePlanes( uiWidth, uiHeight, uiNumberOfFullPlanes, uiNumberOfQuaterPlanes );
50}
51
52template<typename T>
53TRenImage<T>::TRenImage() : m_uiNumberOfFullPlanes(0), m_uiNumberOfQuaterPlanes(0), m_uiNumberOfPlanes(0), m_apcPlanes(0)
54{
55
56}
57
58
59template<>
60TRenImage<Pel>::TRenImage( TComPicYuv* pcPicYuv, Bool bFirstPlaneOnly )
61{
62  if (bFirstPlaneOnly) //400
63  {
64    m_uiNumberOfPlanes       = 1;
65    m_uiNumberOfFullPlanes   = 1;
66    m_uiNumberOfQuaterPlanes = 0;
67    m_apcPlanes    = new TRenImagePlane<Pel>*[ m_uiNumberOfPlanes ];
68    m_apcPlanes[0] = new TRenImagePlane<Pel>( pcPicYuv->getBufY(), pcPicYuv->getWidth() + (REN_LUMA_MARGIN << 1),   pcPicYuv->getHeight()+ (REN_LUMA_MARGIN << 1), pcPicYuv->getStride (), REN_LUMA_MARGIN );
69  }
70  else //420
71  {
72    m_uiNumberOfPlanes       = 3;
73    m_uiNumberOfFullPlanes   = 1;
74    m_uiNumberOfQuaterPlanes = 2;
75
76    m_apcPlanes    = new TRenImagePlane<Pel>*[ m_uiNumberOfPlanes ];
77    m_apcPlanes[0] = new TRenImagePlane<Pel>( pcPicYuv->getBufY(),   pcPicYuv->getWidth()     + (REN_LUMA_MARGIN << 1),  pcPicYuv->getHeight()      + (REN_LUMA_MARGIN << 1), pcPicYuv->getStride (), REN_LUMA_MARGIN );
78    m_apcPlanes[1] = new TRenImagePlane<Pel>( pcPicYuv->getBufU(),   (pcPicYuv->getWidth()>>1)+  REN_LUMA_MARGIN      ,  (pcPicYuv->getHeight()>>1) +  REN_LUMA_MARGIN      , pcPicYuv->getCStride(), REN_LUMA_MARGIN >> 1 );
79    m_apcPlanes[2] = new TRenImagePlane<Pel>( pcPicYuv->getBufV(),   (pcPicYuv->getWidth()>>1)+  REN_LUMA_MARGIN      ,  (pcPicYuv->getHeight()>>1) +  REN_LUMA_MARGIN      , pcPicYuv->getCStride(), REN_LUMA_MARGIN >> 1 );
80  }
81}
82
83template<typename T>
84TRenImage<T>* TRenImage<T>::create()
85{
86  return new TRenImage( m_apcPlanes[0]->getWidth(), m_apcPlanes[0]->getHeight(), m_uiNumberOfFullPlanes, m_uiNumberOfQuaterPlanes );
87}
88
89
90template<typename T>
91TRenImage<T>::TRenImage( TComPicYuv* pcPicYuv, Bool bFirstPlaneOnly )
92{
93  assert(0);
94}
95
96template<class T>
97TRenImagePlane<T>* TRenImage<T>::getPlane(UInt uiPlaneNumber) const
98{
99  return m_apcPlanes[uiPlaneNumber];
100}
101
102template<class T>
103TRenImagePlane<T>** TRenImage<T>::getPlanes() const
104{
105  return m_apcPlanes;
106}
107
108template<typename T>
109Void TRenImage<T>::allocatePlanes( UInt uiWidth, UInt uiHeight, UInt uiNumberOfFullPlanes, UInt uiNumberOfQuaterPlanes )
110{
111  assert( uiNumberOfFullPlanes + uiNumberOfQuaterPlanes);
112
113  UInt uiHalfWidth  = uiWidth  / 2;
114  UInt uiHalfHeight = uiHeight / 2;
115
116  uiHalfWidth  = (uiHalfWidth  == 0) ? 1 : uiHalfWidth ;
117  uiHalfHeight = (uiHalfHeight == 0) ? 1 : uiHalfHeight;
118
119  m_uiNumberOfPlanes       = uiNumberOfFullPlanes + uiNumberOfQuaterPlanes; ;
120  m_uiNumberOfFullPlanes   = uiNumberOfFullPlanes;
121  m_uiNumberOfQuaterPlanes = uiNumberOfQuaterPlanes;
122
123  this->m_apcPlanes    = new TRenImagePlane<T>*[m_uiNumberOfPlanes];
124
125  for (UInt uiCurPlane = 0; uiCurPlane < uiNumberOfFullPlanes; uiCurPlane++)
126  {
127    this->m_apcPlanes[uiCurPlane] = new TRenImagePlane<T>(uiWidth, uiHeight, REN_LUMA_MARGIN);
128  };
129
130  for (UInt uiCurPlane = 0; uiCurPlane < uiNumberOfQuaterPlanes; uiCurPlane++)
131  {
132    this->m_apcPlanes[uiCurPlane+uiNumberOfFullPlanes] = new TRenImagePlane<T>(uiHalfWidth, uiHalfHeight, REN_LUMA_MARGIN >> 1);
133  };
134}
135
136
137template<class T>
138Void TRenImage<T>::assign(Int iVal)
139{
140  for (UInt uiCurPlane = 0; uiCurPlane < m_uiNumberOfPlanes; uiCurPlane++)
141  {
142    m_apcPlanes[uiCurPlane]->assign( iVal);
143  }
144}
145
146
147template<class T>
148Void TRenImage<T>::devide( Double dDevisor )
149{
150  for (UInt uiCurPlane = 0; uiCurPlane < m_uiNumberOfPlanes; uiCurPlane++)
151  {
152    m_apcPlanes[uiCurPlane]->devide(dDevisor);
153  }
154}
155
156
157template<class T> template<class S>
158Void TRenImage<T>::assign( TRenImage<S>* pcSrcImage )
159{
160  if (pcSrcImage->getNumberOfPlanes() != m_uiNumberOfPlanes )
161  {
162    assert(0);
163  }
164
165  for (UInt uiCurPlane = 0; uiCurPlane < m_uiNumberOfPlanes; uiCurPlane++)
166  {
167    m_apcPlanes[uiCurPlane]->assign(pcSrcImage->getPlane(uiCurPlane)->getPlaneDataOrg(),pcSrcImage->getPlane(uiCurPlane)->getStride());
168  }
169}
170
171
172template<typename T>
173Void TRenImage<T>::setData( TRenImage* pcInputImage, Bool bClean )
174{
175  for (UInt uiPlane = 0; uiPlane < m_uiNumberOfPlanes; uiPlane++)
176  {
177    m_apcPlanes[uiPlane]->setData( pcInputImage->getPlane( uiPlane ), bClean );
178  }
179}
180
181template<typename T>
182Void TRenImage<T>::extendMargin()
183{
184  for (UInt uiPlane = 0; uiPlane < m_uiNumberOfPlanes; uiPlane++)
185  {
186    m_apcPlanes[uiPlane]->extendMargin();
187  }
188}
189
190template<class T>
191Void TRenImage<T>::xDeletePlanes()
192{
193  for (UInt uiCurPlane = 0; uiCurPlane < m_uiNumberOfPlanes; uiCurPlane++)
194  {
195    if ( m_apcPlanes[uiCurPlane])
196    {
197      delete m_apcPlanes[uiCurPlane];
198    }
199    m_apcPlanes[uiCurPlane] = 0;
200  }
201}
202
203
204template<class T>
205Void TRenImage<T>::init()
206{
207  // YUV-init
208  m_apcPlanes[0]->assign((Pel) 0 );
209
210  for (UInt uiCurPlane = 1; uiCurPlane < m_uiNumberOfPlanes; uiCurPlane++)
211  {
212    m_apcPlanes[uiCurPlane]->assign( (Pel) ((g_uiIBDI_MAX+1) >> 1) );
213  }
214}
215
216
217template<class T>
218TRenImage<T>::~TRenImage() {
219  xDeletePlanes();
220  delete[] m_apcPlanes;
221}
222
223
224
225template<class T>
226UInt TRenImage<T>::getNumberOfPlanes() const
227{
228  return m_uiNumberOfPlanes;
229}
230
231template<class T>
232UInt TRenImage<T>::getNumberOfQuaterPlanes() const
233{
234  return m_uiNumberOfQuaterPlanes;
235}
236
237template<class T>
238UInt TRenImage<T>::getNumberOfFullPlanes() const
239{
240  return m_uiNumberOfFullPlanes;
241}
242
243template class TRenImage<Pel>;
244template class TRenImage<Int>;
245template class TRenImage<Double>;
246template class TRenImage<Bool>;
247
248
249template Void TRenImage<Pel>::assign<Pel>    (TRenImage<Pel>*   );
250
Note: See TracBrowser for help on using the repository browser.