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