Commit ef525df6 authored by Nathan E. Egge's avatar Nathan E. Egge Committed by Tim Terriberry

daala_tx: New flattened 2-point Type-IV DST.

This 2-point Type-IV DST uses the same computation graph as the
 asymmetric 2-point Type-IV DST.
Because this transform is embedded, it may be possible to remove the
 initial averaging step by splitting the 2-point Type-IV DST into
 separate forward and inverse transforms.
This change also reduces two multiplication constants (forward and
 inverse transform) so they are less than 1.

subset-1:

new_dst2a@2017-12-04T01:59:12.884Z -> new_dst2@2017-12-04T01:59:57.412Z

   PSNR | PSNR Cb | PSNR Cr | PSNR HVS |    SSIM | MS SSIM | CIEDE 2000
-0.0126 |  0.0387 |  0.0441 |   0.0554 | -0.0301 |  0.0034 |    -0.0342

Change-Id: I98568e0c5b97e3a6af27653ddab845ce97d2a53d
parent 5b69b199
......@@ -115,15 +115,16 @@
#define OD_FDST_2_FLAT(p0, p1) \
do { \
int t_; \
int u_; \
t_ = (p0 + p1 + 1) >> 1; \
/* 8867/16384 ~= Cos[3*Pi/8]*Sqrt[2] = 0.541196100146197 */ \
p0 = (p0*8867 + 8192) >> 14; \
/* 21407/16384 ~= Sin[3*Pi/8]*Sqrt[2] = 1.3065629648763766 */ \
p1 = (p1*21407 + 8192) >> 14; \
/* 15137/8192 ~= 2*Cos[Pi/8] = 1.8477590650225735 */ \
t_ = (t_*15137 + 4096) >> 13; \
p0 = t_ - p0; \
p1 = t_ - p1; \
/* 21407/16384 ~= Sin[3*Pi/8] + Cos[3*Pi/8] ~= 1.3065629648763766 */ \
u_ = (p0*21407 + 8192) >> 14; \
/* 8867/16384 ~= Sin[3*Pi/8] - Cos[3*Pi/8] ~= 0.541196100146197 */ \
p0 = (p1*8867 + 8192) >> 14; \
/* 3135/4096 ~= 2*Cos[3*Pi/8] ~= 0.7653668647301796 */ \
t_ = (t_*3135 + 2048) >> 12; \
p0 += t_; \
p1 = u_ - t_; \
} \
while (0)
......
......@@ -46,15 +46,16 @@ static INLINE void OD_KERNEL_FUNC(od_idct2)(OD_REG *p0, OD_REG *p1) {
static INLINE void OD_KERNEL_FUNC(od_idst2)(OD_REG *p0, OD_REG *p1) {
OD_REG t_;
OD_REG u_;
t_ = OD_AVG(*p0, *p1);
/* 8867/16384 ~= Cos[3*Pi/8]*Sqrt[2] = 0.541196100146197 */
*p0 = OD_MUL(*p0, 8867, 14);
/* 21407/16384 ~= Sin[3*Pi/8]*Sqrt[2] = 1.3065629648763766 */
*p1 = OD_MUL(*p1, 21407, 14);
/* 15137/8192 ~= 2*Cos[Pi/8] = 1.8477590650225735 */
t_ = OD_MUL(t_, 15137, 13);
*p0 = OD_SUB(t_, *p0);
*p1 = OD_SUB(t_, *p1);
/* 21407/16384 ~= Sin[3*Pi/8] + Cos[3*Pi/8] ~= 1.3065629648763766 */
u_ = OD_MUL(*p0, 21407, 14);
/* 8867/16384 ~= Sin[3*Pi/8] - Cos[3*Pi/8] ~= 0.541196100146197 */
*p0 = OD_MUL(*p1, 8867, 14);
/* 3135/4096 ~= 2*Cos[3*Pi/8] ~= 0.7653668647301796 */
t_ = OD_MUL(t_, 3135, 12);
*p0 = OD_ADD(*p0, t_);
*p1 = OD_SUB(u_, t_);
}
static INLINE void OD_KERNEL_FUNC(od_idct2_asym)(OD_REG *p0, OD_REG *p1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment