1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include "config.h" 20cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 21cabdff1aSopenharmony_ci#include "libavutil/common.h" 22cabdff1aSopenharmony_ci#include "mpegvideodsp.h" 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_cistatic void gmc1_c(uint8_t *dst, uint8_t *src, int stride, int h, 25cabdff1aSopenharmony_ci int x16, int y16, int rounder) 26cabdff1aSopenharmony_ci{ 27cabdff1aSopenharmony_ci const int A = (16 - x16) * (16 - y16); 28cabdff1aSopenharmony_ci const int B = (x16) * (16 - y16); 29cabdff1aSopenharmony_ci const int C = (16 - x16) * (y16); 30cabdff1aSopenharmony_ci const int D = (x16) * (y16); 31cabdff1aSopenharmony_ci int i; 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci for (i = 0; i < h; i++) { 34cabdff1aSopenharmony_ci dst[0] = (A * src[0] + B * src[1] + C * src[stride + 0] + D * src[stride + 1] + rounder) >> 8; 35cabdff1aSopenharmony_ci dst[1] = (A * src[1] + B * src[2] + C * src[stride + 1] + D * src[stride + 2] + rounder) >> 8; 36cabdff1aSopenharmony_ci dst[2] = (A * src[2] + B * src[3] + C * src[stride + 2] + D * src[stride + 3] + rounder) >> 8; 37cabdff1aSopenharmony_ci dst[3] = (A * src[3] + B * src[4] + C * src[stride + 3] + D * src[stride + 4] + rounder) >> 8; 38cabdff1aSopenharmony_ci dst[4] = (A * src[4] + B * src[5] + C * src[stride + 4] + D * src[stride + 5] + rounder) >> 8; 39cabdff1aSopenharmony_ci dst[5] = (A * src[5] + B * src[6] + C * src[stride + 5] + D * src[stride + 6] + rounder) >> 8; 40cabdff1aSopenharmony_ci dst[6] = (A * src[6] + B * src[7] + C * src[stride + 6] + D * src[stride + 7] + rounder) >> 8; 41cabdff1aSopenharmony_ci dst[7] = (A * src[7] + B * src[8] + C * src[stride + 7] + D * src[stride + 8] + rounder) >> 8; 42cabdff1aSopenharmony_ci dst += stride; 43cabdff1aSopenharmony_ci src += stride; 44cabdff1aSopenharmony_ci } 45cabdff1aSopenharmony_ci} 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_civoid ff_gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy, 48cabdff1aSopenharmony_ci int dxx, int dxy, int dyx, int dyy, int shift, int r, 49cabdff1aSopenharmony_ci int width, int height) 50cabdff1aSopenharmony_ci{ 51cabdff1aSopenharmony_ci int y, vx, vy; 52cabdff1aSopenharmony_ci const int s = 1 << shift; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci width--; 55cabdff1aSopenharmony_ci height--; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci for (y = 0; y < h; y++) { 58cabdff1aSopenharmony_ci int x; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci vx = ox; 61cabdff1aSopenharmony_ci vy = oy; 62cabdff1aSopenharmony_ci for (x = 0; x < 8; x++) { // FIXME: optimize 63cabdff1aSopenharmony_ci int index; 64cabdff1aSopenharmony_ci int src_x = vx >> 16; 65cabdff1aSopenharmony_ci int src_y = vy >> 16; 66cabdff1aSopenharmony_ci int frac_x = src_x & (s - 1); 67cabdff1aSopenharmony_ci int frac_y = src_y & (s - 1); 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci src_x >>= shift; 70cabdff1aSopenharmony_ci src_y >>= shift; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci if ((unsigned) src_x < width) { 73cabdff1aSopenharmony_ci if ((unsigned) src_y < height) { 74cabdff1aSopenharmony_ci index = src_x + src_y * stride; 75cabdff1aSopenharmony_ci dst[y * stride + x] = 76cabdff1aSopenharmony_ci ((src[index] * (s - frac_x) + 77cabdff1aSopenharmony_ci src[index + 1] * frac_x) * (s - frac_y) + 78cabdff1aSopenharmony_ci (src[index + stride] * (s - frac_x) + 79cabdff1aSopenharmony_ci src[index + stride + 1] * frac_x) * frac_y + 80cabdff1aSopenharmony_ci r) >> (shift * 2); 81cabdff1aSopenharmony_ci } else { 82cabdff1aSopenharmony_ci index = src_x + av_clip(src_y, 0, height) * stride; 83cabdff1aSopenharmony_ci dst[y * stride + x] = 84cabdff1aSopenharmony_ci ((src[index] * (s - frac_x) + 85cabdff1aSopenharmony_ci src[index + 1] * frac_x) * s + 86cabdff1aSopenharmony_ci r) >> (shift * 2); 87cabdff1aSopenharmony_ci } 88cabdff1aSopenharmony_ci } else { 89cabdff1aSopenharmony_ci if ((unsigned) src_y < height) { 90cabdff1aSopenharmony_ci index = av_clip(src_x, 0, width) + src_y * stride; 91cabdff1aSopenharmony_ci dst[y * stride + x] = 92cabdff1aSopenharmony_ci ((src[index] * (s - frac_y) + 93cabdff1aSopenharmony_ci src[index + stride] * frac_y) * s + 94cabdff1aSopenharmony_ci r) >> (shift * 2); 95cabdff1aSopenharmony_ci } else { 96cabdff1aSopenharmony_ci index = av_clip(src_x, 0, width) + 97cabdff1aSopenharmony_ci av_clip(src_y, 0, height) * stride; 98cabdff1aSopenharmony_ci dst[y * stride + x] = src[index]; 99cabdff1aSopenharmony_ci } 100cabdff1aSopenharmony_ci } 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci vx += dxx; 103cabdff1aSopenharmony_ci vy += dyx; 104cabdff1aSopenharmony_ci } 105cabdff1aSopenharmony_ci ox += dxy; 106cabdff1aSopenharmony_ci oy += dyy; 107cabdff1aSopenharmony_ci } 108cabdff1aSopenharmony_ci} 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_ciav_cold void ff_mpegvideodsp_init(MpegVideoDSPContext *c) 111cabdff1aSopenharmony_ci{ 112cabdff1aSopenharmony_ci c->gmc1 = gmc1_c; 113cabdff1aSopenharmony_ci c->gmc = ff_gmc_c; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci#if ARCH_PPC 116cabdff1aSopenharmony_ci ff_mpegvideodsp_init_ppc(c); 117cabdff1aSopenharmony_ci#elif ARCH_X86 118cabdff1aSopenharmony_ci ff_mpegvideodsp_init_x86(c); 119cabdff1aSopenharmony_ci#endif 120cabdff1aSopenharmony_ci} 121