1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * quarterpel DSP function templates 3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * quarterpel DSP function templates 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#define PIXOP2(OPNAME, OP) \ 29cabdff1aSopenharmony_cistatic inline void OPNAME ## _no_rnd_pixels8_l2_8(uint8_t *dst, \ 30cabdff1aSopenharmony_ci const uint8_t *src1, \ 31cabdff1aSopenharmony_ci const uint8_t *src2, \ 32cabdff1aSopenharmony_ci int dst_stride, \ 33cabdff1aSopenharmony_ci int src_stride1, \ 34cabdff1aSopenharmony_ci int src_stride2, \ 35cabdff1aSopenharmony_ci int h) \ 36cabdff1aSopenharmony_ci{ \ 37cabdff1aSopenharmony_ci int i; \ 38cabdff1aSopenharmony_ci \ 39cabdff1aSopenharmony_ci for (i = 0; i < h; i++) { \ 40cabdff1aSopenharmony_ci uint32_t a, b; \ 41cabdff1aSopenharmony_ci a = AV_RN32(&src1[i * src_stride1]); \ 42cabdff1aSopenharmony_ci b = AV_RN32(&src2[i * src_stride2]); \ 43cabdff1aSopenharmony_ci OP(*((uint32_t *) &dst[i * dst_stride]), \ 44cabdff1aSopenharmony_ci no_rnd_avg32(a, b)); \ 45cabdff1aSopenharmony_ci a = AV_RN32(&src1[i * src_stride1 + 4]); \ 46cabdff1aSopenharmony_ci b = AV_RN32(&src2[i * src_stride2 + 4]); \ 47cabdff1aSopenharmony_ci OP(*((uint32_t *) &dst[i * dst_stride + 4]), \ 48cabdff1aSopenharmony_ci no_rnd_avg32(a, b)); \ 49cabdff1aSopenharmony_ci } \ 50cabdff1aSopenharmony_ci} \ 51cabdff1aSopenharmony_ci \ 52cabdff1aSopenharmony_cistatic inline void OPNAME ## _no_rnd_pixels16_l2_8(uint8_t *dst, \ 53cabdff1aSopenharmony_ci const uint8_t *src1, \ 54cabdff1aSopenharmony_ci const uint8_t *src2, \ 55cabdff1aSopenharmony_ci int dst_stride, \ 56cabdff1aSopenharmony_ci int src_stride1, \ 57cabdff1aSopenharmony_ci int src_stride2, \ 58cabdff1aSopenharmony_ci int h) \ 59cabdff1aSopenharmony_ci{ \ 60cabdff1aSopenharmony_ci OPNAME ## _no_rnd_pixels8_l2_8(dst, src1, src2, dst_stride, \ 61cabdff1aSopenharmony_ci src_stride1, src_stride2, h); \ 62cabdff1aSopenharmony_ci OPNAME ## _no_rnd_pixels8_l2_8(dst + 8, \ 63cabdff1aSopenharmony_ci src1 + 8, \ 64cabdff1aSopenharmony_ci src2 + 8, \ 65cabdff1aSopenharmony_ci dst_stride, src_stride1, \ 66cabdff1aSopenharmony_ci src_stride2, h); \ 67cabdff1aSopenharmony_ci} \ 68cabdff1aSopenharmony_ci \ 69cabdff1aSopenharmony_cistatic inline void OPNAME ## _pixels8_l4_8(uint8_t *dst, \ 70cabdff1aSopenharmony_ci const uint8_t *src1, \ 71cabdff1aSopenharmony_ci const uint8_t *src2, \ 72cabdff1aSopenharmony_ci const uint8_t *src3, \ 73cabdff1aSopenharmony_ci const uint8_t *src4, \ 74cabdff1aSopenharmony_ci int dst_stride, \ 75cabdff1aSopenharmony_ci int src_stride1, \ 76cabdff1aSopenharmony_ci int src_stride2, \ 77cabdff1aSopenharmony_ci int src_stride3, \ 78cabdff1aSopenharmony_ci int src_stride4, \ 79cabdff1aSopenharmony_ci int h) \ 80cabdff1aSopenharmony_ci{ \ 81cabdff1aSopenharmony_ci /* FIXME HIGH BIT DEPTH */ \ 82cabdff1aSopenharmony_ci int i; \ 83cabdff1aSopenharmony_ci \ 84cabdff1aSopenharmony_ci for (i = 0; i < h; i++) { \ 85cabdff1aSopenharmony_ci uint32_t a, b, c, d, l0, l1, h0, h1; \ 86cabdff1aSopenharmony_ci a = AV_RN32(&src1[i * src_stride1]); \ 87cabdff1aSopenharmony_ci b = AV_RN32(&src2[i * src_stride2]); \ 88cabdff1aSopenharmony_ci c = AV_RN32(&src3[i * src_stride3]); \ 89cabdff1aSopenharmony_ci d = AV_RN32(&src4[i * src_stride4]); \ 90cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + \ 91cabdff1aSopenharmony_ci (b & 0x03030303UL) + \ 92cabdff1aSopenharmony_ci 0x02020202UL; \ 93cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + \ 94cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); \ 95cabdff1aSopenharmony_ci l1 = (c & 0x03030303UL) + \ 96cabdff1aSopenharmony_ci (d & 0x03030303UL); \ 97cabdff1aSopenharmony_ci h1 = ((c & 0xFCFCFCFCUL) >> 2) + \ 98cabdff1aSopenharmony_ci ((d & 0xFCFCFCFCUL) >> 2); \ 99cabdff1aSopenharmony_ci OP(*((uint32_t *) &dst[i * dst_stride]), \ 100cabdff1aSopenharmony_ci h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); \ 101cabdff1aSopenharmony_ci a = AV_RN32(&src1[i * src_stride1 + 4]); \ 102cabdff1aSopenharmony_ci b = AV_RN32(&src2[i * src_stride2 + 4]); \ 103cabdff1aSopenharmony_ci c = AV_RN32(&src3[i * src_stride3 + 4]); \ 104cabdff1aSopenharmony_ci d = AV_RN32(&src4[i * src_stride4 + 4]); \ 105cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + \ 106cabdff1aSopenharmony_ci (b & 0x03030303UL) + \ 107cabdff1aSopenharmony_ci 0x02020202UL; \ 108cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + \ 109cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); \ 110cabdff1aSopenharmony_ci l1 = (c & 0x03030303UL) + \ 111cabdff1aSopenharmony_ci (d & 0x03030303UL); \ 112cabdff1aSopenharmony_ci h1 = ((c & 0xFCFCFCFCUL) >> 2) + \ 113cabdff1aSopenharmony_ci ((d & 0xFCFCFCFCUL) >> 2); \ 114cabdff1aSopenharmony_ci OP(*((uint32_t *) &dst[i * dst_stride + 4]), \ 115cabdff1aSopenharmony_ci h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); \ 116cabdff1aSopenharmony_ci } \ 117cabdff1aSopenharmony_ci} \ 118cabdff1aSopenharmony_ci \ 119cabdff1aSopenharmony_cistatic inline void OPNAME ## _no_rnd_pixels8_l4_8(uint8_t *dst, \ 120cabdff1aSopenharmony_ci const uint8_t *src1, \ 121cabdff1aSopenharmony_ci const uint8_t *src2, \ 122cabdff1aSopenharmony_ci const uint8_t *src3, \ 123cabdff1aSopenharmony_ci const uint8_t *src4, \ 124cabdff1aSopenharmony_ci int dst_stride, \ 125cabdff1aSopenharmony_ci int src_stride1, \ 126cabdff1aSopenharmony_ci int src_stride2, \ 127cabdff1aSopenharmony_ci int src_stride3, \ 128cabdff1aSopenharmony_ci int src_stride4, \ 129cabdff1aSopenharmony_ci int h) \ 130cabdff1aSopenharmony_ci{ \ 131cabdff1aSopenharmony_ci /* FIXME HIGH BIT DEPTH */ \ 132cabdff1aSopenharmony_ci int i; \ 133cabdff1aSopenharmony_ci \ 134cabdff1aSopenharmony_ci for (i = 0; i < h; i++) { \ 135cabdff1aSopenharmony_ci uint32_t a, b, c, d, l0, l1, h0, h1; \ 136cabdff1aSopenharmony_ci a = AV_RN32(&src1[i * src_stride1]); \ 137cabdff1aSopenharmony_ci b = AV_RN32(&src2[i * src_stride2]); \ 138cabdff1aSopenharmony_ci c = AV_RN32(&src3[i * src_stride3]); \ 139cabdff1aSopenharmony_ci d = AV_RN32(&src4[i * src_stride4]); \ 140cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + \ 141cabdff1aSopenharmony_ci (b & 0x03030303UL) + \ 142cabdff1aSopenharmony_ci 0x01010101UL; \ 143cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + \ 144cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); \ 145cabdff1aSopenharmony_ci l1 = (c & 0x03030303UL) + \ 146cabdff1aSopenharmony_ci (d & 0x03030303UL); \ 147cabdff1aSopenharmony_ci h1 = ((c & 0xFCFCFCFCUL) >> 2) + \ 148cabdff1aSopenharmony_ci ((d & 0xFCFCFCFCUL) >> 2); \ 149cabdff1aSopenharmony_ci OP(*((uint32_t *) &dst[i * dst_stride]), \ 150cabdff1aSopenharmony_ci h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); \ 151cabdff1aSopenharmony_ci a = AV_RN32(&src1[i * src_stride1 + 4]); \ 152cabdff1aSopenharmony_ci b = AV_RN32(&src2[i * src_stride2 + 4]); \ 153cabdff1aSopenharmony_ci c = AV_RN32(&src3[i * src_stride3 + 4]); \ 154cabdff1aSopenharmony_ci d = AV_RN32(&src4[i * src_stride4 + 4]); \ 155cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + \ 156cabdff1aSopenharmony_ci (b & 0x03030303UL) + \ 157cabdff1aSopenharmony_ci 0x01010101UL; \ 158cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + \ 159cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); \ 160cabdff1aSopenharmony_ci l1 = (c & 0x03030303UL) + \ 161cabdff1aSopenharmony_ci (d & 0x03030303UL); \ 162cabdff1aSopenharmony_ci h1 = ((c & 0xFCFCFCFCUL) >> 2) + \ 163cabdff1aSopenharmony_ci ((d & 0xFCFCFCFCUL) >> 2); \ 164cabdff1aSopenharmony_ci OP(*((uint32_t *) &dst[i * dst_stride + 4]), \ 165cabdff1aSopenharmony_ci h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); \ 166cabdff1aSopenharmony_ci } \ 167cabdff1aSopenharmony_ci} \ 168cabdff1aSopenharmony_ci \ 169cabdff1aSopenharmony_cistatic inline void OPNAME ## _pixels16_l4_8(uint8_t *dst, \ 170cabdff1aSopenharmony_ci const uint8_t *src1, \ 171cabdff1aSopenharmony_ci const uint8_t *src2, \ 172cabdff1aSopenharmony_ci const uint8_t *src3, \ 173cabdff1aSopenharmony_ci const uint8_t *src4, \ 174cabdff1aSopenharmony_ci int dst_stride, \ 175cabdff1aSopenharmony_ci int src_stride1, \ 176cabdff1aSopenharmony_ci int src_stride2, \ 177cabdff1aSopenharmony_ci int src_stride3, \ 178cabdff1aSopenharmony_ci int src_stride4, \ 179cabdff1aSopenharmony_ci int h) \ 180cabdff1aSopenharmony_ci{ \ 181cabdff1aSopenharmony_ci OPNAME ## _pixels8_l4_8(dst, src1, src2, src3, src4, dst_stride, \ 182cabdff1aSopenharmony_ci src_stride1, src_stride2, src_stride3, \ 183cabdff1aSopenharmony_ci src_stride4, h); \ 184cabdff1aSopenharmony_ci OPNAME ## _pixels8_l4_8(dst + 8, \ 185cabdff1aSopenharmony_ci src1 + 8, src2 + 8, \ 186cabdff1aSopenharmony_ci src3 + 8, src4 + 8, \ 187cabdff1aSopenharmony_ci dst_stride, src_stride1, src_stride2, \ 188cabdff1aSopenharmony_ci src_stride3, src_stride4, h); \ 189cabdff1aSopenharmony_ci} \ 190cabdff1aSopenharmony_ci \ 191cabdff1aSopenharmony_cistatic inline void OPNAME ## _no_rnd_pixels16_l4_8(uint8_t *dst, \ 192cabdff1aSopenharmony_ci const uint8_t *src1, \ 193cabdff1aSopenharmony_ci const uint8_t *src2, \ 194cabdff1aSopenharmony_ci const uint8_t *src3, \ 195cabdff1aSopenharmony_ci const uint8_t *src4, \ 196cabdff1aSopenharmony_ci int dst_stride, \ 197cabdff1aSopenharmony_ci int src_stride1, \ 198cabdff1aSopenharmony_ci int src_stride2, \ 199cabdff1aSopenharmony_ci int src_stride3, \ 200cabdff1aSopenharmony_ci int src_stride4, \ 201cabdff1aSopenharmony_ci int h) \ 202cabdff1aSopenharmony_ci{ \ 203cabdff1aSopenharmony_ci OPNAME ## _no_rnd_pixels8_l4_8(dst, src1, src2, src3, src4, \ 204cabdff1aSopenharmony_ci dst_stride, src_stride1, \ 205cabdff1aSopenharmony_ci src_stride2, src_stride3, \ 206cabdff1aSopenharmony_ci src_stride4, h); \ 207cabdff1aSopenharmony_ci OPNAME ## _no_rnd_pixels8_l4_8(dst + 8, \ 208cabdff1aSopenharmony_ci src1 + 8, src2 + 8, \ 209cabdff1aSopenharmony_ci src3 + 8, src4 + 8, \ 210cabdff1aSopenharmony_ci dst_stride, src_stride1, \ 211cabdff1aSopenharmony_ci src_stride2, src_stride3, \ 212cabdff1aSopenharmony_ci src_stride4, h); \ 213cabdff1aSopenharmony_ci} \ 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_ci#define op_avg(a, b) a = rnd_avg32(a, b) 216cabdff1aSopenharmony_ci#define op_put(a, b) a = b 217cabdff1aSopenharmony_ci#define put_no_rnd_pixels8_8_c put_pixels8_8_c 218cabdff1aSopenharmony_ciPIXOP2(avg, op_avg) 219cabdff1aSopenharmony_ciPIXOP2(put, op_put) 220cabdff1aSopenharmony_ci#undef op_avg 221cabdff1aSopenharmony_ci#undef op_put 222