1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP8_COMMON_INVTRANS_H_
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP8_COMMON_INVTRANS_H_
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "blockd.h"
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "onyxc_int.h"
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTITHREAD
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h"
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
25233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" {
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan
28233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void eob_adjust(char *eobs, short *diff)
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* eob adjust.... the idct can only skip if both the dc and eob are zero */
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int js;
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for(js = 0; js < 16; js++)
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if((eobs[js] == 0) && (diff[0] != 0))
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan            eobs[js]++;
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan        diff+=16;
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan
40233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void vp8_inverse_transform_mby(MACROBLOCKD *xd)
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *DQC = xd->dequant_y1;
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (xd->mode_info_context->mbmi.mode != SPLITMV)
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* do 2nd order transform on the dc block */
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (xd->eobs[24] > 1)
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_short_inv_walsh4x4
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan                (&xd->block[24].dqcoeff[0], xd->qcoeff);
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_short_inv_walsh4x4_1
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan                (&xd->block[24].dqcoeff[0], xd->qcoeff);
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan        eob_adjust(xd->eobs, xd->qcoeff);
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan        DQC = xd->dequant_y1_dc;
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_dequant_idct_add_y_block
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    (xd->qcoeff, DQC,
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     xd->dst.y_buffer,
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     xd->dst.y_stride, xd->eobs);
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // extern "C"
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // VP8_COMMON_INVTRANS_H_
71