source: 3DVCSoftware/branches/HTM-16.2-dev/source/Lib/TLibEncoder/TEncPreanalyzer.cpp @ 1412

Last change on this file since 1412 was 1412, checked in by tech, 7 years ago
  • Update HM-16.18
  • Cleanups
  • Encoder Extension

-- Representation formats
-- Parameter set sharing
-- GOP configuration

File size: 5.4 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-2017, 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(COMPONENT_Y);
68  const Int iHeight = pcPicYuv->getHeight(COMPONENT_Y);
69  const Int iStride = pcPicYuv->getStride(COMPONENT_Y);
70
71  for ( UInt d = 0; d < pcEPic->getMaxAQDepth(); d++ )
72  {
73    const Pel* pLineY = pcPicYuv->getAddr(COMPONENT_Y);
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 by = 0;
90        for ( ; by < uiCurrAQPartHeight>>1; by++ )
91        {
92          UInt bx = 0;
93          for ( ; bx < uiCurrAQPartWidth>>1; bx++ )
94          {
95            uiSum  [0] += pBlkY[bx];
96            uiSumSq[0] += pBlkY[bx] * pBlkY[bx];
97          }
98          for ( ; bx < uiCurrAQPartWidth; bx++ )
99          {
100            uiSum  [1] += pBlkY[bx];
101            uiSumSq[1] += pBlkY[bx] * pBlkY[bx];
102          }
103          pBlkY += iStride;
104        }
105        for ( ; by < uiCurrAQPartHeight; by++ )
106        {
107          UInt bx = 0;
108          for ( ; bx < uiCurrAQPartWidth>>1; bx++ )
109          {
110            uiSum  [2] += pBlkY[bx];
111            uiSumSq[2] += pBlkY[bx] * pBlkY[bx];
112          }
113          for ( ; bx < uiCurrAQPartWidth; bx++ )
114          {
115            uiSum  [3] += pBlkY[bx];
116            uiSumSq[3] += pBlkY[bx] * pBlkY[bx];
117          }
118          pBlkY += iStride;
119        }
120
121        assert ((uiCurrAQPartWidth&1)==0);
122        assert ((uiCurrAQPartHeight&1)==0);
123        const UInt pixelWidthOfQuadrants  = uiCurrAQPartWidth >>1;
124        const UInt pixelHeightOfQuadrants = uiCurrAQPartHeight>>1;
125        const UInt numPixInAQPart         = pixelWidthOfQuadrants * pixelHeightOfQuadrants;
126
127        Double dMinVar = DBL_MAX;
128        if (numPixInAQPart!=0)
129        {
130        for ( Int i=0; i<4; i++)
131        {
132            const Double dAverage = Double(uiSum[i]) / numPixInAQPart;
133            const Double dVariance = Double(uiSumSq[i]) / numPixInAQPart - dAverage * dAverage;
134          dMinVar = min(dMinVar, dVariance);
135        }
136        }
137        else
138        {
139          dMinVar = 0.0;
140        }
141        const Double dActivity = 1.0 + dMinVar;
142        pcAQU->setActivity( dActivity );
143        dSumAct += dActivity;
144      }
145      pLineY += iStride * uiCurrAQPartHeight;
146    }
147
148    const Double dAvgAct = dSumAct / (pcAQLayer->getNumAQPartInWidth() * pcAQLayer->getNumAQPartInHeight());
149    pcAQLayer->setAvgActivity( dAvgAct );
150  }
151}
152//! \}
153
Note: See TracBrowser for help on using the repository browser.