mirror of
https://github.com/SatDump/SatDump
synced 2026-08-13 17:47:30 -04:00
59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
/*
|
|
* Copyright 2011-2019, European Organisation for the Exploitation of Meteorological Satellites (EUMETSAT)
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "CACDecoder.h"
|
|
|
|
void COMP::CACDecoder::UpdateInterval()
|
|
{
|
|
COMP_TRYTHIS_SPEED
|
|
unsigned int nbBit = 0U;
|
|
do
|
|
{
|
|
m_Range += m_Range;
|
|
nbBit++;
|
|
} while (m_Range <= c_FirstQtr);
|
|
m_Value <<= nbBit;
|
|
m_Value += InputBits(nbBit);
|
|
COMP_CATCHTHIS_SPEED
|
|
}
|
|
|
|
unsigned int COMP::CACDecoder::DecodeSymbol(
|
|
CACModel &i_Mod // the multi-symbols probability model
|
|
)
|
|
{
|
|
COMP_TRYTHIS_SPEED
|
|
unsigned int index = 1U;
|
|
const unsigned __int32 r = m_Range / i_Mod.GetCumFreq(0);
|
|
unsigned __int32 rLps = i_Mod.GetCumFreq(index) * r;
|
|
while (rLps > m_Value)
|
|
rLps = i_Mod.GetCumFreq(++index) * r;
|
|
const unsigned int symbol = i_Mod.GetSymbol(index);
|
|
m_Value -= rLps;
|
|
if (index == 1U)
|
|
{
|
|
m_Range -= rLps;
|
|
i_Mod.UpdateMps();
|
|
}
|
|
else
|
|
{
|
|
m_Range = i_Mod.GetFreq(index) * r;
|
|
i_Mod.UpdateLps(index);
|
|
}
|
|
if (m_Range <= c_FirstQtr)
|
|
UpdateInterval();
|
|
return symbol;
|
|
COMP_CATCHTHIS_SPEED
|
|
}
|