1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * thirdpel DSP functions 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci/** 22cabdff1aSopenharmony_ci * @file 23cabdff1aSopenharmony_ci * thirdpel DSP functions 24cabdff1aSopenharmony_ci */ 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include <stdint.h> 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 29cabdff1aSopenharmony_ci#include "tpeldsp.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#define BIT_DEPTH 8 32cabdff1aSopenharmony_ci#include "pel_template.c" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, 35cabdff1aSopenharmony_ci int stride, int width, int height) 36cabdff1aSopenharmony_ci{ 37cabdff1aSopenharmony_ci switch (width) { 38cabdff1aSopenharmony_ci case 2: 39cabdff1aSopenharmony_ci put_pixels2_8_c(dst, src, stride, height); 40cabdff1aSopenharmony_ci break; 41cabdff1aSopenharmony_ci case 4: 42cabdff1aSopenharmony_ci put_pixels4_8_c(dst, src, stride, height); 43cabdff1aSopenharmony_ci break; 44cabdff1aSopenharmony_ci case 8: 45cabdff1aSopenharmony_ci put_pixels8_8_c(dst, src, stride, height); 46cabdff1aSopenharmony_ci break; 47cabdff1aSopenharmony_ci case 16: 48cabdff1aSopenharmony_ci put_pixels16_8_c(dst, src, stride, height); 49cabdff1aSopenharmony_ci break; 50cabdff1aSopenharmony_ci } 51cabdff1aSopenharmony_ci} 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src, 54cabdff1aSopenharmony_ci int stride, int width, int height) 55cabdff1aSopenharmony_ci{ 56cabdff1aSopenharmony_ci int i, j; 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 59cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 60cabdff1aSopenharmony_ci dst[j] = ((2 * src[j] + src[j + 1] + 1) * 61cabdff1aSopenharmony_ci 683) >> 11; 62cabdff1aSopenharmony_ci src += stride; 63cabdff1aSopenharmony_ci dst += stride; 64cabdff1aSopenharmony_ci } 65cabdff1aSopenharmony_ci} 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src, 68cabdff1aSopenharmony_ci int stride, int width, int height) 69cabdff1aSopenharmony_ci{ 70cabdff1aSopenharmony_ci int i, j; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 73cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 74cabdff1aSopenharmony_ci dst[j] = ((src[j] + 2 * src[j + 1] + 1) * 75cabdff1aSopenharmony_ci 683) >> 11; 76cabdff1aSopenharmony_ci src += stride; 77cabdff1aSopenharmony_ci dst += stride; 78cabdff1aSopenharmony_ci } 79cabdff1aSopenharmony_ci} 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src, 82cabdff1aSopenharmony_ci int stride, int width, int height) 83cabdff1aSopenharmony_ci{ 84cabdff1aSopenharmony_ci int i, j; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 87cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 88cabdff1aSopenharmony_ci dst[j] = ((2 * src[j] + src[j + stride] + 1) * 89cabdff1aSopenharmony_ci 683) >> 11; 90cabdff1aSopenharmony_ci src += stride; 91cabdff1aSopenharmony_ci dst += stride; 92cabdff1aSopenharmony_ci } 93cabdff1aSopenharmony_ci} 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src, 96cabdff1aSopenharmony_ci int stride, int width, int height) 97cabdff1aSopenharmony_ci{ 98cabdff1aSopenharmony_ci int i, j; 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 101cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 102cabdff1aSopenharmony_ci dst[j] = ((4 * src[j] + 3 * src[j + 1] + 103cabdff1aSopenharmony_ci 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) * 104cabdff1aSopenharmony_ci 2731) >> 15; 105cabdff1aSopenharmony_ci src += stride; 106cabdff1aSopenharmony_ci dst += stride; 107cabdff1aSopenharmony_ci } 108cabdff1aSopenharmony_ci} 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src, 111cabdff1aSopenharmony_ci int stride, int width, int height) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci int i, j; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 116cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 117cabdff1aSopenharmony_ci dst[j] = ((3 * src[j] + 2 * src[j + 1] + 118cabdff1aSopenharmony_ci 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) * 119cabdff1aSopenharmony_ci 2731) >> 15; 120cabdff1aSopenharmony_ci src += stride; 121cabdff1aSopenharmony_ci dst += stride; 122cabdff1aSopenharmony_ci } 123cabdff1aSopenharmony_ci} 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src, 126cabdff1aSopenharmony_ci int stride, int width, int height) 127cabdff1aSopenharmony_ci{ 128cabdff1aSopenharmony_ci int i, j; 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 131cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 132cabdff1aSopenharmony_ci dst[j] = ((src[j] + 2 * src[j + stride] + 1) * 133cabdff1aSopenharmony_ci 683) >> 11; 134cabdff1aSopenharmony_ci src += stride; 135cabdff1aSopenharmony_ci dst += stride; 136cabdff1aSopenharmony_ci } 137cabdff1aSopenharmony_ci} 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src, 140cabdff1aSopenharmony_ci int stride, int width, int height) 141cabdff1aSopenharmony_ci{ 142cabdff1aSopenharmony_ci int i, j; 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 145cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 146cabdff1aSopenharmony_ci dst[j] = ((3 * src[j] + 4 * src[j + 1] + 147cabdff1aSopenharmony_ci 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) * 148cabdff1aSopenharmony_ci 2731) >> 15; 149cabdff1aSopenharmony_ci src += stride; 150cabdff1aSopenharmony_ci dst += stride; 151cabdff1aSopenharmony_ci } 152cabdff1aSopenharmony_ci} 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_cistatic inline void put_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, 155cabdff1aSopenharmony_ci int stride, int width, int height) 156cabdff1aSopenharmony_ci{ 157cabdff1aSopenharmony_ci int i, j; 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 160cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 161cabdff1aSopenharmony_ci dst[j] = ((2 * src[j] + 3 * src[j + 1] + 162cabdff1aSopenharmony_ci 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) * 163cabdff1aSopenharmony_ci 2731) >> 15; 164cabdff1aSopenharmony_ci src += stride; 165cabdff1aSopenharmony_ci dst += stride; 166cabdff1aSopenharmony_ci } 167cabdff1aSopenharmony_ci} 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, 170cabdff1aSopenharmony_ci int stride, int width, int height) 171cabdff1aSopenharmony_ci{ 172cabdff1aSopenharmony_ci switch (width) { 173cabdff1aSopenharmony_ci case 2: 174cabdff1aSopenharmony_ci avg_pixels2_8_c(dst, src, stride, height); 175cabdff1aSopenharmony_ci break; 176cabdff1aSopenharmony_ci case 4: 177cabdff1aSopenharmony_ci avg_pixels4_8_c(dst, src, stride, height); 178cabdff1aSopenharmony_ci break; 179cabdff1aSopenharmony_ci case 8: 180cabdff1aSopenharmony_ci avg_pixels8_8_c(dst, src, stride, height); 181cabdff1aSopenharmony_ci break; 182cabdff1aSopenharmony_ci case 16: 183cabdff1aSopenharmony_ci avg_pixels16_8_c(dst, src, stride, height); 184cabdff1aSopenharmony_ci break; 185cabdff1aSopenharmony_ci } 186cabdff1aSopenharmony_ci} 187cabdff1aSopenharmony_ci 188cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src, 189cabdff1aSopenharmony_ci int stride, int width, int height) 190cabdff1aSopenharmony_ci{ 191cabdff1aSopenharmony_ci int i, j; 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 194cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 195cabdff1aSopenharmony_ci dst[j] = (dst[j] + 196cabdff1aSopenharmony_ci (((2 * src[j] + src[j + 1] + 1) * 197cabdff1aSopenharmony_ci 683) >> 11) + 1) >> 1; 198cabdff1aSopenharmony_ci src += stride; 199cabdff1aSopenharmony_ci dst += stride; 200cabdff1aSopenharmony_ci } 201cabdff1aSopenharmony_ci} 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src, 204cabdff1aSopenharmony_ci int stride, int width, int height) 205cabdff1aSopenharmony_ci{ 206cabdff1aSopenharmony_ci int i, j; 207cabdff1aSopenharmony_ci 208cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 209cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 210cabdff1aSopenharmony_ci dst[j] = (dst[j] + 211cabdff1aSopenharmony_ci (((src[j] + 2 * src[j + 1] + 1) * 212cabdff1aSopenharmony_ci 683) >> 11) + 1) >> 1; 213cabdff1aSopenharmony_ci src += stride; 214cabdff1aSopenharmony_ci dst += stride; 215cabdff1aSopenharmony_ci } 216cabdff1aSopenharmony_ci} 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src, 219cabdff1aSopenharmony_ci int stride, int width, int height) 220cabdff1aSopenharmony_ci{ 221cabdff1aSopenharmony_ci int i, j; 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 224cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 225cabdff1aSopenharmony_ci dst[j] = (dst[j] + 226cabdff1aSopenharmony_ci (((2 * src[j] + src[j + stride] + 1) * 227cabdff1aSopenharmony_ci 683) >> 11) + 1) >> 1; 228cabdff1aSopenharmony_ci src += stride; 229cabdff1aSopenharmony_ci dst += stride; 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci} 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src, 234cabdff1aSopenharmony_ci int stride, int width, int height) 235cabdff1aSopenharmony_ci{ 236cabdff1aSopenharmony_ci int i, j; 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 239cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 240cabdff1aSopenharmony_ci dst[j] = (dst[j] + 241cabdff1aSopenharmony_ci (((4 * src[j] + 3 * src[j + 1] + 242cabdff1aSopenharmony_ci 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) * 243cabdff1aSopenharmony_ci 2731) >> 15) + 1) >> 1; 244cabdff1aSopenharmony_ci src += stride; 245cabdff1aSopenharmony_ci dst += stride; 246cabdff1aSopenharmony_ci } 247cabdff1aSopenharmony_ci} 248cabdff1aSopenharmony_ci 249cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src, 250cabdff1aSopenharmony_ci int stride, int width, int height) 251cabdff1aSopenharmony_ci{ 252cabdff1aSopenharmony_ci int i, j; 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 255cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 256cabdff1aSopenharmony_ci dst[j] = (dst[j] + 257cabdff1aSopenharmony_ci (((3 * src[j] + 2 * src[j + 1] + 258cabdff1aSopenharmony_ci 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) * 259cabdff1aSopenharmony_ci 2731) >> 15) + 1) >> 1; 260cabdff1aSopenharmony_ci src += stride; 261cabdff1aSopenharmony_ci dst += stride; 262cabdff1aSopenharmony_ci } 263cabdff1aSopenharmony_ci} 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src, 266cabdff1aSopenharmony_ci int stride, int width, int height) 267cabdff1aSopenharmony_ci{ 268cabdff1aSopenharmony_ci int i, j; 269cabdff1aSopenharmony_ci 270cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 271cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 272cabdff1aSopenharmony_ci dst[j] = (dst[j] + 273cabdff1aSopenharmony_ci (((src[j] + 2 * src[j + stride] + 1) * 274cabdff1aSopenharmony_ci 683) >> 11) + 1) >> 1; 275cabdff1aSopenharmony_ci src += stride; 276cabdff1aSopenharmony_ci dst += stride; 277cabdff1aSopenharmony_ci } 278cabdff1aSopenharmony_ci} 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src, 281cabdff1aSopenharmony_ci int stride, int width, int height) 282cabdff1aSopenharmony_ci{ 283cabdff1aSopenharmony_ci int i, j; 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 286cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 287cabdff1aSopenharmony_ci dst[j] = (dst[j] + 288cabdff1aSopenharmony_ci (((3 * src[j] + 4 * src[j + 1] + 289cabdff1aSopenharmony_ci 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) * 290cabdff1aSopenharmony_ci 2731) >> 15) + 1) >> 1; 291cabdff1aSopenharmony_ci src += stride; 292cabdff1aSopenharmony_ci dst += stride; 293cabdff1aSopenharmony_ci } 294cabdff1aSopenharmony_ci} 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_cistatic inline void avg_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, 297cabdff1aSopenharmony_ci int stride, int width, int height) 298cabdff1aSopenharmony_ci{ 299cabdff1aSopenharmony_ci int i, j; 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_ci for (i = 0; i < height; i++) { 302cabdff1aSopenharmony_ci for (j = 0; j < width; j++) 303cabdff1aSopenharmony_ci dst[j] = (dst[j] + 304cabdff1aSopenharmony_ci (((2 * src[j] + 3 * src[j + 1] + 305cabdff1aSopenharmony_ci 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) * 306cabdff1aSopenharmony_ci 2731) >> 15) + 1) >> 1; 307cabdff1aSopenharmony_ci src += stride; 308cabdff1aSopenharmony_ci dst += stride; 309cabdff1aSopenharmony_ci } 310cabdff1aSopenharmony_ci} 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ciav_cold void ff_tpeldsp_init(TpelDSPContext *c) 313cabdff1aSopenharmony_ci{ 314cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c; 315cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c; 316cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c; 317cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 4] = put_tpel_pixels_mc01_c; 318cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 5] = put_tpel_pixels_mc11_c; 319cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 6] = put_tpel_pixels_mc21_c; 320cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 8] = put_tpel_pixels_mc02_c; 321cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[ 9] = put_tpel_pixels_mc12_c; 322cabdff1aSopenharmony_ci c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c; 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 0] = avg_tpel_pixels_mc00_c; 325cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 1] = avg_tpel_pixels_mc10_c; 326cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 2] = avg_tpel_pixels_mc20_c; 327cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 4] = avg_tpel_pixels_mc01_c; 328cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 5] = avg_tpel_pixels_mc11_c; 329cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 6] = avg_tpel_pixels_mc21_c; 330cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 8] = avg_tpel_pixels_mc02_c; 331cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[ 9] = avg_tpel_pixels_mc12_c; 332cabdff1aSopenharmony_ci c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c; 333cabdff1aSopenharmony_ci} 334