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 "libswscale/swscale.h" 22cabdff1aSopenharmony_ci#include "libswscale/swscale_internal.h" 23cabdff1aSopenharmony_ci#include "libavutil/aarch64/cpu.h" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#define SCALE_FUNC(filter_n, from_bpc, to_bpc, opt) \ 26cabdff1aSopenharmony_civoid ff_hscale ## from_bpc ## to ## to_bpc ## _ ## filter_n ## _ ## opt( \ 27cabdff1aSopenharmony_ci SwsContext *c, int16_t *data, \ 28cabdff1aSopenharmony_ci int dstW, const uint8_t *src, \ 29cabdff1aSopenharmony_ci const int16_t *filter, \ 30cabdff1aSopenharmony_ci const int32_t *filterPos, int filterSize) 31cabdff1aSopenharmony_ci#define SCALE_FUNCS(filter_n, opt) \ 32cabdff1aSopenharmony_ci SCALE_FUNC(filter_n, 8, 15, opt); 33cabdff1aSopenharmony_ci#define ALL_SCALE_FUNCS(opt) \ 34cabdff1aSopenharmony_ci SCALE_FUNCS(4, opt); \ 35cabdff1aSopenharmony_ci SCALE_FUNCS(X8, opt) 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ciALL_SCALE_FUNCS(neon); 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_civoid ff_yuv2planeX_8_neon(const int16_t *filter, int filterSize, 40cabdff1aSopenharmony_ci const int16_t **src, uint8_t *dest, int dstW, 41cabdff1aSopenharmony_ci const uint8_t *dither, int offset); 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci#define ASSIGN_SCALE_FUNC2(hscalefn, filtersize, opt) do { \ 44cabdff1aSopenharmony_ci if (c->srcBpc == 8 && c->dstBpc <= 14) { \ 45cabdff1aSopenharmony_ci hscalefn = \ 46cabdff1aSopenharmony_ci ff_hscale8to15_ ## filtersize ## _ ## opt; \ 47cabdff1aSopenharmony_ci } \ 48cabdff1aSopenharmony_ci} while (0) 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci#define ASSIGN_SCALE_FUNC(hscalefn, filtersize, opt) \ 51cabdff1aSopenharmony_ci switch (filtersize) { \ 52cabdff1aSopenharmony_ci case 4: ASSIGN_SCALE_FUNC2(hscalefn, 4, opt); break; \ 53cabdff1aSopenharmony_ci default: if (filtersize % 8 == 0) \ 54cabdff1aSopenharmony_ci ASSIGN_SCALE_FUNC2(hscalefn, X8, opt); \ 55cabdff1aSopenharmony_ci break; \ 56cabdff1aSopenharmony_ci } 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ciav_cold void ff_sws_init_swscale_aarch64(SwsContext *c) 59cabdff1aSopenharmony_ci{ 60cabdff1aSopenharmony_ci int cpu_flags = av_get_cpu_flags(); 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_ci if (have_neon(cpu_flags)) { 63cabdff1aSopenharmony_ci ASSIGN_SCALE_FUNC(c->hyScale, c->hLumFilterSize, neon); 64cabdff1aSopenharmony_ci ASSIGN_SCALE_FUNC(c->hcScale, c->hChrFilterSize, neon); 65cabdff1aSopenharmony_ci if (c->dstBpc == 8) { 66cabdff1aSopenharmony_ci c->yuv2planeX = ff_yuv2planeX_8_neon; 67cabdff1aSopenharmony_ci } 68cabdff1aSopenharmony_ci } 69cabdff1aSopenharmony_ci} 70