1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * RV30 decoder motion compensation functions 3cabdff1aSopenharmony_ci * Copyright (c) 2007 Konstantin Shishkov 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * RV30 decoder motion compensation functions 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include <stddef.h> 28cabdff1aSopenharmony_ci#include <stdint.h> 29cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 30cabdff1aSopenharmony_ci#include "h264chroma.h" 31cabdff1aSopenharmony_ci#include "h264qpel.h" 32cabdff1aSopenharmony_ci#include "mathops.h" 33cabdff1aSopenharmony_ci#include "qpeldsp.h" 34cabdff1aSopenharmony_ci#include "rv34dsp.h" 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#define RV30_LOWPASS(OPNAME, OP) \ 37cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel8_h_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 38cabdff1aSopenharmony_ci const int h = 8;\ 39cabdff1aSopenharmony_ci const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 40cabdff1aSopenharmony_ci int i;\ 41cabdff1aSopenharmony_ci for(i = 0; i < h; i++)\ 42cabdff1aSopenharmony_ci {\ 43cabdff1aSopenharmony_ci OP(dst[0], (-(src[-1]+src[2]) + src[0]*C1 + src[1]*C2 + 8)>>4);\ 44cabdff1aSopenharmony_ci OP(dst[1], (-(src[ 0]+src[3]) + src[1]*C1 + src[2]*C2 + 8)>>4);\ 45cabdff1aSopenharmony_ci OP(dst[2], (-(src[ 1]+src[4]) + src[2]*C1 + src[3]*C2 + 8)>>4);\ 46cabdff1aSopenharmony_ci OP(dst[3], (-(src[ 2]+src[5]) + src[3]*C1 + src[4]*C2 + 8)>>4);\ 47cabdff1aSopenharmony_ci OP(dst[4], (-(src[ 3]+src[6]) + src[4]*C1 + src[5]*C2 + 8)>>4);\ 48cabdff1aSopenharmony_ci OP(dst[5], (-(src[ 4]+src[7]) + src[5]*C1 + src[6]*C2 + 8)>>4);\ 49cabdff1aSopenharmony_ci OP(dst[6], (-(src[ 5]+src[8]) + src[6]*C1 + src[7]*C2 + 8)>>4);\ 50cabdff1aSopenharmony_ci OP(dst[7], (-(src[ 6]+src[9]) + src[7]*C1 + src[8]*C2 + 8)>>4);\ 51cabdff1aSopenharmony_ci dst += dstStride;\ 52cabdff1aSopenharmony_ci src += srcStride;\ 53cabdff1aSopenharmony_ci }\ 54cabdff1aSopenharmony_ci}\ 55cabdff1aSopenharmony_ci\ 56cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel8_v_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 57cabdff1aSopenharmony_ci const int w = 8;\ 58cabdff1aSopenharmony_ci const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 59cabdff1aSopenharmony_ci int i;\ 60cabdff1aSopenharmony_ci for(i = 0; i < w; i++)\ 61cabdff1aSopenharmony_ci {\ 62cabdff1aSopenharmony_ci const int srcA = src[-1*srcStride];\ 63cabdff1aSopenharmony_ci const int src0 = src[0 *srcStride];\ 64cabdff1aSopenharmony_ci const int src1 = src[1 *srcStride];\ 65cabdff1aSopenharmony_ci const int src2 = src[2 *srcStride];\ 66cabdff1aSopenharmony_ci const int src3 = src[3 *srcStride];\ 67cabdff1aSopenharmony_ci const int src4 = src[4 *srcStride];\ 68cabdff1aSopenharmony_ci const int src5 = src[5 *srcStride];\ 69cabdff1aSopenharmony_ci const int src6 = src[6 *srcStride];\ 70cabdff1aSopenharmony_ci const int src7 = src[7 *srcStride];\ 71cabdff1aSopenharmony_ci const int src8 = src[8 *srcStride];\ 72cabdff1aSopenharmony_ci const int src9 = src[9 *srcStride];\ 73cabdff1aSopenharmony_ci OP(dst[0*dstStride], (-(srcA+src2) + src0*C1 + src1*C2 + 8)>>4);\ 74cabdff1aSopenharmony_ci OP(dst[1*dstStride], (-(src0+src3) + src1*C1 + src2*C2 + 8)>>4);\ 75cabdff1aSopenharmony_ci OP(dst[2*dstStride], (-(src1+src4) + src2*C1 + src3*C2 + 8)>>4);\ 76cabdff1aSopenharmony_ci OP(dst[3*dstStride], (-(src2+src5) + src3*C1 + src4*C2 + 8)>>4);\ 77cabdff1aSopenharmony_ci OP(dst[4*dstStride], (-(src3+src6) + src4*C1 + src5*C2 + 8)>>4);\ 78cabdff1aSopenharmony_ci OP(dst[5*dstStride], (-(src4+src7) + src5*C1 + src6*C2 + 8)>>4);\ 79cabdff1aSopenharmony_ci OP(dst[6*dstStride], (-(src5+src8) + src6*C1 + src7*C2 + 8)>>4);\ 80cabdff1aSopenharmony_ci OP(dst[7*dstStride], (-(src6+src9) + src7*C1 + src8*C2 + 8)>>4);\ 81cabdff1aSopenharmony_ci dst++;\ 82cabdff1aSopenharmony_ci src++;\ 83cabdff1aSopenharmony_ci }\ 84cabdff1aSopenharmony_ci}\ 85cabdff1aSopenharmony_ci\ 86cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel8_hv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 87cabdff1aSopenharmony_ci const int w = 8;\ 88cabdff1aSopenharmony_ci const int h = 8;\ 89cabdff1aSopenharmony_ci const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 90cabdff1aSopenharmony_ci int i, j;\ 91cabdff1aSopenharmony_ci for(j = 0; j < h; j++){\ 92cabdff1aSopenharmony_ci for(i = 0; i < w; i++){\ 93cabdff1aSopenharmony_ci OP(dst[i], (\ 94cabdff1aSopenharmony_ci src[srcStride*-1+i-1] -12*src[srcStride*-1+i] -6*src[srcStride*-1+i+1] +src[srcStride*-1+i+2]+\ 95cabdff1aSopenharmony_ci -12*src[srcStride* 0+i-1] +144*src[srcStride* 0+i] +72*src[srcStride* 0+i+1] -12*src[srcStride* 0+i+2] +\ 96cabdff1aSopenharmony_ci -6*src[srcStride* 1+i-1] +72*src[srcStride* 1+i] +36*src[srcStride* 1+i+1] -6*src[srcStride* 1+i+2] +\ 97cabdff1aSopenharmony_ci src[srcStride* 2+i-1] -12*src[srcStride* 2+i] -6*src[srcStride* 2+i+1] +src[srcStride* 2+i+2] +\ 98cabdff1aSopenharmony_ci 128)>>8);\ 99cabdff1aSopenharmony_ci }\ 100cabdff1aSopenharmony_ci src += srcStride;\ 101cabdff1aSopenharmony_ci dst += dstStride;\ 102cabdff1aSopenharmony_ci }\ 103cabdff1aSopenharmony_ci}\ 104cabdff1aSopenharmony_ci\ 105cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel8_hhv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 106cabdff1aSopenharmony_ci const int w = 8;\ 107cabdff1aSopenharmony_ci const int h = 8;\ 108cabdff1aSopenharmony_ci const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 109cabdff1aSopenharmony_ci int i, j;\ 110cabdff1aSopenharmony_ci for(j = 0; j < h; j++){\ 111cabdff1aSopenharmony_ci for(i = 0; i < w; i++){\ 112cabdff1aSopenharmony_ci OP(dst[i], (\ 113cabdff1aSopenharmony_ci src[srcStride*-1+i-1] -12*src[srcStride*-1+i+1] -6*src[srcStride*-1+i] +src[srcStride*-1+i+2]+\ 114cabdff1aSopenharmony_ci -12*src[srcStride* 0+i-1] +144*src[srcStride* 0+i+1] +72*src[srcStride* 0+i] -12*src[srcStride* 0+i+2]+\ 115cabdff1aSopenharmony_ci -6*src[srcStride* 1+i-1] +72*src[srcStride* 1+i+1] +36*src[srcStride* 1+i] -6*src[srcStride* 1+i+2]+\ 116cabdff1aSopenharmony_ci src[srcStride* 2+i-1] -12*src[srcStride* 2+i+1] -6*src[srcStride* 2+i] +src[srcStride* 2+i+2]+\ 117cabdff1aSopenharmony_ci 128)>>8);\ 118cabdff1aSopenharmony_ci }\ 119cabdff1aSopenharmony_ci src += srcStride;\ 120cabdff1aSopenharmony_ci dst += dstStride;\ 121cabdff1aSopenharmony_ci }\ 122cabdff1aSopenharmony_ci}\ 123cabdff1aSopenharmony_ci\ 124cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel8_hvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 125cabdff1aSopenharmony_ci const int w = 8;\ 126cabdff1aSopenharmony_ci const int h = 8;\ 127cabdff1aSopenharmony_ci const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 128cabdff1aSopenharmony_ci int i, j;\ 129cabdff1aSopenharmony_ci for(j = 0; j < h; j++){\ 130cabdff1aSopenharmony_ci for(i = 0; i < w; i++){\ 131cabdff1aSopenharmony_ci OP(dst[i], (\ 132cabdff1aSopenharmony_ci src[srcStride*-1+i-1] -12*src[srcStride*-1+i] -6*src[srcStride*-1+i+1] +src[srcStride*-1+i+2]+\ 133cabdff1aSopenharmony_ci -6*src[srcStride* 0+i-1] +72*src[srcStride* 0+i] +36*src[srcStride* 0+i+1] -6*src[srcStride* 0+i+2]+\ 134cabdff1aSopenharmony_ci -12*src[srcStride* 1+i-1] +144*src[srcStride* 1+i] +72*src[srcStride* 1+i+1] -12*src[srcStride* 1+i+2]+\ 135cabdff1aSopenharmony_ci src[srcStride* 2+i-1] -12*src[srcStride* 2+i] -6*src[srcStride* 2+i+1] +src[srcStride* 2+i+2]+\ 136cabdff1aSopenharmony_ci 128)>>8);\ 137cabdff1aSopenharmony_ci }\ 138cabdff1aSopenharmony_ci src += srcStride;\ 139cabdff1aSopenharmony_ci dst += dstStride;\ 140cabdff1aSopenharmony_ci }\ 141cabdff1aSopenharmony_ci}\ 142cabdff1aSopenharmony_ci\ 143cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel8_hhvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 144cabdff1aSopenharmony_ci const int w = 8;\ 145cabdff1aSopenharmony_ci const int h = 8;\ 146cabdff1aSopenharmony_ci const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 147cabdff1aSopenharmony_ci int i, j;\ 148cabdff1aSopenharmony_ci for(j = 0; j < h; j++){\ 149cabdff1aSopenharmony_ci for(i = 0; i < w; i++){\ 150cabdff1aSopenharmony_ci OP(dst[i], (\ 151cabdff1aSopenharmony_ci 36*src[i+srcStride*0] +54*src[i+1+srcStride*0] +6*src[i+2+srcStride*0]+\ 152cabdff1aSopenharmony_ci 54*src[i+srcStride*1] +81*src[i+1+srcStride*1] +9*src[i+2+srcStride*1]+\ 153cabdff1aSopenharmony_ci 6*src[i+srcStride*2] + 9*src[i+1+srcStride*2] + src[i+2+srcStride*2]+\ 154cabdff1aSopenharmony_ci 128)>>8);\ 155cabdff1aSopenharmony_ci }\ 156cabdff1aSopenharmony_ci src += srcStride;\ 157cabdff1aSopenharmony_ci dst += dstStride;\ 158cabdff1aSopenharmony_ci }\ 159cabdff1aSopenharmony_ci}\ 160cabdff1aSopenharmony_ci\ 161cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel16_v_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 162cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_v_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 163cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_v_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 164cabdff1aSopenharmony_ci src += 8*srcStride;\ 165cabdff1aSopenharmony_ci dst += 8*dstStride;\ 166cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_v_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 167cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_v_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 168cabdff1aSopenharmony_ci}\ 169cabdff1aSopenharmony_ci\ 170cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel16_h_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 171cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_h_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 172cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_h_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 173cabdff1aSopenharmony_ci src += 8*srcStride;\ 174cabdff1aSopenharmony_ci dst += 8*dstStride;\ 175cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_h_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 176cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_h_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 177cabdff1aSopenharmony_ci}\ 178cabdff1aSopenharmony_ci\ 179cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel16_hv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 180cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hv_lowpass(dst , src , dstStride, srcStride);\ 181cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hv_lowpass(dst+8, src+8, dstStride, srcStride);\ 182cabdff1aSopenharmony_ci src += 8*srcStride;\ 183cabdff1aSopenharmony_ci dst += 8*dstStride;\ 184cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hv_lowpass(dst , src , dstStride, srcStride);\ 185cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hv_lowpass(dst+8, src+8, dstStride, srcStride);\ 186cabdff1aSopenharmony_ci}\ 187cabdff1aSopenharmony_ci\ 188cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel16_hhv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 189cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhv_lowpass(dst , src , dstStride, srcStride);\ 190cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhv_lowpass(dst+8, src+8, dstStride, srcStride);\ 191cabdff1aSopenharmony_ci src += 8*srcStride;\ 192cabdff1aSopenharmony_ci dst += 8*dstStride;\ 193cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhv_lowpass(dst , src , dstStride, srcStride);\ 194cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhv_lowpass(dst+8, src+8, dstStride, srcStride);\ 195cabdff1aSopenharmony_ci}\ 196cabdff1aSopenharmony_ci\ 197cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel16_hvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 198cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hvv_lowpass(dst , src , dstStride, srcStride);\ 199cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 200cabdff1aSopenharmony_ci src += 8*srcStride;\ 201cabdff1aSopenharmony_ci dst += 8*dstStride;\ 202cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hvv_lowpass(dst , src , dstStride, srcStride);\ 203cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 204cabdff1aSopenharmony_ci}\ 205cabdff1aSopenharmony_ci\ 206cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel16_hhvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 207cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhvv_lowpass(dst , src , dstStride, srcStride);\ 208cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 209cabdff1aSopenharmony_ci src += 8*srcStride;\ 210cabdff1aSopenharmony_ci dst += 8*dstStride;\ 211cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhvv_lowpass(dst , src , dstStride, srcStride);\ 212cabdff1aSopenharmony_ci OPNAME ## rv30_tpel8_hhvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 213cabdff1aSopenharmony_ci}\ 214cabdff1aSopenharmony_ci\ 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci#define RV30_MC(OPNAME, SIZE) \ 217cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc10_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 218cabdff1aSopenharmony_ci{\ 219cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _h_lowpass(dst, src, stride, stride, 12, 6);\ 220cabdff1aSopenharmony_ci}\ 221cabdff1aSopenharmony_ci\ 222cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc20_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 223cabdff1aSopenharmony_ci{\ 224cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _h_lowpass(dst, src, stride, stride, 6, 12);\ 225cabdff1aSopenharmony_ci}\ 226cabdff1aSopenharmony_ci\ 227cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc01_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 228cabdff1aSopenharmony_ci{\ 229cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _v_lowpass(dst, src, stride, stride, 12, 6);\ 230cabdff1aSopenharmony_ci}\ 231cabdff1aSopenharmony_ci\ 232cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc02_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 233cabdff1aSopenharmony_ci{\ 234cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _v_lowpass(dst, src, stride, stride, 6, 12);\ 235cabdff1aSopenharmony_ci}\ 236cabdff1aSopenharmony_ci\ 237cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc11_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 238cabdff1aSopenharmony_ci{\ 239cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _hv_lowpass(dst, src, stride, stride);\ 240cabdff1aSopenharmony_ci}\ 241cabdff1aSopenharmony_ci\ 242cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc12_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 243cabdff1aSopenharmony_ci{\ 244cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _hvv_lowpass(dst, src, stride, stride);\ 245cabdff1aSopenharmony_ci}\ 246cabdff1aSopenharmony_ci\ 247cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc21_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 248cabdff1aSopenharmony_ci{\ 249cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _hhv_lowpass(dst, src, stride, stride);\ 250cabdff1aSopenharmony_ci}\ 251cabdff1aSopenharmony_ci\ 252cabdff1aSopenharmony_cistatic void OPNAME ## rv30_tpel ## SIZE ## _mc22_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 253cabdff1aSopenharmony_ci{\ 254cabdff1aSopenharmony_ci OPNAME ## rv30_tpel ## SIZE ## _hhvv_lowpass(dst, src, stride, stride);\ 255cabdff1aSopenharmony_ci}\ 256cabdff1aSopenharmony_ci\ 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci#define op_avg(a, b) a = (((a)+cm[b]+1)>>1) 259cabdff1aSopenharmony_ci#define op_put(a, b) a = cm[b] 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ciRV30_LOWPASS(put_ , op_put) 262cabdff1aSopenharmony_ciRV30_LOWPASS(avg_ , op_avg) 263cabdff1aSopenharmony_ciRV30_MC(put_, 8) 264cabdff1aSopenharmony_ciRV30_MC(put_, 16) 265cabdff1aSopenharmony_ciRV30_MC(avg_, 8) 266cabdff1aSopenharmony_ciRV30_MC(avg_, 16) 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ciav_cold void ff_rv30dsp_init(RV34DSPContext *c) 269cabdff1aSopenharmony_ci{ 270cabdff1aSopenharmony_ci H264ChromaContext h264chroma; 271cabdff1aSopenharmony_ci H264QpelContext qpel; 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci ff_rv34dsp_init(c); 274cabdff1aSopenharmony_ci ff_h264chroma_init(&h264chroma, 8); 275cabdff1aSopenharmony_ci ff_h264qpel_init(&qpel, 8); 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 0] = qpel.put_h264_qpel_pixels_tab[0][0]; 278cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 1] = put_rv30_tpel16_mc10_c; 279cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 2] = put_rv30_tpel16_mc20_c; 280cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 4] = put_rv30_tpel16_mc01_c; 281cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 5] = put_rv30_tpel16_mc11_c; 282cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 6] = put_rv30_tpel16_mc21_c; 283cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 8] = put_rv30_tpel16_mc02_c; 284cabdff1aSopenharmony_ci c->put_pixels_tab[0][ 9] = put_rv30_tpel16_mc12_c; 285cabdff1aSopenharmony_ci c->put_pixels_tab[0][10] = put_rv30_tpel16_mc22_c; 286cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 0] = qpel.avg_h264_qpel_pixels_tab[0][0]; 287cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 1] = avg_rv30_tpel16_mc10_c; 288cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 2] = avg_rv30_tpel16_mc20_c; 289cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 4] = avg_rv30_tpel16_mc01_c; 290cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 5] = avg_rv30_tpel16_mc11_c; 291cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 6] = avg_rv30_tpel16_mc21_c; 292cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 8] = avg_rv30_tpel16_mc02_c; 293cabdff1aSopenharmony_ci c->avg_pixels_tab[0][ 9] = avg_rv30_tpel16_mc12_c; 294cabdff1aSopenharmony_ci c->avg_pixels_tab[0][10] = avg_rv30_tpel16_mc22_c; 295cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 0] = qpel.put_h264_qpel_pixels_tab[1][0]; 296cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 1] = put_rv30_tpel8_mc10_c; 297cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 2] = put_rv30_tpel8_mc20_c; 298cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 4] = put_rv30_tpel8_mc01_c; 299cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 5] = put_rv30_tpel8_mc11_c; 300cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 6] = put_rv30_tpel8_mc21_c; 301cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 8] = put_rv30_tpel8_mc02_c; 302cabdff1aSopenharmony_ci c->put_pixels_tab[1][ 9] = put_rv30_tpel8_mc12_c; 303cabdff1aSopenharmony_ci c->put_pixels_tab[1][10] = put_rv30_tpel8_mc22_c; 304cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 0] = qpel.avg_h264_qpel_pixels_tab[1][0]; 305cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 1] = avg_rv30_tpel8_mc10_c; 306cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 2] = avg_rv30_tpel8_mc20_c; 307cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 4] = avg_rv30_tpel8_mc01_c; 308cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 5] = avg_rv30_tpel8_mc11_c; 309cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 6] = avg_rv30_tpel8_mc21_c; 310cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 8] = avg_rv30_tpel8_mc02_c; 311cabdff1aSopenharmony_ci c->avg_pixels_tab[1][ 9] = avg_rv30_tpel8_mc12_c; 312cabdff1aSopenharmony_ci c->avg_pixels_tab[1][10] = avg_rv30_tpel8_mc22_c; 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci c->put_chroma_pixels_tab[0] = h264chroma.put_h264_chroma_pixels_tab[0]; 315cabdff1aSopenharmony_ci c->put_chroma_pixels_tab[1] = h264chroma.put_h264_chroma_pixels_tab[1]; 316cabdff1aSopenharmony_ci c->avg_chroma_pixels_tab[0] = h264chroma.avg_h264_chroma_pixels_tab[0]; 317cabdff1aSopenharmony_ci c->avg_chroma_pixels_tab[1] = h264chroma.avg_h264_chroma_pixels_tab[1]; 318cabdff1aSopenharmony_ci} 319