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#include "vpx_config.h" 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/blockd.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan 16233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8_dequantize_b_impl_mmx(short *sq, short *dq, short *q); 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan 18233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_dequantize_b_mmx(BLOCKD *d, short *DQC) 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *sq = (short *) d->qcoeff; 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *dq = (short *) d->dqcoeff; 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequantize_b_impl_mmx(sq, dq, DQC); 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan 26233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_dequant_idct_add_y_block_mmx 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan (short *q, short *dq, 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst, int stride, char *eobs) 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 4; i++) 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[0] > 1) 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q, dq, dst, stride); 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[0] == 1) 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[0]*dq[0], dst, stride, dst, stride); 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q, 0, 2 * sizeof(q[0])); 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[1] > 1) 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q+16, dq, dst+4, stride); 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[1] == 1) 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[16]*dq[0], dst+4, stride, 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst+4, stride); 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q + 16, 0, 2 * sizeof(q[0])); 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[2] > 1) 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q+32, dq, dst+8, stride); 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[2] == 1) 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[32]*dq[0], dst+8, stride, 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst+8, stride); 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q + 32, 0, 2 * sizeof(q[0])); 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[3] > 1) 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q+48, dq, dst+12, stride); 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[3] == 1) 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[48]*dq[0], dst+12, stride, 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst+12, stride); 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q + 48, 0, 2 * sizeof(q[0])); 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan q += 64; 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += 4*stride; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan eobs += 4; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan 75233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_dequant_idct_add_uv_block_mmx 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan (short *q, short *dq, 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dstu, unsigned char *dstv, int stride, char *eobs) 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 2; i++) 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[0] > 1) 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q, dq, dstu, stride); 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[0] == 1) 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[0]*dq[0], dstu, stride, dstu, stride); 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q, 0, 2 * sizeof(q[0])); 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[1] > 1) 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q+16, dq, dstu+4, stride); 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[1] == 1) 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[16]*dq[0], dstu+4, stride, 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan dstu+4, stride); 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q + 16, 0, 2 * sizeof(q[0])); 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan q += 32; 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan dstu += 4*stride; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan eobs += 2; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 2; i++) 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[0] > 1) 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q, dq, dstv, stride); 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[0] == 1) 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[0]*dq[0], dstv, stride, dstv, stride); 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q, 0, 2 * sizeof(q[0])); 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (eobs[1] > 1) 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dequant_idct_add_mmx (q+16, dq, dstv+4, stride); 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (eobs[1] == 1) 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_dc_only_idct_add_mmx (q[16]*dq[0], dstv+4, stride, 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan dstv+4, stride); 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(q + 16, 0, 2 * sizeof(q[0])); 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan q += 32; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan dstv += 4*stride; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan eobs += 2; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 129