Further improvements on the hybrid dwt/dct expt

Modifies the scanning pattern and uses a floating point 16x16
dct implementation for now to handle scaling better.
Also experiments are in progress with 2/6 and 9/7 wavelets.

Results have improved to within ~0.25% of 32x32 dct for std-hd
and about 0.03% for derf. This difference can probably be bridged by
re-optimizing the entropy stats for these transforms. Currently
the stats used are common between 32x32 dct and dwt/dct.

Experiments are in progress with various scan pattern - wavelet
combinations.

Ideally the subbands should be tokenized separately, and an
experiment will be condcuted next on that.

Change-Id: Ia9cbfc2d63cb7a47e562b2cd9341caf962bcc110
diff --git a/vp9/common/vp9_entropy.c b/vp9/common/vp9_entropy.c
index 9d8e924..b5da685 100644
--- a/vp9/common/vp9_entropy.c
+++ b/vp9/common/vp9_entropy.c
@@ -96,42 +96,271 @@
 
 // Table can be optimized.
 DECLARE_ALIGNED(16, const int, vp9_coef_bands_16x16[256]) = {
-    0, 1, 2, 3, 5, 4, 4, 5, 5, 3, 6, 3, 5, 4, 6, 6,
-    6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-    6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  0, 1, 2, 3, 5, 4, 4, 5, 5, 3, 6, 3, 5, 4, 6, 6,
+  6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
 };
+
 DECLARE_ALIGNED(16, const int, vp9_default_zig_zag1d_16x16[256]) = {
-      0,   1,  16,  32,  17,   2,   3,  18,  33,  48,  64,  49,  34,  19,   4,   5,
-     20,  35,  50,  65,  80,  96,  81,  66,  51,  36,  21,   6,   7,  22,  37,  52,
-     67,  82,  97, 112, 128, 113,  98,  83,  68,  53,  38,  23,   8,   9,  24,  39,
-     54,  69,  84,  99, 114, 129, 144, 160, 145, 130, 115, 100,  85,  70,  55,  40,
-     25,  10,  11,  26,  41,  56,  71,  86, 101, 116, 131, 146, 161, 176, 192, 177,
-    162, 147, 132, 117, 102,  87,  72,  57,  42,  27,  12,  13,  28,  43,  58,  73,
-     88, 103, 118, 133, 148, 163, 178, 193, 208, 224, 209, 194, 179, 164, 149, 134,
-    119, 104,  89,  74,  59,  44,  29,  14,  15,  30,  45,  60,  75,  90, 105, 120,
-    135, 150, 165, 180, 195, 210, 225, 240, 241, 226, 211, 196, 181, 166, 151, 136,
-    121, 106,  91,  76,  61,  46,  31,  47,  62,  77,  92, 107, 122, 137, 152, 167,
-    182, 197, 212, 227, 242, 243, 228, 213, 198, 183, 168, 153, 138, 123, 108,  93,
-     78,  63,  79,  94, 109, 124, 139, 154, 169, 184, 199, 214, 229, 244, 245, 230,
-    215, 200, 185, 170, 155, 140, 125, 110,  95, 111, 126, 141, 156, 171, 186, 201,
-    216, 231, 246, 247, 232, 217, 202, 187, 172, 157, 142, 127, 143, 158, 173, 188,
-    203, 218, 233, 248, 249, 234, 219, 204, 189, 174, 159, 175, 190, 205, 220, 235,
-    250, 251, 236, 221, 206, 191, 207, 222, 237, 252, 253, 238, 223, 239, 254, 255,
+  0,   1,  16,  32,  17,   2,   3,  18,
+  33,  48,  64,  49,  34,  19,   4,   5,
+  20,  35,  50,  65,  80,  96,  81,  66,
+  51,  36,  21,   6,   7,  22,  37,  52,
+  67,  82,  97, 112, 128, 113,  98,  83,
+  68,  53,  38,  23,   8,   9,  24,  39,
+  54,  69,  84,  99, 114, 129, 144, 160,
+  145, 130, 115, 100,  85,  70,  55,  40,
+  25,  10,  11,  26,  41,  56,  71,  86,
+  101, 116, 131, 146, 161, 176, 192, 177,
+  162, 147, 132, 117, 102,  87,  72,  57,
+  42,  27,  12,  13,  28,  43,  58,  73,
+  88, 103, 118, 133, 148, 163, 178, 193,
+  208, 224, 209, 194, 179, 164, 149, 134,
+  119, 104,  89,  74,  59,  44,  29,  14,
+  15,  30,  45,  60,  75,  90, 105, 120,
+  135, 150, 165, 180, 195, 210, 225, 240,
+  241, 226, 211, 196, 181, 166, 151, 136,
+  121, 106,  91,  76,  61,  46,  31,  47,
+  62,  77,  92, 107, 122, 137, 152, 167,
+  182, 197, 212, 227, 242, 243, 228, 213,
+  198, 183, 168, 153, 138, 123, 108,  93,
+  78,  63,  79,  94, 109, 124, 139, 154,
+  169, 184, 199, 214, 229, 244, 245, 230,
+  215, 200, 185, 170, 155, 140, 125, 110,
+  95, 111, 126, 141, 156, 171, 186, 201,
+  216, 231, 246, 247, 232, 217, 202, 187,
+  172, 157, 142, 127, 143, 158, 173, 188,
+  203, 218, 233, 248, 249, 234, 219, 204,
+  189, 174, 159, 175, 190, 205, 220, 235,
+  250, 251, 236, 221, 206, 191, 207, 222,
+  237, 252, 253, 238, 223, 239, 254, 255,
 };
 
+#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
+#if CONFIG_DWT32X32HYBRID
+DECLARE_ALIGNED(16, const int, vp9_coef_bands_32x32[1024]) = {
+  0, 1, 2, 3, 5, 4, 4, 5, 5, 3, 6, 3, 5, 4, 6,
+  6, 6, 6,
+  6,
+  6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+};
+
+DECLARE_ALIGNED(16, const int, vp9_default_zig_zag1d_32x32[1024]) = {
+  0,    1,   32,   64,   33,    2,    3,   34,
+  65,   96, 128,   97,   66,   35,    4,
+  16,   512,  528,
+  5,
+  36,   67,   98,  129,  160,  192,  161,  130,
+  99,   68,   37,    6,    7,   38,   69,  100,
+  131,  162,  193,  224, 256,  225,  194,  163,
+  132,  101,   70,   39,    8,    9,   40,   71,
+  102,  133,  164,  195,  226,  257,  288,  320,
+  289,  258,  227,  196,  165,  134,  103,   72,
+  41,   10,   11,   42,   73,  104,  135,  166,
+  197,  228,  259,  290,  321,  352,  384,  353,
+  322,  291,  260,  229,  198,  167,  136,  105,
+  74,   43,   12,   13,   44,   75,  106,  137,
+  168,  199,  230,  261,  292,  323,  354,  385,
+  416,  448,  417,  386,  355,  324,  293,  262,
+  231,  200,  169,  138,  107,   76,   45,   14,
+  15,   46,   77,  108,  139,  170,  201,  232,
+  263,  294,  325,  356,  387,  418,  449,  480,
+  481,  450,  419,  388,  357,  326,  295,  264,
+  233,  202,  171,  140,  109,   78,   47,   79,
+  110,  141,  172,  203,  234,  265,  296,  327,
+  358,  389,  420,  451,  482,  483,  452,  421,
+  390,  359,  328,  297,  266,  235,  204,  173,
+  142,  111,  143,  174,  205,  236,  267,  298,
+  329,  360,  391,  422,  453,  484,  485,  454,
+  423,  392,  361,  330,  299,  268,  237,  206,
+  175,  207,  238,  269,  300,  331,  362,  393,
+  424,  455,  486,  487,  456,  425,  394,  363,
+  332,  301,  270,  239,  271,  302,  333,  364,
+  395,  426,  457,  488,  489,  458,  427,  396,
+  365,  334,  303,  335,  366,  397,  428,  459,
+  490,  491,  460,  429,  398,  367,  399,  430,
+  461,  492,  493,  462,  431,  463,  494,  495,
+
+  17,  513,  529,   48,  544,
+  560, 80,  576,  592,   49,  545,  561,   18,
+  514,  530,   19,  515,  531,   50,  546,  562,
+  81,  577,  593,  112,  608,  624,  144,  640,
+  656,  113,  609,  625,   82,  578,  594,   51,
+  547,  563,   20,  516,  532,   21,  517,  533,
+  52,  548,  564,   83,  579,  595,  114,  610,
+  626,  145,  641,  657,  176,  672,  688,  208,
+  704,  720,  177,  673,  689,  146,  642,  658,
+  115,  611,  627,   84,  580,  596,   53,  549,
+  565,   22,  518,  534,   23,  519,  535,   54,
+  550,  566,   85,  581,  597,  116,  612,  628,
+  147,  643,  659,  178,  674,  690,  209,  705,
+  721,  240,  736,  752,  272,  768,  784,  241,
+  737,  753,  210,  706,  722,  179,  675,  691,
+  148,  644,  660,  117,  613,  629,   86,  582,
+  598,   55,  551,  567,   24,  520,  536,   25,
+  521,  537,   56,  552,  568,   87,  583,  599,
+  118,  614,  630,  149,  645,  661,  180,  676,
+  692,  211,  707,  723,  242,  738,  754,  273,
+  769,  785,  304,  800,  816,  336,  832,  848,
+  305,  801,  817,  274,  770,  786,  243,  739,
+  755,  212,  708,  724,  181,  677,  693,  150,
+  646,  662,  119,  615,  631,   88,  584,  600,
+  57,  553,  569,   26,  522,  538,   27,  523,
+  539,   58,  554,  570,   89,  585,  601,  120,
+  616,  632,  151,  647,  663,  182,  678,  694,
+  213,  709,  725,  244,  740,  756,  275,  771,
+  787,  306,  802,  818,  337,  833,  849,  368,
+  864,  880,  400,  896,  912,  369,  865,  881,
+  338,  834,  850,  307,  803,  819,  276,  772,
+  788,  245,  741,  757,  214,  710,  726,  183,
+
+  679,  695,  152,  648,  664,  121,  617,  633,
+  90,  586,  602,   59,  555,  571,   28,  524,
+  540,   29,  525,  541,   60,  556,  572,   91,
+  587,  603,  122,  618,  634,  153,  649,  665,
+  184,  680,  696,  215,  711,  727,  246,  742,
+  758,  277,  773,  789,  308,  804,  820,  339,
+  835,  851,  370,  866,  882,  401,  897,  913,
+  432,  928,  944,  464,  960,  976,  433,  929,
+  945,  402,  898,  914,  371,  867,  883,  340,
+  836,  852,  309,  805,  821,  278,  774,  790,
+  247,  743,  759,  216,  712,  728,  185,  681,
+  697,  154,  650,  666,  123,  619,  635,   92,
+  588,  604,   61,  557,  573,   30,  526,  542,
+  31,  527,  543,   62,  558,  574,   93,  589,
+  605,  124,  620,  636,  155,  651,  667,  186,
+  682,  698,  217,  713,  729,  248,  744,  760,
+  279,  775,  791,  310,  806,  822,  341,  837,
+  853,  372,  868,  884,  403,  899,  915,  434,
+  930,  946,  465,  961,  977,  496,  992, 1008,
+  497,  993, 1009,  466,  962,  978,  435,  931,
+  947,  404,  900,  916,  373,  869,  885,  342,
+  838,  854,  311,  807,  823,  280,  776,  792,
+  249,  745,  761,  218,  714,  730,  187,  683,
+  699,  156,  652,  668,  125,  621,  637,   94,
+  590,  606,   63,  559,  575,   95,  591,  607,
+  126,  622,  638,  157,  653,  669,  188,  684,
+  700,  219,  715,  731,  250,  746,  762,  281,
+  777,  793,  312,  808,  824,  343,  839,  855,
+  374,  870,  886,  405,  901,  917,  436,  932,
+  948,  467,  963,  979,  498,  994, 1010,  499,
+  995, 1011,  468,  964,  980,  437,  933,  949,
+  406,  902,  918,  375,  871,  887,  344,  840,
+
+  856,  313,  809,  825,  282,  778,  794,  251,
+  747,  763,  220,  716,  732,  189,  685,  701,
+  158,  654,  670,  127,  623,  639,  159,  655,
+  671,  190,  686,  702,  221,  717,  733,  252,
+  748,  764,  283,  779,  795,  314,  810,  826,
+  345,  841,  857,  376,  872,  888,  407,  903,
+  919,  438,  934,  950,  469,  965,  981,  500,
+  996, 1012,  501,  997, 1013,  470,  966,  982,
+  439,  935,  951,  408,  904,  920,  377,  873,
+  889,  346,  842,  858,  315,  811,  827,  284,
+  780,  796,  253,  749,  765,  222,  718,  734,
+  191,  687,  703,  223,  719,  735,  254,  750,
+  766,  285,  781,  797,  316,  812,  828,  347,
+  843,  859,  378,  874,  890,  409,  905,  921,
+  440,  936,  952,  471,  967,  983,  502,  998,
+  1014,  503,  999, 1015,  472,  968,  984,  441,
+  937,  953,  410,  906,  922,  379,  875,  891,
+  348,  844,  860,  317,  813,  829,  286,  782,
+  798,  255,  751,  767,  287,  783,  799,  318,
+  814,  830,  349,  845,  861,  380,  876,  892,
+  411,  907,  923,  442,  938,  954,  473,  969,
+  985,  504, 1000, 1016,  505, 1001, 1017,  474,
+  970,  986,  443,  939,  955,  412,  908,  924,
+  381,  877,  893,  350,  846,  862,  319,  815,
+  831,  351,  847,  863,  382,  878,  894,  413,
+  909,  925,  444,  940,  956,  475,  971,  987,
+  506, 1002, 1018,  507, 1003, 1019,  476,  972,
+  988,  445,  941,  957,  414,  910,  926,  383,
+  879,  895,  415,  911,  927,  446,  942,  958,
+  477,  973,  989,  508, 1004, 1020,  509, 1005,
+  1021,  478,  974,  990,  447,  943,  959,  479,
+  975,  991,  510, 1006, 1022,  511, 1007, 1023,
+};
+
+#else
+
 DECLARE_ALIGNED(16, const int, vp9_coef_bands_32x32[1024]) = {
   0, 1, 2, 3, 5, 4, 4, 5, 5, 3, 6, 3, 5, 4, 6, 6,
   6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
@@ -201,6 +430,7 @@
   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
 };
+
 DECLARE_ALIGNED(16, const int, vp9_default_zig_zag1d_32x32[1024]) = {
     0,    1,   32,   64,   33,    2,    3,   34,   65,   96,  128,   97,   66,   35,    4,    5,   36,   67,   98,  129,  160,  192,  161,  130,   99,   68,   37,    6,    7,   38,   69,  100,
   131,  162,  193,  224,  256,  225,  194,  163,  132,  101,   70,   39,    8,    9,   40,   71,  102,  133,  164,  195,  226,  257,  288,  320,  289,  258,  227,  196,  165,  134,  103,   72,
@@ -235,6 +465,8 @@
   951,  920,  889,  858,  827,  796,  765,  734,  703,  735,  766,  797,  828,  859,  890,  921,  952,  983, 1014, 1015,  984,  953,  922,  891,  860,  829,  798,  767,  799,  830,  861,  892,
   923,  954,  985, 1016, 1017,  986,  955,  924,  893,  862,  831,  863,  894,  925,  956,  987, 1018, 1019,  988,  957,  926,  895,  927,  958,  989, 1020, 1021,  990,  959,  991, 1022, 1023,
 };
+#endif  // CONFIG_DWT32X32HYBRID
+#endif
 
 /* Array indices are identical to previously-existing CONTEXT_NODE indices */
 
diff --git a/vp9/common/vp9_idctllm.c b/vp9/common/vp9_idctllm.c
index cc685b9..b09f3bd 100644
--- a/vp9/common/vp9_idctllm.c
+++ b/vp9/common/vp9_idctllm.c
@@ -888,8 +888,8 @@
         (x4 = blk[8 * 1]) | (x5 = blk[8 * 7]) | (x6 = blk[8 * 5]) |
         (x7 = blk[8 * 3]))) {
     blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = blk[8 * 3]
-                                           = blk[8 * 4] = blk[8 * 5] = blk[8 * 6]
-                                                                       = blk[8 * 7] = ((blk[8 * 0] + 32) >> 6);
+        = blk[8 * 4] = blk[8 * 5] = blk[8 * 6]
+        = blk[8 * 7] = ((blk[8 * 0] + 32) >> 6);
     return;
   }
 
@@ -1127,25 +1127,25 @@
 
 #define TEST_INT_16x16_IDCT 1
 #if !TEST_INT_16x16_IDCT
-static const double C1 = 0.995184726672197;
-static const double C2 = 0.98078528040323;
-static const double C3 = 0.956940335732209;
-static const double C4 = 0.923879532511287;
-static const double C5 = 0.881921264348355;
-static const double C6 = 0.831469612302545;
-static const double C7 = 0.773010453362737;
-static const double C8 = 0.707106781186548;
-static const double C9 = 0.634393284163646;
-static const double C10 = 0.555570233019602;
-static const double C11 = 0.471396736825998;
-static const double C12 = 0.38268343236509;
-static const double C13 = 0.290284677254462;
-static const double C14 = 0.195090322016128;
-static const double C15 = 0.098017140329561;
-
 
 static void butterfly_16x16_idct_1d(double input[16], double output[16]) {
 
+  static const double C1 = 0.995184726672197;
+  static const double C2 = 0.98078528040323;
+  static const double C3 = 0.956940335732209;
+  static const double C4 = 0.923879532511287;
+  static const double C5 = 0.881921264348355;
+  static const double C6 = 0.831469612302545;
+  static const double C7 = 0.773010453362737;
+  static const double C8 = 0.707106781186548;
+  static const double C9 = 0.634393284163646;
+  static const double C10 = 0.555570233019602;
+  static const double C11 = 0.471396736825998;
+  static const double C12 = 0.38268343236509;
+  static const double C13 = 0.290284677254462;
+  static const double C14 = 0.195090322016128;
+  static const double C15 = 0.098017140329561;
+
   vp9_clear_system_state(); // Make it simd safe : __asm emms;
   {
     double step[16];
@@ -1389,6 +1389,12 @@
 }
 
 #else
+
+#define INITIAL_SHIFT 2
+#define INITIAL_ROUNDING (1 << (INITIAL_SHIFT - 1))
+#define RIGHT_SHIFT 14
+#define RIGHT_ROUNDING (1 << (RIGHT_SHIFT - 1))
+
 static const int16_t C1 = 16305;
 static const int16_t C2 = 16069;
 static const int16_t C3 = 15679;
@@ -1405,212 +1411,207 @@
 static const int16_t C14 = 3196;
 static const int16_t C15 = 1606;
 
-#define INITIAL_SHIFT 2
-#define INITIAL_ROUNDING (1 << (INITIAL_SHIFT - 1))
-#define RIGHT_SHIFT 14
-#define RIGHT_ROUNDING (1 << (RIGHT_SHIFT - 1))
-
 static void butterfly_16x16_idct_1d(int16_t input[16], int16_t output[16],
                                     int last_shift_bits) {
-    int16_t step[16];
-    int intermediate[16];
-    int temp1, temp2;
+  int16_t step[16];
+  int intermediate[16];
+  int temp1, temp2;
 
-    int step1_shift = RIGHT_SHIFT + INITIAL_SHIFT;
-    int step1_rounding = 1 << (step1_shift - 1);
-    int last_rounding = 0;
+  int step1_shift = RIGHT_SHIFT + INITIAL_SHIFT;
+  int step1_rounding = 1 << (step1_shift - 1);
+  int last_rounding = 0;
 
-    if (last_shift_bits > 0)
-      last_rounding = 1 << (last_shift_bits - 1);
+  if (last_shift_bits > 0)
+    last_rounding = 1 << (last_shift_bits - 1);
 
-    // step 1 and 2
-    step[ 0] = (input[0] + input[8] + INITIAL_ROUNDING) >> INITIAL_SHIFT;
-    step[ 1] = (input[0] - input[8] + INITIAL_ROUNDING) >> INITIAL_SHIFT;
+  // step 1 and 2
+  step[ 0] = (input[0] + input[8] + INITIAL_ROUNDING) >> INITIAL_SHIFT;
+  step[ 1] = (input[0] - input[8] + INITIAL_ROUNDING) >> INITIAL_SHIFT;
 
-    temp1 = input[4] * C12;
-    temp2 = input[12] * C4;
-    temp1 = (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp1  *= C8;
-    step[ 2] = (2 * (temp1) + step1_rounding) >> step1_shift;
+  temp1 = input[4] * C12;
+  temp2 = input[12] * C4;
+  temp1 = (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1  *= C8;
+  step[ 2] = (2 * (temp1) + step1_rounding) >> step1_shift;
 
-    temp1 = input[4] * C4;
-    temp2 = input[12] * C12;
-    temp1 = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp1 *= C8;
-    step[ 3] = (2 * (temp1) + step1_rounding) >> step1_shift;
+  temp1 = input[4] * C4;
+  temp2 = input[12] * C12;
+  temp1 = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 *= C8;
+  step[ 3] = (2 * (temp1) + step1_rounding) >> step1_shift;
 
-    temp1 = input[2] * C8;
-    temp1 = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp2 = input[6] + input[10];
-    step[ 4] = (temp1 + temp2 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
-    step[ 5] = (temp1 - temp2 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
+  temp1 = input[2] * C8;
+  temp1 = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp2 = input[6] + input[10];
+  step[ 4] = (temp1 + temp2 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
+  step[ 5] = (temp1 - temp2 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
 
-    temp1 = input[14] * C8;
-    temp1 = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp2 = input[6] - input[10];
-    step[ 6] = (temp2 - temp1 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
-    step[ 7] = (temp2 + temp1 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
+  temp1 = input[14] * C8;
+  temp1 = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp2 = input[6] - input[10];
+  step[ 6] = (temp2 - temp1 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
+  step[ 7] = (temp2 + temp1 + INITIAL_ROUNDING) >> INITIAL_SHIFT;
 
-    // for odd input
-    temp1 = input[3] * C12;
-    temp2 = input[13] * C4;
-    temp1 = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp1 *= C8;
-    intermediate[ 8] = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  // for odd input
+  temp1 = input[3] * C12;
+  temp2 = input[13] * C4;
+  temp1 = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 *= C8;
+  intermediate[ 8] = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = input[3] * C4;
-    temp2 = input[13] * C12;
-    temp2 = (temp2 - temp1 + RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp2 *= C8;
-    intermediate[ 9] = (2 * (temp2) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = input[3] * C4;
+  temp2 = input[13] * C12;
+  temp2 = (temp2 - temp1 + RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp2 *= C8;
+  intermediate[ 9] = (2 * (temp2) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    intermediate[10] = (2 * (input[9] * C8) + RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    intermediate[11] = input[15] - input[1];
-    intermediate[12] = input[15] + input[1];
-    intermediate[13] = (2 * (input[7] * C8) + RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  intermediate[10] = (2 * (input[9] * C8) + RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  intermediate[11] = input[15] - input[1];
+  intermediate[12] = input[15] + input[1];
+  intermediate[13] = (2 * (input[7] * C8) + RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = input[11] * C12;
-    temp2 = input[5] * C4;
-    temp2 = (temp2 - temp1 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp2 *= C8;
-    intermediate[14] = (2 * (temp2) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = input[11] * C12;
+  temp2 = input[5] * C4;
+  temp2 = (temp2 - temp1 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp2 *= C8;
+  intermediate[14] = (2 * (temp2) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = input[11] * C4;
-    temp2 = input[5] * C12;
-    temp1 = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
-    temp1 *= C8;
-    intermediate[15] = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = input[11] * C4;
+  temp2 = input[5] * C12;
+  temp1 = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 *= C8;
+  intermediate[15] = (2 * (temp1) +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    step[ 8] = (intermediate[ 8] + intermediate[14] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
-    step[ 9] = (intermediate[ 9] + intermediate[15] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
-    step[10] = (intermediate[10] + intermediate[11] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
-    step[11] = (intermediate[10] - intermediate[11] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
-    step[12] = (intermediate[12] + intermediate[13] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
-    step[13] = (intermediate[12] - intermediate[13] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
-    step[14] = (intermediate[ 8] - intermediate[14] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
-    step[15] = (intermediate[ 9] - intermediate[15] + INITIAL_ROUNDING)
-        >> INITIAL_SHIFT;
+  step[ 8] = (intermediate[ 8] + intermediate[14] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
+  step[ 9] = (intermediate[ 9] + intermediate[15] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
+  step[10] = (intermediate[10] + intermediate[11] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
+  step[11] = (intermediate[10] - intermediate[11] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
+  step[12] = (intermediate[12] + intermediate[13] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
+  step[13] = (intermediate[12] - intermediate[13] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
+  step[14] = (intermediate[ 8] - intermediate[14] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
+  step[15] = (intermediate[ 9] - intermediate[15] + INITIAL_ROUNDING)
+      >> INITIAL_SHIFT;
 
-    // step 3
-    output[0] = step[ 0] + step[ 3];
-    output[1] = step[ 1] + step[ 2];
-    output[2] = step[ 1] - step[ 2];
-    output[3] = step[ 0] - step[ 3];
+  // step 3
+  output[0] = step[ 0] + step[ 3];
+  output[1] = step[ 1] + step[ 2];
+  output[2] = step[ 1] - step[ 2];
+  output[3] = step[ 0] - step[ 3];
 
-    temp1 = step[ 4] * C14;
-    temp2 = step[ 7] * C2;
-    output[4] =  (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = step[ 4] * C14;
+  temp2 = step[ 7] * C2;
+  output[4] =  (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = step[ 4] * C2;
-    temp2 = step[ 7] * C14;
-    output[7] =  (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = step[ 4] * C2;
+  temp2 = step[ 7] * C14;
+  output[7] =  (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = step[ 5] * C10;
-    temp2 = step[ 6] * C6;
-    output[5] =  (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = step[ 5] * C10;
+  temp2 = step[ 6] * C6;
+  output[5] =  (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = step[ 5] * C6;
-    temp2 = step[ 6] * C10;
-    output[6] =  (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = step[ 5] * C6;
+  temp2 = step[ 6] * C10;
+  output[6] =  (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    output[8] = step[ 8] + step[11];
-    output[9] = step[ 9] + step[10];
-    output[10] = step[ 9] - step[10];
-    output[11] = step[ 8] - step[11];
-    output[12] = step[12] + step[15];
-    output[13] = step[13] + step[14];
-    output[14] = step[13] - step[14];
-    output[15] = step[12] - step[15];
+  output[8] = step[ 8] + step[11];
+  output[9] = step[ 9] + step[10];
+  output[10] = step[ 9] - step[10];
+  output[11] = step[ 8] - step[11];
+  output[12] = step[12] + step[15];
+  output[13] = step[13] + step[14];
+  output[14] = step[13] - step[14];
+  output[15] = step[12] - step[15];
 
-    // output 4
-    step[ 0] = output[0] + output[7];
-    step[ 1] = output[1] + output[6];
-    step[ 2] = output[2] + output[5];
-    step[ 3] = output[3] + output[4];
-    step[ 4] = output[3] - output[4];
-    step[ 5] = output[2] - output[5];
-    step[ 6] = output[1] - output[6];
-    step[ 7] = output[0] - output[7];
+  // output 4
+  step[ 0] = output[0] + output[7];
+  step[ 1] = output[1] + output[6];
+  step[ 2] = output[2] + output[5];
+  step[ 3] = output[3] + output[4];
+  step[ 4] = output[3] - output[4];
+  step[ 5] = output[2] - output[5];
+  step[ 6] = output[1] - output[6];
+  step[ 7] = output[0] - output[7];
 
-    temp1 = output[8] * C7;
-    temp2 = output[15] * C9;
-    step[ 8] = (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[8] * C7;
+  temp2 = output[15] * C9;
+  step[ 8] = (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = output[9] * C11;
-    temp2 = output[14] * C5;
-    step[ 9] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[9] * C11;
+  temp2 = output[14] * C5;
+  step[ 9] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = output[10] * C3;
-    temp2 = output[13] * C13;
-    step[10] = (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[10] * C3;
+  temp2 = output[13] * C13;
+  step[10] = (temp1 - temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = output[11] * C15;
-    temp2 = output[12] * C1;
-    step[11] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[11] * C15;
+  temp2 = output[12] * C1;
+  step[11] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = output[11] * C1;
-    temp2 = output[12] * C15;
-    step[12] = (temp2 - temp1 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[11] * C1;
+  temp2 = output[12] * C15;
+  step[12] = (temp2 - temp1 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = output[10] * C13;
-    temp2 = output[13] * C3;
-    step[13] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[10] * C13;
+  temp2 = output[13] * C3;
+  step[13] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = output[9] * C5;
-    temp2 = output[14] * C11;
-    step[14] = (temp2 - temp1 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[9] * C5;
+  temp2 = output[14] * C11;
+  step[14] = (temp2 - temp1 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    temp1 = output[8] * C9;
-    temp2 = output[15] * C7;
-    step[15] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
+  temp1 = output[8] * C9;
+  temp2 = output[15] * C7;
+  step[15] = (temp1 + temp2 +   RIGHT_ROUNDING) >> RIGHT_SHIFT;
 
-    // step 5
-    output[0] = (step[0] + step[15] + last_rounding) >> last_shift_bits;
-    output[1] = (step[1] + step[14] + last_rounding) >> last_shift_bits;
-    output[2] = (step[2] + step[13] + last_rounding) >> last_shift_bits;
-    output[3] = (step[3] + step[12] + last_rounding) >> last_shift_bits;
-    output[4] = (step[4] + step[11] + last_rounding) >> last_shift_bits;
-    output[5] = (step[5] + step[10] + last_rounding) >> last_shift_bits;
-    output[6] = (step[6] + step[ 9] + last_rounding) >> last_shift_bits;
-    output[7] = (step[7] + step[ 8] + last_rounding) >> last_shift_bits;
+  // step 5
+  output[0] = (step[0] + step[15] + last_rounding) >> last_shift_bits;
+  output[1] = (step[1] + step[14] + last_rounding) >> last_shift_bits;
+  output[2] = (step[2] + step[13] + last_rounding) >> last_shift_bits;
+  output[3] = (step[3] + step[12] + last_rounding) >> last_shift_bits;
+  output[4] = (step[4] + step[11] + last_rounding) >> last_shift_bits;
+  output[5] = (step[5] + step[10] + last_rounding) >> last_shift_bits;
+  output[6] = (step[6] + step[ 9] + last_rounding) >> last_shift_bits;
+  output[7] = (step[7] + step[ 8] + last_rounding) >> last_shift_bits;
 
-    output[15] = (step[0] - step[15] + last_rounding) >> last_shift_bits;
-    output[14] = (step[1] - step[14] + last_rounding) >> last_shift_bits;
-    output[13] = (step[2] - step[13] + last_rounding) >> last_shift_bits;
-    output[12] = (step[3] - step[12] + last_rounding) >> last_shift_bits;
-    output[11] = (step[4] - step[11] + last_rounding) >> last_shift_bits;
-    output[10] = (step[5] - step[10] + last_rounding) >> last_shift_bits;
-    output[9] = (step[6] - step[ 9] + last_rounding) >> last_shift_bits;
-    output[8] = (step[7] - step[ 8] + last_rounding) >> last_shift_bits;
+  output[15] = (step[0] - step[15] + last_rounding) >> last_shift_bits;
+  output[14] = (step[1] - step[14] + last_rounding) >> last_shift_bits;
+  output[13] = (step[2] - step[13] + last_rounding) >> last_shift_bits;
+  output[12] = (step[3] - step[12] + last_rounding) >> last_shift_bits;
+  output[11] = (step[4] - step[11] + last_rounding) >> last_shift_bits;
+  output[10] = (step[5] - step[10] + last_rounding) >> last_shift_bits;
+  output[9] = (step[6] - step[ 9] + last_rounding) >> last_shift_bits;
+  output[8] = (step[7] - step[ 8] + last_rounding) >> last_shift_bits;
 }
 
 void vp9_short_idct16x16_c(int16_t *input, int16_t *output, int pitch) {
-    int16_t out[16 * 16];
-    int16_t *outptr = &out[0];
-    const int short_pitch = pitch >> 1;
-    int i, j;
-    int16_t temp_in[16], temp_out[16];
+  int16_t out[16 * 16];
+  int16_t *outptr = &out[0];
+  const int short_pitch = pitch >> 1;
+  int i, j;
+  int16_t temp_in[16], temp_out[16];
 
-    // First transform rows
-    for (i = 0; i < 16; ++i) {
-      butterfly_16x16_idct_1d(input, outptr, 0);
-      input += short_pitch;
-      outptr += 16;
-    }
+  // First transform rows
+  for (i = 0; i < 16; ++i) {
+    butterfly_16x16_idct_1d(input, outptr, 0);
+    input += short_pitch;
+    outptr += 16;
+  }
 
-    // Then transform columns
-    for (i = 0; i < 16; ++i) {
-      for (j = 0; j < 16; ++j)
-        temp_in[j] = out[j * 16 + i];
-      butterfly_16x16_idct_1d(temp_in, temp_out, 3);
-      for (j = 0; j < 16; ++j)
+  // Then transform columns
+  for (i = 0; i < 16; ++i) {
+    for (j = 0; j < 16; ++j)
+      temp_in[j] = out[j * 16 + i];
+    butterfly_16x16_idct_1d(temp_in, temp_out, 3);
+    for (j = 0; j < 16; ++j)
         output[j * 16 + i] = temp_out[j];
     }
 }
@@ -2120,16 +2121,20 @@
   }
   vp9_clear_system_state();  // Make it simd safe : __asm emms;
 }
+
 #else  // CONFIG_DWT32X32HYBRID
 
-#define MAX_BLOCK_LENGTH   64
-#define ENH_PRECISION_BITS 1
-#define ENH_PRECISION_RND ((1 << ENH_PRECISION_BITS) / 2)
+#define DWT_MAX_LENGTH   32
+#define DWT_TYPE         26    // 26/53/97
+#define DWT_PRECISION_BITS 2
+#define DWT_PRECISION_RND ((1 << DWT_PRECISION_BITS) / 2)
+
+#if DWT_TYPE == 53
 
 // Note: block length must be even for this implementation
 static void synthesis_53_row(int length, short *lowpass, short *highpass,
                              short *x) {
-  short r, * a, * b;
+  short r, *a, *b;
   int n;
 
   n = length >> 1;
@@ -2148,13 +2153,13 @@
     *x++ = ((r = *a++) + 1) >> 1;
     *x++ = *b++ + ((r + (*a) + 2) >> 2);
   }
-  *x++ = ((r = *a) + 1)>>1;
-  *x++ = *b + ((r+1)>>1);
+  *x++ = ((r = *a) + 1) >> 1;
+  *x++ = *b + ((r + 1) >> 1);
 }
 
 static void synthesis_53_col(int length, short *lowpass, short *highpass,
                              short *x) {
-  short r, * a, * b;
+  short r, *a, *b;
   int n;
 
   n = length >> 1;
@@ -2170,19 +2175,18 @@
   b = highpass;
   a = lowpass;
   while (--n) {
-    *x++ = r = *a++;
+    r = *a++;
+    *x++ = r;
     *x++ = ((*b++) << 1) + ((r + (*a) + 1) >> 1);
   }
-  *x++ = r = *a;
-  *x++ = ((*b) << 1) + r;
+  *x++ = *a;
+  *x++ = ((*b) << 1) + *a;
 }
 
-// NOTE: Using a 5/3 integer wavelet for now. Explore using a wavelet
-// with a better response later
-void dyadic_synthesize(int levels, int width, int height, short *c, int pitch_c,
-                       short *x, int pitch_x) {
+void dyadic_synthesize_53(int levels, int width, int height, short *c,
+                          int pitch_c, short *x, int pitch_x) {
   int th[16], tw[16], lv, i, j, nh, nw, hh = height, hw = width;
-  short buffer[2 * MAX_BLOCK_LENGTH];
+  short buffer[2 * DWT_MAX_LENGTH];
 
   th[0] = hh;
   tw[0] = hw;
@@ -2204,35 +2208,466 @@
         c[i * pitch_c + j] = buffer[i + nh];
     }
     for (i = 0; i < nh; i++) {
-      memcpy(buffer, &c[i * pitch_c], nw * sizeof(short));
+      memcpy(buffer, &c[i * pitch_c], nw * sizeof(*buffer));
       synthesis_53_row(nw, buffer, buffer + hw, &c[i * pitch_c]);
     }
   }
+  for (i = 0; i < height; i++) {
+    for (j = 0; j < width; j++) {
+      x[i * pitch_x + j] = c[i * pitch_c + j] >= 0 ?
+          ((c[i * pitch_c + j] + DWT_PRECISION_RND) >> DWT_PRECISION_BITS) :
+          -((-c[i * pitch_c + j] + DWT_PRECISION_RND) >> DWT_PRECISION_BITS);
+    }
+  }
+}
+
+#elif DWT_TYPE == 26
+
+// Note: block length must be even for this implementation
+static void synthesis_26_row(int length, short *lowpass, short *highpass,
+                             short *x) {
+  short r, s, *a, *b;
+  int i, n = length >> 1;
+
+  if (n >= 4) {
+    a = lowpass;
+    b = highpass;
+    r = *lowpass;
+    while (--n) {
+      *b++ += (r - a[1] + 4) >> 3;
+      r = *a++;
+    }
+    *b += (r - *a + 4) >> 3;
+  }
+  a = lowpass;
+  b = highpass;
+  for (i = length >> 1; i; i--) {
+    s = *b++;
+    r = *a++;
+    *x++ = (r + s + 1) >> 1;
+    *x++ = (r - s + 1) >> 1;
+  }
+}
+
+static void synthesis_26_col(int length, short *lowpass, short *highpass,
+                             short *x) {
+  short r, s, *a, *b;
+  int i, n = length >> 1;
+
+  if (n >= 4) {
+    a = lowpass;
+    b = highpass;
+    r = *lowpass;
+    while (--n) {
+      *b++ += (r - a[1] + 4) >> 3;
+      r = *a++;
+    }
+    *b += (r - *a + 4) >> 3;
+  }
+  a = lowpass;
+  b = highpass;
+  for (i = length >> 1; i; i--) {
+    s = *b++;
+    r = *a++;
+    *x++ = r + s;
+    *x++ = r - s;
+  }
+}
+
+void dyadic_synthesize_26(int levels, int width, int height, short *c,
+                          int pitch_c, short *x, int pitch_x) {
+  int th[16], tw[16], lv, i, j, nh, nw, hh = height, hw = width;
+  short buffer[2 * DWT_MAX_LENGTH];
+
+  th[0] = hh;
+  tw[0] = hw;
+  for (i = 1; i <= levels; i++) {
+    th[i] = (th[i - 1] + 1) >> 1;
+    tw[i] = (tw[i - 1] + 1) >> 1;
+  }
+  for (lv = levels - 1; lv >= 0; lv--) {
+    nh = th[lv];
+    nw = tw[lv];
+    hh = th[lv + 1];
+    hw = tw[lv + 1];
+    if ((nh < 2) || (nw < 2)) continue;
+    for (j = 0; j < nw; j++) {
+      for (i = 0; i < nh; i++)
+        buffer[i] = c[i * pitch_c + j];
+      synthesis_26_col(nh, buffer, buffer + hh, buffer + nh);
+      for (i = 0; i < nh; i++)
+        c[i * pitch_c + j] = buffer[i + nh];
+    }
+    for (i = 0; i < nh; i++) {
+      memcpy(buffer, &c[i * pitch_c], nw * sizeof(*buffer));
+      synthesis_26_row(nw, buffer, buffer + hw, &c[i * pitch_c]);
+    }
+  }
+  for (i = 0; i < height; i++) {
+    for (j = 0; j < width; j++) {
+      x[i * pitch_x + j] = c[i * pitch_c + j] >= 0 ?
+          ((c[i * pitch_c + j] + DWT_PRECISION_RND) >> DWT_PRECISION_BITS) :
+          -((-c[i * pitch_c + j] + DWT_PRECISION_RND) >> DWT_PRECISION_BITS);
+    }
+  }
+}
+
+#elif DWT_TYPE == 97
+
+static void synthesis_97(int length, double *lowpass, double *highpass,
+                         double *x) {
+  static const double a_predict1 = -1.586134342;
+  static const double a_update1 = -0.05298011854;
+  static const double a_predict2 = 0.8829110762;
+  static const double a_update2 = 0.4435068522;
+  static const double s_low = 1.149604398;
+  static const double s_high = 1/1.149604398;
+  static const double inv_s_low = 1 / s_low;
+  static const double inv_s_high = 1 / s_high;
+  int i;
+  double y[DWT_MAX_LENGTH];
+  // Undo pack and scale
+  for (i = 0; i < length / 2; i++) {
+    y[i * 2] = lowpass[i] * inv_s_low;
+    y[i * 2 + 1] = highpass[i] * inv_s_high;
+  }
+  memcpy(x, y, sizeof(*y) * length);
+  // Undo update 2
+  for (i = 2; i < length; i += 2) {
+    x[i] -= a_update2 * (x[i-1] + x[i+1]);
+  }
+  x[0] -= 2 * a_update2 * x[1];
+  // Undo predict 2
+  for (i = 1; i < length - 2; i += 2) {
+    x[i] -= a_predict2 * (x[i - 1] + x[i + 1]);
+  }
+  x[length - 1] -= 2 * a_predict2 * x[length - 2];
+  // Undo update 1
+  for (i = 2; i < length; i += 2) {
+    x[i] -= a_update1 * (x[i - 1] + x[i + 1]);
+  }
+  x[0] -= 2 * a_update1 * x[1];
+  // Undo predict 1
+  for (i = 1; i < length - 2; i += 2) {
+    x[i] -= a_predict1 * (x[i - 1] + x[i + 1]);
+  }
+  x[length - 1] -= 2 * a_predict1 * x[length - 2];
+}
+
+void dyadic_synthesize_97(int levels, int width, int height, short *c,
+                          int pitch_c, short *x, int pitch_x) {
+  int th[16], tw[16], lv, i, j, nh, nw, hh = height, hw = width;
+  double buffer[2 * DWT_MAX_LENGTH];
+  double y[DWT_MAX_LENGTH * DWT_MAX_LENGTH];
+
+  th[0] = hh;
+  tw[0] = hw;
+  for (i = 1; i <= levels; i++) {
+    th[i] = (th[i - 1] + 1) >> 1;
+    tw[i] = (tw[i - 1] + 1) >> 1;
+  }
+  for (lv = levels - 1; lv >= 0; lv--) {
+    nh = th[lv];
+    nw = tw[lv];
+    hh = th[lv + 1];
+    hw = tw[lv + 1];
+    if ((nh < 2) || (nw < 2)) continue;
+    for (j = 0; j < nw; j++) {
+      for (i = 0; i < nh; i++)
+        buffer[i] = c[i * pitch_c + j];
+      synthesis_97(nh, buffer, buffer + hh, buffer + nh);
+      for (i = 0; i < nh; i++)
+        y[i * DWT_MAX_LENGTH + j] = buffer[i + nh];
+    }
+    for (i = 0; i < nh; i++) {
+      memcpy(buffer, &y[i * DWT_MAX_LENGTH], nw * sizeof(*buffer));
+      synthesis_97(nw, buffer, buffer + hw, &y[i * DWT_MAX_LENGTH]);
+    }
+  }
   for (i = 0; i < height; i++)
     for (j = 0; j < width; j++)
-      x[i * pitch_x + j] = (c[i * pitch_c + j] + ENH_PRECISION_RND) >>
-      ENH_PRECISION_BITS;
+      x[i * pitch_x + j] = round(y[i * DWT_MAX_LENGTH + j] /
+                                 (1 << DWT_PRECISION_BITS));
+}
+
+#endif  // DWT_TYPE
+
+// TODO(debargha): Implement scaling differently so as not to have to use the
+// floating point 16x16 dct
+static void butterfly_16x16_idct_1d_f(double input[16], double output[16]) {
+  static const double C1 = 0.995184726672197;
+  static const double C2 = 0.98078528040323;
+  static const double C3 = 0.956940335732209;
+  static const double C4 = 0.923879532511287;
+  static const double C5 = 0.881921264348355;
+  static const double C6 = 0.831469612302545;
+  static const double C7 = 0.773010453362737;
+  static const double C8 = 0.707106781186548;
+  static const double C9 = 0.634393284163646;
+  static const double C10 = 0.555570233019602;
+  static const double C11 = 0.471396736825998;
+  static const double C12 = 0.38268343236509;
+  static const double C13 = 0.290284677254462;
+  static const double C14 = 0.195090322016128;
+  static const double C15 = 0.098017140329561;
+
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
+  {
+    double step[16];
+    double intermediate[16];
+    double temp1, temp2;
+
+
+    // step 1 and 2
+    step[ 0] = input[0] + input[8];
+    step[ 1] = input[0] - input[8];
+
+    temp1 = input[4]*C12;
+    temp2 = input[12]*C4;
+
+    temp1 -= temp2;
+    temp1 *= C8;
+
+    step[ 2] = 2*(temp1);
+
+    temp1 = input[4]*C4;
+    temp2 = input[12]*C12;
+    temp1 += temp2;
+    temp1 = (temp1);
+    temp1 *= C8;
+    step[ 3] = 2*(temp1);
+
+    temp1 = input[2]*C8;
+    temp1 = 2*(temp1);
+    temp2 = input[6] + input[10];
+
+    step[ 4] = temp1 + temp2;
+    step[ 5] = temp1 - temp2;
+
+    temp1 = input[14]*C8;
+    temp1 = 2*(temp1);
+    temp2 = input[6] - input[10];
+
+    step[ 6] = temp2 - temp1;
+    step[ 7] = temp2 + temp1;
+
+    // for odd input
+    temp1 = input[3]*C12;
+    temp2 = input[13]*C4;
+    temp1 += temp2;
+    temp1 = (temp1);
+    temp1 *= C8;
+    intermediate[ 8] = 2*(temp1);
+
+    temp1 = input[3]*C4;
+    temp2 = input[13]*C12;
+    temp2 -= temp1;
+    temp2 = (temp2);
+    temp2 *= C8;
+    intermediate[ 9] = 2*(temp2);
+
+    intermediate[10] = 2*(input[9]*C8);
+    intermediate[11] = input[15] - input[1];
+    intermediate[12] = input[15] + input[1];
+    intermediate[13] = 2*((input[7]*C8));
+
+    temp1 = input[11]*C12;
+    temp2 = input[5]*C4;
+    temp2 -= temp1;
+    temp2 = (temp2);
+    temp2 *= C8;
+    intermediate[14] = 2*(temp2);
+
+    temp1 = input[11]*C4;
+    temp2 = input[5]*C12;
+    temp1 += temp2;
+    temp1 = (temp1);
+    temp1 *= C8;
+    intermediate[15] = 2*(temp1);
+
+    step[ 8] = intermediate[ 8] + intermediate[14];
+    step[ 9] = intermediate[ 9] + intermediate[15];
+    step[10] = intermediate[10] + intermediate[11];
+    step[11] = intermediate[10] - intermediate[11];
+    step[12] = intermediate[12] + intermediate[13];
+    step[13] = intermediate[12] - intermediate[13];
+    step[14] = intermediate[ 8] - intermediate[14];
+    step[15] = intermediate[ 9] - intermediate[15];
+
+    // step 3
+    output[0] = step[ 0] + step[ 3];
+    output[1] = step[ 1] + step[ 2];
+    output[2] = step[ 1] - step[ 2];
+    output[3] = step[ 0] - step[ 3];
+
+    temp1 = step[ 4]*C14;
+    temp2 = step[ 7]*C2;
+    temp1 -= temp2;
+    output[4] =  (temp1);
+
+    temp1 = step[ 4]*C2;
+    temp2 = step[ 7]*C14;
+    temp1 += temp2;
+    output[7] =  (temp1);
+
+    temp1 = step[ 5]*C10;
+    temp2 = step[ 6]*C6;
+    temp1 -= temp2;
+    output[5] =  (temp1);
+
+    temp1 = step[ 5]*C6;
+    temp2 = step[ 6]*C10;
+    temp1 += temp2;
+    output[6] =  (temp1);
+
+    output[8] = step[ 8] + step[11];
+    output[9] = step[ 9] + step[10];
+    output[10] = step[ 9] - step[10];
+    output[11] = step[ 8] - step[11];
+    output[12] = step[12] + step[15];
+    output[13] = step[13] + step[14];
+    output[14] = step[13] - step[14];
+    output[15] = step[12] - step[15];
+
+    // output 4
+    step[ 0] = output[0] + output[7];
+    step[ 1] = output[1] + output[6];
+    step[ 2] = output[2] + output[5];
+    step[ 3] = output[3] + output[4];
+    step[ 4] = output[3] - output[4];
+    step[ 5] = output[2] - output[5];
+    step[ 6] = output[1] - output[6];
+    step[ 7] = output[0] - output[7];
+
+    temp1 = output[8]*C7;
+    temp2 = output[15]*C9;
+    temp1 -= temp2;
+    step[ 8] = (temp1);
+
+    temp1 = output[9]*C11;
+    temp2 = output[14]*C5;
+    temp1 += temp2;
+    step[ 9] = (temp1);
+
+    temp1 = output[10]*C3;
+    temp2 = output[13]*C13;
+    temp1 -= temp2;
+    step[10] = (temp1);
+
+    temp1 = output[11]*C15;
+    temp2 = output[12]*C1;
+    temp1 += temp2;
+    step[11] = (temp1);
+
+    temp1 = output[11]*C1;
+    temp2 = output[12]*C15;
+    temp2 -= temp1;
+    step[12] = (temp2);
+
+    temp1 = output[10]*C13;
+    temp2 = output[13]*C3;
+    temp1 += temp2;
+    step[13] = (temp1);
+
+    temp1 = output[9]*C5;
+    temp2 = output[14]*C11;
+    temp2 -= temp1;
+    step[14] = (temp2);
+
+    temp1 = output[8]*C9;
+    temp2 = output[15]*C7;
+    temp1 += temp2;
+    step[15] = (temp1);
+
+    // step 5
+    output[0] = (step[0] + step[15]);
+    output[1] = (step[1] + step[14]);
+    output[2] = (step[2] + step[13]);
+    output[3] = (step[3] + step[12]);
+    output[4] = (step[4] + step[11]);
+    output[5] = (step[5] + step[10]);
+    output[6] = (step[6] + step[ 9]);
+    output[7] = (step[7] + step[ 8]);
+
+    output[15] = (step[0] - step[15]);
+    output[14] = (step[1] - step[14]);
+    output[13] = (step[2] - step[13]);
+    output[12] = (step[3] - step[12]);
+    output[11] = (step[4] - step[11]);
+    output[10] = (step[5] - step[10]);
+    output[9] = (step[6] - step[ 9]);
+    output[8] = (step[7] - step[ 8]);
+  }
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
+}
+
+void vp9_short_idct16x16_c_f(short *input, short *output, int pitch) {
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
+  {
+    double out[16*16], out2[16*16];
+    const int short_pitch = pitch >> 1;
+    int i, j;
+      // First transform rows
+    for (i = 0; i < 16; ++i) {
+      double temp_in[16], temp_out[16];
+      for (j = 0; j < 16; ++j)
+        temp_in[j] = input[j + i*short_pitch];
+      butterfly_16x16_idct_1d_f(temp_in, temp_out);
+      for (j = 0; j < 16; ++j)
+        out[j + i*16] = temp_out[j];
+    }
+    // Then transform columns
+    for (i = 0; i < 16; ++i) {
+      double temp_in[16], temp_out[16];
+      for (j = 0; j < 16; ++j)
+        temp_in[j] = out[j*16 + i];
+      butterfly_16x16_idct_1d_f(temp_in, temp_out);
+      for (j = 0; j < 16; ++j)
+        out2[j*16 + i] = temp_out[j];
+    }
+    for (i = 0; i < 16*16; ++i)
+      output[i] = round(out2[i] / (64 >> DWT_PRECISION_BITS));
+  }
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
 }
 
 void vp9_short_idct32x32_c(short *input, short *output, int pitch) {
   // assume out is a 32x32 buffer
+  // Temporary buffer to hold a 16x16 block for 16x16 inverse dct
   short buffer[16 * 16];
+  // Temporary buffer to hold a 32x32 block for inverse 32x32 dwt
   short buffer2[32 * 32];
+  // Note: pitch is in bytes, short_pitch is in short units
   const int short_pitch = pitch >> 1;
   int i;
+
   // TODO(debargha): Implement more efficiently by adding output pitch
   // argument to the idct16x16 function
-  vp9_short_idct16x16_c(input, buffer, pitch);
+  vp9_short_idct16x16_c_f(input, buffer, pitch);
   for (i = 0; i < 16; ++i) {
-    vpx_memcpy(buffer2 + i * 32, buffer + i * 16, sizeof(short) * 16);
-    vpx_memcpy(buffer2 + i * 32 + 16, input + i * short_pitch + 16,
-               sizeof(short) * 16);
+    vpx_memcpy(buffer2 + i * 32, buffer + i * 16, sizeof(*buffer2) * 16);
   }
-  for (; i < 32; ++i) {
-    vpx_memcpy(buffer2 + i * 32, input + i * short_pitch,
-               sizeof(short) * 32);
+  vp9_short_idct16x16_c_f(input + 16, buffer, pitch);
+  for (i = 0; i < 16; ++i) {
+    vpx_memcpy(buffer2 + i * 32 + 16, buffer + i * 16, sizeof(*buffer2) * 16);
   }
-  dyadic_synthesize(1, 32, 32, buffer2, 32, output, 32);
+  vp9_short_idct16x16_c_f(input + 16 * short_pitch, buffer, pitch);
+  for (i = 0; i < 16; ++i) {
+    vpx_memcpy(buffer2 + i * 32 + 16 * 32, buffer + i * 16,
+               sizeof(*buffer2) * 16);
+  }
+  vp9_short_idct16x16_c_f(input + 16 * short_pitch + 16, buffer, pitch);
+  for (i = 0; i < 16; ++i) {
+    vpx_memcpy(buffer2 + i * 32 + 16 * 33, buffer + i * 16,
+               sizeof(*buffer2) * 16);
+  }
+#if DWT_TYPE == 26
+  dyadic_synthesize_26(1, 32, 32, buffer2, 32, output, 32);
+#elif DWT_TYPE == 97
+  dyadic_synthesize_97(1, 32, 32, buffer2, 32, output, 32);
+#elif DWT_TYPE == 53
+  dyadic_synthesize_53(1, 32, 32, buffer2, 32, output, 32);
+#endif
 }
 #endif  // CONFIG_DWT32X32HYBRID
 #endif  // CONFIG_TX32X32
diff --git a/vp9/encoder/vp9_dct.c b/vp9/encoder/vp9_dct.c
index 0fc8fa3..90baafe 100644
--- a/vp9/encoder/vp9_dct.c
+++ b/vp9/encoder/vp9_dct.c
@@ -902,23 +902,24 @@
 
 #define TEST_INT_16x16_DCT 1
 #if !TEST_INT_16x16_DCT
-static const double C1 = 0.995184726672197;
-static const double C2 = 0.98078528040323;
-static const double C3 = 0.956940335732209;
-static const double C4 = 0.923879532511287;
-static const double C5 = 0.881921264348355;
-static const double C6 = 0.831469612302545;
-static const double C7 = 0.773010453362737;
-static const double C8 = 0.707106781186548;
-static const double C9 = 0.634393284163646;
-static const double C10 = 0.555570233019602;
-static const double C11 = 0.471396736825998;
-static const double C12 = 0.38268343236509;
-static const double C13 = 0.290284677254462;
-static const double C14 = 0.195090322016128;
-static const double C15 = 0.098017140329561;
 
 static void dct16x16_1d(double input[16], double output[16]) {
+  static const double C1 = 0.995184726672197;
+  static const double C2 = 0.98078528040323;
+  static const double C3 = 0.956940335732209;
+  static const double C4 = 0.923879532511287;
+  static const double C5 = 0.881921264348355;
+  static const double C6 = 0.831469612302545;
+  static const double C7 = 0.773010453362737;
+  static const double C8 = 0.707106781186548;
+  static const double C9 = 0.634393284163646;
+  static const double C10 = 0.555570233019602;
+  static const double C11 = 0.471396736825998;
+  static const double C12 = 0.38268343236509;
+  static const double C13 = 0.290284677254462;
+  static const double C14 = 0.195090322016128;
+  static const double C15 = 0.098017140329561;
+
   vp9_clear_system_state(); // Make it simd safe : __asm emms;
   {
     double step[16];
@@ -1686,15 +1687,18 @@
 
 #else  // CONFIG_DWT32X32HYBRID
 
-#define MAX_BLOCK_LENGTH   64
-#define ENH_PRECISION_BITS 1
-#define ENH_PRECISION_RND ((1 << ENH_PRECISION_BITS) / 2)
+#define DWT_MAX_LENGTH   64
+#define DWT_TYPE         26    // 26/53/97
+#define DWT_PRECISION_BITS 2
+#define DWT_PRECISION_RND ((1 << DWT_PRECISION_BITS) / 2)
+
+#if DWT_TYPE == 53
 
 // Note: block length must be even for this implementation
 static void analysis_53_row(int length, short *x,
                             short *lowpass, short *highpass) {
   int n;
-  short r, * a, * b;
+  short r, *a, *b;
 
   n = length >> 1;
   b = highpass;
@@ -1720,7 +1724,7 @@
 static void analysis_53_col(int length, short *x,
                             short *lowpass, short *highpass) {
   int n;
-  short r, * a, * b;
+  short r, *a, *b;
 
   n = length >> 1;
   b = highpass;
@@ -1743,15 +1747,13 @@
   }
 }
 
-// NOTE: Using a 5/3 integer wavelet for now. Explore using a wavelet
-// with a better response later
-static void dyadic_analyze(int levels, int width, int height,
-                           short *x, int pitch_x, short *c, int pitch_c) {
+static void dyadic_analyze_53(int levels, int width, int height,
+                              short *x, int pitch_x, short *c, int pitch_c) {
   int lv, i, j, nh, nw, hh = height, hw = width;
-  short buffer[2 * MAX_BLOCK_LENGTH];
+  short buffer[2 * DWT_MAX_LENGTH];
   for (i = 0; i < height; i++) {
     for (j = 0; j < width; j++) {
-      c[i * pitch_c + j] = x[i * pitch_x + j] << ENH_PRECISION_BITS;
+      c[i * pitch_c + j] = x[i * pitch_x + j] << DWT_PRECISION_BITS;
     }
   }
   for (lv = 0; lv < levels; lv++) {
@@ -1774,17 +1776,398 @@
   }
 }
 
+#elif DWT_TYPE == 26
+
+static void analysis_26_row(int length, short *x,
+                            short *lowpass, short *highpass) {
+  int i, n;
+  short r, s, *a, *b;
+  a = lowpass;
+  b = highpass;
+  for (i = length >> 1; i; i--) {
+    r = *x++;
+    s = *x++;
+    *a++ = r + s;
+    *b++ = r - s;
+  }
+  n = length >> 1;
+  if (n >= 4) {
+    a = lowpass;
+    b = highpass;
+    r = *lowpass;
+    while (--n) {
+      *b++ -= (r - a[1] + 4) >> 3;
+      r = *a++;
+    }
+    *b -= (r - *a + 4) >> 3;
+  }
+}
+
+static void analysis_26_col(int length, short *x,
+                            short *lowpass, short *highpass) {
+  int i, n;
+  short r, s, *a, *b;
+  a = lowpass;
+  b = highpass;
+  for (i = length >> 1; i; i--) {
+    r = *x++;
+    s = *x++;
+    *a++ = (r + s + 1) >> 1;
+    *b++ = (r - s + 1) >> 1;
+  }
+  n = length >> 1;
+  if (n >= 4) {
+    a = lowpass;
+    b = highpass;
+    r = *lowpass;
+    while (--n) {
+      *b++ -= (r - a[1] + 4) >> 3;
+      r = *a++;
+    }
+    *b -= (r - *a + 4) >> 3;
+  }
+}
+
+static void dyadic_analyze_26(int levels, int width, int height,
+                              short *x, int pitch_x, short *c, int pitch_c) {
+  int lv, i, j, nh, nw, hh = height, hw = width;
+  short buffer[2 * DWT_MAX_LENGTH];
+  for (i = 0; i < height; i++) {
+    for (j = 0; j < width; j++) {
+      c[i * pitch_c + j] = x[i * pitch_x + j] << DWT_PRECISION_BITS;
+    }
+  }
+  for (lv = 0; lv < levels; lv++) {
+    nh = hh;
+    hh = (hh + 1) >> 1;
+    nw = hw;
+    hw = (hw + 1) >> 1;
+    if ((nh < 2) || (nw < 2)) return;
+    for (i = 0; i < nh; i++) {
+      memcpy(buffer, &c[i * pitch_c], nw * sizeof(short));
+      analysis_26_row(nw, buffer, &c[i * pitch_c], &c[i * pitch_c] + hw);
+    }
+    for (j = 0; j < nw; j++) {
+      for (i = 0; i < nh; i++)
+        buffer[i + nh] = c[i * pitch_c + j];
+      analysis_26_col(nh, buffer + nh, buffer, buffer + hh);
+      for (i = 0; i < nh; i++)
+        c[i * pitch_c + j] = buffer[i];
+    }
+  }
+}
+
+#elif DWT_TYPE == 97
+
+static void analysis_97(int length, double *x,
+                        double *lowpass, double *highpass) {
+  static const double a_predict1 = -1.586134342;
+  static const double a_update1 = -0.05298011854;
+  static const double a_predict2 = 0.8829110762;
+  static const double a_update2 = 0.4435068522;
+  static const double s_low = 1.149604398;
+  static const double s_high = 1/1.149604398;
+  int i;
+  double y[DWT_MAX_LENGTH];
+  // Predict 1
+  for (i = 1; i < length - 2; i += 2) {
+    x[i] += a_predict1 * (x[i - 1] + x[i + 1]);
+  }
+  x[length - 1] += 2 * a_predict1 * x[length - 2];
+  // Update 1
+  for (i = 2; i < length; i += 2) {
+    x[i] += a_update1 * (x[i - 1] + x[i + 1]);
+  }
+  x[0] += 2 * a_update1 * x[1];
+  // Predict 2
+  for (i = 1; i < length - 2; i += 2) {
+    x[i] += a_predict2 * (x[i - 1] + x[i + 1]);
+  }
+  x[length - 1] += 2 * a_predict2 * x[length - 2];
+  // Update 2
+  for (i = 2; i < length; i += 2) {
+    x[i] += a_update2 * (x[i - 1] + x[i + 1]);
+  }
+  x[0] += 2 * a_update2 * x[1];
+  memcpy(y, x, sizeof(*y) * length);
+  // Scale and pack
+  for (i = 0; i < length / 2; i++) {
+    lowpass[i] = y[2 * i] * s_low;
+    highpass[i] = y[2 * i + 1] * s_high;
+  }
+}
+
+static void dyadic_analyze_97(int levels, int width, int height,
+                             short *x, int pitch_x, short *c, int pitch_c) {
+  int lv, i, j, nh, nw, hh = height, hw = width;
+  double buffer[2 * DWT_MAX_LENGTH];
+  double y[DWT_MAX_LENGTH * DWT_MAX_LENGTH];
+  for (i = 0; i < height; i++) {
+    for (j = 0; j < width; j++) {
+      y[i * DWT_MAX_LENGTH + j] = x[i * pitch_x + j] << DWT_PRECISION_BITS;
+    }
+  }
+  for (lv = 0; lv < levels; lv++) {
+    nh = hh;
+    hh = (hh + 1) >> 1;
+    nw = hw;
+    hw = (hw + 1) >> 1;
+    if ((nh < 2) || (nw < 2)) return;
+    for (i = 0; i < nh; i++) {
+      memcpy(buffer, &y[i * DWT_MAX_LENGTH], nw * sizeof(*buffer));
+      analysis_97(nw, buffer, &y[i * DWT_MAX_LENGTH],
+                  &y[i * DWT_MAX_LENGTH] + hw);
+    }
+    for (j = 0; j < nw; j++) {
+      for (i = 0; i < nh; i++)
+        buffer[i + nh] = y[i * DWT_MAX_LENGTH + j];
+      analysis_97(nh, buffer + nh, buffer, buffer + hh);
+      for (i = 0; i < nh; i++)
+        c[i * pitch_c + j] = round(buffer[i]);
+    }
+  }
+}
+
+#endif  // DWT_TYPE
+
+// TODO(debargha): Implement the scaling differently so as not to have to
+// use the floating point dct
+static void dct16x16_1d_f(double input[16], double output[16]) {
+  static const double C1 = 0.995184726672197;
+  static const double C2 = 0.98078528040323;
+  static const double C3 = 0.956940335732209;
+  static const double C4 = 0.923879532511287;
+  static const double C5 = 0.881921264348355;
+  static const double C6 = 0.831469612302545;
+  static const double C7 = 0.773010453362737;
+  static const double C8 = 0.707106781186548;
+  static const double C9 = 0.634393284163646;
+  static const double C10 = 0.555570233019602;
+  static const double C11 = 0.471396736825998;
+  static const double C12 = 0.38268343236509;
+  static const double C13 = 0.290284677254462;
+  static const double C14 = 0.195090322016128;
+  static const double C15 = 0.098017140329561;
+
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
+  {
+    double step[16];
+    double intermediate[16];
+    double temp1, temp2;
+
+    // step 1
+    step[ 0] = input[0] + input[15];
+    step[ 1] = input[1] + input[14];
+    step[ 2] = input[2] + input[13];
+    step[ 3] = input[3] + input[12];
+    step[ 4] = input[4] + input[11];
+    step[ 5] = input[5] + input[10];
+    step[ 6] = input[6] + input[ 9];
+    step[ 7] = input[7] + input[ 8];
+    step[ 8] = input[7] - input[ 8];
+    step[ 9] = input[6] - input[ 9];
+    step[10] = input[5] - input[10];
+    step[11] = input[4] - input[11];
+    step[12] = input[3] - input[12];
+    step[13] = input[2] - input[13];
+    step[14] = input[1] - input[14];
+    step[15] = input[0] - input[15];
+
+    // step 2
+    output[0] = step[0] + step[7];
+    output[1] = step[1] + step[6];
+    output[2] = step[2] + step[5];
+    output[3] = step[3] + step[4];
+    output[4] = step[3] - step[4];
+    output[5] = step[2] - step[5];
+    output[6] = step[1] - step[6];
+    output[7] = step[0] - step[7];
+
+    temp1 = step[ 8]*C7;
+    temp2 = step[15]*C9;
+    output[ 8] = temp1 + temp2;
+
+    temp1 = step[ 9]*C11;
+    temp2 = step[14]*C5;
+    output[ 9] = temp1 - temp2;
+
+    temp1 = step[10]*C3;
+    temp2 = step[13]*C13;
+    output[10] = temp1 + temp2;
+
+    temp1 = step[11]*C15;
+    temp2 = step[12]*C1;
+    output[11] = temp1 - temp2;
+
+    temp1 = step[11]*C1;
+    temp2 = step[12]*C15;
+    output[12] = temp2 + temp1;
+
+    temp1 = step[10]*C13;
+    temp2 = step[13]*C3;
+    output[13] = temp2 - temp1;
+
+    temp1 = step[ 9]*C5;
+    temp2 = step[14]*C11;
+    output[14] = temp2 + temp1;
+
+    temp1 = step[ 8]*C9;
+    temp2 = step[15]*C7;
+    output[15] = temp2 - temp1;
+
+    // step 3
+    step[ 0] = output[0] + output[3];
+    step[ 1] = output[1] + output[2];
+    step[ 2] = output[1] - output[2];
+    step[ 3] = output[0] - output[3];
+
+    temp1 = output[4]*C14;
+    temp2 = output[7]*C2;
+    step[ 4] = temp1 + temp2;
+
+    temp1 = output[5]*C10;
+    temp2 = output[6]*C6;
+    step[ 5] = temp1 + temp2;
+
+    temp1 = output[5]*C6;
+    temp2 = output[6]*C10;
+    step[ 6] = temp2 - temp1;
+
+    temp1 = output[4]*C2;
+    temp2 = output[7]*C14;
+    step[ 7] = temp2 - temp1;
+
+    step[ 8] = output[ 8] + output[11];
+    step[ 9] = output[ 9] + output[10];
+    step[10] = output[ 9] - output[10];
+    step[11] = output[ 8] - output[11];
+
+    step[12] = output[12] + output[15];
+    step[13] = output[13] + output[14];
+    step[14] = output[13] - output[14];
+    step[15] = output[12] - output[15];
+
+    // step 4
+    output[ 0] = (step[ 0] + step[ 1]);
+    output[ 8] = (step[ 0] - step[ 1]);
+
+    temp1 = step[2]*C12;
+    temp2 = step[3]*C4;
+    temp1 = temp1 + temp2;
+    output[ 4] = 2*(temp1*C8);
+
+    temp1 = step[2]*C4;
+    temp2 = step[3]*C12;
+    temp1 = temp2 - temp1;
+    output[12] = 2*(temp1*C8);
+
+    output[ 2] = 2*((step[4] + step[ 5])*C8);
+    output[14] = 2*((step[7] - step[ 6])*C8);
+
+    temp1 = step[4] - step[5];
+    temp2 = step[6] + step[7];
+    output[ 6] = (temp1 + temp2);
+    output[10] = (temp1 - temp2);
+
+    intermediate[8] = step[8] + step[14];
+    intermediate[9] = step[9] + step[15];
+
+    temp1 = intermediate[8]*C12;
+    temp2 = intermediate[9]*C4;
+    temp1 = temp1 - temp2;
+    output[3] = 2*(temp1*C8);
+
+    temp1 = intermediate[8]*C4;
+    temp2 = intermediate[9]*C12;
+    temp1 = temp2 + temp1;
+    output[13] = 2*(temp1*C8);
+
+    output[ 9] = 2*((step[10] + step[11])*C8);
+
+    intermediate[11] = step[10] - step[11];
+    intermediate[12] = step[12] + step[13];
+    intermediate[13] = step[12] - step[13];
+    intermediate[14] = step[ 8] - step[14];
+    intermediate[15] = step[ 9] - step[15];
+
+    output[15] = (intermediate[11] + intermediate[12]);
+    output[ 1] = -(intermediate[11] - intermediate[12]);
+
+    output[ 7] = 2*(intermediate[13]*C8);
+
+    temp1 = intermediate[14]*C12;
+    temp2 = intermediate[15]*C4;
+    temp1 = temp1 - temp2;
+    output[11] = -2*(temp1*C8);
+
+    temp1 = intermediate[14]*C4;
+    temp2 = intermediate[15]*C12;
+    temp1 = temp2 + temp1;
+    output[ 5] = 2*(temp1*C8);
+  }
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
+}
+
+void vp9_short_fdct16x16_c_f(short *input, short *out, int pitch) {
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
+  {
+    int shortpitch = pitch >> 1;
+    int i, j;
+    double output[256];
+    // First transform columns
+    for (i = 0; i < 16; i++) {
+        double temp_in[16], temp_out[16];
+        for (j = 0; j < 16; j++)
+            temp_in[j] = input[j*shortpitch + i];
+        dct16x16_1d_f(temp_in, temp_out);
+        for (j = 0; j < 16; j++)
+            output[j*16 + i] = temp_out[j];
+    }
+    // Then transform rows
+    for (i = 0; i < 16; ++i) {
+        double temp_in[16], temp_out[16];
+        for (j = 0; j < 16; ++j)
+            temp_in[j] = output[j + i*16];
+        dct16x16_1d_f(temp_in, temp_out);
+        for (j = 0; j < 16; ++j)
+            output[j + i*16] = temp_out[j];
+    }
+    // Scale by some magic number
+    for (i = 0; i < 256; i++)
+        out[i] = (short)round(output[i] / (4 << DWT_PRECISION_BITS));
+  }
+  vp9_clear_system_state();  // Make it simd safe : __asm emms;
+}
+
 void vp9_short_fdct32x32_c(short *input, short *out, int pitch) {
   // assume out is a 32x32 buffer
   short buffer[16 * 16];
   int i;
   const int short_pitch = pitch >> 1;
-  dyadic_analyze(1, 32, 32, input, short_pitch, out, 32);
+#if DWT_TYPE == 26
+  dyadic_analyze_26(1, 32, 32, input, short_pitch, out, 32);
+#elif DWT_TYPE == 97
+  dyadic_analyze_97(1, 32, 32, input, short_pitch, out, 32);
+#elif DWT_TYPE == 53
+  dyadic_analyze_53(1, 32, 32, input, short_pitch, out, 32);
+#endif
   // TODO(debargha): Implement more efficiently by adding output pitch
   // argument to the dct16x16 function
-  vp9_short_fdct16x16_c(out, buffer, 64);
+  vp9_short_fdct16x16_c_f(out, buffer, 64);
   for (i = 0; i < 16; ++i)
     vpx_memcpy(out + i * 32, buffer + i * 16, sizeof(short) * 16);
+
+  vp9_short_fdct16x16_c_f(out + 16, buffer, 64);
+  for (i = 0; i < 16; ++i)
+    vpx_memcpy(out + i * 32 + 16, buffer + i * 16, sizeof(short) * 16);
+
+  vp9_short_fdct16x16_c_f(out + 32 * 16, buffer, 64);
+  for (i = 0; i < 16; ++i)
+    vpx_memcpy(out + i * 32 + 32 * 16, buffer + i * 16, sizeof(short) * 16);
+
+  vp9_short_fdct16x16_c_f(out + 33 * 16, buffer, 64);
+  for (i = 0; i < 16; ++i)
+    vpx_memcpy(out + i * 32 + 33 * 16, buffer + i * 16, sizeof(short) * 16);
 }
 #endif  // CONFIG_DWT32X32HYBRID
 #endif  // CONFIG_TX32X32