Home | History | Annotate | Download | only in common
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 
     12 #include "invtrans.h"
     13 
     14 
     15 
     16 static void recon_dcblock(MACROBLOCKD *x)
     17 {
     18     BLOCKD *b = &x->block[24];
     19     int i;
     20 
     21     for (i = 0; i < 16; i++)
     22     {
     23         x->block[i].dqcoeff[0] = b->diff[i];
     24     }
     25 
     26 }
     27 
     28 void vp8_inverse_transform_b(const vp8_idct_rtcd_vtable_t *rtcd, BLOCKD *b, int pitch)
     29 {
     30     if (b->eob > 1)
     31         IDCT_INVOKE(rtcd, idct16)(b->dqcoeff, b->diff, pitch);
     32     else
     33         IDCT_INVOKE(rtcd, idct1)(b->dqcoeff, b->diff, pitch);
     34 }
     35 
     36 
     37 void vp8_inverse_transform_mby(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x)
     38 {
     39     int i;
     40 
     41     /* do 2nd order transform on the dc block */
     42     IDCT_INVOKE(rtcd, iwalsh16)(x->block[24].dqcoeff, x->block[24].diff);
     43 
     44     recon_dcblock(x);
     45 
     46     for (i = 0; i < 16; i++)
     47     {
     48         vp8_inverse_transform_b(rtcd, &x->block[i], 32);
     49     }
     50 
     51 }
     52 void vp8_inverse_transform_mbuv(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x)
     53 {
     54     int i;
     55 
     56     for (i = 16; i < 24; i++)
     57     {
     58         vp8_inverse_transform_b(rtcd, &x->block[i], 16);
     59     }
     60 
     61 }
     62 
     63 
     64 void vp8_inverse_transform_mb(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x)
     65 {
     66     int i;
     67 
     68     if (x->mode_info_context->mbmi.mode != B_PRED &&
     69         x->mode_info_context->mbmi.mode != SPLITMV)
     70     {
     71         /* do 2nd order transform on the dc block */
     72 
     73         IDCT_INVOKE(rtcd, iwalsh16)(&x->block[24].dqcoeff[0], x->block[24].diff);
     74         recon_dcblock(x);
     75     }
     76 
     77     for (i = 0; i < 16; i++)
     78     {
     79         vp8_inverse_transform_b(rtcd, &x->block[i], 32);
     80     }
     81 
     82 
     83     for (i = 16; i < 24; i++)
     84     {
     85         vp8_inverse_transform_b(rtcd, &x->block[i], 16);
     86     }
     87 
     88 }
     89