invtrans.c 5.3 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
#if CONFIG_HYBRIDTRANSFORM
void vp8_inverse_htransform_b(const vp8_idct_rtcd_vtable_t *rtcd, BLOCKD *b, int pitch) {
36
  vp8_ihtllm_c(b->dqcoeff, b->diff, pitch, b->bmi.as_mode.tx_type, 4);
Jingning Han's avatar
Jingning Han committed
37
38
}
#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

}

Daniel Kang's avatar
Daniel Kang committed
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#if CONFIG_TX16X16
void vp8_inverse_transform_b_16x16(const vp8_idct_rtcd_vtable_t *rtcd,
                                   short *input_dqcoeff,
                                   short *output_coeff, int pitch) {
  IDCT_INVOKE(rtcd, idct16x16)(input_dqcoeff, output_coeff, pitch);
}

void vp8_inverse_transform_mby_16x16(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
    vp8_inverse_transform_b_16x16(rtcd, &x->block[0].dqcoeff[0], &x->block[0].diff[0], 32);
}

// U,V blocks are 8x8 per macroblock, so just run 8x8
void vp8_inverse_transform_mbuv_16x16(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;
  for (i = 16; i < 24; i += 4)
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i].dqcoeff[0], &x->block[i].diff[0], 16);
}

void vp8_inverse_transform_mb_16x16(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x) {
  int i;

  // Luma
  vp8_inverse_transform_b_16x16(rtcd, &x->block[0].dqcoeff[0], &x->block[0].diff[0], 32);

  // U, V
  // Chroma blocks are downscaled, so run an 8x8 on them.
  for (i = 16; i < 24; i+= 4)
    vp8_inverse_transform_b_8x8(rtcd, &x->block[i].dqcoeff[0], &x->block[i].diff[0], 16);
}
#endif