Ticket #59: CholFix_Bms_Tag1.patch

File CholFix_Bms_Tag1.patch, 4.8 KB (added by XiangLi, 6 years ago)

Proposed fix

  • source/Lib/CommonLib/TypeDef.h

     
    203203// Tool Switches
    204204// ====================================================================================================================
    205205
    206 
     206#define WHU_CHOL_FIX                                                         1
    207207// This can be enabled by the makefile
    208208#ifndef RExt__HIGH_BIT_DEPTH_SUPPORT
    209209#define RExt__HIGH_BIT_DEPTH_SUPPORT                      0 ///< 0 (default) use data type definitions for 8-10 bit video, 1 = use larger data types to allow for up to 16-bit video (originally developed as part of N0188)
  • source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp

     
    21282128  int count=0;
    21292129  while(quantCoeffSum!=targetCoeffSumInt && count < 10)
    21302130  {
     2131#if WHU_CHOL_FIX
     2132    count++;
     2133#endif
    21312134    if (quantCoeffSum>targetCoeffSumInt)
    21322135    {
    21332136      diff=quantCoeffSum-targetCoeffSumInt;
     
    33823385#define REG_SQR          0.0000001
    33833386
    33843387//Find filter coeff related
     3388#if WHU_CHOL_FIX
     3389Int EncAdaptiveLoopFilter::gnsLDLTDec(Double **inpMatr, Double *x, Double *rhs, Int noEq)
     3390{
     3391
     3392  Int size = noEq;
     3393  Double LMatr[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH];
     3394  Double DMatr[m_MAX_SQR_FILT_LENGTH];
     3395
     3396  Double aux[m_MAX_SQR_FILT_LENGTH];
     3397
     3398  for (Int j = 0; j < size; j++)
     3399  {
     3400    Double sumM2 = 0.0;
     3401    for (Int k = 0; k < j; k++)
     3402    {
     3403      sumM2 += DMatr[k] * LMatr[j][k] * LMatr[j][k];
     3404    }
     3405    DMatr[j] = inpMatr[j][j] - sumM2;
     3406
     3407    for (Int i = j + 1; i < size; i++)
     3408    {
     3409      Double sumM1 = 0.0;
     3410      for (Int k = 0; k < j; k++)
     3411      {
     3412        sumM1 += LMatr[i][k] * DMatr[k] * LMatr[j][k];
     3413      }
     3414
     3415      if (fabs(DMatr[j]) < REG_SQR)
     3416      {
     3417        LMatr[i][j] = 0;
     3418        //return (0);
     3419      }
     3420      else
     3421      {
     3422        LMatr[i][j] = (inpMatr[i][j] - sumM1) / DMatr[j];
     3423      }
     3424    }
     3425  }
     3426
     3427  /* Solve L*aux = rhs for aux */
     3428  aux[0] = rhs[0];
     3429  for (Int i =1; i < size; i++)
     3430  {
     3431    Double tmp = 0.0;
     3432    for (Int k = 0; k < i; k++)
     3433    {
     3434      tmp += LMatr[i][k] * aux[k];
     3435    }
     3436    aux[i] = rhs[i] - tmp;
     3437  }
     3438
     3439  /* Solve DLT*x = aux for x */
     3440  if (fabs(DMatr[size - 1] ) < REG_SQR)
     3441  {
     3442    x[size - 1] = 0;
     3443    //return (0);
     3444  }
     3445  else
     3446  {
     3447    x[size - 1] = aux[size - 1] / DMatr[size - 1];
     3448  }
     3449
     3450  for (Int i = size -2; i >=0; i--)
     3451  {
     3452    Double tmp = 0.0;
     3453    if (fabs(DMatr[i]) < REG_SQR)
     3454    {
     3455      x[i] = 0;
     3456      //return (0);
     3457    }
     3458    else
     3459    {
     3460      for (Int k = i + 1; k < size; k++)
     3461      {
     3462        tmp += LMatr[k][i] * x[k];
     3463      }
     3464      x[i] = aux[i] / DMatr[i] - tmp;
     3465    }
     3466  }
     3467
     3468  return(1); /* Signal that  factorization is successfully performed */
     3469}
     3470#endif
     3471
    33853472Int EncAdaptiveLoopFilter::gnsCholeskyDec(double **inpMatr, double outMatr[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH], int noEq)
    33863473{
    33873474  int
     
    34663553
    34673554Int EncAdaptiveLoopFilter::gnsSolveByChol( Double **LHS, Double *rhs, Double *x, Int noEq)
    34683555{
     3556#if WHU_CHOL_FIX
     3557  int  singular;
     3558#else
    34693559  double aux[m_MAX_SQR_FILT_LENGTH];     /* Auxiliary vector */
    34703560  double U[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH];    /* Upper triangular Cholesky factor of LHS */
    34713561  int  i, singular;          /* Looping variable */
     3562#endif
    34723563
    34733564  /* The equation to be solved is LHSx = rhs */
    34743565
     3566#if WHU_CHOL_FIX
     3567  singular = gnsLDLTDec(LHS, x, rhs, noEq);
     3568#else
    34753569  /* Compute upper triangular U such that U'*U = LHS */
    34763570  if(gnsCholeskyDec(LHS, U, noEq)) /* If Cholesky decomposition has been successful */
    34773571  {
     
    35053599    /* Solve U*x = aux for x */
    35063600    gnsBacksubstitution(U, aux, noEq, x);
    35073601  }
     3602#endif
    35083603  return(singular);
    35093604}
    35103605
  • source/Lib/EncoderLib/EncAdaptiveLoopFilter.h

     
    218218  Int  gnsSolveByChol              ( Double **LHS, double *rhs, double *x, int noEq);
    219219  Void gnsBacksubstitution         ( Double R[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH], Double z[m_MAX_SQR_FILT_LENGTH], Int R_size, Double A[m_MAX_SQR_FILT_LENGTH]);
    220220  Void gnsTransposeBacksubstitution( Double U[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH], Double rhs[], Double x[], Int order);
     221#if WHU_CHOL_FIX
     222  Int  gnsLDLTDec(Double **inpMatr, Double *x, double *rhs, Int noEq);
     223#endif
    221224  Int  gnsCholeskyDec              ( Double **inpMatr, double outMatr[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH], Int noEq);
    222225
    223226