⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perceptual_weights.c

📁 spiht的压缩解压缩c编写的
💻 C
字号:
#include "spiht.h"
#include "spihtdecode.h"

int QccWAVPerceptualWeightsInitialize(QccWAVPerceptualWeights
                                      *perceptual_weights)
{
  if (perceptual_weights == NULL)
    return(0);

  QccStringMakeNull(perceptual_weights->filename);
  QccStringCopy(perceptual_weights->magic_num, QCCWAVPERCEPTUALWEIGHTS_MAGICNUM);
  QccGetQccPackVersion(&perceptual_weights->major_version,
                       &perceptual_weights->minor_version,
                       NULL);

  perceptual_weights->num_subbands = 0;
  perceptual_weights->perceptual_weights = NULL;
  
  return(0);
}

int QccWAVPerceptualWeightsAlloc(QccWAVPerceptualWeights *perceptual_weights)
{
  int return_value;

  if (perceptual_weights == NULL)
    return(0);

  if ((perceptual_weights->perceptual_weights == NULL) &&
      (perceptual_weights->num_subbands > 0))
    if ((perceptual_weights->perceptual_weights =
         QccVectorAlloc(perceptual_weights->num_subbands)) == NULL)
      {
        QccErrorAddMessage("(QccWAVPerceptualWeightsAlloc): Error calling QccVectorAlloc()");
        goto QccError;
      }

  return_value = 0;
  goto QccReturn;
 QccError:
  QccWAVPerceptualWeightsFree(perceptual_weights);
  return_value = 1;
 QccReturn:
  return(return_value);
}

void QccWAVPerceptualWeightsFree(QccWAVPerceptualWeights *perceptual_weights)
{
  if (perceptual_weights == NULL)
    return;

  QccVectorFree(perceptual_weights->perceptual_weights);
  perceptual_weights->perceptual_weights = NULL;
  perceptual_weights->num_subbands = 0;

}

static int QccWAVPerceptualWeightsReadHeader(FILE *infile, 
                                             QccWAVPerceptualWeights 
                                             *perceptual_weights)
{
  
  if ((infile == NULL) || (perceptual_weights == NULL))
    return(0);

  if (QccFileReadMagicNumber(infile,
                             perceptual_weights->magic_num,
                             &perceptual_weights->major_version,
                             &perceptual_weights->minor_version))
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsReadHeader): Error reading magic number in perceptual_weights %s",
                         perceptual_weights->filename);
      return(1);
    }

  if (strcmp(perceptual_weights->magic_num,
             QCCWAVPERCEPTUALWEIGHTS_MAGICNUM))
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsReadHeader): %s is not of perceptual_weights (%s) type",
                         perceptual_weights->filename,
                         QCCWAVPERCEPTUALWEIGHTS_MAGICNUM);
      return(1);
    }
  
  fscanf(infile, "%d", &(perceptual_weights->num_subbands));
  if (ferror(infile) || feof(infile))
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsReadHeader): Error reading num_subbands in perceptual_weights %s",
                         perceptual_weights->filename);
      return(1);
    }
  
  if (QccFileSkipWhiteSpace(infile, 0))
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsReadHeader): Error reading num_subbands in perceptual_weights %s",
                         perceptual_weights->filename);
      return(1);
    }

  return(0);
}

static int QccWAVPerceptualWeightsReadData(FILE *infile, 
                                           QccWAVPerceptualWeights
                                           *perceptual_weights)
{
  int component;

  if ((infile == NULL) || (perceptual_weights == NULL))
    return(0);

  if (perceptual_weights->perceptual_weights != NULL)
    for (component = 0; component < perceptual_weights->num_subbands; 
         component++)
      {
        fscanf(infile, "%lf",
               &(perceptual_weights->perceptual_weights[component]));
        if (ferror(infile) || feof(infile))
          {
            QccErrorAddMessage("(QccWAVPerceptualWeightsReadData): Error reading data from %s",
                               perceptual_weights->filename);
            return(1);
          }
      }

  return(0);
}

int QccWAVPerceptualWeightsRead(QccWAVPerceptualWeights *perceptual_weights)
{
  FILE *infile = NULL;

  if (perceptual_weights == NULL)
    return(0);

  if ((infile = 
       QccFilePathSearchOpenRead(perceptual_weights->filename,
                                 QCCWAVWAVELET_PATH_ENV,
                                 QCCMAKESTRING(QCCPACK_WAVELET_PATH_DEFAULT)))
      == NULL)
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsRead): Error calling QccFilePathSearchOpenRead()");
      return(1);
    }

  if (QccWAVPerceptualWeightsReadHeader(infile, perceptual_weights))
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsRead): Error calling QccWAVPerceptualWeightsReadHeader()");
      return(1);
    }

  if (QccWAVPerceptualWeightsAlloc(perceptual_weights))
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsRead): Error calling QccWAVPerceptualWeightsAlloc()");
      return(1);
    }

  if (QccWAVPerceptualWeightsReadData(infile, perceptual_weights))
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsRead): Error calling QccWAVPerceptualWeightsReadData()");
      return(1);
    }

  QccFileClose(infile);
  return(0);
}

int QccWAVPerceptualWeightsRemove(QccWAVSubbandPyramid 
                                  *subband_pyramid,
                                  const QccWAVPerceptualWeights 
                                  *perceptual_weights)
{
  int subband;
  int num_subbands;
  int subband_num_rows, subband_num_cols;
  int subband_row_offset, subband_col_offset;
  int row, col;
  
  if ((subband_pyramid == NULL) ||
      (perceptual_weights == NULL))
    return(0);
  
  if (subband_pyramid->matrix == NULL)
    return(0);
  if (perceptual_weights->perceptual_weights == NULL)
    return(0);
  
  num_subbands = 
    QccWAVSubbandPyramidNumLevelsToNumSubbands(subband_pyramid->num_levels);
  if (num_subbands != perceptual_weights->num_subbands)
    {
      QccErrorAddMessage("(QccWAVPerceptualWeightsRemove): subband_pyramid and pereptual_weights have different numbers of subbands");
      return(1);
    }
  
  for (subband = 0; subband < num_subbands; subband++)
    {
      if (QccWAVSubbandPyramidSubbandSize(subband_pyramid,
                                          subband,
                                          &subband_num_rows,
                                          &subband_num_cols))
        {
          QccErrorAddMessage("(QccWAVPerceptualWeightsRemove): Error calling QccWAVSubbandPyramidSubbandSize()");
          return(1);
        }
      
      if (QccWAVSubbandPyramidSubbandOffsets(subband_pyramid,
                                             subband,
                                             &subband_row_offset,
                                             &subband_col_offset))
        {
          QccErrorAddMessage("(QccWAVPerceptualWeightsRemove): Error calling QccWAVSubbandPyramidSubbandOffsets()");
          return(1);
        }
      
      for (row = 0; row < subband_num_rows; row++)
        for (col = 0; col < subband_num_cols; col++)
          subband_pyramid->matrix[subband_row_offset + row]
            [subband_col_offset + col] /= 
            perceptual_weights->perceptual_weights[subband];
    }
  
  return(0);
}

⌨️ 快捷键说明

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