source: 3DVCSoftware/trunk/source/Lib/TLibEncoder/TEncPreanalyzer.cpp @ 192

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

updated trunk (move to HM6.1)

File size: 5.0 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     TEncPreanalyzer.cpp
35    \brief    source picture analyzer class
36*/
37
38#include <cfloat>
39#include <algorithm>
40
41#include "TEncPreanalyzer.h"
42
43using namespace std;
44
45//! \ingroup TLibEncoder
46//! \{
47
48/** Constructor
49 */
50TEncPreanalyzer::TEncPreanalyzer()
51{
52}
53
54/** Destructor
55 */
56TEncPreanalyzer::~TEncPreanalyzer()
57{
58}
59
60/** Analyze source picture and compute local image characteristics used for QP adaptation
61 * \param pcEPic Picture object to be analyzed
62 * \return Void
63 */
64Void TEncPreanalyzer::xPreanalyze( TEncPic* pcEPic )
65{
66  TComPicYuv* pcPicYuv = pcEPic->getPicYuvOrg();
67  const Int iWidth = pcPicYuv->getWidth();
68  const Int iHeight = pcPicYuv->getHeight();
69  const Int iStride = pcPicYuv->getStride();
70
71  for ( UInt d = 0; d < pcEPic->getMaxAQDepth(); d++ )
72  {
73    const Pel* pLineY = pcPicYuv->getLumaAddr();
74    TEncPicQPAdaptationLayer* pcAQLayer = pcEPic->getAQLayer(d);
75    const UInt uiAQPartWidth = pcAQLayer->getAQPartWidth();
76    const UInt uiAQPartHeight = pcAQLayer->getAQPartHeight();
77    TEncQPAdaptationUnit* pcAQU = pcAQLayer->getQPAdaptationUnit();
78
79    Double dSumAct = 0.0;
80    for ( UInt y = 0; y < iHeight; y += uiAQPartHeight )
81    {
82      const UInt uiCurrAQPartHeight = min(uiAQPartHeight, iHeight-y);
83      for ( UInt x = 0; x < iWidth; x += uiAQPartWidth, pcAQU++ )
84      {
85        const UInt uiCurrAQPartWidth = min(uiAQPartWidth, iWidth-x);
86        const Pel* pBlkY = &pLineY[x];
87        UInt64 uiSum[4] = {0, 0, 0, 0};
88        UInt64 uiSumSq[4] = {0, 0, 0, 0};
89        UInt uiNumPixInAQPart = 0;
90        UInt by = 0;
91        for ( ; by < uiCurrAQPartHeight>>1; by++ )
92        {
93          UInt bx = 0;
94          for ( ; bx < uiCurrAQPartWidth>>1; bx++, uiNumPixInAQPart++ )
95          {
96            uiSum  [0] += pBlkY[bx];
97            uiSumSq[0] += pBlkY[bx] * pBlkY[bx];
98          }
99          for ( ; bx < uiCurrAQPartWidth; bx++, uiNumPixInAQPart++ )
100          {
101            uiSum  [1] += pBlkY[bx];
102            uiSumSq[1] += pBlkY[bx] * pBlkY[bx];
103          }
104          pBlkY += iStride;
105        }
106        for ( ; by < uiCurrAQPartHeight; by++ )
107        {
108          UInt bx = 0;
109          for ( ; bx < uiCurrAQPartWidth>>1; bx++, uiNumPixInAQPart++ )
110          {
111            uiSum  [2] += pBlkY[bx];
112            uiSumSq[2] += pBlkY[bx] * pBlkY[bx];
113          }
114          for ( ; bx < uiCurrAQPartWidth; bx++, uiNumPixInAQPart++ )
115          {
116            uiSum  [3] += pBlkY[bx];
117            uiSumSq[3] += pBlkY[bx] * pBlkY[bx];
118          }
119          pBlkY += iStride;
120        }
121
122        Double dMinVar = DBL_MAX;
123        for ( Int i=0; i<4; i++)
124        {
125          const Double dAverage = Double(uiSum[i]) / uiNumPixInAQPart;
126          const Double dVariance = Double(uiSumSq[i]) / uiNumPixInAQPart - dAverage * dAverage;
127          dMinVar = min(dMinVar, dVariance);
128        }
129        const Double dActivity = 1.0 + dMinVar;
130        pcAQU->setActivity( dActivity );
131        dSumAct += dActivity;
132      }
133      pLineY += iStride * uiCurrAQPartHeight;
134    }
135
136    const Double dAvgAct = dSumAct / (pcAQLayer->getNumAQPartInWidth() * pcAQLayer->getNumAQPartInHeight());
137    pcAQLayer->setAvgActivity( dAvgAct );
138  }
139}
140//! \}
141
Note: See TracBrowser for help on using the repository browser.