invtrans.c 4.18 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5 6
 *  that can be found in the LICENSE file in the root of the source
 *  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.
John Koleszar's avatar
John Koleszar committed
9 10 11 12 13 14 15
 */


#include "invtrans.h"



John Koleszar's avatar
John Koleszar committed
16 17 18
static void recon_dcblock(MACROBLOCKD *x) {
  BLOCKD *b = &x->block[24];
  int i;
John Koleszar's avatar
John Koleszar committed
19

John Koleszar's avatar
John Koleszar committed
20 21 22
  for (i = 0; i < 16; i++) {
    x->block[i].dqcoeff[0] = b->diff[i];
  }
John Koleszar's avatar
John Koleszar committed
23 24

}
John Koleszar's avatar
John Koleszar committed
25 26 27 28 29 30
static void recon_dcblock_8x8(MACROBLOCKD *x) {
  BLOCKD *b = &x->block[24]; // for coeff 0, 2, 8, 10
  x->block[0].dqcoeff[0] = b->diff[0];
  x->block[4].dqcoeff[0] = b->diff[1];
  x->block[8].dqcoeff[0] = b->diff[4];
  x->block[12].dqcoeff[0] = b->diff[8];
31 32 33

}

Jingning Han's avatar
Jingning Han committed
34 35 36 37 38
#if CONFIG_HYBRIDTRANSFORM
void vp8_inverse_htransform_b(const vp8_idct_rtcd_vtable_t *rtcd, BLOCKD *b, int pitch) {
  vp8_iht4x4llm_c(b->dqcoeff, b->diff, pitch, b->bmi.as_mode.tx_type);
}
#endif
John Koleszar's avatar
John Koleszar committed
39

John Koleszar's avatar
John Koleszar committed
40 41 42 43 44
void vp8_inverse_transform_b(const vp8_idct_rtcd_vtable_t *rtcd, BLOCKD *b, int pitch) {
  if (b->eob <= 1)
    IDCT_INVOKE(rtcd, idct1)(b->dqcoeff, b->diff, pitch);
  else
    IDCT_INVOKE(rtcd, idct16)(b->dqcoeff, b->diff, pitch);
John Koleszar's avatar
John Koleszar committed
45 46 47
}


John Koleszar's avatar
John Koleszar committed
48 49
void vp8_inverse_transform_mby(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;
John Koleszar's avatar
John Koleszar committed
50

John Koleszar's avatar
John Koleszar committed
51 52
  /* do 2nd order transform on the dc block */
  IDCT_INVOKE(rtcd, iwalsh16)(x->block[24].dqcoeff, x->block[24].diff);
John Koleszar's avatar
John Koleszar committed
53

John Koleszar's avatar
John Koleszar committed
54
  recon_dcblock(x);
John Koleszar's avatar
John Koleszar committed
55

John Koleszar's avatar
John Koleszar committed
56 57 58
  for (i = 0; i < 16; i++) {
    vp8_inverse_transform_b(rtcd, &x->block[i], 32);
  }
John Koleszar's avatar
John Koleszar committed
59 60

}
John Koleszar's avatar
John Koleszar committed
61 62
void vp8_inverse_transform_mbuv(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;
John Koleszar's avatar
John Koleszar committed
63

John Koleszar's avatar
John Koleszar committed
64 65 66
  for (i = 16; i < 24; i++) {
    vp8_inverse_transform_b(rtcd, &x->block[i], 16);
  }
John Koleszar's avatar
John Koleszar committed
67 68 69 70

}


John Koleszar's avatar
John Koleszar committed
71 72
void vp8_inverse_transform_mb(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;
John Koleszar's avatar
John Koleszar committed
73

John Koleszar's avatar
John Koleszar committed
74 75 76 77
  if (x->mode_info_context->mbmi.mode != B_PRED &&
      x->mode_info_context->mbmi.mode != I8X8_PRED &&
      x->mode_info_context->mbmi.mode != SPLITMV) {
    /* do 2nd order transform on the dc block */
John Koleszar's avatar
John Koleszar committed
78

John Koleszar's avatar
John Koleszar committed
79 80 81
    IDCT_INVOKE(rtcd, iwalsh16)(&x->block[24].dqcoeff[0], x->block[24].diff);
    recon_dcblock(x);
  }
John Koleszar's avatar
John Koleszar committed
82

John Koleszar's avatar
John Koleszar committed
83 84 85
  for (i = 0; i < 16; i++) {
    vp8_inverse_transform_b(rtcd, &x->block[i], 32);
  }
John Koleszar's avatar
John Koleszar committed
86 87


John Koleszar's avatar
John Koleszar committed
88 89 90
  for (i = 16; i < 24; i++) {
    vp8_inverse_transform_b(rtcd, &x->block[i], 16);
  }
John Koleszar's avatar
John Koleszar committed
91 92

}
93 94


John Koleszar's avatar
John Koleszar committed
95 96 97 98 99 100
void vp8_inverse_transform_b_8x8(const vp8_idct_rtcd_vtable_t *rtcd, short *input_dqcoeff, short *output_coeff, int pitch) { // pay attention to use when 8x8
  // int b,i;
  // if (b->eob > 1)
  IDCT_INVOKE(rtcd, idct8)(input_dqcoeff, output_coeff, pitch);
  // else
  // IDCT_INVOKE(rtcd, idct8_1)(b->dqcoeff, b->diff, pitch);//pitch
101 102 103 104

}


John Koleszar's avatar
John Koleszar committed
105 106
void vp8_inverse_transform_mby_8x8(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;
107

John Koleszar's avatar
John Koleszar committed
108 109 110 111 112 113 114 115 116 117
  // do 2nd order transform on the dc block
  IDCT_INVOKE(rtcd, ihaar2)(x->block[24].dqcoeff, x->block[24].diff, 8);

  recon_dcblock_8x8(x); // need to change for 8x8
  for (i = 0; i < 9; i += 8) {
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i].dqcoeff[0], &x->block[i].diff[0], 32);
  }
  for (i = 2; i < 11; i += 8) {
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i + 2].dqcoeff[0], &x->block[i].diff[0], 32);
  }
118 119

}
John Koleszar's avatar
John Koleszar committed
120 121
void vp8_inverse_transform_mbuv_8x8(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;
122

John Koleszar's avatar
John Koleszar committed
123 124 125
  for (i = 16; i < 24; i += 4) {
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i].dqcoeff[0], &x->block[i].diff[0], 16);
  }
126 127 128 129

}


John Koleszar's avatar
John Koleszar committed
130 131
void vp8_inverse_transform_mb_8x8(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;
132

John Koleszar's avatar
John Koleszar committed
133 134 135
  if (x->mode_info_context->mbmi.mode != B_PRED &&
      x->mode_info_context->mbmi.mode != SPLITMV) {
    // do 2nd order transform on the dc block
136

John Koleszar's avatar
John Koleszar committed
137 138
    IDCT_INVOKE(rtcd, ihaar2)(&x->block[24].dqcoeff[0], x->block[24].diff, 8);// dqcoeff[0]
    recon_dcblock_8x8(x); // need to change for 8x8
139

John Koleszar's avatar
John Koleszar committed
140
  }
141

John Koleszar's avatar
John Koleszar committed
142 143 144 145 146 147
  for (i = 0; i < 9; i += 8) {
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i].dqcoeff[0], &x->block[i].diff[0], 32);
  }
  for (i = 2; i < 11; i += 8) {
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i + 2].dqcoeff[0], &x->block[i].diff[0], 32);
  }
148 149


John Koleszar's avatar
John Koleszar committed
150 151 152
  for (i = 16; i < 24; i += 4) {
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i].dqcoeff[0], &x->block[i].diff[0], 16);
  }
153 154 155

}