Ticket #59: CholFix_Bms_Tag1.patch
File CholFix_Bms_Tag1.patch, 4.8 KB (added by XiangLi, 6 years ago) |
---|
-
source/Lib/CommonLib/TypeDef.h
203 203 // Tool Switches 204 204 // ==================================================================================================================== 205 205 206 206 #define WHU_CHOL_FIX 1 207 207 // This can be enabled by the makefile 208 208 #ifndef RExt__HIGH_BIT_DEPTH_SUPPORT 209 209 #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
2128 2128 int count=0; 2129 2129 while(quantCoeffSum!=targetCoeffSumInt && count < 10) 2130 2130 { 2131 #if WHU_CHOL_FIX 2132 count++; 2133 #endif 2131 2134 if (quantCoeffSum>targetCoeffSumInt) 2132 2135 { 2133 2136 diff=quantCoeffSum-targetCoeffSumInt; … … 3382 3385 #define REG_SQR 0.0000001 3383 3386 3384 3387 //Find filter coeff related 3388 #if WHU_CHOL_FIX 3389 Int 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 3385 3472 Int EncAdaptiveLoopFilter::gnsCholeskyDec(double **inpMatr, double outMatr[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH], int noEq) 3386 3473 { 3387 3474 int … … 3466 3553 3467 3554 Int EncAdaptiveLoopFilter::gnsSolveByChol( Double **LHS, Double *rhs, Double *x, Int noEq) 3468 3555 { 3556 #if WHU_CHOL_FIX 3557 int singular; 3558 #else 3469 3559 double aux[m_MAX_SQR_FILT_LENGTH]; /* Auxiliary vector */ 3470 3560 double U[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH]; /* Upper triangular Cholesky factor of LHS */ 3471 3561 int i, singular; /* Looping variable */ 3562 #endif 3472 3563 3473 3564 /* The equation to be solved is LHSx = rhs */ 3474 3565 3566 #if WHU_CHOL_FIX 3567 singular = gnsLDLTDec(LHS, x, rhs, noEq); 3568 #else 3475 3569 /* Compute upper triangular U such that U'*U = LHS */ 3476 3570 if(gnsCholeskyDec(LHS, U, noEq)) /* If Cholesky decomposition has been successful */ 3477 3571 { … … 3505 3599 /* Solve U*x = aux for x */ 3506 3600 gnsBacksubstitution(U, aux, noEq, x); 3507 3601 } 3602 #endif 3508 3603 return(singular); 3509 3604 } 3510 3605 -
source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
218 218 Int gnsSolveByChol ( Double **LHS, double *rhs, double *x, int noEq); 219 219 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]); 220 220 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 221 224 Int gnsCholeskyDec ( Double **inpMatr, double outMatr[m_MAX_SQR_FILT_LENGTH][m_MAX_SQR_FILT_LENGTH], Int noEq); 222 225 223 226