rar20multimedia.cpp

来自「由7-zip提供的压缩、解压缩程序」· C++ 代码 · 共 129 行

CPP
129
字号
// Rar20Multimedia.cpp// According to unRAR license,// this code may not be used to develop a // RAR (WinRAR) compatible archiver#include "StdAfx.h"#include "Rar20Multimedia.h"namespace NCompress {namespace NRar20 {namespace NMultimedia {void CAudioVariables::Init(){  memset(this, 0, sizeof(CAudioVariables));}void CPredictor::Init(){  for(int i = 0; i < kNumChanelsMax; i++)    m_AudioVariablesArray[i].Init();  m_ChannelDelta = 0;  CurrentChannel = 0;}Byte CPredictor::Predict(){  CAudioVariables *v = &m_AudioVariablesArray[CurrentChannel];  v->ByteCount++;  v->D4 = v->D3;  v->D3 = v->D2;  v->D2 = v->LastDelta-v->D1;  v->D1 = v->LastDelta;  int pCh = 8 * v->LastChar +             v->K1 * v->D1 +             v->K2 * v->D2 +             v->K3 * v->D3 +             v->K4 * v->D4 +             v->K5*m_ChannelDelta;  pCh = (pCh >> 3) & 0xFF;  return Byte(pCh);}void CPredictor::Update(Byte realValue, int predictedValue){  struct CAudioVariables *v = &m_AudioVariablesArray[CurrentChannel];  int delta = predictedValue - realValue;  int i = ((signed char)delta) << 3;  v->Dif[0] += abs(i);  v->Dif[1] += abs(i - v->D1);  v->Dif[2] += abs(i + v->D1);  v->Dif[3] += abs(i - v->D2);  v->Dif[4] += abs(i + v->D2);  v->Dif[5] += abs(i - v->D3);  v->Dif[6] += abs(i + v->D3);  v->Dif[7] += abs(i - v->D4);  v->Dif[8] += abs(i + v->D4);  v->Dif[9] += abs(i - m_ChannelDelta);  v->Dif[10] += abs(i + m_ChannelDelta);  m_ChannelDelta = v->LastDelta = (signed char)(realValue - v->LastChar);  v->LastChar = realValue;  UInt32 numMinDif, minDif;  if ((v->ByteCount & 0x1F)==0)  {    minDif = v->Dif[0];    numMinDif = 0;    v->Dif[0] = 0;    for (i = 1; i < sizeof(v->Dif) / sizeof(v->Dif[0]); i++)    {      if (v->Dif[i] < minDif)      {        minDif = v->Dif[i];        numMinDif = i;      }      v->Dif[i] = 0;    }    switch(numMinDif)    {      case 1:        if (v->K1 >= -16)          v->K1--;        break;      case 2:        if (v->K1 < 16)          v->K1++;        break;      case 3:        if (v->K2 >= -16)          v->K2--;        break;      case 4:        if (v->K2 < 16)          v->K2++;        break;      case 5:        if (v->K3 >= -16)          v->K3--;        break;      case 6:        if (v->K3 < 16)          v->K3++;        break;      case 7:        if (v->K4 >= -16)          v->K4--;        break;      case 8:        if (v->K4 < 16)          v->K4++;        break;      case 9:        if (v->K5 >= -16)          v->K5--;        break;      case 10:        if (v->K5 < 16)          v->K5++;        break;    }  }}}}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?