1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2022 Loongson Technology Corporation Limited 3cabdff1aSopenharmony_ci * Contributed by Lu Wang <wanglu@loongson.cn> 4cabdff1aSopenharmony_ci * Hao Chen <chenhao@loongson.cn> 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#ifndef AVCODEC_LOONGARCH_HEVCDSP_LSX_H 24cabdff1aSopenharmony_ci#define AVCODEC_LOONGARCH_HEVCDSP_LSX_H 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "libavcodec/hevcdsp.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#define MC(PEL, DIR, WIDTH) \ 29cabdff1aSopenharmony_civoid ff_hevc_put_hevc_##PEL##_##DIR##WIDTH##_8_lsx(int16_t *dst, \ 30cabdff1aSopenharmony_ci uint8_t *src, \ 31cabdff1aSopenharmony_ci ptrdiff_t src_stride, \ 32cabdff1aSopenharmony_ci int height, \ 33cabdff1aSopenharmony_ci intptr_t mx, \ 34cabdff1aSopenharmony_ci intptr_t my, \ 35cabdff1aSopenharmony_ci int width) 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ciMC(pel, pixels, 4); 38cabdff1aSopenharmony_ciMC(pel, pixels, 6); 39cabdff1aSopenharmony_ciMC(pel, pixels, 8); 40cabdff1aSopenharmony_ciMC(pel, pixels, 12); 41cabdff1aSopenharmony_ciMC(pel, pixels, 16); 42cabdff1aSopenharmony_ciMC(pel, pixels, 24); 43cabdff1aSopenharmony_ciMC(pel, pixels, 32); 44cabdff1aSopenharmony_ciMC(pel, pixels, 48); 45cabdff1aSopenharmony_ciMC(pel, pixels, 64); 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ciMC(qpel, h, 4); 48cabdff1aSopenharmony_ciMC(qpel, h, 8); 49cabdff1aSopenharmony_ciMC(qpel, h, 12); 50cabdff1aSopenharmony_ciMC(qpel, h, 16); 51cabdff1aSopenharmony_ciMC(qpel, h, 24); 52cabdff1aSopenharmony_ciMC(qpel, h, 32); 53cabdff1aSopenharmony_ciMC(qpel, h, 48); 54cabdff1aSopenharmony_ciMC(qpel, h, 64); 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ciMC(qpel, v, 4); 57cabdff1aSopenharmony_ciMC(qpel, v, 8); 58cabdff1aSopenharmony_ciMC(qpel, v, 12); 59cabdff1aSopenharmony_ciMC(qpel, v, 16); 60cabdff1aSopenharmony_ciMC(qpel, v, 24); 61cabdff1aSopenharmony_ciMC(qpel, v, 32); 62cabdff1aSopenharmony_ciMC(qpel, v, 48); 63cabdff1aSopenharmony_ciMC(qpel, v, 64); 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ciMC(qpel, hv, 4); 66cabdff1aSopenharmony_ciMC(qpel, hv, 8); 67cabdff1aSopenharmony_ciMC(qpel, hv, 12); 68cabdff1aSopenharmony_ciMC(qpel, hv, 16); 69cabdff1aSopenharmony_ciMC(qpel, hv, 24); 70cabdff1aSopenharmony_ciMC(qpel, hv, 32); 71cabdff1aSopenharmony_ciMC(qpel, hv, 48); 72cabdff1aSopenharmony_ciMC(qpel, hv, 64); 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ciMC(epel, h, 32); 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ciMC(epel, v, 16); 77cabdff1aSopenharmony_ciMC(epel, v, 24); 78cabdff1aSopenharmony_ciMC(epel, v, 32); 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ciMC(epel, hv, 8); 81cabdff1aSopenharmony_ciMC(epel, hv, 12); 82cabdff1aSopenharmony_ciMC(epel, hv, 16); 83cabdff1aSopenharmony_ciMC(epel, hv, 24); 84cabdff1aSopenharmony_ciMC(epel, hv, 32); 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci#undef MC 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci#define BI_MC(PEL, DIR, WIDTH) \ 89cabdff1aSopenharmony_civoid ff_hevc_put_hevc_bi_##PEL##_##DIR##WIDTH##_8_lsx(uint8_t *dst, \ 90cabdff1aSopenharmony_ci ptrdiff_t dst_stride, \ 91cabdff1aSopenharmony_ci uint8_t *src, \ 92cabdff1aSopenharmony_ci ptrdiff_t src_stride, \ 93cabdff1aSopenharmony_ci int16_t *src_16bit, \ 94cabdff1aSopenharmony_ci int height, \ 95cabdff1aSopenharmony_ci intptr_t mx, \ 96cabdff1aSopenharmony_ci intptr_t my, \ 97cabdff1aSopenharmony_ci int width) 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ciBI_MC(pel, pixels, 4); 100cabdff1aSopenharmony_ciBI_MC(pel, pixels, 6); 101cabdff1aSopenharmony_ciBI_MC(pel, pixels, 8); 102cabdff1aSopenharmony_ciBI_MC(pel, pixels, 12); 103cabdff1aSopenharmony_ciBI_MC(pel, pixels, 16); 104cabdff1aSopenharmony_ciBI_MC(pel, pixels, 24); 105cabdff1aSopenharmony_ciBI_MC(pel, pixels, 32); 106cabdff1aSopenharmony_ciBI_MC(pel, pixels, 48); 107cabdff1aSopenharmony_ciBI_MC(pel, pixels, 64); 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ciBI_MC(qpel, h, 16); 110cabdff1aSopenharmony_ciBI_MC(qpel, h, 24); 111cabdff1aSopenharmony_ciBI_MC(qpel, h, 32); 112cabdff1aSopenharmony_ciBI_MC(qpel, h, 48); 113cabdff1aSopenharmony_ciBI_MC(qpel, h, 64); 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ciBI_MC(qpel, v, 8); 116cabdff1aSopenharmony_ciBI_MC(qpel, v, 16); 117cabdff1aSopenharmony_ciBI_MC(qpel, v, 24); 118cabdff1aSopenharmony_ciBI_MC(qpel, v, 32); 119cabdff1aSopenharmony_ciBI_MC(qpel, v, 48); 120cabdff1aSopenharmony_ciBI_MC(qpel, v, 64); 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_ciBI_MC(qpel, hv, 8); 123cabdff1aSopenharmony_ciBI_MC(qpel, hv, 16); 124cabdff1aSopenharmony_ciBI_MC(qpel, hv, 24); 125cabdff1aSopenharmony_ciBI_MC(qpel, hv, 32); 126cabdff1aSopenharmony_ciBI_MC(qpel, hv, 48); 127cabdff1aSopenharmony_ciBI_MC(qpel, hv, 64); 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ciBI_MC(epel, h, 24); 130cabdff1aSopenharmony_ciBI_MC(epel, h, 32); 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_ciBI_MC(epel, v, 12); 133cabdff1aSopenharmony_ciBI_MC(epel, v, 16); 134cabdff1aSopenharmony_ciBI_MC(epel, v, 24); 135cabdff1aSopenharmony_ciBI_MC(epel, v, 32); 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ciBI_MC(epel, hv, 6); 138cabdff1aSopenharmony_ciBI_MC(epel, hv, 8); 139cabdff1aSopenharmony_ciBI_MC(epel, hv, 16); 140cabdff1aSopenharmony_ciBI_MC(epel, hv, 24); 141cabdff1aSopenharmony_ciBI_MC(epel, hv, 32); 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci#undef BI_MC 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci#define UNI_MC(PEL, DIR, WIDTH) \ 146cabdff1aSopenharmony_civoid ff_hevc_put_hevc_uni_##PEL##_##DIR##WIDTH##_8_lsx(uint8_t *dst, \ 147cabdff1aSopenharmony_ci ptrdiff_t dst_stride, \ 148cabdff1aSopenharmony_ci uint8_t *src, \ 149cabdff1aSopenharmony_ci ptrdiff_t src_stride, \ 150cabdff1aSopenharmony_ci int height, \ 151cabdff1aSopenharmony_ci intptr_t mx, \ 152cabdff1aSopenharmony_ci intptr_t my, \ 153cabdff1aSopenharmony_ci int width) 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ciUNI_MC(qpel, h, 64); 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ciUNI_MC(qpel, v, 24); 158cabdff1aSopenharmony_ciUNI_MC(qpel, v, 32); 159cabdff1aSopenharmony_ciUNI_MC(qpel, v, 48); 160cabdff1aSopenharmony_ciUNI_MC(qpel, v, 64); 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ciUNI_MC(qpel, hv, 8); 163cabdff1aSopenharmony_ciUNI_MC(qpel, hv, 16); 164cabdff1aSopenharmony_ciUNI_MC(qpel, hv, 24); 165cabdff1aSopenharmony_ciUNI_MC(qpel, hv, 32); 166cabdff1aSopenharmony_ciUNI_MC(qpel, hv, 48); 167cabdff1aSopenharmony_ciUNI_MC(qpel, hv, 64); 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ciUNI_MC(epel, v, 24); 170cabdff1aSopenharmony_ciUNI_MC(epel, v, 32); 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ciUNI_MC(epel, hv, 8); 173cabdff1aSopenharmony_ciUNI_MC(epel, hv, 12); 174cabdff1aSopenharmony_ciUNI_MC(epel, hv, 16); 175cabdff1aSopenharmony_ciUNI_MC(epel, hv, 24); 176cabdff1aSopenharmony_ciUNI_MC(epel, hv, 32); 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci#undef UNI_MC 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci#define UNI_W_MC(PEL, DIR, WIDTH) \ 181cabdff1aSopenharmony_civoid ff_hevc_put_hevc_uni_w_##PEL##_##DIR##WIDTH##_8_lsx(uint8_t *dst, \ 182cabdff1aSopenharmony_ci ptrdiff_t \ 183cabdff1aSopenharmony_ci dst_stride, \ 184cabdff1aSopenharmony_ci uint8_t *src, \ 185cabdff1aSopenharmony_ci ptrdiff_t \ 186cabdff1aSopenharmony_ci src_stride, \ 187cabdff1aSopenharmony_ci int height, \ 188cabdff1aSopenharmony_ci int denom, \ 189cabdff1aSopenharmony_ci int weight, \ 190cabdff1aSopenharmony_ci int offset, \ 191cabdff1aSopenharmony_ci intptr_t mx, \ 192cabdff1aSopenharmony_ci intptr_t my, \ 193cabdff1aSopenharmony_ci int width) 194cabdff1aSopenharmony_ci 195cabdff1aSopenharmony_ciUNI_W_MC(qpel, hv, 8); 196cabdff1aSopenharmony_ciUNI_W_MC(qpel, hv, 16); 197cabdff1aSopenharmony_ciUNI_W_MC(qpel, hv, 24); 198cabdff1aSopenharmony_ciUNI_W_MC(qpel, hv, 32); 199cabdff1aSopenharmony_ciUNI_W_MC(qpel, hv, 48); 200cabdff1aSopenharmony_ciUNI_W_MC(qpel, hv, 64); 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci#undef UNI_W_MC 203cabdff1aSopenharmony_ci 204cabdff1aSopenharmony_civoid ff_hevc_loop_filter_luma_h_8_lsx(uint8_t *src, ptrdiff_t stride, 205cabdff1aSopenharmony_ci int32_t beta, int32_t *tc, 206cabdff1aSopenharmony_ci uint8_t *p_is_pcm, uint8_t *q_is_pcm); 207cabdff1aSopenharmony_ci 208cabdff1aSopenharmony_civoid ff_hevc_loop_filter_luma_v_8_lsx(uint8_t *src, ptrdiff_t stride, 209cabdff1aSopenharmony_ci int32_t beta, int32_t *tc, 210cabdff1aSopenharmony_ci uint8_t *p_is_pcm, uint8_t *q_is_pcm); 211cabdff1aSopenharmony_ci 212cabdff1aSopenharmony_civoid ff_hevc_loop_filter_chroma_h_8_lsx(uint8_t *src, ptrdiff_t stride, 213cabdff1aSopenharmony_ci int32_t *tc, uint8_t *p_is_pcm, 214cabdff1aSopenharmony_ci uint8_t *q_is_pcm); 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_civoid ff_hevc_loop_filter_chroma_v_8_lsx(uint8_t *src, ptrdiff_t stride, 217cabdff1aSopenharmony_ci int32_t *tc, uint8_t *p_is_pcm, 218cabdff1aSopenharmony_ci uint8_t *q_is_pcm); 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_civoid ff_hevc_sao_edge_filter_8_lsx(uint8_t *dst, uint8_t *src, 221cabdff1aSopenharmony_ci ptrdiff_t stride_dst, 222cabdff1aSopenharmony_ci int16_t *sao_offset_val, 223cabdff1aSopenharmony_ci int eo, int width, int height); 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_civoid ff_hevc_idct_4x4_lsx(int16_t *coeffs, int col_limit); 226cabdff1aSopenharmony_civoid ff_hevc_idct_8x8_lsx(int16_t *coeffs, int col_limit); 227cabdff1aSopenharmony_civoid ff_hevc_idct_16x16_lsx(int16_t *coeffs, int col_limit); 228cabdff1aSopenharmony_civoid ff_hevc_idct_32x32_lsx(int16_t *coeffs, int col_limit); 229cabdff1aSopenharmony_ci 230cabdff1aSopenharmony_ci#endif // #ifndef AVCODEC_LOONGARCH_HEVCDSP_LSX_H 231